大家好,历时大概一个星期,终于把黑马程序员老师的大事件后端接口 和登录注册页面写好了👉 视频地址,视频很长,前端并没有做完,现只做了注册页和登录页面,希望多多支持!
- 前端:
- vue
- vuex
- vue-router
- vuex-persisedstate
- 后端
- node.js
- express
- express-jwt
- express-joi
- body-parser
- jsonwebtoken
- cors
- mysql
后端接口
具体后端接口详情请看我的gitee地址👉 https://gitee.com/chuang-bai/api-serve
代码思路
结构代码
把每一个部分分成一个模块,维护时不会很麻烦。
- 在
router/user.js 中定义登录和注册的路由
const express = require('express')
const router = express.Router()
const expressJoi = require('@escook/express-joi')
const {reg_login_schema} = require('../schema/user')
const routerHandler = require('../router_handler/user.js')
router.post('/reguser',expressJoi(reg_login_schema), routerHandler.regUser)
router.post('/login',expressJoi(reg_login_schema),routerHandler.login)
module.exports = router
在以上代码中expressJoi( )是一个用于验证前端传回来的信息 schema/user.js
const joi = require('joi')
const username = joi.string().alphanum().min(1).max(10).required()
const password = joi.string().pattern(/^[\S]{6,12}$/).required()
exports.reg_login_schema = {
body:{
username,
password
}
}
- 在
router_handler/user.js 写路由对应的方法
const db = require('../db/index.js')
const bcrypt = require('bcryptjs')
const jwt = require('jsonwebtoken')
const config = require('../config')
exports.regUser = (req,res)=>{
const userInfo = req.body
const sqlStr = 'select * from ev_users where username = ?'
db.query(sqlStr,[userInfo.username],(err,results)=>{
if(err) return res.cc(err)
if(results.length > 0){
return res.cc('用户名已存在')
}
userInfo.password = bcrypt.hashSync(userInfo.password,10)
const sql = 'insert into ev_users set ?'
db.query(sql,{username:userInfo.username,password:userInfo.password},(err,results)=>{
if(err) return res.cc(err)
if(results.affectedRows !== 1){
return res.cc('注册失败,请稍后再试')
}
res.cc('注册成功',0)
})
})
}
exports.login = (req,res)=>{
const userInfo = req.body
const sql = 'select * from ev_users where username = ?'
db.query(sql,[userInfo.username],(err,results)=>{
if(err) return res.cc(err)
if(results.length !== 1) return res.cc('登录失败!')
const compareResult = bcrypt.compareSync(userInfo.password,results[0].password)
if(!compareResult) return res.cc('密码错误')
const user = {...results[0],password:'',user_pic:''}
const tokenStr = jwt.sign(user,config.jwtSecretKey,{expiresIn:config.expiresIn})
res.send({
status:0,
message:'登录成功',
token:'Bearer ' + tokenStr
})
})
}
在处理函数中首先导入需要的包,然后需要先获取前端传过来的参数,经过expressJoi()校验以后,定义相应的sql 语句,利用db.query 去执行,获取响应结果res ,这时有几种情况
- 查询出错误
- 用户名已存在
- 成功👇
- 先对密码进行加密处理
- 利用
sql 语句插入数据库中 - 失败情况下返回错误信息
登录的情况和注册差不多,主要的是在登录成功以后,需要将重要信息置为 ’ ',例如密码 、头像 ,然后加密生成token ,在token 的基础上加上bearer 空格 并返回给客户端
前端页面
和b站老师写的有出处,主要是需要按自己的情况而定👦。
初始化vue 项目以后,将初始模板删除例如helloWorld.vue ,下面是结构
前端详情页面代码地址👉https://gitee.com/chuang-bai/hm-toutou
1. 封装axios
在util/request.js
import axios from 'axios'
const myAxios = axios.create({
baseURL:'http://127.0.0.1:3000'
})
export default myAxios
2. 编写api接口
api/index.js
import request from '@/utils/request'
export const registerAPI = ({username,password})=>{
return request({
url :'/api/reguser',
method:'POST',
data:{
username,
password
}
})
}
export const loginAPI = ({username,password})=>{
return request({
url:'/api/login',
method:'POST',
data:{
username,
password
}
})
}
3. 编写页面代码
view/login/index.vue
<template>
<div class="login-container">
<div class="login-box">
<div class="title-box"></div>
<!-- 登录的表单验证 -->
<el-form :model="loginForm" :rules="loginRules" status-icon ref="loginRef">
<!-- 用户名 -->
<el-form-item prop="username">
<el-input type="text" v-model="loginForm.username" placeholder="请输入用户名"></el-input>
</el-form-item>
<!-- 密码 -->
<el-form-item prop="password">
<el-input type="password" v-model="loginForm.password" placeholder="请输入密码" minlength="6"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" class="btn-login" @click="loginFn">登录</el-button>
<el-link type="info" @click="$router.push('/reg')">去注册</el-link>
</el-form-item>
</el-form>
</div>
</div>
</template>
<script>
import { loginAPI } from '@/api'
import {mapMutations} from 'vuex'
export default {
name:'my-login',
data(){
return {
loginForm:{
username:'',
password:''
},
loginRules:{
username:[{required:true,message:'请输入用户名',trigger:'blur'},{min:1,max:10,message:'用户名在1~10个字符串之间',trigger:'blur'}],
password:[{required:true,message:'请输入密码',trigger:'blur'},{min:6,max:15,message:'密码在6~15字符之间',trigger:'blur'}]
}
}
},
methods:{
...mapMutations(['updateToken']),
loginFn(){
this.$refs.loginRef.validate(async valid=>{
if(valid){
const {data:res} = await loginAPI(this.loginForm)
if(res.status !== 0) return this.$message.error(res.message)
this.$message.success(res.message)
this.updateToken(res.token)
}else{
return false
}
})
}
}
}
</script>
<style lang="less" scoped>
.login-container{
background: url('../../assets/images/login_bg.jpg') center;
background-size: cover;
height: 100%;
.login-box{
width: 400px;
height: 290px;
background-color: #fff;
box-sizing: border-box;
border-radius: 3px;
padding: 0 30px;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%,-50%);
}
.title-box{
background: url('../../assets/images/login_title.png') no-repeat center;
height: 60px;
}
.btn-login{
width: 100%;
}
}
</style>
*当写好登录页面以后,发送请求,后端会发送token,如果想要持久化保存,就需要vuex-perstsedstate* 插件。
4. 持久化token
store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
import createPersistedState from 'vuex-persistedstate'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
token:''
},
getters: {
},
mutations: {
updateToken(state,val){
state.token = val
}
},
actions: {
},
modules: {
},
plugins:[
createPersistedState()
]
})
由于学的太多,这几天,一篇写不完,内容有限,具体信息请看gitee 主页??🔥
|