后端
ActivityController.java
@Resource private IChannelService iChannelService; /** * 获取渠道列表 * * @return 渠道列表 */ @PreAuthorize("hasPermission('tienchin:activity:create')") @GetMapping("/channel/list") AjaxResult channelList() { return AjaxResult.success(iChannelService.selectChannelList(new ChannelVO())); }
前端
activity.js
/** * 查询渠道列表 * @returns {*} 查询结果 */ export function listChannel() { return request({ url: '/tienchin/activity/channel/list', method: 'get' }) }
index.vue
直接将原有的 index.vue 的全部内容替换成下面的,这里先替换,我只是补齐文档,后面新模块开发我会一步一步进行记录起来:
<template> <div class="app-container"> <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px"> <el-form-item label="活动名称" prop="activityName"> <el-input v-model="queryParams.activityName" placeholder="请输入活动名称" clearable @keyup.enter="handleQuery" /> </el-form-item> <el-form-item label="渠道名称" prop="channelId"> <el-select v-model="queryParams.channelId" placeholder="请选择渠道名称" clearable > <el-option v-for="channel in channelList" :key="channel.channelId" :label="channel.channelName" :value="channel.channelId" /> </el-select> </el-form-item> <el-form-item label="活动状态" prop="activityStatus"> <el-select v-model="queryParams.activityStatus" placeholder="请选择活动状态" clearable > <el-option v-for="dict in activity_status" :key="dict.value" :label="dict.label" :value="dict.value" /> </el-select> </el-form-item> <el-form-item label="活动类型" prop="activityType"> <el-select v-model="queryParams.activityType" placeholder="请选择活动类型" clearable > <el-option v-for="dict in activity_type" :key="dict.value" :label="dict.label" :value="dict.value" /> </el-select> </el-form-item> <el-form-item> <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> <el-button icon="Refresh" @click="resetQuery">重置</el-button> </el-form-item> </el-form> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['tienchin:activity:create']" >新增 </el-button> </el-col> <el-col :span="1.5"> <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate" v-hasPermi="['tienchin:activity:edit']" >修改 </el-button> </el-col> <el-col :span="1.5"> <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete" v-hasPermi="['tienchin:activity:remove']" >删除 </el-button> </el-col> <el-col :span="1.5"> <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['tienchin:activity:export']" >导出 </el-button> </el-col> <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> </el-row> <el-table v-loading="loading" :data="activityList" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55" align="center"/> <el-table-column label="活动编号" align="center" prop="activityId"/> <el-table-column label="活动名称" align="center" prop="activityName"/> <el-table-column label="渠道名称" align="center" prop="channelName"/> <el-table-column label="活动简介" :show-overflow-tooltip="true" align="center" prop="activityInfo"/> <el-table-column label="活动类型" align="center"> <template #default="scope"> <dict-tag :options="activity_type" :value="scope.row.activityType"/> </template> </el-table-column> <el-table-column label="活动明细" align="center"> <template #default="scope"> <div v-if="scope.row.activityType === 1"> 折扣券/{{ scope.row.discount }}折 </div> <div v-else> 代金券/{{ scope.row.voucher }}元 </div> </template> </el-table-column> <el-table-column label="活动状态" align="center"> <template #default="scope"> <dict-tag :options="activity_status" :value="scope.row.activityStatus"/> </template> </el-table-column> <el-table-column label="活动起始时间" align="center" prop="beginTime" width="180"> <template #default="scope"> <span>{{ parseTime(scope.row.beginTime) }}</span> </template> </el-table-column> <el-table-column label="活动结束时间" align="center" prop="endTime" width="180"> <template #default="scope"> <span>{{ parseTime(scope.row.endTime) }}</span> </template> </el-table-column> <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="150"> <template #default="scope"> <el-button type="text" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['tienchin:activity:edit']" >修改 </el-button> <el-button type="text" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['tienchin:activity:remove']" >删除 </el-button> </template> </el-table-column> </el-table> <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> <!-- 添加或修改活动对话框 --> <el-dialog :title="title" v-model="open" width="500px" append-to-body> <el-form ref="activityRef" :model="form" :rules="rules" label-width="80px"> <el-row> <el-col :span="12"> <el-form-item label="渠道来源" prop="channelId"> <el-select v-model="form.channelId" placeholder="请选择渠道来源" clearable style="width: 240px;" > <el-option v-for="channel in channelList" :key="channel.channelId" :label="channel.channelName" :value="channel.channelId" /> </el-select> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="活动名称" prop="activityName"> <el-input v-model="form.activityName" placeholder="请输入活动名称"/> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="24"> <el-form-item label="活动时间" style="width: 100%;" prop="activityTime"> <el-date-picker style="width: 100%;" v-model="form.activityTime" format="YYYY-MM-DD HH:mm:ss" type="datetimerange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" /> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="12"> <el-form-item label="活动简介" prop="activityInfo"> <el-input v-model="form.activityInfo" placeholder="请输入活动简介"/> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="活动类型" prop="activityType"> <el-select v-model="form.activityType" placeholder="请选择活动类型" clearable style="width: 240px;" > <el-option v-for="dict in activity_type" :key="dict.value" :label="dict.label" :value="parseInt(dict.value)" /> </el-select> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="15"> <el-form-item label="折扣券" prop="discount" v-if="parseInt(form.activityType) === 1"> <el-input-number v-model="form.discount" placeholder="请输入折扣值" :precision="2" :step="0.1" :max="10" :min="0" style="width: 100%;" /> </el-form-item> <el-form-item label="代金券" prop="voucher" v-if="parseInt(form.activityType) === 2"> <el-input-number v-model="form.voucher" placeholder="请输入代金券面值" :precision="2" :step="100" :min="0" style="width: 100%;" /> </el-form-item> </el-col> </el-row> <el-form-item label="备注" prop="remark"> <el-input v-model="form.remark" type="textarea" placeholder="请输入内容"/> </el-form-item> </el-form> <template #footer> <div class="dialog-footer"> <el-button type="primary" @click="submitForm">确 定</el-button> <el-button @click="cancel">取 消</el-button> </div> </template> </el-dialog> </div> </template> <script setup name="Activity"> import { addActivity, listActivity, listChannel, getInfo, updateActivity, delActivity } from "@/api/tienchin/activity"; const {proxy} = getCurrentInstance(); const { sys_normal_disable, activity_type, activity_status } = proxy.useDict("sys_normal_disable", 'activity_type', 'activity_status'); const activityList = ref([]); const channelList = ref([]); const open = ref(false); const loading = ref(true); const showSearch = ref(true); const ids = ref([]); const single = ref(true); const multiple = ref(true); const total = ref(0); const title = ref(""); const data = reactive({ form: {}, queryParams: { pageNum: 1, pageSize: 10, activityName: undefined, channelId: undefined, activityStatus: undefined, activityType: undefined }, rules: { channelId: [{required: true, message: "渠道来源不能为空", trigger: "blur"}], activityName: [{required: true, message: "活动名称不能为空", trigger: "blur"}], activityTime: [{required: true, message: "活动时间不能为空", trigger: "blur"}], activityInfo: [{required: true, message: "活动简介不能为空", trigger: "blur"}], activityType: [{required: true, message: "活动类型不能为空", trigger: "blur"}], discount: [{required: true, message: "折扣值不能为空", trigger: "blur"}], voucher: [{required: true, message: "代金券面值不能为空", trigger: "blur"}] } }); const {queryParams, form, rules} = toRefs(data); /** 查询活动列表 */ function getList() { loading.value = true; listActivity(queryParams.value).then(response => { activityList.value = response.rows; total.value = response.total; loading.value = false; }); } /** 取消按钮 */ function cancel() { open.value = false; reset(); } /** 表单重置 */ function reset() { form.value = { channelId: undefined, activityName: undefined, activityTime: undefined, activityInfo: undefined, activityType: undefined, discount: undefined, voucher: undefined, remark: undefined }; proxy.resetForm("activityRef"); } /** 搜索按钮操作 */ function handleQuery() { queryParams.value.pageNum = 1; getList(); } /** 重置按钮操作 */ function resetQuery() { proxy.resetForm("queryRef"); handleQuery(); } /** 多选框选中数据 */ function handleSelectionChange(selection) { ids.value = selection.map(item => item.activityId); single.value = selection.length !== 1; multiple.value = !selection.length; } /** 新增按钮操作 */ function handleAdd() { reset(); // handelChannelList(); open.value = true; title.value = "添加活动"; } /** 修改按钮操作 */ function handleUpdate(row) { reset(); // 加载渠道列表 // handelChannelList(); const activityId = row.activityId || ids.value; getInfo(activityId).then(response => { form.value = response.data; form.value.activityTime = [form.value.beginTime, form.value.endTime]; open.value = true; title.value = "修改活动"; }); } /** 提交按钮 */ function submitForm() { proxy.$refs["activityRef"].validate(valid => { if (valid) { if (form.value.activityId !== undefined) { form.value.beginTime = formatDate(form.value.activityTime[0]); form.value.endTime = formatDate(form.value.activityTime[1]); // 删除掉,form 中的 updateTime 字段 // 删除掉,form 中的 createTime 字段 delete form.value.updateTime; delete form.value.createTime; updateActivity(form.value).then(response => { proxy.$modal.msgSuccess("修改成功"); open.value = false; getList(); }); } else { form.value.beginTime = formatDate(form.value.activityTime[0]); form.value.endTime = formatDate(form.value.activityTime[1]); addActivity(form.value).then(response => { proxy.$modal.msgSuccess("新增成功"); open.value = false; getList(); }); } } }); } /** 删除按钮操作 */ function handleDelete(row) { const activityIds = row.activityId || ids.value; proxy.$modal.confirm('是否确认删除活动编号为"' + activityIds + '"的数据项?').then(function () { return delActivity(activityIds); }).then(() => { getList(); proxy.$modal.msgSuccess("删除成功"); }).catch(() => { }); } /** 导出按钮操作 */ function handleExport() { proxy.download("tienchin/activity/export", { ...queryParams.value }, `activity_${new Date().getTime()}.xlsx`); } /** * 获取渠道列表 */ function handelChannelList() { listChannel().then(response => { channelList.value = response.data; }); } function formatDate(isoDateString) { // 创建一个新的日期对象 var date = new Date(isoDateString); // 提取年、月、日、小时、分钟和秒 var year = date.getFullYear(); var month = (date.getMonth() + 1).toString().padStart(2, "0"); var day = date.getDate().toString().padStart(2, "0"); var hours = date.getHours().toString().padStart(2, "0"); var minutes = date.getMinutes().toString().padStart(2, "0"); var seconds = date.getSeconds().toString().padStart(2, "0"); // 构建格式化后的日期时间字符串 var formattedDate = year + "-" + month + "-" + day + " " + hours + ":" + minutes + ":" + seconds; // 返回格式化后的日期时间字符串 return formattedDate; } handelChannelList(); getList(); </script>