|
1 year ago | |
---|---|---|
src | 1 year ago | |
.env | 1 year ago | |
.gitignore | 1 year ago | |
README.md | 1 year ago | |
index.js | 1 year ago | |
package-lock.json | 1 year ago | |
package.json | 1 year ago |
base-express-api是基于express封装的基础api框架,其中包含了routes、controllers、models、services以及middlewares层封装,支持mongodb+redis数据库连接,是一个拿来即用的api开发框架。
根目录
├── logs # 日志目录
├── src # 程序主目录
│ ├── controllers # 控制器层 -- 注重业务逻辑、校验等操作
│ ├── database # 数据库配置连接
│ ├── middlewares # 中间件层
│ ├── models # 模型层 -- 注重数据库结构设计、字段管理等操作
│ ├── routes # 路由层
│ ├── services # 服务层 -- 注重公共的功能服务逻辑
│ ├── uploads # 文件上传目录
│ ├── utils # 工具层
│ └── validates # 参数校验层
├── public # 公共静态资源
├── .env # 配置文件
└── index.js # 项目入口
npm i
npm start
/**
* 控制器层注重业务逻辑、校验等操作
*/
const bcrypt = require('bcrypt');
const jwt = require('jsonwebtoken');
const UserService = require('../services/user');
const redisClient = require('../database/redis')
class LoginController {
/**
* 构造函数
* @param {*} saltRounds 设置盐的轮数
*/
constructor() {
this.saltRounds = 10
}
/**
* 注册
* @param {*} req
* @param {*} res
* @param {*} next
* @returns
*/
async registor(req, res, next) {
try {
const { username, email, password } = req.body;
// 验证邮箱
const exsit = await UserService.getUser({ email });
if(exsit) return res.sendApiResponse(201, null, '该邮箱已注册')
// 加密用户密码
const hash = await bcrypt.hash(password, this.saltRounds);
const user = await UserService.createUser({ username, email, password: hash });
// 过滤字段
const filteredUser = user.filterFields(['username', 'email']);
return res.sendApiResponse(200, filteredUser, 'success')
} catch (err) {
next(err)
}
}
/**
* 登陆
* @param {*} req
* @param {*} res
* @param {*} next
* @returns
*/
async login(req, res, next) {
try {
const { email, password } = req.body;
// 验证邮箱
const user = await UserService.getUser({ email })
if(!user) return res.sendApiResponse(201, null, '密码或邮箱错误')
// 验证用户密码
const pass = await bcrypt.compare(password, user.password)
if(!pass) return res.sendApiResponse(201, null, '密码或邮箱错误')
// 生成 JWT 令牌
const token = jwt.sign({ userId: user._id }, process.env.JWT_SECRET || 'your_secret_key')
// 设置登录token
const bool = await redisClient.setex(token, eval(process.env.TOKEN_EXPIRE || 3600), JSON.stringify(user))
if(bool !== 'OK') return res.sendApiResponse(500, null, '服务错误')
// 过滤字段
const filteredUser = user.filterFields(['username', 'email'])
return res.sendApiResponse(200, {...filteredUser, token}, 'success')
} catch (err) {
next(err)
}
}
/**
* 修改密码
* @param {*} req
* @param {*} res
* @param {*} next
* @returns
*/
async updatePassword(req, res, next) {
try {
const { password } = req.body;
const user = await UserService.getUser({ email: req.userInfo.email })
user.password = await bcrypt.hash(password, this.saltRounds);
user.save()
return res.sendApiResponse(200, null, 'success')
} catch (err) {
next(err)
}
}
/**
* 上传文件
* @param {*} req
* @param {*} res
* @param {*} next
* @returns
*/
async upload(req, res, next) {
try {
// 可以根据业务需要,生成文件链接或后续操作。
console.log(req.file)
return res.sendApiResponse(200, req.file.filename, 'success')
} catch (err) {
next(err)
}
}
}
module.exports = new LoginController();
推荐使用pm2
npm i pm2 -g
pm2 start index.js