From a01523ab9ba314c0eb933160f331de1bca02084e Mon Sep 17 00:00:00 2001
From: peng <peng.com>
Date: 星期一, 23 六月 2025 14:16:50 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev' into dev

---
 manager/src/views/activity/index.vue |  139 +++++++++++++++++++++++
 manager/src/api/customer.js          |    6 +
 manager/src/views/customer/index.vue |  173 ++++++++++++++++++++++++++++
 3 files changed, 315 insertions(+), 3 deletions(-)

diff --git a/manager/src/api/customer.js b/manager/src/api/customer.js
index 9128455..9972185 100644
--- a/manager/src/api/customer.js
+++ b/manager/src/api/customer.js
@@ -78,3 +78,9 @@
   })
 }
 
+export const getCustomerInfo= (params) =>{
+  return service({
+    url: '/customerManager/'+ params,
+    method: 'GET'
+  })
+}
diff --git a/manager/src/views/activity/index.vue b/manager/src/views/activity/index.vue
index b1f49f2..26a2c42 100644
--- a/manager/src/views/activity/index.vue
+++ b/manager/src/views/activity/index.vue
@@ -136,6 +136,11 @@
             <Button
               type="info"
               size="small"
+              @click="detail(row)"
+            >璇︽儏</Button>
+            <Button
+              type="info"
+              size="small"
               @click="openEdit(row)"
             >缂栬緫</Button>
             <Button
@@ -336,6 +341,82 @@
         </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>
+
+            <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%">
@@ -361,6 +442,8 @@
   components: {Editor},
   data() {
     return {
+      infoModelShow:false,
+
       loading: false,
       membersLoading: false,
       submitLoading: false,
@@ -397,6 +480,24 @@
 
       // 娲诲姩琛ㄥ崟
       activityFrom: {
+        id: '',
+        activityName: '',
+        activityType: '',
+        reportTime: [],
+        time: [],
+        activityContent: '',
+        cover: '',
+        coverType: '',
+        status: '',
+        reportStartTime: '',
+        reportEndTime: '',
+        startTime: '',
+        endTime: '',
+        recommend: false,
+        limitUserNum: 0,
+        activityLocation: '',
+      },
+      activityInfo: {
         id: '',
         activityName: '',
         activityType: '',
@@ -645,6 +746,11 @@
     this.init()
   },
   methods: {
+    detail(row){
+      this.modelTitle = '娲诲姩璇︽儏'
+      this.infoModelShow = true
+      this.activityInfo = row
+    },
     // 鑾峰彇瀵屾枃鏈紪杈戝櫒鐨勫唴瀹�
     getReason(content) {
       this.activityFrom.activityContent = content
@@ -757,7 +863,9 @@
         this.coverType = row.coverType === 'text' ? '杈撳叆鏂囧瓧灏侀潰' : '閫夋嫨鏂囦欢灏侀潰'
       })
     },
-
+    infoModelClose(){
+      this.infoModelShow = false
+    },
     // 鍏抽棴妯℃�佹
     modelClose() {
       this.modelShow = false
@@ -1183,4 +1291,33 @@
     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>
diff --git a/manager/src/views/customer/index.vue b/manager/src/views/customer/index.vue
index 40112e7..6208375 100644
--- a/manager/src/views/customer/index.vue
+++ b/manager/src/views/customer/index.vue
@@ -68,6 +68,7 @@
         @on-selection-change="showSelect"
       >
         <template slot-scope="{ row, index }" slot="action">
+          <Button type="info" size="small" style="margin-right: 5px" @click="openInfo(row)">鏌ョ湅璇︽儏</Button>
           <Button type="info" size="small" style="margin-right: 5px" @click="openEdit(row)">缂栬緫鏍囩</Button>
           <Button type="error" size="small" style="margin-right: 5px" @click="joinBlack(row)">鍔犲叆榛戝悕鍗�</Button>
         </template>
@@ -87,6 +88,82 @@
         ></Page>
       </Row>
 
+      <Modal
+        v-model="showCustomerInfo"
+        :title="modelTitle"
+        width="700"
+        :mask-closable="false"
+      >
+        <div class="customer-detail">
+          <div class="avatar-section">
+            <Avatar :src="customerInfo.face" size="large" />
+            <div class="basic-info">
+              <h3>{{ customerInfo.nickName || '寰俊鐢ㄦ埛' }}</h3>
+              <p>ID: {{ customerInfo.id }}</p>
+              <p>鐢ㄦ埛鍚�: {{ customerInfo.username }}</p>
+            </div>
+          </div>
+
+          <Divider />
+
+          <div class="detail-grid">
+            <div class="detail-row">
+              <span class="detail-label">鎬у埆锛�</span>
+              <span class="detail-value">{{ customerInfo.sex === 0 ? "濂�" : "鐢�"}}</span>
+            </div>
+            <div class="detail-row">
+              <span class="detail-label">鍦板尯锛�</span>
+              <span class="detail-value">{{ customerInfo.region || '鏈缃�' }}</span>
+            </div>
+            <div class="detail-row">
+              <span class="detail-label">鎵嬫満鍙凤細</span>
+              <span class="detail-value">{{ customerInfo.mobile || '鏈粦瀹�' }}</span>
+            </div>
+            <div class="detail-row">
+              <span class="detail-label">褰撳墠绉垎锛�</span>
+              <span class="detail-value">{{ customerInfo.point }}</span>
+            </div>
+            <div class="detail-row">
+              <span class="detail-label">鎬荤Н鍒嗭細</span>
+              <span class="detail-value">{{ customerInfo.totalPoint }}</span>
+            </div>
+            <div class="detail-row">
+              <span class="detail-label">璐﹀彿鐘舵�侊細</span>
+              <span class="detail-value">
+          <Tag :color="customerInfo.disabled ? 'error' : 'success'">
+            {{ customerInfo.disabled ? '宸茬鐢�' : '姝e父' }}
+          </Tag>
+        </span>
+            </div>
+            <div class="detail-row">
+              <span class="detail-label">鏄惁鍏宠仈搴楅摵锛�</span>
+              <span class="detail-value">{{ customerInfo.haveStore ? '鏄�' : '鍚�' }}</span>
+            </div>
+            <div class="detail-row">
+              <span class="detail-label">娉ㄥ唽鏃堕棿锛�</span>
+              <span class="detail-value">{{ customerInfo.createTime }}</span>
+            </div>
+            <div class="detail-row">
+              <span class="detail-label">鏈�鍚庣櫥褰曟椂闂达細</span>
+              <span class="detail-value">{{ customerInfo.lastLoginDate }}</span>
+            </div>
+          </div>
+
+          <div v-if="customerInfo.customerTagList && customerInfo.customerTagList.length > 0" class="tags-section">
+            <h4>鐢ㄦ埛鏍囩</h4>
+            <div>
+              <Tag v-for="tag in customerInfo.customerTagList" :key="tag" color="default" style="margin-right: 8px;">
+                {{ tag }}
+              </Tag>
+            </div>
+          </div>
+        </div>
+
+        <div slot="footer">
+          <Button type="primary" @click="showCustomerInfo = false">鍏抽棴</Button>
+        </div>
+      </Modal>
+<!--      鏍囩寮圭獥-->
       <Modal
         v-model="showCustomerTag"
         :title="modelTitle"
@@ -125,7 +202,7 @@
 
 <script>
 import JsonExcel from "vue-json-excel";
-import {getCustomerList,addCustomerTag,saveCustomerTagById,getTagList,getStoreSelectOptions} from "@/api/customer";
+import {getCustomerList,addCustomerTag,saveCustomerTagById,getTagList,getStoreSelectOptions,getCustomerInfo} from "@/api/customer";
 import {addCustomerBlackByPC} from "@/api/customer-black.js"
 
 export default {
@@ -135,6 +212,30 @@
   },
   data(){
     return{
+      customerInfo: {
+        birthday: null,
+        blackId: null,
+        clientEnum: null,
+        createTime: "",
+        customerTagList: [],
+        disabled: true,
+        experience: null,
+        face: "",
+        gradeId: null,
+        haveStore: false,
+        id: "",
+        lastLoginDate: "",
+        mobile: null,
+        nickName: "",
+        openId: null,
+        point: 10,
+        region: "",
+        regionId: "",
+        sex: 0,
+        storeId: null,
+        totalPoint: 0,
+        username: ""
+      },
       loading: false, // 琛ㄥ崟鍔犺浇鐘舵��
       //鏌ヨ瀹㈡埛鍒楄〃璇锋眰鍙傛暟
       searchForm:{
@@ -225,8 +326,9 @@
       selectCount: 0, // 宸查�夋暟閲�
       selectList: [], // 宸查�夋暟鎹垪琛�
 
+      //瀹㈡埛璇︽儏瀵硅瘽妗�---
+      showCustomerInfo:false,
       //瀹㈡埛鏍囩瀵硅瘽妗�---
-
       showCustomerTag:false,
       submitLoading:false,
       selectLoading:false,
@@ -301,6 +403,39 @@
       this.selectList = e.map(d => d.id);
       this.selectCount = e.length;
     },
+    //鏌ョ湅璇︽儏
+    openInfo(row){
+      this.showCustomerInfo = true;
+      this.modelTitle = "鐢ㄦ埛璇︽儏"
+      getCustomerInfo(row.id).then(res =>{
+        if(res.code === 200){
+          this.customerInfo = {
+            birthday: res.data.birthday || null,
+            blackId: res.data.blackId || null,
+            clientEnum: res.data.clientEnum || null,
+            createTime: res.data.createTime || '',
+            customerTagList: res.data.customerTagList || [],
+            disabled: res.data.disabled || false,
+            experience: res.data.experience || null,
+            face: res.data.face || '榛樿澶村儚URL',
+            gradeId: res.data.gradeId || null,
+            haveStore: res.data.haveStore || false,
+            id: res.data.id || '',
+            lastLoginDate: res.data.lastLoginDate || '',
+            mobile: res.data.mobile || null,
+            nickName: res.data.nickName || '寰俊鐢ㄦ埛',
+            openId: res.data.openId || null,
+            point: res.data.point || 0,
+            region: res.data.region || '',
+            regionId: res.data.regionId || '',
+            sex: res.data.sex || 0,
+            storeId: res.data.storeId || null,
+            totalPoint: res.data.totalPoint || 0,
+            username: res.data.username || ''
+          };
+        }
+      })
+    },
     // 缂栬緫鏍囩
     openEdit(row){
       this.showCustomerTag = true
@@ -360,6 +495,40 @@
 
 </script>
 <style lang="scss" scoped>
+.customer-detail {
+  padding: 16px;
+}
+
+.avatar-section {
+  display: flex;
+  align-items: center;
+  margin-bottom: 16px;
+}
+
+.basic-info {
+  margin-left: 16px;
+}
+
+.basic-info h3 {
+  margin: 0 0 8px 0;
+  font-size: 18px;
+}
+
+.basic-info p {
+  margin: 6px 0;
+  color: #808695;
+  font-size: 14px;
+}
+
+.tags-section {
+  margin-top: 16px;
+  padding-top: 16px;
+}
+
+.tags-section h4 {
+  margin-bottom: 12px;
+  color: #17233d;
+}
 .export {
   margin: 10px 20px 10px 0;
 }

--
Gitblit v1.8.0