egg初始化项目
- 创建文件,初始化egg框架 ```javascript mkdir egg-example && cd egg-example
npm init egg —type=simple
npm i
- 启动项目
```javascript
npm run dev
// npm run cov:代码测试率 npm run lint — —fix :— —fix 是自动修复eslint中不符合规范的语句
husky插件(做git hooks)
参考文档:husky、husky官网
是做git hooks的(在git操作的时候的钩子。即在git操作的时候进行响应的操作)
- 安装husky ```javascript // Edit package.json > prepare script and run it once: npm set-script prepare “husky install” && npm run prepare
// Add a hook: npx husky add .husky/pre-commit “npm test”
> 钩子没有触发的情况:
> 当第一次安装`husky`的时候,可能会出现`.git/hooks`里面的文件没有被覆盖的情况;此时,`git hooks`仍然是之前的状态(默认是没有效果的);如果是`husky`安装正常,使用命令`ls .git/hoooks`查看文件则是下面这样:
> 随便打开任意脚本文件
>
```javascript
#!/bin/sh
# husky
# Created by Husky v4.2.5 (https://github.com/typicode/husky#readme)
# At: 2020-6-16 17:14:54
# From: /Users/snowdream/Desktop/bhb/dp-admin/node_modules/husky (https://github.com/typicode/husky#readme)
. "$(dirname "$0")/husky.sh"
如果不是上述形式,那么就是
husky
注入失败;可以通过重新安装(先uninstall
再install
)进行重新注入,因为每次安装husky
时会重新覆盖一次.git/hooks
脚本文件。
配置eslint规范
在.eslintrc中配置
{
"extends": "eslint-config-egg",
"rules": {
"semi": ["error", "never"] // 在语句末尾从来不加分号,并且如果有分号则报错
}
}
提交日志规范
参考文档和方案:Commit message、commitizen、validate-commit-msg(还有其他很多插件)
主要是为了让规范代码提交的语句
commitizen
安装
npm install -g commitizen
初始化项目,符合commitizen的环境
commitizen init cz-conventional-changelog --save-dev --save-exact
提交代码 ```javascript git add .
// 根据提示选择 git cz
> [validate-commit-msg](https://www.npmjs.com/package/validate-commit-msg)比较严格
<a name="fsQik"></a>
## 使用JWT的方式来进行存储登录信息
<a name="HMXuy"></a>
## 后端使用验证码的插件-- svg-captcha
> 前端主要展示图片,具体的图片生成是后端生成的
参考:[官网](https://www.npmjs.com/package/svg-captcha)
- 安装
```javascript
npm install --save svg-captcha
- 后端服务中使用
- 添加路由
app\router.js
// 验证码
router.get('/captcha', controller.util.captcha)
- 添加路由的代码
app\controller\util.js
'use strict'
// 引入插件
const svgCaptcha = require('svg-captcha')
const Controller = require('egg').Controller
class UtilController extends Controller {
async captcha() {
const captcha = svgCaptcha.create({
size: 4,
fontSize: 50,
width: 100,
height: 40,
noise: 10,
})
// 检验文本放入session:captcha.text
this.ctx.session.captcha = captcha.text
this.ctx.response.type = 'image/svg+xml'
this.ctx.body = captcha.data
console.log('captcha:' + captcha.text)
}
}
module.exports = UtilController
对后端的路由进行分组的插件 —- egg-router-group
npm i egg-router-group --save
连接mongodb的插件 —- egg-mongoose
npm i egg-mongoose --save
校验接口传输的数据的插件 —- egg-validate
npm i egg-validate --save
使用md5插件加解密 —- md5
npm i md5 --save
JWT的认证需要的插件 —- jsonwebtoken
npm i jsonwebtoken --save
字符的加密、校验、解密的过程
设置基本的接口规范
## 接口返回规范
{
code: 0,
data: {},
message: '',
<!-- errors: 具体的报错信息 (可以根据是否是线上环境来判断是否要展示errors) -->
}
code 0 是成功 其他都是失败
-1 错误
-666 登录状态过期
<!-- 权限 -->
app\controller\base.js 基本的规范结构
'use strict'
// 定制规范
const { Controller } = require('egg')
// 在egg的Controller和业务Controller之间加了一层,这一层是规范层
class BaseController extends Controller {
success(data) {
this.ctx.body = {
code: 0,
data,
}
}
message(message) {
this.ctx.body = {
code: 0,
message,
}
}
error(message, code = -1, errors = {}) {
this.ctx.body = {
code,
message,
errors,
}
}
}
module.exports = BaseController
使用接口规范返回数据,并且设置非Resful的接口
app\controller\user.js
'use strict'
const BaseController = require('./base')
const createRule = {
email: { type: 'email' },
nickname: { type: 'string' },
passwd: { type: 'string' },
captcha: { type: 'string' },
}
class UserController extends BaseController {
async login() {
console.log('login')
}
async register() {
const { ctx } = this
try {
// 校验传递的参数
ctx.validate(createRule)
} catch (e) {
console.log(e)
// 因为从baseController继承了,所以可以有基类可以使用
return this.error('参数校验失败', -1, e.errors)
}
const { email, nickname, passwd, captcha } = ctx.request.body
console.log({ email, nickname, passwd, captcha })
this.success({ name: 'kkb' })
}
async verify() {
// 校验用户名是否存在
}
async info() {
console.log('info')
}
}
module.exports = UserController
app\router.js
'use strict'
/**
* @param {Egg.Application} app - egg application
*/
module.exports = app => {
const { router, controller } = app
router.group({
name: 'user',
prefix: '/user', // 路由前缀
}, router => {
const {info, register, login, verify} = controller.user
router.get('/info', info)
router.post('/register', register)
router.post('/login', login)
router.get('/verify', verify)
})
}
对安装的插件进行配置
config\config.default.js是默认配置
config\plugin.js是对安装的插件进行配置
'use strict'
// /** @type Egg.EggPlugin */
// module.exports = {
// // had enabled by egg
// // static: {
// // enable: true,
// // }
// }
// 分开配置
exports.mongoose = {
enable: true,
package: 'egg-mongoose'
}
exports.routerGroup = {
enable: true,
package: 'egg-router-group'
}
exports.validate = {
enable: true,
package: 'egg-validate'
}
配置数据库和其他
config\config.default.js
/* eslint valid-jsdoc: "off" */
'use strict'
/**
* @param {Egg.EggAppInfo} appInfo app info
*/
module.exports = appInfo => {
/**
* built-in config
* @type {Egg.EggAppConfig}
**/
const config = exports = {}
// use for cookie sign key, should change to your own and keep security
config.keys = appInfo.name + '_1617240484420_9074'
// add your middleware config here
config.middleware = []
// add your user config here
const userConfig = {
// myAppName: 'egg',
}
return {
...config,
...userConfig,
// 配置egg,js
security: {
csrf: { // csrf是egg对post请求自带的,先临时关闭
enable: false,
},
},
// 配置数据库
mongoose: {
client: {
url: 'mongodb://127.0.0.1:27017/kkbhub',
options: {
},
},
},
}
}
发邮件的库——nodemailer
参考文档:官网文档
安装
npm install nodemailer --save
使用
app\service\tools.js
'use strict'
const { Service } = require('egg')
const nodemailer = require('nodemailer')
// 新建一个发送者,service是配置一个什么服务
const userEmail = '223859391@qq.com'
const transporter = nodemailer.createTransport({
service: 'QQ',
secureConnection: true,
auth: {
user: userEmail,
pass: 'jrmpukkyreynbhib', // jrmpukkyreynbhib
},
})
class ToolService extends Service {
async sendMail(email, subject, text, html) {
const mailOptions = {
from: userEmail,
cc: userEmail, // 抄送,可以避免有的邮箱认为这个是垃圾邮件(这个是一个小tip)
to: email,
subject,
text,
html,
}
try {
await transporter.sendMail(mailOptions)
return true
} catch (err) {
console.log('email error', err)
return false
}
}
}
module.exports = ToolService
如果是qq邮箱的话,则需要到下面的这个网址开启相关的服务:qq开启服务指导手册