quanwei
2 days ago 73b874c72ad55eb9eef21c36160ac0de58f0189e
mobile/pages/plus/business/index.vue
@@ -11,7 +11,9 @@
         <view class="action-buttons">
            <view class="btn" @click="editCard()">编辑名片</view>
            <view class="btn" @click="switchCard()">切换名片</view>
            <view class="btn" @click="shareCard()">分享名片</view>
            <button open-type="share" class="btn">分享名片</button>
            <view class="btn" @click="topUpCard()">置顶名片</view>
            <view class="btn" @click="gotoChatList()">聊天记录</view>
         </view>
         <!-- 数据统计区域 -->
@@ -37,97 +39,135 @@
               <text class="more" @click="viewAllVisitors()">查看全部</text>
            </view>
            <view class="visitor-list">
               <view class="visitor-item" v-for="(visitor, index) in visitors" :key="index">
                  <image class="visitor-avatar" :src="visitor.avatar || '/static/default.png'" mode="aspectFill">
               <view class="visitor-item" v-for="(visitor, index) in visitors.data" :key="index">
                  <image class="visitor-avatar" :src="visitor.user.avatarUrl || '/static/default.png'"
                     mode="aspectFill">
                  </image>
                  <view class="visitor-info">
                     <view class="visitor-name">{{visitor.user_name || '未知访客'}}</view>
                     <view class="visitor-time">{{formatTime(visitor.visit_time)}}</view>
                     <view class="visitor-name">{{visitor.user.nickName || '未知访客'}}</view>
                     <view class="visitor-time">{{visitor.update_time}}</view>
                  </view>
               </view>
            </view>
         </view>
      </view>
         <!-- 切换名片弹窗 -->
         <Popup :show="popupShow" type="bottom" :width="screenWidth" :mask-click="false">
            <view class="popup-content">
               <view class="popup-header">
                  <text class="title">选择名片</text>
                  <text class="close" @click="closePopup">×</text>
               </view>
               <scroll-view scroll-y="true" class="card-scroll">
                  <view class="card-item" v-for="(card, index) in businessList" :key="index"
                     :class="{active: index === current}" @click="selectCard(index)">
                     <view class="card-preview">
                        <image style="width: 650rpx;" :src="card.mp" mode="widthFix"></image>
                     </view>
                     <text v-if="index === current" class="icon iconfont icon-check"></text>
                  </view>
                  <view class="add-card" @click="addNewCard()">
                     <text class="icon iconfont icon-add"></text>
                     <text>添加新名片</text>
                  </view>
               </scroll-view>
      <!-- 切换名片弹窗 -->
      <Popup :show="popupShow" type="bottom" :width="screenWidth" :mask-click="false">
         <view class="popup-content">
            <view class="popup-header">
               <text class="title">选择名片</text>
               <text class="close" @click="closePopup">×</text>
            </view>
         </Popup>
            <scroll-view scroll-y="true" class="card-scroll">
               <uni-swipe-action>
                  <view v-for="(card, index) in businessList" :key="index">
                     <uni-swipe-action-item :right-options="rightOptions" @click="handleDel(index, card)">
                        <view @click="selectCard(index)" class="card-item">
                           <view :class="{active: card.is_default==1}" class="card-preview">
                              <image style="width: 650rpx;border-radius: 12rpx;" :src="card.mp"
                                 mode="widthFix"></image>
                              <image v-show="card.is_default==1" src="@/static/icon/mrmp.png" class="mrmp">
                              </image>
                           </view>
                        </view>
                     </uni-swipe-action-item>
                  </view>
               </uni-swipe-action>
               <view class="add-card" @click="addNewCard()">
                  <text class="icon iconfont icon-add"></text>
                  <text>添加新名片</text>
               </view>
            </scroll-view>
         </view>
      </Popup>
      <!-- 支付弹窗 -->
      <view class="payment-modal" v-if="showPayment">
         <view class="modal-content">
            <view class="modal-header">
               <text class="title">名片置顶确认</text>
               <text class="close" @click="closePaymentModal">×</text>
            </view>
            <view class="modal-body">
               <view class="payment-info">
                  <view class="info-item">
                     <text class="label">置顶天数:</text>
                     <text class="value">{{topSetting.top_days}}天</text>
                  </view>
                  <view class="info-item">
                     <text class="label">支付金额:</text>
                     <text class="value price">¥{{topSetting.top_amount}}</text>
                  </view>
               </view>
            </view>
            <view class="modal-footer">
               <button class="cancel-btn" @click="closePaymentModal">取消</button>
               <button class="confirm-btn" @click="confirmPayment">确认支付</button>
            </view>
         </view>
      </view>
   </view>
</template>
<script>
   import Popup from '@/components/uni-popup.vue';
   import uniSwipeAction from '@/uni_modules/uni-swipe-action/components/uni-swipe-action/uni-swipe-action.vue';
   import uniSwipeActionItem from '@/uni_modules/uni-swipe-action/components/uni-swipe-action-item/uni-swipe-action-item.vue';
   export default {
      components: {
         Popup,
         uniSwipeAction,
         uniSwipeActionItem
      },
      data() {
         return {
            businessImage: '',
            business_card_id: '',
            height: 0,
            businessList: [],
            current: 0,
            statistics: {},
            visitors: [],
            loading: false,
            page: 1,
            search: '',
            businessImage: '',
            height: 0,
            screenWidth: 0, // 屏幕宽度
            popupShow: false
            visitors: {},
            popupShow: false,
            screenWidth: 0,
            showPayment: false, // 显示支付弹窗
            paymentMethod: 'balance', // 支付方式
            topSetting: {}, // 置顶设置
            userInfo: {}, // 用户信息
            rightOptions: [{
               text: '删除',
               style: {
                  backgroundColor: '#FF3B30'
               }
            }]
         };
      },
      onLoad() {
         this.init();
         this.screenWidth = uni.getSystemInfoSync().windowWidth * 2 - 70;
      },
      onShow() {
         this.getbusinessList();
         this.getVisitorList();
      },
      methods: {
         /**
          * 查看图片
          * @param {Object} e
          */
         viewPicture(e) {
            uni.previewImage({
               urls: [e]
            })
         },
         back() {
            uni.navigateBack();
         },
         init() {
            this.getbusinessList();
            //this.getStatistics();
            this.getVisitorList();
            const systemInfo = uni.getSystemInfoSync()
            this.screenWidth=systemInfo.screenWidth*2-70;
         },
         getbusinessList() {
            let _this = this;
            _this._post('plus.business.business/getList', {user_id:uni.removeStorageSync('user_id')}, function(res) {
            _this._post('plus.business.business/getList', {
               page: 1,
               list_rows: 1000,
               user_id: _this.getUserId()
            }, function(res) {
               _this.businessList = res.data.data;
               if (_this.businessList.length > 0) {
                  for (let i in _this.businessList) {
                     if (_this.businessList[i].is_default == 1) {
                        _this.current = i;
                     }
                  }
                  _this.getbusiness(_this.businessList[_this.current].user_id)
                  _this.shareCard();
                  _this.getCardStatistics(_this.businessList[_this.current].business_card_id);
               }
            });
@@ -141,11 +181,14 @@
            });
         },
         getStatistics() {
            // 获取统计数据
         getStatistics(business_card_id) {
            // 默认名片
            let _this = this;
            _this._post('plus.business.business/getStatistics', {}, function(res) {
               _this.statistics = res.data;
            _this._post('plus.business.business/editDefault', {
               business_card_id: business_card_id
            }, function(res) {
               _this.getbusinessList();
               _this.getVisitorList();
            });
         },
         getbusiness(user_id) {
@@ -163,12 +206,26 @@
               page: 1,
               list_rows: 10
            }, function(res) {
               _this.visitors = res.data.list;
               console.log(res);
               _this.visitors = res.data;
            });
         },
         makePhoneCall(phone) {
            uni.makePhoneCall({
               phoneNumber: phone
            });
         },
         viewPicture(url) {
            this.gotoPage(
               `/pages/plus/business/detail?business_card_id=${this.businessList[this.current].business_card_id}`
            );
         },
         getbusinessDetail() {
            let _this = this;
            _this._post('plus.business.business/detail', {
               business_card_id: _this.business_card_id
            }, function(res) {
               _this.businessDetail = res.data;
            });
         },
         sendEmail(email) {
@@ -184,6 +241,10 @@
               this.gotoPage(
                  `/pages/plus/business/add?business_card_id=${this.businessList[this.current].business_card_id}`
               );
            } else {
               this.gotoPage(
                  `/pages/plus/business/add`
               );
            }
         },
         switchCard() {
@@ -196,7 +257,7 @@
         },
         selectCard(index) {
            this.current = index;
            this.getCardStatistics(this.businessList[this.current].business_card_id);
            this.getStatistics(this.businessList[this.current].business_card_id);
            this.closePopup();
         },
         addNewCard() {
@@ -205,21 +266,75 @@
         },
         shareCard() {
            // 分享名片逻辑
            if (this.businessList.length > 0) {
               uni.showShareMenu({
                  withShareTicket: true,
                  menus: ['shareAppMessage', 'shareTimeline'],
                  title: `${this.businessList[this.current].name}的电子名片`,
                  path: `/pages/plus/business/detail?business_card_id=${this.businessList[this.current].business_card_id}&referee_id=${this.getUserId()}`,
                  complete: function(res) {
                     console.log(res);
                  }
               });
            }
         },
         viewAllVisitors() {
            // 查看全部访客
            this.gotoPage('/pages/plus/business/visitors');
         },
         // 跳转到聊天记录页面
         gotoChatList() {
            uni.navigateTo({
               url: '/pages/plus/business/chat/list'
            });
         },
         // 置顶名片
         topUpCard() {
            if (this.businessList.length > 0) {
               // 获取置顶设置
               this._get('plus.business.setting/getAll', {}, (res) => {
                  if (res.data && res.data.basic && res.data.basic.values) {
                     this.topSetting = res.data.basic.values;
                     // 获取用户信息
                     this._get('user.index/detail', {}, (userRes) => {
                        this.userInfo = userRes.data;
                        this.showPayment = true;
                     });
                  }
               });
            }
         },
         // 关闭支付弹窗
         closePaymentModal() {
            this.showPayment = false;
         },
         // 选择支付方式
         selectPaymentMethod(method) {
            this.paymentMethod = method;
         },
         // 确认支付
         confirmPayment() {
            if (this.businessList.length > 0) {
               let payType = this.paymentMethod === 'balance' ? 10 : 20;
               let params = {
                  business_card_id: this.businessList[this.current].business_card_id,
                  pay_type: payType
               };
               this._post('plus.business.top/create', params, (res) => {
                  if (res.code === 1) {
                     // 如果是余额支付,直接处理
                     if (this.paymentMethod === 'balance') {
                        // 直接跳转支付
                        uni.redirectTo({
                           url: '/pages/plus/business/cashier?order_id=' + res.data.order_id +
                              '&order_type=100'
                        });
                     } else {
                        // 跳转到收银台支付
                        uni.redirectTo({
                           url: '/pages/plus/business/cashier?order_id=' + res.data.order_id +
                              '&order_type=100'
                        });
                     }
                  } else {
                     this.showError(res.msg || '创建订单失败');
                  }
               }, (err) => {
                  this.showError('创建订单失败,请重试');
               });
            }
         },
         formatTime(time) {
            if (!time) return '';
@@ -236,6 +351,55 @@
            } else {
               return date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate();
            }
         },
         // 删除名片
         handleDel(index, card) {
            // 防止删除默认名片
            if (card.is_default === 1) {
               this.showToast('默认名片不能删除');
               return;
            }
            uni.showModal({
               title: '提示',
               content: '确定要删除这个名片吗?',
               success: (res) => {
                  if (res.confirm) {
                     // 调用删除接口
                     this._post('plus.business.business/delete', {
                        business_card_id: card.business_card_id
                     }, (res) => {
                        if (res.code === 1) {
                           // 删除成功,更新列表
                           this.businessList.splice(index, 1);
                           this.showToast('删除成功');
                           // 如果删除的是当前选中的名片,切换到第一个名片
                           if (index === this.current) {
                              if (this.businessList.length > 0) {
                                 this.current = 0;
                                 this.getStatistics(this.businessList[this.current]
                                    .business_card_id);
                              }
                           } else if (index < this.current) {
                              // 如果删除的是当前选中名片之前的,current减1
                              this.current--;
                           }
                        } else {
                           this.showToast(res.msg || '删除失败');
                        }
                     });
                  }
               }
            });
         },
         // 显示提示信息
         showToast(msg) {
            uni.showToast({
               title: msg,
               icon: 'none',
               duration: 2000
            });
         }
      },
      onShareAppMessage() {
@@ -328,7 +492,7 @@
            .icon {
               font-size: 32rpx;
               color: #37bde6;
               color: #D41003;
               margin-right: 16rpx;
            }
@@ -347,13 +511,14 @@
      .btn {
         flex: 1;
         background: #37bde6;
         background: #D41003;
         color: #fff;
         text-align: center;
         padding: 24rpx 0;
         border-radius: 10rpx;
         font-size: 30rpx;
         margin: 0 10rpx;
         line-height: normal;
      }
   }
@@ -370,7 +535,7 @@
         align-items: center;
         .number {
            font-size: 40rpx;
            font-size: 36rpx;
            font-weight: bold;
            color: #333;
            margin-bottom: 8rpx;
@@ -386,20 +551,14 @@
   .visitors {
      background: #fff;
      border-radius: 20rpx;
      padding: 30rpx;
      margin-top: 30rpx;
      padding: 20rpx;
      .section-title {
         display: flex;
         justify-content: space-between;
         align-items: center;
         margin-bottom: 20rpx;
         .title {
            font-size: 32rpx;
            font-weight: bold;
            color: #333;
         }
         margin-bottom: 30rpx;
         .more {
            font-size: 26rpx;
@@ -407,35 +566,36 @@
         }
      }
      .visitor-item {
         display: flex;
         align-items: center;
         padding: 20rpx 0;
         border-bottom: 1rpx solid #f0f0f0;
      .visitor-list {
         .visitor-item {
            display: flex;
            align-items: center;
            padding: 20rpx 0;
         &:last-child {
            border-bottom: none;
         }
         .visitor-avatar {
            width: 80rpx;
            height: 80rpx;
            border-radius: 50%;
         }
         .visitor-info {
            margin-left: 20rpx;
            flex: 1;
            .visitor-name {
               font-size: 28rpx;
               color: #333;
               margin-bottom: 4rpx;
            &:not(:last-child) {
               border-bottom: 1rpx solid #f0f0f0;
            }
            .visitor-time {
               font-size: 24rpx;
               color: #999;
            .visitor-avatar {
               width: 70rpx;
               height: 70rpx;
               border-radius: 50%;
               margin-right: 20rpx;
            }
            .visitor-info {
               flex: 1;
               .visitor-name {
                  font-size: 30rpx;
                  color: #333;
                  margin-bottom: 8rpx;
               }
               .visitor-time {
                  font-size: 24rpx;
                  color: #999;
               }
            }
         }
      }
@@ -476,16 +636,31 @@
            padding: 30rpx;
            border-bottom: 1rpx solid #f0f0f0;
            &.active {
               background: #f5f5f5;
            }
            .card-preview {
               border-radius: 12rpx;
               position: relative;
               .mrmp {
                  height: 50rpx;
                  width: 50rpx;
                  position: absolute;
                  bottom: 0rpx;
                  right: 0rpx;
                  border-top-left-radius: 10rpx;
                  border-bottom-right-radius: 10rpx;
               }
               .card-name {
                  font-size: 32rpx;
                  font-weight: bold;
                  color: #333;
                  margin-bottom: 8rpx;
               }
               &.active {
                  background: #f5f5f5;
                  border: #D41003 solid 1rpx;
               }
               .card-company {
@@ -505,7 +680,7 @@
            align-items: center;
            justify-content: center;
            padding: 30rpx;
            color: #37bde6;
            color: #D41003;
            font-size: 30rpx;
            .icon {
@@ -515,4 +690,159 @@
         }
      }
   }
   // 支付弹窗样式
   .payment-modal {
      position: fixed;
      top: 0;
      left: 0;
      right: 0;
      bottom: 0;
      background: rgba(0, 0, 0, 0.6);
      z-index: 9999;
      display: flex;
      align-items: center;
      justify-content: center;
      .modal-content {
         background: #fff;
         border-radius: 20rpx;
         width: 600rpx;
         max-width: 90%;
         .modal-header {
            display: flex;
            justify-content: space-between;
            align-items: center;
            padding: 30rpx;
            border-bottom: 1rpx solid #f0f0f0;
            .title {
               font-size: 32rpx;
               font-weight: bold;
               color: #333;
            }
            .close {
               font-size: 40rpx;
               color: #999;
               padding: 0 10rpx;
            }
         }
         .modal-body {
            padding: 30rpx;
            .payment-info {
               background: #f9f9f9;
               border-radius: 10rpx;
               padding: 20rpx;
               margin-bottom: 30rpx;
               .info-item {
                  display: flex;
                  justify-content: space-between;
                  margin-bottom: 15rpx;
                  &:last-child {
                     margin-bottom: 0;
                  }
                  .label {
                     font-size: 28rpx;
                     color: #666;
                  }
                  .value {
                     font-size: 28rpx;
                     color: #333;
                     &.price {
                        color: #ff4444;
                        font-weight: bold;
                     }
                  }
               }
            }
            .payment-methods {
               .method-title {
                  font-size: 28rpx;
                  color: #333;
                  margin-bottom: 20rpx;
               }
               .method-item {
                  display: flex;
                  align-items: center;
                  padding: 20rpx;
                  border: 1rpx solid #f0f0f0;
                  border-radius: 10rpx;
                  margin-bottom: 20rpx;
                  position: relative;
                  &.active {
                     border-color: #D41003;
                     background: #f0f9ff;
                  }
                  .icon {
                     font-size: 40rpx;
                     margin-right: 20rpx;
                     &.icon-yue {
                        color: #ff9900;
                     }
                     &.icon-weixin {
                        color: #09bb07;
                     }
                  }
                  .method-name {
                     font-size: 28rpx;
                     color: #333;
                     flex: 1;
                  }
                  .balance {
                     font-size: 24rpx;
                     color: #999;
                     margin-right: 20rpx;
                  }
                  .checked {
                     color: #D41003;
                     font-size: 36rpx;
                  }
               }
            }
         }
         .modal-footer {
            display: flex;
            border-top: 1rpx solid #f0f0f0;
            .cancel-btn,
            .confirm-btn {
               flex: 1;
               padding: 30rpx;
               text-align: center;
               font-size: 30rpx;
               border: none;
               background: none;
            }
            .cancel-btn {
               color: #666;
               border-right: 1rpx solid #f0f0f0;
            }
            .confirm-btn {
               color: #37bde6;
               font-weight: bold;
            }
         }
      }
   }
</style>