Forráskód Böngészése

授权 手机登录

hanchong 1 éve
szülő
commit
07d6b07d7a

+ 1 - 1
app.json

@@ -22,7 +22,7 @@
   "permission": {
     "scope.userLocation": {
       "desc": "你的位置信息将用于天气效果展示"
-    }
+    } 
   },
   "requiredPrivateInfos": [
   	"getLocation"

+ 21 - 0
pages/data/data.js

@@ -3853,6 +3853,27 @@ onLoad(option){
 	      })
 	    }, 2000) // 设置延时时间,单位为毫秒
   }else{
+	  // const expiresAt = wx.getStorageSync('scanResultExpiresAt');
+	  // const now = Date.now() 
+	  // if (expiresAt || expiresAt < now) {
+	  //   // 扫码结果已过期  
+	  //   wx.showToast({
+	  //     title: '扫码结果失效或已过期,请重新扫码',  
+	  //     icon: 'none'  
+	  //   });
+	  //   // 清除过期的扫码结果  
+	  //   wx.removeStorageSync('scanResultExpiresAt');  
+	  //   setTimeout(function() {
+	  //       wx.reLaunch({
+	  //       		url: '/pages/scan/scan',
+	  //       })
+	  //     }, 2000) // 设置延时时间,单位为毫秒
+	  	
+	  // }else{
+	  // 	//续期
+	  // 	wx.setStorageSync('scanResultExpiresAt', Date.now() + 2 * 60 * 60 * 1000)
+	  // }
+	  
 	  let hotelcodeTemp = '';
 	  let roomcodeTemp = '';
 	  

+ 26 - 0
pages/index/index.js

@@ -3512,6 +3512,32 @@ onLoad(option){
 	  //           console.log('初始化wifi-成功', res)
 	  //         },
 			// });
+			
+	  
+	 //    const expiresAt = wx.getStorageSync('scanResultExpiresAt');  
+	 //    const now = Date.now() 
+	 //    console.log('expiresAt='+expiresAt);
+		// console.log('now='+now);
+	 //    if (expiresAt || expiresAt < now) {  
+	 //      // 扫码结果已过期  
+	 //      wx.showToast({  
+	 //        title: '扫码结果失效或已过期,请重新扫码',  
+	 //        icon: 'none'  
+	 //      });  
+	 //      // 清除过期的扫码结果  
+	 //      wx.removeStorageSync('scanResultExpiresAt');  
+		//   setTimeout(function() {
+		//       wx.reLaunch({
+		//       		url: '/pages/scan/scan',
+		//       })
+		//     }, 2000) // 设置延时时间,单位为毫秒
+			
+	 //    }else{
+		// 	//续期
+		// 	wx.setStorageSync('scanResultExpiresAt', Date.now() + 2 * 60 * 60 * 1000)
+		// }
+	  
+	  
 	  let hotelcodeTemp = '';
 	  let roomcodeTemp = '';
 	  if(wx.getStorageSync('res').result.split('|').length != 2){

+ 206 - 0
pages/login/login.js

@@ -0,0 +1,206 @@
+Page({  
+  data: {  
+    phoneNumber: '',  
+    code: '',  
+    hasPhoneNumber: false,  
+    hasCode: false,  
+    isSendingCode: false,  
+    isLoggedIn: false,  
+	// 初始不显示倒计时  
+	countdown: 0,  
+	// 控制是否显示倒计时  
+	showCountdown: false,
+  },  
+  loginByCode: function(phoneNumber, code) {
+    wx.request({  
+      url: 'https://your-backend.com/login', // 你的后端登录接口  
+      method: 'POST',  
+      data: {  
+        phoneNumber: phoneNumber,  
+        code: code  
+      },  
+      success(res) {  
+        if (res.data.success) {  
+          // 保存登录凭证  
+          wx.setStorageSync('loginToken', res.data.token);  
+          wx.showToast({  
+            title: '登录成功',  
+            icon: 'success',  
+            duration: 2000  
+          });  
+          // 跳转到主页面等  
+        } else {  
+          wx.showToast({  
+            title: '登录失败',  
+            icon: 'none',  
+            duration: 2000  
+          });  
+        }  
+      },  
+      fail(err) {  
+        console.error(err);  
+        wx.showToast({  
+          title: '网络请求失败',  
+          icon: 'none',  
+          duration: 2000  
+        });  
+      }  
+    });  
+  },
+  sendVerificationCode:function(e) {
+      let phoneNumber = e.detail.value.phoneNumber; // 假设这是从输入框获取的手机号
+      // 调用API发送验证码  
+      wx.request({  
+          url: 'https://your-backend.com/api/send-verification-code',  
+          method: 'POST',  
+          data: {  
+              phoneNumber: phoneNumber  
+          },  
+          success: function(res) {  
+              if (res.statusCode === 200 && res.data.success) {  
+                  wx.showToast({  
+                      title: '验证码已发送',  
+                      icon: 'success',  
+                      duration: 2000  
+                  });  
+              } else {  
+                  wx.showToast({  
+                      title: '发送验证码失败',  
+                      icon: 'none',  
+                      duration: 2000  
+                  });  
+              }  
+          },  
+          fail: function() {
+              wx.showToast({  
+                  title: '网络请求失败',  
+                  icon: 'none',  
+                  duration: 2000  
+              });  
+          }  
+      });  
+  },
+  handlePhoneNumberInput: function(e) {  
+    this.setData({  
+      phoneNumber: e.detail.value,  
+      hasPhoneNumber: e.detail.value.trim() !== '',  
+      isSendingCode: false, // 清除发送状态,如果用户修改了手机号  
+    });  
+  },  
+  handleCodeInput: function(e) {  
+    this.setData({  
+      code: e.detail.value,  
+      hasCode: e.detail.value.trim() !== '',  
+    });  
+  },  
+  sendCode: function() {
+	console.log('123213');
+    if (!this.data.hasPhoneNumber) return;  
+    this.setData({  
+      isSendingCode: true,  
+    });  
+   //  this.sendVerificationCode(this.data.phoneNumber).then(() => {  
+   //    wx.showToast({ title: '验证码已发送', icon: 'success' });  
+   //    this.setData({  
+   //      isSendingCode: false,  
+   //    });  
+	  
+   //  }).catch(err => {  
+   //    wx.showToast({ title: '发送失败', icon: 'none' });  
+   //    this.setData({  
+   //      isSendingCode: false,  
+   //    });  
+   //  });
+   console.log('验证码已发出');
+   // 启动倒计时
+   this.startCountdown(60);
+  },
+  login: function() {
+    if (!this.data.hasPhoneNumber || !this.data.hasCode) {
+		wx.showModal({
+		  title: '提示',
+		  content: '手机号或验证码不能为空',
+		  showCancel: false
+		});
+		return;
+	}
+	if (!(/^1[3-9]\d{9}$/.test(this.data.phoneNumber))) {  
+	    wx.showModal({
+		  title: '提示',
+		  content: '手机号格式不正确',
+		  showCancel: false
+	    }); 
+	    return;
+	}
+	
+   //  this.loginByCode(this.data.phoneNumber, this.data.code).then(token => {   
+	  // wx.setStorageSync('loginToken', token); 
+   //    this.setData({  
+   //      isLoggedIn: true,  
+   //    });  
+   //    wx.reLaunch({  
+   //      url: '/pages/scan/scan',  
+   //    });  
+   //  }).catch(err => {  
+   //    wx.showToast({ title: '登录失败', icon: 'none' });  
+   //  });
+    this.setData({
+	  isLoggedIn: true,
+    });
+	wx.setStorageSync('loginToken', 'eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VyX2tleSI6IjQ1OTJhZDlhLTI0NjMtNDlhOS05YjlkLTQ0NTNhYWM5MDI1NSIsInVzZXJuYW1lIjoiYWRtaW4ifQ.efQTBQSRiiKgPWjiIbeOMyCiScrWuCiFn0T4CcylzZKaeMvN241puUV4OoloG98dw6J67pCCwbuIf7n9gFSZmQ');
+	
+	wx.showModal({
+	  title: '提示',
+	  content: '登录成功',
+	  showCancel: false
+	});
+	
+	setTimeout(function() {
+	    wx.reLaunch({
+			url: '/pages/scan/scan',
+	    })
+	  }, 2000) // 设置延时时间,单位为毫秒
+	  
+  },  
+  startCountdown: function(seconds) {  
+      let that = this;  
+      this.setData({  
+        showCountdown: true,  
+        countdown: seconds  
+      });  
+      let timer = setInterval(function() {  
+        seconds--;  
+        if (seconds <= 0) {  
+          clearInterval(timer);  
+          that.setData({  
+            showCountdown: false,  
+            countdown: 0  
+          });
+        } else {  
+          that.setData({  
+            countdown: seconds  
+          });  
+        }  
+      }, 1000);
+	},
+  logout: function() {  
+    // 清除登录状态
+	wx.removeStorageSync('loginToken'); // 清除token
+    this.setData({  
+      isLoggedIn: false,  
+      // 可能还需要清除其他与登录状态相关的数据  
+    });  
+    // 跳转到登录页面或其他页面  
+    wx.reLaunch({  
+      url: '/pages/login/login',  
+    });  
+  },  
+  /**
+   * 生命周期函数--监听页面卸载
+   */
+  onUnload: function () {
+	  // 清除登录状态
+	// wx.removeStorageSync('loginToken'); // 清除token
+  },
+  
+})

+ 4 - 0
pages/login/login.json

@@ -0,0 +1,4 @@
+{
+  "usingComponents": {
+  }
+}

+ 17 - 0
pages/login/login.wxml

@@ -0,0 +1,17 @@
+<view class="login-container">  
+  <view class='title'>用户登录</view>
+  <view class="input-group" style="margin-top:100rpx;">  
+    <text class="label">手机号:</text>  
+    <input type="number" class="input" placeholder="请输入手机号" bindinput="handlePhoneNumberInput" />  
+  </view>  
+  <view class="input-group">  
+    <text class="label">验证码:</text>  
+    <input type="number" class="input" placeholder="请输入验证码" bindinput="handleCodeInput" disabled="{{!hasPhoneNumber}}" />  
+    <button class="send-code {{showCountdown?'send-code-1':''}}" bindtap="sendCode" disabled="{{!hasPhoneNumber || showCountdown}}">
+		获取验证码
+		<text wx:if="{{showCountdown}}">{{seconds}}秒</text>
+	</button>
+  </view>
+  <button class="login-btn" bindtap="login" disabled="{{!hasPhoneNumber || !hasCode}}">登录</button>  
+  <button class="logout-btn" bindtap="logout" wx:if="{{isLoggedIn}}">退出登录</button>  
+</view>

+ 119 - 0
pages/login/login.wxss

@@ -0,0 +1,119 @@
+.container {  
+  display: flex;  
+  flex-direction: column;  
+  align-items: center;  
+  justify-content: center;  
+  height: 100vh; /* 占据整个视窗高度 */  
+  background-color: #f4f4f4; /* 浅灰色背景 */  
+  padding: 40rpx;  
+  box-sizing: border-box; /* 边框盒模型,使内边距不影响总宽度 */  
+}  
+  
+/* 输入框组件样式 */  
+.input-group {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  width: 90%; /* 设置固定宽度 */  
+  margin-left:5%;
+  margin-bottom: 40rpx; /* 底部外边距 */  
+  background-color: #fff; /* 白色背景 */  
+  border-radius: 16rpx; /* 圆角边框 */  
+  box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.1); /* 阴影效果 */  
+  overflow: hidden; /* 隐藏溢出的内容 */  
+  position: relative; /* 相对定位,用于后续子元素的绝对定位 */  
+}  
+  
+/* 输入框内部标签样式 */  
+.input-group .label {  
+  color: #666; /* 深灰色字体 */  
+  font-size: 28rpx; /* 字体大小 */  
+  font-weight: bold; /* 加粗 */  
+  padding: 20rpx 0 10rpx 32rpx; /* 内边距 */  
+  background-color: #f9f9f9; /* 浅灰色背景 */  
+  width:30%;
+}  
+  
+/* 输入框样式 */  
+.input-group .input {  
+  width: calc(100% - 32rpx); /* 减去左右内边距 */  
+  padding: 20rpx 32rpx; /* 内边距 */  
+  border: none; /* 无边框 */  
+  outline: none; /* 去除聚焦时的轮廓 */  
+  font-size: 32rpx; /* 字体大小 */  
+  color: #333; /* 字体颜色 */  
+  background-color: transparent; /* 透明背景,显示父容器的背景 */  
+}  
+  
+/* 验证码发送按钮样式 */  
+.input-group .send-code {
+  position: absolute; /* 绝对定位 */  
+  right: 0; /* 右侧对齐 */  
+  top: 0; /* 顶部对齐 */  
+  padding: 10rpx 40rpx; /* 内边距 */  
+  background-color: #007aff; /* 蓝色背景 */  
+  color: white; /* 白色字体 */  
+  border: none; /* 无边框 */  
+  border-radius: 0 16rpx 16rpx 0; /* 圆角仅在右侧 */  
+  font-size: 32rpx; /* 字体大小 */  
+  cursor: pointer; /* 鼠标悬停时显示指针 */  
+}
+
+.input-group .send-code-1 {  
+  font-size: 25rpx; /* 字体大小 */  
+}
+  
+/* 验证码发送按钮禁用状态样式 */  
+.input-group .send-code[disabled] {  
+  background-color: #ccc; /* 灰色背景 */  
+  color: #999; /* 灰色字体 */  
+  cursor: not-allowed; /* 鼠标悬停时显示禁止符号 */  
+}  
+  
+/* 登录按钮样式 */  
+.login-btn {  
+  width: 500rpx; /* 宽度与输入框组件一致 */  
+  padding: 6rpx 0; /* 上下内边距,左右由子元素控制 */  
+  background-color: #007aff; /* 蓝色背景 */  
+  color: white; /* 白色字体 */  
+  border: none; /* 无边框 */  
+  border-radius: 16rpx; /* 圆角边框 */  
+  font-size: 36rpx; /* 字体大小 */  
+  cursor: pointer; /* 鼠标悬停时显示指针 */  
+  text-align: center; /* 文本居中 */  
+  display: flex; /* 弹性布局 */  
+  justify-content: center; /* 水平居中 */  
+  align-items: center; /* 垂直居中 */  
+}  
+
+.login-out {  
+  width: 500rpx; /* 宽度与输入框组件一致 */  
+  padding: 6rpx 0; /* 上下内边距,左右由子元素控制 */  
+  background-color: #007aff; /* 蓝色背景 */  
+  color: white; /* 白色字体 */  
+  border: none; /* 无边框 */  
+  border-radius: 16rpx; /* 圆角边框 */  
+  font-size: 36rpx; /* 字体大小 */  
+  cursor: pointer; /* 鼠标悬停时显示指针 */  
+  text-align: center; /* 文本居中 */  
+  display: flex; /* 弹性布局 */  
+  justify-content: center; /* 水平居中 */  
+  align-items: center; /* 垂直居中 */
+  margin-top:20rpx;
+} 
+  
+/* 登录按钮禁用状态样式 */  
+.login-btn[disabled] {  
+  background-color: #ccc; /* 灰色背景 */  
+  color: #999; /* 灰色字体 */  
+  cursor: not-allowed;
+  }
+
+ .title{
+  text-align: center;
+  font-size: 38rpx;
+  color: #000000;
+  font-weight: bold;
+  margin: auto;
+  margin-top: 100rpx;
+}

+ 59 - 8
pages/scan/scan.js

@@ -3,7 +3,8 @@ const util = require('../../utils/util.js')
 
 Page({
   data: {
-    logs: []
+    logs: [],
+	canGetPhoneNumber: false,
   },
   onSaveExitState: function() {  
 	  wx.clearStorage();
@@ -20,6 +21,7 @@ Page({
                   console.log('扫码获取的参数',res);
 				  wx.clearStorage();
 				  wx.setStorageSync('res',res);
+				  wx.setStorageSync('scanResultExpiresAt', Date.now() + 2 * 60 * 60 * 1000); // 超时时间戳,例如设置为2小时后过期
 				  wx.reLaunch({
 					url: '/pages/index/index?res='+res,//传res
 				  })
@@ -28,11 +30,60 @@ Page({
       },
   onLoad() {
 	console.log("scan页面");
-    // this.setData({
-    //   logs: (wx.getStorageSync('logs') || []).map(log => {
-    //     return util.formatTime(new Date(log))
-    //   })
-    // })
-	// wx.clearStorage();
-  }
+  },
+  login: function() {  
+	  var that = this;
+      wx.login({  
+        success: res => {  
+          if (res.code) {  
+            // 发送 code 到服务器换取 session_key, openid  
+            wx.request({  
+              url: 'https://yourserver.com/api/login',  
+              data: {  
+                code: res.code  
+              },  
+              success: function(loginRes) {  
+                if (loginRes.data.success) {  
+                  wx.setStorageSync('session_key', loginRes.data.session_key);  
+                  wx.setStorageSync('openid', loginRes.data.openid);  
+                  // 可以在这里提示用户进行手机号授权  
+                  this.setData({  
+                    canGetPhoneNumber: true  
+                  });  
+                }  
+              }  
+            });  
+          }  
+        }  
+      });  
+    },  
+    getPhoneNumber: function(e) {  
+      if (e.detail.errMsg !== "getPhoneNumber:ok") {  
+        return;  
+      }  
+      const { encryptedData, iv } = e.detail;  
+      wx.request({  
+        url: 'https://yourserver.com/api/decrypt_phone',  
+        data: {  
+          encryptedData,  
+          iv,  
+          session_key: wx.getStorageSync('session_key')  
+        },  
+        success: function(decryptRes) {  
+          if (decryptRes.data.success) {  
+            console.log('解密后的手机号:', decryptRes.data.phoneNumber);  
+            // 处理解密后的手机号  
+          }  
+        }  
+      });  
+    },  
+    
+    // 绑定按钮点击事件  
+    bindGetPhoneNumber: function() {  
+      if (this.data.canGetPhoneNumber) {  
+        wx.getPhoneNumber({  
+          success: this.getPhoneNumber  
+        });  
+      }  
+    }
 })

+ 25 - 6
pages/sleepEvaluation/sleepEvaluation.js

@@ -261,12 +261,10 @@ Page({
     },
     // 提交问卷的函数  
     submitSurvey: function() {
-	  let hotelcodeTemp = '';
-	  let roomcodeTemp = '';
-	  const res = wx.getStorageSync('res')
-	  hotelcodeTemp = res && res.result.split('|')[0];
-	  roomcodeTemp = res.result.split('|')[1];
-      let surveyData = {  
+		
+      let surveyData = {
+		hotel: this.data.hotel,
+		room: this.data.room,
         gender: this.data.gender,  
         stayExper: this.data.stayExper,  
         sleepEnvironmentComfort: this.data.sleepEnvironmentComfort,  
@@ -384,6 +382,27 @@ Page({
     	      })
     	    }, 2000) // 设置延时时间,单位为毫秒
       }else{
+		  // const expiresAt = wx.getStorageSync('scanResultExpiresAt');
+		  // const now = Date.now() 
+		  // if (expiresAt || expiresAt < now) {
+		  //   // 扫码结果已过期  
+		  //   wx.showToast({  
+		  //     title: '扫码结果失效或已过期,请重新扫码',  
+		  //     icon: 'none'  
+		  //   });  
+		  //   // 清除过期的扫码结果  
+		  //   wx.removeStorageSync('scanResultExpiresAt');  
+		  //   setTimeout(function() {
+		  //       wx.reLaunch({
+		  //       		url: '/pages/scan/scan',
+		  //       })
+		  //     }, 2000) // 设置延时时间,单位为毫秒
+		  	
+		  // }else{
+		  // 	//续期
+		  // 	wx.setStorageSync('scanResultExpiresAt', Date.now() + 2 * 60 * 60 * 1000)
+		  // }
+		  
     	  let hotelTemp = '';
     	  let roomTemp = '';