TienChin 活动管理-活动列表展示

简介: TienChin 活动管理-活动列表展示

后端

ActivityVO

/**
 * @author BNTang
 * @version 1.0
 * @description 活动管理VO
 * @since 2023-23-05
 **/
public class ActivityVO extends BaseEntity {
    /**
     * 活动ID
     */
    private Integer activityId;
    /**
     * 活动名称
     */
    private String activityName;
    /**
     * 渠道ID
     */
    private Integer channelId;
    /**
     * 渠道名称
     */
    private String channelName;
    /**
     * 活动简介
     */
    private String activityInfo;
    /**
     * 活动类型,1.折扣券、2.代金券
     */
    private Integer activityType;
    /**
     * 活动状态,0.表示禁用、1.表示正常
     */
    private Integer activityStatus;
    /**
     * 折扣券
     */
    private Double discount;
    /**
     * 代金券
     */
    private Double voucher;
    /**
     * 活动开始时间
     */
    private LocalDateTime beginTime;
    /**
     * 活动结束时间
     */
    private LocalDateTime endTime;
    /**
     * 删除标志(0代表存在 2代表删除)
     */
    private String delFlag;
    // Get Set 方法略
}

更改 Activity 折扣券,代金券的数据类型:

/**
 * 折扣券
 */
private Double discount;
/**
 * 代金券
 */
private Double voucher;

ActivityController

/**
 * <p>
 * 活动管理表 前端控制器
 * </p>
 *
 * @author BNTang
 * @since 2023-09-05
 */
@RestController
@RequestMapping("/tienchin/activity")
public class ActivityController extends BaseController {
    @Resource
    private IActivityService iActivityService;
    @PreAuthorize("hasPermission('tienchin:activity:list')")
    @GetMapping("/list")
    TableDataInfo list() {
        startPage();
        List<ActivityVO> activityList = iActivityService.selectActivityList();
        return getDataTable(activityList);
    }
}

插入测试数据

INSERT INTO tienchin_activity (activity_id, activity_name, channel_id, activity_info, activity_type, activity_status, discount, voucher, begin_time, end_time, remark, create_by, update_by, create_time, update_time, del_flag) VALUES (1, 'aaa', 7, '小红书推广', 1, 1, 8, null, '2023-09-05 23:53:09', '2023-11-05 23:53:17', null, null, null, null, '2023-09-05 23:53:22', '0');

IActivityService

/**
 * <p>
 * 活动管理表 服务类
 * </p>
 *
 * @author BNTang
 * @since 2023-09-05
 */
public interface IActivityService extends IService<Activity> {
    /**
     * 查询活动列表
     *
     * @return 活动列表
     */
    List<ActivityVO> selectActivityList();
}

ActivityServiceImpl

/**
 * <p>
 * 活动管理表 服务实现类
 * </p>
 *
 * @author BNTang
 * @since 2023-09-05
 */
@Service
public class ActivityServiceImpl
        extends ServiceImpl<ActivityMapper, Activity>
        implements IActivityService {
    @Resource
    private ActivityMapper activityMapper;
    @Override
    public List<ActivityVO> selectActivityList() {
        return activityMapper.selectActivityList();
    }

ActivityMapper

/**
 * <p>
 * 活动管理表 Mapper 接口
 * </p>
 *
 * @author BNTang
 * @since 2023-09-05
 */
public interface ActivityMapper extends BaseMapper<Activity> {
    /**
     * 查询活动列表
     *
     * @return 活动列表
     */
    List<ActivityVO> selectActivityList();
}

ActivityMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="top.it6666.activity.mapper.ActivityMapper">
    <select id="selectActivityList" resultType="top.it6666.activity.entity.vo.ActivityVO">
        SELECT ta.*, tc.channel_name
        FROM tienchin_activity ta,
             tienchin_channel tc
        WHERE ta.channel_id = tc.channel_id
          AND ta.del_flag = 0
    </select>
</mapper>

前端

activity.js

import request from '@/utils/request'
/**
 * 查询活动列表
 * @param query 查询条件参数
 * @returns {*} 查询结果
 */
export function listActivity(query) {
    return request({
        url: '/tienchin/activity/list',
        method: 'get',
        params: query
    })
}
// 查询活动详细
export function getActivity(activityId) {
    return request({
        url: '/tienchin/activity/' + activityId,
        method: 'get'
    })
}
// 新增活动
export function addActivity(data) {
    return request({
        url: '/tienchin/activity',
        method: 'post',
        data: data
    })
}
// 修改活动
export function updateActivity(data) {
    return request({
        url: '/tienchin/activity',
        method: 'put',
        data: data
    })
}
// 删除活动
export function delActivity(activityIds) {
    return request({
        url: '/tienchin/activity/' + activityIds,
        method: 'delete'
    })
}

index.vue

2105804-20230922004255014-129062240.png

<template>
  <div class="app-container">
    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
      <el-form-item label="岗位编码" prop="postCode">
        <el-input
            v-model="queryParams.postCode"
            placeholder="请输入岗位编码"
            clearable
            @keyup.enter="handleQuery"
        />
      </el-form-item>
      <el-form-item label="岗位名称" prop="postName">
        <el-input
            v-model="queryParams.postName"
            placeholder="请输入岗位名称"
            clearable
            @keyup.enter="handleQuery"
        />
      </el-form-item>
      <el-form-item label="状态" prop="status">
        <el-select v-model="queryParams.status" placeholder="岗位状态" clearable>
          <el-option
              v-for="dict in sys_normal_disable"
              :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="['system:post:add']"
        >新增
        </el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button
            type="success"
            plain
            icon="Edit"
            :disabled="single"
            @click="handleUpdate"
            v-hasPermi="['system:post:edit']"
        >修改
        </el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button
            type="danger"
            plain
            icon="Delete"
            :disabled="multiple"
            @click="handleDelete"
            v-hasPermi="['system:post:remove']"
        >删除
        </el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button
            type="warning"
            plain
            icon="Download"
            @click="handleExport"
            v-hasPermi="['system:post: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="['system:post:edit']"
          >修改
          </el-button>
          <el-button
              type="text"
              icon="Delete"
              @click="handleDelete(scope.row)"
              v-hasPermi="['system:post: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="postRef" :model="form" :rules="rules" label-width="80px">
        <el-form-item label="岗位名称" prop="postName">
          <el-input v-model="form.postName" placeholder="请输入岗位名称"/>
        </el-form-item>
        <el-form-item label="岗位编码" prop="postCode">
          <el-input v-model="form.postCode" placeholder="请输入编码名称"/>
        </el-form-item>
        <el-form-item label="岗位顺序" prop="postSort">
          <el-input-number v-model="form.postSort" controls-position="right" :min="0"/>
        </el-form-item>
        <el-form-item label="岗位状态" prop="status">
          <el-radio-group v-model="form.status">
            <el-radio
                v-for="dict in sys_normal_disable"
                :key="dict.value"
                :label="dict.value"
            >{{ dict.label }}
            </el-radio>
          </el-radio-group>
        </el-form-item>
        <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 {listPost, addPost, delPost, getPost, updatePost} from "@/api/system/post";
import {listActivity} 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 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,
    postCode: undefined,
    postName: undefined,
    status: undefined
  },
  rules: {
    postName: [{required: true, message: "岗位名称不能为空", trigger: "blur"}],
    postCode: [{required: true, message: "岗位编码不能为空", trigger: "blur"}],
    postSort: [{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 = {
    postId: undefined,
    postCode: undefined,
    postName: undefined,
    postSort: 0,
    status: "0",
    remark: undefined
  };
  proxy.resetForm("postRef");
}
/** 搜索按钮操作 */
function handleQuery() {
  queryParams.value.pageNum = 1;
  getList();
}
/** 重置按钮操作 */
function resetQuery() {
  proxy.resetForm("queryRef");
  handleQuery();
}
/** 多选框选中数据 */
function handleSelectionChange(selection) {
  ids.value = selection.map(item => item.postId);
  single.value = selection.length != 1;
  multiple.value = !selection.length;
}
/** 新增按钮操作 */
function handleAdd() {
  reset();
  open.value = true;
  title.value = "添加岗位";
}
/** 修改按钮操作 */
function handleUpdate(row) {
  reset();
  const postId = row.postId || ids.value;
  getPost(postId).then(response => {
    form.value = response.data;
    open.value = true;
    title.value = "修改岗位";
  });
}
/** 提交按钮 */
function submitForm() {
  proxy.$refs["postRef"].validate(valid => {
    if (valid) {
      if (form.value.postId != undefined) {
        updatePost(form.value).then(response => {
          proxy.$modal.msgSuccess("修改成功");
          open.value = false;
          getList();
        });
      } else {
        addPost(form.value).then(response => {
          proxy.$modal.msgSuccess("新增成功");
          open.value = false;
          getList();
        });
      }
    }
  });
}
/** 删除按钮操作 */
function handleDelete(row) {
  const postIds = row.postId || ids.value;
  proxy.$modal.confirm('是否确认删除岗位编号为"' + postIds + '"的数据项?').then(function () {
    return delPost(postIds);
  }).then(() => {
    getList();
    proxy.$modal.msgSuccess("删除成功");
  }).catch(() => {
  });
}
/** 导出按钮操作 */
function handleExport() {
  proxy.download("system/post/export", {
    ...queryParams.value
  }, `post_${new Date().getTime()}.xlsx`);
}
getList();
</script>


目录
相关文章
|
9月前
|
人工智能 监控 安全
AI 软件的开发上线
2026年AI软件上线已远超技术发布,是涵盖算法备案、安全评估、标识义务、端云协同部署、灰度测试、LLMOps监控及RLHF 2.0自学习迭代的系统工程,合规与治理成本成为关键门槛。(239字)
|
4月前
|
自然语言处理 安全 数据处理
Claude Code删掉80%系统提示词,老金的长文解读,信息很密!
系统提示词越写越长,为什么效果反而可能变差?这篇用Claude Code删掉80%的案例,讲清哪些规则该删、该搬。
|
12月前
|
存储 缓存 编解码
阿里云最便宜云服务器出炉:38元、99元、199元特惠及新品云服务器活动价格参考
2025年截止目前阿里云最便宜的云服务器已经出炉,轻量应用服务器2核2G峰值200M带宽新用户专属优惠价68元1年,每日10点和15点限量抢购价38元1年;经济型e实例2核2G3M带宽99元1年;通用算力型u1实例2核4G5M带宽199元1年。除此之外,新品u2i实例2核2G配置615.72元1年起、4核8G配置1170.26元1年起;九代云服务器c9i实例8核16G配置6037.01元1年起、g9i实例8核32G配置7680.98元1年起。本文为大家分享2025年阿里云最便宜的各个云服务器。
|
机器学习/深度学习 人工智能 文件存储
Llama Nemotron:英伟达开源基于Llama架构优化的推理模型,253B参数持平DeepSeek R1!
NVIDIA推出的Llama Nemotron系列推理模型,基于Llama架构优化,包含Nano/Super/Ultra三款,在数学推理、编程和工具调用等任务中展现卓越性能。
682 5
Llama Nemotron:英伟达开源基于Llama架构优化的推理模型,253B参数持平DeepSeek R1!
|
10月前
|
人工智能 自然语言处理 安全
AI心理咨询机器人技术解析:安全机制、适用边界与选型指南
深夜失眠、压力难解时,AI心理咨询正成为新选择。2024年全球市场规模达552亿美元,中国情感陪伴市场年增速高达148.74%。本文解析AI心理机器人的技术架构、安全边界与适用场景,揭示专业平台如何通过CBT干预、多模态情绪识别和危机预警保障用户安全,助你理性选择可靠工具。
|
机器学习/深度学习 人工智能 自然语言处理
MMAudio:开源 AI 音频合成项目,根据视频或文本生成同步的音频
MMAudio 是一个基于多模态联合训练的高质量 AI 音频合成项目,能够根据视频内容或文本描述生成同步的音频。该项目适用于影视制作、游戏开发、虚拟现实等多种场景,提升用户体验。
1289 8
MMAudio:开源 AI 音频合成项目,根据视频或文本生成同步的音频
|
12月前
|
SQL 人工智能 自然语言处理
企业级 AI 数据分析“专家”——Data Agent 推动数据分析民主化
Data Agent(数据智能体)正从辅助工具向企业核心数据分析中枢演进,推动“人人都是分析师”的愿景落地。
如何微信公众号中的视频保存下来
如何微信公众号中的视频保存下来
2102 0
|
数据挖掘 索引 Python
Pandas数据读取:CSV文件
Pandas 是 Python 中强大的数据分析库,`read_csv` 函数用于从 CSV 文件中读取数据。本文介绍 `read_csv` 的基本用法、常见问题及其解决方案,并通过代码案例详细说明。涵盖导入库、读取文件、指定列名和分隔符、处理文件路径错误、编码问题、大文件读取、数据类型问题、日期时间解析、空值处理、跳过行、指定索引列等。高级用法包括自定义列名映射、处理多行标题和注释行。希望本文能帮助你更高效地使用 Pandas 进行数据读取和处理。
2204 13
|
存储 人工智能 数据格式
总说具身智能的数据太贵,鹏城实验室开源百万规模标准化数据集
【9月更文挑战第18天】鹏城实验室提出的ARIO(All Robots In One)标准,为具身智能领域带来了统一的数据格式、丰富的感知模态及多样化的真实与模拟数据,显著提升了数据集的质量与规模,助力智能系统更好地与物理世界互动。基于此标准构建的大规模数据集包含约300万个片段,覆盖258个系列和321,064个任务,极大地推动了具身智能的研究与发展。然而,该数据集也面临着存储需求高、系统互操作性及应用场景适应性等挑战。论文详情见:http://arxiv.org/abs/2408.10899。
726 12