Просмотр исходного кода

feat:积分商城串联业务逻辑,任务+积分详情+去任务跳转逻辑

xyh 5 месяцев назад
Родитель
Сommit
ed113bd099

+ 9 - 0
src/api/index.js

@@ -1,4 +1,13 @@
 import request from "@/utils/request.js";
+//区域根据name获取code接口
+export function getCityCode(data) {
+    return request({
+        method: 'get',
+        url: '/area/code',
+        data
+    });
+}
+
 
 // 图片上传
 export function imgUpload(data) {

+ 4 - 4
src/api/points.js

@@ -1,17 +1,17 @@
 import request from "@/utils/request.js";
 
 //获取我的积分信息
-export function getMyPoint(query) {
+export function getMyPoint(data) {
     return request({
         method: 'get',
         url: '/user/point',
-        query: query
+        data
     });
 }
 //周签到信息查询
 export function getSignPoint(data) {
     return request({
-        method: 'get',
+        method: 'post',
         url: '/point/activity/sign/info',
         data
     });
@@ -20,7 +20,7 @@ export function getSignPoint(data) {
 //用户签到接口
 export function signPoint(data) {
     return request({
-        method: 'get',
+        method: 'post',
         url: '/point/activity/sign',
         data
     });

+ 35 - 13
src/pages/index/index.vue

@@ -146,6 +146,7 @@ import {
   getAccessToken,
   getRecommendList,
   netCouponReceive,
+  getCityCode,
 } from '@/api/index'
 export default {
   data() {
@@ -250,15 +251,36 @@ export default {
       })
     },
     async getCityInfo(latitude, longitude) {
-      const amapKey = '5457092e6c62b83c1b2e45dbe973d858';
-      const url = `https://restapi.amap.com/v3/geocode/regeo?key=${amapKey}&location=${longitude},${latitude}`;
-      const res = await uni.request({
-        url: url,
-        method: 'GET'
-      });
-      uni.setStorageSync('selectCity', res.data.regeocode.addressComponent.city)
-      uni.setStorageSync('selectCitycode', '140110')
-        console.log('高德API返回:', res.data.regeocode.addressComponent.city);
+      if (!latitude || !longitude) {
+        console.error('经纬度参数不能为空');
+        return;
+      }
+      try {
+        const amapKey = '5457092e6c62b83c1b2e45dbe973d858';
+        const url = `https://restapi.amap.com/v3/geocode/regeo?key=${amapKey}&location=${longitude},${latitude}`;
+        const res = await uni.request({
+          url: url,
+          method: 'GET',
+        });
+        if (!res.data || !res.data.regeocode || !res.data.regeocode.addressComponent) {
+          console.error('获取城市信息失败:响应数据格式错误');
+          return;
+        }
+        const city = res.data.regeocode.addressComponent.city;
+        if (!city) {
+          console.error('获取城市信息失败:未找到城市名称');
+          return;
+        }
+        uni.setStorageSync('selectCity', city);
+        const resquery = await getCityCode({name: city});
+        if (!resquery || !resquery.data || !resquery.data.data) {
+          console.error('获取城市代码失败:响应数据格式错误');
+          return;
+        }
+        uni.setStorageSync('selectCitycode', resquery.data.data);
+      } catch (error) {
+        console.error('获取城市信息失败:', error);
+      }
     },
     // 获取商品分类
     getCatetory() {
@@ -353,10 +375,10 @@ export default {
     },
     // 静默登录
     onLogin(wxCode) {
-      let res = {"code":200,"msg":"操作成功","data":{"token":"eyJhbGciOiJIUzUxMiJ9.eyJ0ZjoiOiI3NzdkMzczMC03NWQ4LTQ1OGYtYmE3Yy1hMTJhM2RiMGI5MGYifQ.6fjnNOgNwSllGJ1wllF5xYojFqwMDQ8yRoJ2BnMGlJDeAlePB6KjKSmJ-E5KxS7qoDgXPFOMQQDDSZcsF3GAPQ","id":"2033845259451543553","loginTime":1775114559991,"expireTime":1775719359991,"ipaddr":"172.24.144.218","loginLocation":"内网IP","browser":"Mobile Safari","os":"Mac OS X (iPhone)","nickName":null,"code":null,"role":1,"enabled":false,"password":null,"authorities":null,"username":null,"cphone":null,"cnickName":"名字","copenid":"o7Txd6o8yxUPo6o00Q4fum4JjPJE","cicon":"https://thirdwx.qlogo.cn/mmopen/vi_32/hBiaibicQOu5sF8AicvXyOmVWDKiayct5TcYFTic94NBIa76SMTrHF4icRPDibdG4pxXCNJWtYc4iag7zX2Eia0UadENPzuRh8A7PZAibyXibEZpvpYiabIY/132","accountNonExpired":false,"accountNonLocked":false,"credentialsNonExpired":false,"csessionKey":"102_Qj1zgSWBZAaA5gi9Joa8sRQxo334WTeEuD8SfgIwKFsLnz9gyyOjrjpNPqMa7mWcQUljz_ABcaXLsSCIDkWlKlOUEfAoqBeGuW7Wejnjsoc","cunionid":null,"dmoney":0.30,"nnum":1,"caddressList":null,"dbalance":0.00,"dallMoney":0.00,"cscanImg":null,"cupUser":null,"cmrAddressId":null}};
-      uni.setStorageSync('wx_copenid', res.data.copenid)
-      uni.setStorageSync('access-token', res.data.token)
-      return false;
+      // let res = {"code":200,"msg":"操作成功","data":{"token":"eyJhbGciOiJIUzUxMiJ9.eyJ0ZjoiOiI3NzdkMzczMC03NWQ4LTQ1OGYtYmE3Yy1hMTJhM2RiMGI5MGYifQ.6fjnNOgNwSllGJ1wllF5xYojFqwMDQ8yRoJ2BnMGlJDeAlePB6KjKSmJ-E5KxS7qoDgXPFOMQQDDSZcsF3GAPQ","id":"2033845259451543553","loginTime":1775114559991,"expireTime":1775719359991,"ipaddr":"172.24.144.218","loginLocation":"内网IP","browser":"Mobile Safari","os":"Mac OS X (iPhone)","nickName":null,"code":null,"role":1,"enabled":false,"password":null,"authorities":null,"username":null,"cphone":null,"cnickName":"名字","copenid":"o7Txd6o8yxUPo6o00Q4fum4JjPJE","cicon":"https://thirdwx.qlogo.cn/mmopen/vi_32/hBiaibicQOu5sF8AicvXyOmVWDKiayct5TcYFTic94NBIa76SMTrHF4icRPDibdG4pxXCNJWtYc4iag7zX2Eia0UadENPzuRh8A7PZAibyXibEZpvpYiabIY/132","accountNonExpired":false,"accountNonLocked":false,"credentialsNonExpired":false,"csessionKey":"102_Qj1zgSWBZAaA5gi9Joa8sRQxo334WTeEuD8SfgIwKFsLnz9gyyOjrjpNPqMa7mWcQUljz_ABcaXLsSCIDkWlKlOUEfAoqBeGuW7Wejnjsoc","cunionid":null,"dmoney":0.30,"nnum":1,"caddressList":null,"dbalance":0.00,"dallMoney":0.00,"cscanImg":null,"cupUser":null,"cmrAddressId":null}};
+      // uni.setStorageSync('wx_copenid', res.data.copenid)
+      // uni.setStorageSync('access-token', res.data.token)
+      // return false;
       let params = {
         code: wxCode,
       }

+ 13 - 2
src/pages/my/my.vue

@@ -85,7 +85,7 @@
 			</view>
       <view class="item" @click="goPoints">
         <image class="img" src="/static/other/collect.png" mode="" />
-        <view class="val">积分 <text>{{ collectNum }}</text> 分</view>
+        <view class="val">积分 <text>{{ totalPoints }}</text> 分</view>
       </view>
 			<view class="item" @click="goCoupon">
 				<image class="img" src="/static/other/coupon.png" mode="" />
@@ -133,6 +133,7 @@ import {
 	getwxQrCode,
 	getMerchantData,
 } from '@/api/index.js'
+import { mapState, mapActions } from 'vuex';
 export default {
 	data() {
 		return {
@@ -166,6 +167,13 @@ export default {
 		}
 	},
 	computed: {
+    ...mapState({
+      myPoint: state => state.points.myPoint
+    }),
+    // 总积分
+    totalPoints() {
+      return this.myPoint && this.myPoint.totalPoints || 0;
+    },
 		// 拆分功能数据
 		splitData() {
 			if (!Array.isArray(this.moreFunctions) || this.moreFunctions.length === 0) {
@@ -187,10 +195,13 @@ export default {
 		this.getCoupon();
 		this.getMerData();
 		this.getCollectData();
-
+    this.getPointsInfo();
 		// this.getQrCode();
 	},
 	methods: {
+    ...mapActions([
+      'getPointsInfo'
+    ]),
 		// 用户数据
 		getData() {
 			this.userInfo = {};

+ 30 - 1
src/points/components/sign-in/sign-in.vue

@@ -3,7 +3,12 @@
     <view class="sign-in-header">
       <text class="sign-in-title">签到领积分</text>
     </view>
-    <view class="sign-in-days">
+    <!-- 加载状态 -->
+    <view v-if="loading" class="sign-in-loading">
+      <u-loading-icon text="加载中..." mode="circle"></u-loading-icon>
+    </view>
+    <!-- 签到数据 -->
+    <view v-else-if="signData && signData.length > 0" class="sign-in-days">
       <view 
         v-for="(day, index) in signData"
         :key="index"
@@ -18,6 +23,10 @@
         <text :class="day.status === '1' ? 'sign-day-text' : 'day-text'">{{ getSignText(day) }}</text>
       </view>
     </view>
+    <!-- 空状态 -->
+    <view class="sign-in-empty" v-else>
+    暂无签到活动
+    </view>
   </view>
 </template>
 
@@ -30,6 +39,10 @@ export default {
     signData: {
       type: Array,
       default: () => []
+    },
+    loading: {
+      type: Boolean,
+      default: false
     }
   },
   data() {
@@ -78,6 +91,13 @@ export default {
     }
   }
   
+  .sign-in-loading {
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    min-height: 200rpx;
+  }
+  
   .sign-in-days {
     display: flex;
     justify-content: space-between;
@@ -133,5 +153,14 @@ export default {
       }
     }
   }
+  
+  .sign-in-empty {
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    min-height: 145rpx;
+    color: #8f9ca2;
+    font-size: 28rpx;
+  }
 }
 </style>

+ 56 - 25
src/points/components/task-list/task-list.vue

@@ -3,37 +3,48 @@
     <view class="task-list-header">
       <text class="task-list-title">做任务赚积分</text>
     </view>
-    <view class="task-list">
-      <view 
-        v-for="task in taskData"
-        :key="task.activityId"
-        class="task-item">
-        <view class="task-item-left">
-          <view class="task-icon">
-            <ImageItem :src="getTaskIcon(task.taskName)" />
-          </view>
+    <!-- 加载状态 -->
+    <view v-if="loading" class="task-list-loading">
+      <u-loading-icon text="加载中..." mode="circle"></u-loading-icon>
+    </view>
+    <!-- 任务数据 -->
+    <view v-else-if="taskData && taskData.length > 0">
+      <view class="task-list">
+        <view 
+          v-for="task in taskData"
+          :key="task.activityId"
+          class="task-item">
+          <view class="task-item-left">
+            <view class="task-icon">
+              <ImageItem :src="getTaskIcon(task.taskName)" />
+            </view>
 
-          <view class="task-info">
-            <view class="task-name">{{ task.taskName }}</view>
-            <view class="task-reward">
-              <ImageItem src="/static/points/point.png"/>
-              <text>+{{ task.rewardPoints }}</text>
+            <view class="task-info">
+              <view class="task-name">{{ task.taskName }}</view>
+              <view class="task-reward">
+                <ImageItem src="/static/points/point.png"/>
+                <text>+{{ task.rewardPoints }}</text>
+              </view>
             </view>
           </view>
+          <view class="task-item-right">
+            <button 
+              :class="task.completedStatus == 1 ? 'task-btn' : 'no-task-btn'" 
+              @click.stop="handleTask(task)"
+              :disabled="task.completedStatus == 1"
+            >
+              {{ task.completedStatus == 1 ? '已完成' : '去完成' }}
+            </button>
+          </view>
         </view>
-        <view class="task-item-right">
-          <button 
-            :class="task.completedStatus == 1 ? 'task-btn' : 'no-task-btn'" 
-            @click.stop="handleTask(task)"
-            :disabled="task.completedStatus == 1"
-          >
-            {{ task.completedStatus == 1 ? '已完成' : '去完成' }}
-          </button>
-        </view>
+      </view>
+      <view class="more-tasks" @click="handleMoreTasks">
+        赚更多积分 >
       </view>
     </view>
-    <view class="more-tasks" @click="handleMoreTasks">
-      赚更多积分 >
+    <!-- 空状态 -->
+    <view v-else class="task-list-empty">
+     暂无任务活动
     </view>
   </view>
 </template>
@@ -47,6 +58,10 @@ export default {
     taskData: {
       type: Array,
       default: () => []
+    },
+    loading: {
+      type: Boolean,
+      default: false
     }
   },
   data() {
@@ -162,6 +177,13 @@ export default {
     }
   }
   
+  .task-list-loading {
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    min-height: 200rpx;
+  }
+  
   .task-list {
     .task-item {
       display: flex;
@@ -251,5 +273,14 @@ export default {
     font-size: 28rpx;
     color: #999999;
   }
+  
+  .task-list-empty {
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    min-height: 266rpx;
+    color: #8f9ca2;
+    font-size: 28rpx;
+  }
 }
 </style>

+ 30 - 86
src/points/home/index.vue

@@ -44,10 +44,6 @@ export default {
     }
   },
   onLoad(options) {
-    // 初始化数据
-    this.initData();
-    // 绑定滚动事件
-    this.bindScrollEvent();
     // 检查 URL 参数,如果需要滚动到搜索框
     if (options.scrollToSearch === '1') {
       // 延迟执行,确保页面已经加载完成
@@ -56,7 +52,13 @@ export default {
       }, 1000);
     }
   },
-  beforeUnmount() {
+  onReady() {
+    // 初始化数据
+    this.initData();
+    // 绑定滚动事件
+    this.bindScrollEvent();
+  },
+  onUnload() {
     // 解绑滚动事件
     this.unbindScrollEvent();
   },
@@ -92,55 +94,9 @@ export default {
     async fetchSignList() {
       this.loading.sign = true;
       try {
-        // 实际项目中使用真实API
-        // const res = await getSignPoint({
-        //   cityName: uni.getStorageSync('selectCity'),
-        //   cityCode: uni.getStorageSync('selectCitycode'),
-        // });
-        
-        // 模拟数据
-        const res = {
-          data: [
-            {
-              "date": "01-30",
-              "points": 1,
-              "status": 1
-            },
-            {
-              "date": "02-01",
-              "points": 0,
-              "status": 0
-            },
-            {
-              "date": "02-02",
-              "points": 1,
-              "status": 1
-            },
-            {
-              "date": "02-03",
-              "points": 1,
-              "status": 0
-            },
-            {
-              "date": "02-04",
-              "points": 1,
-              "status": 0
-            },
-            {
-              "date": "02-05",
-              "points": 1,
-              "status": 0
-            },
-            {
-              "date": "02-06",
-              "points": 3,
-              "status": 0
-            }
-          ],
-          code: 200,
-          msg: "查询成功"
-        };
-        
+        const res = await getSignPoint({
+          cityCode: uni.getStorageSync('selectCitycode')
+        });
         if (res.code === 200) {
           this.signData = res.data;
         }
@@ -154,36 +110,9 @@ export default {
     async fetchTaskList() {
       this.loading.task = true;
       try {
-        // 实际项目中使用真实API
-        // const res = await getHomeTask({
-        //   cityName: uni.getStorageSync('selectCity'),
-        //   cityCode: uni.getStorageSync('selectCitycode'),
-        // });
-        
-        // 模拟数据
-        const res = {
-          data: [
-            {
-              "activityId": 21,
-              "taskName": "浏览动态",
-              "rewardPoints": 10,
-              "completedCount": 1,
-              "triggerValue": 2,
-              "completedStatus": 0
-            },
-            {
-              "activityId": 22,
-              "taskName": "完成一次订单",
-              "rewardPoints": 20,
-              "completedCount": 3,
-              "triggerValue": 2,
-              "completedStatus": 1
-            }
-          ],
-          code: 200,
-          msg: "查询成功"
-        };
-        
+        const res = await getHomeTask({
+          cityCode: uni.getStorageSync('selectCitycode'),
+        });
         if (res.code === 200) {
           this.taskData = res.data;
         }
@@ -261,7 +190,9 @@ export default {
     },
     // 处理签到
     handleSign(index) {
-      signPoint().then(res => {
+      signPoint({
+        cityCode: uni.getStorageSync('selectCitycode'),
+      }).then(res => {
         if (res.code === 200) {
           this.signData[index].status = 1;
         }
@@ -284,7 +215,20 @@ export default {
     // 滚动到搜索框
     scrollToSearch() {
       // 滚动到商品列表的位置,使搜索框显示在顶部
-      const scrollDistance = 470; // 积分任务区域的高度
+      let scrollDistance = 470; // 默认值,作为兜底
+      
+      // 尝试获取积分任务区域的实际高度
+      try {
+        // 获取积分任务区域的元素
+        const taskArea = this.$el.querySelector('.points-task');
+        if (taskArea) {
+          // 获取元素的实际高度
+          const rect = taskArea.getBoundingClientRect();
+          scrollDistance = rect.height;
+        }
+      } catch (error) {
+        console.error('获取任务区域高度失败:', error);
+      }
       
       if (process.env.UNI_PLATFORM === 'h5') {
         // 在H5端使用元素的scrollTop

+ 9 - 0
src/points/order/orderDetails.vue

@@ -41,6 +41,15 @@ export default {
       afterSalesType: 'exchange' // 售后类型:refund(退货), exchange(换货)
     }
   },
+  onLoad(options) {
+    // 获取页面参数
+    console.log('页面参数:', options);
+    // 这里可以根据订单ID获取订单详情
+  },
+  onReady() {
+    // 初始获取数据
+    // 这里可以添加获取订单详情的逻辑
+  },
   computed: {
     // 判断是否为有底部安全区域的设备
     hasSafeArea() {

+ 4 - 0
src/points/order/orderList.vue

@@ -158,6 +158,10 @@ export default {
       pageSize: 10
     }
   },
+  onReady() {
+    // 初始获取数据
+    // 这里可以添加获取订单列表的逻辑
+  },
   methods:{
     loadMore(){
       if (this.loading || !this.hasMore) return

+ 15 - 98
src/points/pointInfo/taskList.vue

@@ -163,7 +163,7 @@ export default {
       }
     }
   },
-  mounted() {
+  onReady() {
     // 初始获取数据
     this.fetchTaskList()
   },
@@ -234,104 +234,21 @@ export default {
     async fetchTaskList(isLoadMore = false) {
       this.loading = true
       try {
-        // const res = await getPointTaskList({
-        //   pageNum: this.pageNum,
-        //   pageSize: this.pageSize,
-        //   type: this.activeTab
-        // })
-
-        const res = {
-          total: 30,
-          rows: [
-            {
-              "activityId": 25,
-              "taskName": "完成订单",
-              "rewardPoints": 20,
-              "completedCount": 1,
-              "triggerValue": 2
-            },
-            {
-              "activityId": 25,
-              "taskName": "完成订单",
-              "rewardPoints": 20,
-              "completedCount": 1,
-              "triggerValue": 2
-            },
-            {
-              "activityId": 25,
-              "taskName": "完成订单",
-              "rewardPoints": 20,
-              "completedCount": 1,
-              "triggerValue": 2
-            },
-            {
-              "activityId": 25,
-              "taskName": "完成订单",
-              "rewardPoints": 20,
-              "completedCount": 1,
-              "triggerValue": 2
-            },
-            {
-              "activityId": 25,
-              "taskName": "完成订单",
-              "rewardPoints": 20,
-              "completedCount": 1,
-              "triggerValue": 2
-            },
-            {
-              "activityId": 25,
-              "taskName": "完成订单",
-              "rewardPoints": 20,
-              "completedCount": 1,
-              "triggerValue": 2
-            },
-            {
-              "activityId": 25,
-              "taskName": "完成订单",
-              "rewardPoints": 20,
-              "completedCount": 1,
-              "triggerValue": 2
-            },
-            {
-              "activityId": 25,
-              "taskName": "完成订单",
-              "rewardPoints": 20,
-              "completedCount": 1,
-              "triggerValue": 2
-            },
-            {
-              "activityId": 25,
-              "taskName": "完成订单",
-              "rewardPoints": 20,
-              "completedCount": 1,
-              "triggerValue": 2
-            },
-            {
-              "activityId": 25,
-              "taskName": "完成订单",
-              "rewardPoints": 20,
-              "completedCount": 1,
-              "triggerValue": 2
-            }
-          ],
-          code: 200,
-          msg: "查询成功"
-        }
-        setTimeout(()=>{
-          if (res.code === 200) {
-            if (isLoadMore) {
-              // 加载更多数据
-              this.tasks = [...this.tasks, ...res.rows]
-            } else {
-              // 初始加载数据
-              this.tasks = res.rows
-            }
-
-            // 判断是否还有更多数据
-            this.hasMore = this.tasks.length < res.total
+        const res = await getPointTaskList({
+          pageNum: this.pageNum,
+          pageSize: this.pageSize,
+          type: this.activeTab,
+          cityCode: uni.getStorageSync('selectCitycode'),
+        })
+        if (res.code === 200) {
+          if (isLoadMore) {
+            this.tasks = [...this.tasks, ...res.rows]
+          } else {
+            this.tasks = res.rows
           }
-          this.loading = false
-        },1000)
+          this.hasMore = this.tasks.length < res.total
+        }
+        this.loading = false
 
       } catch (error) {
         console.error('获取任务列表失败:', error)

+ 3 - 1
src/store/modules/points.js

@@ -19,7 +19,9 @@ const other = {
         // 获取积分信息
         async getPointsInfo({ commit }) {
             try {
-                const res = await getMyPoint();
+                const res = await getMyPoint({
+                    cityCode:uni.getStorageSync('selectCitycode'),
+                });
                 if (res && res.data) {
                     commit('SET_POINTINFO', res.data.data);
                 }