持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第26天,点击查看活动详情
前置知识:
Egg
Egg 奉行『约定优于配置』,按照一套统一的约定进行应用开发,团队内部采用这种方式可以减少开发人员的学习成本,开发人员不再是『钉子』,可以流动起来。没有约定的团队,沟通成本是非常高的,比如有人会按目录分栈而其他人按目录分功能,开发者认知不一致很容易犯错。但约定不等于扩展性差,相反 Egg 有很高的扩展性,可以按照团队的约定定制框架。使用 Loader 可以让框架根据不同环境定义默认配置,还可以覆盖 Egg 的默认约定。
Mysql
MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。
Redis
Redis 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。
项目中安装:
"dependencies": {
"egg-jwt": "^3.1.7",
"egg-mysql": "^3.0.0",
"egg-redis": "^2.4.0",
"egg-sequelize": "^5.2.2",
"md5": "^2.3.0",
},
主要是依赖这几项。
在 config / config.default.js 中进行配置。
config.mysql = {
app: true,
agent: false,
client: {
host: '127.0.0.1',
port: '3306',
user: 'root',
password: '12345678',
database: 'campus_song'
}
};
config.sequelize = {
dialect: 'mysql',
host: '127.0.0.1',
port: '3306',
user: 'root',
password: '12345678',
database: 'campus_song',
define: {
timestamps: false,
freezeTableName: true
}
};
config.jwt = {
secret: 'egg'
}
config.redis = {
client: {
port: 6379,
host: '127.0.0.1',
password: '',
db: 0
}
}
这里面只需要大家按照自己的项目真实信息进行填写,更换其中的密码和数据库名称即可。
同时,需要在 config / plugin.js
exports.mysql = {
enable: true,
package: 'egg-mysql'
};
exports.sequelize = {
enable: true,
package: 'egg-sequelize'
};
exports.jwt = {
enable: true,
package: 'egg-jwt'
};
exports.redis = {
enable: true,
package: 'egg-redis'
};
app 文件夹目录下,是我们主要编写逻辑的地方。
大致可以按照这么来进行划分。
示例:
router.js
'use strict';
module.exports = app => {
const { router, controller } = app;
const userExist = app.middleware.userExist();
// 登录接口
router.post('/api/user/register', controller.user.register);
};
controller 文件夹下新建 user.js
'use strict';
const md5 = require('md5');
const BaseController = require('./base');
class UserController extends BaseController {
async register() {
const { ctx, app } = this;
const parmas = ctx.params();
const user = await ctx.service.user.getUser(parmas.username);
if (user) {
this.error('用户已经存在');
return;
}
const result = await ctx.service.user.add({
...parmas,
password: md5(parmas.password + app.config.salt),
createTime: ctx.helper.time()
});
if (result) {
const token = await this.jwtSign({
id: result.id,
username: result.username
});
this.success({
...this.parseResult(ctx, result),
token
});
} else {
this.error('注册使用失败');
}
}
}
module.exports = UserController;
service 文件夹下新建 user.js
'use strict';
const md5 = require('md5');
const BaseService = require('./base');
class UserService extends BaseService {
async getUser(username, password) {
return this.run(async () => {
const { ctx, app } = this;
const _where = password ? { username, password: md5(password + app.config.salt) } : { username };
const result = await ctx.model.User.findOne({
where: _where
});
return result;
});
}
async add(params) {
return this.run(async () => {
const { ctx } = this;
const result = await ctx.model.User.create(params);
return result;
});
}
}
module.exports = UserService;
modal 文件夹下新建 user.js
module.exports = app => {
const { STRING, INTEGER, TEXT, DATE } = app.Sequelize;
const User = app.model.define('user', {
id: { type: INTEGER, primaryKey: true, autoIncrement: true },
username: STRING(20),
password: STRING(64),
rea_name: STRING(20),
avatar: TEXT('long'),
phone: STRING(20),
email: STRING(20),
gender: STRING(20),
school: STRING(20),
academy: STRING(20),
class: STRING(20),
sign: STRING(300),
createTime: DATE,
updateTime: DATE
});
return User;
}
这样,基本的注册功能,已经可以使用了。使用 postman 可以进行一下测试。
这边有一个已经封装好的项目,大家可以下载下来运行一下。在运行之前,请打开本地的 mysql 和 redis。