uniapp+node.js+mysql前后端微信小程序授权登录

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: uniapp+node.js+mysql前后端微信小程序授权登录

前言

利用了vuex状态管理存储了登录的信息,还加入了token,识别token是否需要授权登录

利用了uni.login,uni.getUserProfile2个方法获取用户的openid和昵称和头像图片地址

前端代码:有5个页面,1个是微信授权登录的页面,1个”我的“页面

1个封装request.js的页面,2个vuex的状态管理的页面,1个是添加了识别有放token的没有登录就自动跳转登录的功能的main.js页面

后端代码:1个数据库连接页面,1个数据库页面封装查询用户与插入用户信息的页面以及生成用户的token,1个调用接口页面


提示:以下是本篇文章正文内容,下面案例可供参考

一、前端代码?

1.微信授权登录的页面(没有样式,自己写)

1. <template>
2.             <view  @tap='loginOther()'>
3.                 <button>微信登录</button>
4.             </view>
5. </template>
1. import $http from '@/common/api/request.js'
2. import {mapMutations} from 'vuex'
3. export default{
4.     methods:{
5.     ...mapMutations(['login']),
6.     //关闭当前页面,返回上一页
7.     goBack(){
8.         uni.navigateBack({
9.             delta:1
10.         })
11.     },
12.         loginOther(){
13.             uni.login({
14.                 success:(resp)=>{
15.           let code=resp.code;
16.           this.code=code;
17.                 }
18.             }),
19.       uni.getUserProfile({
20.                           desc: "获取你的昵称、头像、地区及性别",
21.                           success: (res) => {
22.                    let ccode=this.code
23.                    let nickName = res.userInfo.nickName;
24.                    let avatarUrl = res.userInfo.avatarUrl;
25.                    $http.request({
26.                        url:"/login",
27.                        method:"POST",
28.                        data:{
29.                        ccode,
30.                        nickName,
31.                        avatarUrl
32.                        },
33.                    }).then((res)=>{
34.                      this.login(res);
35.                      uni.navigateBack({
36.                          delta:1
37.                      })
38.                    }).catch(()=>{
39.                        uni.showToast({
40.                            title:'请求失败',
41.                            icon:'none'
42.                        })
43.                    })
44.                           },
45.                       })
46.         }
47.     }
48. }

2.”我的“页面

1.                 <view class='header-logo'>
2.                     <image class='logo-img' :src=" loginStatus ? userInfo.avatarUrl: '' " mode=""></image>
3.                     <view class='logo-name'>
4.                         {{  loginStatus ? userInfo.nickName : ""   }}
5.                     </view>
6.                 </view>
1.  import {mapState} from 'vuex';
2.  export default {
3.    computed:{
4.      ...mapState({
5.        loginStatus:state=>state.user.loginStatus,
6.        userInfo:state=>state.user.userInfo
7.      })
8.    }
9. 
10.   }

3.封装request.js的页面

1. import store from '@/store/index.js'
2. export default{
3.  common:{
4.      baseUrl:"http://本地ip地址或者你的服务器ip地址或者你服务器的域名:3000/api",
5.    data:{},
6.    header:{
7.      "Content-Type":"application/json",
8.      "Content-Type":"application/x-www-form-urlencoded"
9.    },
10.     method:"GET",
11.     dataType:"json"
12.   },
13.   request( options={} ){
14. 
15.     uni.showLoading({
16.         title: '加载中'
17.     });
18. 
19.     options.url = this.common.baseUrl + options.url;
20.     options.data =  options.data || this.common.data;
21.     options.header = options.header || this.common.header;
22.     options.method = options.method || this.common.method;
23.     options.dataType =  options.dataType || this.common.dataType;
24. 
25.     //判断是否传入了header头的token进行用户是否登录的验证
26.     if(options.header.token){
27.       options.header.token = store.state.user.token;
28.       if(!options.header.token){
29.         uni.showToast({
30.           title:"请先登录",
31.           icon:"none"
32.         })
33.         return uni.navigateTo({
34.           url:"/pages/login/login"
35.         })
36.       }
37.     }
38.     return new Promise((res,rej)=>{
39.       uni.request({
40.         ...options,
41.         success: (result) => {
42.           if(result.statusCode != 200){
43.             return rej();
44.           }
45.           setTimeout(function () {
46.               uni.hideLoading();
47.           }, 500);
48.           let data = result.data.data;
49.           res(data);
50.         }
51.       })
52.     })
53.   }
54. }

4.vuex的状态管理的页面

store文件夹i中ndex.js的的文件然后调用user.js这个模块

1. import Vue from 'vue'
2. import Vuex from 'vuex'
3. 
4. Vue.use(Vuex);
5. //用户
6. import user from './modules/user.js'
7. export default new Vuex.Store({
8.     modules:{
9.         user,
10.     }
11. })
1. export default{
2.     state:{
3.         //登录状态
4.         loginStatus:false,
5.         //token
6.         token:null,
7.         //用户信息(昵称/头像)
8.         userInfo:{}
9.     },
10.     getters:{},
11.     mutations:{
12.         //一旦进入了app,就需要执行这个方法,把用户信息读出来
13.         initUser(state){
14.             let userInfo = uni.getStorageSync('userInfo');
15.             if( userInfo ){
16.                 userInfo = JSON.parse( userInfo );
17.                 state.userInfo = userInfo;
18.                 state.loginStatus = true;
19.                 state.token = userInfo.token;
20.             }
21.         },
22.         //登录后保存用户信息
23.         login(state,userInfo){
24.             state.userInfo = userInfo;
25.             state.loginStatus = true;
26.             state.token = userInfo.token;
27.             //持久化存储 ===>把对象转换成字符串
28.             uni.setStorageSync('userInfo',JSON.stringify(userInfo));
29.         },
30.         //退出登录
31.         loginOut(state){
32.             state.loginStatus = false;
33.             state.userInfo = {};
34.             state.token = null;
35.             //删除本地存储的信息
36.             uni.removeStorageSync('userInfo');
37.         }
38.     },
39.     actions:{}
40. }

5.添加了识别有放token的没有登录就自动跳转登录的功能的main.js页面

1. import Vue from 'vue'
2. import App from './App'
3. 
4. Vue.config.productionTip = false
5. 
6. import store from 'store'
7. Vue.prototype.$store = store;
8. 
9. //权限跳转
10. Vue.prototype.navigateTo = (options)=>{
11.   if( !store.state.user.loginStatus ){
12.     uni.showToast({
13.       title:"请先登录",
14.       icon:"none"
15.     })
16.     return  uni.navigateTo({
17.         url:"/pages/login/login"
18.       })
19.   }
20.   uni.redirectTo(options)
21. }
22. 
23. App.mpType = 'app'
24. 
25. const app = new Vue({
26.   store,
27.     ...App
28. })
29. app.$mount()

二、后端代码

1.数据库连接页面(sql.js)

1. var mysql = require('mysql');//引入
2. var connection = mysql.createConnection({
3.       host     : 'localhost或者你的服务器公网地址',
4.       user     : '用户名',
5.       password : '自己的数据库密码',
6.       database : '数据库名称'
7. });
8. module.exports = connection;//抛出

2.数据库页面封装查询用户与插入用户信息的页面以及生成用户的token(UserSql.js)

1. var User = {
2.  //查询用户名
3.  queryUserName( param ){
4.    if( param.openid){
5.      //phone = 应该是手机号这个变量[属性],为了后面好操作所有名称改为:userName
6.      return "select * from wechatuser where openid = '"+param.openid+"' or nickName = '"+param.nickName+"' ";
7.    }
8.  },
9. 
10.   //增加一条用户数据
11.   insertData( param ){
12.     let openid = param.openid;
13.     const jwt = require('jsonwebtoken');
14.     let payload = {name:openid}; //openid
15.     let secret = '自己编一个口令比如“mysql”';//口令
16.     let token = jwt.sign(payload,secret);//拼接token
17.     let nickName = param.nickName;
18.     let avatarUrl = param.avatarUrl ;
19.     return 'insert into wechatuser (openid,nickName,avatarUrl,token) values ("'+openid+'","'+nickName+'","'+avatarUrl+'","'+token+'")';
20.   }
21. }
22. 
23. exports = module.exports = User;

3.调用接口页面(sever下面的router下面的index.js)

1. var express = require('express');
2. var router = express.Router();
3. var connection = require('../db/sql.js');
4. var user = require('../db/UserSql.js');
5. var jwt_decode = require('jwt-decode');
6. const request = require('request')
7. router.post('/api/login', function(req, res, next) {
8. let code=req.body.ccode;//登陆传过来的code
9. let nickName=req.body.nickName;
10. let avatarUrl=req.body.avatarUrl;
11. let appid = "自己小程序后台管理的appid"; //自己小程序后台管理的appid,可登录小程序后台查看
12. let mysecret = "小程序后台管理的secret"; //小程序后台管理的secret,可登录小程序后台查看
13. let grant_type = "authorization_code"; // 授权(必填)默认值
14. //拼接出请求微信服务器的url地址然后请求oppenid和session_key
15. let url ='https://api.weixin.qq.com/sns/jscode2session?appid=' + appid + '&secret=' + mysecret + '&js_code=' + code + '&grant_type=authorization_code';
16. request(url,(error, response, body)=>{
17. //JSON.parse()方法将JSON格式字符串转换为js对象
18. let parsData = JSON.parse(body.toString());
19. let openid=parsData.openid;
20. let session_key=parsData.session_key;
21. let params={
22.           openid,
23.           nickName,
24.           avatarUrl
25.         }
26.   //查询数据库中有没有此用户
27.   connection.query( user.queryUserName( params ) , function (error, results, fields) {
28.     if( results.length > 0){
29.       //数据库中存在      : 读取
30.       connection.query( user.queryUserName( params ) , function (e, r) {
31. 
32.         res.send({
33.           data:r[0]
34. 
35.         })
36.       })
37.     }else{
38.       //数据库中[不]存在  : 存储 ==>读取
39.       connection.query( user.insertData( params ) , function (er, result) {
40.         connection.query( user.queryUserName( params ) , function (e, r) {
41.           res.send({
42.             data:r[0]
43.           })
44.         })
45.       })
46.     }
47.   }) 
48.          })
49. })

总结

当你想要设置一个页面想要使用必须先登录就在那个页面的接口请求中加入token比如

1.        $http.request({
2.          url:"/selectCart",
3.          method:"POST",
4. 
5.          header:{
6.            token:true
7.          }
8. 
9.        }).then((res)=>{
10.           this.initGetData(res);
11.         }).catch(()=>{
12.           uni.showToast({
13.             title:'请求失败',
14.             icon:'none'
15.           })
16.         })

 


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
18天前
|
小程序 安全 数据安全/隐私保护
微信小程序全栈开发中的身份认证与授权机制
【4月更文挑战第12天】本文探讨了微信小程序全栈开发中的身份认证与授权机制。身份认证包括手机号验证、微信登录和第三方登录,而授权机制涉及角色权限控制、ACL和OAuth 2.0。实践中,开发者可利用微信登录获取用户信息,集成第三方登录,以及实施角色和ACL进行权限控制。注意点包括安全性、用户体验和合规性,以保障小程序的安全运行和良好体验。通过这些方法,开发者能有效掌握小程序全栈开发技术。
|
3月前
|
监控 数据可视化 关系型数据库
微服务架构+Java+Spring Cloud +UniApp +MySql智慧工地系统源码
项目管理:项目名称、施工单位名称、项目地址、项目地址、总造价、总面积、施工准可证、开工日期、计划竣工日期、项目状态等。
308 6
|
2月前
|
JavaScript 小程序
微信小程序 wxml 中使用 js函数
微信小程序 wxml 中使用 js函数
78 0
|
2月前
|
小程序 JavaScript 前端开发
【微信小程序】--WXML & WXSS & JS 逻辑交互介绍(四)
【微信小程序】--WXML & WXSS & JS 逻辑交互介绍(四)
|
2月前
|
传感器 人工智能 监控
智慧工地云信息平台源码(微服务+java+springcloud+uniapp+mysql)
智慧工地云信息平台源码(微服务+java+springcloud+uniapp+mysql)
31 0
|
2月前
|
Java 关系型数据库 MySQL
【项目】手把手带你用 SpringBoot、Uniapp、MySql 开发一个简单的活动报名项目
【项目】手把手带你用 SpringBoot、Uniapp、MySql 开发一个简单的活动报名项目
154 1
|
3月前
|
小程序 JavaScript
微信小程序授权登录?
微信小程序授权登录?
|
3月前
|
API
uniapp怎么实现授权登录
uniapp怎么实现授权登录
46 2
|
3月前
|
资源调度 JavaScript 关系型数据库
Node.js【文件系统模块、路径模块 、连接 MySQL、nodemon、操作 MySQL】(三)-全面详解(学习总结---从入门到深化)
Node.js【文件系统模块、路径模块 、连接 MySQL、nodemon、操作 MySQL】(三)-全面详解(学习总结---从入门到深化)
33 0
|
4月前
|
JavaScript 关系型数据库 MySQL
百度搜索:蓝易云【Node.js写接口连接MySQL数据库教程】
现在,你的Node.js应用已经启动,可以通过访问 `http://localhost:3000/users`来获取所有用户的信息。注意替换上述代码中的数据库连接信息为你自己的实际数据。
51 0