# OrganizeInternalOA 数据库设计
Author: 筱锋xiao_lfeng | Version: 1.1.0
## 数据库设计 本数据库设计基于原有 [《数据库设计》](./数据库设计.md) 进行测试修改,进一步处理数据库结构与增加可维护性。 > 数据库所有字段均待定,后续可能会对某些字段进行删除,或者新增一些字段,尽量做成可维护的接口 > > 所有的表之间,关联性尽量不要做的那么强,适当解耦,不然可维护性不高 另外,为保证数据库的完整性,对数据库适当位置加以外键约束,若后续需要进行维护删除表等操作,可删除外键约束后操作。 使用数据库系统 `Mysql8` ## 建表准备 总建表语句在 /mysql/[organize_oa.sql](../mysql/organize_oa.sql) 下存放。**(重要:在执行导入中,请先看下面内容)** 若需要导入数据库中,请先操作数据库进入对应数据库进行操作。无需执行表导入 ```mysql USE organize_oa; ``` ### 数据库、用户名和密码 > 为了保证业务后期可拓展性及充分利用 mysql 默认数据库中数据,请参考下面内容。 另外,由于各位开发者配置环境为本地环境,非测试环境。故数据库部署并非统一,避免在 `application.yml` 文件中对 `spring.datasource` 频繁修改(操作git)带来不必要的麻烦,建议开发者建数据库时,数据库名字为 `organize_oa` 。单独开设账号 `organize_oa` 密码 `123456` ```mysql -- 数据库及用户建表语句(执行后创建 organize_oa 数据库与同名 organize_oa 用户(密码:123456) CREATE USER 'organize_oa'@'%' IDENTIFIED WITH caching_sha2_password BY '123456';GRANT USAGE ON *.* TO 'organize_oa'@'%';ALTER USER 'organize_oa'@'%' REQUIRE NONE WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;CREATE DATABASE IF NOT EXISTS `organize_oa`;GRANT ALL PRIVILEGES ON `organize_oa`.* TO 'organize_oa'@'%'; ``` application.yml 配置文件如下: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306 username: organize_oa password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver ``` > 注意,url部分中,没有使用 `jdbc:mysql://localhost:3306/organize_oa` ,在 mysql 中存在默认数据库 `information_schema` 该部分可以提取出该数据库(含 organize_oa 数据库)的信息,以及可以支持同账户下多张数据表,对后期若有需要可以调整使用。 ### url差别对于mapper的使用区别 在习惯使用 `jdbc:mysql://localhost:3306/organize_oa` 下,Mapper中数据库语法的描写较为简单。 ```java @Mapper public interface UserMapper { @Select("SELECT * FROM oa_user WHERE username = #{username}") UserDO getUserByUsername(String username); } ``` 若修改为 `jdbc:mysql://localhost:3306` 之后,操作数据库都需要加上数据库名字,告知 **DBMS** 使用哪一个数据库后再选择数据表 ```java @Mapper public interface UserMapper { @Select("SELECT * FROM organize_oa.oa_user WHERE username = #{username}") UserDO getUserByUsername(String username); } ``` > 为何这样使用。 > > 上述这样操作可以保证此服务对应一个数据库的用户,不使用 root 用户。使用 root 用户是一个很危险的事情,分出专门一个用户处理并且专门的用户中对应 `information_schema` 也有自己及名下相关的数据内容方便利用。除此之外,可以进行业务拓展。**若后期需要额外的开发要求,需要多个数据库,而不是单个数据库对应多个数据表的时候。**无需进行Mapper内繁琐代码修改(替换),只需在编写新的业务Mapper代码写入新的数据表名称即可。 ```java // 举个例子 @Mapper public interface GeneralMapper { @Select("SELECT * FROM organize_oa.oa_user WHERE username = #{username}") UserDO getUserByUsername(String username); @Select("SELECT * FROM organize_log.oa_logs WHERE id = #{id}") LogDO getLogById(Long id); } ``` ## organize_oa 数据库设计 > 以下是关于此数据库目前结构样式图,其中箭头为外键约束。对于外键约束内容详细会在下面进行详细叙述。 ```mermaid classDiagram direction BT class node7 { varchar(50) value /* 调用关键字 */ json data /* json数据 */ timestamp created_at /* 创建时间 */ timestamp updated_at /* 修改时间 */ bigint unsigned id /* 主键 */ } class node0 { bigint unsigned pid /* 权限父id */ varchar(100) name /* 权限名称 */ varchar(50) code /* 权限编码 */ tinyint(1) type /* 0为菜单,1为权限 */ deleted_at /* 删除时间(没有删除应当为空) */ timestamp bigint unsigned id /* 主键 */ } class node5 { varchar(255) name /* 项目名称 */ varchar(255) description /* 一句话描述 */ text introduction /* 项目详细介绍 */ tinyint(1) code_open /* 代码是否开放 */ text core_code /* 核心代码内容(Markdown) */ json git /* git代码仓库内容 */ tinyint unsigned difficulty_level /* 难度等级 */ int unsigned type /* 类型 */ double reward /* 报酬 */ tinyint unsigned status /* 状态 */ bigint unsigned id /* 项目id */ } class node2 { varchar(50) name /* 类型名字 */ timestamp created_at /* 创建时间 */ timestamp updated_at /* 修改时间 */ int unsigned id /* 项目类型id */ } class node3 { varchar(20) role_name /* 角色名称 */ timestamp created_at /* 创建时间 */ timestamp updated_at /* 修改时间 */ int unsigned id /* 角色id */ } class node1 { bigint unsigned pid /* 权限id */ timestamp created_at /* 创建时间 */ int unsigned rid /* 角色id */ } class node6 { int unsigned rid /* 角色id */ timestamp createdt_at /* 创建时间 */ timestamp updated_at /* 修改时间 */ bigint unsigned uid /* 用户id */ } class node4 { char(10) job_id /* 工作ID */ varchar(40) username /* 用户名 */ varchar(255) password /* 密码 */ varchar(255) address /* 用户家庭地址 */ varchar(11) phone /* 电话 */ varchar(100) email /* 邮箱 */ tinyint unsigned age /* 年龄 */ varchar(50) signature /* 一句话描述自己 */ tinyint unsigned sex /* 0/1/2:保密/男/女 */ text avatar /* 头像地址 */ varchar(20) nickname /* 昵称 */ tinyint(1) enabled /* 账户是否可用 */ tinyint(1) account_no_expired /* 账户是否过期 */ tinyint(1) credentials_no_expired /* 密码是否过期 */ tinyint(1) recommend /* 账户是否被推荐 */ tinyint(1) account_no_locked /* 账户是否被锁定 */ text description /* 个人简介 */ timestamp created_at /* 创建时间 */ timestamp updated_at /* 更新时间 */ bigint unsigned id /* 主键 */ } node0 --|> node0 node5 --|> node2 node1 --|> node0 node1 --|> node3 node6 --|> node3 node6 --|> node4 ``` ### oa_user 数据表 #### 说明 > 【用户表】存放本项目所有用户数据 #### 数据表字段属性 | 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | | 1 | `id` | 主键 | bigint unsigned | PRI | NO | auto_increment | | | 2 | `job_id` | 工作ID:正则表达 "^\[STU\|TEA\|OTH\]\[0-9\]{7}" | char(10) | UNI | NO | | | | 3 | `username` | 用户名 | varchar(40) | UNI | NO | | | | 4 | `password` | 密码 | varchar(255) | | NO | | | | 5 | `address` | 用户家庭地址 | varchar(255) | | NO | | | | 6 | `phone` | 电话 | varchar(11) | UNI | NO | | | | 7 | `email` | 邮箱 | varchar(100) | UNI | NO | | | | 8 | `age` | 年龄 | tinyint unsigned | | NO | | | | 9 | `signature` | 一句话描述自己 | varchar(50) | | YES | | | | 10 | `sex` | 0/1/2:保密/男/女 | tinyint unsigned | | NO | | 0 | | 11 | `avatar` | 头像地址 | text | | YES | | | | 12 | `nickname` | 昵称 | varchar(20) | | YES | | | | 13 | `enabled` | 账户是否可用 | tinyint(1) | | NO | | 1 | | 14 | `account_no_expired` | 账户是否过期 | tinyint(1) | | NO | | 1 | | 15 | `credentials_no_expired` | 密码是否过期 | tinyint(1) | | NO | | 0 | | 16 | `recommend` | 账户是否被推荐 | tinyint(1) | | NO | | 0 | | 17 | `account_no_locked` | 账户是否被锁定 | tinyint(1) | | NO | | | | 18 | `description` | 个人简介 | text | | YES | | | | 19 | `created_at` | 创建时间 | timestamp | | NO | DEFAULT_GENERATED | CURRENT_TIMESTAMP | | 20 | `updated_at` | 更新时间 | timestamp | | YES | | | ### oa_role 数据表 #### 说明 > 【角色表】包含所有的角色(目前主要为三个,学生、老师、管理员) #### 数据表字段属性 | 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | | 1 | `id` | 角色id | int unsigned | PRI | NO | auto_increment | | | 2 | `role_name` | 角色名称 | varchar(20) | | NO | | | | 3 | `created_at` | 创建时间 | timestamp | | NO | DEFAULT_GENERATED | CURRENT_TIMESTAMP | | 4 | `updated_at` | 修改时间 | timestamp | | YES | | | ### oa_permissions 数据表 #### 说明 > 【权限表】所有的权限,具体到每一个功能 #### 数据表字段属性 | 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | | 1 | `id` | 主键 | bigint unsigned | PRI | NO | auto_increment | | | 2 | `pid` | 权限父id | bigint unsigned | MUL | YES | | | | 3 | `name` | 权限名称 | varchar(100) | | NO | | | | 4 | `code` | 权限编码 | varchar(50) | | NO | | | | 5 | `type` | 0为菜单,1为权限 | tinyint(1) | | NO | | 1 | | 6 | `deleted_at` | 删除时间(没有删除应当为空) | timestamp | | YES | | | ### oa_role_user 数据表 #### 说明 > 【用户角色分配表】为用户赋予默认权限属性的内容 #### 数据表字段属性 | 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | | 1 | `uid` | 用户id | bigint unsigned | PRI | NO | | | | 2 | `rid` | 角色id | int unsigned | MUL | NO | | | | 3 | `createdt_at` | 创建时间 | timestamp | | NO | DEFAULT_GENERATED | CURRENT_TIMESTAMP | | 4 | `updated_at` | 修改时间 | timestamp | | YES | | | ### oa_role_permissions 数据表 #### 说明 > 【角色权限表】为角色赋予指定权限操作 #### 数据表字段属性 | 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | | 1 | `rid` | 角色id | int unsigned | PRI | NO | | | | 2 | `pid` | 权限id | bigint unsigned | MUL | NO | | | | 3 | `created_at` | 创建时间 | timestamp | | NO | DEFAULT_GENERATED | CURRENT_TIMESTAMP | ### oa_project 数据表 #### 说明 > 【项目表】用于存放项目相关内容 #### 数据表字段属性 | 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | | 1 | `id` | 项目id | bigint unsigned | PRI | NO | auto_increment | | | 2 | `name` | 项目名称 | varchar(255) | | NO | | | | 3 | `description` | 一句话描述 | varchar(255) | | NO | | | | 4 | `introduction` | 项目详细介绍 | text | | NO | | | | 5 | `code_open` | 代码是否开放 | tinyint(1) | | NO | | 0 | | 6 | `core_code` | 核心代码内容(Markdown) | text | | YES | | | | 7 | `git` | git代码仓库内容 | json | | YES | | | | 8 | `difficulty_level` | 难度等级 | tinyint unsigned | | NO | | 1 | | 9 | `type` | 类型 | int unsigned | MUL | NO | | | | 10 | `reward` | 报酬 | double | | YES | | | | 11 | `status` | 状态 | tinyint unsigned | | NO | | 0 | ### oa_project_type 数据表 #### 说明 > 【项目类型表】用于存放项目种类的种类分类表 #### 数据表字段属性 | 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | | 1 | `id` | 项目类型id | int unsigned | PRI | NO | auto_increment | | | 2 | `name` | 类型名字 | varchar(50) | | NO | | | | 3 | `created_at` | 创建时间 | timestamp | | NO | DEFAULT_GENERATED | CURRENT_TIMESTAMP | | 4 | `updated_at` | 修改时间 | timestamp | | YES | | | ### oa_project_cutting 数据表 #### 说明 #### 数据表字段属性 | 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | | :--: | :--------------: | :--------------: | :--------------: | :--: | :--: | :---------------: | :---------------: | | 1 | `id` | 主键 | bigint unsigned | PRI | NO | auto_increment | | | 2 | `pid` | 项目id | bigint unsigned | MUL | NO | | | | 3 | `name` | 项目分割模块名字 | varchar(40) | | NO | | | | 4 | `tag` | 模块标签 | json | | YES | | | | 5 | `engineering` | 工程量计算 | tinyint unsigned | | NO | | 1 | | 6 | `estimated_time` | 预估时间(小时) | int unsigned | | NO | | 3 | | 7 | `real_time` | 实际时间 | timestamp | | YES | | | | 8 | `created_at` | 创建时间 | timestamp | | NO | DEFAULT_GENERATED | CURRENT_TIMESTAMP | | 9 | `updated_at` | 修改时间 | timestamp | | YES | | | ### oa_project_user 数据表 #### 说明 > 【用户项目分配表】用于存放用户所分配到的子项目内容 #### 数据表字段属性 | 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | | 1 | `id` | 主键id | bigint unsigned | PRI | NO | auto_increment | | | 2 | `uid` | 用户id | bigint unsigned | MUL | NO | | | | 3 | `pid` | 接到分割项目内容 | bigint unsigned | MUL | NO | | | | 4 | `created_at` | 创建时间 | timestamp | | NO | DEFAULT_GENERATED | CURRENT_TIMESTAMP | | 5 | `updated_at` | 修改时间 | timestamp | | YES | | | ### oa_config 数据表 #### 说明 #### 数据表字段属性 | 序号 | 名称 | 描述 | 类型 | 键 | 为空 | 额外 | 默认值 | | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | | 1 | `id` | 主键 | bigint unsigned | PRI | NO | auto_increment | | | 2 | `value` | 调用关键字 | varchar(50) | UNI | NO | | | | 3 | `data` | json数据 | json | | YES | | | | 4 | `created_at` | 创建时间 | timestamp | | NO | DEFAULT_GENERATED | CURRENT_TIMESTAMP | | 5 | `updated_at` | 修改时间 | timestamp | | YES | | |