MVC/三层架构
概述:
MVC是一种模型,分别为model数据,view视图,controller控制。三层架构是指后端的包(文件夹)
分的层级最少分三层,这个三层分别是web层(处理请求及对应的接口书写),service(业务层 处理
对应的业务),dao(数据库相关操作)。mvc是三层架构中web层的体现。
三层架构划分
主文件 app.js
controller层
usercontroller
service层
userService
const express = require('express')
const {userRouter} = require('./controller/userController')
//新建一个应用对象
const app = express()
//中间件使用
app.use(express.urlencoded())
app.use(express.static('./public'))
//路由引入
app.use('/user',userRouter)
//监听
app.listen(8080,()=>{
console.log('当前服务已经启动');
})
//分离controller 主要使用的路由分离
const express = require('express')
const {getUserById} = require('../service/userService')
//新建一个路由对象
const userRouter = express.Router()
//书写对应的接口
userRouter.get('/:id',getUserById)
module.exports = {
userRouter
}
//导入对应的dao
const {findUserByID} = require('../dao/userDao')
//返回的构造
function Response(data={},message='OK', code='0000'){
this.data = data,
this.message = message,
this.code = code
}
const getUserById = (req,res,next)=>{
//得到对应的id
let id = req.params.id
//查询对应的用户数据返回
findUserByID(id).then(([user])=>{
res.send(new Response(user))
})
}
module.exports = {
getUserById
}
dao层
userDao
注册实现
dao层
service层
导入加密模块
代码实现
密钥生成(openssl)
私钥(加密)(rsa 非对称)
//导入对应的工具类 进行相关sql语句执行
const {execu} = require('../utils/mysqlUtil')
//根据id进行查找
const findUserByID = (id) =>execu('select * from t_user where id = ?',id)
module.exports = {
findUserByID
}
//添加用户
const saveUser = (user) => execu('insert into
t
_
user(username,password,age,address)
values(?,?,?,?)',user.username,user.password,user.age,user.address)
//检索用户名是否存在
const checkUserName = (username) => execu('select count(*) as count from t_user
where username=?',username)
var crypto = require('crypto'); //引入crypto模块
const register = async (req,res,next)=>{
//得到对应的id
let user = req.body
//检索当前用户是否已经注册
let [{count}] = await checkUserName(user.username)
if(count){
//当前用户已经注册
res.send(new Response({},'当前用户已经注册'))
}else{
let md5 = crypto.createHmac('md5','1234');
user.password = md5.update(user.password, 'utf8').digest('hex'); //hex转
化为十六进制
//当前用户未注册
await saveUser(user)
res.send(new Response(user,'注册成功'))
}
}
通过私钥来生成公钥 (解密)
全局错误处理
app.js
登录实现
jwt导入
读取对应的密钥的工具类封装
keyUtil.js
dao层
service层
openssl genrsa -out rsa_private.key 1024
openssl rsa -in rsa_private.key -pubout -out rsa_public.key
//全局错误处理
app.use((err,req,res,next)=>{
//500错误处理
if(err){
//利用服务器渲染给一个错误页面
res.send('当前服务器正在维护')
}else{
next()
}
})
const jwt = require('jsonwebtoken'); //引入jwt模块
//读取对应的公钥和私钥
const fs = require('fs')
const path = require('path')
let privateKey =
fs.readFileSync(path.join(__dirname,'../keys/rsa_private.key')).toString()
let publicKey =
fs.readFileSync(path.join(__dirname,'../keys/rsa_public.key')).toString()
module.exports = {
publicKey,
privateKey,
}
//检索用户密码
const queryUserByUsernameAndPassword = (username,password) => execu('select *
from t
_
user where username=? and password=?',username,password)
const login = async (req, res, next) => {
//获取对应的数据
let {
username,
password
} = req.body
//调用对应的方法进行查询
let [user] = await queryUserByUsernameAndPassword(username, password)
//判断用户是否存在
if (user) {
//登录成功
//登录成功返回对应的token
//token需要加密 非对称 公钥(通过私钥生成的) 私钥(自己的)
//sign方法 数据 加密的密钥 对应的配置
const token = jwt.sign({user}, privateKey, {
algorithm: 'RS256',
expiresIn: 3000
});
res.send(new Response({token}, '登录成功'))
} else {
res.send(new Response({}, '用户名或者密码错误'))
}
}