Browse Source

feat 添加微信登录和token验证

tumobi 7 years ago
parent
commit
f47ce61d05
8 changed files with 221 additions and 80 deletions
  1. 13 28
      app.js
  2. 2 0
      config/api.js
  3. 7 8
      pages/index/index.js
  4. 1 1
      pages/index/index.wxml
  5. 17 15
      pages/ucenter/index/index.js
  6. 1 1
      pages/ucenter/index/index.wxml
  7. 74 0
      services/user.js
  8. 106 27
      utils/util.js

+ 13 - 28
app.js

@@ -1,40 +1,25 @@
 var util = require('./utils/util.js');
 var api = require('./config/api.js');
+var user = require('./services/user.js');
 
 App({
   onLaunch: function () {
-
-    var that = this;
-    that.login();
-  
-  },
-  login: function () {
-    var that = this;
-    wx.login({
-      success: function (res) {
-        wx.getUserInfo({
-          success: function (infoRes) {
-            console.log(res);
-            util.request(api.AuthLogin, { code: res.code , userInfo: infoRes.userInfo}, 'POST')
-              .then(function (res) {
-                wx.setStorageSync('token', res.data.token);
-                wx.setStorageSync('userInfo', res.data.userInfo);
-                that.globalData.userInfo = res.data.userInfo;
-            });
-          }
-        });
-        
-      },
-      fail: function (res) {
-
-      }
+    //获取用户的登录信息
+    user.checkLogin().then(res => {
+      console.log('app login')
+      this.globalData.userInfo = wx.getStorageSync('userInfo');
+      this.globalData.token = wx.getStorageSync('token');
+    }).catch(() => {
+      
     });
   },
+  
   globalData: {
     userInfo: {
-      nickname: '去登录',
-      username: '',
+      nickname: 'Hi,游客',
+      username: '点击去登录',
       avatar: 'http://yanxuan.nosdn.127.net/8945ae63d940cc42406c3f67019c5cb6.png'
-    }
+    },
+    token: '',
   }
 })

+ 2 - 0
config/api.js

@@ -5,6 +5,8 @@ module.exports = {
     CatalogList: NewApiRootUrl + 'catalog/index',  //分类目录全部分类数据接口
     CatalogCurrent: NewApiRootUrl + 'catalog/current',  //分类目录当前分类数据接口
 
+    AuthLoginByWeixin: NewApiRootUrl + 'auth/login_by_weixin', //微信登录
+
     GoodsCount: NewApiRootUrl + 'goods/count',  //统计商品总数
     GoodsList: NewApiRootUrl + 'goods/list',  //获得商品列表
     GoodsCategory: NewApiRootUrl + 'goods/category',  //获得分类数据

+ 7 - 8
pages/index/index.js

@@ -1,7 +1,9 @@
-var util = require('../../utils/util.js');
-var api = require('../../config/api.js');
+const util = require('../../utils/util.js');
+const api = require('../../config/api.js');
+const user = require('../../services/user.js');
+
 //获取应用实例
-var app = getApp()
+const app = getApp()
 Page({
   data: {
     newGoods: [],
@@ -14,7 +16,7 @@ Page({
   },
   onShareAppMessage: function () {
     return {
-      title: 'YouApp',
+      title: 'NideShop',
       desc: '仿网易严选微信小程序商城',
       path: '/pages/index/index'
     }
@@ -23,8 +25,7 @@ Page({
   getIndexData: function () {
     let that = this;
     util.request(api.IndexUrl).then(function (res) {
-      if(res.errno === 0) {
-        console.log(res.data);
+      if (res.errno === 0) {
         that.setData({
           newGoods: res.data.newGoodsList,
           hotGoods: res.data.hotGoodsList,
@@ -38,9 +39,7 @@ Page({
     });
   },
   onLoad: function (options) {
-
     this.getIndexData();
-
   },
   onReady: function () {
     // 页面渲染完成

+ 1 - 1
pages/index/index.wxml

@@ -9,7 +9,7 @@
     </swiper-item>
   </swiper>
   <view class="m-menu">
-    <navigator class="item" url="{{item.url}}" wx:for="{{channel}}" wx:key="{{item.id}}">
+    <navigator  class="item" url="{{item.url}}" wx:for="{{channel}}" wx:key="{{item.id}}">
       <image src="{{item.icon_url}}" background-size="cover"></image>
       <text>{{item.name}}</text>
     </navigator>

+ 17 - 15
pages/ucenter/index/index.js

@@ -1,5 +1,6 @@
 var util = require('../../../utils/util.js');
 var api = require('../../../config/api.js');
+var user = require('../../../services/user.js');
 var app = getApp();
 
 Page({
@@ -8,30 +9,19 @@ Page({
   },
   onLoad: function (options) {
     // 页面初始化 options为页面跳转所带来的参数
-    console.log(app.globalData.userInfo)
-    this.setData({
-      userInfo: app.globalData.userInfo
-    });
+    console.log(app.globalData)
   },
   onReady: function () {
 
   },
   onShow: function () {
     // 页面显示
-    const token = wx.getStorageSync('token');
-    if (!token) {
-      // wx.redirectTo({
-      //   url: '/pages/auth/login/login'
-      // })
+    if (app.globalData.userInfo) {
       this.setData({
-        userInfo: {
-          nickname: '去登录',
-          username: '',
-          avatar: 'http://yanxuan.nosdn.127.net/8945ae63d940cc42406c3f67019c5cb6.png'
-        }
+        userInfo: app.globalData.userInfo
       });
-      return false;
     }
+
   },
   onHide: function () {
     // 页面隐藏
@@ -40,6 +30,17 @@ Page({
   onUnload: function () {
     // 页面关闭
   },
+  goLogin(){
+    user.loginByWeixin().then(res => {
+      this.setData({
+        userInfo: res.data.userInfo
+      });
+      app.globalData.userInfo = res.data.userInfo;
+      app.globalData.token = res.data.token;
+    }).catch((err) => {
+      console.log(err)
+    });
+  },
   exitLogin: function () {
     wx.showModal({
       title: '',
@@ -48,6 +49,7 @@ Page({
       success: function (res) {
         if (res.confirm) {
           wx.removeStorageSync('token');
+          wx.removeStorageSync('userInfo');
           wx.switchTab({
             url: '/pages/index/index'
           });

+ 1 - 1
pages/ucenter/index/index.wxml

@@ -1,5 +1,5 @@
 <view class="container">
-  <view class="profile-info">
+  <view class="profile-info" bindtap="goLogin">
     <image class="avatar" src="{{userInfo.avatar}}"></image>
     <view class="info">
       <text class="name">{{userInfo.nickname}}</text>

+ 74 - 0
services/user.js

@@ -0,0 +1,74 @@
+/**
+ * 用户相关服务
+ */
+
+const util = require('../utils/util.js');
+const api = require('../config/api.js');
+
+
+/**
+ * 调用微信登录
+ */
+function loginByWeixin() {
+
+  let code = null;
+  return new Promise(function (resolve, reject) {
+    return util.login().then((res) => {
+      code = res.code;
+      return util.getUserInfo();
+    }).then((userInfo) => {
+      //登录远程服务器
+      util.request(api.AuthLoginByWeixin, { code: code, userInfo: userInfo }, 'POST').then(res => {
+        if (res.errno === 0) {
+          //存储用户信息
+          wx.setStorageSync('userInfo', res.data.userInfo);
+          wx.setStorageSync('token', res.data.token);
+
+          resolve(res);
+        } else {
+          reject(res);
+        }
+      }).catch((err) => {
+        reject(err);
+      });
+    }).catch((err) => {
+      reject(err);
+    })
+  });
+}
+
+/**
+ * 判断用户是否登录
+ */
+function checkLogin() {
+  return new Promise(function (resolve, reject) {
+    if (wx.getStorageSync('userInfo') && wx.getStorageSync('token')) {
+
+      util.checkSession().then(() => {
+        resolve(true);
+      }).catch(() => {
+        reject(false);
+      });
+
+    } else {
+      reject(false);
+    }
+  });
+}
+
+
+module.exports = {
+  loginByWeixin,
+  checkLogin,
+};
+
+
+
+
+
+
+
+
+
+
+

+ 106 - 27
utils/util.js

@@ -1,3 +1,5 @@
+var api = require('../config/api.js');
+
 function formatTime(date) {
   var year = date.getFullYear()
   var month = date.getMonth() + 1
@@ -17,33 +19,55 @@ function formatNumber(n) {
 }
 
 /**
- * 封微信的的request
+ * 封微信的的request
  */
 function request(url, data = {}, method = "GET") {
-  return new Promise(function(resolve, reject){
+  return new Promise(function (resolve, reject) {
     wx.request({
       url: url,
       data: data,
       method: method,
       header: {
         'Content-Type': 'application/json',
-        'X-You-Token': wx.getStorageSync('token')
+        'X-Nideshop-Token': wx.getStorageSync('token')
       },
-      success: function(res) {
-        console.log("success" );
-        
-        if(res.statusCode == 200){
-          //处理未登录
-          if(res.data.errno == 401){
-            
-            console.log('快去登录');
-          }else{
+      success: function (res) {
+        console.log("success");
+
+        if (res.statusCode == 200) {
+
+          if (res.data.errno == 401) {
+            //需要登录后才可以操作
+
+            let code = null;
+            return login().then((res) => {
+              code = res.code;
+              return getUserInfo();
+            }).then((userInfo) => {
+              //登录远程服务器
+              request(api.AuthLoginByWeixin, { code: code, userInfo: userInfo }, 'POST').then(res => {
+                if (res.errno === 0) {
+                  //存储用户信息
+                  wx.setStorageSync('userInfo', res.data.userInfo);
+                  wx.setStorageSync('token', res.data.token);
+                  
+                  resolve(res);
+                } else {
+                  reject(res);
+                }
+              }).catch((err) => {
+                reject(err);
+              });
+            }).catch((err) => {
+              reject(err);
+            })
+          } else {
             resolve(res.data);
           }
-        }else{
+        } else {
           reject(res.errMsg);
         }
-        
+
       },
       fail: function (err) {
         reject(err)
@@ -53,21 +77,73 @@ function request(url, data = {}, method = "GET") {
   });
 }
 
-function redirect(url){
-
-  //判断页面是否需要登录
+/**
+ * 检查微信会话是否过期
+ */
+function checkSession() {
+  return new Promise(function (resolve, reject) {
+    wx.checkSession({
+      success: function () {
+        resolve(true);
+      },
+      fail: function () {
+        reject(false);
+      }
+    })
+  });
+}
 
-  wx.redirectTo({
-    url: '/pages/auth/login/login'
+/**
+ * 调用微信登录
+ */
+function login() {
+  return new Promise(function (resolve, reject) {
+    wx.login({
+      success: function (res) {
+        if (res.code) {
+          //登录远程服务器
+          resolve(res);
+        } else {
+          reject(res);
+        }
+      },
+      fail: function (err) {
+        reject(err);
+      }
+    });
   });
-  return false;
+}
 
-  wx.redirectTo({
-    url: url
+function getUserInfo() {
+  return new Promise(function (resolve, reject) {
+    wx.getUserInfo({
+      withCredentials: true,
+      success: function (res) {
+        resolve(res);
+      },
+      fail: function (err) {
+        reject(err);
+      }
+    })
   });
 }
 
-function showErrorToast(msg){
+function redirect(url) {
+
+  //判断页面是否需要登录
+  if (false) {
+    wx.redirectTo({
+      url: '/pages/auth/login/login'
+    });
+    return false;
+  } else {
+    wx.redirectTo({
+      url: url
+    });
+  }
+}
+
+function showErrorToast(msg) {
   wx.showToast({
     title: msg,
     image: '/static/images/icon_error.png'
@@ -75,10 +151,13 @@ function showErrorToast(msg){
 }
 
 module.exports = {
-  formatTime: formatTime,
-  request: request,
-  redirect: redirect,
-  showErrorToast: showErrorToast
+  formatTime,
+  request,
+  redirect,
+  showErrorToast,
+  checkSession,
+  login,
+  getUserInfo,
 }