使用到的技术有 JWTjs nodejs express mongoose mongod
目录
1、modles基础配置 配置数据库表字段 /models/UserModel.js
2、详细配置 middlewares/authMiddleware.js
五、配置路由 /routes/admin/UserRouter.js
1、拿到前端数据 处理加工 进行调用数据库层 services
多目录分模块的开发是能够更加高效整洁
一、创建DB服务
1、创建连接mongodb服务器 /db/DB.js
const mongoose = require('mongoose')
mongoose.connect('mongodb://127.0.0.1:27017/project-two')
2、将创建DB.js的导入根目录 /bin/www
require('../db/DB.js')
二、配置modles
1、modles基础配置 配置数据库表字段 /models/UserModel.js
const mongoose = require('mongoose')
const Schema = mongoose.Schema
const UserType = {
username: String,
password: String,
gender: Number,
role: Number,
avatar: String,
notes: String
}
const UserModel = mongoose.model('user',UserType)
module.export = UserModel
三、配置app.js token鉴权
1、/app.js 基础配置
app.use((req,res,next)=>{
if(req.url==='/adminapi/user/login'){
next()
return
}
const token = req.headers['authorization'].split(' ')
if(token){
let payload = JWT.verify(token)
if(payload){
const newtoken = JWT.generate({
_id:payload._id,
username:payload.uername
},'1d')
res.header('Authorizaation',newtoken)
next()
}else{
res.status(401).send({succes:'token过期'})
}
}
})
2、详细配置 middlewares/authMiddleware.js
const jwt = require('jsonwebtoken'); // 引入 JSON Web Token 库
const SECRET_KEY = 'your-secret-key'; // 替换为实际的密钥
// 验证 Token 的中间件
const verifyToken = (req, res, next) => {
// 检查请求路径是否为登录路径,如果是,直接放行
if (req.path === '/login') {
return next();
}
// 获取请求头中的 Authorization
const authHeader = req.headers.authorization;
if (!authHeader) {
return res.status(401).json({ message: 'No token provided' }); // 如果没有 Token,返回 401
}
// 从 Authorization 头中提取 Token
const token = authHeader.split(' ')[1];
// 验证 Token
jwt.verify(token, SECRET_KEY, (err, user) => {
if (err) {
return res.status(403).json({ message: 'Invalid token' }); // Token 无效,返回 403
}
// 如果 Token 有效,创建新 Token 并重置时间
const newToken = jwt.sign({ id: user.id }, SECRET_KEY, { expiresIn: '1h' }); // 新 Token 有效期为 1 小时
// 将新 Token 返回给客户端
res.setHeader('Authorization', `Bearer ${newToken}`);
req.user = user; // 将用户信息添加到请求对象
next(); // 继续处理请求
});
};
module.exports = verifyToken;
四、封装token /util/JWT.js
// npm i jsonwebtoken
const jsonwebtoken = require("jsonwebtoken");
const secret = "happy";
const JWT = {
generate(value, exprires) {
return jsonwebtoken.sign(value, secret, { expiresIn: exprires });
},
verify(token) {
try {
return jsonwebtoken.verify(token, secret);
} catch (error) {
return false;
}
},
};
// JWT.generate();
module.exports = JWT;
五、配置路由 /routes/admin/UserRouter.js
var express = require('express');
var router = express.Router();
// npm i multer --save 专门处理multipart/form-data 表单数据
const multer = require('multer')
const upload = multer({dest:'public/avataruploads/'})
// 导入路由
const UserController = require("../../controllers/admin/UserController")
// 传过来的文件名 前端传过来的params 图片的写的是 file:file 对应的中间件写的是file
// 登录接口
router.post("/adminapi/user/login",UserController.login)
// 更新用户接口
router.post("/adminapi/user/upload",upload.single('file'),UserController.upload)
// 添加用户接口
router.post("/adminapi/user/add",upload.single('file'),UserController.add)
// 查所有用户
router.get("/adminapi/user/list",UserController.list)
// 查找一个用户
router.get("/adminapi/user/list/:id",UserController.list)
// 删除一个用户
router.delete("/adminapi/user/list/:id",UserController.delist)
// 修改一个用户
router.put("/adminapi/user/list/:id",UserController.putlist)
module.exports = router;
在app.js 导入
const UserRouter = require('./router/admin/UserRouter')
app.use(UserRouter)
六、配置controllers
1、拿到前端数据 处理加工 进行调用数据库层 services
const UserService = require("../../services/admin/UserService");
const JWT = require("../../util/JWT");
const UserController = {
login: async (req, res) => {
const result = await UserService.login(req.body);
if (result.length === 0) {
res.send({
code: "-1",
error: "用户名或者密码错误",
});
} else {
const token = JWT.generate(
{
_id: result[0]._id,
username: result[0].username,
},
"1d"
);
res.header("Authorization", token);
res.send({
ActionType: "OK",
data: {
username: result[0].username,
gende: result[0].gende ? result[0].gende : 0,
introduction: result[0].introduction,
avatar: result[0].avatar,
role: result[0].role,
},
});
}
},
upload: async (req, res) => {
// req.body传过来的form表单数据 req.file传过来的文件头像
const { username, introduction, gende } = req.body;
const token = req.headers["authorization"].split(" ")[1];
const avatar = req.file ? `/avataruploads/${req.file.filename}` : "";
const payload = JWT.verify(token);
const { _id } = payload;
await UserService.upload({
_id,
username,
introduction,
gende: Number(gende),
avatar,
});
if (avatar) {
res.send({
ActionType: "OK",
data: {
username,
introduction,
gende: Number(gende),
avatar,
},
});
} else {
res.send({
ActionType: "OK",
data: {
username,
introduction,
gende: Number(gende),
},
});
}
},
add: async (req, res) => {
// req.body传过来的form表单数据 req.file传过来的文件头像
const { username, introduction, gende, password, role } = req.body;
const token = req.headers["authorization"].split(" ")[1];
const avatar = req.file ? `/avataruploads/${req.file.filename}` : "";
// const payload = JWT.verify(token)
// const { _id } = payload
// 调用server模块更新数据
await UserService.add({
username,
introduction,
gende: Number(gende),
avatar,
password,
role,
});
// if(avatar){
// res.send({
// ActionType:"OK",
// data:{
// username,introduction,gende:Number(gende),avatar,password,role,
// gende: Number(gende)
// }
// })
// }else{
// res.send({
// ActionType:"OK",
// data:{
// username,introduction,gende:Number(gende),password,role,
// gende: Number(gende)
// }
// })
// }
res.send({
ActionType: "OK",
});
},
// 查找用户
list: async (req, res) => {
const result = await UserService.list(req.params);
res.send({
ActionType: "OK",
data: result,
});
},
delist: async (req, res) => {
const { id } = req.params;
const result = await UserService.delist({ _id: id });
res.send({
ActionType: "OK",
data: result,
});
},
// 修改一个用户
putlist: async (req, res) => {
const result = await UserService.putlist(req.body);
res.send({
ActionType: "OK",
data: result,
});
},
};
module.exports = UserController;
七、配置services
1、引用创建数据库模型 进行数据的增删改查操作
const UserModel = require("../../models/UserModel");
const UserService = {
login: async (params) => {
return UserModel.find({
username: params.username,
password: params.password,
});
},
upload: async ({ _id, username, introduction, gende, password, avatar }) => {
if (avatar) {
return UserModel.updateOne(
{ _id },
{ username, introduction, gende, password, avatar }
);
}
return UserModel.updateOne(
{ _id },
{ username, introduction, gende, password }
);
},
add: async ({ username, introduction, gende, password, avatar, role }) => {
return UserModel.create({
username,
introduction,
gende,
password,
avatar,
role,
});
},
// 查找用户
list: async({id})=>{
return id?UserModel.find({_id:id},["username","role","introduction","gende","avatar","password"]):UserModel.find({},["username","role","introduction","gende","avatar"])
},
// 删除一个用户
delist: async({_id})=>{
return UserModel.deleteOne({_id})
},
// 更新一个用户
putlist: async(body)=>{
return UserModel.updateOne({_id:body._id},body)
}
};
module.exports = UserService;
2910

被折叠的 条评论
为什么被折叠?



