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

}

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354

推荐阅读更多精彩内容