# NEMT
**Repository Path**: akex9527/NEMT
## Basic Information
- **Project Name**: NEMT
- **Description**: express搭建web服务器模板
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: http://akexc.com
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2021-09-25
- **Last Updated**: 2022-04-06
## Categories & Tags
**Categories**: Uncategorized
**Tags**: Express, Nodejs, MongoDB, Mongoose, JWT
## README
#
NEMT是什么?
NEMT是基于 **NodeJS** 的后端架构模板, 是 Node,Express,Mongodb,Template的首字母缩写。NEMT的已经配置常用的功能, 允许你只需要关注于**Schema**, 当然你也可以追加新功能.
### 使用
1. git clone https://gitee.com/KYALEX/NEMT.git
2. cd NEMT && npm i
3. node app.js
### 目录设计
- app.js -------- 入口文件
- models -------- 数据库模型
- routes --------- 路由
- index.js -------- 主路由(自动生成 CURD)
* login.js -------- 登录
* upload.js -------- 文件上传
- utils --------- 工具函数
- db.js ------ 连接数据库
- autoCURD.JS ------- 根据模型自动生成 CURD 业务路由
- encrypt.js ------- 密码加密
- logger.js ------- 日志
- configs -------- 配置文件
- package.json --------- 项目所需依赖
- logs --------- 日志文件
- controllers ---------- 业务控制层 数据库 CURD 操作
## 通用模块
### 自动路由
> 反反复复的引入 **业务逻辑** 挂载到 **router** 是必须要避免的!!**autoCURD.js** 封装了通用数据模型的 **增删改查**操作
```js
const express = require(`express`)
const router = express.Router()
const user = require('../model/User')
const Advertisement = require('../model/Advertisement')
//封装
const ADDROUTER = require('../utils/autoCURD')
//三个参数 挂载路由 , 表名 , 表Model
ADDROUTER(router, 'user', user)
ADDROUTER(router, 'Advertisement', Advertisement)
module.exports = router
```
### 图片上传
> 使用 **multer** 实现基本的图片上传通用接口, 可拓展文件成上传,如 doc, excel等
```js
const router = require(`express`).Router()
const multer = require('multer')
const adveArtisement = require('../model/Advertisement')
const fs = require('fs')
const storage = multer.diskStorage({
destination: './public/advertisements',
filename: function (req, file, cb) {
console.log(file)
let extname = file.mimetype.split('/')[1]
let imgname =
Date.now() +
parseInt(Math.random() * 999) +
parseInt(Math.random() * 2222)
let keepname = imgname + '广告图片' + '.' + extname
cb(null, keepname)
},
})
const upload = multer({
storage,
})
router.post('/api/v1/uploadimg', upload.single('file'), async (req, res) => {
console.log(req.body.datas)
console.log('bodyssssss')
const datas = JSON.parse(req.body.datas)
datas.Adimg = req.file.filename
adveArtisement.create(datas, function (err, doc) {
console.log('doc', doc)
if (err) return next(err)
res.jsonp({
code: 200,
data: doc,
})
})
})
module.exports = router
```
### 注册
- [bcrypt](https://www.npmjs.com/package/bcrypt) 加密密码,使用 mongdo 提供的 set 模型方法操作
```js
const mongoose = require('mongoose')
const bcypt = require('../utils/encrypt')
const userSchema = new mongoose.Schema({
user: { type: String, required: true, unique: true },
pwd: { type: String, required: true, set: value => bcypt(value) }, // 密码加密
email: String,
phone: String,
isaAdmin: { type: Boolean, default: true },
createtime: { type: Date, default: new Date() }, //创建时间
})
```
### 登录
- [bcrypt](https://www.npmjs.com/package/bcrypt) 验证密码
```js
const re = await User.findOne({ user: user.user })
if (!re) return res.status(400).send({ code: 400, msg: '用户不存在' })
// 异步密码比较
bcrypt.compare(user.pwd, re.pwd).then(valid => {
if (!valid) return res.status(400).send({ code: 400, msg: '密码错误' })
```
- [jwt](https://www.npmjs.com/package/jwt) 生成 `token`响应请求
```js
const token = jwt.sign({ user }, secret, { expiresIn: '2h' })
res.json({
code: 200,
token,
msg: '登录成功',
})
})
```