@artman328
2021-09-23T10:49:57.000000Z
字数 4053
阅读 657
未分类
一个可提供给多用户的联系人管理平台,用户分为两种角色,一是管理员用户,二是普通用户。
每个用户都可有自己的联系人记录。每个用户可以为自己的联系人分组,一个联系人可能在多个分组之中。每个联系人可有自己的多条通讯方式及记录,如:方式为“电子邮件”,对应的 记录为“johndoe@server.com”;方式为“移动电话”,对应的记录为:“13887650988”等。
普通用户权限:自主管理(增、删、改、查)自己的所有记录 - 联系人、分组、通讯方式及记录等。
管理员权限:除普通用户权限外,还可维护用户(增、删、改、查等),禁用/启用用户等。但对管理员的操作有一些限制:可以禁用其他用户但不能禁用自己;只有禁用超过一定时限(比如30天)的用户才能被删除等。
序号 | 属性名称 | 英文名称 | 数据类型 | 键 | 可空? | 默认值 | 描述 |
---|---|---|---|---|---|---|---|
1 | 编号 | id | 无符号大整型 | 主 | 自动 | 自增长 | |
2 | 电子邮件 | 可变字符串型 | 唯一 | NULL | |||
3 | 密码 | password | 可变字符串型 | NULL | 加密字符串 | ||
4 | 名 | firstname | 可变字符串型 | NULL | |||
5 | 姓 | lastname | 可变字符串型 | NULL | 便于国际化姓氏检索 | ||
6 | 注册日期时间 | created_at | 时间戳 | CURRENT_TIMESTAMP | |||
7 | 更新日期时间 | updated_at | 时间戳 | CURRENT_TIMESTAMP | 记录更新时自动更新 | ||
8 | 是否管理员 | is_admin | 逻辑型 | false | |||
9 | 已禁用 | disabled | 逻辑型 | false | |||
10 | 禁用日期时间 | disabled_at | 时间戳 | ✓ | NULL |
序号 | 属性名称 | 英文名称 | 数据类型 | 键 | 可空? | 默认值 | 描述 |
---|---|---|---|---|---|---|---|
1 | 编号 | id | 无符号大整型 | 主 | NULL | 自增长 | |
2 | 名 | firstname | 可变字符串型 | NULL | |||
3 | 姓 | lastname | 可变字符串型 | NULL | 便于国际化姓氏检索 | ||
4 | 注记 | note | 可变字符串型 | ✓ | NULL | 便于标记联系人 | |
5 | 所属用户编号 | user_id | 无符号大整型 | 外 | NULL | 参照用户表的用户编号 |
序号 | 属性名称 | 英文名称 | 数据类型 | 键 | 可空? | 默认值 | 描述 |
---|---|---|---|---|---|---|---|
1 | 编号 | id | 无符号大整型 | 主 | NULL | 自增长 | |
2 | 名称 | name | 可变字符串型 | 唯一 | NULL | 与“所属用户编号”组合唯一 | |
3 | 说明 | description | 可变字符串型 | ✓ | NULL | ||
4 | 所属用户编号 | user_id | 无符号大整型 | 外 唯一 |
NULL | 参照用户表的用户编号 与“名称”组合唯一 |
* “名称”、“所属用户编号”组合唯一:一名用户不能有两个组名完全相同的分组。
序号 | 属性名称 | 英文名称 | 数据类型 | 键 | 可空? | 默认值 | 描述 |
---|---|---|---|---|---|---|---|
1 | 编号 | id | 无符号大整型 | 主 | NULL | 自增长 | |
2 | 通讯方式 | method | 可变字符串型 | 唯一 | NULL | 与“记录”组合唯一 | |
3 | 记录 | record | 可变字符串型 | 唯一 | NULL | 与“通讯方式”组合唯一 | |
4 | 所属联系人编号 | contact_id | 无符号大整型 | 外 | NULL | 参照联系人表的联系人编号 |
* “通讯方式”、“记录”组合唯一:一名联系人不应该有两条“通讯方式”和“记录”都相同的记录。
序号 | 属性名称 | 英文名称 | 数据类型 | 键 | 可空? | 默认值 | 描述 |
---|---|---|---|---|---|---|---|
1 | 联系人编号 | contact_id | 无符号大整型 | 主 外 |
NULL | 与“分组编号”做组合主键 参照联系人表的联系人编号 |
|
2 | 分组编号 | group_id | 无符号大整型 | 主 外 |
NULL | 与“联系人编号”做组合主键 参照分组表的分组编号 |
DROP DATABASE IF EXISTS `contact_db1`;
CREATE DATABASE IF NOT EXISTS `contact_db1` DEFAULT CHARSET utf8mb4;
USE `contact_db1`
CREATE TABLE `users`(
-- fields
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`email` VARCHAR(255) NOT NULL,
`password` VARCHAR(255) NOT NULL,
`firstname` VARCHAR(255) NOT NULL,
`lastname` VARCHAR(255) NOT NULL,
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`is_admin` BOOLEAN NOT NULL DEFAULT 0,
`disabled` BOOLEAN NOT NULL DEFAULT 0,
`disabled_at` TIMESTAMP NULL DEFAULT NULL,
-- constraints
CONSTRAINT `users_pk` PRIMARY KEY(`id`),
CONSTRAINT `users_email_uk` UNIQUE KEY(`email`)
);
CREATE TABLE `contacts`(
-- fields
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`firstname` VARCHAR(255) NOT NULL,
`lastname` VARCHAR(255) NOT NULL,
`note` VARCHAR(255),
`user_id` BIGINT UNSIGNED NOT NULL,
-- constraints
CONSTRAINT `contacts_pk` PRIMARY KEY(`id`),
CONSTRAINT `contacts_user_id_fk` FOREIGN KEY(`user_id`)
REFERENCES `users`(`id`)
ON UPDATE CASCADE
ON DELETE CASCADE
);
CREATE TABLE `groups`(
-- fields
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL,
`description` VARCHAR(255),
`user_id` BIGINT UNSIGNED NOT NULL,
-- constraints
CONSTRAINT `groups_pk` PRIMARY KEY(`id`),
CONSTRAINT `groups_user_id_fk` FOREIGN KEY(`user_id`)
REFERENCES `users`(`id`)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT `groups_name_user_id_uq` UNIQUE KEY(`name`,`user_id`)
);
CREATE TABLE `contact_details`(
-- fields
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`method` VARCHAR(255) NOT NULL,
`record` VARCHAR(255) NOT NULL,
`contact_id` BIGINT UNSIGNED,
-- constraints
CONSTRAINT `contact_details_pk` PRIMARY KEY(`id`),
CONSTRAINT `contact_details_contact_id_fk` FOREIGN KEY(`contact_id`)
REFERENCES `contacts`(`id`)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT `contact_details_method_record_uk` UNIQUE KEY(`method`,`record`)
);
CREATE TABLE `contact_group`(
-- fields
`contact_id` BIGINT UNSIGNED NOT NULL,
`group_id` BIGINT UNSIGNED NOT NULL,
-- cobstraints
CONSTRAINT `contact_group_pk` PRIMARY KEY(`contact_id`,`group_id`),
CONSTRAINT `contact_group_contact_id_fk` FOREIGN KEY(`contact_id`)
REFERENCES `contacts`(`id`)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT `contact_group_group_id_fk` FOREIGN KEY(`group_id`)
REFERENCES `groups`(`id`)
ON UPDATE CASCADE
ON DELETE CASCADE
);
INSERT INTO `users`(`id`,`email`,`password`,`firstname`,`lastname`,`is_admin`,`disabled`,`disabled_at`)
VALUES
(1,'admin@mail.com','$2y$10$i8nALhdDTaQtdaqs2RXtM.eDDFB6Z4JvmKZKqVVd9BkNWKpYR1IYG','Billy', 'Jones', 1, 0, null),
(2,'user1@mail.com','$2y$10$N.aOM.K5myYW74m4wCQbLuaGhwgpc0MRs9P7IklY3R0wIZsBK.QFG','John','Doe',0,0,null),
(3,'user2@mail.com','$2y$10$it1K3kxDWNHXQkQvcJIQyOWCFCcyMAjL6.UlBp0.NFLDNDXIIgBOS','Jane','Doe',0,1,CURRENT_TIMESTAMP)