解决方案

手机号注册登录(保姆级)

seo靠我 2023-09-24 13:13:16

登录流程(uni-app)

文章目录

登录流程(uni-app)1.登录实现2.登录实现3.找回密码4.token 1.登录实现

1.发送登录请求/api/admin/loginUserSEO靠我

2.判断返回的code是否200.

3.code200 则向vuex userLogin传递用户的信息。

4.并且做持久化存储。localStorage.setItem(‘userInfo’,JSON.sSEO靠我tringify(user))<template><view class="login"><view class="login-title">场馆预约</view><view class="loginSEO靠我-content"><el-form :model="form" :rules="rules" ref="form" label-width="40px" class="demo-ruleForm">SEO靠我<el-form-item prop="phone"><el-input v-model="form.phone" placeholder="用户名/手机号"></el-input></el-formSEO靠我-item><el-form-item prop="password"><el-input v-model="form.password" placeholder="密码" type="passworSEO靠我d"></el-input></el-form-item></el-form></view><view class="login-button"><el-button type="info" rounSEO靠我d @click="onsubmit">登录</el-button></view><view class="login-botton"><view class="login-password" @clSEO靠我ick="findPassword">找回密码</view><span>|</span><view class="login-zhuce" @click="Registration">注册账号</viSEO靠我ew></view></view> </template><script> import { mapMutations } from vuex; expSEO靠我ort default {data() {return {form: {phone: ,password: },rules: {phone: [{ required: true, message: 请SEO靠我输入手机号, rule: /^1[23456789]\d{9}$/ }],password: [{ required: true, message: 请输入密码, trigger: blur }]}}SEO靠我;},methods: {// ...mapMutations([user_Login]),//登录onsubmit() {this.$refs.form.validate(valid => {if SEO靠我(valid) {uni.request({url: /api/admin/loginUser,method: POST,data: this.form,success: res => {consolSEO靠我e.log(res.data.data.data);if (res.data.code == 200) {this.$store.commit("userLogin",res.data.data.daSEO靠我ta );//页面跳转this.$router.push(/pages/my/my);uni.showToast({title: res.data.data.msg,icon: none});} elSEO靠我se {uni.showToast({title: res.data.data.msg,icon: none});}}});} else {console.log(error submit!!);reSEO靠我turn false;}});},Registration() {console.log(hah );uni.navigateTo({url: ../../pages/login/registratiSEO靠我on});},findPassword() {console.log(hah );this.$router.push(/pages/login/findPassword);}} }; SEO靠我 </script><style lang="less"> .login {.login-title {padding-top: 150rpx;display: flexSEO靠我;justify-content: center;font-weight: 700;font-size: 40rpx;letter-spacing: 5rpx;margin-bottom: 50rpxSEO靠我;}.demo-ruleForm {width: 90%;height: 60rpx;}/deep/.el-input__inner {height: 100rpx;border-radius: 50SEO靠我rpx;padding-left: 40rpx;}.login-botton {}/deep/.el-button--info {width: 80%;margin-left: 12%;margin-SEO靠我top: 260rpx;height: 80rpx;}.login-botton {display: flex;margin-top: 100rpx;justify-content: center;.SEO靠我login-password {padding-right: 20rpx;color: #2d66e3;}.login-zhuce {padding-left: 20rpx;color: #2d66eSEO靠我3;}} } </style>

/api/admin/loginUser 服务端的代码。

// 普通用户登录数据 router.post(/loginUseSEO靠我r, function(req, res, next) {let params={phone:req.body.phone,password:req.body.password}connection.SEO靠我query(user.queryUserTel(params),(err,results,fields)=>{//手机号存在if(results.length>0){connection.query(SEO靠我user.queryUserPwd(params),(err,results,fields)=>{if(results.length>0){//手机号和密码都对res.send({code:200,dSEO靠我ata:{success:true,msg:登录成功,data:results[0]}})}else{//密码不对res.send({code:302,data:{success:false,msg:SEO靠我密码不对}})}})}else{//不存在,返回错误信息res.send({code:301,data:{success:false,msg:手机号不存在}})} }) SEO靠我 }) 2.登录实现

1验证码时要判断用户输入的手机号是否满足要求。

2.若满足要求则向服务器发送 /api/admin/code

3.判断请求返回是否成功。

4.则返回用户手机的验证码

==SEO靠我 注册阶段==,则要判断用户输入的验证码与服务器返回的验证码是否相同。

2.如果验证码真确则,则需要判断用户是否已近存在 /api/admin/addUser。

3.若用用户存在则直接登录跳转。

4.若用户SEO靠我不存在则需要向数据中添加用户。<template><view class="registration"><view class="registration-content"><el-form :rulSEO靠我es="rules" ref="form" label-width="40px" class="demo-ruleForm"><el-form-item prop="phone"><el-input SEO靠我v-model="phone" placeholder="手机号"></el-input></el-form-item><el-form-item prop="code" class=pwd><el-SEO靠我input v-model="userCode" placeholder="验证码" type="password"></el-input><el-button type="warning" :disSEO靠我abled=disabled @click=sendCode>{{codeMsg}}</el-button></el-form-item></el-form></view><view class="lSEO靠我ogin-button"><el-button type="info" round @click="login">注册</el-button></view><view class="registratSEO靠我ion-botton"><view class="registration-password" @click="goBack">密码登陆</view></view></view> </SEO靠我template><script>export default {data() {return {phone:"",userCode:,disabled:false,codeNum:10,codeMsSEO靠我g:获取验证码,code:"",rules:{phone:{rule: /^1[23456789]\d{9}$/,meg:手机的格式不对}}};},methods:{sendCode(){if (thSEO靠我is.phone == ) {uni.showToast({title: 手机号不能为空,icon: none});} else if (this.phone != ) {var reg = /^1[SEO靠我3456789]\d{9}$/;if (!reg.test(this.phone)) {uni.showToast({title: 输入有效的手机号,icon: none});}else{//禁用按钮SEO靠我this.disabled=true//发送请求uni.request({url:/api/admin/code,method:POST,data:{phone:this.phone},successSEO靠我:res=>{console.log(11,res.data.data)if(res.data.data.success){this.code=res.data.data.data}}})//倒计时lSEO靠我et timer=setInterval(()=>{--this.codeNum;this.codeMsg=`重新发送 ${this.codeNum}`},1000)//判断定时器停止setTimeoSEO靠我ut(()=>{clearInterval(timer);this.disabled=false,this.codeMsg=获取验证码,this.codeNum=10},10000)}}},//登录lSEO靠我ogin(){if(this.code==|| this.phone==){uni.showToast({title:手机号不能为空,icon:none})}else if(this.userCodeSEO靠我 == this.code){//验证码正确uni.request({url:/api/admin/addUser,method:POST,data:{phone:this.phone},succesSEO靠我s:res=>{//code 200 注册成功if(res.data.code==200){uni.showToast({title:res.data.data.msg,icon:none})//给vSEO靠我uex添加数据this.$store.commit("userLogin",res.data.data.data );//路由跳转this.$router.push(/pages/my/my)}elsSEO靠我e{uni.showToast({title:res.data.data.msg,icon:none})}}})}},//密码登录goBack(){this.$router.push(/pages/lSEO靠我ogin/login)},validate(key){let bool=true;if(!this.rules[key].rule.test(this[key])){uni.showToast({tiSEO靠我tle:this.rules[key].meg,icon:none})bool=false;return false}return bool}}} </script><style laSEO靠我ng="less">.demo-ruleForm {width: 90%;height: 50rpx;padding-top: 100rpx;}/deep/.el-input__inner {heigSEO靠我ht: 100rpx;border-radius: 5rpx;padding-left: 40rpx;}/deep/.el-form-item__content{display: flex;}/deeSEO靠我p/.el-button--info {width: 80%;margin-left: 12%;margin-top: 260rpx;height: 80rpx;}.registration-bottSEO靠我on {display: flex;margin-top: 50rpx;justify-content: space-between;.registration-password {padding-lSEO靠我eft: 40rpx;color: #2d66e3;}.registration-zhuce {padding-right: 40rpx;color: #2d66e3;}} </stySEO靠我le>

服务端代码/api/admin/code,获取短信验证码

//发送短信验吗 router.post(/code,function(req,res,next){let phone=rSEO靠我eq.body.phone//短信应用SDKvar appid=1400187558;// appKeyvar appkey=填自己的;var phoneNumbers=[phone];var temSEO靠我platedId=舔自己的var smsSign=舔自己的’;var qcloudsms=QcloudSms(appid,appkey);function callback(err,ress,resDSEO靠我ata){if(err){console.log(err,err);}else{//返回给前端数据res.send({code:200,data:{success:true,data:ress.reqSEO靠我.body.params[0]}})}}var ssender = qcloudsms.SmsSingleSender();//往上手机上发送的数据var params=[Math.floor(MatSEO靠我h.random()*(9999-1000))+1000];ssender.sendWithParam(86,phoneNumbers[0],templatedId,params,smsSign,""SEO靠我,"",callback); })

服务端代码/api/admin/addUser。

//新增用户 router.post(/addUser,function(req,reSEO靠我s,next){let tel={phone:req.body.phone}//查询用户是否存在connection.query(user.queryUserTel(tel),function(errSEO靠我or,results){// if(error) throw error;if(results.length>0){//用户存在res.send({code:200,data:{success:truSEO靠我e,msg:"登录成功",data:results[0]}})}else{//新增用户//引入token包let pwd=require(jsonwebtoken)//用户信息let payload=SEO靠我{phone:req.body.phone}//口令let secret=xiaoming//生成tokenlet token =pwd.sign(payload,secret)var sql=insSEO靠我ert into users values(null,?,?,?,?,?,?,?,?,?)connection.query(sql,[小明,"666666",req.body.phone,"12","SEO靠我11","22",token,"0","0"],function(error,results){if(error){console.log(插入失败,error.message);return;} cSEO靠我onsole.log(插入成功:,results); //查询用户connection.query(user.queryUserTel(tel),function(e,r){res.send({codSEO靠我e:200,data:{success:true,msg:"登录成功",data:r[0]}})})})}}) }) 3.找回密码

1.首先判断用户输入的手机号是否符合SEO靠我要求

2.若符合要求则向后端服务器发送器请求/api/admin/code获取验证码

3.若用户验证码填写正确。则需要跳转到下一步。

1.用户输入密码后,判断用户输入的密码是否符合要求。

2.若用户输入的密码SEO靠我符合要求则向服务端发送 /api/admin/updataUser,修改用户数据。

3.若修改用户数据成功,则返回成功信息。并且跳转到登录页面。<template><view class="registSEO靠我ration"><view class="registration-content"><el-form :rules="rules" ref="form" label-width="40px" claSEO靠我ss="demo-ruleForm"><el-form-item prop="phone"><el-input v-model="phone" placeholder="手机号"></el-inputSEO靠我></el-form-item><el-form-item prop="code" class="pwd"><el-input v-model="userCode" placeholder="验证码"SEO靠我 type="password"></el-input><el-button type="warning" :disabled="disabled" @click="sendCode">{{ codeSEO靠我Msg }}</el-button></el-form-item></el-form></view><view class="login-button"><el-button type="info" SEO靠我round @click="login">下一步</el-button></view></view> </template><script> export defaulSEO靠我t {data() {return {phone: ,userCode: ,disabled: false,codeNum: 10,codeMsg: 获取验证码,code: ,rules: {phonSEO靠我e: {rule: /^1[23456789]\d{9}$/,meg: 手机的格式不对}}};},methods: {sendCode() {if (this.phone == ) {uni.showSEO靠我Toast({title: 手机号不能为空,icon: none});} else if (this.phone != ) {var reg = /^1[3456789]\d{9}$/;if (!reSEO靠我g.test(this.phone)) {uni.showToast({title: 输入有效的手机号,icon: none});}else{//禁用按钮this.disabled = true;//SEO靠我发送请求uni.request({url: /api/admin/code,method: POST,data: {phone: this.phone},success: res => {consolSEO靠我e.log(11, res.data.data);if (res.data.data.success) {this.code = res.data.data.data;}}});//倒计时let tiSEO靠我mer = setInterval(() => {--this.codeNum;this.codeMsg = `重新发送 ${this.codeNum}`;}, 1000);//判断定时器停止setTSEO靠我imeout(() => {clearInterval(timer);(this.disabled = false), (this.codeMsg = 获取验证码), (this.codeNum = SEO靠我10);}, 10000);}}},//登录login() {if(this.code==|| this.phone==){uni.showToast({title:手机号不能为空,icon:noneSEO靠我})}else if (this.userCode == this.code) {//验证码正确,查询数据库中是否有这个永辉uni.request({url: /api/admin/searchUseSEO靠我r,method: POST,data: {phone: this.phone},success: res => {//code 200 用户存在if(res.data.code==200){thisSEO靠我.$router.push(/pages/login/nextPassword?phone=+this.phone)}else{uni.showToast({title:res.data.da.msgSEO靠我,icon:none})return;}}});} else if (this.code != this.userCode) {uni.showToast({title: 验证码不正确,icon: nSEO靠我one});}},//密码登录goBack() {this.$router.push(/pages/login/login);}} }; </script><styleSEO靠我 lang="less"> .demo-ruleForm {width: 90%;height: 50rpx;padding-top: 100rpx; } SEO靠我 /deep/.el-input__inner {height: 100rpx;border-radius: 5rpx;padding-left: 40rpx; } SEO靠我/deep/.el-form-item__content {display: flex; } /deep/.el-button--info {width: 80%;maSEO靠我rgin-left: 12%;margin-top: 260rpx;height: 80rpx; } </style>

服务端代码 /api/admin/updataUsSEO靠我er

//修改用户的密码 router.post(/updataUser,function(req,res,next){let params={userPwd:req.body.passSEO靠我word,phone:req.body.phone}//查询手机号对应的idconnection.query(user.queryUserTel(params),function(error,resuSEO靠我lts){let id=results[0].idlet pwd=results[0].passwordvar sql=update users set password= +params.userPSEO靠我wd+ where id=+idconsole.log(sql)connection.query(sql,function(error,results){res.send({code:200,dataSEO靠我:{success:true,msg:修改成功}})})})}) 4.token

token使用方法

token的使用流程如下:

(1)用户发起请求,提交用户名和密码;

(2)服务器验证用户SEO靠我名和密码;

(3)服务器生成token,返回给客户端;

(4)客户端拿着token,将token作为参数,发起请求;

(5)服务器验证token,通过验证后返回请求数据,并且更新token;

(6)客户端拿到SEO靠我更新的token,未来的请求都携带最新的token,从而实现无状态的身份验证

1.1 node环境配置token

npm install jsonwebtoken

2.2 生成token

//引入token包SEO靠我let pwd=require(jsonwebtoken)//用户信息let payload={phone:req.body.phone}//口令let secret=xiaoming//生成tokeSEO靠我nlet token =pwd.sign(payload,secret)
“SEO靠我”的新闻页面文章、图片、音频、视频等稿件均为自媒体人、第三方机构发布或转载。如稿件涉及版权等问题,请与 我们联系删除或处理,客服邮箱:html5sh@163.com,稿件内容仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同 其观点或证实其内容的真实性。

网站备案号:浙ICP备17034767号-2