MVC三层架构

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({}, '用户名或者密码错误'))

}

}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容