本项目包含 MVC 功能示例
项目目录结构约定规范
egg-project
├── package.json
├── app.js (可选)
├── agent.js (可选)
├── app
| ├── router.js
│ ├── controller
│ | └── home.js
│ ├── service (可选)
│ | └── user.js
│ ├── model (可选)
│ | └── UserModel.js
│ ├── middleware (可选)
│ | └── response_time.js
│ ├── schedule (可选)
│ | └── my_task.js
│ ├── public (可选)
│ | └── reset.css
│ ├── view (可选)
│ | └── home.tpl
│ └── extend (可选)
│ ├── helper.js (可选)
│ ├── request.js (可选)
│ ├── response.js (可选)
│ ├── context.js (可选)
│ ├── application.js (可选)
│ └── agent.js (可选)
├── config
| ├── plugin.js
| ├── config.default.js
│ ├── config.prod.js
| ├── config.test.js (可选)
| ├── config.local.js (可选)
| └── config.unittest.js (可选)
└── test
├── middleware
| └── response_time.test.js
└── controller
└── home.test.js
文件命名规则
1、控制器名称:PsUserController.js(等效于ps_user_controller.js),调用方式:this.ctx.controller.psUserController.index,即文件名首字母改小写就可以。与导出的类名无关。
controller file | class name |
---|---|
user.js | app.controller.user |
person.js | app.controller.person |
user_group.js | app.controller.userGroup |
user/profile.js | app.controller.user.profile |
UserController.js | app.controller.userController |
2、模型名称:PsUserModel.js,调用方式:this.ctx.model.PsUserModel.findAll(),首字母一定是大写,与导出的类名无关。
model file | class name |
---|---|
user.js | app.model.User |
person.js | app.model.Person |
user_group.js | app.model.UserGroup |
user/profile.js | app.model.User.Profile |
UserModel.js | app.model.UserModel |
数据表包含时间戳字段: created_at datetime, updated_at datetime。
字段名使用小写下划线的蛇形命名法,例如:user_id, comments_count。
安装
# 初始化 Eggjs 骨架
npm init egg --type=simple
# 安装基础包
npm install
# 启动(生产环境,日志较少) / 调试(推荐,调试环境,日志丰富,自动重启) / 测试
# npm start / npm run dev / npm test
npm run dev
在浏览器打开:http://127.0.0.1:7001/
安装依赖包
npm install --save egg-sequelize mysql2 sequelize-auto egg-view-nunjucks
配置模板引擎视图层
配置插件文件(/config/plugin.js)
'use strict';
/** @type Egg.EggPlugin */
module.exports = {
// had enabled by egg
// 静态资源目录
static: {
enable: true,
},
// 配置模板引擎插件
nunjucks: {
enable: true,
package: 'egg-view-nunjucks',
}
};
配置默认配置文件(/config/config.default.js)
/* eslint valid-jsdoc: "off" */
'use strict';
const NmPath=require('path')
/**
* @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 + '_1611978775015_4782';
// add your middleware config here
config.middleware = [];
// 视图层模板引擎配置内容
config.view={
root:NmPath.join(appInfo.baseDir,'app/view'),
defaultViewEngine: 'nunjucks',
defaultExtension: '.html',
}
// add your user config here
const userConfig = {
// myAppName: 'egg',
};
return {
...config,
...userConfig,
};
};
修改控制器文件(/app/controller/home.js)
'use strict';
const Controller = require('egg').Controller;
class HomeController extends Controller {
async index() {
const { ctx } = this;
// ctx.body = 'hi, egg';
await ctx.render('index',{name:'view page...'})
}
}
module.exports = HomeController;
新建视图文件(/app/view/index.html)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Home</title>
</head>
<body>
hello {{name}}
</body>
</html>
运行调试:
npm run dev
至此,模板引擎配置完成。刷新浏览器,即可看到模板引擎的是否生效
配置数据库模型层
创建数据库和数据表
-- 创建数据库
CREATE DATABASE IF NOT EXISTS db_test DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci;
use db_test;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- 创建数据表: 用户表
-- DROP TABLE IF EXISTS `tbl_user`;
CREATE TABLE `tbl_user` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`user_name` VARCHAR(60) NOT NULL COMMENT '用户账号',
`password` VARCHAR(32) NOT NULL COMMENT '用户密码',
`created_at` INT UNSIGNED NOT NULL COMMENT '注册时间',
`status` TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '状态(1=正常,0=禁止)',
PRIMARY KEY (`id`),
KEY `idx_user_name`(`user_name`),
KEY `idx_status`(`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
从数据库自动生成对应的模型文件(ES6类的内容格式)
# npx sequelize-auto -h 数据库的IP地址 -d 数据库名 -u 用户名 -x 密码 -p 端口 -t 表名
npx sequelize-auto -h 127.0.0.1 -d db_test -u root -x 123456 -p 3306 -t tbl_user -l es6
可以在 package.json 增加一个快捷的脚本命令
"scripts": {
"db2model":"sequelize-auto -h 127.0.0.1 -d db_test -u root -x 123456 -p 3306 --dialect mysql",
"dev": "egg-bin dev"
},
运行从数据库生成模型类的命令
npm run db2model
配置插件文件(/config/plugin.js)
'use strict';
/** @type Egg.EggPlugin */
module.exports = {
// had enabled by egg
// 静态资源目录
static: {
enable: true,
},
// 配置模板引擎插件
nunjucks: {
enable: true,
package: 'egg-view-nunjucks',
},
// 配置数据库模型插件
sequelize: {
enable: true,
package: 'egg-sequelize',
},
};
配置默认配置文件(/config/config.default.js)
/* eslint valid-jsdoc: "off" */
'use strict';
const NmPath=require('path')
/**
* @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 + '_1611978775015_4782';
// add your middleware config here
config.middleware = [];
// 视图层模板引擎配置内容
config.view = {
root:NmPath.join(appInfo.baseDir,'app/view'),
defaultViewEngine: 'nunjucks',
defaultExtension: '.html',
};
// 模型层数据库连接配置内容
config.sequelize = {
dialect: 'mysql',
host: '127.0.0.1',
password:'000000',
port: 3306,
database: 'db_test',
};
// add your user config here
const userConfig = {
// myAppName: 'egg',
};
return {
...config,
...userConfig,
};
};
创建新的模型文件(/app/model/TblUserModel.js)
'use strict';
module.exports = app => {
const { DataTypes } = app.Sequelize;
const UserModel = app.model.define('tbl_user', {
id: {
autoIncrement: true,
type: DataTypes.INTEGER.UNSIGNED,
allowNull: false,
primaryKey: true,
comment: "主键ID"
},
user_name: {
type: DataTypes.STRING(60),
allowNull: false,
comment: "用户账号"
},
password: {
type: DataTypes.STRING(32),
allowNull: false,
comment: "用户密码"
},
created_at: {
type: DataTypes.INTEGER.UNSIGNED,
allowNull: false,
defaultValue: Math.round(new Date().getTime() / 1000),
comment: "注册时间"
},
status: {
type: DataTypes.TINYINT.UNSIGNED,
allowNull: false,
defaultValue: 1,
comment: "状态(1=正常,0=禁止)"
}
}, { timestamps: true, createdAt: 'created_at', updatedAt: false, freezeTableName: true });
UserModel.findById = async function (id) {
return await this.findOne({ where: { id: id } })
}
return UserModel;
};
修改控制器文件
'use strict';
const Controller = require('egg').Controller;
class HomeController extends Controller {
async index() {
const { ctx } = this;
// ctx.body = 'hi, egg';
// 创建记录
await ctx.model.TblUserModel.create({ user_name: 'test-02', password: '123456' })
// 读取记录
const user = await ctx.model.TblUserModel.findByPk(1);
console.log('==user==', user);
// 渲染视图文件(admin/home/index)
await ctx.render('index', { name: user.user_name })
}
}
module.exports = HomeController;
运行调试:
npm run dev
至此,数据库模型配置完成。刷新浏览器,即可看到数据库模型的是否生效