diff --git a/src/api/point/config/index.ts b/src/api/point/config/index.ts index 00adc3f1..9a3c4c48 100644 --- a/src/api/point/config/index.ts +++ b/src/api/point/config/index.ts @@ -10,10 +10,10 @@ export interface ConfigVO { // 查询积分设置详情 export const getConfig = async () => { - return await request.get({ url: `/point/config/get` }) + return await request.get({ url: `/member/point/config/get` }) } // 新增修改积分设置 export const saveConfig = async (data: ConfigVO) => { - return await request.put({ url: `/point/config/save`, data }) + return await request.put({ url: `/member/point/config/save`, data }) } diff --git a/src/api/point/record/index.ts b/src/api/point/record/index.ts index 15eaff35..1c60f754 100644 --- a/src/api/point/record/index.ts +++ b/src/api/point/record/index.ts @@ -4,7 +4,6 @@ export interface RecordVO { id: number bizId: string bizType: string - type: string title: string description: string point: number @@ -18,30 +17,5 @@ export interface RecordVO { // 查询用户积分记录列表 export const getRecordPage = async (params) => { - return await request.get({ url: `/point/record/page`, params }) -} - -// 查询用户积分记录详情 -export const getRecord = async (id: number) => { - return await request.get({ url: `/point/record/get?id=` + id }) -} - -// 新增用户积分记录 -export const createRecord = async (data: RecordVO) => { - return await request.post({ url: `/point/record/create`, data }) -} - -// 修改用户积分记录 -export const updateRecord = async (data: RecordVO) => { - return await request.put({ url: `/point/record/update`, data }) -} - -// 删除用户积分记录 -export const deleteRecord = async (id: number) => { - return await request.delete({ url: `/point/record/delete?id=` + id }) -} - -// 导出用户积分记录 Excel -export const exportRecord = async (params) => { - return await request.download({ url: `/point/record/export-excel`, params }) + return await request.get({ url: `/member/point/record/page`, params }) } diff --git a/src/api/point/signInConfig/index.ts b/src/api/point/signInConfig/index.ts index 3786c06e..246270ec 100644 --- a/src/api/point/signInConfig/index.ts +++ b/src/api/point/signInConfig/index.ts @@ -2,36 +2,32 @@ import request from '@/config/axios' export interface SignInConfigVO { id: number - day: number - point: number + day: number | null + point: number | null + enable: boolean | null } // 查询积分签到规则列表 -export const getSignInConfigPage = async (params) => { - return await request.get({ url: `/point/sign-in-config/page`, params }) +export const getSignInConfigPage = async () => { + return await request.get({ url: `/member/point/sign-in-config/list` }) } // 查询积分签到规则详情 export const getSignInConfig = async (id: number) => { - return await request.get({ url: `/point/sign-in-config/get?id=` + id }) + return await request.get({ url: `/member/point/sign-in-config/get?id=` + id }) } // 新增积分签到规则 export const createSignInConfig = async (data: SignInConfigVO) => { - return await request.post({ url: `/point/sign-in-config/create`, data }) + return await request.post({ url: `/member/point/sign-in-config/create`, data }) } // 修改积分签到规则 export const updateSignInConfig = async (data: SignInConfigVO) => { - return await request.put({ url: `/point/sign-in-config/update`, data }) + return await request.put({ url: `/member/point/sign-in-config/update`, data }) } // 删除积分签到规则 export const deleteSignInConfig = async (id: number) => { - return await request.delete({ url: `/point/sign-in-config/delete?id=` + id }) -} - -// 导出积分签到规则 Excel -export const exportSignInConfig = async (params) => { - return await request.download({ url: `/point/sign-in-config/export-excel`, params }) + return await request.delete({ url: `/member/point/sign-in-config/delete?id=` + id }) } diff --git a/src/api/point/signInRecord/index.ts b/src/api/point/signInRecord/index.ts index 0f9b9f64..909449f6 100644 --- a/src/api/point/signInRecord/index.ts +++ b/src/api/point/signInRecord/index.ts @@ -9,30 +9,10 @@ export interface SignInRecordVO { // 查询用户签到积分列表 export const getSignInRecordPage = async (params) => { - return await request.get({ url: `/point/sign-in-record/page`, params }) -} - -// 查询用户签到积分详情 -export const getSignInRecord = async (id: number) => { - return await request.get({ url: `/point/sign-in-record/get?id=` + id }) -} - -// 新增用户签到积分 -export const createSignInRecord = async (data: SignInRecordVO) => { - return await request.post({ url: `/point/sign-in-record/create`, data }) -} - -// 修改用户签到积分 -export const updateSignInRecord = async (data: SignInRecordVO) => { - return await request.put({ url: `/point/sign-in-record/update`, data }) -} - -// 删除用户签到积分 -export const deleteSignInRecord = async (id: number) => { - return await request.delete({ url: `/point/sign-in-record/delete?id=` + id }) + return await request.get({ url: `/member/point/sign-in-record/page`, params }) } // 导出用户签到积分 Excel export const exportSignInRecord = async (params) => { - return await request.download({ url: `/point/sign-in-record/export-excel`, params }) + return await request.download({ url: `/member/point/sign-in-record/export-excel`, params }) } diff --git a/src/views/member/point/config/index.vue b/src/views/member/point/config/index.vue index 0fd1484f..c69013eb 100644 --- a/src/views/member/point/config/index.vue +++ b/src/views/member/point/config/index.vue @@ -10,26 +10,36 @@ <el-form-item label="hideId" v-show="false"> <el-input v-model="formData.id" /> </el-form-item> - <!-- TODO @xiaqing:展示给用户的字段名,可以和 crmeb 保持一直,然后每一个表单都有类似 crmeb 的 tip;例如说:积分抵用比例(1积分抵多少金额)单位:元 --> - <el-form-item label="积分抵扣" prop="tradeDeductEnable"> - <el-switch v-model="formData.tradeDeductEnable" /> + <el-form-item label="积分抵扣" prop="tradeDeductEnable" class="item-bottom"> + <el-switch v-model="formData.tradeDeductEnable" style="user-select: none" /> </el-form-item> - <!-- TODO @xiaqing:用户看到的是元,最多 2 位;分是后端的存储哈 --> - <el-form-item label="抵扣单位(分)" prop="tradeDeductUnitPrice"> + <el-form-item> + <el-text class="mx-1" size="small" type="info">下单积分是否抵用订单金额</el-text> + </el-form-item> + <el-form-item label="积分抵扣" prop="tradeDeductUnitPrice" class="item-bottom"> <el-input-number - v-model="formData.tradeDeductUnitPrice" - placeholder="请输入抵扣单位(分)" + v-model="computedTradeDeductUnitPrice" + placeholder="请输入积分抵扣金额" style="width: 300px" + :precision="2" /> </el-form-item> - <el-form-item label="积分抵扣最大值" prop="tradeDeductMaxPrice"> + <el-form-item> + <el-text class="mx-1" size="small" type="info" + >积分抵用比例(1积分抵多少金额)单位:元 + </el-text> + </el-form-item> + <el-form-item label="积分抵扣最大值" prop="tradeDeductMaxPrice" class="item-bottom"> <el-input-number v-model="formData.tradeDeductMaxPrice" placeholder="请输入积分抵扣最大值" style="width: 300px" /> </el-form-item> - <el-form-item label="1 元赠送多少分" prop="tradeGivePoint"> + <el-form-item> + <el-text class="mx-1" size="small" type="info">单次下单积分使用上限,0不限制</el-text> + </el-form-item> + <el-form-item label="1 元赠送多少分" prop="tradeGivePoint" class="item-bottom"> <el-input-number v-model="formData.tradeGivePoint" placeholder="请输入 1 元赠送多少积分" @@ -37,7 +47,12 @@ /> </el-form-item> <el-form-item> - <el-button type="primary" @click="onSubmit">提交</el-button> + <el-text class="mx-1" size="small" type="info" + >下单支付金额按比例赠送积分(实际支付1元赠送多少积分)</el-text + > + </el-form-item> + <el-form-item> + <el-button type="primary" @click="onSubmit">保存</el-button> </el-form-item> </el-form> </ContentWrap> @@ -52,11 +67,19 @@ const dialogVisible = ref(false) // 弹窗的是否展示 const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用 const formData = ref({ id: undefined, - tradeDeductEnable: undefined, - tradeDeductUnitPrice: undefined, - tradeDeductMaxPrice: undefined, - tradeGivePoint: undefined + tradeDeductEnable: true, + tradeDeductUnitPrice: 0, + tradeDeductMaxPrice: 0, + tradeGivePoint: 0 }) +// 创建一个计算属性,用于将 tradeDeductUnitPrice 显示为带两位小数的形式 +const computedTradeDeductUnitPrice = computed({ + get: () => (formData.value.tradeDeductUnitPrice / 100).toFixed(2), + set: (newValue) => { + formData.value.tradeDeductUnitPrice = Math.round(newValue * 100) + } +}) + const formRules = reactive({}) const formRef = ref() // 表单 Ref @@ -82,6 +105,7 @@ const onSubmit = async () => { const getConfig = async () => { try { const data = await ConfigApi.getConfig() + if (data === null) return formData.value = data } finally { } @@ -91,3 +115,9 @@ onMounted(() => { getConfig() }) </script> + +<style scoped> +.item-bottom { + margin-bottom: 0px; +} +</style> diff --git a/src/views/member/point/record/RecordForm.vue b/src/views/member/point/record/RecordForm.vue deleted file mode 100644 index a75eb9a5..00000000 --- a/src/views/member/point/record/RecordForm.vue +++ /dev/null @@ -1,180 +0,0 @@ -<template> - <Dialog :title="dialogTitle" v-model="dialogVisible"> - <el-form - ref="formRef" - :model="formData" - :rules="formRules" - label-width="120px" - v-loading="formLoading" - > - <el-form-item label="业务编码" prop="bizId"> - <el-input v-model="formData.bizId" placeholder="请输入业务编码" /> - </el-form-item> - <el-form-item label="业务类型" prop="bizType"> - <el-select v-model="formData.bizType" placeholder="请选择业务类型"> - <el-option - v-for="dict in getStrDictOptions(DICT_TYPE.MEMBER_POINT_BIZ_TYPE)" - :key="dict.value" - :label="dict.label" - :value="dict.value" - /> - </el-select> - </el-form-item> - <el-form-item label="操作类型" prop="type"> - <el-select v-model="formData.type" placeholder="操作类型"> - <el-option label="增加" value="1" /> - <el-option label="扣减" value="0" /> - </el-select> - </el-form-item> - <el-form-item label="积分标题" prop="title"> - <el-input v-model="formData.title" placeholder="请输入积分标题" /> - </el-form-item> - <el-form-item label="积分描述"> - <Editor :model-value="formData.description" height="150px" /> - </el-form-item> - <el-form-item label="积分" prop="point"> - <el-input v-model="formData.point" placeholder="请输入积分" /> - </el-form-item> - <el-form-item label="变动后的积分" prop="totalPoint"> - <el-input v-model="formData.totalPoint" placeholder="请输入变动后的积分" /> - </el-form-item> - <el-form-item label="积分状态" prop="status"> - <el-select v-model="formData.status" placeholder="积分状态"> - <el-option - v-for="dict in getIntDictOptions(DICT_TYPE.MEMBER_POINT_STATUS)" - :key="dict.value" - :label="dict.label" - :value="dict.value" - /> - </el-select> - </el-form-item> - <el-form-item label="用户id" prop="userId"> - <el-input v-model="formData.userId" placeholder="请输入用户id" /> - </el-form-item> - <el-form-item label="冻结时间" prop="freezingTime"> - <el-date-picker - v-model="formData.freezingTime" - type="date" - value-format="x" - placeholder="选择冻结时间" - /> - </el-form-item> - <el-form-item label="解冻时间" prop="thawingTime"> - <el-date-picker - v-model="formData.thawingTime" - type="date" - value-format="x" - placeholder="选择解冻时间" - /> - </el-form-item> - <el-form-item label="发生时间" prop="createDate"> - <el-date-picker - v-model="formData.createDate" - type="date" - value-format="x" - placeholder="选择发生时间" - /> - </el-form-item> - </el-form> - <template #footer> - <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button> - <el-button @click="dialogVisible = false">取 消</el-button> - </template> - </Dialog> -</template> -<script lang="ts" setup> -import { DICT_TYPE, getStrDictOptions, getIntDictOptions } from '@/utils/dict' -import * as RecordApi from '@/api/point/record' - -const { t } = useI18n() // 国际化 -const message = useMessage() // 消息弹窗 - -const dialogVisible = ref(false) // 弹窗的是否展示 -const dialogTitle = ref('') // 弹窗的标题 -const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用 -const formType = ref('') // 表单的类型:create - 新增;update - 修改 -const formData = ref({ - id: undefined, - bizId: undefined, - bizType: undefined, - type: undefined, - title: undefined, - description: undefined, - point: undefined, - totalPoint: undefined, - status: undefined, - userId: undefined, - freezingTime: undefined, - thawingTime: undefined, - createDate: undefined -}) -const formRules = reactive({ - totalPoint: [{ required: true, message: '变动后的积分不能为空', trigger: 'blur' }] -}) -const formRef = ref() // 表单 Ref - -/** 打开弹窗 */ -const open = async (type: string, id?: number) => { - dialogVisible.value = true - dialogTitle.value = t('action.' + type) - formType.value = type - resetForm() - // 修改时,设置数据 - if (id) { - formLoading.value = true - try { - formData.value = await RecordApi.getRecord(id) - } finally { - formLoading.value = false - } - } -} -defineExpose({ open }) // 提供 open 方法,用于打开弹窗 - -/** 提交表单 */ -const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调 -const submitForm = async () => { - // 校验表单 - if (!formRef) return - const valid = await formRef.value.validate() - if (!valid) return - // 提交请求 - formLoading.value = true - try { - const data = formData.value as unknown as RecordApi.RecordVO - if (formType.value === 'create') { - await RecordApi.createRecord(data) - message.success(t('common.createSuccess')) - } else { - await RecordApi.updateRecord(data) - message.success(t('common.updateSuccess')) - } - dialogVisible.value = false - // 发送操作成功的事件 - emit('success') - } finally { - formLoading.value = false - } -} - -// TODO @xiaqing:不需要更新操作哇? -/** 重置表单 */ -const resetForm = () => { - formData.value = { - id: undefined, - bizId: undefined, - bizType: undefined, - type: undefined, - title: undefined, - description: undefined, - point: undefined, - totalPoint: undefined, - status: undefined, - userId: undefined, - freezingTime: undefined, - thawingTime: undefined, - createDate: undefined - } - formRef.value?.resetFields() -} -</script> diff --git a/src/views/member/point/record/index.vue b/src/views/member/point/record/index.vue index 517410f7..f1e74bfa 100644 --- a/src/views/member/point/record/index.vue +++ b/src/views/member/point/record/index.vue @@ -8,10 +8,10 @@ :inline="true" label-width="68px" > - <el-form-item label="业务编码" prop="bizId"> + <el-form-item label="用户" prop="nickname"> <el-input - v-model="queryParams.bizId" - placeholder="请输入业务编码" + v-model="queryParams.nickname" + placeholder="请输入用户昵称" clearable @keyup.enter="handleQuery" class="!w-240px" @@ -32,12 +32,6 @@ /> </el-select> </el-form-item> - <el-form-item label="操作类型" prop="type"> - <el-select v-model="queryParams.type" placeholder="操作类型" clearable class="!w-240px"> - <el-option label="增加" value="1" /> - <el-option label="扣减" value="0" /> - </el-select> - </el-form-item> <el-form-item label="积分标题" prop="title"> <el-input v-model="queryParams.title" @@ -69,8 +63,14 @@ /> </el-form-item> <el-form-item> - <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button> - <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button> + <el-button @click="handleQuery"> + <Icon icon="ep:search" class="mr-5px" /> + 搜索 + </el-button> + <el-button @click="resetQuery"> + <Icon icon="ep:refresh" class="mr-5px" /> + 重置 + </el-button> </el-form-item> </el-form> </ContentWrap> @@ -79,28 +79,23 @@ <ContentWrap> <el-table v-loading="loading" :data="list"> <el-table-column label="编号" align="center" prop="id" /> - <!-- TODO @xiaqing:展示用户的昵称哈; --> - <el-table-column label="用户" align="center" prop="userId" /> + <el-table-column label="用户" align="center" prop="nickname" /> <el-table-column label="积分标题" align="center" prop="title" /> <el-table-column label="积分描述" align="center" prop="description" /> <el-table-column label="获得时间" align="center" - prop="createDate" + prop="createTime" :formatter="dateFormatter" /> - <!-- todo @xiaqing:可以参考 crmeb 的展示,把积分和增加减少放一起,用红色和绿色展示 --> - <el-table-column - label="操作类型" - align="center" - prop="type" - :formatter=" - (a, b, c) => { - return c === '1' ? '增加' : '扣减' - } - " - /> - <el-table-column label="积分" align="center" prop="point" /> + <el-table-column label="积分" align="center" prop="point"> + <template #default="scope"> + <el-tag v-if="scope.row.point > 0" class="ml-2" type="success" effect="dark"> + {{ scope.row.point }} + </el-tag> + <el-tag v-else class="ml-2" type="danger" effect="dark"> {{ scope.row.point }} </el-tag> + </template> + </el-table-column> <el-table-column label="变动后的积分" align="center" prop="totalPoint" /> <el-table-column label="业务编码" align="center" prop="bizId" /> <el-table-column label="业务类型" align="center" prop="bizType"> @@ -143,7 +138,6 @@ import { DICT_TYPE, getStrDictOptions, getIntDictOptions } from '@/utils/dict' import { dateFormatter } from '@/utils/formatTime' import * as RecordApi from '@/api/point/record' -import RecordForm from './RecordForm.vue' defineOptions({ name: 'PointRecord' }) @@ -153,7 +147,7 @@ const list = ref([]) // 列表的数据 const queryParams = reactive({ pageNo: 1, pageSize: 10, - bizId: null, + nickname: null, bizType: null, type: null, title: null, diff --git a/src/views/member/signin/config/SignInConfigForm.vue b/src/views/member/signin/config/SignInConfigForm.vue index 52263c94..3c272c80 100644 --- a/src/views/member/signin/config/SignInConfigForm.vue +++ b/src/views/member/signin/config/SignInConfigForm.vue @@ -71,6 +71,8 @@ const submitForm = async () => { try { const data = formData.value as unknown as SignInConfigApi.SignInConfigVO if (formType.value === 'create') { + //默认新创建的自动启动 + data.enable = true await SignInConfigApi.createSignInConfig(data) message.success(t('common.createSuccess')) } else { diff --git a/src/views/member/signin/config/index.vue b/src/views/member/signin/config/index.vue index ca4db158..99e22589 100644 --- a/src/views/member/signin/config/index.vue +++ b/src/views/member/signin/config/index.vue @@ -1,55 +1,39 @@ <template> <ContentWrap> <!-- 搜索工作栏 --> - <el-form - class="-mb-15px" - :model="queryParams" - ref="queryFormRef" - :inline="true" - label-width="68px" + <el-button + type="primary" + plain + @click="openForm('create')" + v-hasPermi="['point:sign-in-config:create']" > - <!-- TODO @xiaqing:搜索可以去掉,因为一共就没几条配置哈 --> - <el-form-item label="签到天数" prop="day"> - <el-input - v-model="queryParams.day" - placeholder="请输入签到天数" - clearable - @keyup.enter="handleQuery" - class="!w-240px" - /> - </el-form-item> - <el-form-item> - <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button> - <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button> - <el-button - type="primary" - plain - @click="openForm('create')" - v-hasPermi="['point:sign-in-config:create']" - > - <Icon icon="ep:plus" class="mr-5px" /> 新增 - </el-button> - <el-button - type="success" - plain - @click="handleExport" - :loading="exportLoading" - v-hasPermi="['point:sign-in-config:export']" - > - <!-- TODO @xiaqing:四个功能的导出都可以去掉 --> - <Icon icon="ep:download" class="mr-5px" /> 导出 - </el-button> - </el-form-item> - </el-form> + <Icon icon="ep:plus" class="mr-5px" /> 新增 + </el-button> </ContentWrap> <!-- 列表 --> <ContentWrap> <el-table v-loading="loading" :data="list"> - <!-- TODO @xiaqing:展示优化下,改成第 1 天、第 2 天这种 --> - <el-table-column label="签到天数" align="center" prop="day" /> + <el-table-column + label="签到天数" + align="center" + prop="day" + :formatter="(_, __, cellValue) => ['第', cellValue, '天'].join(' ')" + /> <el-table-column label="获得积分" align="center" prop="point" /> - <!-- TODO @xiaqing:展示一个是否开启 --> + <el-table-column label="是否开启" align="center"> + <template #default="scope"> + <div> + <el-switch + v-model="scope.row.enable" + @change="handleSwitchChange(scope.row, $event)" + inline-prompt + active-text="开启" + inactive-text="关闭" + /> + </div> + </template> + </el-table-column> <el-table-column label="操作" align="center"> <template #default="scope"> <el-button @@ -71,13 +55,6 @@ </template> </el-table-column> </el-table> - <!-- 分页 --> - <Pagination - :total="total" - v-model:page="queryParams.pageNo" - v-model:limit="queryParams.pageSize" - @pagination="getList" - /> </ContentWrap> <!-- 表单弹窗:添加/修改 --> @@ -85,9 +62,9 @@ </template> <script lang="ts" setup> -import download from '@/utils/download' import * as SignInConfigApi from '@/api/point/signInConfig' import SignInConfigForm from './SignInConfigForm.vue' +import { SignInConfigVO } from '@/api/point/signInConfig' defineOptions({ name: 'SignInConfig' }) @@ -95,41 +72,20 @@ const message = useMessage() // 消息弹窗 const { t } = useI18n() // 国际化 const loading = ref(true) // 列表的加载中 -const total = ref(0) // 列表的总页数 const list = ref([]) // 列表的数据 -const queryParams = reactive({ - pageNo: 1, - pageSize: 10, - day: null -}) -const queryFormRef = ref() // 搜索的表单 -const exportLoading = ref(false) // 导出的加载中 -// TODO @xiaqing:可以不分页; /** 查询列表 */ const getList = async () => { loading.value = true try { - const data = await SignInConfigApi.getSignInConfigPage(queryParams) - list.value = data.list - total.value = data.total + const data = await SignInConfigApi.getSignInConfigPage() + console.log(data) + list.value = data } finally { loading.value = false } } -/** 搜索按钮操作 */ -const handleQuery = () => { - queryParams.pageNo = 1 - getList() -} - -/** 重置按钮操作 */ -const resetQuery = () => { - queryFormRef.value.resetFields() - handleQuery() -} - /** 添加/修改操作 */ const formRef = ref() const openForm = (type: string, id?: number) => { @@ -149,19 +105,12 @@ const handleDelete = async (id: number) => { } catch {} } -/** 导出按钮操作 */ -const handleExport = async () => { - try { - // 导出的二次确认 - await message.exportConfirm() - // 发起导出 - exportLoading.value = true - const data = await SignInConfigApi.exportSignInConfig(queryParams) - download.excel(data, '积分签到规则.xls') - } catch { - } finally { - exportLoading.value = false - } +const handleSwitchChange = async (row, e) => { + console.log('开关状态变更,id:', row, '新状态:', e) + // 创建对象 + const signInConfig: SignInConfigVO = { enable: e } + ;({ id: signInConfig.id, day: signInConfig.day, point: signInConfig.point, enable: e } = row) + await SignInConfigApi.updateSignInConfig(signInConfig) } /** 初始化 **/ diff --git a/src/views/member/signin/record/SignInRecordForm.vue b/src/views/member/signin/record/SignInRecordForm.vue deleted file mode 100644 index 8534aed0..00000000 --- a/src/views/member/signin/record/SignInRecordForm.vue +++ /dev/null @@ -1,99 +0,0 @@ -<template> - <Dialog :title="dialogTitle" v-model="dialogVisible"> - <el-form - ref="formRef" - :model="formData" - :rules="formRules" - label-width="100px" - v-loading="formLoading" - > - <el-form-item label="签到用户" prop="userId"> - <el-input v-model="formData.userId" placeholder="请输入签到用户" /> - </el-form-item> - <el-form-item label="签到天数" prop="day"> - <el-input v-model="formData.day" placeholder="请输入签到天数" /> - </el-form-item> - <el-form-item label="签到的分数" prop="point"> - <el-input v-model="formData.point" placeholder="请输入签到的分数" /> - </el-form-item> - </el-form> - <template #footer> - <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button> - <el-button @click="dialogVisible = false">取 消</el-button> - </template> - </Dialog> -</template> -<script lang="ts" setup> -import * as SignInRecordApi from '@/api/point/signInRecord' - -const { t } = useI18n() // 国际化 -const message = useMessage() // 消息弹窗 - -const dialogVisible = ref(false) // 弹窗的是否展示 -const dialogTitle = ref('') // 弹窗的标题 -const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用 -const formType = ref('') // 表单的类型:create - 新增;update - 修改 -const formData = ref({ - id: undefined, - userId: undefined, - day: undefined, - point: undefined -}) -const formRules = reactive({}) -const formRef = ref() // 表单 Ref - -/** 打开弹窗 */ -const open = async (type: string, id?: number) => { - dialogVisible.value = true - dialogTitle.value = t('action.' + type) - formType.value = type - resetForm() - // 修改时,设置数据 - if (id) { - formLoading.value = true - try { - formData.value = await SignInRecordApi.getSignInRecord(id) - } finally { - formLoading.value = false - } - } -} -defineExpose({ open }) // 提供 open 方法,用于打开弹窗 - -/** 提交表单 */ -const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调 -const submitForm = async () => { - // 校验表单 - if (!formRef) return - const valid = await formRef.value.validate() - if (!valid) return - // 提交请求 - formLoading.value = true - try { - const data = formData.value as unknown as SignInRecordApi.SignInRecordVO - if (formType.value === 'create') { - await SignInRecordApi.createSignInRecord(data) - message.success(t('common.createSuccess')) - } else { - await SignInRecordApi.updateSignInRecord(data) - message.success(t('common.updateSuccess')) - } - dialogVisible.value = false - // 发送操作成功的事件 - emit('success') - } finally { - formLoading.value = false - } -} - -/** 重置表单 */ -const resetForm = () => { - formData.value = { - id: undefined, - userId: undefined, - day: undefined, - point: undefined - } - formRef.value?.resetFields() -} -</script> diff --git a/src/views/member/signin/record/index.vue b/src/views/member/signin/record/index.vue index 0dfd2aa6..f7dd26c6 100644 --- a/src/views/member/signin/record/index.vue +++ b/src/views/member/signin/record/index.vue @@ -8,9 +8,9 @@ :inline="true" label-width="68px" > - <el-form-item label="签到用户" prop="userId"> + <el-form-item label="签到用户" prop="nickname"> <el-input - v-model="queryParams.userId" + v-model="queryParams.nickname" placeholder="请输入签到用户" clearable @keyup.enter="handleQuery" @@ -58,8 +58,13 @@ <el-table v-loading="loading" :data="list"> <el-table-column label="编号" align="center" prop="id" /> <!-- TODO @xiaqing:展示用户昵称 --> - <el-table-column label="签到用户" align="center" prop="userId" /> - <el-table-column label="签到天数" align="center" prop="day" /> + <el-table-column label="签到用户" align="center" prop="nickname" /> + <el-table-column + label="签到天数" + align="center" + prop="day" + :formatter="(_, __, cellValue) => ['第', cellValue, '天'].join(' ')" + /> <el-table-column label="获得积分" align="center" prop="point" /> <el-table-column label="签到时间" @@ -67,18 +72,6 @@ prop="createTime" :formatter="dateFormatter" /> - <el-table-column label="操作" align="center"> - <template #default="scope"> - <el-button - link - type="danger" - @click="handleDelete(scope.row.id)" - v-hasPermi="['point:sign-in-record:delete']" - > - 删除 - </el-button> - </template> - </el-table-column> </el-table> <!-- 分页 --> <Pagination @@ -97,12 +90,10 @@ import { dateFormatter } from '@/utils/formatTime' import download from '@/utils/download' import * as SignInRecordApi from '@/api/point/signInRecord' -import SignInRecordForm from './SignInRecordForm.vue' defineOptions({ name: 'SignInRecord' }) const message = useMessage() // 消息弹窗 -const { t } = useI18n() // 国际化 const loading = ref(true) // 列表的加载中 const total = ref(0) // 列表的总页数 @@ -110,7 +101,7 @@ const list = ref([]) // 列表的数据 const queryParams = reactive({ pageNo: 1, pageSize: 10, - userId: null, + nickname: null, day: null, createTime: [] }) @@ -141,25 +132,6 @@ const resetQuery = () => { handleQuery() } -/** 添加/修改操作 */ -// const formRef = ref() -// const openForm = (type: string, id?: number) => { -// formRef.value.open(type, id) -// } - -/** 删除按钮操作 */ -const handleDelete = async (id: number) => { - try { - // 删除的二次确认 - await message.delConfirm() - // 发起删除 - await SignInRecordApi.deleteSignInRecord(id) - message.success(t('common.delSuccess')) - // 刷新列表 - await getList() - } catch {} -} - /** 导出按钮操作 */ const handleExport = async () => { try {