功能梳理完了以后,咱们就可以开始数据库表设计了:
数据库表图:
首先打开 Navicat Premium 创建数据库 blog
配置如下:
在 blogNodejs/models 下
首先新建 mysql.js 进行 mysql 连接配置(基于 Sequelize)
var config = require('config-lite');// 引入灵活配置文件
var Sequelize = require('sequelize');.// 引入 Sequelize
var Mysql = new Sequelize(config.mysql.database, config.mysql.user, config.mysql.password, {
host: config.mysql.host, // 数据库服务器 ip
dialect: 'mysql', // 数据库使用 mysql
port: 3306, // 数据库服务器端口
pool: {
max: 5,
min: 0,
idle: 10000
},
});
module.exports = Mysql;
然后根据数据库图,依次创建对应的 Model
这里以 user.js 为示例 单独说下:
/**
* User 用户表
*/
var Sequelize = require('sequelize');// 引入 sequelize
var Mysql = require('./mysql');// 引入 mysql 实例化
// 定义 User 用户表
var User = Mysql.define('user', {
uuid: {// 使用 uuid 而不使用
type: Sequelize.UUID,// 设置类型
allowNull: false,// 是否允许为空
primaryKey: true,// 主键
defaultValue: Sequelize.UUIDV1,// 默认值
}, //uuid
email: { // 邮箱
type: Sequelize.STRING,
allowNull: false,
unique: true, // 唯一
validate: {// 设置验证条件
isEmail: true,// 检测邮箱格式 (foo@bar.com)
},
},
password: { // 密码
type: Sequelize.STRING,
allowNull: false,
},
state: { // 状态 0 未激活邮箱、1 已激活邮箱
type: Sequelize.STRING(2),// 限制字符个数
defaultValue: "0", // 默认值
},
}, {
freezeTableName: true, // 开启自定义表名
tableName: 'User',// 表名字
timestamps: true, // 添加时间戳属性 (updatedAt, createdAt)
createdAt: 'createDate',// 将 createdAt 字段改个名
updatedAt: 'updateDate',// 将 updatedAt 字段改个名
indexes: [{ // 索引
type: 'UNIQUE', //UNIQUE、FULLTEXT 或 SPATIAL 之一
method: 'BTREE', //BTREE 或 HASH
unique: true, // 唯一 // 设置索引是否唯一,设置后会自动触发 UNIQUE 设置 //true: 索引列的所有值都只能出现一次,即必须唯一
fields: ['uuid'], // 建立索引的字段数组。每个字段可以是一个字段名,sequelize 对象 (如 sequelize.fn),或一个包含:attribute (字段名)、length (创建前缀字符数)、order (列排序方向)、collate (较验的字段集合 ( 排序))
}],
comment:"User Table",// 数据库表描述
});
module.exports = User;// 导出
表都写完后,新建 index.js
**
* 数据库表关系建立
*/
var Mysql = require('./mysql');
// 表
var AdminUser = require('./adminUser');// 管理员表
var User = require('./user');// 用户表
var UserInfo = require('./userInfo');// 用户信息表
var Article = require('./article');// 文章表
var Category = require('./category');// 文章类别表
var Attachment = require('./attachment');// 文章附件表
/**
* 关系建立
*/
// 用户 - 用户资料
User.hasOne(UserInfo); //1:1
// 用户 - 文章
User.hasMany(Article); //1:N
Article.belongsTo(User); //1:1
// 文章 - 分类(定义中间表 ArticleCategory 实现多对多)Article.belongsToMany(Category,{through: 'ArticleCategory'}); //N:N
Category.belongsToMany(Article,{through: 'ArticleCategory'}); //N:N
// 文章 - 附件
Article.hasMany(Attachment); //1:N
Attachment.belongsTo(Article); //1:1
// 基于 sequelize 自动创建表 //【!!注意 首次执行完请注释掉该段代码!!】Mysql.sync({force: true,// 是否清空数据库表}).then(function() {console.log('ok');
});
module.exports = {
AdminUser: AdminUser,
User: User,
UserInfo: UserInfo,
Article: Article,
Category: Category,
Attachment: Attachment,
};
好。到这里,咱们咱们打开
blogNodejs/app.js 写入以下代码
/**
* 主入口启动文件
* add by wwj
* 2017-08-24 15:01:48
*/
var express = require('express'); //web 框架
var logger = require('morgan'); // 开发模式下 log
var bodyParser = require('body-parser'); //json
var path = require('path'); // 路径
var config = require('config-lite'); // 读取配置文件
var winston = require('winston'); // 日志
var expressWinston = require('express-winston'); // 基于 winston 的用于 express 的日志中间件
var models = require('./models'); // 临时添加 为了生成数据库表,后面写到 Controllers 里面
// 实例化 express
var app = express();
// 设置模板目录
app.set('views', path.join(__dirname, 'views'));
// 设置模板引擎为 ejs
app.set('view engine', 'ejs');
// log
app.use(logger('dev'));
// 设置 json
// 格式化 JSON 的输出
app.set('json spaces', 2);
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({extended: false}));
// parse application/json
app.use(bodyParser.json());
// 设置静态文件目录
app.use(express.static(path.join(__dirname, 'public'))); // 注意:中间件的加载顺序很重要。如上面设置静态文件目录的中间件应该放到 routes(app) 之前加载,这样静态文件的请求就不会落到业务逻辑的路由里;// 错误请求的日志
app.use(expressWinston.errorLogger({
transports: [
new winston.transports.Console({
json: true,
colorize: true
}),
new winston.transports.File({filename: 'logs/error.log'})
]
}));
// error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
//app
module.exports = app;
执行一下
npm run dev
然后去 mysql 下看看是否创建成功了 (右击“表”- 刷新)
到这里,咱们的数据库已经 ok 啦,下面开始进行后端路由设计啦
参考阅读:
1、Sequelize 中文 API 文档 https://itbilu.com/nodejs/npm…
2、Sequelize 和 MySQL 对照 https://segmentfault.com/a/11…
3、使用 Sequelizehttp://www.liaoxuefeng.com/wi…
4、Sequelize API https://sequelize.readthedocs…