zxl 1 年之前
父節點
當前提交
088e734266

File diff suppressed because it is too large
+ 2 - 19541
package-lock.json


+ 119 - 0
src/PageMine/aboutUs.vue

@@ -0,0 +1,119 @@
+<template>
+  <view class="container">
+    <view class="title">公司简介</view>
+    <view class="item-box">
+      <u--text size="13" :text="text"></u--text>
+      <u--text style="margin-top: 15rpx" size="13" :text="text1"></u--text>
+    </view>
+
+    <view class="title">联系我们</view>
+    <view class="item-box">
+      <view class="item">
+        <view class="item-r">
+          <p>电话:028-1314520</p>
+          <p class="item-p">13739464447</p>
+        </view>
+      </view>
+      <view class="item">
+        <view class="item-r">
+          <p>邮箱:xiangpei@chelvc.com</p>
+          <p class="item-p">2027758656@qq.com</p>
+        </view>
+      </view>
+      <view class="item">
+        <view class="item-r">地址:四川省成都市双流区商都路520号201室</view>
+      </view>
+    </view>
+
+    <view class="title">公司历程</view>
+    <view class="item-box">
+      <view class="progress-box">
+        <image class="img" src="@/static/logo.png" mode="aspectFill"></image>
+        <view class="progress-text">
+          <p>2023.1月 团队开始组建</p>
+          <p>2023.3月 项目开始开发</p>
+          <p>2024.1月 项目完成开发</p>
+          <p>2024.2月 正式进入运营阶段</p>
+          <p>2025.12月 开始准备IPO相关资料</p>
+          <p>2026.1月 成功在纳斯达克上市</p>
+        </view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script>
+  export default {
+    data() {
+      return {
+        text: '车旅程科技有限公司成立于2023年1月,是一家从事汽车后市场服务的移动互联网公司。公司搭建的养车一站式养车用车服务平台,从B端市场入局,通过整合上下游服务及资源,重新构建汽车后市场服务生态链,为保险、银行及大型集团提供综合汽车生活服务及增值服务解决方案。',
+        text1: '平台通过整合优质服务商,并对服务商实施严格的质量监控,现已在全国范围为合作方提供全面的服务。用户通过车旅程养车平台即可一站式享受方便快捷的各类汽车及生活服务。公司秉承“做有温度的汽车服务”的管理理念, 不断探索和创新与机构客户的合作模式。',
+      };
+    },
+  };
+</script>
+
+<style lang="scss" scoped>
+  .container {
+    padding: 40rpx;
+    background-color: #f3f4f6;
+    height: calc(100vh - 80rpx);
+
+    .title {
+      font-size: 42rpx;
+      font-weight: bold;
+      color: #000;
+      margin: 20rpx 0;
+    }
+
+    .item-box {
+      padding: 20rpx;
+      border-radius: 20rpx;
+      background-color: #fff;
+      line-height: 40rpx;
+
+      .item {
+        display: flex;
+        align-items: center;
+        margin-top: 10rpx;
+        font-size: 28rpx;
+        color: #424c5b;
+
+        .item-l {
+          .img {
+            width: 50rpx;
+            height: auto;
+          }
+        }
+
+        .item-r {
+          margin-left: 20rpx;
+        }
+      }
+
+      .progress-box {
+        display: flex;
+        justify-content: space-around;
+        align-items: center;
+        width: 100%;
+
+        .img {
+          width: 30%;
+          height: 240rpx;
+          margin-bottom: 20rpx;
+          border-radius:20rpx;
+        }
+
+        .progress-text {
+          font-size: 25rpx;
+          color: #424c5b;
+        }
+      }
+    }
+  }
+
+  .item-p {
+    position: relative;
+    left: 42px;
+  }
+</style>

+ 193 - 0
src/PageMine/components/goodsItem.vue

@@ -0,0 +1,193 @@
+<template>
+  <view class="sort">
+    <u-swipe-action>
+      <u-swipe-action-item :options="options1" :key="index" v-for="(itm, index) of item"
+        @click="handlerClearItem(itm,index)">
+        <view class="list" @click='handlerRouterSkip(itm)'>
+          <view class="list-img">
+            <image class="img" :src=" itm.logo" mode="scaleToFill"></image>
+          </view>
+
+          <view class="list-main">
+            <view class="item-text">{{ itm.name }}</view>
+            <!-- <view class="item-flex">
+              <view class="star">
+                <u-rate :count="itm.score" disabled v-model="itm.score" :size="14" />
+                <text class="line">|</text>
+                <text class="points">{{ itm.score }}分</text>
+              </view>
+              <view>{{ itm.specialPrice }}单</view>
+              <view></view>
+            </view> -->
+            <view class="list-item">
+              <view class="item-l">{{ itm.description }}</view>
+              <view class="item-r"></view>
+            </view>
+          </view>
+        </view>
+      </u-swipe-action-item>
+    </u-swipe-action>
+  </view>
+</template>
+
+<script>
+  import {
+    cancelFavorite
+  } from '@/api/client/business.js';
+  export default {
+    data() {
+      return {
+        show: false,
+        showDate: false,
+        value1: Number(new Date()),
+        count: 2,
+        value: 10,
+        options1: [{
+          text: '删除'
+        }]
+      };
+    },
+    props: ['item'],
+    mounted() {},
+    methods: {
+      click(item) {},
+      open() {},
+      close() {
+        this.show = false;
+      },
+      // 点击跳转1
+      handlerRouterSkip(item) {
+        uni.navigateTo({
+          url: `/pagesHome/marketer/productDetail?id=${item.id}&shopId=${item.merchantId}`,
+        });
+      },
+      // 点击取消
+      handlerClearItem(item, index) {
+        cancelFavorite(item.id).then(res => {
+          if (res.code == 'OK') {
+            uni.showToast({
+              title: '取消成功',
+              icon: 'none'
+            })
+            this.$emit('uploadIniList', 1)
+          } else {
+            uni.showToast({
+              title: res.message,
+              icon: 'none'
+            })
+            return
+          }
+        })
+      }
+    },
+  };
+</script>
+
+<style lang="scss" scoped>
+  /*商家服务分类的是实现 */
+
+  .sort {
+    min-height: 100vh;
+
+    .list {
+      height: 250rpx;
+      background-color: #fff;
+      padding: 20rpx;
+      margin-bottom: 20rpx;
+      display: flex;
+
+      .list-img {
+        width: 260rpx;
+        height: 100%;
+        background-color: #ec5729;
+        margin-right: 20rpx;
+
+        image {
+          width: 100%;
+          height: 100%;
+        }
+      }
+
+      .list-main {
+        width: calc(100% - 280rpx);
+      }
+
+      .item-text {
+        font-weight: bold;
+        margin: 10rpx 0 10rpx;
+        color: #333;
+      }
+
+      .item-flex {
+        display: flex;
+        justify-content: space-between;
+        font-size: 28rpx;
+        margin: 0 20rpx 10rpx 0;
+        color: #0d0d0d66;
+
+        .star {
+          display: flex;
+
+          .line {
+            margin-left: 16rpx;
+            margin-top: 5rpx;
+            font-size: 22rpx;
+          }
+
+          .points {
+            color: #ff4b04;
+            font-size: 22rpx;
+            margin-top: 6rpx;
+            margin-left: 10rpx;
+          }
+        }
+      }
+
+      .list-item {
+        display: flex;
+        justify-content: space-between;
+        margin-top: 40rpx;
+
+        .item-l {
+          width: 80%;
+          color: #cfcfcf;
+          overflow: hidden;
+          text-overflow: ellipsis;
+          display: -webkit-box; //将对象作为弹性伸缩盒子模型显示。
+          -webkit-box-orient: vertical; // 从上到下垂直排列子元素
+          -webkit-line-clamp: 2; //显示的行数
+        }
+
+        .item-r {
+          color: #252525;
+
+          .Buy {
+            width: 40px;
+            height: 32px;
+            color: #fff;
+            line-height: 32px;
+            text-align: center;
+            display: inline-block;
+            border-radius: 0 16px 16px 0;
+            background-color: #ec5729;
+            padding-bottom: 20rpx;
+          }
+        }
+      }
+    }
+  }
+
+
+  .swipe-action {
+    background-color: #EFEFEF;
+    box-sizing: border-box;
+
+    &__content {
+
+      &__text {
+        font-size: 15px;
+        color: $u-main-color;
+      }
+    }
+  }
+</style>

+ 216 - 0
src/PageMine/coupon.vue

@@ -0,0 +1,216 @@
+<template>
+  <view class="container">
+    <!-- 顶部导航栏 -->
+    <view class="top-tab">
+      <u-tabs class="tab" :list="list" @click="handlerChangeTab1" :activeStyle="{
+          color: '#fff',
+          fontWeight: 'bold',
+          transform: 'scale(1.05)',
+        }" :inactiveStyle="{
+          color: '#fff',
+          transform: 'scale(1)',
+        }" itemStyle="height: 34px; width:27%;" lineColor="#D89A4C"></u-tabs>
+    </view>
+
+    <!-- 优惠券的可用和失效 -->
+    <view class="use">
+      <u-tabs :list="list2" lineWidth="60" lineColor="#347caf" :scrollable="false" :activeStyle="{
+          color: '#347caf',
+          fontWeight: 'bold',
+          transform: 'scale(1.05)',
+        }" :inactiveStyle="{
+          color: '#b7b6b8',
+          transform: 'scale(1)',
+        }" itemStyle="padding-left: 90rpx; padding-right: 80rpx; height: 120rpx;" @change="handlerSelectTab" />
+    </view>
+
+    <!-- 优惠券可用 -->
+    <view class="couponUse" v-show="lable_type == 0" :key="index" v-for="(item, index) of init_list">
+      <view class="useLeft">
+        <view>{{ item.couponVO.name }}</view>
+        <text>到期时间 : {{ item.couponVO.dueTime }}</text>
+      </view>
+      <view class="useRight">
+        <view class="text">{{ 10 - item.couponVO.reduce  }}<text>折</text></view>
+        <view>折扣</view>
+        <view class="gouUse" @click='handlerToUsed(item)'>去使用</view>
+      </view>
+    </view>
+
+    <u-empty v-if="total == 0" mode="data" icon="http://cdn.uviewui.com/uview/empty/data.png">
+    </u-empty>
+  </view>
+</template>
+
+<script>
+  import {
+    getUserAcceptCouponsList
+  } from '@/api/client/mine.js';
+  export default {
+    data() {
+      return {
+        list: [{
+            id: 1,
+            name: '满减',
+            type: 'REDUCE',
+          },
+          {
+            id: 2,
+            name: '折扣',
+            type: 'DISCOUNT',
+          },
+          {
+            id: 3,
+            name: '赠送',
+            type: 'GIVE',
+          },
+        ],
+        list2: [{
+            name: '可用',
+            type: 'UNUSED',
+          },
+          {
+            name: '失效',
+            type: 'CLOSED',
+          },
+        ],
+        lable_type: 0, // 是否可用
+        queryParams: {
+          size: '10', //分页信息  取值范围: 页码,分页大小
+          type: 'REDUCE', //优惠券类型 允许值: GIVE(赠送), REDUCE(满减), DISCOUNT(折扣)
+          status: 'UNUSED', // 用户优惠券状态 UNUSED(未使用), USED(已使用), EXPIRED(已过期), CLOSED(作废)
+        },
+        init_list: [], //初始化列表
+        total: 0,
+      };
+    },
+    mounted() {
+      this.handlerInitCouponList();
+    },
+    methods: {
+      // 初始化优惠卷列表
+      handlerInitCouponList() {
+        getUserAcceptCouponsList(this.queryParams).then(res => {
+          this.init_list = res.data;
+          this.init_list.map(rs=>{
+            rs.couponVO.dueTime = this.handlerGetTime(rs.couponVO.expiration)
+          })
+          this.total = res.data.total;
+        });
+      },
+      handlerGetTime(e){
+        // 1707148800000
+        let time = new Date(e)
+        let year = time.getFullYear()
+        let month = time.getMonth() + 1
+        let date = time.getDate()
+        if (month < 10) {
+          month = '0' + month
+        }
+        if (date < 10) {
+          date = '0' + date
+        }
+        return year + '-' + month + '-' + date
+
+      },
+      // 选择顶部导航栏
+      handlerChangeTab1(e) {
+        this.queryParams.type = e.type;
+        this.handlerInitCouponList();
+      },
+
+      // 点击选择下层tab栏 选择是否可用
+      handlerSelectTab(e) {
+        this.lable_type = e.index;
+        this.queryParams.status = e.type;
+        this.handlerInitCouponList();
+      },
+      // 点击去使用
+      handlerToUsed(item){
+        uni.navigateTo({
+          url:`/pagesHome/marketer/index?id=${item.couponVO.merchantId}`
+        })
+      }
+    },
+  };
+</script>
+
+<style lang="scss" scoped>
+  .container {
+    height: 100vh;
+    background-color: #efefef;
+
+    .top-tab {
+      width: 100%;
+      background-color: #347caf;
+      padding: 20rpx 0;
+    }
+
+    .use {
+      padding: 0 140rpx;
+    }
+
+    /* 优惠券可用 */
+    .couponUse {
+      margin: 20rpx 30rpx;
+      height: 200rpx;
+      display: flex;
+      background-color: #fff;
+      box-sizing: border-box;
+
+      .useLeft {
+        width: 380rpx;
+        padding: 20rpx;
+
+        >view {
+          font-size: 40rpx;
+          margin: 20rpx;
+          color: #333;
+        }
+
+        >text {
+          font-size: 28rpx;
+          color: #5f5f5f;
+        }
+      }
+
+      .useRight {
+        height: 100%;
+        padding: 10rpx;
+        color: #fff;
+        text-align: center;
+        box-sizing: border-box;
+        width: calc(100% - 380rpx);
+        background-color: #347caf;
+
+        .text {
+          font-size: 50rpx;
+
+          >text {
+            margin-left: 5rpx;
+            font-size: 24rpx;
+          }
+        }
+
+        .gouUse {
+          width: 180rpx;
+          height: 60rpx;
+          line-height: 60rpx;
+          color: #347caf;
+          margin: 16rpx 0 0 60rpx;
+          background-color: #fff;
+        }
+      }
+    }
+
+    .couponDisUse {
+      .useRight {
+        background-color: #cecece;
+
+        .gouUse {
+          color: #cecece;
+        }
+      }
+    }
+  }
+</style>

+ 146 - 0
src/PageMine/favourite.vue

@@ -0,0 +1,146 @@
+<template>
+  <view class="collect">
+    <view class="collect_list">
+      <u-tabs :list="listCollect" @click="clickCollect" lineWidth="30" lineColor="#5992bb" :activeStyle="{
+          color: '#303133',
+          fontWeight: 'bold',
+          transform: 'scale(1.05)',
+        }" :inactiveStyle="{
+          color: '#606266',
+          transform: 'scale(1)',
+        }" itemStyle="padding-left: 15px; padding-right: 15px; height: 34px;" />
+    </view>
+    <view>
+      <view v-if="init_list.length > 0">
+        <view class="text">以下是您收藏的商品服务</view>
+        <!-- 收藏的服务 -->
+        <serviceItem v-if="indexs == 0" :item="init_list" @uploadIniList="uploadIniList"></serviceItem>
+        <goodsItem v-else :item="init_list" @uploadIniList="uploadIniList" />
+      </view>
+      <u-empty v-else mode="data" icon="http://cdn.uviewui.com/uview/empty/data.png" />
+    </view>
+  </view>
+</template>
+
+<script>
+  import serviceItem from '@/components/service/serviceItem.vue';
+  import goodsItem from "./components/goodsItem"
+  import { maintainFavoritePaging, getFavouriteGoods } from '@/api/client/mine.js';
+  import { getCurrentLocation } from '@/api/client/home';
+  import { mapGetters } from "vuex"
+  export default {
+    components: {
+      serviceItem,
+      goodsItem
+    },
+    data() {
+      return {
+        queryParams: {
+          size: 10,
+          type: 'MERCHANT',
+          region: null, //地区编码
+          longitude: null , //经度
+          latitude: null, //纬度
+        },
+        init_list: [],
+        listCollect: [{
+            id: 1,
+            name: '商家',
+          },
+          {
+            id: 1,
+            name: '服务',
+          },
+        ],
+        indexs: 0,
+
+      };
+    },
+	mounted() {
+	  let { latitude , longitude , region } = this.location
+	  this.queryParams.latitude = latitude
+	  this.queryParams.longitude = longitude
+	  this.queryParams.region = region
+	  this.handlerInitList();
+	},
+	computed:{
+		  ...mapGetters(['location'])
+	},
+    methods: {
+      // 初始化商家列表信息
+      handlerInitList() {
+        maintainFavoritePaging(this.queryParams).then(res => {
+          if (res.code === 'OK' && res.data) {
+            res.data.map(rs => {
+              this.init_list.push(rs.simpleMerchantVO);
+            });
+          } else {
+            uni.showToast({
+              title: '数据请求失败',
+              icon: 'none',
+            });
+          }
+        });
+      },
+      // 初始化服务列表
+      handlerInitGoodsList() {
+        getFavouriteGoods().then(res => {
+          if (res.code === 'OK' && res.data) {
+            res.data.map(rs => {
+              this.init_list.push(rs.goods);
+            });
+          } else {
+            uni.showToast({
+              title: '数据请求失败',
+              icon: 'none',
+            });
+          }
+        });
+      },
+      clickCollect(e) {
+        this.init_list = []
+        this.indexs = e.index
+        switch (e.index) {
+          case 0:
+            this.handlerInitList()
+            break;
+          case 1:
+            this.handlerInitGoodsList()
+            break;
+        }
+      },
+      uploadIniList(e) {
+        this.init_list = []
+        if (e == 1) {
+          this.handlerInitGoodsList()
+          this.indexs = 1
+        } else {
+          this.handlerInitList()
+          this.indexs = 0
+        }
+      }
+    },
+  };
+</script>
+
+<style lang="scss" scoped>
+  .collect {
+    min-height: 100vh;
+    background-color: #efefef;
+
+    &_list {
+      display: flex;
+      height: 70rpx;
+      justify-content: center;
+      align-items: center;
+      background-color: #fff;
+      margin-bottom: 40rpx;
+    }
+
+    .text {
+      text-align: center;
+      padding: 40rpx;
+      color: #999;
+    }
+  }
+</style>

+ 152 - 0
src/PageMine/feedback.vue

@@ -0,0 +1,152 @@
+<template>
+  <view class="container">
+    <view class="top-text">
+      我们一直努力改进应用程序,您的用户体验对我们来说很重要,如果您在使用过程中产生了糟糕的用户体验,您可以将用户意见提交给我们,我们会积极改正。
+    </view>
+
+    <view class="item-box">
+      <view class="item">
+        <view class="item-title"> <span class="star">*</span> 标题</view>
+        <view class="item-text-box">
+          <u--textarea v-model="queryParams.title" autoHeight placeholder="请输入标题" border='none'></u--textarea>
+        </view>
+      </view>
+
+      <view class="item">
+        <view class="item-title"> <span class="star">*</span> 评论</view>
+        <view class="item-text-box">
+          <u--textarea v-model="queryParams.content" count placeholder="您提出的意见是对我们最大的认可" border='none'></u--textarea>
+        </view>
+      </view>
+
+      <view class="item">
+        <view class="item-title">电话</view>
+        <view class="item-text-box">
+          <u--input placeholder="请输入您的联系方式(选填)" type='number' maxlength='13' border="none"
+            v-model="queryParams.phone"></u--input>
+        </view>
+      </view>
+    </view>
+
+    <view class="btn-box">
+      <button class="btn" @click='handlerSubmitFeedback'>提交反馈</button>
+    </view>
+  </view>
+</template>
+
+<script>
+  import { getFeedback } from "@/api/client/mine.js"
+  export default {
+    data() {
+      return {
+        value1: '',
+        value: '',
+        queryParams: {
+          title: '',
+          content: '',
+          type: 0,
+          phone: '',
+          channel: 0
+        }
+      }
+    },
+    methods: {
+      // 提交反馈意见
+      handlerSubmitFeedback() {
+        if (this.queryParams.title == '') {
+          uni.showToast({
+            title: "请输入标题",
+            icon: 'none'
+          })
+          return
+        } else if (this.queryParams.content == '') {
+          uni.showToast({
+            title: "评论内容",
+            icon: 'none'
+          })
+          return
+        } else {
+          getFeedback(this.queryParams).then(res => {
+            if (res.code === 'OK') {
+              uni.showToast({
+                title: "反馈成功",
+                icon: 'none'
+              })
+              setTimeout(() => {
+                uni.navigateBack(-1)
+              },1500)
+            }else{
+              uni.showToast({
+                title: res.msg,
+                icon: 'none'
+              })
+              return
+            }
+          })
+        }
+      }
+    }
+  }
+</script>
+
+<style lang="scss" scoped>
+  .container {
+    padding: 20rpx;
+    box-sizing: border-box;
+
+    .top-text {
+      color: #999999;
+      font-size: 32rpx;
+      padding: 40rpx;
+      box-sizing: border-box;
+    }
+
+    .item-box,
+    .btn-box {
+      padding: 40rpx;
+      box-sizing: border-box;
+
+      .item {
+        margin-bottom: 40rpx;
+
+        .item-title {
+          color: #999999;
+          font-weight: 32rpx;
+          font-weight: bold;
+          margin-bottom: 20rpx;
+
+          .star {
+            color: #EA512F;
+          }
+        }
+
+        .item-text-box {
+          background-color: #FAFAFA;
+          padding: 20rpx;
+          border-radius: 20rpx;
+          box-shadow: 0 5rpx 15rpx 0 rgba(225, 225, 225, 0.9);
+        }
+      }
+    }
+
+    .btn-box {
+      .btn {
+        background-color: #80AB3F;
+        border-radius: 20rpx;
+        text-align: center;
+        font-size: 32rpx;
+        color: #fff;
+        height: 80rpx;
+        box-shadow: 0 5rpx 15rpx 0 rgba(128, 171, 63, 0.6);
+      }
+    }
+  }
+
+  ::v-deep .u-textarea {
+    background-color: #FAFAFA !important;
+  }
+
+  ::v-deep .u-textarea__count.data-v-09988a29 {
+    background-color: #FAFAFA !important;
+  }
+</style>

+ 154 - 0
src/PageMine/goodsReserve.vue

@@ -0,0 +1,154 @@
+<template>
+  <view class="container">
+    <view class="appoint" :key="index" v-for="(item, index) of init_list">
+      <view class="appoint-list">
+        <view class="appoint-title">{{ item.simpleMerchantVO.name }}</view>
+        <view class="appoint-address"></view>
+        <view class="appoint-flex">
+          <image class="img" :src=" item.simpleMerchantVO.logo" mode="scaleToFill"></image>
+          <view class="appoint-text">
+            <view>{{ item.goodsName }}</view>
+            <view>时间:{{ $u.timeFormat(item.appointTime) }}</view>
+            <view>联系方式:{{ item.mobile }}</view>
+          </view>
+        </view>
+        <view class="appoint-goto">
+          <u-button class="detail" text="详情" @click="handlerSkipGoodsDetail(item, index)"></u-button>
+          <u-button class="cancel" text="取消" @click="handlerClearItem(item, index)"></u-button>
+        </view>
+      </view>
+    </view>
+    <u-empty v-if="init_list.length == 0" mode="data" icon="http://cdn.uviewui.com/uview/empty/data.png">
+    </u-empty>
+  </view>
+</template>
+
+<script>
+  import {
+    maintainReservations
+  } from '@/api/client/mine.js';
+  import {
+    cancelReservation
+  } from '@/api/client/business.js';
+  export default {
+    data() {
+      return {
+        queryParams: {
+          size: 10,
+        },
+        init_list: [], //初始化列表
+      };
+    },
+    mounted() {
+      this.handlerInitList();
+    },
+    methods: {
+      // 初始化列表
+      handlerInitList() {
+        maintainReservations(this.queryParams).then(res => {
+          this.init_list = res.data;
+        });
+      },
+      // 点击取消商品
+      handlerClearItem(item) {
+        cancelReservation(item.id).then(res => {
+          if (res.code === 'OK') {
+            uni.showToast({
+              title: '取消成功',
+              icon: 'none',
+            });
+            this.handlerInitList();
+          } else {
+            uni.showToast({
+              title: res.msg,
+              icon: 'none',
+            });
+            return;
+          }
+        });
+      },
+      // 点击跳转到商品详情
+      handlerSkipGoodsDetail(item, index) {
+        uni.navigateTo({
+          // url: `/pages/client/clientPackage/serviceDetail/index?id=${item.merchantId}`,
+          url: `/pagesHome/marketer/productDetail?id=${item.goodsId}&shopId=${item.merchantId}`,
+        });
+      },
+    },
+  };
+</script>
+
+<style lang="scss" scoped>
+  page {
+    background-color: #efefef;
+  }
+
+  .container {
+    padding: 20rpx;
+  }
+
+  .appoint {
+    .history {
+      font-size: 38rpx;
+      margin: 20rpx 10rpx;
+      font-weight: bold;
+    }
+  }
+
+  .appoint-list {
+    padding: 20rpx;
+    background-color: #fff;
+    margin-bottom: 20rpx;
+    box-sizing: border-box;
+    border-radius: 20rpx;
+
+    .appoint-title {
+      font-size: 38rpx;
+      font-weight: bold;
+      margin-bottom: 10rpx;
+      color: #090909;
+    }
+
+    .appoint-address {
+      font-size: 32rpx;
+      margin: 20rpx;
+      padding-bottom: 20rpx;
+      color: #000000;
+      border-bottom: 2rpx solid #e5e5e5;
+    }
+
+    .appoint-flex {
+      display: flex;
+
+      .img {
+        width: 210rpx;
+        height: 160rpx;
+        display: block;
+        margin-right: 15rpx;
+      }
+
+      .appoint-text {
+        font-size: 28rpx;
+
+        >view {
+          margin-bottom: 26rpx;
+        }
+      }
+    }
+
+    .appoint-goto {
+      display: flex;
+
+      .detail,
+      .cancel {
+        width: 45%;
+        border-radius: 20rpx;
+      }
+
+      .detail {
+        background-color: #6c9fc3;
+        color: #fff;
+      }
+    }
+  }
+</style>

+ 171 - 0
src/PageMine/myTeam.vue

@@ -0,0 +1,171 @@
+<template>
+  <view class="container">
+    <view class="top-img-box">
+      <image class="top-img" :src="avatar" />
+      <view class="top-name"> {{ nickname }} </view>
+    </view>
+
+    <view class="group-item-box">
+      <view class="item-top">
+        <view class="top-l">团队成员</view>
+        <view class="top-r">></view>
+      </view>
+      <view class="item-content">
+        <view class="person-item" v-for="item of teamPersonList">
+          <image class="item-img" :src="item.inviteUserAvatar" mode="aspectFill" />
+          <view class="item-name">{{ item.name }}</view>
+        </view>
+      </view>
+    </view>
+
+    <!-- <view class="group-item-box">
+      <view class="item-top">
+        <view class="top-l">最近动态</view>
+        <view class="top-r">></view>
+      </view>
+      <view class="item-content dynamic-img-box">
+        <img class="dynamic-img" src="@/static/logo.png" alt="" />
+      </view>
+    </view>
+
+    <view class="group-item-box">
+      <view class="item-top">
+        <view class="top-l">团队任务</view>
+        <view class="top-r">></view>
+      </view>
+      <view class="item-content">
+        <img class="item-img" src="@/static/logo.png" alt="" :key="item" v-for="item of 3" />
+      </view>
+    </view> -->
+
+    <button @click='handlerBind'>绑定</button>
+  </view>
+</template>
+
+<script>
+  import {
+    getMyTeam,
+    inviteBind
+  } from "@/api/client/mine.js"
+  import {
+    mapGetters
+  } from "vuex"
+  export default {
+    data() {
+      return {
+        queryParams: {
+          paging: '1,10'
+        },
+        teamPersonList: []
+      };
+    },
+    mounted() {
+      this.handlerInitList()
+    },
+    computed: {
+      ...mapGetters(['userId', 'gender', 'avatar', 'nickname'])
+    },
+    methods: {
+      // 初始化我的团队列表
+      handlerInitList() {
+        getMyTeam(this.queryParams).then(res => {
+          let {
+            records
+          } = res.data
+          this.teamPersonList = records
+          console.log("Res", res)
+        })
+      },
+      // 测试绑定
+      handlerBind() {
+        let params = {
+          userId: this.userId,
+          targetId: '1774462327015325697',
+          type: 1
+        }
+        inviteBind(params).then(res => {
+          console.log("@@@@res", res)
+        })
+      }
+    }
+  };
+</script>
+
+<style lang="scss" scoped>
+  .container {
+    padding: 20rpx 10rpx 50rpx;
+
+    .top-img-box {
+      text-align: center;
+
+      .top-img {
+        width: 160rpx;
+        height: 160rpx;
+        border-radius: 100rpx;
+      }
+
+      .top-name {
+        color: #6b7280;
+        font-weight: bold;
+        font-size: 32rpx;
+        margin-top: 20rpx;
+      }
+    }
+
+    .group-item-box {
+      padding: 0 20rpx;
+      margin-top: 60rpx;
+
+      .item-top {
+        display: flex;
+        justify-content: space-between;
+
+        .top-l,
+        .top-r {
+          color: #6b7280;
+          font-weight: bold;
+          font-size: 32rpx;
+          margin-top: 20rpx;
+        }
+      }
+
+      .item-content {
+        display: flex;
+        width: 100%;
+
+        .person-item {
+          margin-right: 20rpx;
+          text-align: center;
+          width: 25%;
+        }
+
+        .item-name {
+          font-size: 28rpx;
+          font-weight: bold;
+          color: #000;
+		  width: 100%;
+		  text-overflow: ellipsis;
+		  white-space: nowrap;
+		  overflow: hidden;
+        }
+
+        .person-item:last-child {
+          margin: 0;
+        }
+
+        .item-img {
+          width: 160rpx;
+          height: 160rpx;
+          border-radius: 100rpx;
+          margin: 60rpx 20rpx 0 0;
+        }
+
+        .dynamic-img {
+          width: 100%;
+          height: 500rpx;
+          margin-top: 60rpx;
+        }
+      }
+    }
+  }
+</style>

+ 239 - 0
src/PageMine/serviceCenter/index.vue

@@ -0,0 +1,239 @@
+<template>
+  <view class="container">
+<!--    <view class="title"> 常见问题 </view>
+    <view class="item-box issue-box">
+      <view class="item" :key="item" v-for="item of 4">
+        <view class="item-l">
+          <img class="img" src="@/static/logo.png" alt="" />
+        </view>
+        <view class="item-r"> 如何注销账户? </view>
+      </view>
+    </view> -->
+    <view v-for='item of init_list'>
+      <view class="title"> {{ item.name }} </view>
+      <view class="item-box hote-box" >
+        <view class="item" v-for='(itm,idx) of item.helpList' @click='handlerSkipDetail(itm)'>
+          <view class="item-l">
+            <img class="img" :src=" itm.icon ? itm.icon : require('@/static/logo.png')" alt="" />
+          </view>
+          <view class="item-r"> {{ itm.title }} </view>
+        </view>
+      </view>
+    </view>
+
+
+    <!-- <view class="title"> 在线客服 </view>
+    <view class="cust-box">
+      <view class="item" :key="item" v-for="item of 3">
+        <view class="item-l">
+          <img class="cust-img" src="@/static/logo.png" alt="" />
+        </view>
+        <view class="item-r">
+          <view class="r-title">客服小姐姐</view>
+          <view class="r-text">在线</view>
+        </view>
+      </view>
+    </view>
+    <u-button class="contact-btn" @click="handlerCallService">联系客服</u-button>
+
+    <view class="footer-item">
+      <view class="item" :key="item" v-for="item of footerList">
+        <view class="item-l">
+          {{ item.name }}
+        </view>
+        <view class="item-r">
+          <img class="cust-img" :src="item.imgs" alt="" />
+          <span class="r-span">{{ item.text }}</span>
+        </view>
+      </view>
+    </view>
+    <button class="feedback-btn" @click="handlerSubmitFeedback">提交反馈</button> -->
+  </view>
+</template>
+
+<script>
+  import { getProbleList } from "@/api/client/mine.js"
+export default {
+  data() {
+    return {
+      footerList: [
+        {
+          name: '反馈建议',
+          imgs: '../../../static/logo.png',
+          text: '客服热线:888-8888-8888',
+        },
+        {
+          name: '反馈内容',
+          imgs: '../../../static/logo.png',
+          text: '客服邮箱:kefu@xxx.com',
+        },
+        {
+          name: '联系方式',
+          imgs: '../../../static/logo.png',
+          text: '客服时间:周一至周五9:00-20:00',
+        },
+      ],
+      queryParams:{
+        paging:'1,10'
+      },
+      init_list:[]
+    };
+  },
+  mounted(){
+    this.handlerInitList()
+  },
+  methods: {
+    handlerInitList(){
+      getProbleList(this.queryParams).then(res=>{
+        this.init_list = res.data
+      })
+    },
+    // 点击联系客服
+    handlerCallService() {
+      uni.showToast({
+        title: '嘟...',
+        icon: 'none',
+      });
+    },
+    // 点击提交反馈
+    handlerSubmitFeedback() {
+      uni.showToast({
+        title: '不给提',
+        icon: 'none',
+      });
+    },
+    // 跳转到问题详情
+    handlerSkipDetail(itm){
+      console.log("@@@@itm",itm)
+      uni.navigateTo({
+        url:`/PageMine/serviceCenter/serviceDetail?itm=${JSON.stringify(itm)}`
+      })
+    }
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.container {
+  padding: 40rpx;
+  background-color: #fff;
+  height: calc(100vh - 80rpx);
+  .title {
+    font-size: 32rpx;
+    font-weight: bold;
+    color: #000;
+    margin-top: 20rpx;
+  }
+  .item-box {
+    display: flex;
+    justify-content: space-between;
+    flex-wrap: wrap;
+  }
+  .issue-box {
+    .item {
+      display: flex;
+      align-items: center;
+      padding: 20rpx 10rpx;
+      background-color: #f3f4f6;
+      border-radius: 20rpx;
+      width: 42%;
+      margin: 20rpx 10rpx;
+      .item-l {
+        .img {
+          width: 50rpx;
+          height: 50rpx;
+          border-radius: 50rpx;
+        }
+      }
+      .item-r {
+        margin-left: 20rpx;
+      }
+    }
+  }
+  .hote-box {
+    .item {
+      display: flex;
+      align-items: center;
+      padding: 20rpx 10rpx;
+      background-color: #f3f4f6;
+      border-radius: 20rpx;
+      margin: 10rpx;
+      width: 100%;
+      .item-l {
+        .img {
+          width: 50rpx;
+          height: 50rpx;
+          border-radius: 50rpx;
+        }
+      }
+      .item-r {
+        margin-left: 20rpx;
+      }
+    }
+  }
+
+  .cust-box {
+    .item {
+      display: flex;
+      align-items: center;
+      margin: 20rpx 10rpx;
+      .item-l {
+        .cust-img {
+          width: 80rpx;
+          height: 80rpx;
+          border-radius: 80rpx;
+        }
+      }
+      .item-r {
+        margin-left: 20rpx;
+        .r-title {
+          font-size: 28rpx;
+          font-weight: bold;
+          color: #000;
+        }
+        .r-text {
+          font-size: 28rpx;
+          color: #8a909a;
+        }
+      }
+    }
+  }
+  .footer-item {
+    margin: 40rpx 0;
+    .item {
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      margin: 20rpx 0;
+      .item-l {
+        font-size: 32rpx;
+        font-weight: bold;
+        color: #000;
+      }
+      .item-r {
+        display: flex;
+        align-items: center;
+        .cust-img {
+          width: 30rpx;
+          height: 30rpx;
+        }
+        .r-span {
+          color: #2d3643;
+          font-size: 28rpx;
+          margin-left: 20rpx;
+        }
+      }
+    }
+  }
+
+  .contact-btn {
+    font-size: 28rpx;
+  }
+  .feedback-btn {
+    background-color: #5992bb;
+    color: #fff;
+    font-size: 28rpx;
+    margin-top: 20rpx;
+  }
+}
+</style>

+ 40 - 0
src/PageMine/serviceCenter/serviceDetail.vue

@@ -0,0 +1,40 @@
+<template>
+  <view class="container">
+    <view class="title">
+      {{ init_list.title }}
+    </view>
+    <view class="content">
+      <!-- <u-parse :content=" "></u-parse> -->
+      {{ init_list.content }}
+    </view>
+  </view>
+</template>
+
+<script>
+  export default {
+    data() {
+      return {
+        init_list: []
+      }
+    },
+    onLoad(e) {
+      this.init_list = e.itm
+    }
+  }
+</script>
+
+<style lang="scss" scoped>
+  .container {
+    padding: 20rpx;
+
+    .title {
+      font-size: 32rpx;
+      font-weight: bold;
+      text-align: center;
+    }
+
+    .content {
+      margin-top: 20rpx;
+    }
+  }
+</style>

+ 119 - 0
src/PageMine/setting/aboutUs.vue

@@ -0,0 +1,119 @@
+<template>
+  <view class="container">
+    <view class="title">公司简介</view>
+    <view class="item-box">
+      <u--text size="13" :text="text"></u--text>
+      <u--text style="margin-top: 15rpx" size="13" :text="text1"></u--text>
+    </view>
+
+    <view class="title">联系我们</view>
+    <view class="item-box">
+      <view class="item">
+        <view class="item-r">
+          <p>电话:028-1314520</p>
+          <p class="item-p">13739464447</p>
+        </view>
+      </view>
+      <view class="item">
+        <view class="item-r">
+          <p>邮箱:xiangpei@chelvc.com</p>
+          <p class="item-p">2027758656@qq.com</p>
+        </view>
+      </view>
+      <view class="item">
+        <view class="item-r">地址:四川省成都市双流区商都路520号201室</view>
+      </view>
+    </view>
+
+    <view class="title">公司历程</view>
+    <view class="item-box">
+      <view class="progress-box">
+        <image class="img" src="@/static/logo.png" mode="aspectFill"></image>
+        <view class="progress-text">
+          <p>2023.1月 团队开始组建</p>
+          <p>2023.3月 项目开始开发</p>
+          <p>2024.1月 项目完成开发</p>
+          <p>2024.2月 正式进入运营阶段</p>
+          <p>2025.12月 开始准备IPO相关资料</p>
+          <p>2026.1月 成功在纳斯达克上市</p>
+        </view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script>
+  export default {
+    data() {
+      return {
+        text: '车旅程科技有限公司成立于2023年1月,是一家从事汽车后市场服务的移动互联网公司。公司搭建的养车一站式养车用车服务平台,从B端市场入局,通过整合上下游服务及资源,重新构建汽车后市场服务生态链,为保险、银行及大型集团提供综合汽车生活服务及增值服务解决方案。',
+        text1: '平台通过整合优质服务商,并对服务商实施严格的质量监控,现已在全国范围为合作方提供全面的服务。用户通过车旅程养车平台即可一站式享受方便快捷的各类汽车及生活服务。公司秉承“做有温度的汽车服务”的管理理念, 不断探索和创新与机构客户的合作模式。',
+      };
+    },
+  };
+</script>
+
+<style lang="scss" scoped>
+  .container {
+    padding: 40rpx;
+    background-color: #f3f4f6;
+    height: calc(100vh - 80rpx);
+
+    .title {
+      font-size: 42rpx;
+      font-weight: bold;
+      color: #000;
+      margin: 20rpx 0;
+    }
+
+    .item-box {
+      padding: 20rpx;
+      border-radius: 20rpx;
+      background-color: #fff;
+      line-height: 40rpx;
+
+      .item {
+        display: flex;
+        align-items: center;
+        margin-top: 10rpx;
+        font-size: 28rpx;
+        color: #424c5b;
+
+        .item-l {
+          .img {
+            width: 50rpx;
+            height: auto;
+          }
+        }
+
+        .item-r {
+          margin-left: 20rpx;
+        }
+      }
+
+      .progress-box {
+        display: flex;
+        justify-content: space-around;
+        align-items: center;
+        width: 100%;
+
+        .img {
+          width: 30%;
+          height: 240rpx;
+          margin-bottom: 20rpx;
+          border-radius:20rpx;
+        }
+
+        .progress-text {
+          font-size: 25rpx;
+          color: #424c5b;
+        }
+      }
+    }
+  }
+
+  .item-p {
+    position: relative;
+    left: 42px;
+  }
+</style>

+ 108 - 0
src/PageMine/setting/index.vue

@@ -0,0 +1,108 @@
+<template>
+  <view class="container">
+    <view class="main-out-box">
+      <view class="main-inner-box">
+        <u-cell-group :border="false">
+          <u-cell size="large" :border="false" icon="account-fill" title="个人信息" isLink
+            url="/PageMine/setting/personInformation" />
+          <!-- <u-cell size="large" :border="false" icon="fingerprint" title="安全中心" isLink
+            url="/pages/client/clientUser/mine/setting/personInfo" /> -->
+          <u-cell size="large" :border="false" icon="github-circle-fill" title="关于我们" isLink
+            url="/PageMine/setting/aboutUs" />
+          <u-cell size="large" :border="false" icon="file-text-fill" title="用户协议" isLink
+            url="/pages/webview/index?target=http://8.137.122.65:88/用户协议.html" />
+          <u-cell size="large" :border="false" icon="file-text" title="隐私政策" isLink
+            url="/pages/webview/index?target=http://8.137.122.65:88/隐私政策.html" />
+          <u-cell icon="integral-fill" title="版本信息" value="V0.0.1" />
+        </u-cell-group>
+      </view>
+    </view>
+
+    <!-- <view class="policy-out-box">
+      <view class="policy-inner-box">
+        <u-cell-group :border="false">
+          <u-cell size="large" :border="false" icon="level" title="切换身份" isLink @click="showSwitchDialog = true" />
+        </u-cell-group>
+      </view>
+    </view> -->
+
+    <u-modal :show="showSwitchDialog" :title="title" :content="content" @confirm="confirmSwitch"
+      @cancel="showSwitchDialog = false" :showCancelButton="true"></u-modal>
+
+    <view class="exit">
+      <u-button type="info" shape="circle" text="注销账号" class="button" />
+      <u-button type="primary" shape="circle" text="退出登录" @tap="logout" class="button" />
+    </view>
+  </view>
+</template>
+
+<script>
+  export default {
+    data() {
+      return {
+        showSwitchDialog: false,
+        title: '提醒',
+        content: '您确定要从用户端切换到商家端吗?',
+      };
+    },
+
+    methods: {
+      confirmSwitch() {
+        // this.showSwitchDialog = false;
+        // this.$store.dispatch('SwitchIdentity','MERCHANT')
+        // uni.navigateTo({
+        //   url: '/pages/merchant/mine/index',
+        // });
+      },
+      logout(){
+        this.$store.dispatch('Logout').then(()=>{
+          uni.navigateTo({
+            url: `pages/login/login`,
+          });
+        })
+      }
+    },
+  };
+</script>
+
+<style lang="scss" scoped>
+  .container {
+    min-height: 100vh;
+    background-color: #efefef;
+
+    .main-out-box {
+      padding: 20rpx 16rpx;
+      box-sizing: border-box;
+
+      .main-inner-box {
+        background-color: $uni-bg-color;
+        border-radius: 20rpx;
+      }
+    }
+
+    .policy-out-box {
+      padding: 50rpx 16rpx;
+      box-sizing: border-box;
+
+      .policy-inner-box {
+        background-color: $uni-bg-color;
+        border-radius: 20rpx;
+      }
+    }
+  }
+
+  .exit {
+    display: flex;
+    justify-content: space-around;
+    margin-top: 100rpx;
+  }
+
+  .button {
+    width: 500rpx;
+    margin-top: 45rpx;
+  }
+
+  ::v-deep .u-modal__title {
+    padding-top: 15px;
+  }
+</style>

+ 240 - 0
src/PageMine/setting/personInformation.vue

@@ -0,0 +1,240 @@
+<template>
+  <view class="ccontainer">
+    <view class="item-box">
+      <view class="item-left"> 头像 : </view>
+      <view class="item-right flex-end">
+        <image @click="handlerUploadImg" class="img" :src="uoloadImg"></image>
+      </view>
+    </view>
+    <view class="item-box">
+      <view class="item-left"> 昵称 : </view>
+      <view class="item-right">
+        <u--input placeholder="请输入内容" border="none" v-model="queryParams.nickname"></u--input>
+      </view>
+    </view>
+    <view class="item-box">
+      <view class="item-left"> 性别 : </view>
+      <view class="item-right">
+        <view class="sex-item">
+          <view class="item" v-for=" (item,index) of sexList" :class="current == index ? 'act-sex' : ''" :key="index"
+            @click="handlerSelectGender(item)"> {{ item.name }} </view>
+        </view>
+      </view>
+    </view>
+    <view class="item-box">
+      <view class="item-left"> 生日 : </view>
+      <view class="item-right right-time-box" @click="timeShow = true">
+        <view class="time-left" :class="queryParams.birthday ? '' : 'gray-color'">
+          {{ queryParams.birthday ? queryParams.birthday : '请选择您的生日' }}
+        </view>
+        <view class="time-right">
+          <u-icon name="arrow-right"></u-icon>
+        </view>
+      </view>
+    </view>
+
+    <u-datetime-picker :show="timeShow" v-model="time_value" mode="date" @cancel='timeShow = false'
+      @confirm='confirmTime' :minDate="0" :maxDate='maxDataTime'></u-datetime-picker>
+
+    <view class="btn-box">
+      <button class="btn" @click="handlerSubmitBtn">提交</button>
+    </view>
+  </view>
+</template>
+
+<script>
+  import {
+    getUserInfo
+  } from '@/api/user';
+  import {
+    uploadFile
+  } from "@/utils/upload"
+  export default {
+    data() {
+      return {
+        queryParams: {
+          avatar: '', // 头像
+          gender: '', //性别
+          birthday: '', //生日
+          nickname: '', //昵称
+        },
+        time_value: '',
+        timeShow: false,
+        sexList: [{
+            id: 0,
+            name: '男',
+            type: 'MALE'
+          },
+          {
+            id: 1,
+            name: '女',
+            type: 'FEMALE'
+          }
+        ],
+        current: 0,
+        uoloadImg: '',
+        maxDataTime: 0
+      }
+    },
+    mounted() {
+      this.maxDataTime = new Date().getTime()
+      getUserInfo().then(res => {
+        let {
+          avatar,
+          nickname,
+          gender,
+          birthday
+        } = res.data
+        this.uoloadImg = avatar
+        this.queryParams.avatar = avatar
+        this.queryParams.nickname = nickname
+        this.queryParams.birthday = uni.$u.timeFormat(birthday, 'yyyy-mm-dd');
+        if (gender) {
+          for (let key in gender) {
+            this.sexList.map(rs => {
+              if (key == rs.type) {
+                this.current = rs.id
+              }
+            })
+          }
+        }
+      })
+    },
+    methods: {
+      // 选择性别
+      handlerSelectGender(item) {
+        this.current = item.id
+      },
+      // 选择时间
+      confirmTime(e) {
+        this.queryParams.birthday = uni.$u.timeFormat(e.value, 'yyyy-mm-dd');
+        this.timeShow = false
+      },
+      // 上传头像
+      async handlerUploadImg() {
+        try {
+          const res = await uni.showActionSheet({
+            itemList: ['拍照', '从相册选择'],
+          });
+          if (res.tapIndex === 0) {
+            // 用户选择拍照
+            this.takeOrChoosePhoto(0);
+          } else if (res.tapIndex === 1) {
+            // 用户选择从相册选择
+            this.takeOrChoosePhoto(1);
+          }
+        } catch (error) {}
+      },
+      // 拍照
+      takeOrChoosePhoto(idx) {
+        uni.chooseImage({
+          sourceType: idx == 0 ? ['camera'] : ['album'],
+          count: 1,
+          success: res => {
+            const tempFilePaths = res.tempFilePaths;
+            // 调用上传图片的方法
+            this.uploadAvatar(tempFilePaths[0]);
+          },
+          fail: error => {
+            console.error(error);
+          },
+        });
+      },
+      // 上传头像
+      uploadAvatar(filePath) {
+        this.uoloadImg = filePath
+        uploadFile(filePath).then(res => {
+          this.queryParams.avatar = JSON.parse(res.data).data.url;
+        })
+        this.$forceUpdate(); // 手动触发组件的重新渲染
+      },
+
+      // 点击提交按钮
+      handlerSubmitBtn() {
+        this.queryParams.gender = this.sexList[this.current].type
+        this.$store.dispatch('UpdateUserInfo', this.queryParams).then(res => {
+          setTimeout(() => {
+            uni.navigateBack(-1)
+          }, 1500)
+        })
+      }
+    }
+  }
+</script>
+
+<style lang="scss" scoped>
+  .ccontainer {
+    padding: 20rpx;
+    box-sizing: border-box;
+    font-size: 28rpx;
+
+    .item-box {
+      display: flex;
+      padding: 20rpx;
+      box-shadow: 0 5rpx 15rpx 0rpx rgba(0, 0, 0, 0.1);
+      border-radius: 20rpx;
+      margin-bottom: 20rpx;
+      align-items: center;
+
+      .item-left {
+        margin-right: 20rpx;
+        width: 13%;
+      }
+
+      .item-right {
+        width: 87%;
+
+        .img {
+          width: 80rpx;
+          height: 80rpx;
+          border-radius: 50%;
+        }
+
+        .sex-item {
+          display: flex;
+
+          .item {
+            padding: 20rpx 30rpx;
+            background-color: #F7F7F7;
+            border-radius: 10rpx;
+            text-align: center;
+            font-size: 28rpx;
+          }
+
+          .act-sex {
+            border: 2rpx solid #5992BB;
+            background-color: #5992BB;
+            color: #fff !important;
+          }
+        }
+      }
+
+      .right-time-box {
+        display: flex;
+        justify-content: space-between;
+      }
+
+      .flex-end {
+        display: flex;
+        justify-content: flex-end;
+      }
+    }
+
+    .btn-box {
+      margin-top: 100rpx;
+
+      .btn {
+        border-radius: 20rpx;
+        padding: 10rpx;
+        font-size: 28rpx;
+        color: #fff;
+        background: linear-gradient(to right, #e8cbc0, #636fa4);
+        box-shadow: 0 5rpx 15rpx 0 rgba(99, 111, 164, 0.2);
+      }
+    }
+  }
+
+  .gray-color {
+    color: #D2D5DB;
+  }
+</style>

+ 371 - 0
src/PageMine/shopCar.vue

@@ -0,0 +1,371 @@
+<template>
+  <view class="cart">
+    <view class="manage">
+      <view @click="handlerManage">管理</view>
+      <!-- <view>退出管理</view> -->
+    </view>
+    <!-- 列表1 -->
+    <!-- <CartList :init_list.sync='init_list' :isAllSecect.sync='isAllSecect' @handlerIsSelectAll='handlerIsSelectAll'></CartList> -->
+    <view>
+      <u-checkbox-group shape="circle" placement="column" v-model="goodsCheckbox">
+        <view class="item-box" v-for="(item, index) of init_list" :key="index">
+          <view class="item-top" @click="handlerSkipShopDetail(item)">
+            <view class="top-title"> {{ item.name }} </view>
+            <u-icon name="arrow-right"></u-icon>
+          </view>
+          <view
+            class="item"
+            v-for="(itm, idx) of item.cartItems"
+            :key="idx"
+            @click="handlerSkipGoodsDetail(item, idx)"
+          >
+            <view class="item-l">
+              <view class="l-l">
+                <u-checkbox :name="itm.id"></u-checkbox>
+              </view>
+              <view class="l-r">
+                <image class="r-img" :src="itm.goodsPic" mode="aspectFill"></image>
+                <view class="r-box">
+                  <view class="r-name">{{ itm.goodsName }}</view>
+                  <view class="r-discript">{{ itm.goodsName }}</view>
+                  <view class="r-price">¥{{ (itm.price * itm.quantity).toFixed(2) }}</view>
+                </view>
+              </view>
+            </view>
+            <view class="item-r">
+              <u-number-box v-model="itm.quantity" @change="valChange(itm, $event)"></u-number-box>
+            </view>
+          </view>
+        </view>
+      </u-checkbox-group>
+    </view>
+
+    <!-- 底部1 -->
+    <view class="bottom fl-flex-item">
+      <!-- <u-checkbox-group shape="circle" v-model="isAllSecect" @change="isAllChange">
+        <u-checkbox label="全部" name="0"> </u-checkbox>
+      </u-checkbox-group> -->
+	  <view class=""> </view>
+      <view class="bottom-price" v-show="!manageShow">
+        <view>
+          <text style="font-size: 22rpx; color: #333">合计:</text>
+          <text style="font-size: 22rpx">¥</text>
+          <text style="font-size: 34rpx; font-weight: 800">{{ allPrice.sum }}</text>
+        </view>
+        <view class="favorable fl-flex">
+          <text style="margin-right: 10rpx">
+            已优惠
+            <text style="font-weight: 800">¥255</text>
+          </text>
+          <!-- <view class="fl-flex" @click="instructionShow = true"> -->
+          <view class="fl-flex">
+            <text style="margin-right: 5rpx">优惠明细</text>
+            <u-icon name="arrow-up" color="#fe7b21" size="12" />
+          </view>
+        </view>
+      </view>
+      <view class="settleAccount" @click="handlerSettleBill">
+        {{ !manageShow ? `结算( ${allPrice.goodsNumber} )` : `删除( ${allPrice.goodsNumber} ) ` }}
+      </view>
+    </view>
+
+    <!-- <u-popup :show="instructionShow" mode="bottom" @close="instructionShow = false" round="20">
+      <view class="pop-box">
+        <text>出淤泥而不染,濯清涟而不妖</text>
+      </view>
+    </u-popup> -->
+  </view>
+</template>
+
+<script>
+import {
+  getShoppingCart,
+  deleteCartItem,
+  editGoodsNumb,
+  generateConfirmOrder,
+} from '@/api/client/business.js';
+export default {
+  data() {
+    return {
+      init_list: [],
+      isAllSecect: [], //checkbox是否全选
+      goodsCheckbox: [], //checkbox选择商品
+      sumPrice: 0,
+      instructionShow: false, // 底部优惠明细
+
+      manageShow: false,
+      queryParams: {
+        paging: '1,10',
+      },
+      AllGoods: [],
+    };
+  },
+  onShow() {
+    this.handlerInitList();
+  },
+  watch: {
+    goodsCheckbox(newValue) {
+      if (
+        newValue.length == this.AllGoods.length &&
+        (newValue.length != 0 || this.AllGoods.length != 0)
+      ) {
+        this.isAllSecect.push('0');
+      } else {
+        this.isAllSecect = [];
+      }
+    },
+  },
+  computed: {
+    allPrice() {
+      let sum = 0;
+      let goodsNumber = 0;
+      this.goodsCheckbox.map(rs => {
+        this.AllGoods.map(rc => {
+          if (rs == rc.id) {
+            rc.allPrice = Number((rc.price * rc.quantity).toFixed(2));
+            sum += rc.allPrice;
+            goodsNumber += rc.quantity;
+          }
+        });
+      });
+      return {
+        sum,
+        goodsNumber,
+      };
+    },
+  },
+  methods: {
+    // 初始化购物车列表
+    handlerInitList() {
+      getShoppingCart(this.queryParams).then(res => {
+        this.init_list = res.data.records;
+        this.init_list.map(rs => {
+          rs.cartItems.map(rc => {
+            this.AllGoods.push(rc);
+          });
+        });
+      });
+    },
+    // 结算按钮
+    handlerSettleBill() {
+      if (this.manageShow) {
+        deleteCartItem(this.goodsCheckbox.join(',')).then(res => {
+          if (res.code === 'OK') {
+            uni.showToast({
+              title: '删除成功',
+              icon: 'none',
+            });
+            this.handlerInitList();
+            this.AllGoods = [];
+            this.isAllSecect = [];
+            this.goodsCheckbox = [];
+          } else {
+            uni.showToast({
+              title: res.msg,
+              icon: 'none',
+            });
+            return;
+          }
+        });
+      } else {
+        let sumbutArray = [];
+        this.init_list.map(rs => {
+          rs.cartItems.map(rc => {
+            this.goodsCheckbox.map(rd => {
+              if (rc.id == rd) {
+                sumbutArray.push(rs.id);
+              }
+            });
+          });
+        });
+        let a = Array.from(new Set(sumbutArray));
+        if (a.length > 1) {
+          uni.showToast({
+            title: '不能同时下单多个商家',
+            icon: 'none',
+          });
+          return;
+        } else {
+          generateConfirmOrder({
+            cartIds: this.goodsCheckbox,
+            payType: 2,
+          }).then(res => {
+            if (res.code === 'OK') {
+              uni.navigateTo({
+                url: `/pages/client/clientPackage/uptickOrder?ids=${a[0]}`,
+              });
+            }
+          });
+        }
+      }
+    },
+    // 修改商品数量
+    valChange(item, e) {
+      editGoodsNumb(item.id, {
+        quantity: e.value,
+      }).then(res => {
+        console.log('@@@2res', res);
+      });
+    },
+
+    // 是否多选
+    isAllChange(e) {
+      if (e.length) {
+        this.goodsCheckbox = [];
+        this.AllGoods.map(rs => {
+          this.goodsCheckbox.push(rs.id);
+        });
+      } else {
+        this.goodsCheckbox = [];
+      }
+    },
+    // 管理按钮
+    handlerManage() {
+      this.manageShow = !this.manageShow;
+      this.goodsCheckbox = [];
+    },
+    // 跳转到商家详情
+    handlerSkipShopDetail(item) {
+      uni.navigateTo({
+        url: `/pages/client/clientPackage/storeDetail?id=${item.id}`,
+      });
+    },
+    // 跳转到商品详情
+    handlerSkipGoodsDetail(item, idx) {
+      uni.navigateTo({
+        url: `/pages/client/clientPackage/serviceDetail/index?id=${item.cartItems[idx].goodsId}&shopId=${item.id}`,
+      });
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.cart {
+  min-height: 100vh;
+  padding: 0 20rpx;
+  box-sizing: border-box;
+  background-color: $uni-bg-color-page;
+
+  .manage {
+    display: flex;
+    justify-content: flex-end;
+    padding: 20rpx 0;
+    color: #333;
+    padding-right: 20rpx;
+  }
+
+  .bottom {
+    height: 100rpx;
+    padding: 10rpx 20rpx 40rpx 20rpx;
+    position: fixed;
+    left: 0;
+    bottom: 0;
+    right: 0;
+    background-color: #fff;
+    text-align: end;
+    border-top: 2rpx solid #eee;
+
+    .bottom-price {
+      margin-right: 20rpx;
+      font-size: 24rpx;
+      color: #fe621a;
+    }
+
+    .settleAccount {
+      width: 160rpx;
+      height: 60rpx;
+      color: #fff;
+      display: flex;
+      background-color: #fe641c;
+      justify-content: center;
+      align-items: center;
+      font-size: 26rpx;
+      border-radius: 30rpx;
+    }
+  }
+}
+
+.item-box {
+  background-color: #ffffff;
+  padding: 4rpx 20rpx;
+  border-radius: 10rpx;
+  margin-bottom: 20rpx;
+
+  .item-top {
+    padding: 20rpx;
+    box-sizing: border-box;
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+
+    .top-title {
+      font-weight: bold;
+      font-size: 32rpx;
+    }
+  }
+}
+
+.item {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 20rpx;
+
+  .item-l {
+    width: 70%;
+    display: flex;
+    align-items: center;
+
+    .l-r {
+      display: flex;
+
+      .r-img {
+        width: 200rpx;
+        height: 200rpx;
+        border-radius: 10rpx;
+        margin-right: 10rpx;
+      }
+
+      .r-box {
+        display: flex;
+        flex-direction: column;
+        justify-content: space-around;
+        width: 50%;
+
+        .r-name {
+          font-size: 34rpx;
+          font-weight: bold;
+        }
+
+        .r-discript {
+          max-width: 200rpx;
+          background-color: #f7f8fa;
+          padding: 5rpx 10rpx;
+          border-radius: 10rpx;
+          display: -webkit-box;
+          -webkit-line-clamp: 2;
+          -webkit-box-orient: vertical;
+          overflow: hidden;
+          text-overflow: ellipsis;
+        }
+
+        .r-price {
+          color: #ff4d60;
+          font-weight: bold;
+          font-size: 28rpx;
+        }
+      }
+    }
+  }
+
+  .item-r {
+    width: 30%;
+  }
+}
+
+.pop-box {
+  min-height: 400rpx;
+  padding: 20rpx;
+}
+</style>

+ 0 - 0
src/pagesHome/home/components/serviceItem.vue → src/components/service/serviceItem.vue


+ 65 - 2
src/pages.json

@@ -151,7 +151,70 @@
 				"style": {
 					"navigationBarTitleText": "订单评价"
 				}
-			}]
+			},{
+				"path": "favourite",
+				"style": {
+					"navigationBarTitleText": "收藏列表"
+				}
+			},
+      {
+      	"path": "shopCar",
+      	"style": {
+      		"navigationBarTitleText": "购物车"
+      	}
+      },
+      {
+      	"path": "coupon",
+      	"style": {
+      		"navigationBarTitleText": "优惠券列表"
+      	}
+      },{
+      	"path": "goodsReserve",
+      	"style": {
+      		"navigationBarTitleText": "商品预约"
+      	}
+      },
+      {
+      	"path": "myTeam",
+      	"style": {
+      		"navigationBarTitleText": "我的团队"
+      	}
+      },{
+      	"path": "serviceCenter/index",
+      	"style": {
+      		"navigationBarTitleText": "客服中心"
+      	}
+      },{
+      	"path": "serviceCenter/serviceDetail",
+      	"style": {
+      		"navigationBarTitleText": "问题详情"
+      	}
+      },{
+      	"path": "feedback",
+      	"style": {
+      		"navigationBarTitleText": "意见反馈"
+      	}
+      },{
+      	"path": "aboutUs",
+      	"style": {
+      		"navigationBarTitleText": "关于我们"
+      	}
+      },{
+      	"path": "setting/index",
+      	"style": {
+      		"navigationBarTitleText": "设置"
+      	}
+      },{
+      	"path": "setting/personInformation",
+      	"style": {
+      		"navigationBarTitleText": "个人信息"
+      	}
+      },{
+      	"path": "setting/aboutUs",
+      	"style": {
+      		"navigationBarTitleText": "关于我们"
+      	}
+      }]
 		}
 	],
 	"tabBar": {
@@ -206,4 +269,4 @@
 			"query": "" //启动参数,在页面的onLoad函数里面得到
 		}]
 	}
-}
+}

+ 5 - 5
src/pages/tabbar/components/TapList.vue

@@ -26,7 +26,7 @@
             id: '0',
             icon: 'list-dot',
             title: '预约列表',
-            url: '/pages/client/clientUser/mine/appoint/appoint',
+            url: '/PageMine/goodsReserve',
           }
           // ,
           // {
@@ -47,28 +47,28 @@
             id: '1',
             icon: 'plus-people-fill',
             title: '我的团队',
-            url: '/pages/client/clientUser/myGroup',
+            url: '/PageMine/myTeam',
             isLink: true,
           },
           {
             id: '2',
             icon: 'server-man',
             title: '客服中心',
-            url: '/pages/client/clientUser/serviceCenter',
+            url: '/PageMine/serviceCenter/index',
             isLink: true,
           },
           {
             id: '3',
             icon: 'share-square',
             title: '意见反馈',
-            url: '/pages/client/clientUser/mine/setting/feedback',
+            url: '/PageMine/feedback',
             isLink: true,
           },
           {
             id: '4',
             icon: 'thumb-up',
             title: '关于我们',
-            url: '/pages/client/clientUser/mine/setting/aboutMine',
+            url: '/PageMine/aboutUs',
             isLink: true,
           },
         ],

+ 6 - 6
src/pages/tabbar/mine.vue

@@ -12,7 +12,7 @@
 						<view>
 							<view class="nickname">{{ nickname }}</view>
 							<view class="flex">
-								<text class="setAuth" @tap="$Router.push('/pages/client/clientUser/mine/setting')">
+								<text class="setAuth" @tap="$Router.push('/PageMine/setting/index')">
 									设置
 								</text>
 								<!-- <text class="setAuth">认证</text> -->
@@ -20,7 +20,7 @@
 						</view>
 					</view>
 
-					<view @tap="$Router.push('/pages/client/clientUser/mine/setting')">
+					<view @tap="$Router.push('/PageMine/setting/index')">
 						<u-icon name="setting" color="#ffffff" size="26"></u-icon>
 					</view>
 				</view>
@@ -90,7 +90,7 @@
 				collectList: [{
 						name: 'photo',
 						title: '收藏',
-						url: '/pages/client/clientUser/collectList',
+						url: '/PageMine/favourite',
 					},
 					// {
 					//   name: 'lock',
@@ -100,12 +100,12 @@
 					{
 						name: 'star',
 						title: '购物车',
-						url: '/pages/client/clientUser/cart/index',
+						url: '/PageMine/shopCar',
 					},
 					{
 						name: 'hourglass',
 						title: '优惠券',
-						url: '/pages/client/clientUser/coupon',
+						url: '/PageMine/coupon',
 					},
 				],
 				oderList: [{
@@ -288,4 +288,4 @@
 	.flex {
 		display: flex;
 	}
-</style>
+</style>

+ 1 - 1
src/pagesHome/home/nearbyBusiness.vue

@@ -12,7 +12,7 @@
     getHomePageApi,
     getCurrentLocation
   } from '@/api/client/home';
-  import serviceItem from './components/serviceItem.vue';
+  import serviceItem from '@/components/service/serviceItem.vue';
   import {
     mapGetters
   } from "vuex"

+ 1 - 1
src/pagesHome/home/popularRecommend.vue

@@ -12,7 +12,7 @@
     getHomePageApi,
     getCurrentLocation
   } from '@/api/client/home';
-  import serviceItem from './components/serviceItem.vue';
+  import serviceItem from '@/components/service/serviceItem.vue';
   import {
     mapGetters
   } from "vuex"

Some files were not shown because too many files changed in this diff