邹能昇 2 月之前
父節點
當前提交
99c1211f6f

+ 32 - 9
nova-werun/pages/home/sport/sport-home/index.js

@@ -109,7 +109,7 @@ Page({
     Getlocation() {
         // 获取当前位置信息
         wx.getLocation({
-            type: 'wgs84',
+            type: 'gcj-02',
             success: (res) => {
                 const {
                     latitude,
@@ -137,14 +137,14 @@ Page({
                                 iconPath: 'https://file-cloud.fmode.cn/13WZ0W7u3l/20240724/7ebg0k104325941.png?imageView2/1/w/200/h/200', // 自定义标记图标
                                 width: 40,
                                 height: 40,
-                                callout: {
-                                    content: address, // 可以显示解析出的地址
-                                    color: '#ffffff',
-                                    bgColor: '#7F56B2',
-                                    padding: 10,
-                                    borderRadius: 5,
-                                    display: 'ALWAYS'
-                                }
+                                // callout: {
+                                //     content: address, // 可以显示解析出的地址
+                                //     color: '#ffffff',
+                                //     bgColor: '#7F56B2',
+                                //     padding: 10,
+                                //     borderRadius: 5,
+                                //     display: 'ALWAYS'
+                                // }
                             }]
                         });
                         console.log(this.data.address);
@@ -186,6 +186,29 @@ Page({
         }
 
     },
+    haversineDistance(location1, location2) {
+        let lat1 = location1.latitude
+        let lon1 = location1.longitude
+        let lat2 = location2.latitude
+        let lon2 = location2.longitude
+    
+         function toRad(degree) {
+             return degree * Math.PI / 180;
+         }
+         const R = 6371e3; // 地球半径,单位为米
+         const φ1 = toRad(lat1);
+         const φ2 = toRad(lat2);
+         const Δφ = toRad(lat2 - lat1);
+         const Δλ = toRad(lon2 - lon1);
+     
+         const a = Math.sin(Δφ / 2) * Math.sin(Δφ / 2) +
+                   Math.cos(φ1) * Math.cos(φ2) *
+                   Math.sin(Δλ / 2) * Math.sin(Δλ / 2);
+         const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
+     
+         const distance = R * c; // 距离,单位为米
+         return distance;
+     },
     //切换
     switchTab (e) {
         const index = e.currentTarget.dataset.index;

+ 216 - 20
nova-werun/pages/home/sport/sport-start/index.js

@@ -1,4 +1,6 @@
 // nova-werun/pages/home/sport/sport-start/index.js
+const Parse = getApp().Parse;
+const company = getApp().globalData.company;
 Page({
 
     /**
@@ -28,12 +30,21 @@ Page({
         startTime: 0,
 
         show: false,
+
+        //
+        timer: null,
+        totalSeconds: 0, // 用于存储总秒数
+        formattedTime: '00:00:00', // 用于存储格式化后的时间
+        isRunning: false, // 计时器是否在运行
+        steps: 0, //运动步数
+        startsteps: 0,
+        defferentstep: 0,
     },
 
     /**
      * 生命周期函数--监听页面加载
      */
-    onLoad: function (options) {
+    onLoad: async function (options) {
         // 计算
         const systemInfo = wx.getSystemInfoSync();
         const statusBarHeight = systemInfo.statusBarHeight || 0;
@@ -51,12 +62,15 @@ Page({
             contentHeight,
             navheight,
         });
-        console.log(navheight);
         this.setData({
             title: options.id
         })
-        //地图
-        this.Getlocation()
+        // 获取初始步数
+        // 获取初始步数
+       this. getWeRunData2()
+       console.log(this.data.startsteps);
+        // 地图
+        await this.Getlocation();
     },
 
     /**
@@ -70,14 +84,20 @@ Page({
      * 生命周期函数--监听页面显示
      */
     onShow: function () {
-
+        this.setData({
+            totalSeconds: 0, // 重置总秒数
+            formattedTime: '00:00:00', // 重置格式化后的时间
+            isRunning: false // 初始化为未运行状态
+        });
+        this.startTimer()
     },
 
     /**
      * 生命周期函数--监听页面隐藏
      */
     onHide: function () {
-
+        // 页面隐藏时清除计时器
+        this.stopTimer();
     },
 
     /**
@@ -139,14 +159,14 @@ Page({
                                 iconPath: 'https://file-cloud.fmode.cn/13WZ0W7u3l/20240724/7ebg0k104325941.png?imageView2/1/w/200/h/200', // 自定义标记图标
                                 width: 40,
                                 height: 40,
-                                callout: {
-                                    content: address, // 可以显示解析出的地址
-                                    color: '#ffffff',
-                                    bgColor: '#7F56B2',
-                                    padding: 10,
-                                    borderRadius: 5,
-                                    display: 'ALWAYS'
-                                }
+                                // callout: {
+                                //     content: address, // 可以显示解析出的地址
+                                //     color: '#ffffff',
+                                //     bgColor: '#7F56B2',
+                                //     padding: 10,
+                                //     borderRadius: 5,
+                                //     display: 'ALWAYS'
+                                // }
                             }]
                         });
                         console.log(this.data.address);
@@ -177,6 +197,12 @@ Page({
         this.setData({
             isstop: !this.data.isstop
         })
+        if (this.data.isstop) {
+            this.stopTimer()
+        } else {
+            this.startTimer()
+        }
+
         console.log(this.data.isstop);
     },
     //结束光环展示
@@ -202,15 +228,15 @@ Page({
                     percentage: `conic-gradient(from 0deg, #015EEA ${percentage}%, white 0%)`,
                 });
 
-                if(percentage >= 100){
+                if (percentage >= 100) {
                     wx.showToast({
                         title: '运动已结束',
                         icon: 'success',
                         duration: 500
                     });
-                    setTimeout(()=>{
+                    setTimeout(() => {
                         this.onConfirm()
-                    },500)
+                    }, 500)
 
                 }
 
@@ -256,11 +282,181 @@ Page({
         });
     },
     //确认返回
-    onConfirm(){
+    onConfirm() {
         wx.navigateBack({
             delta: 1 // 返回的页面层数,1 表示返回上一页
-          });
-    }
+        });
+    },
+    //开始计时或继续计时
+    startTimer: function () {
+        if (this.data.isRunning) return; // 如果已经在运行,则不再启动
+
+        const that = this;
+        this.data.timer = setInterval(function () {
+            that.data.totalSeconds += 1; // 增加总秒数
+            that.setData({
+                formattedTime: that.formatTime(that.data.totalSeconds) // 更新格式化后的时间
+            });
+            // that.getWeRunData(); 
+            // 每5秒调用一次getWeRunData
+            if (that.data.totalSeconds % 1 === 0) {
+                that.getWeRunData(); // 调用获取微信步数的函数
+            }
+        }, 1000);
 
+        this.setData({
+            isRunning: true // 设置为运行状态
+        });
+    },
+    //暂停
+    stopTimer: function () {
+        clearInterval(this.data.timer);
+        this.setData({
+            isRunning: false // 设置为未运行状态
+        });
+    },
+    formatTime: function (seconds) {
+        const hours = Math.floor(seconds / 3600);
+        const minutes = Math.floor((seconds % 3600) / 60);
+        const secs = seconds % 60;
+
+        // 格式化为两位数
+        const formattedHours = String(hours).padStart(2, '0');
+        const formattedMinutes = String(minutes).padStart(2, '0');
+        const formattedSeconds = String(secs).padStart(2, '0');
+
+        return `${formattedHours}:${formattedMinutes}:${formattedSeconds}`;
+    },
+    //获取初始步数
+    async getWeRunData2() {
+        wx.getWeRunData({
+            success: (res) => {
+                // 获取到的加密数据
+                const encryptedData = res.encryptedData;
+                const iv = res.iv;
+                const userInfo = wx.getStorageSync('userInfo');
+                const session_key = userInfo.session_key
+                // 这里需要调用你的后端接口进行解密
+                // 假设你有一个解密函数 decryptData
+                this.decryptData(encryptedData, iv, session_key).then(async steps => {
+                    await this.progressdate(steps)
+                    console.log('再次赋值');
+                    await this.setData({
+                        startsteps: steps,
+                    });
+                    console.log('用户步数:', this.data.steps);
+                }).catch(err => {
+                    console.error('解密失败:', err);
+                });
+            },
+            fail: (err) => {
+                console.error('获取运动数据失败:', err);
+            }
+        });
+    },
+    //获取微信步数
+    async getWeRunData() {
+        wx.getWeRunData({
+            success: (res) => {
+                // 获取到的加密数据
+                const encryptedData = res.encryptedData;
+                const iv = res.iv;
+                const userInfo = wx.getStorageSync('userInfo');
+                const session_key = userInfo.session_key
+                // 这里需要调用你的后端接口进行解密
+                // 假设你有一个解密函数 decryptData
+                this.decryptData(encryptedData, iv, session_key).then(async steps => {
+                    await this.progressdate(steps)
+                    console.log('再次赋值');
+                    await this.setData({
+                        steps: steps,
+                        defferentstep: steps - this.data.startsteps
+                    });
+                    console.log('用户步数:', this.data.steps);
+                }).catch(err => {
+                    console.error('解密失败:', err);
+                });
+            },
+            fail: (err) => {
+                console.error('获取运动数据失败:', err);
+            }
+        });
+    },
+    //  解密
+    decryptData(encryptedData, iv, session_key) {
+        return new Promise((resolve, reject) => {
+            // 发送请求到后端进行解密
+            wx.request({
+                url: 'https://server.fmode.cn/api/wxapp/decrypt_phone', // 替换为你的后端解密接口
+                method: 'get',
+                data: {
+                    encryptedData: encryptedData,
+                    iv: iv,
+                    appId: 'wxe6ecc0193c09696c',
+                    sessionKey: session_key
+                },
+                success: (res) => {
+                    // if (res.data && res.data.steps) {
+                    //     console.log(res.data.steps);
+                    //     // resolve(res.data.steps); // 返回步数
+                    //     // const steps = 123456
+                    //     resolve(steps);
+                    // } else {
+                    //     reject('解密返回数据格式错误');
+                    // }
+                    if (res.data.data) {
+                        const stepInfoList = res.data.data.stepInfoList
+                        const todaylist = stepInfoList.filter(item => {
+                            console.log(this.isToday(item));
+                            return this.isToday(item); // 使用 isToday 函数判断是否是今天
+                        });
+                        const steps = todaylist[0].step;
+                        resolve(steps);
+                    } else {
+                        reject('解密返回数据格式错误');
+                    }
+
+                },
+                fail: (err) => {
+                    reject(err);
+                }
+            });
+        });
+    },
+    // 判断日期是否是今天
+    isToday(item) {
+        const today = new Date();
+        const date = new Date(item.timestamp * 1000); // 假设时间戳是以秒为单位
+        // 比较年、月、日
+        return date.getFullYear() === today.getFullYear() &&
+            date.getMonth() === today.getMonth() &&
+            date.getDate() === today.getDate();
+    },
+    //创建过程数据
+    async progressdate(steps) {
+        if (steps == this.data.steps) {
+            console.log('步数没变');
+            return
+        }
+        const currentUser = Parse.User.current();
+        let Userquery = new Parse.Query('_User');
+        Userquery.equalTo('company', company);
+        Userquery.equalTo('objectId', currentUser.id);
+        Userquery.notEqualTo('isDeleted', true)
+        let user = await Userquery.first();
+
+        let companyPointer = Parse.Object.extend('Company').createWithoutData(company);
+        let query = new Parse.Object('ActivityRunLog');
+        query.set('user', user.toPointer())
+        query.set('company', companyPointer)
+        query.set('stage', 'progress ')
+        query.set('steps', this.data.steps)
+        try {
+            // let saveDate2 = await Comment.save();
+            console.log("新数据保存成功");
+        } catch (error) {
+            console.error("保存数据时出现错误:", error);
+        }
+    },
 
 })

+ 6 - 3
nova-werun/pages/home/sport/sport-start/index.wxml

@@ -16,8 +16,11 @@
     </view>
     <view class="numberbox">
         <view class="distance">
-            <view class="dis-num">0.00</view>
-            <view class="dis-text">公里</view>
+            <!-- <view class="dis-num">0.00</view>
+            <view class="dis-text">公里</view> -->
+
+            <view class="dis-num">{{defferentstep}}</view>
+            <view class="dis-text">步</view>
         </view>
         <view class="number">
             <view class="num">
@@ -25,7 +28,7 @@
                 <view class="num-text">配速(min/km)</view>
             </view>
             <view class="num">
-                <view class="num-num">00:00:01</view>
+                <view class="num-num">{{formattedTime}}</view>
                 <view class="num-text">时间</view>
             </view>
             <view class="num">