From cd24728b34f86f552b0270791f26fdbe9051b994 Mon Sep 17 00:00:00 2001
From: zxl <763096477@qq.com>
Date: 星期五, 15 八月 2025 15:28:33 +0800
Subject: [PATCH] 抽奖活动

---
 manager/src/api/activity-prize.js          |   35 ++
 manager/src/views/activity-prize/index.vue |  830 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 865 insertions(+), 0 deletions(-)

diff --git a/manager/src/api/activity-prize.js b/manager/src/api/activity-prize.js
new file mode 100644
index 0000000..e0bfcab
--- /dev/null
+++ b/manager/src/api/activity-prize.js
@@ -0,0 +1,35 @@
+import service from "../libs/axios";
+
+export const getPage = (params) =>{
+  return service({
+    url: "/lmk/activity-prize",
+    method: "GET",
+    params: params
+  })
+}
+export const detail = (params) =>{
+  return service({
+    url: "/lmk/activity-prize/" +params,
+    method: "GET",
+  })
+}
+export const edit = (params) =>{
+  return service({
+    url: "/lmk/activity-prize",
+    method: "PUT",
+    data: params
+  })
+}
+export const add = (params) =>{
+  return service({
+    url: "/lmk/activity-prize",
+    method: "POST",
+    data: params
+  })
+}
+export const del = (params) =>{
+  return service({
+    url: "/lmk/activity-prize/" +params,
+    method: "DELETE",
+  })
+}
diff --git a/manager/src/views/activity-prize/index.vue b/manager/src/views/activity-prize/index.vue
new file mode 100644
index 0000000..d29b7aa
--- /dev/null
+++ b/manager/src/views/activity-prize/index.vue
@@ -0,0 +1,830 @@
+<template>
+  <div>
+    <Card>
+      <!-- 鎼滅储琛ㄥ崟 -->
+      <Form
+        ref="searchForm"
+        @keydown.enter.native="handleSearch"
+        :model="searchForm"
+        inline
+        :label-width="80"
+        class="search-form"
+      >
+        <FormItem label="娲诲姩鍚嶇О" prop="activityName">
+          <Input
+            type="text"
+            v-model="searchForm.activityName"
+            placeholder="璇疯緭鍏ユ椿鍔ㄥ悕绉�"
+            clearable
+            @on-clear="handleSearch"
+            style="width: 180px"
+          />
+        </FormItem>
+        <FormItem label="鎶ュ悕寮�濮嬫椂闂�" prop="beginTime">
+          <DatePicker
+            :value="searchForm.beginTime"
+            type="datetime"
+            placeholder="閫夋嫨寮�濮嬫椂闂�"
+            style="width: 180px"
+            value-format="YYYY-MM-DD HH:mm:ss"
+            @on-change="handleSearch('beginTime', $event)"
+            @on-clear="handleSearch"
+          ></DatePicker>
+        </FormItem>
+        <FormItem label="鎶ュ悕缁撴潫鏃堕棿" prop="endTime">
+          <DatePicker
+            value-format="YYYY-MM-DD HH:mm:ss"
+            :value="searchForm.endTime"
+            type="datetime"
+            placeholder="閫夋嫨缁撴潫鏃堕棿"
+            style="width: 180px"
+            @on-clear="handleSearch"
+            @on-change="handleSearch('endTime', $event)"
+          ></DatePicker>
+        </FormItem>
+        <Button
+          @click="handleSearch"
+          type="primary"
+          icon="ios-search"
+          class="search-btn"
+        >鎼滅储</Button>
+        <Button
+          @click="resetSearch"
+          icon="md-refresh"
+          style="margin-left: 8px"
+        >閲嶇疆</Button>
+      </Form>
+
+      <!-- 鎿嶄綔鎸夐挳 -->
+      <Row class="operation">
+        <Button @click="openAdd" type="primary" icon="md-add">鏂板鎶藉娲诲姩</Button>
+      </Row>
+
+      <!-- 娲诲姩琛ㄦ牸 -->
+      <Table
+        :loading="loading"
+        border
+        :columns="columns"
+        :data="activityList"
+        ref="table"
+        class="activity-table"
+      >
+        <!-- 鎿嶄綔鎸夐挳鎻掓Ы -->
+        <template slot-scope="{ row }" slot="action">
+          <div class="action-btns">
+            <Button
+              type="primary"
+              size="small"
+              @click="changeStatus(row, row.enableStatus === 'on' ? '鍏抽棴' : '寮�鍚�')"
+              :loading="row.statusLoading"
+            >
+              {{row.enableStatus === 'on' ? '鍏抽棴' : '寮�鍚�'}}
+            </Button>
+            <Button
+              type="info"
+              size="small"
+              @click="detail(row)"
+            >璇︽儏</Button>
+            <Button
+              type="info"
+              size="small"
+              @click="setPrize(row)"
+            >濂栧搧璁剧疆</Button>
+            <Button
+              type="info"
+              size="small"
+              @click="openEdit(row)"
+            >缂栬緫</Button>
+            <Button
+              type="error"
+              size="small"
+              @click="delById(row)"
+            >鍒犻櫎</Button>
+
+          </div>
+        </template>
+      </Table>
+
+      <!-- 鍒嗛〉 -->
+      <Row type="flex" justify="end" class="page-footer">
+        <Page
+          :current="searchForm.pageNumber"
+          :total="total"
+          :page-size="searchForm.pageSize"
+          @on-change="changePage"
+          @on-page-size-change="changePageSize"
+          :page-size-opts="[10, 20, 50]"
+          size="small"
+          show-total
+          show-elevator
+          show-sizer
+        ></Page>
+      </Row>
+
+      <!-- 娲诲姩缂栬緫/鏂板妯℃�佹 -->
+      <Modal
+        v-model="modelShow"
+        :title="modelTitle"
+        @on-cancel="modelClose"
+        width="800"
+        :mask-closable="false"
+      >
+        <Form ref="form" :model="activityFrom" :label-width="100" :rules="rules" >
+          <Row :gutter="16">
+            <Col span="12">
+              <FormItem label="娲诲姩鍚嶇О" prop="activityName">
+                <Input
+                  v-model="activityFrom.activityName"
+                  placeholder="璇疯緭鍏ユ椿鍔ㄥ悕绉�"
+                  clearable
+                />
+              </FormItem>
+            </Col>
+            <Col span="12">
+              <FormItem label="娲诲姩鎻忚堪" prop="activityDes" :label-width="100">
+                <Input v-model="activityFrom.activityDes" type="textarea" :autosize="{minRows: 2,maxRows: 5}" placeholder="璇疯緭鍏�"></Input>
+              </FormItem>
+            </Col>
+            <Col span="12">
+              <FormItem label="寮�濮嬫椂闂�" prop="beginTime">
+                <DatePicker
+                  v-model="activityFrom.beginTime"
+                  type="datetime"
+                  placeholder="閫夋嫨寮�濮嬫椂闂�"
+                  style="width: 180px"
+                ></DatePicker>
+              </FormItem>
+            </Col>
+            <Col span="12">
+              <FormItem label="缁撴潫鏃堕棿" prop="endTime">
+                <DatePicker
+                  v-model="activityFrom.endTime"
+                  type="datetime"
+                  placeholder="璇烽�夋嫨缁撴潫鏃堕棿"
+                  style="width: 180px"
+                ></DatePicker>
+              </FormItem>
+            </Col>
+            <Col span="12">
+              <FormItem label="姣忔棩鏈�澶ф娊濂栦笂闄�" prop="maxPrize">
+                <InputNumber
+                  v-model="activityFrom.maxPrize"
+                  :min="1"
+                  placeholder="璇疯緭鍏ユ瘡鏃ユ渶澶ф娊濂栦笂闄�"
+                  style="width: 180px"
+                />
+              </FormItem>
+            </Col>
+            <Col span="12">
+              <FormItem label="鍒濆鍖栨娊濂栨鏁�" prop="prizeNum" >
+                <InputNumber
+                  :min="1"
+                  v-model="activityFrom.prizeNum"
+                  placeholder="璇疯緭鍏ュ垵濮嬪寲鎶藉娆℃暟"
+                  style="width: 180px"
+                />
+              </FormItem>
+            </Col>
+            <Col span="24">
+              <FormItem label="娲诲姩鍥剧墖锛�" prop="activityImg">
+                <Upload
+                  :before-upload="(file) => handleBeforeUpload(file, 'content')"
+                  :format="['jpg','jpeg','png','gif']"
+                  :max-size="20480"
+                  action=""
+                  accept="image/*"
+                >
+                  <Button icon="ios-cloud-upload-outline">涓婁紶灏侀潰鍥剧墖</Button>
+                  <div class="upload-tip">鏀寔鍥剧墖锛屾渶澶�20MB</div>
+                </Upload>
+                <div v-if="activityImg" class="upload-file-info">
+                  <p>宸查�夋枃浠�: {{ activityImg.name }}</p>
+                  <img :src="activityImg.activityImgUrl" alt="娲诲姩鍥剧墖" style="max-width: 100%; max-height: 200px;">
+                  <Button type="text" @click="handleRemove('content')">鍒犻櫎</Button>
+                </div>
+
+                <!-- 鍩轰簬elementUi鐨勪笂浼犵粍浠� el-upload end-->
+              </FormItem>
+            </Col>
+            <Col span="24">
+              <FormItem label="娲诲姩灏侀潰锛�" prop="activityCover">
+                <Upload
+                  :before-upload="(file) => handleBeforeUpload(file, 'cover')"
+                  :format="['jpg','jpeg','png','gif']"
+                  :max-size="20480"
+                  action=""
+                  accept="image/*"
+                >
+                  <Button icon="ios-cloud-upload-outline">涓婁紶灏侀潰鍥剧墖</Button>
+                  <div class="upload-tip">鏀寔鍥剧墖锛屾渶澶�20MB</div>
+                </Upload>
+                <div v-if="activityCover" class="upload-file-info">
+                  <p>宸查�夋枃浠�: {{ activityCover.name }}</p>
+                  <img :src="activityCover.activityCoverUrl" alt="娲诲姩鍥剧墖" style="max-width: 100%; max-height: 200px;">
+                  <Button type="text" @click="handleRemove('cover')">鍒犻櫎</Button>
+                </div>
+
+                <!-- 鍩轰簬elementUi鐨勪笂浼犵粍浠� el-upload end-->
+              </FormItem>
+            </Col>
+          </Row>
+        </Form>
+
+        <div slot="footer">
+          <Button @click="modelClose">鍙栨秷</Button>
+          <Button type="primary" :loading="submitLoading" @click="saveOrUpdate">鎻愪氦</Button>
+        </div>
+      </Modal>
+      <!-- 璇︽儏-->
+      <Modal
+        v-model="infoModalShow"
+        title="娲诲姩璇︽儏"
+        @on-cancel="infoModelClose"
+        width="800"
+        :mask-closable="false"
+      >
+        <div class="detail-container">
+        <Row :gutter="16">
+          <Col span="12">
+            <div class="detail-item">
+              <label>娲诲姩鍚嶇О锛�</label>
+              <span>{{ detailData.activityName }}</span>
+            </div>
+          </Col>
+          <Col span="12">
+            <div class="detail-item">
+              <label>娲诲姩鎻忚堪锛�</label>
+              <span>{{ detailData.activityDes}}</span>
+            </div>
+          </Col>
+          <Col span="12">
+            <div class="detail-item">
+              <label>寮�濮嬫椂闂达細</label>
+              <span>{{ formatDate(detailData.beginTime) }}</span>
+            </div>
+          </Col>
+          <Col span="12">
+            <div class="detail-item">
+              <label>缁撴潫鏃堕棿锛�</label>
+              <span>{{ formatDate(detailData.endTime) }}</span>
+            </div>
+          </Col>
+          <Col span="12">
+            <div class="detail-item">
+              <label>姣忔棩鏈�澶ф娊濂栦笂闄愶細</label>
+              <span>{{ detailData.maxPrize || '0' }}</span>
+            </div>
+          </Col>
+          <Col span="12">
+            <div class="detail-item">
+              <label>鍒濆鍖栨娊濂栨鏁帮細</label>
+              <span>{{ detailData.prizeNum || '0' }}</span>
+            </div>
+          </Col>
+          <Col span="24">
+            <div class="detail-item">
+              <label>娲诲姩鐘舵�侊細</label>
+              <Tag :color="detailData.enableStatus === 'on' ? 'success' : 'default'">
+                {{ detailData.enableStatus === 'on' ? '宸插惎鐢�' : '鏈惎鐢�' }}
+              </Tag>
+            </div>
+          </Col>
+          <Col span="24">
+            <div class="detail-item">
+              <label>娲诲姩鍥剧墖锛�</label>
+              <div v-if="detailData.activityImg" class="detail-image">
+                <img :src="detailData.activityImg" alt="娲诲姩鍥剧墖" style="max-width: 100%; max-height: 200px;">
+              </div>
+              <span v-else>-</span>
+            </div>
+          </Col>
+          <Col span="24">
+            <div class="detail-item">
+              <label>娲诲姩灏侀潰锛�</label>
+              <div v-if="detailData.activityCover" class="detail-image">
+                <img
+                  :src="detailData.activityCover" alt="娲诲姩灏侀潰"
+                  style="max-width: 100%; max-height: 200px;"
+                >
+              </div>
+              <span v-else>-</span>
+            </div>
+          </Col>
+          <Col span="24">
+            <div class="detail-item">
+              <label>濂栧搧锛�</label>
+            </div>
+          </Col>
+        </Row>
+      </div>
+
+      </Modal>
+    </Card>
+  </div>
+</template>
+
+<script>
+import {
+  getPage,
+  detail,
+  edit,
+  add,
+  del
+} from '@/api/activity-prize.js'
+import {delByKey, uploadFileByLmk} from "../../api/common";
+
+export default {
+  name: "activityPrize",
+
+  data() {
+    return {
+      infoModalShow:false,
+      detailData: {},
+      modelShow:false,
+      modelTitle:'',
+      rules: {
+        activityDes:[
+          { required: true, message: '璇疯緭鍏ユ椿鍔ㄦ弿杩�', trigger: 'blur' },
+          { max: 100, message: '闀垮害涓嶈兘瓒呰繃100涓瓧绗�', trigger: 'blur' }
+        ],
+        activityName: [
+          { required: true, message: '璇疯緭鍏ユ椿鍔ㄥ悕绉�', trigger: 'blur' },
+          { max: 50, message: '闀垮害涓嶈兘瓒呰繃50涓瓧绗�', trigger: 'blur' }
+        ],
+        beginTime: [
+          { type:'date',required: true, message: '璇烽�夋嫨寮�濮嬫椂闂�', trigger: 'change'},
+          {
+            trigger: ['change' ],
+            validator: this.validateBeginTime
+          }
+        ],
+        endTime: [
+          { type:'date',required: true, message: '璇烽�夋嫨缁撴潫鏃堕棿', trigger: 'change'},
+
+          {  trigger: ['change'] ,
+            validator: this.validateEndTime
+          }
+        ],
+        maxPrize: [
+          {required: true, type: 'number', message: '璇疯緭鍏ユ瘡鏃ユ渶澶ф娊濂栦笂闄�', trigger: 'blur'},
+          {type: 'number', min: 1, message: '蹇呴』澶т簬0', trigger: 'blur'}
+        ],
+        prizeNum: [
+          {required: true, type: 'number', message: '璇疯緭鍏ュ垵濮嬪寲鎶藉娆℃暟', trigger: 'blur'},
+          {type: 'number', min: 1, message: '蹇呴』澶т簬0', trigger: 'blur'}
+        ],
+        activityCover: [
+          {required: true, message: '璇烽�夋嫨娲诲姩灏侀潰', trigger: 'blur'}
+        ],
+        activityImg: [
+          {required: true, message: '璇烽�夋嫨娲诲姩鍥剧墖', trigger: 'blur'}
+        ],
+      },
+      activityFrom:{
+        id:'',
+        activityName:'',
+        activityDes:'',
+        beginTime:'',
+        endTime:'',
+        maxPrize:0,
+        prizeNum:0,
+        activityImg:'',
+        activityCover:'',
+        enableStatus:'off'
+      },
+      loading:false,
+      columns:[
+        {
+          title: '娲诲姩鍚嶇О',
+          key: 'activityName',
+          minWidth: 100,
+        },
+        {
+          title: '娲诲姩鎻忚堪',
+          key: 'activityDes',
+          minWidth: 100,
+        },
+        {
+          title: '寮�濮嬫椂闂�',
+          key: 'beginTime',
+          minWidth: 100,
+          render: (h, params) => {
+            return h('div', [
+              h('div', this.formatDate(params.row.beginTime)),
+            ])
+          }
+        },
+        {
+          title: '缁撴潫鏃堕棿',
+          key: 'endTime',
+          minWidth: 100,
+          render: (h, params) => {
+            return h('div', [
+              h('div', this.formatDate(params.row.endTime)),
+            ])
+          }
+        },
+        {
+          title: '姣忔棩鏈�澶ф娊濂栦笂闄�',
+          key: 'maxPrize',
+          minWidth: 100,
+        },
+        {
+          title: '鍒濆鍖栨娊濂栨鏁�',
+          key: 'prizeNum',
+          minWidth: 100,
+        },
+        {
+          title: '鏄惁寮�鍚椿鍔�',
+          key: 'enableStatus',
+          minWidth: 100,
+          render: (h, params) => {
+            return h('Tag', {
+              props: {
+                color: params.row.enableStatus  === 'on' ? 'green' : 'default'
+              }
+            }, params.row.enableStatus === 'on' ? '寮�鍚�' : '鍏抽棴')
+          }
+        },
+        {
+          title: '鎿嶄綔',
+          slot: 'action',
+          width: 280,
+          align: 'center',
+          fixed: 'right'
+        },
+      ],
+      activityList:[],
+      total:0,
+      searchForm:{
+        pageSize:10,
+        pageNumber:1,
+        activityName:'',
+        endTime:'',
+        beginTime:'',
+
+      },
+      submitLoading:false,
+      activityCover:null,
+      activityImg:null,
+    }
+  },
+  // 鍦ㄧ粍浠跺垱寤哄墠娉ㄥ唽
+  beforeCreate() {
+
+  },
+  mounted() {
+    this.init();
+  },
+  methods: {
+    validateBeginTime(rule, value, callback) {
+      console.log("瑙﹀彂楠岃瘉")
+      // 鏍¢獙蹇呭~
+      if (!value) {
+        return callback(new Error('璇烽�夋嫨寮�濮嬫椂闂�')); // 鉁� 姝g‘鎻愮ず
+      }
+      console.log("琛ㄥ崟寮�濮嬮獙璇佸紑濮嬫椂闂�")
+      console.log(value)
+      console.log(this.activityFrom.beginTime)
+      // 鏍¢獙寮�濮嬫椂闂翠笉鑳芥櫄浜庣粨鏉熸椂闂�
+      if (new Date(this.activityFrom.beginTime) > new Date(this.activityFrom.endTime) ) {
+        return callback(new Error('寮�濮嬫椂闂翠笉鑳芥櫄浜庣粨鏉熸椂闂�'));
+      }
+      callback(); // 楠岃瘉閫氳繃
+    },
+    validateEndTime(rule, value, callback) {
+      // 鏍¢獙蹇呭~
+      if (!value) {
+        return callback(new Error('璇烽�夋嫨缁撴潫鏃堕棿')); // 鉁� 姝g‘鎻愮ず
+      }
+      // 鏍¢獙缁撴潫鏃堕棿涓嶈兘鏃╀簬寮�濮嬫椂闂�
+      if (new Date(this.activityFrom.endTime) < new Date(this.activityFrom.beginTime)) {
+        return callback(new Error('缁撴潫鏃堕棿涓嶈兘鏃╀簬寮�濮嬫椂闂�'));
+      }
+      callback(); // 楠岃瘉閫氳繃
+    },
+    setPrize(row){
+
+    },
+    formatDate(date, format = 'YYYY-MM-DD HH:mm:ss') {
+      if (!date) return '';
+
+      const d = new Date(date);
+      if (isNaN(d.getTime())) return '';
+
+      const padZero = (num) => String(num).padStart(2, '0'); // 鏇村彲闈犵殑琛ラ浂鏂规硶
+
+      const year = d.getFullYear();
+      const month = padZero(d.getMonth() + 1); // 鏈堜唤 0-11 鈫� +1
+      const day = padZero(d.getDate());
+      const hours = padZero(d.getHours());
+      const minutes = padZero(d.getMinutes());
+      const seconds = padZero(d.getSeconds());
+      return format
+        .replace('YYYY', year)
+        .replace('MM', month)
+        .replace('DD', day)
+        .replace('HH', hours)
+        .replace('mm', minutes)
+        .replace('ss', seconds);
+    },
+    resetSearch(){
+      this.$refs.searchForm.resetFields()
+      this.searchForm.pageNumber = 1
+      this.getPage()
+    },
+    handleBeforeUpload(file,type){
+      if ("content" === type){
+        this.activityImg = file
+        this.submitLoading = true
+        const formData = new FormData()
+        formData.append('file', this.activityImg)
+
+        uploadFileByLmk(formData).then(res => {
+          this.submitLoading = false
+          if (res.code === 200) {
+            this.activityFrom.activityImg = res.data.fileKey;
+            this.activityImg.activityImgUrl = res.data.url;
+            this.$Message.success('涓婁紶鎴愬姛')
+          }else{
+            this.$Message.error(res.msg)
+          }
+        }).catch(() => {
+          this.submitLoading = false
+        })
+      }else if ("cover" === type){
+        this.activityCover = file
+        this.submitLoading = true
+        const formData = new FormData()
+        formData.append('file', this.activityCover)
+
+        uploadFileByLmk(formData).then(res => {
+          this.submitLoading = false
+          if (res.code === 200) {
+            this.activityFrom.activityCover = res.data.fileKey
+            this.activityCover.activityCoverUrl = res.data.url;
+            this.$Message.success('涓婁紶鎴愬姛')
+          }else{
+            this.$Message.error(res.msg)
+          }
+        }).catch(() => {
+          this.submitLoading = false
+        })
+      }
+
+
+    },
+    // 鍒犻櫎鏂囦欢
+    handleRemove(type) {
+      if ("content" === type){
+        //鐐瑰嚮鍏抽棴绐楀彛鏃剁‘淇濇枃浠跺凡琚竻闄�
+        if (this.activityImg === null) {
+          return;
+        }
+        if (!this.activityFrom.activityImg) {
+          this.activityImg = null
+          return
+        }
+        delByKey(this.activityFrom.activityImg).then(res => {
+          if (res.code === 200) {
+            this.activityImg = null
+            this.activityFrom.activityImg = ''
+          }else{
+            this.$Message.error(res.msg)
+          }
+        })
+      }else if ("cover" === type){
+        if (this.activityCover === null) {
+          return;
+        }
+        if (!this.activityFrom.activityCover) {
+          this.activityCover = null
+          return
+        }
+        delByKey(this.activityFrom.activityCover).then(res => {
+          if (res.code === 200) {
+            this.activityCover = null
+            this.activityFrom.activityCover = ''
+          }else{
+            this.$Message.error(res.msg)
+          }
+        })
+      }
+
+
+
+    },
+    saveOrUpdate(){
+      const submitData = {
+        ...this.activityFrom,
+        beginTime: this.formatDate(this.activityFrom.beginTime, 'YYYY-MM-DD HH:mm:ss'),
+        endTime: this.formatDate(this.activityFrom.endTime, 'YYYY-MM-DD HH:mm:ss')
+      };
+      console.log(submitData)
+      this.$refs.form.validate(valid => {
+        if (valid) {
+          this.submitLoading = true
+          const api = this.activityFrom.id ? edit : add
+          api(submitData).then(res => {
+            this.submitLoading = false
+            if (res.code === 200) {
+              this.$Message.success(res.msg)
+              this.modelClose()
+              this.getPage()
+            }else{
+              this.$Message.error(res.msg)
+            }
+          }).catch(() => {
+            this.submitLoading = false
+          })
+        }
+      })
+    },
+    infoModelClose(){
+      this.infoModalShow = false;
+    },
+    modelClose(){
+      this.modelShow = false
+      this.submitLoading = false
+      this.handleRemove("content");
+      this.handleRemove("cover");
+      this.$refs.form.resetFields()
+    },
+    getPage(){
+      this.loading = true;
+      getPage(this.searchForm).then(res =>{
+        this.loading = false;
+        if (res.code === 200){
+          this.activityList = res.data;
+        }else {
+          this.$Message.error(res.msg)
+        }
+      })
+    },
+    detail(row){
+      this.infoModalShow = true;
+      this.detailData = {...row};
+    },
+    openEdit(row){
+      this.modelShow = true;
+      this.modelTitle = "缂栬緫娲诲姩";
+      this.activityFrom= {
+        id:row.id,
+        activityName:row.activityName,
+        activityDes:row.activityDes,
+        beginTime:this.formatDate(row.beginTime, 'YYYY-MM-DD HH:mm:ss'),
+        endTime: this.formatDate(row.endTime, 'YYYY-MM-DD HH:mm:ss'),
+        maxPrize:row.maxPrize,
+        prizeNum:row.prizeNum,
+        activityImg:row.activityImg,
+        activityCover:row.activityCover,
+        enableStatus:row.enableStatus,
+      }
+    },
+
+    handleSearch(type,value){
+      if (type === 'beginTime') {
+        this.searchForm.beginTime = value
+      } else if (type === 'endTime') {
+        this.searchForm.endTime = value
+      }
+      this.getPage()
+    },
+    openAdd(){
+      this.modelShow = true;
+      this.modelTitle = "鏂板娲诲姩";
+    },
+    delById(row){
+      del(row.id).then(res=>{
+        if (res.code === 200){
+          this.$Message.success(res.msg)
+        }else {
+          this.$Message.error(res.msg)
+        }
+        this.getPage()
+      })
+    },
+    // 鑾峰彇瀵屾枃鏈紪杈戝櫒鐨勫唴瀹�
+    // 鍒濆鍖栨暟鎹�
+    init() {
+      this.getPage()
+    },
+    changePage(){
+      this.searchForm.pageNumber = 1
+      this.searchForm.pageSize = pageSize
+      this.getPage()
+    },
+    changePageSize(){
+      this.searchForm.pageNumber = page
+      this.getPage()
+    },
+    changeStatus(){
+
+    },
+
+  },
+}
+</script>
+
+<style lang="scss" scoped>
+.detail-container {
+  padding: 16px;
+}
+
+.detail-item {
+  margin-bottom: 16px;
+  line-height: 1.5;
+}
+
+.detail-item label {
+  display: inline-block;
+  width: 120px;
+  font-weight: bold;
+  color: #515a6e;
+  vertical-align: top;
+}
+
+.detail-item span {
+  display: inline-block;
+  max-width: calc(100% - 120px);
+}
+
+.detail-image {
+  display: inline-block;
+  margin-top: 8px;
+  border: 1px dashed #dcdee2;
+  padding: 4px;
+  border-radius: 4px;
+  background: #f8f8f9;
+}
+.search-form {
+  padding: 16px;
+  background: #f8f8f9;
+  border-radius: 4px;
+  margin-bottom: 16px;
+
+  .ivu-form-item {
+    margin-bottom: 16px;
+    margin-right: 16px;
+  }
+
+  .search-btn {
+    margin-left: 8px;
+  }
+}
+.operation {
+  margin-bottom: 16px;
+
+  .ivu-btn {
+    margin-right: 8px;
+  }
+}
+.activity-table {
+  .media-container {
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    height: 100px;
+
+    .thumbnail {
+      max-width: 100%;
+      max-height: 100%;
+      object-fit: contain;
+      cursor: pointer;
+      transition: all 0.3s;
+
+      &:hover {
+        transform: scale(1.05);
+        box-shadow: 0 0 8px rgba(0, 0, 0, 0.2);
+      }
+    }
+
+    .video-player {
+      max-width: 100%;
+      max-height: 100px;
+      background: #000;
+    }
+
+    .text-cover {
+      padding: 8px;
+      background: #f8f8f9;
+      border-radius: 4px;
+      max-width: 100%;
+      word-break: break-all;
+    }
+  }
+
+  .action-btns {
+    display: flex;
+    flex-wrap: wrap;
+    justify-content: center;
+
+    .ivu-btn {
+      margin: 4px;
+      font-size: 12px;
+      padding: 2px 6px;
+      min-width: 60px;
+    }
+  }
+}
+</style>

--
Gitblit v1.8.0