数据库的ER图
- password 类型为varchar(500),因为数据库保存的是加密后的密码,所以需要500个字符
- editor_id 引用 t_user 的id
- contend_id 关联MongoDB的内容id,MongoDB固定字符串长度为12
- is_top,是否置顶,共分为十级
数据加密
AES加密函数
- MySQL数据库提供了AES加密和解密的函数,所以数据的加密解密非常容易实现
AES_ENCRYPT(原始数据,密钥字符串)
SELECT AES_ENCRYPT ("你好世界", "ABC123456");
SELECT HEX(AES_ENCRYPT("你好世界", "ABC123456"));
AES解密函数
- AES解密要使用与加密相同的密钥,才能解密出原始数据
AES_DECRYPT(加密结果,密钥字符串)
SELECT
AES_DECRYPT(
UNHEX("E85A104B6142A7375E53C0545CAD48EE"),
"ABC123456"
);
- UNHEX:将16进制转为2进制
创建逻辑库与数据表
CREATE DATABASE vega;
USE vega;
CREATE TABLE t_type(
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
type VARCHAR(20) NOT NULL UNIQUE
);
INSERT INTO t_type(type) VALUES("要闻"),("体育"),("科技"),("娱乐"),("历史");
CREATE TABLE t_role(
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
role VARCHAR(20) NOT NULL UNIQUE
);
INSERT INTO t_role(role) VALUES("管理员"),("新闻编辑");
CREATE TABLE t_user(
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(20) NOT NULL UNIQUE,
password VARCHAR(500) NOT NULL,
email VARCHAR(100) NOT NULL,
role_id INT UNSIGNED NOT NULL,
INDEX(username)
);
INSERT INTO t_user(username,password,email,role_id)
VALUES("scott",HEX(AES_ENCRYPT("123456","HelloWorld")),
"scott@163.com",2);
CREATE TABLE t_news(
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(40) NOT NULL,
editor_id INT UNSIGNED NOT NULL,
type_id INT UNSIGNED NOT NULL,
content_id CHAR(12) NOT NULL,
is_top TINYINT UNSIGNED NOT NULL,
create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
state ENUM("草稿","待审批","已审批","隐藏") NOT NULL,
INDEX(editor_id),
INDEX(type_id),
INDEX(state),
INDEX(create_time),
INDEX(is_top)
);
|