From 93bfb1c5512db9feceb16cd3084a92d4dedf615e Mon Sep 17 00:00:00 2001
From: zxl <763096477@qq.com>
Date: 星期四, 19 六月 2025 19:58:23 +0800
Subject: [PATCH] 客户管理(详情)

---
 manager/src/views/activity/index.vue | 1746 +++++++++++++++++++++++++++++++++++----------------------
 1 files changed, 1,076 insertions(+), 670 deletions(-)

diff --git a/manager/src/views/activity/index.vue b/manager/src/views/activity/index.vue
index a285ea2..26a2c42 100644
--- a/manager/src/views/activity/index.vue
+++ b/manager/src/views/activity/index.vue
@@ -1,29 +1,30 @@
 <template>
-  <div>
-    <card>
+  <div class="activity-management">
+    <Card>
+      <!-- 鎼滅储琛ㄥ崟 -->
       <Form
         ref="searchForm"
         @keydown.enter.native="handleSearch"
         :model="searchForm"
         inline
-        :label-width="70"
+        :label-width="80"
         class="search-form"
       >
-        <Form-item label="娲诲姩鍚�" prop="activityName">
+        <FormItem label="娲诲姩鍚嶇О" prop="activityName">
           <Input
             type="text"
             v-model="searchForm.activityName"
+            placeholder="璇疯緭鍏ユ椿鍔ㄥ悕绉�"
             clearable
             @on-clear="handleSearch"
-            @on-change="handleSearch"
-            style="width: 160px"
+            style="width: 180px"
           />
-        </Form-item>
-        <Form-item label="娲诲姩绫诲瀷" prop="activityType">
+        </FormItem>
+        <FormItem label="娲诲姩绫诲瀷" prop="activityType">
           <Select
             v-model="searchForm.activityType"
-            style="width:260px"
-            class="custom-select"
+            placeholder="璇烽�夋嫨娲诲姩绫诲瀷"
+            style="width: 180px"
             clearable
             @on-clear="handleSearch"
             @on-change="handleSearch"
@@ -33,97 +34,131 @@
               :value="item.value"
               :key="item.id"
             >
-              {{ item.value }}
+              {{ item.label }}
             </Option>
           </Select>
-        </Form-item>
-        <Form-item label="娲诲姩鎶ュ悕寮�濮嬫椂闂�" prop="reportStartTime">
-          <DatePicker :value="searchForm.reportStartTime"
-                      type="datetime" placeholder="閫夋嫨鏃ユ湡"
-                      @on-change="handleSearch('reportStart',$event)"
-                      @on-clear="handleSearch"
-                      ></DatePicker>
-        </Form-item>
-        <Form-item label="娲诲姩鎶ュ悕缁撴潫鏃堕棿" prop="reportEndTime">
-          <DatePicker :value="searchForm.reportEndTime"
-                      type="datetime" placeholder="閫夋嫨鏃ユ湡"
-                      @on-clear="handleSearch"
-                      @on-change="handleSearch('reportEnd',$event)"></DatePicker>
-        </Form-item>
-<!--        <Form-item label="鐘舵��" prop="status">-->
-<!--          <Input-->
-<!--            type="text"-->
-<!--            v-model="searchForm.status"-->
-<!--            clearable-->
-<!--            @on-clear="handleSearch"-->
-<!--            @on-change="handleSearch"-->
-<!--            style="width: 160px"-->
-<!--          />-->
-<!--        </Form-item>-->
+        </FormItem>
+        <FormItem label="鎶ュ悕寮�濮嬫椂闂�" prop="reportStartTime">
+          <DatePicker
+            :value="searchForm.reportStartTime"
+            type="datetime"
+            placeholder="閫夋嫨寮�濮嬫椂闂�"
+            style="width: 180px"
+            @on-change="handleSearch('reportStart', $event)"
+            @on-clear="handleSearch"
+          ></DatePicker>
+        </FormItem>
+        <FormItem label="鎶ュ悕缁撴潫鏃堕棿" prop="reportEndTime">
+          <DatePicker
+            :value="searchForm.reportEndTime"
+            type="datetime"
+            placeholder="閫夋嫨缁撴潫鏃堕棿"
+            style="width: 180px"
+            @on-clear="handleSearch"
+            @on-change="handleSearch('reportEnd', $event)"
+          ></DatePicker>
+        </FormItem>
         <Button
           @click="handleSearch"
           type="primary"
           icon="ios-search"
           class="search-btn"
-        >鎼滅储</Button
-        >
+        >鎼滅储</Button>
+        <Button
+          @click="resetSearch"
+          icon="md-refresh"
+          style="margin-left: 8px"
+        >閲嶇疆</Button>
       </Form>
-      <Row class="operation padding-row">
-        <Button @click="openAdd" type="info">娣诲姞</Button>
-        <Button @click="delBatch" type="error">鎵归噺鍒犻櫎</Button>
+
+      <!-- 鎿嶄綔鎸夐挳 -->
+      <Row class="operation">
+        <Button @click="openAdd" type="primary" icon="md-add">鏂板娲诲姩</Button>
+        <Button @click="delBatch" type="error" icon="md-trash" :disabled="selectCount === 0">鎵归噺鍒犻櫎</Button>
       </Row>
 
+      <!-- 娲诲姩琛ㄦ牸 -->
       <Table
         :loading="loading"
         border
         :columns="columns"
         :data="activityList"
         ref="table"
-        sortable="custom"
-        @on-sort-change="changeSort"
         @on-selection-change="showSelect"
+        class="activity-table"
       >
-        <template  slot-scope="{ row }" slot="url">
+        <!-- 灏侀潰灞曠ず鎻掓Ы -->
+        <template slot-scope="{ row }" slot="url">
+          <div class="media-container">
             <!-- 鍥剧墖绫诲瀷 -->
-            <template v-if="row.coverType === '鍥剧墖'">
-                <img width="300" height="300"
-                  :src="row.url"
-                  alt="灏侀潰"
-                  class="thumbnail"
-                  @click="previewImage(row.url)"
-                  @error="handleImageError"
-                >
+            <template v-if="row.coverType === 'image'">
+              <img
+                :src="row.url"
+                alt="娲诲姩灏侀潰"
+                class="thumbnail"
+                @click="previewImage(row.url)"
+              >
             </template>
             <!-- 瑙嗛绫诲瀷 -->
-            <template v-else-if="row.coverType === '瑙嗛'">
-                <video width="300"
-                       height="300"
-                  :src="row.url"
-                  class="video-player"
-                  controls
-                  @error="handleVideoError"
-                ></video>
+            <template v-else-if="row.coverType === 'video'">
+              <video
+                :src="row.url"
+                class="video-player"
+                controls
+              ></video>
             </template>
             <!-- 鏂囧瓧绫诲瀷 -->
-            <template v-else-if="row.coverType === text">
-                {{ row.cover || '鏆傛棤鏂囧瓧鍐呭' }}
+            <template v-else>
+              <div class="text-cover">{{ row.cover || '鏆傛棤灏侀潰鍐呭' }}</div>
             </template>
+          </div>
         </template>
-        <template slot-scope="{ row, index }" slot="action">
-          <Button type="info" size="small" style="margin-right: 5px" @click="changeRecommend(row,row.recommend === true ? '鍙栨秷鎺ㄨ崘' : '鎺ㄨ崘')">
-            {{ row.recommend === true ? '鍙栨秷鎺ㄨ崘' : '鎺ㄨ崘' }}
-          </Button>
-          <Button type="info" size="small" style="margin-right: 5px" @click="changeStatus(row,row.status === '宸插彂甯�' ? '涓嬫灦' : '鍙戝竷')">
-            {{ row.status === '宸插彂甯�' ? '涓嬫灦' : '鍙戝竷' }}
-          </Button>
-          <Button type="info" size="small" style="margin-right: 5px" @click="openEdit(row)">缂栬緫鏍囩</Button>
-          <Button type="error" size="small" style="margin-right: 5px" @click="delById(row)">鍒犻櫎</Button>
-          <Button type="info" size="small" style="margin-right: 5px" @click="openMembersModal(row)">
-            鎶ュ悕浜哄憳鍒楄〃
-          </Button>
+
+        <!-- 鎿嶄綔鎸夐挳鎻掓Ы -->
+        <template slot-scope="{ row }" slot="action">
+          <div class="action-btns">
+            <Button
+              type="primary"
+              size="small"
+              @click="changeRecommend(row, row.recommend ? '鍙栨秷鎺ㄨ崘' : '鎺ㄨ崘')"
+              :loading="row.recommendLoading"
+            >
+              {{ row.recommend ? '鍙栨秷鎺ㄨ崘' : '鎺ㄨ崘' }}
+            </Button>
+            <Button
+              type="primary"
+              size="small"
+              @click="changeStatus(row, row.publish ? '涓嬫灦' : '鍙戝竷')"
+              :loading="row.statusLoading"
+            >
+              {{ row.publish  ? '涓嬫灦' : '鍙戝竷' }}
+            </Button>
+            <Button
+              type="info"
+              size="small"
+              @click="detail(row)"
+            >璇︽儏</Button>
+            <Button
+              type="info"
+              size="small"
+              @click="openEdit(row)"
+            >缂栬緫</Button>
+            <Button
+              type="error"
+              size="small"
+              @click="delById(row)"
+            >鍒犻櫎</Button>
+            <Button
+              type="success"
+              size="small"
+              @click="openMembersModal(row)"
+            >鎶ュ悕浜哄憳</Button>
+          </div>
         </template>
       </Table>
-      <Row type="flex" justify="end" class="mt_10">
+
+      <!-- 鍒嗛〉 -->
+      <Row type="flex" justify="end" class="page-footer">
         <Page
           :current="searchForm.pageNumber"
           :total="total"
@@ -138,68 +173,70 @@
         ></Page>
       </Row>
 
-
+      <!-- 娲诲姩缂栬緫/鏂板妯℃�佹 -->
       <Modal
         v-model="modelShow"
         :title="modelTitle"
-        @close="modelClose()"
+        @on-cancel="modelClose"
         width="800"
+        :mask-closable="false"
       >
-        <Form ref="form" :model="activityFrom" :label-width="70" :rules="rules" >
+        <Form ref="form" :model="activityFrom" :label-width="100" :rules="rules">
           <Row :gutter="16">
             <Col span="12">
               <FormItem label="娲诲姩鍚嶇О" prop="activityName">
                 <Input
-                  type="text"
                   v-model="activityFrom.activityName"
+                  placeholder="璇疯緭鍏ユ椿鍔ㄥ悕绉�"
                   clearable
-                  style="width: 300px"
                 />
               </FormItem>
             </Col>
             <Col span="12">
-              <FormItem label="娲诲姩绫诲瀷" prop="activityType" >
+              <FormItem label="娲诲姩绫诲瀷" prop="activityType" :label-width="100">
                 <Select
                   v-model="activityFrom.activityType"
-                  class="custom-select"
+                  placeholder="璇烽�夋嫨娲诲姩绫诲瀷"
                   clearable
-                  style="width: 100px;"
                 >
                   <Option
                     v-for="item in typeSelect"
                     :value="item.value"
                     :key="item.id"
                   >
-                    {{ item.value }}
+                    {{ item.label }}
                   </Option>
                 </Select>
               </FormItem>
             </Col>
             <Col span="12">
               <FormItem label="鎶ュ悕鏃堕棿娈�" prop="reportTime">
-                <DatePicker v-model="activityFrom.reportTime" style="width: 300px"
-                            :value="activityFrom.reportTime"
-                            @on-change="activityFrom.reportTime =$event"
-                            format="yyyy-MM-dd HH:mm:ss"
-                            type="datetimerange"  placeholder="璇烽�夋嫨"></DatePicker>
+                <DatePicker
+                  v-model="activityFrom.reportTime"
+                  type="datetimerange"
+                  format="yyyy-MM-dd HH:mm"
+                  placeholder="璇烽�夋嫨鎶ュ悕鏃堕棿娈�"
+                  style="width: 100%"
+                ></DatePicker>
               </FormItem>
             </Col>
             <Col span="12">
               <FormItem label="娲诲姩鏃堕棿娈�" prop="time">
-                <DatePicker v-model="activityFrom.time" style="width: 300px"
-                            :value="activityFrom.time"
-                            @on-change="activityFrom.time =$event"
-                            format= "yyyy-MM-dd HH:mm:ss"
-                            type="datetimerange"  placeholder="璇烽�夋嫨"></DatePicker>
+                <DatePicker
+                  v-model="activityFrom.time"
+                  type="datetimerange"
+                  format="yyyy-MM-dd HH:mm"
+                  placeholder="璇烽�夋嫨娲诲姩鏃堕棿娈�"
+                  style="width: 100%"
+                ></DatePicker>
               </FormItem>
             </Col>
-            <Col span="24">
-              <FormItem label="灏侀潰" prop="cover">
+            <Col span="12">
+              <FormItem label="灏侀潰绫诲瀷" prop="coverType" :labelWidth="100">
                 <Select
                   v-model="coverType"
-                  class="custom-select"
-                  clearable
-                  style="width: 150px;"
+                  placeholder="璇烽�夋嫨灏侀潰绫诲瀷"
+                  @on-change="handleCoverTypeChange"
                 >
                   <Option
                     v-for="item in coverTypeOptions"
@@ -209,66 +246,86 @@
                     {{ item.value }}
                   </Option>
                 </Select>
-                <template>
-                  <div v-if="coverTypeJudgment('text')">
-                    <template>
-                      <Input
-                        type="text"
-                        v-model="activityFrom.cover"
-                        clearable
-                        style="width: 300px"
-                        placeholder="杈撳叆鏂囨湰鎴栭�夋嫨鏂囦欢"
-                      />
-                    </template>
-                  </div>
-                  <div v-if="coverTypeJudgment('file')">
-                    <Upload
-                      :before-upload="handleBeforeUpload"
-                      action="">
-                      <Button icon="ios-cloud-upload-outline">涓婁紶</Button>
-                    </Upload>
-                    <div v-if="file !== null">
-                      Upload file: {{ file.name }}
-                      <Button type="text" @click="handleRemove" :loading="loadingStatus">
-                        {{ loadingStatus ? '涓婁紶涓�' : '鍒犻櫎' }}
-                      </Button>
-                    </div>
-                  </div>
-                </template>
-            </FormItem>
-            </Col>
-
-
-
-            <Col span="24">
-              <FormItem label="娲诲姩鍐呭" prop="activityContent">
-                <Input v-model="activityFrom.activityContent" type="textarea" :autosize="{minRows: 2,maxRows: 5}" placeholder="杈撳叆" />
               </FormItem>
             </Col>
-          </ROW>
+            <Col span="24" v-if="coverType === '杈撳叆鏂囧瓧灏侀潰'">
+              <FormItem label="灏侀潰鏂囧瓧" prop="cover">
+                <Input
+                  v-model="activityFrom.cover"
+                  type="textarea"
+                  :rows="2"
+                  placeholder="璇疯緭鍏ュ皝闈㈡枃瀛�"
+                  style="width: 50%"
+                />
+              </FormItem>
+            </Col>
+            <Col span="24" v-if="coverType === '閫夋嫨鏂囦欢灏侀潰'">
+              <FormItem label="涓婁紶灏侀潰" prop="cover">
+                <Upload
+                  :before-upload="handleBeforeUpload"
+                  :format="['jpg','jpeg','png','gif','mp4','mov']"
+                  :max-size="20480"
+                  action=""
+                  accept="image/*,video/*"
+                >
+                  <Button icon="ios-cloud-upload-outline">涓婁紶灏侀潰鏂囦欢</Button>
+                  <div class="upload-tip">鏀寔鍥剧墖鎴栬棰戞枃浠讹紝鏈�澶�20MB</div>
+                </Upload>
+                <div v-if="file" class="upload-file-info">
+                  宸查�夋枃浠�: {{ file.name }}
+                  <Button type="text" @click="handleRemove">鍒犻櫎</Button>
+                </div>
+              </FormItem>
+            </Col>
+            <!-- 杩欎袱涓〃鍗曢」鍦ㄥ悓涓�Row鍐咃紝浼氭樉绀哄湪鍚屼竴琛� -->
+            <Col span="12">
+              <FormItem label="浜烘暟闄愬埗" prop="limitUserNum">
+                <InputNumber
+                  v-model="activityFrom.limitUserNum"
+                  :min="1"
+                  placeholder="璇疯緭鍏ユ渶澶т汉鏁�"
+                  style="width: 100%"
+                />
+              </FormItem>
+            </Col>
+            <Col span="12">
+              <FormItem label="娲诲姩鍦扮偣" prop="activityLocation">
+                <Input
+                  v-model="activityFrom.activityLocation"
+                  placeholder="璇疯緭鍏ユ椿鍔ㄥ湴鐐�"
+                />
+              </FormItem>
+            </Col>
+            <Col span="24">
+              <FormItem label="娲诲姩鍐呭锛�" prop="activityContent">
+                <editor ref="editor" @input="getReason" />
+              </FormItem>
+            </Col>
+          </Row>
         </Form>
 
         <div slot="footer">
-          <Button type="text" @click="modelClose">鍙栨秷</Button>
+          <Button @click="modelClose">鍙栨秷</Button>
           <Button type="primary" :loading="submitLoading" @click="saveOrUpdate">鎻愪氦</Button>
         </div>
       </Modal>
 
-
+      <!-- 鎶ュ悕浜哄憳妯℃�佹 -->
       <Modal
         v-model="membersModelShow"
         :title="membersModelTitle"
-        @close="membersModelClose()"
-        width="1000">
+        @on-cancel="membersModelClose"
+        width="1000"
+        class="members-modal"
+      >
         <Table
           :loading="membersLoading"
           border
           :columns="membersColumns"
           :data="membersList"
-          ref="table"
-        >
-        </Table>
-        <Row type="flex" justify="end" class="mt_10">
+          class="members-table"
+        ></Table>
+        <Row type="flex" justify="end" class="page-footer">
           <Page
             :current="memberForm.pageNumber"
             :total="memberTotal"
@@ -284,114 +341,218 @@
         </Row>
       </Modal>
 
+      <Modal
+        v-model="infoModelShow"
+        :title="modelTitle"
+        @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>{{ activityInfo.activityName || '-' }}</span>
+              </div>
+            </Col>
+            <Col span="12">
+              <div class="detail-item">
+                <label>娲诲姩绫诲瀷锛�</label>
+                <span>{{activityInfo.activityType === 'online' ? '绾夸笂':'绾夸笅'}}</span>
+              </div>
+            </Col>
+            <Col span="12">
+              <div class="detail-item">
+                <label>鎶ュ悕鏃堕棿娈碉細</label>
+                <span>{{ activityInfo.reportStartTime }} - {{ activityInfo.reportEndTime }}</span>
+              </div>
+            </Col>
+            <Col span="12">
+              <div class="detail-item">
+                <label>娲诲姩鏃堕棿娈碉細</label>
+                <span>{{ activityInfo.startTime }} - {{ activityInfo.endTime }}</span>
+              </div>
+            </Col>
 
-    </card>
+            <Col span="24" v-if="coverType === '杈撳叆鏂囧瓧灏侀潰'">
+              <div class="detail-item">
+                <label>灏侀潰鏂囧瓧锛�</label>
+                <span>{{ activityInfo.cover || '-' }}</span>
+              </div>
+            </Col>
+            <Col span="24" v-if="coverType === '閫夋嫨鏂囦欢灏侀潰'">
+              <div class="detail-item">
+                <label>涓婁紶灏侀潰锛�</label>
+                <span>{{ activityInfo.cover }}</span>
+              </div>
+            </Col>
+            <Col span="12">
+              <div class="detail-item">
+                <label>浜烘暟闄愬埗锛�</label>
+                <span>{{ activityInfo.limitUserNum || '鏃犻檺鍒�' }}</span>
+              </div>
+            </Col>
+            <Col span="12">
+              <div class="detail-item">
+                <label>娲诲姩鍦扮偣锛�</label>
+                <span>{{ activityInfo.activityLocation || '-' }}</span>
+              </div>
+            </Col>
+            <Col span="24">
+              <div class="detail-item">
+                <label>娲诲姩鍐呭锛�</label>
+                <div
+                  class="activity-content"
+                  v-html="activityInfo.activityContent || '鏃犲唴瀹�'"
+                ></div>
+              </div>
+            </Col>
+          </Row>
+        </div>
+
+        <div slot="footer">
+          <Button @click="infoModelClose">鍏抽棴</Button>
+        </div>
+      </Modal>
+
+
+      <!-- 鍥剧墖棰勮妯℃�佹 -->
+      <Modal v-model="previewVisible" title="鍥剧墖棰勮" footer-hide>
+        <img :src="previewImageUrl" style="width: 100%">
+      </Modal>
+    </Card>
   </div>
 </template>
+
 <script>
-import JsonExcel from "vue-json-excel";
-
-import {getActivityList,addActivity,editActivity,delActivityById,activityChangeStatus,activityChangeRecommend,activityMembersPage} from "@/api/activity.js"
-import {uploadFileByLmk,delByKey,getUrl} from "@/api/common.js"
-
-
+import {
+  getActivityList,
+  addActivity,
+  editActivity,
+  delActivityById,
+  activityChangeStatus,
+  activityChangeRecommend,
+  activityMembersPage
+} from "@/api/activity.js"
+import Editor from '@/components/editor/index.vue'
+import { uploadFileByLmk, delByKey } from "@/api/common.js"
 export default {
-  name:"activity",
-  components:{
-    "download-excel": JsonExcel,
-  },
-  data(){
-    return{
-      loading: false, // 琛ㄥ崟鍔犺浇鐘舵��
-      typeSelect:[
-        {
-          id:1,
-          value:'绾夸笂'
-        },
-        {
-          id:2,
-          value:'绾夸笅'
-        }
-      ],
-      coverTypeOptions:[
-        {
-          id:1,
-          value: '杈撳叆鏂囧瓧灏侀潰'
-        },
-        {
-          id:2,
-          value: '閫夋嫨鏂囦欢灏侀潰'
-        },
-      ],
-      membersLoading:false, //鍙傚姞娲诲姩浜哄憳琛ㄥ崟
-      membersModelTitle:'',
-      membersModelShow:false,
-      membersList:[],
-      membersColumns: [
-        {
-          type: 'selection',
-          width: 60,
-          align: 'center'
-        },
-        {
-          title:'鐢ㄦ埛鍚�',
-          key: 'username',
-          minWidth: 60,
-          tooltip: true,
-        },
-        {
-          title:'鏄电О',
-          key: 'nickName',
-          minWidth: 60,
-          tooltip: true,
-        },
-        {
-          title:'鎬у埆',
-          key: 'sex',
-          tooltip: true,
-          render: (h, params) => {
-            const sexText = params.row.sex === 1 ? '鐢�' : '濂�';
-            return h('span', sexText);
-          }
-        },
-        {
-          title:'鍦板潃',
-          key: 'region',
-          minWidth: 60,
-          tooltip: true,
-        },
-        {
-          title:'鐘舵��',
-          key: 'disabled',
-          tooltip: true,
-          render: (h, params) => {
-            const sexText = params.row.disabled === true ? '绂佺敤' : '姝e父';
-            return h('span', sexText);
-          }
-        },
-      ],
-      memberForm:{
-        id:'',
-        pageNumber: 1, // 褰撳墠椤垫暟
-        pageSize: 10, // 椤甸潰澶у皬
-      },
-      memberTotal:0,
+  name: "ActivityManagement",
+  components: {Editor},
+  data() {
+    return {
+      infoModelShow:false,
 
-      coverType:'',
-      //鏌ヨ娲诲姩鍒楄〃璇锋眰鍙傛暟
-      searchForm:{
-        activityName:'',// 娲诲姩鍚嶇О
-        activityType:'',// 娲诲姩绫诲瀷
-        recommend:'',// 鎺ㄨ崘
-        reportStartTime:'',// 娲诲姩鎶ュ悕鏃堕棿
-        reportEndTime:'',// 娲诲姩缁撴潫鏃堕棿
-        pageNumber: 1, // 褰撳墠椤垫暟
-        pageSize: 10, // 椤甸潰澶у皬
+      loading: false,
+      membersLoading: false,
+      submitLoading: false,
+
+      // 鎼滅储琛ㄥ崟
+      searchForm: {
+        activityName: '',
+        activityType: '',
+        reportStartTime: '',
+        reportEndTime: '',
+        pageNumber: 1,
+        pageSize: 10
       },
 
+      // 娲诲姩鍒楄〃鏁版嵁
+      activityList: [],
+      total: 0,
+      selectList: [],
+      selectCount: 0,
 
+      // 娲诲姩绫诲瀷閫夐」
+      typeSelect: [
+        { id: 1, value: 'online',label:'绾夸笂' },
+        { id: 2, value: 'offline',label:'绾夸笅' }
+      ],
 
-      //娲诲姩鍒楄〃琛ㄥご
+      // 灏侀潰绫诲瀷閫夐」
+      coverTypeOptions: [
+        { id: 1, value: '杈撳叆鏂囧瓧灏侀潰' },
+        { id: 2, value: '閫夋嫨鏂囦欢灏侀潰' }
+      ],
+      coverType: '',
+      file: null,
+
+      // 娲诲姩琛ㄥ崟
+      activityFrom: {
+        id: '',
+        activityName: '',
+        activityType: '',
+        reportTime: [],
+        time: [],
+        activityContent: '',
+        cover: '',
+        coverType: '',
+        status: '',
+        reportStartTime: '',
+        reportEndTime: '',
+        startTime: '',
+        endTime: '',
+        recommend: false,
+        limitUserNum: 0,
+        activityLocation: '',
+      },
+      activityInfo: {
+        id: '',
+        activityName: '',
+        activityType: '',
+        reportTime: [],
+        time: [],
+        activityContent: '',
+        cover: '',
+        coverType: '',
+        status: '',
+        reportStartTime: '',
+        reportEndTime: '',
+        startTime: '',
+        endTime: '',
+        recommend: false,
+        limitUserNum: 0,
+        activityLocation: '',
+      },
+
+      // 琛ㄥ崟楠岃瘉瑙勫垯
+      rules: {
+        activityName: [
+          { required: true, message: '璇疯緭鍏ユ椿鍔ㄥ悕绉�', trigger: 'blur' },
+          { max: 50, message: '闀垮害涓嶈兘瓒呰繃50涓瓧绗�', trigger: 'blur' }
+        ],
+        activityType: [
+          { required: true, message: '璇烽�夋嫨娲诲姩绫诲瀷', trigger: 'change' }
+        ],
+        reportTime: [
+          { type: 'array', required: true, message: '璇烽�夋嫨鎶ュ悕鏃堕棿娈�', trigger: 'change' },
+          { validator: this.validateReportTime, trigger: 'change' }
+        ],
+        time: [
+          { type: 'array', required: true, message: '璇烽�夋嫨娲诲姩鏃堕棿娈�', trigger: 'change' },
+          { validator: this.validateActivityTime, trigger: 'change' }
+        ],
+        cover: [
+          { required: true, message: '璇疯緭鍏ュ皝闈㈠唴瀹�', trigger: 'blur' }
+        ],
+        coverType: [
+          { required: true, message: '璇烽�夋嫨灏侀潰绫诲瀷', trigger: 'blur' }
+        ],
+        limitUserNum: [
+          { required: true, type: 'number', message: '璇疯緭鍏ヤ汉鏁伴檺鍒�', trigger: 'blur' },
+          { type: 'number', min: 1, message: '浜烘暟涓嶈兘灏戜簬1浜�', trigger: 'blur' }
+        ],
+        activityLocation: [
+          { required: true, message: '璇疯緭鍏ユ椿鍔ㄥ湴鐐�', trigger: 'blur' },
+          { max: 100, message: '闀垮害涓嶈兘瓒呰繃100涓瓧绗�', trigger: 'blur' }
+        ],
+        activityContent: [
+          { required: true, message: '璇疯緭鍏ユ椿鍔ㄥ唴瀹�', trigger: 'blur' }
+        ]
+      },
+
+      // 琛ㄦ牸鍒楅厤缃�
       columns: [
         {
           type: 'selection',
@@ -399,519 +560,764 @@
           align: 'center'
         },
         {
-          title:'娲诲姩鍚�',
+          title: '娲诲姩鍚嶇О',
           key: 'activityName',
-          minWidth: 60,
-          tooltip: true,
+          minWidth: 120,
+          tooltip: true
         },
         {
-          title:'娲诲姩绫诲瀷',
+          title: '娲诲姩绫诲瀷',
           key: 'activityType',
-          tooltip: true,
-        },
-        // {
-        //   title:'鐘舵��',
-        //   key: 'status',
-        //   tooltip: true,
-        // },
-        {
-          title:'鎺ㄨ崘',
-          key: 'recommend',
-
-          tooltip: true,
+          width: 100,
+          align: 'center',
           render: (h, params) => {
-            const sexText = params.row.recommend === true ? '鏄�' : '鍚�';
-            return h('span', sexText);
+            return h('Tag', {
+            }, params.row.activityType === 'online' ? '绾夸笂' : '绾夸笅')
           }
         },
         {
-          title:'娲诲姩鎶ュ悕寮�濮嬫椂闂�',
-          key: 'reportStartTime',
-          minWidth: 60,
-          tooltip: true,
+          title: '鎺ㄨ崘',
+          key: 'recommend',
+          width: 80,
+          align: 'center',
+          render: (h, params) => {
+            return h('Tag', {
+              props: {
+                color: params.row.recommend ? 'green' : 'default'
+              }
+            }, params.row.recommend ? '鏄�' : '鍚�')
+          }
         },
         {
-          title:'娲诲姩鎶ュ悕缁撴潫鏃堕棿',
-          key: 'reportEndTime',
-          minWidth: 60,
-          tooltip: true,
+          title: '鍙戝竷',
+          key: 'publish',
+          width: 100,
+          align: 'center',
+          render: (h, params) => {
+            return h('Tag', {
+              props: {
+                color: params.row.publish ? 'green' : 'default'
+              }
+            }, params.row.publish ? '宸插彂甯�' : '鏈彂甯�')
+          }
         },
         {
-          title:'娲诲姩寮�濮嬫椂闂�',
-          key: 'reportEndTime',
-          minWidth: 60,
-          tooltip: true,
+          title: '鐘舵��',
+          key: 'status',
+          width: 100,
+          align: 'center',
+          render: (h, params) => {
+            const status = params.row.status;
+            const statusMap = {
+              'noStart': { text: '鏈紑濮�', color: 'default' },
+              'report': { text: '鎶ュ悕涓�', color: 'green' },
+              'inProgress':{ text:'杩涜涓�',color:'cyan'},
+              'end': { text: '宸茬粨鏉�', color: 'red' }
+            };
+            const currentStatus = statusMap[status] || { text: status, color: 'default' };
+            return h('Tag', {
+              props: {
+                color: currentStatus.color
+              }
+            }, currentStatus.text);
+          }
         },
         {
-          title:'娲诲姩缁撴潫鏃堕棿',
-          key: 'reportEndTime',
-          minWidth: 60,
-          tooltip: true,
+          title: '娲诲姩鏃堕棿娈�',
+          key: 'activityTimeRange',
+          width: 300,
+          render: (h, params) => {
+            return h('div', [
+              h('div', `寮�濮�: ${this.formatDate(params.row.startTime)}`),
+              h('div', `缁撴潫: ${this.formatDate(params.row.endTime)}`)
+            ])
+          }
         },
         {
-          title:'灏侀潰',
+          title: '灏侀潰',
           key: 'url',
-          slot:"url",
-          minWidth: 400,
-          tooltip: true,
+          slot: 'url',
+          width: 150,
+          align: 'center'
         },
         {
-          title:'灏侀潰绫诲瀷',
+          title: '灏侀潰绫诲瀷',
           key: 'coverType',
-          tooltip: true,
+          width: 100,
+          align: 'center',
+          render: (h, params) => {
+            const typeMap = {
+              text: '鏂囨湰',
+              video: '瑙嗛',
+              image: '鍥剧墖'
+            };
+            const text = typeMap[params.row.coverType] || params.row.coverType;
+            return h('span', text);
+          }
         },
         {
-          title:'鏈�澶ф姤鍚嶄汉鏁伴檺鍒�',
+          title: '浜烘暟闄愬埗',
           key: 'limitUserNum',
-          tooltip: true,
+          width: 100,
+          align: 'center'
         },
         {
-          title:'娲诲姩鍦扮偣',
+          title: '娲诲姩鍦扮偣',
           key: 'activityLocation',
-          tooltip: true,
-        },
-        {
-          title:'娲诲姩璇︾粏鍐呭',
-          key: 'activityContent',
-          tooltip: true,
+          minWidth: 120,
+          tooltip: true
         },
         {
           title: '鎿嶄綔',
-          key: 'action',
           slot: 'action',
-          minWidth: 100,
-          align: 'center'
+          width: 280,
+          align: 'center',
+          fixed: 'right'
         }
-
       ],
-      //娲诲姩鍒楄〃鏁版嵁
-      activityList:[],
-      total:0,
-      selectCount: 0, // 宸查�夋暟閲�
-      selectList: [], // 宸查�夋暟鎹垪琛�
 
-      //娲诲姩瀵硅瘽妗�---
-
-      modelShow:false,
-      submitLoading:false,
-      modelTitle:'',
-      activityFrom:{
-        id:'',
-        activityName:'',
-        activityType:'',
-        reportTime:[],
-        time:[],
-        activityContent:'', // 娲诲姩鍐呭
-        cover:'', //image/2025052014565362541.jpg
-        coverType:'',
-        status:'', //娲诲姩鐘舵��
-        reportStartTime:'',
-        reportEndTime:'',
-        startTime:'',
-        endTime:'',
-        recommend:'',
-
-        // 鎶ュ悕鏉′欢
-        // 鎶ュ悕璐圭敤
+      // 鎶ュ悕浜哄憳鐩稿叧
+      membersModelShow: false,
+      membersModelTitle: '',
+      membersList: [],
+      memberForm: {
+        id: '',
+        pageNumber: 1,
+        pageSize: 10
       },
-
-      rules: {
-        activityName: {required: true, message: "娲诲姩鍚嶇О", trigger: "blur"},
-        activityType: {required: true, message: "娲诲姩绫诲瀷", trigger: "blur"},
-        reportTime: [{type: 'array',
-          required: true,
-          message: "鎶ュ悕鏃ユ湡", trigger: "change"
+      memberTotal: 0,
+      membersColumns: [
+        {
+          type: 'selection',
+          width: 60,
+          align: 'center'
         },
-          {
-            validator: (rule, value, callback) => {
-              // 鑾峰彇娲诲姩鏃堕棿锛堥�氳繃闂寘璁块棶琛ㄥ崟鏁版嵁锛�
-              const activityTime = this.activityFrom.time;
-
-              // 瑙f瀽鏃堕棿锛堝寮哄仴澹�э級
-              const parseTime = (timeStr) => {
-                const date = new Date(timeStr);
-                return isNaN(date.getTime()) ? NaN : date.getTime();
-              };
-
-              const reportStart = parseTime(value[0]);
-              const reportEnd = parseTime(value[1]);
-              const activityStart = parseTime(activityTime[0]);
-              const activityEnd = parseTime(activityTime[1]);
-              // 鏍稿績楠岃瘉閫昏緫
-              if (reportStart > activityStart || reportEnd > activityStart) {
-                callback(new Error('鎶ュ悕鏃堕棿娈靛繀椤诲湪娲诲姩寮�濮嬫椂闂村墠'));
-              } else {
-                callback();
+        {
+          title: '鐢ㄦ埛鍚�',
+          key: 'username',
+          minWidth: 100
+        },
+        {
+          title: '鏄电О',
+          key: 'nickName',
+          minWidth: 100
+        },
+        {
+          title: '鎬у埆',
+          key: 'sex',
+          width: 80,
+          render: (h, params) => {
+            return h('Tag', {
+              props: {
+                color: params.row.sex === 1 ? 'blue' : 'magenta'
               }
-            },
-            trigger: 'change'
+            }, params.row.sex === 1 ? '鐢�' : '濂�')
           }
-        ],
-        // time: [{type: 'array',
-        //   required: true,
-        //   fields: {
-        //     0: {type: 'date', required: true, message: '璇烽�夋嫨璧锋鏃ユ湡'},
-        //     1: {type: 'date', required: true, message: '璇烽�夋嫨璧锋鏃ユ湡'}
-        //   }
-        // }],
-        time: [{type: 'array',
-          required: true,
-          message: "娲诲姩鏃ユ湡", trigger: "change"
-        }],
-        activityContent: {required: true, message: "娲诲姩鍐呭", trigger: "blur"},
-        cover: {required: true, message: "灏侀潰", trigger: "blur"},
-      },
-      // 涓婁紶
-      file: null,
-      loadingStatus: false,
-      text:'鏂囧瓧',
+        },
+        {
+          title: '鍦板尯',
+          key: 'region',
+          minWidth: 120
+        },
+        {
+          title: '鐘舵��',
+          key: 'disabled',
+          width: 100,
+          render: (h, params) => {
+            return h('Tag', {
+              props: {
+                color: params.row.disabled ? 'red' : 'green'
+              }
+            }, params.row.disabled ? '绂佺敤' : '姝e父')
+          }
+        }
+      ],
+
+      // 鍥剧墖棰勮
+      previewVisible: false,
+      previewImageUrl: '',
+
+      // 妯℃�佹鎺у埗
+      modelShow: false,
+      modelTitle: ''
     }
   },
-  mounted(){
-    this.init();
+  mounted() {
+    this.init()
   },
-  methods:{
-    activityMembersPage(){
-      this.membersLoading = true;
-      activityMembersPage(this.memberForm).then(res =>{
-        this.membersLoading = false;
-        if (res.code === 200){
-          this.membersList = res.data;
-          this.memberTotal = res.total;
-        }
-      });
+  methods: {
+    detail(row){
+      this.modelTitle = '娲诲姩璇︽儏'
+      this.infoModelShow = true
+      this.activityInfo = row
     },
-    openMembersModal(row){
-      this.memberForm.id = row.id
-      this.membersModelTitle = "鎶ュ悕浜哄憳"
-      this.membersModelShow = true;
-      this.activityMembersPage();
+    // 鑾峰彇瀵屾枃鏈紪杈戝櫒鐨勫唴瀹�
+    getReason(content) {
+      this.activityFrom.activityContent = content
     },
-    membersModelClose(){
-      this.membersModelShow = false;
+    // 鍒濆鍖栨暟鎹�
+    init() {
+      this.getActivityList()
     },
 
-    changeRecommend(row,recommend){
-      const form = {
-        ...this.activityFrom
-      };
-      form.id = row.id;
-      if (recommend === "鍙栨秷鎺ㄨ崘"){
-        form.recommend = false
-      }else if (recommend ==="鎺ㄨ崘"){
-        form.recommend = true
-      }
-
-      activityChangeRecommend(form).then(res =>{
-        if (res.code === 200){
-          this.getActivityList();
-        }
-      })
-    },
-    changeStatus(row,status){
-      const form = {
-        ...this.activityFrom
-      };
-      form.id = row.id;
-      if (status === "鍙戝竷"){
-        form.status = "宸插彂甯�"
-      }else if (status ==="涓嬫灦"){
-        form.status = "宸蹭笅鏋�"
-      }
-
-      activityChangeStatus(form).then(res =>{
-        if (res.code === 200){
-          this.getActivityList();
-        }
-      })
-    },
-    coverTypeJudgment(type){
-      if (this.coverType === '杈撳叆鏂囧瓧灏侀潰' && type === 'text'){
-        this.activityFrom.coverType = this.text;
-        return true;
-      }
-      if (this.coverType === '閫夋嫨鏂囦欢灏侀潰' && type === 'file'){
-        return true;
-      }
-      return false
-    },
-    //鑷姩涓婁紶 false
-    handleBeforeUpload (file) {
-      const fileCategory = this.getFileCategory(file.type);
-      console.log('鏂囦欢鍒嗙被:', fileCategory); // 杈撳嚭锛氬浘鐗�/瑙嗛/鏂囨。 绛�
-      // 2. 浣犵殑鍏朵粬閫昏緫锛堝绫诲瀷楠岃瘉锛�
-      if (fileCategory === '鏈煡') {
-        this.$Message.error('涓嶆敮鎸佺殑鏂囦欢绫诲瀷');
-        return false;
-      }
-      this.file = file;
-      this.activityFrom.coverType = fileCategory;
-      this.upload();
-      return false
-    },
-    getFileCategory(mimeType) {
-      // MIME绫诲瀷鍓嶇紑鏄犲皠琛�
-      const mimeMap = {
-        'jpg' : '鍥剧墖',
-        'image': '鍥剧墖',    // image/jpeg, image/png 绛�
-        'video': '瑙嗛',    // video/mp4, video/quicktime 绛�
-        'audio': '闊抽',    // audio/mpeg, audio/wav 绛�
-        'application': '鏂囨。' // application/pdf, application/msword 绛�
-      };
-
-      // 鑾峰彇绫诲瀷鍓嶇紑锛堝 image/png 鈫� image锛�
-      const typePrefix = mimeType.split('/')[0];
-
-      // 杩斿洖瀵瑰簲鍒嗙被鎴栨湭鐭�
-      return mimeMap[typePrefix] || '鏈煡';
-    },
-
-    //涓婁紶鍥剧墖鎺ュ彛
-    upload () {
-      this.submitLoading = true;
-      this.loadingStatus = true;
-      const formData = new FormData()
-      formData.append('file', this.file)
-      uploadFileByLmk(formData).then(res =>{
-        this.loadingStatus = false;
-        this.submitLoading = false;
-        if (res.code === 200){
-          this.activityFrom.cover = res.data.fileKey;
-          this.$Message.success(res.msg)
-        }
-      })
-    },
-    handleRemove(){
-        this.file = null
-        this.loadingStatus = true;
-        delByKey(this.activityFrom.cover).then(res =>{
-          this.loadingStatus = false;
-          if (res.code === 200){
-            this.activityFrom.cover = null;
-          }
-        })
-
-    },
-
-    // 鑾峰緱瀹㈡埛琛ㄦ牸淇℃伅
-    getActivityList(){
-      this.loading = true;
-      getActivityList(this.searchForm).then(res =>{
-        this.loading = false;
+    // 鑾峰彇娲诲姩鍒楄〃
+    getActivityList() {
+      this.loading = true
+      getActivityList(this.searchForm).then(res => {
+        this.loading = false
         if (res.code === 200) {
-          this.activityList = res.data;
-          this.total = res.total;
+          // 涓烘瘡涓�琛屾坊鍔爈oading鐘舵��
+          this.activityList = res.data.map(item => ({
+            ...item,
+            recommendLoading: false,
+            statusLoading: false
+          }))
+          this.total = res.total
         }
+      }).catch(() => {
+        this.loading = false
       })
     },
-    init(){
-      this.getActivityList();
-    },
-    changeSort(){
 
+    // 鎼滅储娲诲姩
+    handleSearch(type, value) {
+      if (type === 'reportStart') {
+        this.searchForm.reportStartTime = value
+      } else if (type === 'reportEnd') {
+        this.searchForm.reportEndTime = value
+      }
+
+      this.searchForm.pageNumber = 1
+      this.getActivityList()
     },
-    showSelect(){
-      this.selectList = e.map(d => d.id);
-      this.selectCount = e.length;
+
+    // 閲嶇疆鎼滅储
+    resetSearch() {
+      this.$refs.searchForm.resetFields()
+      this.searchForm.pageNumber = 1
+      this.getActivityList()
     },
-    //
-    openEdit(row){
-      console.log(row)
+
+    // 鏀瑰彉椤电爜
+    changePage(page) {
+      this.searchForm.pageNumber = page
+      this.getActivityList()
+    },
+
+    // 鏀瑰彉姣忛〉鏉℃暟
+    changePageSize(pageSize) {
+      this.searchForm.pageNumber = 1
+      this.searchForm.pageSize = pageSize
+      this.getActivityList()
+    },
+
+    // 琛ㄦ牸閫夋嫨鍙樺寲
+    showSelect(selection) {
+      this.selectList = selection.map(item => item.id)
+      this.selectCount = selection.length
+    },
+
+    // 鎵撳紑鏂板妯℃�佹
+    openAdd() {
+      this.modelTitle = '鏂板娲诲姩'
       this.modelShow = true
-      this.modelTitle = "缂栬緫娲诲姩"
-
-      this.activityFrom.id = row.id;
-      this.activityFrom.activityName = row.activityName;
-      this.activityFrom.activityType = row.activityType;
-      this.activityFrom.activityContent = row.activityContent;
-      // this.activityFrom.cover = row.cover;
-      //鍒ゆ柇灏侀潰绫诲瀷璧嬪�肩粰鍓嶇
-      if (row.coverType === this.text){
-        this.coverType = '杈撳叆鏂囧瓧灏侀潰'
-        this.activityFrom.cover = row.cover
-        this.activityFrom.coverType = row.coverType
-      }else{
-        this.coverType = '閫夋嫨鏂囦欢灏侀潰'
-        this.activityFrom.cover = row.cover
-        this.activityFrom.coverType = row.coverType
-      }
-
-      //杞崲鏍煎紡
-      this.activityFrom.reportTime=
-        this.formatDate(new Date(row.reportStartTime))+' - '+ this.formatDate(new Date(row.reportEndTime));
-     //杞寲鏍煎紡
-      this.activityFrom.time =
-        this.formatDate(new Date(row.startTime))+' - '+ this.formatDate(new Date(row.endTime));
+      this.coverType = '杈撳叆鏂囧瓧灏侀潰'
+      this.file = null
+      this.$refs.form.resetFields()
+      this.activityFrom.id = ''
     },
-    validateDateTime(dateTimeString) {
-      const dateTimeRegex = /^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]) ([01]\d|2[0-3]):[0-5]\d:[0-5]\d$/;
-      return dateTimeRegex.test(dateTimeString);
-    },
-    saveOrUpdate(){
-      //鍒ゆ柇姝e垯鏍煎紡 锛屽叏閮ㄨ浆鎹㈡垚鏈湴鏃堕棿 骞朵笖杞崲涓烘寚瀹氭牸寮�
-      if (!this.validateDateTime(this.activityFrom.reportTime[0])){
-        this.activityFrom.reportStartTime = this.formatDate(this.activityFrom.reportTime[0]);
-      }else {
-        this.activityFrom.reportStartTime = this.activityFrom.reportTime[0]
-      }
-      if (!this.validateDateTime(this.activityFrom.reportTime[1])){
-        this.activityFrom.reportEndTime =this.formatDate(this.activityFrom.reportTime[1]);
-      }else {
-        this.activityFrom.reportEndTime = this.activityFrom.reportTime[1]
-      }
-      if (!this.validateDateTime(this.activityFrom.time[0])){
-        this.activityFrom.startTime = this.formatDate(this.activityFrom.time[0]);
-      }else {
-        this.activityFrom.startTime = this.activityFrom.time[0]
-      }
-      if (!this.validateDateTime(this.activityFrom.time[1])){
-        this.activityFrom.endTime = this.formatDate(this.activityFrom.time[1]);
-      }else {
-        this.activityFrom.endTime = this.activityFrom.time[1]
-      }
 
+    // 鎵撳紑缂栬緫妯℃�佹
+    openEdit(row) {
+      this.modelTitle = '缂栬緫娲诲姩'
+      this.modelShow = true
+      this.$nextTick(() => {
+        this.$refs.form.resetFields()
+        // 濉厖琛ㄥ崟鏁版嵁
+        this.activityFrom = {
+          id: row.id,
+          activityName: row.activityName,
+          activityType: row.activityType,
+          reportTime: [
+            this.formatDate(row.reportStartTime, 'YYYY-MM-DD HH:mm:ss'),
+            this.formatDate(row.reportEndTime, 'YYYY-MM-DD HH:mm:ss')
+          ],
+          time: [
+            this.formatDate(row.startTime, 'YYYY-MM-DD HH:mm:ss'),
+            this.formatDate(row.endTime, 'YYYY-MM-DD HH:mm:ss')
+          ],
+          activityContent: row.activityContent,
+          cover: row.cover,
+          coverType: row.coverType,
+          status: row.status,
+          reportStartTime: row.reportStartTime,
+          reportEndTime: row.reportEndTime,
+          startTime: row.startTime,
+          endTime: row.endTime,
+          recommend: row.recommend,
+          limitUserNum: row.limitUserNum,
+          activityLocation: row.activityLocation
+        }
+        this.$refs.editor.setContent(this.activityFrom.activityLocation)
+        // 璁剧疆灏侀潰绫诲瀷
+        this.coverType = row.coverType === 'text' ? '杈撳叆鏂囧瓧灏侀潰' : '閫夋嫨鏂囦欢灏侀潰'
+      })
+    },
+    infoModelClose(){
+      this.infoModelShow = false
+    },
+    // 鍏抽棴妯℃�佹
+    modelClose() {
+      this.modelShow = false
+      this.file = null
+      this.submitLoading = false
+      this.handleRemove();
+      this.$refs.form.resetFields()
+    },
+
+    // 淇濆瓨鎴栨洿鏂版椿鍔�
+    saveOrUpdate() {
+      // 璁剧疆灏侀潰绫诲瀷
+      this.activityFrom.coverType = this.coverType === '杈撳叆鏂囧瓧灏侀潰' ? '鏂囧瓧' :
+        this.file ? this.getFileCategory(this.file.type) :
+          this.activityFrom.coverType
       this.$refs.form.validate(valid => {
         if (valid) {
           this.submitLoading = true
-          if (this.activityFrom.id) {
-            editActivity(this.activityFrom).then(res =>{
-              if (res.code === 200) {
-                this.$Message.success(res.msg)
-                this.modelClose();
-                this.getActivityList();
-              }
-            })
-          }else {
-            addActivity(this.activityFrom).then(res => {
-              if (res.code === 200) {
-                this.$Message.success(res.msg)
-                this.modelClose();
-                this.getActivityList();
-              }
-            })
 
+          // 澶勭悊鏃堕棿鏁版嵁
+          if (this.activityFrom.reportTime && this.activityFrom.reportTime.length === 2) {
+            this.activityFrom.reportStartTime =  this.formatDate(this.activityFrom.reportTime[0], 'YYYY-MM-DD HH:mm:ss')
+            this.activityFrom.reportEndTime =  this.formatDate(this.activityFrom.reportTime[1], 'YYYY-MM-DD HH:mm:ss')
           }
-        }
-      });
-    },
-    formatDate(date) {
-      if (date !== null && date !== undefined  && date !== ''){
-        const year = date.getFullYear();
-        const month = String(date.getMonth() + 1).padStart(2, '0'); // 琛ラ浂
-        const day = String(date.getDate()).padStart(2, '0');
-        const hour = String(date.getHours()).padStart(2, '0');
-        const minutes = String(date.getMinutes()).padStart(2, '0');
-        const second = String(date.getSeconds()).padStart(2, '0');
-        return `${year}-${month}-${day} ${hour}:${minutes}:${second}`;
-      }
-      return null
-    },
-    // 鎼滅储
-    handleSearch(type,$event){
-      if(type === 'reportStart'){
-        this.searchForm.reportStartTime = $event;
-      }else if(type === 'reportEnd'){
-        this.searchForm.reportEndTime = $event;
-      }
 
-      this.searchForm.pageNumber = 1;
-      this.searchForm.pageSize = 10;
-      this.getActivityList();
+          if (this.activityFrom.time && this.activityFrom.time.length === 2) {
+            this.activityFrom.startTime = this.formatDate(this.activityFrom.time[0], 'YYYY-MM-DD HH:mm:ss')
+            this.activityFrom.endTime =  this.formatDate(this.activityFrom.time[1], 'YYYY-MM-DD HH:mm:ss')
+          }
+
+          const api = this.activityFrom.id ? editActivity : addActivity
+          api(this.activityFrom).then(res => {
+            this.submitLoading = false
+            if (res.code === 200) {
+              this.$Message.success(res.msg)
+              this.modelClose()
+              this.getActivityList()
+            }
+          }).catch(() => {
+            this.submitLoading = false
+          })
+        }
+      })
     },
-    // 鍏抽棴寮圭獥
-    modelClose() {
-      this.file = null
-      this.submitLoading = false
-      this.modelShow = false
-      this.coverType = null
-      this.$refs.form.resetFields()
-    },
-    openAdd(){
-      this.modelTitle = "鏂板娲诲姩"
-      this.modelShow = true
-    },
-    // 鍒犻櫎
-    delById(row){
-      delActivityById(row.id).then(res =>{
-        if (res.code === 200){
-          this.$Message.success(res.msg)
-          this.getActivityList();
+
+    // 鍒犻櫎娲诲姩
+    delById(row) {
+      this.$Modal.confirm({
+        title: '纭鍒犻櫎',
+        content: `纭畾瑕佸垹闄ゆ椿鍔� "${row.activityName}" 鍚�?`,
+        onOk: () => {
+          delActivityById(row.id).then(res => {
+            if (res.code === 200) {
+              this.$Message.success(res.msg)
+              this.getActivityList()
+            }
+          })
         }
       })
     },
 
     // 鎵归噺鍒犻櫎
-    delBatch(){
-      if (this.selectCount <= 0) {
-        this.$Message.warning("鎮ㄨ繕鏈�夋嫨瑕佸垹闄ょ殑鏁版嵁");
+    delBatch() {
+      if (this.selectCount === 0) {
+        this.$Message.warning('璇疯嚦灏戦�夋嫨涓�鏉℃暟鎹�')
+        return
+      }
+
+      this.$Modal.confirm({
+        title: '纭鍒犻櫎',
+        content: `纭畾瑕佸垹闄ら�変腑鐨� ${this.selectCount} 鏉℃暟鎹悧?`,
+        onOk: () => {
+          delActivityBatch({ ids: this.selectList }).then(res => {
+            if (res.code === 200) {
+              this.$Message.success(res.msg)
+              this.selectList = []
+              this.selectCount = 0
+              this.getActivityList()
+            } else {
+              this.$Message.error(res.msg || '鍒犻櫎澶辫触')
+            }
+          })
+        }
+      })
+    },
+
+    // 鏀瑰彉鎺ㄨ崘鐘舵��
+    changeRecommend(row, action) {
+      row.recommendLoading = true
+      const recommend = action === '鎺ㄨ崘'
+
+      activityChangeRecommend({
+        id: row.id,
+        recommend: recommend
+      }).then(res => {
+        row.recommendLoading = false
+        if (res.code === 200) {
+          this.$Message.success(res.msg)
+          row.recommend = recommend
+        }
+      }).catch(() => {
+        row.recommendLoading = false
+      })
+    },
+
+    // 鏀瑰彉娲诲姩鐘舵��
+    changeStatus(row, action) {
+      row.statusLoading = true
+      const publish = action === '鍙戝竷'
+
+      activityChangeStatus({
+        id: row.id,
+        publish: publish
+      }).then(res => {
+        row.statusLoading = false
+        if (res.code === 200) {
+          this.$Message.success(res.msg)
+          row.publish = publish
+        }
+      }).catch(() => {
+        row.statusLoading = false
+      })
+    },
+
+    // 鎵撳紑鎶ュ悕浜哄憳妯℃�佹
+    openMembersModal(row) {
+      this.membersModelTitle = `${row.activityName} - 鎶ュ悕浜哄憳`
+      this.membersModelShow = true
+      this.memberForm.id = row.id
+      this.memberForm.pageNumber = 1
+      this.activityMembersPage()
+    },
+
+    // 鑾峰彇鎶ュ悕浜哄憳鍒楄〃
+    activityMembersPage() {
+      this.membersLoading = true
+      activityMembersPage(this.memberForm).then(res => {
+        this.membersLoading = false
+        if (res.code === 200) {
+          this.membersList = res.data
+          this.memberTotal = res.total
+        }
+      }).catch(() => {
+        this.membersLoading = false
+      })
+    },
+
+    // 鏀瑰彉鎶ュ悕浜哄憳椤电爜
+    memberChangePage(page) {
+      this.memberForm.pageNumber = page
+      this.activityMembersPage()
+    },
+
+    // 鏀瑰彉鎶ュ悕浜哄憳姣忛〉鏉℃暟
+    memberChangePageSize(pageSize) {
+      this.memberForm.pageNumber = 1
+      this.memberForm.pageSize = pageSize
+      this.activityMembersPage()
+    },
+
+    // 鍏抽棴鎶ュ悕浜哄憳妯℃�佹
+    membersModelClose() {
+      this.membersModelShow = false
+    },
+
+    // 灏侀潰绫诲瀷鍙樺寲澶勭悊
+    handleCoverTypeChange(type) {
+      if (type === '閫夋嫨鏂囦欢灏侀潰') {
+        this.activityFrom.cover = ''
+      } else {
+        this.file = null
+      }
+    },
+
+    // 鏂囦欢涓婁紶鍓嶅鐞�
+    handleBeforeUpload(file) {
+      const fileType = file.type
+      const isImage = fileType.includes('image')
+      const isVideo = fileType.includes('video')
+
+      if (!isImage && !isVideo) {
+        this.$Message.error('璇蜂笂浼犲浘鐗囨垨瑙嗛鏂囦欢')
+        return false
+      }
+
+      if (file.size > 20 * 1024 * 1024) {
+        this.$Message.error('鏂囦欢澶у皬涓嶈兘瓒呰繃20MB')
+        return false
+      }
+
+      this.file = file
+      this.uploadFile()
+      return false
+    },
+
+    // 涓婁紶鏂囦欢
+    uploadFile() {
+      if (!this.file) return
+
+      this.submitLoading = true
+      const formData = new FormData()
+      formData.append('file', this.file)
+
+      uploadFileByLmk(formData).then(res => {
+        this.submitLoading = false
+        if (res.code === 200) {
+          this.activityFrom.cover = res.data.fileKey
+          this.$Message.success('涓婁紶鎴愬姛')
+        }
+      }).catch(() => {
+        this.submitLoading = false
+      })
+    },
+
+    // 鍒犻櫎鏂囦欢
+    handleRemove() {
+      //鐐瑰嚮鍏抽棴绐楀彛鏃剁‘淇濇枃浠跺凡琚竻闄�
+      if(this.file === null){
         return;
       }
-      this.$Modal.confirm({
-        title: "纭鍒犻櫎",
-        content: "鎮ㄧ‘璁よ鍒犻櫎鎵�閫夌殑 " + this.selectCount + " 鏉℃暟鎹�?",
-        loading: true,
-        onOk: () => {
-
+      if (!this.activityFrom.cover) {
+        this.file = null
+        return
+      }
+      delByKey(this.activityFrom.cover).then(res => {
+        if (res.code === 200) {
+          this.file = null
+          this.activityFrom.cover = ''
         }
-      });
+      })
     },
-    // 椤电爜
-    changePage(v){
-      this.searchForm.pageNumber = v
-      this.getActivityList()
-    },
-    // 淇敼size
-    changePageSize(v){
-      this.searchForm.pageNumber = 1;
-      this.searchForm.pageSize = v;
-      this.getActivityList()
-    },
-    memberChangePage(v){
-      this.memberForm.pageNumber = v
-      this.activityMembersPage();
-    },
-    // 淇敼size
-    memberChangePageSize(v){
-      this.memberForm.pageNumber = 1;
-      this.memberForm.pageSize = v;
-      this.activityMembersPage();
-    },
-    handleImageError(){
 
+    // 棰勮鍥剧墖
+    previewImage(url) {
+      this.previewImageUrl = url
+      this.previewVisible = true
     },
-    handleVideoError(){
 
+    // 鑾峰彇鏂囦欢鍒嗙被
+    getFileCategory(mimeType) {
+      const typeMap = {
+        'image': 'image',
+        'video': 'video',
+        'audio': 'audio',
+        'application': 'application'
+      }
+
+      const typePrefix = mimeType.split('/')[0]
+      return typeMap[typePrefix] || 'unknown'
     },
-    previewImage(){
 
+    // 鏍煎紡鍖栨棩鏈�
+    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);
+    },
+
+    // 楠岃瘉鎶ュ悕鏃堕棿
+    validateReportTime(rule, value, callback) {
+      if (!value || value.length !== 2) {
+        callback(new Error('璇烽�夋嫨瀹屾暣鐨勬姤鍚嶆椂闂存'))
+        return
+      }
+
+      const [start, end] = value
+      if (new Date(start) >= new Date(end)) {
+        callback(new Error('鎶ュ悕缁撴潫鏃堕棿蹇呴』鏅氫簬寮�濮嬫椂闂�'))
+        return
+      }
+
+      if (this.activityFrom.time && this.activityFrom.time.length === 2) {
+        const activityStart = this.activityFrom.time[0]
+        if (new Date(end) > new Date(activityStart)) {
+          callback(new Error('鎶ュ悕缁撴潫鏃堕棿涓嶈兘鏅氫簬娲诲姩寮�濮嬫椂闂�'))
+          return
+        }
+      }
+
+      callback()
+    },
+
+    // 楠岃瘉娲诲姩鏃堕棿
+    validateActivityTime(rule, value, callback) {
+      if (!value || value.length !== 2) {
+        callback(new Error('璇烽�夋嫨瀹屾暣鐨勬椿鍔ㄦ椂闂存'))
+        return
+      }
+
+      const [start, end] = value
+      if (new Date(start) >= new Date(end)) {
+        callback(new Error('娲诲姩缁撴潫鏃堕棿蹇呴』鏅氫簬寮�濮嬫椂闂�'))
+        return
+      }
+
+      if (this.activityFrom.reportTime && this.activityFrom.reportTime.length === 2) {
+        const reportEnd = this.activityFrom.reportTime[1]
+        if (new Date(reportEnd) > new Date(start)) {
+          callback(new Error('娲诲姩寮�濮嬫椂闂村繀椤绘櫄浜庢姤鍚嶇粨鏉熸椂闂�'))
+          return
+        }
+      }
+
+      callback()
     }
   }
 }
 </script>
+
 <style lang="scss" scoped>
-.export {
-  margin: 10px 20px 10px 0;
-}
-.export-excel-wrapper {
-  display: inline;
-}
-.order-tab {
-  width: 950px;
-  height: 36px;
-  display: flex;
-  align-items: center;
-  justify-content: space-between;
-  background-color: #f0f0f0;
-  padding: 0 10px;
-  margin-bottom: 10px;
-  div {
-    text-align: center;
-    padding: 4px 12px;
+.activity-management {
+  .search-form {
+    padding: 16px;
+    background: #f8f8f9;
     border-radius: 4px;
-    cursor: pointer;
+    margin-bottom: 16px;
+
+    .ivu-form-item {
+      margin-bottom: 16px;
+      margin-right: 16px;
+    }
+
+    .search-btn {
+      margin-left: 8px;
+    }
   }
-  .current {
-    background-color: #ffffff;
+
+  .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;
+      }
+    }
+  }
+
+  .page-footer {
+    margin-top: 16px;
+    padding: 8px 0;
+  }
+
+  .members-modal {
+    .members-table {
+      margin-bottom: 16px;
+    }
+  }
+
+  .upload-file-info {
+    margin-top: 8px;
+    padding: 8px;
+    background: #f8f8f9;
+    border-radius: 4px;
+  }
+
+  .upload-tip {
+    font-size: 12px;
+    color: #999;
+    margin-top: 4px;
+  }
+}
+.detail-container {
+  padding: 16px;
+}
+
+.detail-item {
+  margin-bottom: 18px;
+  line-height: 1.5;
+
+  label {
+    display: inline-block;
+    width: 100px;
+    color: #666;
+    font-weight: bold;
+    vertical-align: top;
+  }
+
+  span {
+    display: inline-block;
+    width: calc(100% - 110px);
+  }
+}
+
+.activity-content {
+  border: 1px solid #dcdee2;
+  border-radius: 4px;
+  padding: 12px;
+  min-height: 100px;
+  margin-top: 8px;
 }
 </style>

--
Gitblit v1.8.0