node+koa+mysql(三)

115 阅读3分钟

上文介绍了 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 表,表里有 idtelephonepasswordcreate_atupdate_atdelete_at 六个字段。

这里需要注意的是密码直接以明文保存在数据库中是不太妥当的,所以我们需要给它进行下加密。模型上的属性可以自定义 gettersetter,我们来自定义 passwordsetter,将它进行加密。

加密采用的第三方库是 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 表,表里有 idimagebook_namebook_descriptionfavor_numscreate_atupdate_atdelete_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 表,表里有 idcontentbook_iduser_idcreate_atupdate_atdelete_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 表,表里有 idbook_iduser_idlike_flagcreate_atupdate_atdelete_at 七个字段。

数据表已经全部定义好,下篇 我们开始写接口逻辑啦~