From f310f65842ce05a391d463610e7f7ac7a86dbe2b Mon Sep 17 00:00:00 2001 From: xiaqing <xiaqing@bonc> Date: Wed, 9 Aug 2023 16:14:00 +0800 Subject: [PATCH 01/12] =?UTF-8?q?=E4=BC=9A=E5=91=98=E7=AD=BE=E5=88=B0?= =?UTF-8?q?=E9=92=88=E5=AF=B9=E4=BB=A3=E7=A0=81=E6=A0=BC=E5=BC=8F=E3=80=81?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E4=BC=98=E5=8C=96=20=201.=E4=BC=98=E5=8C=96t?= =?UTF-8?q?odo=E5=BB=BA=E8=AE=AE=20=202.=E5=88=A0=E9=99=A4=E6=97=A0?= =?UTF-8?q?=E7=94=A8=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/point/signInConfig/index.ts | 14 +- src/api/point/signInRecord/index.ts | 20 --- src/views/member/point/record/index.vue | 12 +- src/views/member/signin/config/index.vue | 125 ++++++------------ .../member/signin/record/SignInRecordForm.vue | 99 -------------- src/views/member/signin/record/index.vue | 35 +---- 6 files changed, 54 insertions(+), 251 deletions(-) delete mode 100644 src/views/member/signin/record/SignInRecordForm.vue diff --git a/src/api/point/signInConfig/index.ts b/src/api/point/signInConfig/index.ts index 3786c06e..52ad7047 100644 --- a/src/api/point/signInConfig/index.ts +++ b/src/api/point/signInConfig/index.ts @@ -2,13 +2,14 @@ import request from '@/config/axios' export interface SignInConfigVO { id: number - day: number - point: number + day: number | null + point: number | null + isEnable: 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: `/point/sign-in-config/list` }) } // 查询积分签到规则详情 @@ -30,8 +31,3 @@ export const updateSignInConfig = async (data: SignInConfigVO) => { 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 }) -} diff --git a/src/api/point/signInRecord/index.ts b/src/api/point/signInRecord/index.ts index 0f9b9f64..2ca8ca86 100644 --- a/src/api/point/signInRecord/index.ts +++ b/src/api/point/signInRecord/index.ts @@ -12,26 +12,6 @@ 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 }) -} - // 导出用户签到积分 Excel export const exportSignInRecord = async (params) => { return await request.download({ url: `/point/sign-in-record/export-excel`, params }) diff --git a/src/views/member/point/record/index.vue b/src/views/member/point/record/index.vue index 517410f7..1d002dee 100644 --- a/src/views/member/point/record/index.vue +++ b/src/views/member/point/record/index.vue @@ -69,8 +69,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> @@ -95,7 +101,7 @@ align="center" prop="type" :formatter=" - (a, b, c) => { + (_, __, c) => { return c === '1' ? '增加' : '扣减' } " diff --git a/src/views/member/signin/config/index.vue b/src/views/member/signin/config/index.vue index ca4db158..50ea26be 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.isEnable" + @change="handleSwitchChange(scope.row.id, $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,16 @@ 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 (id, e) => { + console.log('开关状态变更,id:', id, '新状态:', e) + // 创建对象 + const signInConfig: SignInConfigVO = { + id: id, + day: null, + point: null, + isEnable: e } + 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..4039e1e2 100644 --- a/src/views/member/signin/record/index.vue +++ b/src/views/member/signin/record/index.vue @@ -58,7 +58,7 @@ <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="day" /> <el-table-column label="获得积分" align="center" prop="point" /> <el-table-column @@ -67,18 +67,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 +85,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) // 列表的总页数 @@ -141,25 +127,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 { From de941ec6ba0327d638dad22f3258ccc50f86a303 Mon Sep 17 00:00:00 2001 From: xiaqing <xiaqing@bonc> Date: Wed, 9 Aug 2023 20:59:54 +0800 Subject: [PATCH 02/12] =?UTF-8?q?=E4=BC=9A=E5=91=98=E7=A7=AF=E5=88=86?= =?UTF-8?q?=E9=92=88=E5=AF=B9=E4=BB=A3=E7=A0=81=E6=A0=BC=E5=BC=8F=E3=80=81?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E4=BC=98=E5=8C=96=201.=E4=BC=98=E5=8C=96todo?= =?UTF-8?q?=E5=BB=BA=E8=AE=AE=202.=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/point/record/index.ts | 26 --- src/views/member/point/config/index.vue | 37 +++- src/views/member/point/record/RecordForm.vue | 180 ------------------- src/views/member/point/record/index.vue | 38 ++-- src/views/member/signin/record/index.vue | 13 +- 5 files changed, 51 insertions(+), 243 deletions(-) delete mode 100644 src/views/member/point/record/RecordForm.vue diff --git a/src/api/point/record/index.ts b/src/api/point/record/index.ts index 15eaff35..adbdcc56 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 @@ -20,28 +19,3 @@ 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 }) -} diff --git a/src/views/member/point/config/index.vue b/src/views/member/point/config/index.vue index 0fd1484f..8a050491 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> + <el-form-item> + <el-text class="mx-1" size="small" type="info">下单积分是否抵用订单金额</el-text> </el-form-item> <!-- TODO @xiaqing:用户看到的是元,最多 2 位;分是后端的存储哈 --> - <el-form-item label="抵扣单位(分)" prop="tradeDeductUnitPrice"> + <el-form-item label="积分抵扣" prop="tradeDeductUnitPrice" class="item-bottom"> <el-input-number v-model="formData.tradeDeductUnitPrice" - placeholder="请输入抵扣单位(分)" + placeholder="请输入积分抵扣金额" style="width: 300px" /> </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> @@ -91,3 +106,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 1d002dee..1f33c3a2 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" @@ -85,8 +79,7 @@ <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 @@ -95,18 +88,14 @@ prop="createDate" :formatter="dateFormatter" /> - <!-- todo @xiaqing:可以参考 crmeb 的展示,把积分和增加减少放一起,用红色和绿色展示 --> - <el-table-column - label="操作类型" - align="center" - prop="type" - :formatter=" - (_, __, 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"> @@ -149,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' }) @@ -159,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/record/index.vue b/src/views/member/signin/record/index.vue index 4039e1e2..d74edcdf 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" @@ -59,7 +59,12 @@ <el-table-column label="编号" align="center" prop="id" /> <!-- TODO @xiaqing:展示用户昵称 --> <el-table-column label="签到用户" align="center" prop="nickName" /> - <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" /> <el-table-column label="签到时间" @@ -96,7 +101,7 @@ const list = ref([]) // 列表的数据 const queryParams = reactive({ pageNo: 1, pageSize: 10, - userId: null, + nickName: null, day: null, createTime: [] }) From f2e029dca6c4dec13d3bc43a4d5f7d65da7f94dd Mon Sep 17 00:00:00 2001 From: xiaqing <xiaqing@bonc> Date: Wed, 9 Aug 2023 22:32:13 +0800 Subject: [PATCH 03/12] =?UTF-8?q?=E4=BC=9A=E5=91=98=E7=A7=AF=E5=88=86?= =?UTF-8?q?=E9=92=88=E5=AF=B9=E4=BB=A3=E7=A0=81=E6=A0=BC=E5=BC=8F=E3=80=81?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E4=BC=98=E5=8C=96=201.=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E7=A7=AF=E5=88=86=E6=8A=B5=E6=89=A3=E5=8D=95=E4=BD=8D=EF=BC=8C?= =?UTF-8?q?=E6=8C=89=E7=85=A7=E5=88=86=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/member/point/config/index.vue | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/views/member/point/config/index.vue b/src/views/member/point/config/index.vue index 8a050491..940585b5 100644 --- a/src/views/member/point/config/index.vue +++ b/src/views/member/point/config/index.vue @@ -16,12 +16,12 @@ <el-form-item> <el-text class="mx-1" size="small" type="info">下单积分是否抵用订单金额</el-text> </el-form-item> - <!-- TODO @xiaqing:用户看到的是元,最多 2 位;分是后端的存储哈 --> <el-form-item label="积分抵扣" prop="tradeDeductUnitPrice" class="item-bottom"> <el-input-number - v-model="formData.tradeDeductUnitPrice" + v-model="computedTradeDeductUnitPrice" placeholder="请输入积分抵扣金额" style="width: 300px" + :precision="2" /> </el-form-item> <el-form-item> @@ -67,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 @@ -97,7 +105,8 @@ const onSubmit = async () => { const getConfig = async () => { try { const data = await ConfigApi.getConfig() - formData.value = data + // if (data === null) return + // formData.value = data } finally { } } From f8a4df8b773442d856b0d712045ad5a71cc866e1 Mon Sep 17 00:00:00 2001 From: xiaqing <xiaqing@bonc> Date: Wed, 9 Aug 2023 22:33:09 +0800 Subject: [PATCH 04/12] =?UTF-8?q?=E4=BC=9A=E5=91=98=E7=A7=AF=E5=88=86?= =?UTF-8?q?=E9=92=88=E5=AF=B9=E4=BB=A3=E7=A0=81=E6=A0=BC=E5=BC=8F=E3=80=81?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E4=BC=98=E5=8C=96=201.=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E7=A7=AF=E5=88=86=E6=8A=B5=E6=89=A3=E5=8D=95=E4=BD=8D=EF=BC=8C?= =?UTF-8?q?=E6=8C=89=E7=85=A7=E5=88=86=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/member/point/config/index.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/views/member/point/config/index.vue b/src/views/member/point/config/index.vue index 940585b5..c69013eb 100644 --- a/src/views/member/point/config/index.vue +++ b/src/views/member/point/config/index.vue @@ -105,8 +105,8 @@ const onSubmit = async () => { const getConfig = async () => { try { const data = await ConfigApi.getConfig() - // if (data === null) return - // formData.value = data + if (data === null) return + formData.value = data } finally { } } From 19444021ca65db5d9a766d0f19fbdd8c3214cc79 Mon Sep 17 00:00:00 2001 From: xiaqing <xiaqing@bonc> Date: Sat, 19 Aug 2023 14:10:11 +0800 Subject: [PATCH 05/12] =?UTF-8?q?=E4=BC=9A=E5=91=98=E7=A7=AF=E5=88=86?= =?UTF-8?q?=E5=92=8C=E4=BC=9A=E5=91=98=E7=AD=BE=E5=88=B0=E6=A8=A1=E5=9D=97?= =?UTF-8?q?todo=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/point/config/index.ts | 4 ++-- src/api/point/record/index.ts | 2 +- src/api/point/signInConfig/index.ts | 12 ++++++------ src/api/point/signInRecord/index.ts | 4 ++-- src/views/member/point/record/index.vue | 10 +++++----- .../member/signin/config/SignInConfigForm.vue | 2 ++ src/views/member/signin/config/index.vue | 16 ++++++---------- src/views/member/signin/record/index.vue | 8 ++++---- 8 files changed, 28 insertions(+), 30 deletions(-) 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 adbdcc56..1c60f754 100644 --- a/src/api/point/record/index.ts +++ b/src/api/point/record/index.ts @@ -17,5 +17,5 @@ export interface RecordVO { // 查询用户积分记录列表 export const getRecordPage = async (params) => { - return await request.get({ url: `/point/record/page`, 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 52ad7047..246270ec 100644 --- a/src/api/point/signInConfig/index.ts +++ b/src/api/point/signInConfig/index.ts @@ -4,30 +4,30 @@ export interface SignInConfigVO { id: number day: number | null point: number | null - isEnable: boolean | null + enable: boolean | null } // 查询积分签到规则列表 export const getSignInConfigPage = async () => { - return await request.get({ url: `/point/sign-in-config/list` }) + 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 }) + 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 2ca8ca86..909449f6 100644 --- a/src/api/point/signInRecord/index.ts +++ b/src/api/point/signInRecord/index.ts @@ -9,10 +9,10 @@ export interface SignInRecordVO { // 查询用户签到积分列表 export const getSignInRecordPage = async (params) => { - return await request.get({ url: `/point/sign-in-record/page`, params }) + 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/record/index.vue b/src/views/member/point/record/index.vue index 1f33c3a2..f1e74bfa 100644 --- a/src/views/member/point/record/index.vue +++ b/src/views/member/point/record/index.vue @@ -8,9 +8,9 @@ :inline="true" label-width="68px" > - <el-form-item label="用户" prop="nickName"> + <el-form-item label="用户" prop="nickname"> <el-input - v-model="queryParams.nickName" + v-model="queryParams.nickname" placeholder="请输入用户昵称" clearable @keyup.enter="handleQuery" @@ -79,13 +79,13 @@ <ContentWrap> <el-table v-loading="loading" :data="list"> <el-table-column label="编号" align="center" prop="id" /> - <el-table-column label="用户" align="center" prop="nickName" /> + <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" /> <el-table-column label="积分" align="center" prop="point"> @@ -147,7 +147,7 @@ const list = ref([]) // 列表的数据 const queryParams = reactive({ pageNo: 1, pageSize: 10, - nickName: 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 50ea26be..99e22589 100644 --- a/src/views/member/signin/config/index.vue +++ b/src/views/member/signin/config/index.vue @@ -25,8 +25,8 @@ <template #default="scope"> <div> <el-switch - v-model="scope.row.isEnable" - @change="handleSwitchChange(scope.row.id, $event)" + v-model="scope.row.enable" + @change="handleSwitchChange(scope.row, $event)" inline-prompt active-text="开启" inactive-text="关闭" @@ -105,15 +105,11 @@ const handleDelete = async (id: number) => { } catch {} } -const handleSwitchChange = async (id, e) => { - console.log('开关状态变更,id:', id, '新状态:', e) +const handleSwitchChange = async (row, e) => { + console.log('开关状态变更,id:', row, '新状态:', e) // 创建对象 - const signInConfig: SignInConfigVO = { - id: id, - day: null, - point: null, - isEnable: 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/index.vue b/src/views/member/signin/record/index.vue index d74edcdf..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="nickName"> + <el-form-item label="签到用户" prop="nickname"> <el-input - v-model="queryParams.nickName" + v-model="queryParams.nickname" placeholder="请输入签到用户" clearable @keyup.enter="handleQuery" @@ -58,7 +58,7 @@ <el-table v-loading="loading" :data="list"> <el-table-column label="编号" align="center" prop="id" /> <!-- TODO @xiaqing:展示用户昵称 --> - <el-table-column label="签到用户" align="center" prop="nickName" /> + <el-table-column label="签到用户" align="center" prop="nickname" /> <el-table-column label="签到天数" align="center" @@ -101,7 +101,7 @@ const list = ref([]) // 列表的数据 const queryParams = reactive({ pageNo: 1, pageSize: 10, - nickName: null, + nickname: null, day: null, createTime: [] }) From 334962fe09b409bb4742989100a58db0efdfcc29 Mon Sep 17 00:00:00 2001 From: owen <owen@evolsun.com> Date: Fri, 18 Aug 2023 18:52:26 +0800 Subject: [PATCH 06/12] =?UTF-8?q?=E4=BC=9A=E5=91=98=EF=BC=9A=201.=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E4=BC=9A=E5=91=98=E6=A0=87=E7=AD=BE=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/member/tag/index.ts | 36 +++++++ src/views/member/tag/TagForm.vue | 91 ++++++++++++++++ src/views/member/tag/index.vue | 179 +++++++++++++++++++++++++++++++ 3 files changed, 306 insertions(+) create mode 100644 src/api/member/tag/index.ts create mode 100644 src/views/member/tag/TagForm.vue create mode 100644 src/views/member/tag/index.vue diff --git a/src/api/member/tag/index.ts b/src/api/member/tag/index.ts new file mode 100644 index 00000000..a844dbe3 --- /dev/null +++ b/src/api/member/tag/index.ts @@ -0,0 +1,36 @@ +import request from '@/config/axios' + +export interface TagVO { + id: number + name: string +} + +// 查询会员标签列表 +export const getMemberTagPage = async (params) => { + return await request.get({ url: `/member/tag/page`, params }) +} + +// 查询会员标签详情 +export const getMemberTag = async (id: number) => { + return await request.get({ url: `/member/tag/get?id=` + id }) +} + +// 新增会员标签 +export const createMemberTag = async (data: TagVO) => { + return await request.post({ url: `/member/tag/create`, data }) +} + +// 修改会员标签 +export const updateMemberTag = async (data: TagVO) => { + return await request.put({ url: `/member/tag/update`, data }) +} + +// 删除会员标签 +export const deleteMemberTag = async (id: number) => { + return await request.delete({ url: `/member/tag/delete?id=` + id }) +} + +// 导出会员标签 Excel +export const exportMemberTag = async (params) => { + return await request.download({ url: `/member/tag/export-excel`, params }) +} diff --git a/src/views/member/tag/TagForm.vue b/src/views/member/tag/TagForm.vue new file mode 100644 index 00000000..d45ea589 --- /dev/null +++ b/src/views/member/tag/TagForm.vue @@ -0,0 +1,91 @@ +<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="name"> + <el-input v-model="formData.name" 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 setup lang="ts"> +import * as TagApi from '@/api/member/tag' + +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, + name: undefined +}) +const formRules = reactive({ + name: [{ 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 TagApi.getMemberTag(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 TagApi.TagVO + if (formType.value === 'create') { + await TagApi.createMemberTag(data) + message.success(t('common.createSuccess')) + } else { + await TagApi.updateMemberTag(data) + message.success(t('common.updateSuccess')) + } + dialogVisible.value = false + // 发送操作成功的事件 + emit('success') + } finally { + formLoading.value = false + } +} + +/** 重置表单 */ +const resetForm = () => { + formData.value = { + id: undefined, + name: undefined + } + formRef.value?.resetFields() +} +</script> diff --git a/src/views/member/tag/index.vue b/src/views/member/tag/index.vue new file mode 100644 index 00000000..49633edf --- /dev/null +++ b/src/views/member/tag/index.vue @@ -0,0 +1,179 @@ +<template> + <ContentWrap> + <!-- 搜索工作栏 --> + <el-form + class="-mb-15px" + :model="queryParams" + ref="queryFormRef" + :inline="true" + label-width="68px" + > + <el-form-item label="标签名称" prop="name"> + <el-input + v-model="queryParams.name" + placeholder="请输入标签名称" + clearable + @keyup.enter="handleQuery" + class="!w-240px" + /> + </el-form-item> + <el-form-item label="创建时间" prop="createTime"> + <el-date-picker + v-model="queryParams.createTime" + value-format="YYYY-MM-DD HH:mm:ss" + type="daterange" + start-placeholder="开始日期" + end-placeholder="结束日期" + :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]" + 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" @click="openForm('create')" v-hasPermi="['member:tag:create']"> + <Icon icon="ep:plus" class="mr-5px" /> 新增 + </el-button> + <el-button + type="success" + plain + @click="handleExport" + :loading="exportLoading" + v-hasPermi="['member:tag:export']" + > + <Icon icon="ep:download" class="mr-5px" /> 导出 + </el-button> + </el-form-item> + </el-form> + </ContentWrap> + + <!-- 列表 --> + <ContentWrap> + <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true"> + <el-table-column label="序号" type="index" width="70px" /> + <el-table-column label="编号" align="center" prop="id" width="150px" /> + <el-table-column label="标签名称" align="center" prop="name" /> + <el-table-column + label="创建时间" + align="center" + prop="createTime" + :formatter="dateFormatter" + width="180px" + /> + <el-table-column label="操作" align="center" width="150px"> + <template #default="scope"> + <el-button + link + type="primary" + @click="openForm('update', scope.row.id)" + v-hasPermi="['member:tag:update']" + > + 编辑 + </el-button> + <el-button + link + type="danger" + @click="handleDelete(scope.row.id)" + v-hasPermi="['member:tag:delete']" + > + 删除 + </el-button> + </template> + </el-table-column> + </el-table> + <!-- 分页 --> + <Pagination + :total="total" + v-model:page="queryParams.pageNo" + v-model:limit="queryParams.pageSize" + @pagination="getList" + /> + </ContentWrap> + + <!-- 表单弹窗:添加/修改 --> + <TagForm ref="formRef" @success="getList" /> +</template> + +<script setup lang="ts" name="MemberTag"> +import { dateFormatter } from '@/utils/formatTime' +import download from '@/utils/download' +import * as TagApi from '@/api/member/tag' +import TagForm from './TagForm.vue' +const message = useMessage() // 消息弹窗 +const { t } = useI18n() // 国际化 + +const loading = ref(true) // 列表的加载中 +const total = ref(0) // 列表的总页数 +const list = ref([]) // 列表的数据 +const queryParams = reactive({ + pageNo: 1, + pageSize: 10, + name: null, + createTime: [] +}) +const queryFormRef = ref() // 搜索的表单 +const exportLoading = ref(false) // 导出的加载中 + +/** 查询列表 */ +const getList = async () => { + loading.value = true + try { + const data = await TagApi.getMemberTagPage(queryParams) + list.value = data.list + total.value = data.total + } 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) => { + formRef.value.open(type, id) +} + +/** 删除按钮操作 */ +const handleDelete = async (id: number) => { + try { + // 删除的二次确认 + await message.delConfirm() + // 发起删除 + await TagApi.deleteMemberTag(id) + message.success(t('common.delSuccess')) + // 刷新列表 + await getList() + } catch {} +} + +/** 导出按钮操作 */ +const handleExport = async () => { + try { + // 导出的二次确认 + await message.exportConfirm() + // 发起导出 + exportLoading.value = true + const data = await TagApi.exportMemberTag(queryParams) + download.excel(data, '会员标签.xls') + } catch { + } finally { + exportLoading.value = false + } +} + +/** 初始化 **/ +onMounted(() => { + getList() +}) +</script> From 2964d55435e3a1cced7ee1444e3531ae9c3c4167 Mon Sep 17 00:00:00 2001 From: owen <owen@evolsun.com> Date: Sat, 19 Aug 2023 20:19:55 +0800 Subject: [PATCH 07/12] =?UTF-8?q?=E4=BC=9A=E5=91=98=EF=BC=9A=201.=E4=BC=9A?= =?UTF-8?q?=E5=91=98=E8=AE=BE=E7=BD=AE=E6=A0=87=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/tag/components/MemberTagSelect.vue | 69 +++++++++++++++++++ src/views/member/user/UserForm.vue | 10 ++- src/views/member/user/index.vue | 17 ++++- 3 files changed, 93 insertions(+), 3 deletions(-) create mode 100644 src/views/member/tag/components/MemberTagSelect.vue diff --git a/src/views/member/tag/components/MemberTagSelect.vue b/src/views/member/tag/components/MemberTagSelect.vue new file mode 100644 index 00000000..ec4f4617 --- /dev/null +++ b/src/views/member/tag/components/MemberTagSelect.vue @@ -0,0 +1,69 @@ +<template> + <el-select v-model="tagIds" placeholder="请选择用户标签" clearable multiple class="!w-240px"> + <el-option v-for="tag in tags" :key="tag.id" :label="tag.name" :value="tag.id" /> + </el-select> + <el-button + v-if="showAdd" + type="primary" + class="ml-2" + link + @click="openForm('create')" + v-hasPermi="['member:tag:create']" + > + 新增标签 + </el-button> + + <!-- 表单弹窗:添加 --> + <TagForm ref="formRef" @success="getList" /> +</template> + +<script lang="ts" setup> +import * as TagApi from '@/api/member/tag' +import TagForm from '@/views/member/tag/TagForm.vue' + +defineOptions({ name: 'MemberTagSelect' }) + +const props = defineProps({ + /** 下拉框选中值 **/ + modelValue: { + type: Array, + default: undefined + }, + /** 是否显示“新增标签”按钮 **/ + showAdd: { + type: Boolean, + default: false + } +}) +const emit = defineEmits(['update:modelValue']) +defineExpose({ + showAdd: props.showAdd +}) + +const tagIds = computed({ + get() { + return props.modelValue + }, + set(value: any) { + emit('update:modelValue', value) + } +}) + +const tags = ref<TagApi.TagVO[]>([]) + +const getList = async () => { + const data = await TagApi.getMemberTagPage({}) + tags.value = data.list +} + +/** 添加用户标签表单弹框 */ +const formRef = ref() +const openForm = (type: string, id?: number) => { + formRef.value.open(type, id) +} + +/** 初始化 */ +onMounted(() => { + getList() +}) +</script> diff --git a/src/views/member/user/UserForm.vue b/src/views/member/user/UserForm.vue index a6d02582..c10d3fea 100644 --- a/src/views/member/user/UserForm.vue +++ b/src/views/member/user/UserForm.vue @@ -57,6 +57,9 @@ :render-after-expand="true" /> </el-form-item> + <el-form-item label="用户标签" prop="tagIds"> + <MemberTagSelect v-model="formData.tagIds" show-add /> + </el-form-item> <el-form-item label="会员备注" prop="mark"> <el-input type="textarea" v-model="formData.mark" placeholder="请输入会员备注" /> </el-form-item> @@ -72,6 +75,7 @@ import { DICT_TYPE, getIntDictOptions } from '@/utils/dict' import * as UserApi from '@/api/member/user' import * as AreaApi from '@/api/system/area' import { defaultProps } from '@/utils/tree' +import MemberTagSelect from '@/views/member/tag/components/MemberTagSelect.vue' const { t } = useI18n() // 国际化 const message = useMessage() // 消息弹窗 @@ -90,7 +94,8 @@ const formData = ref({ sex: undefined, areaId: undefined, birthday: undefined, - mark: undefined + mark: undefined, + tagIds: [] }) const formRules = reactive({ mobile: [{ required: true, message: '手机号不能为空', trigger: 'blur' }], @@ -163,7 +168,8 @@ const resetForm = () => { areaId: undefined, birthday: undefined, mark: undefined, - createTime: undefined + createTime: undefined, + tagIds: [] } formRef.value?.resetFields() } diff --git a/src/views/member/user/index.vue b/src/views/member/user/index.vue index 925eca04..0389de37 100644 --- a/src/views/member/user/index.vue +++ b/src/views/member/user/index.vue @@ -48,6 +48,9 @@ class="!w-240px" /> </el-form-item> + <el-form-item label="用户标签" prop="tagIds"> + <MemberTagSelect v-model="queryParams.tagIds" /> + </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> @@ -69,6 +72,16 @@ <!-- TODO 芋艿:待接入 --> <el-table-column label="等级" align="center" width="100px" /> <el-table-column label="分组" align="center" width="100px" /> + <el-table-column + label="用户标签" + align="center" + prop="tagNames" + :show-overflow-tooltip="false" + > + <template #default="scope"> + <el-tag v-for="(tagName, index) in scope.row.tagNames" :key="index">{{ tagName }}</el-tag> + </template> + </el-table-column> <el-table-column label="积分" align="center" width="100px" /> <el-table-column label="状态" align="center" prop="status" width="100px"> <template #default="scope"> @@ -119,6 +132,7 @@ import { dateFormatter } from '@/utils/formatTime' import * as UserApi from '@/api/member/user' import UserForm from './UserForm.vue' import { DICT_TYPE } from '@/utils/dict' +import MemberTagSelect from '@/views/member/tag/components/MemberTagSelect.vue' defineOptions({ name: 'MemberUser' }) @@ -134,7 +148,8 @@ const queryParams = reactive({ nickname: null, mobile: null, loginDate: [], - createTime: [] + createTime: [], + tagIds: [] }) const queryFormRef = ref() // 搜索的表单 const exportLoading = ref(false) // 导出的加载中 From 76a63e01c99a537d3e459e3e09a721bfb0784bc7 Mon Sep 17 00:00:00 2001 From: YunaiV <zhijiantianya@gmail.com> Date: Sun, 20 Aug 2023 10:14:36 +0800 Subject: [PATCH 08/12] =?UTF-8?q?code=20review=EF=BC=9A=E4=BC=9A=E5=91=98?= =?UTF-8?q?=E7=AD=BE=E5=88=B0=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/member/tag/index.ts | 5 ----- src/views/member/point/config/index.vue | 22 ++++++++++++--------- src/views/member/tag/index.vue | 26 ------------------------- 3 files changed, 13 insertions(+), 40 deletions(-) diff --git a/src/api/member/tag/index.ts b/src/api/member/tag/index.ts index a844dbe3..04d0536c 100644 --- a/src/api/member/tag/index.ts +++ b/src/api/member/tag/index.ts @@ -29,8 +29,3 @@ export const updateMemberTag = async (data: TagVO) => { export const deleteMemberTag = async (id: number) => { return await request.delete({ url: `/member/tag/delete?id=` + id }) } - -// 导出会员标签 Excel -export const exportMemberTag = async (params) => { - return await request.download({ url: `/member/tag/export-excel`, params }) -} diff --git a/src/views/member/point/config/index.vue b/src/views/member/point/config/index.vue index c69013eb..27820c24 100644 --- a/src/views/member/point/config/index.vue +++ b/src/views/member/point/config/index.vue @@ -25,8 +25,8 @@ /> </el-form-item> <el-form-item> - <el-text class="mx-1" size="small" type="info" - >积分抵用比例(1积分抵多少金额)单位:元 + <el-text class="mx-1" size="small" type="info"> + 积分抵用比例(1 积分抵多少金额),单位:元 </el-text> </el-form-item> <el-form-item label="积分抵扣最大值" prop="tradeDeductMaxPrice" class="item-bottom"> @@ -37,7 +37,7 @@ /> </el-form-item> <el-form-item> - <el-text class="mx-1" size="small" type="info">单次下单积分使用上限,0不限制</el-text> + <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 @@ -47,9 +47,9 @@ /> </el-form-item> <el-form-item> - <el-text class="mx-1" size="small" type="info" - >下单支付金额按比例赠送积分(实际支付1元赠送多少积分)</el-text - > + <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> @@ -60,18 +60,20 @@ <script lang="ts" setup> import * as ConfigApi from '@/api/point/config' +defineOptions({ name: 'MemberPointConfig' }) + const { t } = useI18n() // 国际化 const message = useMessage() // 消息弹窗 const dialogVisible = ref(false) // 弹窗的是否展示 const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用 const formData = ref({ - id: undefined, tradeDeductEnable: true, tradeDeductUnitPrice: 0, tradeDeductMaxPrice: 0, tradeGivePoint: 0 }) + // 创建一个计算属性,用于将 tradeDeductUnitPrice 显示为带两位小数的形式 const computedTradeDeductUnitPrice = computed({ get: () => (formData.value.tradeDeductUnitPrice / 100).toFixed(2), @@ -105,7 +107,9 @@ const onSubmit = async () => { const getConfig = async () => { try { const data = await ConfigApi.getConfig() - if (data === null) return + if (data === null) { + return + } formData.value = data } finally { } @@ -118,6 +122,6 @@ onMounted(() => { <style scoped> .item-bottom { - margin-bottom: 0px; + margin-bottom: 0; } </style> diff --git a/src/views/member/tag/index.vue b/src/views/member/tag/index.vue index 49633edf..05a886a7 100644 --- a/src/views/member/tag/index.vue +++ b/src/views/member/tag/index.vue @@ -34,15 +34,6 @@ <el-button type="primary" @click="openForm('create')" v-hasPermi="['member:tag:create']"> <Icon icon="ep:plus" class="mr-5px" /> 新增 </el-button> - <el-button - type="success" - plain - @click="handleExport" - :loading="exportLoading" - v-hasPermi="['member:tag:export']" - > - <Icon icon="ep:download" class="mr-5px" /> 导出 - </el-button> </el-form-item> </el-form> </ContentWrap> @@ -50,7 +41,6 @@ <!-- 列表 --> <ContentWrap> <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true"> - <el-table-column label="序号" type="index" width="70px" /> <el-table-column label="编号" align="center" prop="id" width="150px" /> <el-table-column label="标签名称" align="center" prop="name" /> <el-table-column @@ -112,7 +102,6 @@ const queryParams = reactive({ createTime: [] }) const queryFormRef = ref() // 搜索的表单 -const exportLoading = ref(false) // 导出的加载中 /** 查询列表 */ const getList = async () => { @@ -157,21 +146,6 @@ const handleDelete = async (id: number) => { } catch {} } -/** 导出按钮操作 */ -const handleExport = async () => { - try { - // 导出的二次确认 - await message.exportConfirm() - // 发起导出 - exportLoading.value = true - const data = await TagApi.exportMemberTag(queryParams) - download.excel(data, '会员标签.xls') - } catch { - } finally { - exportLoading.value = false - } -} - /** 初始化 **/ onMounted(() => { getList() From 4bc3f15571d7d5d5646e510744a444964ea767b5 Mon Sep 17 00:00:00 2001 From: YunaiV <zhijiantianya@gmail.com> Date: Sun, 20 Aug 2023 19:06:46 +0800 Subject: [PATCH 09/12] =?UTF-8?q?code=20review=EF=BC=9A=E7=A7=AF=E5=88=86?= =?UTF-8?q?=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/dict.ts | 1 - src/views/member/point/record/index.vue | 44 +++++-------------------- 2 files changed, 8 insertions(+), 37 deletions(-) diff --git a/src/utils/dict.ts b/src/utils/dict.ts index 6ca48716..52045c9a 100644 --- a/src/utils/dict.ts +++ b/src/utils/dict.ts @@ -142,7 +142,6 @@ export enum DICT_TYPE { // ========== MALL - 会员模块 ========== MEMBER_POINT_BIZ_TYPE = 'member_point_biz_type', // 积分的业务类型 - MEMBER_POINT_STATUS = 'member_point_status', // 积分的状态 // ========== MALL - 商品模块 ========== PRODUCT_UNIT = 'product_unit', // 商品单位 diff --git a/src/views/member/point/record/index.vue b/src/views/member/point/record/index.vue index f1e74bfa..20b81bd9 100644 --- a/src/views/member/point/record/index.vue +++ b/src/views/member/point/record/index.vue @@ -41,16 +41,6 @@ class="!w-240px" /> </el-form-item> - <el-form-item label="积分状态" prop="status"> - <el-select v-model="queryParams.status" placeholder="请选择状态" clearable class="!w-240px"> - <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="获得时间" prop="createDate"> <el-date-picker v-model="queryParams.createDate" @@ -78,48 +68,32 @@ <!-- 列表 --> <ContentWrap> <el-table v-loading="loading" :data="list"> - <el-table-column label="编号" align="center" prop="id" /> - <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="id" width="180" /> <el-table-column label="获得时间" align="center" prop="createTime" :formatter="dateFormatter" + width="180" /> - <el-table-column label="积分" align="center" prop="point"> + <el-table-column label="用户" align="center" prop="nickname" width="200" /> + <el-table-column label="变动积分" align="center" prop="point" width="100"> <template #default="scope"> <el-tag v-if="scope.row.point > 0" class="ml-2" type="success" effect="dark"> - {{ scope.row.point }} + +{{ 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="totalPoint" width="100" /> + <el-table-column label="标题" align="center" prop="title" /> + <el-table-column label="描述" align="center" prop="description" /> <el-table-column label="业务编码" align="center" prop="bizId" /> <el-table-column label="业务类型" align="center" prop="bizType"> <template #default="scope"> <dict-tag :type="DICT_TYPE.MEMBER_POINT_BIZ_TYPE" :value="scope.row.bizType" /> </template> </el-table-column> - <el-table-column label="状态" align="center" prop="status"> - <template #default="scope"> - <dict-tag :type="DICT_TYPE.MEMBER_POINT_STATUS" :value="scope.row.status" /> - </template> - </el-table-column> - <el-table-column - label="冻结时间" - align="center" - prop="freezingTime" - :formatter="dateFormatter" - /> - <el-table-column - label="解冻时间" - align="center" - prop="thawingTime" - :formatter="dateFormatter" - /> </el-table> <!-- 分页 --> <Pagination @@ -149,9 +123,7 @@ const queryParams = reactive({ pageSize: 10, nickname: null, bizType: null, - type: null, title: null, - status: null, createDate: [] }) const queryFormRef = ref() // 搜索的表单 From 82628ce78083d04edc7c9521f61bdb4d7abfbfbe Mon Sep 17 00:00:00 2001 From: YunaiV <zhijiantianya@gmail.com> Date: Sun, 20 Aug 2023 19:26:50 +0800 Subject: [PATCH 10/12] =?UTF-8?q?code=20review=EF=BC=9A=E7=AD=BE=E5=88=B0?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/{ => member}/point/config/index.ts | 0 src/api/{ => member}/point/record/index.ts | 0 .../signin/config}/index.ts | 2 +- .../signin/record}/index.ts | 0 src/views/member/point/config/index.vue | 2 +- src/views/member/point/record/index.vue | 6 ++--- .../member/signin/config/SignInConfigForm.vue | 22 ++++++++++++--- src/views/member/signin/config/index.vue | 27 ++++--------------- 8 files changed, 28 insertions(+), 31 deletions(-) rename src/api/{ => member}/point/config/index.ts (100%) rename src/api/{ => member}/point/record/index.ts (100%) rename src/api/{point/signInConfig => member/signin/config}/index.ts (95%) rename src/api/{point/signInRecord => member/signin/record}/index.ts (100%) diff --git a/src/api/point/config/index.ts b/src/api/member/point/config/index.ts similarity index 100% rename from src/api/point/config/index.ts rename to src/api/member/point/config/index.ts diff --git a/src/api/point/record/index.ts b/src/api/member/point/record/index.ts similarity index 100% rename from src/api/point/record/index.ts rename to src/api/member/point/record/index.ts diff --git a/src/api/point/signInConfig/index.ts b/src/api/member/signin/config/index.ts similarity index 95% rename from src/api/point/signInConfig/index.ts rename to src/api/member/signin/config/index.ts index 246270ec..833c2e16 100644 --- a/src/api/point/signInConfig/index.ts +++ b/src/api/member/signin/config/index.ts @@ -8,7 +8,7 @@ export interface SignInConfigVO { } // 查询积分签到规则列表 -export const getSignInConfigPage = async () => { +export const getSignInConfigList = async () => { return await request.get({ url: `/member/point/sign-in-config/list` }) } diff --git a/src/api/point/signInRecord/index.ts b/src/api/member/signin/record/index.ts similarity index 100% rename from src/api/point/signInRecord/index.ts rename to src/api/member/signin/record/index.ts diff --git a/src/views/member/point/config/index.vue b/src/views/member/point/config/index.vue index 27820c24..27c52085 100644 --- a/src/views/member/point/config/index.vue +++ b/src/views/member/point/config/index.vue @@ -58,7 +58,7 @@ </ContentWrap> </template> <script lang="ts" setup> -import * as ConfigApi from '@/api/point/config' +import * as ConfigApi from '@/api/member/point/config' defineOptions({ name: 'MemberPointConfig' }) diff --git a/src/views/member/point/record/index.vue b/src/views/member/point/record/index.vue index 20b81bd9..5e2be1db 100644 --- a/src/views/member/point/record/index.vue +++ b/src/views/member/point/record/index.vue @@ -25,7 +25,7 @@ class="!w-240px" > <el-option - v-for="dict in getStrDictOptions(DICT_TYPE.MEMBER_POINT_BIZ_TYPE)" + v-for="dict in getIntDictOptions(DICT_TYPE.MEMBER_POINT_BIZ_TYPE)" :key="dict.value" :label="dict.label" :value="dict.value" @@ -109,9 +109,9 @@ </template> <script lang="ts" setup> -import { DICT_TYPE, getStrDictOptions, getIntDictOptions } from '@/utils/dict' +import { DICT_TYPE, getIntDictOptions } from '@/utils/dict' import { dateFormatter } from '@/utils/formatTime' -import * as RecordApi from '@/api/point/record' +import * as RecordApi from '@/api//member/point/record' defineOptions({ name: 'PointRecord' }) diff --git a/src/views/member/signin/config/SignInConfigForm.vue b/src/views/member/signin/config/SignInConfigForm.vue index 3c272c80..4d5c3d2d 100644 --- a/src/views/member/signin/config/SignInConfigForm.vue +++ b/src/views/member/signin/config/SignInConfigForm.vue @@ -10,12 +10,23 @@ <el-form-item label="签到天数" prop="day"> <el-input-number v-model="formData.day" :min="1" :max="7" :precision="0" /> <el-text class="mx-1" style="margin-left: 10px" type="danger"> - 只允许设置1-7,默认签到7天为一个周期</el-text - > + 只允许设置 1-7,默认签到 7 天为一个周期 + </el-text> </el-form-item> <el-form-item label="签到分数" prop="point"> <el-input-number v-model="formData.point" :precision="0" /> </el-form-item> + <el-form-item label="开启状态" prop="status"> + <el-radio-group v-model="formData.status"> + <el-radio + v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)" + :key="dict.value" + :label="dict.value" + > + {{ dict.label }} + </el-radio> + </el-radio-group> + </el-form-item> </el-form> <template #footer> <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button> @@ -24,7 +35,9 @@ </Dialog> </template> <script lang="ts" setup> -import * as SignInConfigApi from '@/api/point/signInConfig' +import * as SignInConfigApi from '@/api/member/signin/config' +import { CommonStatusEnum } from '@/utils/constants' +import { DICT_TYPE, getIntDictOptions } from '@/utils/dict' const { t } = useI18n() // 国际化 const message = useMessage() // 消息弹窗 @@ -92,7 +105,8 @@ const resetForm = () => { formData.value = { id: undefined, day: undefined, - point: undefined + point: undefined, + status: CommonStatusEnum.ENABLE } formRef.value?.resetFields() } diff --git a/src/views/member/signin/config/index.vue b/src/views/member/signin/config/index.vue index 99e22589..71dc4c6f 100644 --- a/src/views/member/signin/config/index.vue +++ b/src/views/member/signin/config/index.vue @@ -21,17 +21,9 @@ :formatter="(_, __, cellValue) => ['第', cellValue, '天'].join(' ')" /> <el-table-column label="获得积分" align="center" prop="point" /> - <el-table-column label="是否开启" align="center"> + <el-table-column label="状态" align="center" prop="status"> <template #default="scope"> - <div> - <el-switch - v-model="scope.row.enable" - @change="handleSwitchChange(scope.row, $event)" - inline-prompt - active-text="开启" - inactive-text="关闭" - /> - </div> + <dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" /> </template> </el-table-column> <el-table-column label="操作" align="center"> @@ -60,11 +52,10 @@ <!-- 表单弹窗:添加/修改 --> <SignInConfigForm ref="formRef" @success="getList" /> </template> - <script lang="ts" setup> -import * as SignInConfigApi from '@/api/point/signInConfig' +import * as SignInConfigApi from '@/api/member/signin/config' import SignInConfigForm from './SignInConfigForm.vue' -import { SignInConfigVO } from '@/api/point/signInConfig' +import { DICT_TYPE } from '@/utils/dict' defineOptions({ name: 'SignInConfig' }) @@ -78,7 +69,7 @@ const list = ref([]) // 列表的数据 const getList = async () => { loading.value = true try { - const data = await SignInConfigApi.getSignInConfigPage() + const data = await SignInConfigApi.getSignInConfigList() console.log(data) list.value = data } finally { @@ -105,14 +96,6 @@ const handleDelete = async (id: number) => { } catch {} } -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) -} - /** 初始化 **/ onMounted(() => { getList() From be485cc4aba71df1127557eaa5187a2099a55692 Mon Sep 17 00:00:00 2001 From: YunaiV <zhijiantianya@gmail.com> Date: Sun, 20 Aug 2023 19:34:39 +0800 Subject: [PATCH 11/12] =?UTF-8?q?code=20review=EF=BC=9A=E7=AD=BE=E5=88=B0?= =?UTF-8?q?=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/member/signin/record/index.ts | 5 --- src/views/member/point/record/index.vue | 2 +- src/views/member/signin/record/index.vue | 40 ++++++------------------ 3 files changed, 10 insertions(+), 37 deletions(-) diff --git a/src/api/member/signin/record/index.ts b/src/api/member/signin/record/index.ts index 909449f6..94df2029 100644 --- a/src/api/member/signin/record/index.ts +++ b/src/api/member/signin/record/index.ts @@ -11,8 +11,3 @@ export interface SignInRecordVO { export const getSignInRecordPage = async (params) => { return await request.get({ url: `/member/point/sign-in-record/page`, params }) } - -// 导出用户签到积分 Excel -export const exportSignInRecord = async (params) => { - return await request.download({ url: `/member/point/sign-in-record/export-excel`, params }) -} diff --git a/src/views/member/point/record/index.vue b/src/views/member/point/record/index.vue index 5e2be1db..a21cd85c 100644 --- a/src/views/member/point/record/index.vue +++ b/src/views/member/point/record/index.vue @@ -77,7 +77,7 @@ width="180" /> <el-table-column label="用户" align="center" prop="nickname" width="200" /> - <el-table-column label="变动积分" align="center" prop="point" width="100"> + <el-table-column label="获得积分" align="center" prop="point" width="100"> <template #default="scope"> <el-tag v-if="scope.row.point > 0" class="ml-2" type="success" effect="dark"> +{{ scope.row.point }} diff --git a/src/views/member/signin/record/index.vue b/src/views/member/signin/record/index.vue index f7dd26c6..754663e5 100644 --- a/src/views/member/signin/record/index.vue +++ b/src/views/member/signin/record/index.vue @@ -40,15 +40,6 @@ <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="success" - plain - @click="handleExport" - :loading="exportLoading" - v-hasPermi="['point:sign-in-record:export']" - > - <Icon icon="ep:download" class="mr-5px" /> 导出 - </el-button> </el-form-item> </el-form> </ContentWrap> @@ -57,7 +48,6 @@ <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="nickname" /> <el-table-column label="签到天数" @@ -65,7 +55,14 @@ prop="day" :formatter="(_, __, cellValue) => ['第', cellValue, '天'].join(' ')" /> - <el-table-column label="获得积分" align="center" prop="point" /> + <el-table-column label="获得积分" align="center" prop="point" width="100"> + <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" @@ -81,15 +78,11 @@ @pagination="getList" /> </ContentWrap> - - <!-- 表单弹窗:添加/修改 --> - <SignInRecordForm ref="formRef" @success="getList" /> </template> <script lang="ts" setup> import { dateFormatter } from '@/utils/formatTime' -import download from '@/utils/download' -import * as SignInRecordApi from '@/api/point/signInRecord' +import * as SignInRecordApi from '@/api/member/signin/record' defineOptions({ name: 'SignInRecord' }) @@ -132,21 +125,6 @@ const resetQuery = () => { handleQuery() } -/** 导出按钮操作 */ -const handleExport = async () => { - try { - // 导出的二次确认 - await message.exportConfirm() - // 发起导出 - exportLoading.value = true - const data = await SignInRecordApi.exportSignInRecord(queryParams) - download.excel(data, '用户签到积分.xls') - } catch { - } finally { - exportLoading.value = false - } -} - /** 初始化 **/ onMounted(() => { getList() From 1db98698bd680ceeb72faf316c31a5e30d98205f Mon Sep 17 00:00:00 2001 From: YunaiV <zhijiantianya@gmail.com> Date: Mon, 21 Aug 2023 10:34:10 +0800 Subject: [PATCH 12/12] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=95=86=E5=93=81?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=E7=9A=84=E7=BC=96=E8=BE=91=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/mall/product/property/index.vue | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/views/mall/product/property/index.vue b/src/views/mall/product/property/index.vue index 00597dc3..dc79450b 100644 --- a/src/views/mall/product/property/index.vue +++ b/src/views/mall/product/property/index.vue @@ -73,9 +73,7 @@ > 编辑 </el-button> - <el-button link type="primary"> - <router-link :to="'/property/value/' + scope.row.id">属性值</router-link> - </el-button> + <el-button link type="primary" @click="goValueList(scope.row.id)">属性值</el-button> <el-button v-hasPermi="['product:property:delete']" link @@ -103,6 +101,7 @@ import { dateFormatter } from '@/utils/formatTime' import * as PropertyApi from '@/api/mall/product/property' import PropertyForm from './PropertyForm.vue' +const { push } = useRouter() defineOptions({ name: 'ProductProperty' }) @@ -163,6 +162,11 @@ const handleDelete = async (id: number) => { } catch {} } +/** 跳转商品属性列表 */ +const goValueList = (id: number) => { + push({ path: '/property/value/' + id }) +} + /** 初始化 **/ onMounted(() => { getList()