[关闭]
@artman328 2021-09-23T10:49:57.000000Z 字数 4053 阅读 657

PHP 联系人管理项目解决方案

未分类


一、需求描述

一个可提供给多用户的联系人管理平台,用户分为两种角色,一是管理员用户,二是普通用户。
每个用户都可有自己的联系人记录。每个用户可以为自己的联系人分组,一个联系人可能在多个分组之中。每个联系人可有自己的多条通讯方式及记录,如:方式为“电子邮件”,对应的 记录为“johndoe@server.com”;方式为“移动电话”,对应的记录为:“13887650988”等。

普通用户权限:自主管理(增、删、改、查)自己的所有记录 - 联系人、分组、通讯方式及记录等。
管理员权限:除普通用户权限外,还可维护用户(增、删、改、查等),禁用/启用用户等。但对管理员的操作有一些限制:可以禁用其他用户但不能禁用自己;只有禁用超过一定时限(比如30天)的用户才能被删除等。

二、数据实体

1、用户(users)

序号 属性名称 英文名称 数据类型 可空? 默认值 描述
1 编号 id 无符号大整型 自动 自增长
2 电子邮件 email 可变字符串型 唯一 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

2、联系人(contacts)

序号 属性名称 英文名称 数据类型 可空? 默认值 描述
1 编号 id 无符号大整型 NULL 自增长
2 firstname 可变字符串型 NULL
3 lastname 可变字符串型 NULL 便于国际化姓氏检索
4 注记 note 可变字符串型 NULL 便于标记联系人
5 所属用户编号 user_id 无符号大整型 NULL 参照用户表的用户编号

3、分组(groups)

序号 属性名称 英文名称 数据类型 可空? 默认值 描述
1 编号 id 无符号大整型 NULL 自增长
2 名称 name 可变字符串型 唯一 NULL 与“所属用户编号”组合唯一
3 说明 description 可变字符串型 NULL
4 所属用户编号 user_id 无符号大整型
唯一
NULL 参照用户表的用户编号
与“名称”组合唯一

* “名称”、“所属用户编号”组合唯一:一名用户不能有两个组名完全相同的分组。

4、通讯方式及记录(contact_details)

序号 属性名称 英文名称 数据类型 可空? 默认值 描述
1 编号 id 无符号大整型 NULL 自增长
2 通讯方式 method 可变字符串型 唯一 NULL 与“记录”组合唯一
3 记录 record 可变字符串型 唯一 NULL 与“通讯方式”组合唯一
4 所属联系人编号 contact_id 无符号大整型 NULL 参照联系人表的联系人编号

* “通讯方式”、“记录”组合唯一:一名联系人不应该有两条“通讯方式”和“记录”都相同的记录。

5、联系人-分组(contact-group)

序号 属性名称 英文名称 数据类型 可空? 默认值 描述
1 联系人编号 contact_id 无符号大整型
NULL 与“分组编号”做组合主键
参照联系人表的联系人编号
2 分组编号 group_id 无符号大整型
NULL 与“联系人编号”做组合主键
参照分组表的分组编号

三、数据库脚本

  1. DROP DATABASE IF EXISTS `contact_db1`;
  2. CREATE DATABASE IF NOT EXISTS `contact_db1` DEFAULT CHARSET utf8mb4;
  3. USE `contact_db1`
  4. CREATE TABLE `users`(
  5. -- fields
  6. `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  7. `email` VARCHAR(255) NOT NULL,
  8. `password` VARCHAR(255) NOT NULL,
  9. `firstname` VARCHAR(255) NOT NULL,
  10. `lastname` VARCHAR(255) NOT NULL,
  11. `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  12. `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  13. `is_admin` BOOLEAN NOT NULL DEFAULT 0,
  14. `disabled` BOOLEAN NOT NULL DEFAULT 0,
  15. `disabled_at` TIMESTAMP NULL DEFAULT NULL,
  16. -- constraints
  17. CONSTRAINT `users_pk` PRIMARY KEY(`id`),
  18. CONSTRAINT `users_email_uk` UNIQUE KEY(`email`)
  19. );
  20. CREATE TABLE `contacts`(
  21. -- fields
  22. `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  23. `firstname` VARCHAR(255) NOT NULL,
  24. `lastname` VARCHAR(255) NOT NULL,
  25. `note` VARCHAR(255),
  26. `user_id` BIGINT UNSIGNED NOT NULL,
  27. -- constraints
  28. CONSTRAINT `contacts_pk` PRIMARY KEY(`id`),
  29. CONSTRAINT `contacts_user_id_fk` FOREIGN KEY(`user_id`)
  30. REFERENCES `users`(`id`)
  31. ON UPDATE CASCADE
  32. ON DELETE CASCADE
  33. );
  34. CREATE TABLE `groups`(
  35. -- fields
  36. `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  37. `name` VARCHAR(255) NOT NULL,
  38. `description` VARCHAR(255),
  39. `user_id` BIGINT UNSIGNED NOT NULL,
  40. -- constraints
  41. CONSTRAINT `groups_pk` PRIMARY KEY(`id`),
  42. CONSTRAINT `groups_user_id_fk` FOREIGN KEY(`user_id`)
  43. REFERENCES `users`(`id`)
  44. ON UPDATE CASCADE
  45. ON DELETE CASCADE,
  46. CONSTRAINT `groups_name_user_id_uq` UNIQUE KEY(`name`,`user_id`)
  47. );
  48. CREATE TABLE `contact_details`(
  49. -- fields
  50. `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  51. `method` VARCHAR(255) NOT NULL,
  52. `record` VARCHAR(255) NOT NULL,
  53. `contact_id` BIGINT UNSIGNED,
  54. -- constraints
  55. CONSTRAINT `contact_details_pk` PRIMARY KEY(`id`),
  56. CONSTRAINT `contact_details_contact_id_fk` FOREIGN KEY(`contact_id`)
  57. REFERENCES `contacts`(`id`)
  58. ON UPDATE CASCADE
  59. ON DELETE CASCADE,
  60. CONSTRAINT `contact_details_method_record_uk` UNIQUE KEY(`method`,`record`)
  61. );
  62. CREATE TABLE `contact_group`(
  63. -- fields
  64. `contact_id` BIGINT UNSIGNED NOT NULL,
  65. `group_id` BIGINT UNSIGNED NOT NULL,
  66. -- cobstraints
  67. CONSTRAINT `contact_group_pk` PRIMARY KEY(`contact_id`,`group_id`),
  68. CONSTRAINT `contact_group_contact_id_fk` FOREIGN KEY(`contact_id`)
  69. REFERENCES `contacts`(`id`)
  70. ON UPDATE CASCADE
  71. ON DELETE CASCADE,
  72. CONSTRAINT `contact_group_group_id_fk` FOREIGN KEY(`group_id`)
  73. REFERENCES `groups`(`id`)
  74. ON UPDATE CASCADE
  75. ON DELETE CASCADE
  76. );
  77. INSERT INTO `users`(`id`,`email`,`password`,`firstname`,`lastname`,`is_admin`,`disabled`,`disabled_at`)
  78. VALUES
  79. (1,'admin@mail.com','$2y$10$i8nALhdDTaQtdaqs2RXtM.eDDFB6Z4JvmKZKqVVd9BkNWKpYR1IYG','Billy', 'Jones', 1, 0, null),
  80. (2,'user1@mail.com','$2y$10$N.aOM.K5myYW74m4wCQbLuaGhwgpc0MRs9P7IklY3R0wIZsBK.QFG','John','Doe',0,0,null),
  81. (3,'user2@mail.com','$2y$10$it1K3kxDWNHXQkQvcJIQyOWCFCcyMAjL6.UlBp0.NFLDNDXIIgBOS','Jane','Doe',0,1,CURRENT_TIMESTAMP)

四、原始 PHP 实现

1、

2、

五、MVC 实现

六、Laravel 框架 MVC 实现

七、Laravel 框架 API + Vue 前端单页应用实现

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注