@artman328
2021-09-23T10:49:57.000000Z
字数 4053
阅读 829
未分类
一个可提供给多用户的联系人管理平台,用户分为两种角色,一是管理员用户,二是普通用户。
每个用户都可有自己的联系人记录。每个用户可以为自己的联系人分组,一个联系人可能在多个分组之中。每个联系人可有自己的多条通讯方式及记录,如:方式为“电子邮件”,对应的 记录为“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,-- constraintsCONSTRAINT `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,-- constraintsCONSTRAINT `contacts_pk` PRIMARY KEY(`id`),CONSTRAINT `contacts_user_id_fk` FOREIGN KEY(`user_id`)REFERENCES `users`(`id`)ON UPDATE CASCADEON 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,-- constraintsCONSTRAINT `groups_pk` PRIMARY KEY(`id`),CONSTRAINT `groups_user_id_fk` FOREIGN KEY(`user_id`)REFERENCES `users`(`id`)ON UPDATE CASCADEON 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,-- constraintsCONSTRAINT `contact_details_pk` PRIMARY KEY(`id`),CONSTRAINT `contact_details_contact_id_fk` FOREIGN KEY(`contact_id`)REFERENCES `contacts`(`id`)ON UPDATE CASCADEON 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,-- cobstraintsCONSTRAINT `contact_group_pk` PRIMARY KEY(`contact_id`,`group_id`),CONSTRAINT `contact_group_contact_id_fk` FOREIGN KEY(`contact_id`)REFERENCES `contacts`(`id`)ON UPDATE CASCADEON DELETE CASCADE,CONSTRAINT `contact_group_group_id_fk` FOREIGN KEY(`group_id`)REFERENCES `groups`(`id`)ON UPDATE CASCADEON 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)