上文介绍了 MySQL
的连接,本文开始定义好所有的表结构。
定义模型
Sequelize
中使用模型来定义数据库表,模型都存放在 models
文件夹下,所以我们新建文件夹 /app/models
,然后定义四个表结构:
1、用户表,新建文件/app/models/user.js
const { sequelize } = require("../../core/db");
const { Sequelize, Model } = require("sequelize");
class User extends Model {
// 这里用来定义操作数据的方法
}
User.init(
{
telephone: {
type: Sequelize.STRING(11), // 电话号码,类型为字符串,长度最大为11
unique: true, // 是否唯一
},
password: Sequelize.STRING, // 登录密码
},
{
sequelize,
tableName: "users", // 定义表的名称,如果不定义,默认是模型名的复数形式
}
);
module.exports = {
User,
};
然后再修改文件 /app/api/v1/user.js
, 引入该数据模型:
const { User } = require("../../models/user");
代码保存后打开 phpMyAdmin
可以看到数据库 book
下多了一张 user
表,表里有 id
、telephone
、password
、create_at
、update_at
、delete_at
六个字段。
这里需要注意的是密码直接以明文保存在数据库中是不太妥当的,所以我们需要给它进行下加密。模型上的属性可以自定义 getter
和 setter
,我们来自定义 password
的 setter
,将它进行加密。
加密采用的第三方库是 bcryptjs,该第三方库的作用是对字符串加密,已加密的字符串不可破解,只可比对,同一明文密码多次加密,得到的加密结果各不相同。先来安装依赖:
npm install bcryptjs
修改 password
属性:
password: {
type: Sequelize.STRING,
set(val){
// 密码不能以明文存储,所以密码存储前先进行下加密
// 生成盐,10为生成盐的成本参数默认值,该值越大,密码哈希计算所需的CPU时间和内存就越多,理论上破解的难度也就越大
const salt = bcryct.genSaltSync(10);
const pwd = bcryct.hashSync(val, salt);
this.setDataValue("password", pwd);
}
}
2、书籍表,新建文件/app/models/book.js
const { sequelize } = require("../../core/db");
const { Sequelize, Model } = require("sequelize");
class Book extends Model {
// 这里用来定义操作数据的方法
}
Book.init(
{
image: Sequelize.STRING, // 书籍封面
bookName: Sequelize.STRING, // 书籍名称
bookDescription: Sequelize.STRING, // 书籍介绍
favorNums: {
type: Sequelize.INTEGER, // 被收藏次数
defaultValue: 0, // 设置默认值
},
},
{
sequelize,
}
);
module.exports = {
Book,
};
然后再修改文件 /app/api/v1/book.js
, 引入该数据模型:
const { Book } = require("../../models/book");
代码保存后打开 phpMyAdmin
可以看到数据库 book
下多了一张 books
表,表里有 id
、image
、book_name
、book_description
、favor_nums
、create_at
、update_at
、delete_at
八个字段。
3、评论表,新建文件/app/models/comment.js
const { sequelize } = require("../../core/db");
const { Sequelize, Model } = require("sequelize");
class Comment extends Model {
// 这里用来定义操作数据的方法
}
Comment.init(
{
content:Sequelize.STRING(30), // 评论内容
bookId: Sequelize.INTEGER, // 所属书籍Id
userId: Sequelize.INTEGER, // 所属用户Id
},
{
sequelize,
}
);
module.exports = {
Comment,
};
然后再修改文件 /app/api/v1/comment.js
, 引入该数据模型:
const { Comment } = require("../../models/comment");
代码保存后打开 phpMyAdmin
可以看到数据库 book
下多了一张 comments
表,表里有 id
、content
、book_id
、user_id
、create_at
、update_at
、delete_at
七个字段。
4、收藏表,新建文件/app/models/favor.js
const { sequelize } = require("../../core/db");
const { Sequelize, Model } = require("sequelize");
class Favor extends Model {
// 这里用来定义操作数据的方法
}
Favor.init(
{
bookId: Sequelize.INTEGER, // 所属书籍Id
userId: Sequelize.INTEGER, // 所属用户Id
likeFlag: {
type: DataTypes.ENUM("0", "1"), // 是否收藏,0-未收藏,1-已收藏
},
},
{
sequelize,
}
);
module.exports = {
Favor,
};
然后再修改文件 /app/api/v1/favor.js
, 引入该数据模型:
const { Favor } = require("../../models/favor");
代码保存后打开 phpMyAdmin
可以看到数据库 book
下多了一张 favors
表,表里有 id
、book_id
、user_id
、like_flag
、create_at
、update_at
、delete_at
七个字段。
数据表已经全部定义好,下篇 我们开始写接口逻辑啦~