houjie 4 年 前
コミット
fecfcfcb37
5 ファイル変更266 行追加130 行削除
  1. 126 53
      Lib/Request.js
  2. 1 1
      main.js
  3. 72 55
      pages/index/index.vue
  4. 65 21
      pages/login/login.vue
  5. 2 0
      proto/User.proto

+ 126 - 53
Lib/Request.js

@@ -3,10 +3,15 @@ import {
 	requestEncode,
 	responseDecode
 } from "./ProtoMap";
-import {NoTokenServants} from './../API/ProtoConfig';
+import { NoTokenServants } from './../API/ProtoConfig';
 
 import { BASEURL } from "../API/Constant";
 
+/**
+ * 超过N天就直接重新登录吧
+ */
+const TOKEN_TIMEOUT = 1000*60*60*24*15
+
 //这个path需要token
 const PATH = 'Ohplay/Web/HttpToTcp';
 //这个path不需要token
@@ -14,48 +19,73 @@ const PATH1 = 'ohplay/Web/HttpToTcp';
 
 let token = "";
 
+/**
+ * 保存token和uid
+ * @param {string} Token 
+ * @param {number} uid 
+ */
+function saveToken(Token, uid) {
+	token = Token
+	getApp().globalData.uid = uid
+	// 缓存token
+	uni.setStorage({
+		key: 'token',
+		data: {
+			token,
+			time:new Date().getTime(),
+		},
+	});
+	uni.setStorage({
+		key: 'uid',
+		data: uid
+	})
+	uni.$emit('user_getUid',{uid,token})
+}
+
 // 登录
 function login() {
 
 	uni.login({
 		provider: 'weixin',
 		success: function (loginRes) {
-			const data = {
-				server: 2,
-				servant: 1001,
-				version: 3,
-				data: {
-					// phone:Buffer.from('3246541321'),
-					phone: '17688768233',
-					code: loginRes.code,
-					verifyCode: 'asdasd',
-					nickname: "4",
-					head_url: "6",
-					system_type: 1,
+			console.log(`uni.login errMsg = ${loginRes.errMsg}`)
+			if (loginRes.code) {
+				const data = {
+					server: 2,
+					servant: 10005,
+					data: {
+						code: loginRes.code,
+					}
 				}
-			}
-			request(data).then((res) => {
-				// console.log(res)
-				if(res.code === 0 && res.data.errInfo.errorCode === 0) {
-					
-					token = res.data.token;
-					// 缓存token
-					uni.setStorage({
-						key: 'token',
-						data: res.data.token,
+				request(data).then((res) => {
+					// console.log(res)
+					if (res.code === 0) {
+						if (res.data.token && res.data.id) {
+							//保存token
+							saveToken(res.data.token,res.data.id)
+						} else {
+							//进入登录页面
+							gotoLoginPage()
+						}
+						return;
+					};
+					uni.showToast({
+						title: res.msg,
+						duration: 2000,
+						icon: "none"
 					});
-					return;
-				};
+
+				}).catch((res) => {
+					console.log("catch")
+					console.log(res);
+				});
+			} else {
 				uni.showToast({
-					title: res.msg,
+					title: loginRes.errMsg,
 					duration: 2000,
 					icon: "none"
 				});
-
-			}).catch((res)=> {
-				console.log("catch")
-				console.log(res);
-			});
+			}
 		}
 	});
 	// return res
@@ -65,8 +95,19 @@ function login() {
 function getToken() {
 	try {
 		const value = uni.getStorageSync('token');
-		if (value) {
-			token = value;
+		const uid = uni.getStorageInfoSync('uid');
+		if (value && uid) {
+			const nowTime = new Date().getTime();
+			//token超时则重新登录
+			if(nowTime - value.time > TOKEN_TIMEOUT){
+				//清除token和uid
+				cleanUserInfo();
+				login()
+			}else{
+				token = value;
+				getApp().globalData.uid = uid
+			}
+			
 		} else {
 			login();
 		}
@@ -75,8 +116,29 @@ function getToken() {
 	}
 }
 
+function cleanUserInfo(){
+	try{
+		uni.removeStorageSync('token')
+		uni.removeStorageSync('uid')
+		getApp().globalData.uid = null
+		token = ''
+	}catch(e){
+		
+	}
+	
+}
+
+function gotoLoginPage(){
+	uni.navigateTo({
+		url: '../../pages/login/login',
+		complete(res){
+			console.log(res);
+		}
+	})
+}
+
 // 获取token
-//getToken();
+getToken();
 // login();
 
 
@@ -87,22 +149,22 @@ const defaultHeader = {
 
 // 拦截器
 uni.addInterceptor('request', {
-  invoke(args) {
-    // request 触发前拼接 url 
-    //args.url = BASEURL;
-		if(token) {
+	invoke(args) {
+		// request 触发前拼接 url 
+		//args.url = BASEURL;
+		if (token) {
 			args.header.token = token;
 		};
-  },
-  success(args) {
-    // 请求成功后
-  }, 
-  fail(err) {
-    console.log('interceptor-fail',err)
-  }, 
-  complete(res) {
-    console.log('interceptor-complete',res)
-  }
+	},
+	success(args) {
+		// 请求成功后
+	},
+	fail(err) {
+		console.log('interceptor-fail', err)
+	},
+	complete(res) {
+		console.log('interceptor-complete', res)
+	}
 })
 
 /**
@@ -111,9 +173,9 @@ uni.addInterceptor('request', {
  * @returns 
  */
 function request(data, type = "POST", header = defaultHeader) {
-	let url = BASEURL+PATH
-	if(NoTokenServants.indexOf(data.servant)>=0){
-		url = BASEURL+PATH1
+	let url = BASEURL + PATH
+	if (NoTokenServants.indexOf(data.servant) >= 0) {
+		url = BASEURL + PATH1
 	}
 	return new Promise((resolve, reject) => {
 		uni.request({
@@ -133,7 +195,7 @@ function request(data, type = "POST", header = defaultHeader) {
 
 						if (resJson.code === 0) {
 
-							let arrayBuffer = Buffer.from(resJson.data,'base64');
+							let arrayBuffer = Buffer.from(resJson.data, 'base64');
 
 							let data = responseDecode(arrayBuffer);
 							let code = 0;
@@ -154,6 +216,17 @@ function request(data, type = "POST", header = defaultHeader) {
 								msg
 							});
 						} else {
+							if (resJson.code === 10004) {
+								uni.showModal({
+									title: '温馨提示',
+									content: 'token已失效,请重新登录',
+									showCancel: false,
+									success() {
+										//进入登录界面
+										gotoLoginPage()
+									}
+								})
+							}
 							resolve({
 								code: resJson.code,
 								msg: resJson.info
@@ -182,4 +255,4 @@ function request(data, type = "POST", header = defaultHeader) {
 
 }
 
-module.exports = request;
+module.exports = { request, saveToken };

+ 1 - 1
main.js

@@ -2,7 +2,7 @@ import Vue from 'vue'
 import App from './App'
 
 import all from './Lib/Mqtt';
-import request from './Lib/Request';
+import {request} from './Lib/Request';
 
 Vue.use(all);//将全局函数当做插件来进行注册
 

+ 72 - 55
pages/index/index.vue

@@ -1,69 +1,86 @@
 <template>
-	<view class="content">
-		<button type="default" open-type="getPhoneNumber" @getphonenumber="decryptPhoneNumber">微信授权一键登录</button>
-		<button @click="wxHttpTest" style="margin-top: 10rps;">miniprogram http请求</button>
-		</view>
+  <view class="content">
+    <!-- <button
+      type="default"
+      open-type="getPhoneNumber"
+      @getphonenumber="decryptPhoneNumber"
+    >
+      微信授权一键登录
+    </button>
+    <button @click="wxHttpTest" style="margin-top: 10rps">
+      miniprogram http请求
+    </button> -->
+	uid:{{uid}}
+  </view>
 </template>
 
 <script>
-
-	
-	export default {
-		data() {
-			return {
-
-			}
-		},
-		methods: {
-			decryptPhoneNumber(e) {
-				console.log(e.detail.errMsg)
-				console.log(e.detail.iv)
-				console.log(e.detail.encryptedData)
-			},
-		  wxHttpTest() {
-				//try{
-				this.$request({
-					server:2,
-					servant:1005,
-					data:{
-						// phone:Buffer.from('3246541321'),
-						phone:'3246541321',
-						type:1,
-						//verifyInfo:Buffer.from('asdasd')
-						verifyInfo:'asdasd',
-						data:{
-							
-						}
-					}
-				})
-				.then((res) =>{
-					console.log(res);
-					/* res的结构
+export default {
+  data() {
+    return {
+		uid:''
+	};
+  },
+  onLoad(){
+	  this.uid = getApp().globalData.uid
+	  
+	  uni.$on('user_getUid',this.uidCallback)
+  },
+  onUnload(){
+	uni.$off('user_getUid',this.uidCallback)
+  },
+  methods: {
+	uidCallback(data){
+		this.uid = data.uid
+	},
+    decryptPhoneNumber(e) {
+      console.log(e.detail.errMsg);
+      console.log(e.detail.iv);
+      console.log(e.detail.encryptedData);
+    },
+    wxHttpTest() {
+      //try{
+      this.$request({
+        server: 2,
+        servant: 1005,
+        data: {
+          // phone:Buffer.from('3246541321'),
+          phone: "3246541321",
+          type: 1,
+          //verifyInfo:Buffer.from('asdasd')
+          verifyInfo: "asdasd",
+          data: {},
+        },
+      }).then(
+        (res) => {
+          console.log(res);
+          /* res的结构
 					  {
 						  code:0,错误码 number类型
 						  msg:"",错误消息 string类型
 						  data:对应loginRsp的js对象
 					  }
 					 */
-					if(res.code === 0){//成功
-						
-					}else{
-						//失败
-					}
-				}, (err) => {//出现异常
-					console.log(err);
-				})
-			}
-		}
-	}
+          if (res.code === 0) {
+            //成功
+          } else {
+            //失败
+          }
+        },
+        (err) => {
+          //出现异常
+          console.log(err);
+        }
+      );
+    },
+  },
+};
 </script>
 
 <style>
-	.content {
-		display: flex;
-		flex-direction: column;
-		align-items: center;
-		justify-content: center;
-		margin: 20rpx;
-	}
+.content {
+  display: flex;
+  flex-direction: column;
+  margin: 20rpx;
+}
 </style>

+ 65 - 21
pages/login/login.vue

@@ -12,6 +12,7 @@
 </template>
 
 <script>
+import { saveToken } from "../../Lib/Request";
 export default {
   components: {},
   data: () => ({
@@ -26,27 +27,46 @@ export default {
       uni.login({
         provider: "weixin",
         success: function (loginRes) {
-          console.log(loginRes.authResult);
-          //调用登录接口
-          that
-            .$request({
-              server: 2,
-              servant: 10005,
-              data: {
-                code: loginRes.code,
-              },
-            })
-            .then((result) => {
-              console.log(result);
-              if (result.code === 0) {
-                that.openid = result.data.openid;
-                //获取token
-                that.getToken();
-              }
-            })
-            .catch((err) => {
-              console.log(err);
+          console.log(`uni.login errMsg = ${loginRes.errMsg}`);
+          if (loginRes.code) {
+            //调用登录接口
+            that
+              .$request({
+                server: 2,
+                servant: 10005,
+                data: {
+                  code: loginRes.code,
+                },
+              })
+              .then((result) => {
+                console.log(result);
+                if (result.code === 0) {
+                  if (result.data.token && result.data.id) {
+                    //保存token
+                    saveToken(result.data.token, result.data.id);
+                  } else {
+                    that.openid = result.data.openid;
+                    //获取token
+                    that.getToken();
+                  }
+                } else {
+                  uni.showToast({
+                    title: result.msg,
+                    duration: 2000,
+                    icon: "none",
+                  });
+                }
+              })
+              .catch((err) => {
+                console.log(err);
+              });
+          } else {
+            uni.showToast({
+              title: loginRes.errMsg,
+              duration: 2000,
+              icon: "none",
             });
+          }
         },
         fail(err) {
           console.log(err);
@@ -65,6 +85,12 @@ export default {
         };
         //获取token
         this.getToken();
+      } else {
+        uni.showToast({
+          title: "用户拒绝权限",
+          duration: 2000,
+          icon: "none",
+        });
       }
     },
     //获取uuid和token
@@ -72,7 +98,7 @@ export default {
       console.log(this.openid);
       console.log(this.phoneInfo);
       if (this.openid && this.phoneInfo) {
-        console.log('getToken');
+        console.log("getToken");
         const platform = uni.getSystemInfoSync().platform;
         let systemType;
         switch (platform) {
@@ -105,6 +131,24 @@ export default {
         })
           .then((result) => {
             console.log(result);
+            if (result.code === 0) {
+              if (result.data.token && result.data.id) {
+                //保存token
+                saveToken(result.data.token, result.data.id);
+              }else{
+                uni.showToast({
+                title: 'token 或者uid为空',
+                duration: 2000,
+                icon: "none",
+              });
+              }
+            } else {
+              uni.showToast({
+                title: result.msg,
+                duration: 2000,
+                icon: "none",
+              });
+            }
           })
           .catch((err) => {
             console.log(err);

+ 2 - 0
proto/User.proto

@@ -13,6 +13,8 @@ message loginReq {
 message loginRsp {
     ErrorInfo errInfo   = 1; // 错误码信息
     string openid        = 2; // 微信账号唯一标识openid
+    string token         = 3; // 访问令牌
+    uint32 id           = 4;
 }
 
 //枚举消息类型