瀏覽代碼

Merge remote-tracking branch 'origin/Payment-Configuration' into Payment-Configuration

yys 1 天之前
父節點
當前提交
12fc43c1b5

+ 53 - 0
src/api/app/activity/accWork.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询作品列表
+export function listActivity(query) {
+  return request({
+    url: '/app/acc/work/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询作品详细
+export function getActivity(id) {
+  return request({
+    url: '/app/acc/work/' + id,
+    method: 'get'
+  })
+}
+
+// 新增作品
+export function addActivity(data) {
+  return request({
+    url: '/app/acc/work/',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改作品
+export function updateActivity(data) {
+  return request({
+    url: '/app/acc/work/',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除作品
+export function delActivity(id) {
+  return request({
+    url: '/app/acc/work/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出作品
+export function exportActivity(query) {
+  return request({
+    url: '/app/acc/work/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/app/activity/activity.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询活动列表
+export function listActivity(query) {
+  return request({
+    url: '/app/activity/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询活动详细
+export function getActivity(id) {
+  return request({
+    url: '/app/activity/' + id,
+    method: 'get'
+  })
+}
+
+// 新增活动
+export function addActivity(data) {
+  return request({
+    url: '/app/activity',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改活动
+export function updateActivity(data) {
+  return request({
+    url: '/app/activity',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除活动
+export function delActivity(id) {
+  return request({
+    url: '/app/activity/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出活动
+export function exportActivity(query) {
+  return request({
+    url: '/app/activity/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/app/activity/member.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询团队成员列表
+export function listMember(query) {
+  return request({
+    url: '/member/member/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询团队成员详细
+export function getMember(id) {
+  return request({
+    url: '/member/member/' + id,
+    method: 'get'
+  })
+}
+
+// 新增团队成员
+export function addMember(data) {
+  return request({
+    url: '/member/member',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改团队成员
+export function updateMember(data) {
+  return request({
+    url: '/member/member',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除团队成员
+export function delMember(id) {
+  return request({
+    url: '/member/member/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出团队成员
+export function exportMember(query) {
+  return request({
+    url: '/member/member/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/app/activity/prize.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询奖品列表
+export function listPrize(query) {
+  return request({
+    url: '/prize/prize/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询奖品详细
+export function getPrize(id) {
+  return request({
+    url: '/prize/prize/' + id,
+    method: 'get'
+  })
+}
+
+// 新增奖品
+export function addPrize(data) {
+  return request({
+    url: '/prize/prize',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改奖品
+export function updatePrize(data) {
+  return request({
+    url: '/prize/prize',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除奖品
+export function delPrize(id) {
+  return request({
+    url: '/prize/prize/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出奖品
+export function exportPrize(query) {
+  return request({
+    url: '/prize/prize/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/app/activity/prizeInfo.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询获奖记录列表
+export function listPrizeInfo(query) {
+  return request({
+    url: '/prizeInfo/prizeInfo/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询获奖记录详细
+export function getPrizeInfo(id) {
+  return request({
+    url: '/prizeInfo/prizeInfo/' + id,
+    method: 'get'
+  })
+}
+
+// 新增获奖记录
+export function addPrizeInfo(data) {
+  return request({
+    url: '/prizeInfo/prizeInfo',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改获奖记录
+export function updatePrizeInfo(data) {
+  return request({
+    url: '/prizeInfo/prizeInfo',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除获奖记录
+export function delPrizeInfo(id) {
+  return request({
+    url: '/prizeInfo/prizeInfo/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出获奖记录
+export function exportPrizeInfo(query) {
+  return request({
+    url: '/prizeInfo/prizeInfo/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/app/activity/team.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询团队列表
+export function listTeam(query) {
+  return request({
+    url: '/team/team/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询团队详细
+export function getTeam(id) {
+  return request({
+    url: '/team/team/' + id,
+    method: 'get'
+  })
+}
+
+// 新增团队
+export function addTeam(data) {
+  return request({
+    url: '/team/team',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改团队
+export function updateTeam(data) {
+  return request({
+    url: '/team/team',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除团队
+export function delTeam(id) {
+  return request({
+    url: '/team/team/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出团队
+export function exportTeam(query) {
+  return request({
+    url: '/team/team/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/app/activity/voteRecord.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询投票记录列表
+export function listVoteRecord(query) {
+  return request({
+    url: '/voteRecord/voteRecord/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询投票记录详细
+export function getVoteRecord(id) {
+  return request({
+    url: '/voteRecord/voteRecord/' + id,
+    method: 'get'
+  })
+}
+
+// 新增投票记录
+export function addVoteRecord(data) {
+  return request({
+    url: '/voteRecord/voteRecord',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改投票记录
+export function updateVoteRecord(data) {
+  return request({
+    url: '/voteRecord/voteRecord',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除投票记录
+export function delVoteRecord(id) {
+  return request({
+    url: '/voteRecord/voteRecord/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出投票记录
+export function exportVoteRecord(query) {
+  return request({
+    url: '/voteRecord/voteRecord/export',
+    method: 'get',
+    params: query
+  })
+}

+ 476 - 0
src/views/app/activityCenter/accWork/index.vue

@@ -0,0 +1,476 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="团队ID" prop="teamId">
+        <el-input
+          v-model="queryParams.teamId"
+          placeholder="请输入团队ID"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="活动ID" prop="activityId">
+        <el-input
+          v-model="queryParams.activityId"
+          placeholder="请输入活动ID"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="作品名称" prop="workName">
+        <el-input
+          v-model="queryParams.workName"
+          placeholder="请输入作品名称"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="请选择状态" clearable size="small">
+          <el-option
+            v-for="dict in statusOptions"
+            :key="dict.dictValue"
+            :label="dict.dictLabel"
+            :value="dict.dictValue"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="审核时间">
+        <el-date-picker
+          v-model="daterangeAuditTime"
+          size="small"
+          style="width: 240px"
+          value-format="yyyy-MM-dd"
+          type="daterange"
+          range-separator="-"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+        ></el-date-picker>
+      </el-form-item>
+      <el-form-item label="创建时间">
+        <el-date-picker
+          v-model="daterangeCreatedAt"
+          size="small"
+          style="width: 240px"
+          value-format="yyyy-MM-dd"
+          type="daterange"
+          range-separator="-"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+        ></el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @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="el-icon-plus"-->
+<!--          size="mini"-->
+<!--          @click="handleAdd"-->
+<!--          v-hasPermi="['app:accWork:add']"-->
+<!--        >新增</el-button>-->
+<!--      </el-col>-->
+<!--      <el-col :span="1.5">-->
+<!--        <el-button-->
+<!--          type="success"-->
+<!--          plain-->
+<!--          icon="el-icon-edit"-->
+<!--          size="mini"-->
+<!--          :disabled="single"-->
+<!--          @click="handleUpdate"-->
+<!--          v-hasPermi="['app:accWork:edit']"-->
+<!--        >修改</el-button>-->
+<!--      </el-col>-->
+<!--      <el-col :span="1.5">-->
+<!--        <el-button-->
+<!--          type="danger"-->
+<!--          plain-->
+<!--          icon="el-icon-delete"-->
+<!--          size="mini"-->
+<!--          :disabled="multiple"-->
+<!--          @click="handleDelete"-->
+<!--          v-hasPermi="['app:accWork:remove']"-->
+<!--        >删除</el-button>-->
+<!--      </el-col>-->
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          :loading="exportLoading"
+          @click="handleExport"
+          v-hasPermi="['app:accWork:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table border v-loading="loading" :data="activityList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="主键ID" align="center" prop="id" />
+      <el-table-column label="团队ID" align="center" prop="teamId" />
+      <el-table-column label="活动ID" align="center" prop="activityId" />
+      <el-table-column label="作品名称" align="center" prop="workName" />
+<!--      <el-table-column label="封面图URL" align="center" prop="coverUrl" />-->
+<!--      <el-table-column label="视频URL" align="center" prop="videoUrl" />-->
+      <el-table-column label="作品描述" align="center" prop="description" />
+      <el-table-column label="视频时长" align="center" prop="duration" />
+      <el-table-column label="总投票数" align="center" prop="voteCount" />
+      <el-table-column label="观看次数" align="center" prop="viewCount" />
+      <el-table-column label="视频" align="center" width="100">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-video-play"
+            @click="handlePlayVideo(scope.row)"
+          >播放视频</el-button>
+        </template>
+      </el-table-column>
+
+      <el-table-column label="状态" align="center" prop="status">
+        <template slot-scope="scope">
+          <dict-tag :options="statusOptions" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="审核意见" align="center" prop="auditRemark" />
+      <el-table-column label="审核时间" align="center" prop="auditTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.auditTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="创建时间" align="center" prop="createdAt" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createdAt, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="更新时间" align="center" prop="updatedAt" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.updatedAt, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['app:accWork:edit']"
+          >审核</el-button>
+<!--          <el-button-->
+<!--            size="mini"-->
+<!--            type="text"-->
+<!--            icon="el-icon-delete"-->
+<!--            @click="handleDelete(scope.row)"-->
+<!--            v-hasPermi="['app:accWork:remove']"-->
+<!--          >删除</el-button>-->
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 视频播放对话框 -->
+    <el-dialog
+      title="视频播放"
+      :visible.sync="videoDialogVisible"
+      width="800px"
+      append-to-body
+    >
+      <video
+        :src="currentVideoUrl"
+        controls        style="width: 100%"
+      ></video>
+    </el-dialog>
+
+    <!-- 添加或修改作品对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+<!--        <el-form-item label="团队ID" prop="teamId">-->
+<!--          <el-input v-model="form.teamId" placeholder="请输入团队ID" />-->
+<!--        </el-form-item>-->
+<!--        <el-form-item label="活动ID" prop="activityId">-->
+<!--          <el-input v-model="form.activityId" placeholder="请输入活动ID" />-->
+<!--        </el-form-item>-->
+        <el-form-item label="作品名称" prop="workName">
+          <el-input v-model="form.workName" placeholder="请输入作品名称" disabled/>
+        </el-form-item>
+<!--        <el-form-item label="封面图URL" prop="coverUrl">-->
+<!--          <el-input v-model="form.coverUrl" type="textarea" placeholder="请输入内容" />-->
+<!--        </el-form-item>-->
+<!--        <el-form-item label="视频URL" prop="videoUrl">-->
+<!--          <el-input v-model="form.videoUrl" type="textarea" placeholder="请输入内容" />-->
+<!--        </el-form-item>-->
+        <el-form-item label="作品描述" prop="description">
+          <el-input v-model="form.description" type="textarea" placeholder="请输入内容" disabled/>
+        </el-form-item>
+<!--        <el-form-item label="视频时长" prop="duration">-->
+<!--          <el-input v-model="form.duration" placeholder="请输入视频时长" />-->
+<!--        </el-form-item>-->
+        <el-form-item label="总投票数" prop="voteCount">
+          <el-input v-model="form.voteCount" placeholder="请输入总投票数" disabled/>
+        </el-form-item>
+        <el-form-item label="观看次数" prop="viewCount">
+          <el-input v-model="form.viewCount" placeholder="请输入观看次数" disabled/>
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+          <el-select v-model="form.status" placeholder="请选择状态">
+            <el-option
+              v-for="dict in statusOptions"
+              :key="dict.dictValue"
+              :label="dict.dictLabel"
+              :value="parseInt(dict.dictValue)"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="审核意见" prop="auditRemark">
+          <el-input v-model="form.auditRemark" placeholder="请输入审核意见" />
+        </el-form-item>
+<!--        <el-form-item label="审核时间" prop="auditTime">-->
+<!--          <el-date-picker clearable size="small"-->
+<!--            v-model="form.auditTime"-->
+<!--            type="date"-->
+<!--            value-format="yyyy-MM-dd"-->
+<!--            placeholder="选择审核时间">-->
+<!--          </el-date-picker>-->
+<!--        </el-form-item>-->
+<!--        <el-form-item label="审核时间" prop="createdAt">-->
+<!--          <el-date-picker clearable size="small"-->
+<!--            v-model="form.createdAt"-->
+<!--            type="date"-->
+<!--            value-format="yyyy-MM-dd"-->
+<!--            placeholder="选择审核时间">-->
+<!--          </el-date-picker>-->
+<!--        </el-form-item>-->
+<!--        <el-form-item label="审核时间" prop="updatedAt">-->
+<!--          <el-date-picker clearable size="small"-->
+<!--            v-model="form.updatedAt"-->
+<!--            type="date"-->
+<!--            value-format="yyyy-MM-dd"-->
+<!--            placeholder="选择审核时间">-->
+<!--          </el-date-picker>-->
+<!--        </el-form-item>-->
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listActivity, getActivity, delActivity, addActivity, updateActivity, exportActivity } from "@/api/app/activity/accWork";
+
+export default {
+  name: "AccWork",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 视频播放对话框
+      videoDialogVisible: false,
+      // 当前播放的视频 URL
+      currentVideoUrl: "",
+      // 导出遮罩层
+      exportLoading: false,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 作品表格数据
+      activityList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 状态:0-待审核 1-已通过 2-已驳回 3-已下架字典
+      statusOptions: [],
+      // 审核时间时间范围
+      daterangeAuditTime: [],
+      // 审核时间时间范围
+      daterangeCreatedAt: [],
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        teamId: null,
+        activityId: null,
+        workName: null,
+        status: null,
+        auditTime: null,
+        createdAt: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    this.getDicts("acc_work_status").then(response => {
+      this.statusOptions = response.data;
+    });
+    this.getList();
+
+  },
+  methods: {
+    /** 播放视频 */
+    handlePlayVideo(row) {
+      this.currentVideoUrl = row.videoUrl;
+      this.videoDialogVisible = true;
+    },
+    /** 查询作品列表 */
+    getList() {
+      this.loading = true;
+      this.queryParams.params = {};
+      if (null != this.daterangeAuditTime && '' != this.daterangeAuditTime) {
+        this.queryParams.params["beginAuditTime"] = this.daterangeAuditTime[0];
+        this.queryParams.params["endAuditTime"] = this.daterangeAuditTime[1];
+      }
+      if (null != this.daterangeCreatedAt && '' != this.daterangeCreatedAt) {
+        this.queryParams.params["beginCreatedAt"] = this.daterangeCreatedAt[0];
+        this.queryParams.params["endCreatedAt"] = this.daterangeCreatedAt[1];
+      }
+      listActivity(this.queryParams).then(response => {
+        this.activityList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        teamId: null,
+        activityId: null,
+        workName: null,
+        coverUrl: null,
+        videoUrl: null,
+        description: null,
+        duration: null,
+        voteCount: null,
+        viewCount: null,
+        status: 0,
+        auditRemark: null,
+        auditTime: null,
+        createdAt: null,
+        updatedAt: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.daterangeAuditTime = [];
+      this.daterangeCreatedAt = [];
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加作品";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getActivity(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "审核作品";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateActivity(this.form).then(response => {
+              this.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addActivity(this.form).then(response => {
+              this.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('是否确认删除作品编号为"' + ids + '"的数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return delActivity(ids);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有作品数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(() => {
+          this.exportLoading = true;
+          return exportActivity(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+          this.exportLoading = false;
+        }).catch(() => {});
+    }
+  }
+};
+</script>

+ 467 - 0
src/views/app/activityCenter/activity/index.vue

@@ -0,0 +1,467 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="活动标题" prop="title">
+        <el-input
+          v-model="queryParams.title"
+          placeholder="请输入活动标题"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="报名开始时间" prop="registrationStartTime">
+        <el-date-picker clearable size="small"
+                        v-model="queryParams.registrationStartTime"
+                        type="date"
+                        value-format="yyyy-MM-dd"
+                        placeholder="选择报名开始时间">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="报名结束时间" prop="registrationEndTime">
+        <el-date-picker clearable size="small"
+                        v-model="queryParams.registrationEndTime"
+                        type="date"
+                        value-format="yyyy-MM-dd"
+                        placeholder="选择报名结束时间">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="活动开始时间" prop="activityStartTime">
+        <el-date-picker clearable size="small"
+                        v-model="queryParams.activityStartTime"
+                        type="date"
+                        value-format="yyyy-MM-dd"
+                        placeholder="选择活动开始时间">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="活动结束时间" prop="activityEndTime">
+        <el-date-picker clearable size="small"
+                        v-model="queryParams.activityEndTime"
+                        type="date"
+                        value-format="yyyy-MM-dd"
+                        placeholder="选择活动结束时间">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="请选择状态:0-草稿 1-进行中 2-已结束 3-已关闭" clearable size="small">
+          <el-option
+            v-for="dict in statusOptions"
+            :key="dict.dictValue"
+            :label="dict.dictLabel"
+            :value="dict.dictValue"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="创建人" prop="createdBy">
+        <el-input
+          v-model="queryParams.createdBy"
+          placeholder="请输入创建人"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @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="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['activity:activity:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['activity:activity:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['activity:activity:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          :loading="exportLoading"
+          @click="handleExport"
+          v-hasPermi="['activity:activity:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table border v-loading="loading" :data="activityList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="主键 ID" align="center" prop="id" />
+      <el-table-column label="活动标题" align="center" prop="title" />
+      <!--      <el-table-column label="封面图 URL" align="center" prop="coverUrl" />-->
+      <el-table-column label="活动描述" align="center" prop="description" />
+      <el-table-column label="报名开始时间" align="center" prop="registrationStartTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.registrationStartTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="报名结束时间" align="center" prop="registrationEndTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.registrationEndTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="活动开始时间" align="center" prop="activityStartTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.activityStartTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="活动结束时间" align="center" prop="activityEndTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.activityEndTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="活动地点" align="center" prop="location" />
+<!--      <el-table-column label="活动规则" align="center" prop="rules" />-->
+      <el-table-column label="奖项设置" align="center" prop="awards" />
+      <el-table-column label="状态" align="center" prop="status">
+        <template slot-scope="scope">
+          <dict-tag :options="statusOptions" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="创建人" align="center" prop="createdBy" />
+      <el-table-column label="创建时间" align="center" prop="createdAt" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createdAt, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="更新时间" align="center" prop="updatedAt" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.updatedAt, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['activity:activity:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['activity:activity:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改活动对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+        <el-form-item label="活动标题" prop="title">
+          <el-input v-model="form.title" placeholder="请输入活动标题" />
+        </el-form-item>
+        <!--        <el-form-item label="封面图 URL" prop="coverUrl">-->
+        <!--          <el-input v-model="form.coverUrl" type="textarea" placeholder="请输入内容" />-->
+        <!--        </el-form-item>-->
+        <el-form-item label="活动描述" prop="description">
+          <el-input v-model="form.description" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="报名开始时间" prop="registrationStartTime">
+          <el-date-picker clearable size="small"
+                          v-model="form.registrationStartTime"
+                          type="date"
+                          value-format="yyyy-MM-dd"
+                          placeholder="选择报名开始时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="报名结束时间" prop="registrationEndTime">
+          <el-date-picker clearable size="small"
+                          v-model="form.registrationEndTime"
+                          type="date"
+                          value-format="yyyy-MM-dd"
+                          placeholder="选择报名结束时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="活动开始时间" prop="activityStartTime">
+          <el-date-picker clearable size="small"
+                          v-model="form.activityStartTime"
+                          type="date"
+                          value-format="yyyy-MM-dd"
+                          placeholder="选择活动开始时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="活动结束时间" prop="activityEndTime">
+          <el-date-picker clearable size="small"
+                          v-model="form.activityEndTime"
+                          type="date"
+                          value-format="yyyy-MM-dd"
+                          placeholder="选择活动结束时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="活动地点" prop="location">
+          <el-input v-model="form.location" placeholder="请输入活动地点" />
+        </el-form-item>
+        <el-form-item label="活动规则" prop="rules">
+          <editor ref="myeditor" @on-text-change="updateRulesText" />
+        </el-form-item>
+        <el-form-item label="奖项设置" prop="awards">
+          <el-input v-model="form.awards" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="状态">
+          <el-radio-group v-model="form.status">
+            <el-radio
+              v-for="dict in statusOptions"
+              :key="dict.dictValue"
+              :label="parseInt(dict.dictValue)"
+            >{{dict.dictLabel}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listActivity, getActivity, delActivity, addActivity, updateActivity, exportActivity } from "@/api/app/activity/activity";
+import Editor from '@/components/Editor/wang.vue';
+
+export default {
+  name: "Activity",
+  components: {
+    Editor
+  },
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 导出遮罩层
+      exportLoading: false,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 活动表格数据
+      activityList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 状态:0-草稿 1-进行中 2-已结束 3-已关闭字典
+      statusOptions: [],
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        title: null,
+        registrationStartTime: null,
+        registrationEndTime: null,
+        activityStartTime: null,
+        activityEndTime: null,
+        status: null,
+        createdBy: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        title: [
+          { required: true, message: "活动标题不能为空", trigger: "blur" }
+        ],
+        registrationStartTime: [
+          { required: true, message: "报名开始时间不能为空", trigger: "blur" }
+        ],
+        registrationEndTime: [
+          { required: true, message: "报名结束时间不能为空", trigger: "blur" }
+        ],
+        activityStartTime: [
+          { required: true, message: "活动开始时间不能为空", trigger: "blur" }
+        ],
+        activityEndTime: [
+          { required: true, message: "活动结束时间不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+    this.getDicts("activity_status").then(response => {
+      this.statusOptions = response.data;
+    });
+  },
+  methods: {
+    /** 查询活动列表 */
+    getList() {
+      this.loading = true;
+      listActivity(this.queryParams).then(response => {
+        this.activityList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 更新活动规则富文本内容
+    updateRulesText(text) {
+      this.form.rules = text;
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        title: null,
+        coverUrl: null,
+        description: null,
+        registrationStartTime: null,
+        registrationEndTime: null,
+        activityStartTime: null,
+        activityEndTime: null,
+        location: null,
+        rules: null,
+        awards: null,
+        status: 0,
+        createdBy: null,
+        createdAt: null,
+        updatedAt: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加活动";
+      setTimeout(() => {
+        this.$refs.myeditor.setText("");
+      }, 200);
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getActivity(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改活动";
+        setTimeout(() => {
+          if (this.form.rules == null) {
+            this.$refs.myeditor.setText("");
+          } else {
+            this.$refs.myeditor.setText(this.form.rules);
+          }
+        }, 200);
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateActivity(this.form).then(response => {
+              this.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addActivity(this.form).then(response => {
+              this.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('是否确认删除活动编号为"' + ids + '"的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(function() {
+        return delActivity(ids);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有活动数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        this.exportLoading = true;
+        return exportActivity(queryParams);
+      }).then(response => {
+        this.download(response.msg);
+        this.exportLoading = false;
+      }).catch(() => {});
+    }
+  }
+};
+</script>

+ 389 - 0
src/views/app/activityCenter/member/index.vue

@@ -0,0 +1,389 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="团队ID" prop="teamId">
+        <el-input
+          v-model="queryParams.teamId"
+          placeholder="请输入团队ID"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="用户ID" prop="userId">
+        <el-input
+          v-model="queryParams.userId"
+          placeholder="请输入用户ID"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="成员姓名" prop="userName">
+        <el-input
+          v-model="queryParams.userName"
+          placeholder="请输入成员姓名"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="创建时间">
+        <el-date-picker
+          v-model="daterangeCreatedAt"
+          size="small"
+          style="width: 240px"
+          value-format="yyyy-MM-dd"
+          type="daterange"
+          range-separator="-"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+        ></el-date-picker>
+      </el-form-item>
+      <el-form-item label="活动ID" prop="activityId">
+        <el-input
+          v-model="queryParams.activityId"
+          placeholder="请输入活动ID"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @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="el-icon-plus"-->
+<!--          size="mini"-->
+<!--          @click="handleAdd"-->
+<!--          v-hasPermi="['member:member:add']"-->
+<!--        >新增</el-button>-->
+<!--      </el-col>-->
+<!--      <el-col :span="1.5">-->
+<!--        <el-button-->
+<!--          type="success"-->
+<!--          plain-->
+<!--          icon="el-icon-edit"-->
+<!--          size="mini"-->
+<!--          :disabled="single"-->
+<!--          @click="handleUpdate"-->
+<!--          v-hasPermi="['member:member:edit']"-->
+<!--        >修改</el-button>-->
+<!--      </el-col>-->
+<!--      <el-col :span="1.5">-->
+<!--        <el-button-->
+<!--          type="danger"-->
+<!--          plain-->
+<!--          icon="el-icon-delete"-->
+<!--          size="mini"-->
+<!--          :disabled="multiple"-->
+<!--          @click="handleDelete"-->
+<!--          v-hasPermi="['member:member:remove']"-->
+<!--        >删除</el-button>-->
+<!--      </el-col>-->
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          :loading="exportLoading"
+          @click="handleExport"
+          v-hasPermi="['member:member:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table border v-loading="loading" :data="memberList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="主键ID" align="center" prop="id" />
+      <el-table-column label="团队ID" align="center" prop="teamId" />
+      <el-table-column label="用户ID" align="center" prop="userId" />
+      <el-table-column label="成员姓名" align="center" prop="userName" />
+<!--      <el-table-column label="加入时间" align="center" prop="joinTime" width="180">-->
+<!--        <template slot-scope="scope">-->
+<!--          <span>{{ parseTime(scope.row.joinTime, '{y}-{m}-{d}') }}</span>-->
+<!--        </template>-->
+<!--      </el-table-column>-->
+<!--      <el-table-column label="状态:0-已退出 1-正常" align="center" prop="status" />-->
+      <el-table-column label="创建时间" align="center" prop="createdAt" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createdAt, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+<!--      <el-table-column label="状态:0-已退出 1-正常" align="center" prop="updatedAt" width="180">-->
+<!--        <template slot-scope="scope">-->
+<!--          <span>{{ parseTime(scope.row.updatedAt, '{y}-{m}-{d}') }}</span>-->
+<!--        </template>-->
+<!--      </el-table-column>-->
+      <el-table-column label="活动ID" align="center" prop="activityId" />
+<!--      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">-->
+<!--        <template slot-scope="scope">-->
+<!--          <el-button-->
+<!--            size="mini"-->
+<!--            type="text"-->
+<!--            icon="el-icon-edit"-->
+<!--            @click="handleUpdate(scope.row)"-->
+<!--            v-hasPermi="['member:member:edit']"-->
+<!--          >修改</el-button>-->
+<!--          <el-button-->
+<!--            size="mini"-->
+<!--            type="text"-->
+<!--            icon="el-icon-delete"-->
+<!--            @click="handleDelete(scope.row)"-->
+<!--            v-hasPermi="['member:member:remove']"-->
+<!--          >删除</el-button>-->
+<!--        </template>-->
+<!--      </el-table-column>-->
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改团队成员对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="团队ID" prop="teamId">
+          <el-input v-model="form.teamId" placeholder="请输入团队ID" />
+        </el-form-item>
+        <el-form-item label="用户ID" prop="userId">
+          <el-input v-model="form.userId" placeholder="请输入用户ID" />
+        </el-form-item>
+        <el-form-item label="成员姓名" prop="userName">
+          <el-input v-model="form.userName" placeholder="请输入成员姓名" />
+        </el-form-item>
+        <el-form-item label="加入时间" prop="joinTime">
+          <el-date-picker clearable size="small"
+            v-model="form.joinTime"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="选择加入时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="状态:0-已退出 1-正常">
+          <el-radio-group v-model="form.status">
+            <el-radio label="1">请选择字典生成</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="状态:0-已退出 1-正常" prop="createdAt">
+          <el-date-picker clearable size="small"
+            v-model="form.createdAt"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="选择状态:0-已退出 1-正常">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="状态:0-已退出 1-正常" prop="updatedAt">
+          <el-date-picker clearable size="small"
+            v-model="form.updatedAt"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="选择状态:0-已退出 1-正常">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="活动ID" prop="activityId">
+          <el-input v-model="form.activityId" placeholder="请输入活动ID" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listMember, getMember, delMember, addMember, updateMember, exportMember } from "@/api/app/activity/member";
+
+export default {
+  name: "Member",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      daterangeCreatedAt: [],
+      // 导出遮罩层
+      exportLoading: false,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 团队成员表格数据
+      memberList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        teamId: null,
+        userId: null,
+        userName: null,
+        createdAt: null,
+        activityId: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        teamId: [
+          { required: true, message: "团队ID不能为空", trigger: "blur" }
+        ],
+        userId: [
+          { required: true, message: "用户ID不能为空", trigger: "blur" }
+        ],
+        userName: [
+          { required: true, message: "成员姓名不能为空", trigger: "blur" }
+        ],
+        activityId: [
+          { required: true, message: "活动ID不能为空", trigger: "blur" }
+        ]
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询团队成员列表 */
+    getList() {
+
+      this.loading = true;
+      this.queryParams.params = {};
+      if (null != this.daterangeCreatedAt && '' != this.daterangeCreatedAt) {
+        this.queryParams.params["beginCreatedAt"] = this.daterangeCreatedAt[0];
+        this.queryParams.params["endCreatedAt"] = this.daterangeCreatedAt[1];
+      }
+      listMember(this.queryParams).then(response => {
+        this.memberList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        teamId: null,
+        userId: null,
+        userName: null,
+        joinTime: null,
+        status: 0,
+        createdAt: null,
+        updatedAt: null,
+        activityId: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.daterangeCreatedAt = [];
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加团队成员";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getMember(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改团队成员";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateMember(this.form).then(response => {
+              this.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addMember(this.form).then(response => {
+              this.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('是否确认删除团队成员编号为"' + ids + '"的数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return delMember(ids);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有团队成员数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(() => {
+          this.exportLoading = true;
+          return exportMember(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+          this.exportLoading = false;
+        }).catch(() => {});
+    }
+  }
+};
+</script>

+ 356 - 0
src/views/app/activityCenter/prize/index.vue

@@ -0,0 +1,356 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="奖品编号" prop="prizeId">
+        <el-input
+          v-model="queryParams.prizeId"
+          placeholder="请输入奖品编号"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="活动ID" prop="activityId">
+        <el-input
+          v-model="queryParams.activityId"
+          placeholder="请输入活动ID"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="奖品名称" prop="prizeName">
+        <el-input
+          v-model="queryParams.prizeName"
+          placeholder="请输入奖品名称"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @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="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['prize:prize:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['prize:prize:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['prize:prize:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          :loading="exportLoading"
+          @click="handleExport"
+          v-hasPermi="['prize:prize:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table border v-loading="loading" :data="prizeList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="主键id" align="center" prop="id" />
+      <el-table-column label="奖品编号" align="center" prop="prizeId" />
+      <el-table-column label="活动ID" align="center" prop="activityId" />
+      <el-table-column label="奖品名称" align="center" prop="prizeName" />
+      <el-table-column label="奖项等级" align="center" prop="prizeLevel" />
+<!--      <el-table-column label="奖品图片URL" align="center" prop="prizeUrl" />-->
+<!--      <el-table-column prop="prizeLevel" label="图片" align="center">-->
+<!--        <template slot-scope="scope">-->
+<!--          <single-img v-model="scope.row.prizeLevel" type="image" :num="1" :width="60" :height="60" />-->
+<!--        </template>-->
+<!--      </el-table-column>-->
+      <el-table-column label="奖品图片" align="center" prop="prizeUrl" width="100px">
+        <template slot-scope="scope">
+          <el-popover
+            placement="right"
+            title=""
+            trigger="hover">
+            <img slot="reference" :src="scope.row.prizeUrl" width="80px">
+            <img :src="scope.row.prizeUrl" style="max-width: 150px;">
+          </el-popover>
+        </template>
+      </el-table-column>
+      <el-table-column label="排序" align="center" prop="sort" />
+      <el-table-column label="创建者" align="center" prop="createBy" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['prize:prize:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['prize:prize:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改奖品对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="奖品编号" prop="prizeId">
+          <el-input v-model="form.prizeId" placeholder="请输入奖品编号" />
+        </el-form-item>
+        <el-form-item label="活动ID" prop="activityId">
+          <el-input v-model="form.activityId" placeholder="请输入活动ID" />
+        </el-form-item>
+        <el-form-item label="奖品名称" prop="prizeName">
+          <el-input v-model="form.prizeName" placeholder="请输入奖品名称" />
+        </el-form-item>
+        <el-form-item label="奖项等级" prop="prizeLevel">
+          <el-input v-model="form.prizeLevel" placeholder="请输入奖项等级" />
+        </el-form-item>
+<!--        <el-form-item label="奖品图片URL">-->
+<!--          <imageUpload v-model="form.prizeUrl"/>-->
+<!--        </el-form-item>-->
+        <el-form-item label="奖品图片">
+          <Material v-model="imageArr" type="image" :num="1" :width="150" :height="150" />
+        </el-form-item>
+
+        <el-form-item label="排序" prop="sort">
+          <el-input v-model="form.sort" placeholder="请输入排序" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listPrize, getPrize, delPrize, addPrize, updatePrize, exportPrize } from "@/api/app/activity/prize";
+import Material from '@/components/Material/index.vue'
+import singleImg from '@/components/Material/single.vue'
+
+export default {
+  name: "Prize",
+  components: { Material,singleImg},
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 导出遮罩层
+      exportLoading: false,
+      // 选中数组
+      ids: [],
+      imageArr:[],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 奖品表格数据
+      prizeList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        prizeId: null,
+        activityId: null,
+        prizeName: null,
+        prizeUrl: [],
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        prizeId: [
+          { required: true, message: "奖品编号不能为空", trigger: "blur" }
+        ],
+        activityId: [
+          { required: true, message: "活动ID不能为空", trigger: "blur" }
+        ],
+        prizeName: [
+          { required: true, message: "奖品名称不能为空", trigger: "blur" }
+        ],
+        prizeUrl: [
+          { required: true, message: "奖品图片URL不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  watch: {
+    imageArr: function(val) {
+      this.form.prizeUrl = val.join(',')
+    },
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询奖品列表 */
+    getList() {
+      this.loading = true;
+      listPrize(this.queryParams).then(response => {
+        this.prizeList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        prizeId: null,
+        activityId: null,
+        prizeName: null,
+        prizeLevel: null,
+        prizeUrl: [],
+        sort: null,
+        createBy: null,
+        updateBy: null,
+        createTime: null,
+        updateTime: null
+      };
+      this.imageArr=[];
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加奖品";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getPrize(id).then(response => {
+        this.form = response.data;
+        this.imageArr = response.data.prizeUrl.split(',')
+        this.open = true;
+        this.title = "修改奖品";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updatePrize(this.form).then(response => {
+              this.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addPrize(this.form).then(response => {
+              this.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('是否确认删除奖品编号为"' + ids + '"的数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return delPrize(ids);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有奖品数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(() => {
+          this.exportLoading = true;
+          return exportPrize(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+          this.exportLoading = false;
+        }).catch(() => {});
+    }
+  }
+};
+</script>

+ 470 - 0
src/views/app/activityCenter/prizeInfo/index.vue

@@ -0,0 +1,470 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="活动ID" prop="activityId">
+        <el-input
+          v-model="queryParams.activityId"
+          placeholder="请输入活动ID"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="团队ID" prop="teamId">
+        <el-input
+          v-model="queryParams.teamId"
+          placeholder="请输入团队ID"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="领奖用户id" prop="userId">
+        <el-input
+          v-model="queryParams.userId"
+          placeholder="请输入领奖用户id"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="所属公司" prop="companyId">
+        <el-select v-model="queryParams.companyId" placeholder="请选择所属公司" clearable filterable size="small">
+          <el-option
+            v-for="company in companyOptions"
+            :key="company.companyId"
+            :label="company.companyName"
+            :value="company.companyId"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="所属销售id" prop="companyUserId">
+        <el-input
+          v-model="queryParams.companyUserId"
+          placeholder="请输入领奖用户id"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="请选择状态" clearable size="small">
+          <el-option
+            v-for="dict in prizeStatusOptions"
+            :key="dict.dictValue"
+            :label="dict.dictLabel"
+            :value="parseInt(dict.dictValue)"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="创建时间">
+        <el-date-picker
+          v-model="daterangeCreatedTime"
+          size="small"
+          style="width: 240px"
+          value-format="yyyy-MM-dd"
+          type="daterange"
+          range-separator="-"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+        ></el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @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="el-icon-plus"-->
+<!--          size="mini"-->
+<!--          @click="handleAdd"-->
+<!--          v-hasPermi="['prizeInfo:prizeInfo:add']"-->
+<!--        >新增</el-button>-->
+<!--      </el-col>-->
+<!--      <el-col :span="1.5">-->
+<!--        <el-button-->
+<!--          type="success"-->
+<!--          plain-->
+<!--          icon="el-icon-edit"-->
+<!--          size="mini"-->
+<!--          :disabled="single"-->
+<!--          @click="handleUpdate"-->
+<!--          v-hasPermi="['prizeInfo:prizeInfo:edit']"-->
+<!--        >审核</el-button>-->
+<!--      </el-col>-->
+<!--      <el-col :span="1.5">-->
+<!--        <el-button-->
+<!--          type="danger"-->
+<!--          plain-->
+<!--          icon="el-icon-delete"-->
+<!--          size="mini"-->
+<!--          :disabled="multiple"-->
+<!--          @click="handleDelete"-->
+<!--          v-hasPermi="['prizeInfo:prizeInfo:remove']"-->
+<!--        >删除</el-button>-->
+<!--      </el-col>-->
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          :loading="exportLoading"
+          @click="handleExport"
+          v-hasPermi="['prizeInfo:prizeInfo:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table border v-loading="loading" :data="prizeInfoList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="主键ID" align="center" prop="id" />
+      <el-table-column label="活动ID" align="center" prop="activityId" />
+      <el-table-column label="团队ID" align="center" prop="teamId" />
+      <el-table-column label="领奖用户id" align="center" prop="userId" />
+      <el-table-column label="所属公司" align="center" prop="companyId">
+        <template slot-scope="scope">
+          {{ getCompanyName(scope.row.companyId) }}
+        </template>
+      </el-table-column>
+      <el-table-column label="所属销售" align="center" prop="companyUserId" />
+      <el-table-column label="奖品ID" align="center" prop="prizeId" />
+      <el-table-column label="获奖时奖品名称" align="center" prop="prizeName" />
+      <el-table-column label="奖项等级" align="center" prop="prizeLevel" />
+      <el-table-column label="状态" align="center" prop="status">
+        <template slot-scope="scope">
+          <dict-tag :options="prizeStatusOptions" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="审核备注" align="center" prop="auditRemark" />
+      <el-table-column label="审核时间" align="center" prop="auditTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.auditTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="审核人ID" align="center" prop="auditorId" />
+      <el-table-column label="创建时间" align="center" prop="createdTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createdTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="更新时间" align="center" prop="updatedTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.updatedTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['prizeInfo:prizeInfo:edit']"
+          >审核</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['prizeInfo:prizeInfo:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改获奖记录对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+<!--        <el-form-item label="活动ID" prop="activityId">-->
+<!--          <el-input v-model="form.activityId" placeholder="请输入活动ID" />-->
+<!--        </el-form-item>-->
+<!--        <el-form-item label="团队ID" prop="teamId">-->
+<!--          <el-input v-model="form.teamId" placeholder="请输入团队ID" />-->
+<!--        </el-form-item>-->
+<!--        <el-form-item label="领奖用户id" prop="userId">-->
+<!--          <el-input v-model="form.userId" placeholder="请输入领奖用户id" />-->
+<!--        </el-form-item>-->
+<!--        <el-form-item label="所属公司" prop="companyId">-->
+<!--          <el-select v-model="form.companyId" placeholder="请选择所属公司" clearable filterable size="small">-->
+<!--            <el-option-->
+<!--              v-for="company in companyOptions"-->
+<!--              :key="company.companyId"-->
+<!--              :label="company.companyName"-->
+<!--              :value="company.companyId"-->
+<!--            />-->
+<!--          </el-select>-->
+<!--        </el-form-item>-->
+<!--        <el-form-item label="所属销售id" prop="companyUserId">-->
+<!--          <el-input v-model="form.companyUserId" placeholder="请输入领奖用户id" />-->
+<!--        </el-form-item>-->
+<!--        <el-form-item label="奖品ID" prop="prizeId">-->
+<!--          <el-input v-model="form.prizeId" placeholder="请输入奖品ID" />-->
+<!--        </el-form-item>-->
+<!--        <el-form-item label="获奖时奖品名称" prop="prizeName">-->
+<!--          <el-input v-model="form.prizeName" placeholder="请输入获奖时奖品名称" />-->
+<!--        </el-form-item>-->
+<!--        <el-form-item label="奖项等级" prop="prizeLevel">-->
+<!--          <el-input v-model="form.prizeLevel" placeholder="请输入奖项等级" />-->
+<!--        </el-form-item>-->
+        <el-form-item label="状态">
+          <el-select v-model="form.status" placeholder="请选择状态">
+            <el-option
+              v-for="dict in prizeStatusOptions"
+              :key="dict.dictValue"
+              :label="dict.dictLabel"
+              :value="parseInt(dict.dictValue)"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="审核备注" prop="auditRemark">
+          <el-input v-model="form.auditRemark" placeholder="请输入审核备注" />
+        </el-form-item>
+<!--        <el-form-item label="审核时间" prop="auditTime">-->
+<!--          <el-date-picker clearable size="small"-->
+<!--            v-model="form.auditTime"-->
+<!--            type="date"-->
+<!--            value-format="yyyy-MM-dd"-->
+<!--            placeholder="选择审核时间">-->
+<!--          </el-date-picker>-->
+<!--        </el-form-item>-->
+<!--        <el-form-item label="审核人ID" prop="auditorId">-->
+<!--          <el-input v-model="form.auditorId" placeholder="请输入审核人ID" />-->
+<!--        </el-form-item>-->
+<!--        <el-form-item label="创建时间" prop="createdTime">-->
+<!--          <el-date-picker clearable size="small"-->
+<!--            v-model="form.createdTime"-->
+<!--            type="date"-->
+<!--            value-format="yyyy-MM-dd"-->
+<!--            placeholder="选择审核人ID">-->
+<!--          </el-date-picker>-->
+<!--        </el-form-item>-->
+<!--        <el-form-item label="更新时间" prop="updatedTime">-->
+<!--          <el-date-picker clearable size="small"-->
+<!--            v-model="form.updatedTime"-->
+<!--            type="date"-->
+<!--            value-format="yyyy-MM-dd"-->
+<!--            placeholder="选择审核人ID">-->
+<!--          </el-date-picker>-->
+<!--        </el-form-item>-->
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listPrizeInfo, getPrizeInfo, delPrizeInfo, addPrizeInfo, updatePrizeInfo, exportPrizeInfo } from "@/api/app/activity/prizeInfo";
+import { getCompanyList } from "@/api/company/company";
+
+export default {
+  name: "PrizeInfo",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 公司选项
+      companyOptions: [],
+      // 导出遮罩层
+      exportLoading: false,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 获奖记录表格数据
+      prizeInfoList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 更新者时间范围
+      daterangeCreatedTime: [],
+      prizeStatusOptions: [],
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        activityId: null,
+        teamId: null,
+        userId: null,
+        companyId: null,
+        companyUserId: null,
+        status: null,
+        createdTime: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    this.getDicts("activity_prize_status").then(response => {
+      this.prizeStatusOptions = response.data;
+    });
+    this.getCompanyList();
+    this.getList();
+  },
+  methods: {
+    getCompanyName(companyId) {
+      if (!companyId) return '';
+      const company = this.companyOptions.find(item => item.companyId === companyId);
+      return company ? company.companyName : '';
+    },
+    /** 获取公司列表 */
+    getCompanyList() {
+      getCompanyList().then(response => {
+        this.companyOptions = response.data || [];
+      });
+    },
+    /** 查询获奖记录列表 */
+    getList() {
+      this.loading = true;
+      this.queryParams.params = {};
+      if (null != this.daterangeCreatedTime && '' != this.daterangeCreatedTime) {
+        this.queryParams.params["beginCreatedTime"] = this.daterangeCreatedTime[0];
+        this.queryParams.params["endCreatedTime"] = this.daterangeCreatedTime[1];
+      }
+      listPrizeInfo(this.queryParams).then(response => {
+        this.prizeInfoList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        activityId: null,
+        teamId: null,
+        userId: null,
+        companyId: null,
+        companyUserId: null,
+        prizeId: null,
+        prizeName: null,
+        prizeLevel: null,
+        status: 0,
+        auditRemark: null,
+        auditTime: null,
+        auditorId: null,
+        createBy: null,
+        updateBy: null,
+        createdTime: null,
+        updatedTime: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.daterangeCreatedTime = [];
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加获奖记录";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getPrizeInfo(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "审核";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updatePrizeInfo(this.form).then(response => {
+              this.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addPrizeInfo(this.form).then(response => {
+              this.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('是否确认删除获奖记录编号为"' + ids + '"的数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return delPrizeInfo(ids);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有获奖记录数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(() => {
+          this.exportLoading = true;
+          return exportPrizeInfo(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+          this.exportLoading = false;
+        }).catch(() => {});
+    }
+  }
+};
+</script>

+ 449 - 0
src/views/app/activityCenter/team/index.vue

@@ -0,0 +1,449 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="活动ID" prop="activityId">
+        <el-input
+          v-model="queryParams.activityId"
+          placeholder="请输入活动ID"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="队伍码" prop="teamCode">
+        <el-input
+          v-model="queryParams.teamCode"
+          placeholder="请输入队伍码"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="团队名称" prop="teamName">
+        <el-input
+          v-model="queryParams.teamName"
+          placeholder="请输入团队名称"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="所在城市" prop="city">
+        <el-input
+          v-model="queryParams.city"
+          placeholder="请输入所在城市"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="领队ID" prop="leaderId">
+        <el-input
+          v-model="queryParams.leaderId"
+          placeholder="请输入领队ID"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="领队姓名" prop="leaderName">
+        <el-input
+          v-model="queryParams.leaderName"
+          placeholder="请输入领队姓名"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="领队电话" prop="leaderPhone">
+        <el-input
+          v-model="queryParams.leaderPhone"
+          placeholder="请输入领队电话"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="创建时间">
+        <el-date-picker
+          v-model="daterangeCreatedAt"
+          size="small"
+          style="width: 240px"
+          value-format="yyyy-MM-dd"
+          type="daterange"
+          range-separator="-"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+        ></el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @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="el-icon-plus"-->
+<!--          size="mini"-->
+<!--          @click="handleAdd"-->
+<!--          v-hasPermi="['team:team:add']"-->
+<!--        >新增</el-button>-->
+<!--      </el-col>-->
+<!--      <el-col :span="1.5">-->
+<!--        <el-button-->
+<!--          type="success"-->
+<!--          plain-->
+<!--          icon="el-icon-edit"-->
+<!--          size="mini"-->
+<!--          :disabled="single"-->
+<!--          @click="handleUpdate"-->
+<!--          v-hasPermi="['team:team:edit']"-->
+<!--        >修改</el-button>-->
+<!--      </el-col>-->
+<!--      <el-col :span="1.5">-->
+<!--        <el-button-->
+<!--          type="danger"-->
+<!--          plain-->
+<!--          icon="el-icon-delete"-->
+<!--          size="mini"-->
+<!--          :disabled="multiple"-->
+<!--          @click="handleDelete"-->
+<!--          v-hasPermi="['team:team:remove']"-->
+<!--        >删除</el-button>-->
+<!--      </el-col>-->
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          :loading="exportLoading"
+          @click="handleExport"
+          v-hasPermi="['team:team:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table border v-loading="loading" :data="teamList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="主键ID" align="center" prop="id" />
+      <el-table-column label="活动ID" align="center" prop="activityId" />
+      <el-table-column label="队伍码" align="center" prop="teamCode" />
+      <el-table-column label="团队名称" align="center" prop="teamName" />
+      <el-table-column label="所在城市" align="center" prop="city" />
+      <el-table-column label="领队ID" align="center" prop="leaderId" />
+      <el-table-column label="领队姓名" align="center" prop="leaderName" />
+      <el-table-column label="领队电话" align="center" prop="leaderPhone" />
+      <el-table-column label="当前成员数" align="center" prop="memberCount" />
+<!--      <el-table-column label="状态:0-待审核 1-已通过 2-已驳回 3-已解散" align="center" prop="status" />-->
+<!--      <el-table-column label="审核备注" align="center" prop="auditRemark" />-->
+<!--      <el-table-column label="审核时间" align="center" prop="auditTime" width="180">-->
+<!--        <template slot-scope="scope">-->
+<!--          <span>{{ parseTime(scope.row.auditTime, '{y}-{m}-{d}') }}</span>-->
+<!--        </template>-->
+<!--      </el-table-column>-->
+      <el-table-column label="创建时间" align="center" prop="createdAt" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createdAt, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="更新时间" align="center" prop="updatedAt" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.updatedAt, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+<!--      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">-->
+<!--        <template slot-scope="scope">-->
+<!--          <el-button-->
+<!--            size="mini"-->
+<!--            type="text"-->
+<!--            icon="el-icon-edit"-->
+<!--            @click="handleUpdate(scope.row)"-->
+<!--            v-hasPermi="['team:team:edit']"-->
+<!--          >修改</el-button>-->
+<!--          <el-button-->
+<!--            size="mini"-->
+<!--            type="text"-->
+<!--            icon="el-icon-delete"-->
+<!--            @click="handleDelete(scope.row)"-->
+<!--            v-hasPermi="['team:team:remove']"-->
+<!--          >删除</el-button>-->
+<!--        </template>-->
+<!--      </el-table-column>-->
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改团队对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="活动ID" prop="activityId">
+          <el-input v-model="form.activityId" placeholder="请输入活动ID" />
+        </el-form-item>
+        <el-form-item label="队伍码" prop="teamCode">
+          <el-input v-model="form.teamCode" placeholder="请输入队伍码" />
+        </el-form-item>
+        <el-form-item label="团队名称" prop="teamName">
+          <el-input v-model="form.teamName" placeholder="请输入团队名称" />
+        </el-form-item>
+        <el-form-item label="所在城市" prop="city">
+          <el-input v-model="form.city" placeholder="请输入所在城市" />
+        </el-form-item>
+        <el-form-item label="领队ID" prop="leaderId">
+          <el-input v-model="form.leaderId" placeholder="请输入领队ID" />
+        </el-form-item>
+        <el-form-item label="领队姓名" prop="leaderName">
+          <el-input v-model="form.leaderName" placeholder="请输入领队姓名" />
+        </el-form-item>
+        <el-form-item label="领队电话" prop="leaderPhone">
+          <el-input v-model="form.leaderPhone" placeholder="请输入领队电话" />
+        </el-form-item>
+        <el-form-item label="当前成员数" prop="memberCount">
+          <el-input v-model="form.memberCount" placeholder="请输入当前成员数" />
+        </el-form-item>
+<!--        <el-form-item label="状态:0-待审核 1-已通过 2-已驳回 3-已解散">-->
+<!--          <el-radio-group v-model="form.status">-->
+<!--            <el-radio label="1">请选择字典生成</el-radio>-->
+<!--          </el-radio-group>-->
+<!--        </el-form-item>-->
+        <el-form-item label="审核备注" prop="auditRemark">
+          <el-input v-model="form.auditRemark" placeholder="请输入审核备注" />
+        </el-form-item>
+        <el-form-item label="审核时间" prop="auditTime">
+          <el-date-picker clearable size="small"
+            v-model="form.auditTime"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="选择审核时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="审核时间" prop="createdAt">
+          <el-date-picker clearable size="small"
+            v-model="form.createdAt"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="选择审核时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="审核时间" prop="updatedAt">
+          <el-date-picker clearable size="small"
+            v-model="form.updatedAt"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="选择审核时间">
+          </el-date-picker>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listTeam, getTeam, delTeam, addTeam, updateTeam, exportTeam } from "@/api/app/activity/team";
+
+export default {
+  name: "Team",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 导出遮罩层
+      exportLoading: false,
+      // 创建时间范围
+      daterangeCreatedAt: [],
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 团队表格数据
+      teamList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        activityId: null,
+        teamCode: null,
+        teamName: null,
+        city: null,
+        leaderId: null,
+        leaderName: null,
+        leaderPhone: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        activityId: [
+          { required: true, message: "活动ID不能为空", trigger: "blur" }
+        ],
+        teamCode: [
+          { required: true, message: "队伍码不能为空", trigger: "blur" }
+        ],
+        teamName: [
+          { required: true, message: "团队名称不能为空", trigger: "blur" }
+        ],
+        leaderId: [
+          { required: true, message: "领队ID不能为空", trigger: "blur" }
+        ],
+        leaderName: [
+          { required: true, message: "领队姓名不能为空", trigger: "blur" }
+        ],
+        leaderPhone: [
+          { required: true, message: "领队电话不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询团队列表 */
+    getList() {
+      this.loading = true;
+      this.queryParams.params = {};
+      if (null != this.daterangeCreatedAt && '' != this.daterangeCreatedAt) {
+        this.queryParams.params["beginCreatedAt"] = this.daterangeCreatedAt[0];
+        this.queryParams.params["endCreatedAt"] = this.daterangeCreatedAt[1];
+      }
+      listTeam(this.queryParams).then(response => {
+        this.teamList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        activityId: null,
+        teamCode: null,
+        teamName: null,
+        city: null,
+        leaderId: null,
+        leaderName: null,
+        leaderPhone: null,
+        memberCount: null,
+        status: 0,
+        auditRemark: null,
+        auditTime: null,
+        createdAt: null,
+        updatedAt: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.daterangeCreatedAt = [];
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加团队";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getTeam(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改团队";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateTeam(this.form).then(response => {
+              this.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addTeam(this.form).then(response => {
+              this.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('是否确认删除团队编号为"' + ids + '"的数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return delTeam(ids);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有团队数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(() => {
+          this.exportLoading = true;
+          return exportTeam(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+          this.exportLoading = false;
+        }).catch(() => {});
+    }
+  }
+};
+</script>

+ 352 - 0
src/views/app/activityCenter/voteRecord/index.vue

@@ -0,0 +1,352 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="作品ID" prop="workId">
+        <el-input
+          v-model="queryParams.workId"
+          placeholder="请输入作品ID"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="用户ID" prop="userId">
+        <el-input
+          v-model="queryParams.userId"
+          placeholder="请输入用户ID"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="投票时间" prop="voteTime">
+        <el-date-picker clearable size="small"
+          v-model="queryParams.voteTime"
+          type="date"
+          value-format="yyyy-MM-dd"
+          placeholder="选择投票时间">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="IP地址" prop="ipAddress">
+        <el-input
+          v-model="queryParams.ipAddress"
+          placeholder="请输入IP地址"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @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="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['voteRecord:voteRecord:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['voteRecord:voteRecord:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['voteRecord:voteRecord:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          :loading="exportLoading"
+          @click="handleExport"
+          v-hasPermi="['voteRecord:voteRecord:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table border v-loading="loading" :data="voteRecordList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="主键ID" align="center" prop="id" />
+      <el-table-column label="作品ID" align="center" prop="workId" />
+      <el-table-column label="用户ID" align="center" prop="userId" />
+      <el-table-column label="投票日期" align="center" prop="voteDate" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.voteDate, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="投票时间" align="center" prop="voteTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.voteTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="IP地址" align="center" prop="ipAddress" />
+      <el-table-column label="IP地址" align="center" prop="createdAt" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createdAt, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['voteRecord:voteRecord:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['voteRecord:voteRecord:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改投票记录对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="作品ID" prop="workId">
+          <el-input v-model="form.workId" placeholder="请输入作品ID" />
+        </el-form-item>
+        <el-form-item label="用户ID" prop="userId">
+          <el-input v-model="form.userId" placeholder="请输入用户ID" />
+        </el-form-item>
+        <el-form-item label="投票日期" prop="voteDate">
+          <el-date-picker clearable size="small"
+            v-model="form.voteDate"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="选择投票日期">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="投票时间" prop="voteTime">
+          <el-date-picker clearable size="small"
+            v-model="form.voteTime"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="选择投票时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="IP地址" prop="ipAddress">
+          <el-input v-model="form.ipAddress" placeholder="请输入IP地址" />
+        </el-form-item>
+        <el-form-item label="IP地址" prop="createdAt">
+          <el-date-picker clearable size="small"
+            v-model="form.createdAt"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="选择IP地址">
+          </el-date-picker>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listVoteRecord, getVoteRecord, delVoteRecord, addVoteRecord, updateVoteRecord, exportVoteRecord } from "@/api/app/activity/voteRecord";
+
+export default {
+  name: "VoteRecord",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 导出遮罩层
+      exportLoading: false,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 投票记录表格数据
+      voteRecordList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        workId: null,
+        userId: null,
+        voteTime: null,
+        ipAddress: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        workId: [
+          { required: true, message: "作品ID不能为空", trigger: "blur" }
+        ],
+        userId: [
+          { required: true, message: "用户ID不能为空", trigger: "blur" }
+        ],
+        voteDate: [
+          { required: true, message: "投票日期不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询投票记录列表 */
+    getList() {
+      this.loading = true;
+      listVoteRecord(this.queryParams).then(response => {
+        this.voteRecordList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        workId: null,
+        userId: null,
+        voteDate: null,
+        voteTime: null,
+        ipAddress: null,
+        createdAt: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加投票记录";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getVoteRecord(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改投票记录";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateVoteRecord(this.form).then(response => {
+              this.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addVoteRecord(this.form).then(response => {
+              this.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('是否确认删除投票记录编号为"' + ids + '"的数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return delVoteRecord(ids);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有投票记录数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(() => {
+          this.exportLoading = true;
+          return exportVoteRecord(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+          this.exportLoading = false;
+        }).catch(() => {});
+    }
+  }
+};
+</script>

+ 375 - 0
src/views/app/statistics/courseAppReport/index.vue

@@ -0,0 +1,375 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="85px">
+      <el-form-item label="公司名" prop="companyId">
+        <el-select filterable v-model="queryParams.companyId" placeholder="请选择公司名"
+                   clearable size="small">
+          <el-option
+            v-for="item in companys"
+            :key="item.companyId"
+            :label="item.companyName"
+            :value="item.companyId"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="看课时间" prop="createTime">
+        <el-date-picker v-model="createTime" size="small" style="width: 220px" value-format="yyyy-MM-dd"
+                        type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"
+                        @change="xdChange"></el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          :loading="exportLoading"
+          @click="handleExport"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+    <el-table height="500" v-loading="loading" border :data="packageOrderList">
+      <el-table-column label="销售公司" align="center" prop="companyName" width="120px"/>
+      <el-table-column label="新增注册人数" align="center" prop="appUserCount"/>
+<!--      <el-table-column label="APP活跃人数" align="center" prop="activeAppUserCount"/>-->
+      <el-table-column label="私域课待看课人次" align="center" prop="pendingCount"/>
+      <el-table-column label="私域课看课中人次" align="center" prop="watchingCount"/>
+      <el-table-column label="私域课看课中断人次" align="center" prop="stopCount"/>
+      <el-table-column label="私域课看课率" align="center" prop="watchRate"/>
+      <el-table-column label="私域课完课人次" align="center" prop="finishedCount"/>
+      <el-table-column label="答题人次" align="center" prop="answerUserCount"/>
+      <el-table-column label="红包领取人次" align="center" prop="packetUserCount"/>
+      <el-table-column label="红包金额" align="center" prop="packetAmount"/>
+    </el-table>
+    <div class="total-summary">
+      <span class="total-title">总计:</span>
+      <span class="total-item">新增注册人数:{{ calculatedTotalData.appUserCount }}</span>
+<!--      <span class="total-item">APP 活跃人数:{{ calculatedTotalData.activeAppUserCount }}</span>-->
+      <span class="total-item">私域课待看课人次:{{ calculatedTotalData.pendingCount }}</span>
+      <span class="total-item">私域课看课中人次:{{ calculatedTotalData.watchingCount }}</span>
+      <span class="total-item">私域课看课中断人次:{{ calculatedTotalData.stopCount }}</span>
+      <span class="total-item">私域课看课率:{{ calculatedTotalData.watchRate}}</span>
+      <span class="total-item">私域课完课人次:{{ calculatedTotalData.finishedCount }}</span>
+      <span class="total-item">答题人次:{{ calculatedTotalData.answerUserCount }}</span>
+      <span class="total-item">红包领取人次:{{ calculatedTotalData.packetUserCount}}</span>
+      <span class="total-item">红包金额:{{ calculatedTotalData.packetAmount }}</span>
+    </div>
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+  </div>
+</template>
+
+<script>
+import { getCompanyList } from "@/api/company/company";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+import { getTask } from "@/api/common";
+import request from '@/utils/request'
+
+export default {
+  name: "AppCourseReport",
+  components: { Treeselect },
+  data() {
+    return {
+      normalizer: function(node) {
+        return {
+          id: node.id || node.dictValue,
+          label: node.label || node.dictLabel,
+          children: node.children
+        }
+      },
+      calculatedTotalData: {
+        appUserCount: 0,
+        // activeAppUserCount: 0,
+        pendingCount: 0,
+        watchingCount: 0,
+        stopCount: 0,
+        watchRate: '0%',
+        finishedCount: 0,
+        answerUserCount: 0,
+        packetUserCount: 0,
+        packetAmount: 0
+      },
+      companys: [],
+      deptOptions: [],
+      companyId: undefined,
+      show: {
+        open: false,
+      },
+      actName: "2",
+      loading: true,
+      startTime: null,
+      exportLoading: false,
+      ids: [],
+      createTime: null,
+      single: true,
+      multiple: true,
+      showSearch: true,
+      endTime: null,
+      total: 0,
+      packageOrderList: [],
+      title: "",
+      open: false,
+      isPayOptions: [],
+      statusOptions: [],
+      refundStatusOptions: [],
+      packageSubTypeOptions: [],
+      payTypeOptions: [],
+      deliveryPayStatusOptions: [],
+      deliveryStatusOptions: [],
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        companyId: null,
+        sTime: null,
+        eTime: null
+      },
+      form: {},
+      rules: {}
+    };
+  },
+  created() {
+    // 默认查询当天
+    const today = new Date();
+    const formatDate = (date) => {
+      const year = date.getFullYear();
+      const month = String(date.getMonth() + 1).padStart(2, '0');
+      const day = String(date.getDate()).padStart(2, '0');
+      return `${year}-${month}-${day}`;
+    };
+    const todayStr = formatDate(today);
+    this.createTime = [todayStr, todayStr];
+    this.queryParams.sTime = todayStr;
+    this.queryParams.eTime = todayStr;
+
+    getCompanyList().then(response => {
+      this.companys = response.data;
+      if (this.companys != null && this.companys.length > 0) {
+        this.companyId = this.companys[0].companyId;
+      }
+      this.companys.push({companyId: "-1", companyName: "无"})
+      // 获取公司列表后自动查询
+      this.getList();
+    });
+  },
+  methods: {
+    getList() {
+      this.loading = true;
+      return request({
+        url: '/app/statistics/appCourseReport',
+        method: 'get',
+        params: this.queryParams
+      }).then(response => {
+        this.packageOrderList = response.rows || response.data;
+        this.total = response.total || 0;
+        this.calculateTotals();
+        this.loading = false;
+        setTimeout(() => {
+          this.$forceUpdate();
+        }, 100);
+      }).catch(() => {
+        this.loading = false;
+      });
+    },
+    calculateTotals() {
+      this.calculatedTotalData = {
+        appUserCount: 0,
+        // activeAppUserCount: 0,
+        pendingCount: 0,
+        watchingCount: 0,
+        stopCount: 0,
+        watchRate: 0,
+        finishedCount: 0,
+        answerUserCount: 0,
+        packetUserCount: 0,
+        packetAmount: 0
+      };
+
+      this.packageOrderList.forEach(item => {
+        this.calculatedTotalData.appUserCount += Number(item.appUserCount) || 0;
+        // this.calculatedTotalData.activeAppUserCount += Number(item.activeAppUserCount) || 0;
+        this.calculatedTotalData.pendingCount += Number(item.pendingCount) || 0;
+        this.calculatedTotalData.watchingCount += Number(item.watchingCount) || 0;
+        this.calculatedTotalData.stopCount += Number(item.stopCount) || 0;
+        this.calculatedTotalData.finishedCount += Number(item.finishedCount) || 0;
+        this.calculatedTotalData.answerUserCount += Number(item.answerUserCount) || 0;
+        this.calculatedTotalData.packetUserCount += Number(item.packetUserCount) || 0;
+        this.calculatedTotalData.packetAmount += Number(item.packetAmount) || 0;
+      });
+
+      if (this.calculatedTotalData.pendingCount > 0) {
+        this.calculatedTotalData.watchRate = ((this.calculatedTotalData.watchingCount / this.calculatedTotalData.pendingCount) * 100).toFixed(2) + '%';
+      } else {
+        this.calculatedTotalData.watchRate = '0.00%';
+      }
+
+      this.calculatedTotalData.packetAmount = this.calculatedTotalData.packetAmount.toFixed(2);
+    },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    reset() {
+      this.form = {
+        orderId: null,
+        orderSn: null,
+        userId: null,
+        doctorId: null,
+        packageId: null,
+        packageName: null,
+        payMoney: null,
+        isPay: null,
+        days: null,
+        status: 0,
+        startTime: null,
+        finishTime: null,
+        createTime: null
+      };
+      this.resetForm("form");
+    },
+    handleQuery() {
+      this.getList();
+    },
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.createTime = null;
+      this.startTime = null;
+      this.endTime = null;
+
+      this.queryParams = {
+        pageNum: 1,
+        pageSize: 10,
+        companyId: null,
+        sTime: null,
+        eTime: null
+      };
+
+      this.handleQuery();
+    },
+    xdChange() {
+      if (this.createTime != null) {
+        this.queryParams.sTime = this.createTime[0];
+        this.queryParams.eTime = this.createTime[1];
+      } else {
+        this.queryParams.sTime = null;
+        this.queryParams.eTime = null;
+      }
+    },
+    handleExport() {
+      const now = new Date();
+      const year = now.getFullYear();
+      const month = String(now.getMonth() + 1).padStart(2, '0');
+      const firstDay = `${year}-${month}-01`;
+      const lastDay = new Date(year, now.getMonth() + 1, 0);
+      const lastDayStr = `${year}-${month}-${String(lastDay.getDate()).padStart(2, '0')}`;
+
+      const { watchType, ...paramsWithoutWatchType } = this.queryParams;
+      const exportParams = {
+        ...paramsWithoutWatchType,
+        sTime: this.queryParams.sTime || firstDay,
+        eTime: this.queryParams.eTime || lastDayStr
+      };
+
+      this.$confirm('是否确认导出 APP 看课报表', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        this.exportLoading = true;
+        return request({
+          url: '/app/statistics/exportAppCourseReport',
+          method: 'get',
+          params: exportParams
+        });
+      }).then(response => {
+        this.download(response.msg);
+        this.exportLoading = false;
+      }).catch(() => {
+        this.exportLoading = false;
+      });
+    },
+    endChange() {
+      if (this.endTime != null) {
+        this.queryParams.endStartTime = this.endTime[0];
+        this.queryParams.endEndTime = this.endTime[1];
+      } else {
+        this.queryParams.endStartTime = null;
+        this.queryParams.endEndTime = null;
+      }
+    }
+  }
+};
+</script>
+
+<style scoped>
+.total-summary {
+  margin-top: 15px;
+  padding: 15px 20px;
+  background: linear-gradient(135deg, #f5f7fa 0%, #e4e7f4 100%);
+  border: 1px solid #dcdfe6;
+  border-radius: 4px;
+  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+}
+
+.total-title {
+  font-weight: bold;
+  font-size: 16px;
+  color: #303133;
+  margin-right: 20px;
+  flex-shrink: 0;
+}
+
+.total-item {
+  margin-right: 25px;
+  padding: 5px 10px;
+  background: white;
+  border-radius: 3px;
+  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
+  display: inline-block;
+  margin-bottom: 5px;
+  font-size: 13px;
+  color: #606266;
+}
+
+.total-item::before {
+  content: "";
+  display: inline-block;
+  width: 3px;
+  height: 3px;
+  background: #409eff;
+  border-radius: 50%;
+  margin-right: 5px;
+  vertical-align: middle;
+}
+
+@media (max-width: 768px) {
+  .total-summary {
+    flex-direction: column;
+    align-items: flex-start;
+  }
+
+  .total-title {
+    margin-bottom: 10px;
+  }
+
+  .total-item {
+    margin-right: 10px;
+    margin-bottom: 8px;
+  }
+}
+</style>

+ 1 - 1
src/views/system/config/integralConfig.vue

@@ -107,7 +107,7 @@
           </el-form-item>
         </el-col>
         <el-col :span="12">
-          <el-form-item  label="短视频/直播 获得积分" prop="integralFinishVideo">
+          <el-form-item  label="短视频/直播 最低获得积分" prop="integralFinishVideo">
             <el-tooltip class="item" effect="dark" content="每10秒获得最低多少积分" placement="top-end">
               <el-input-number  v-model="form11.integralFinishVideo"   ></el-input-number>
             </el-tooltip>