# 东软环保公众监督系统 - 数据库设计文档 ## 1. 设计概述 本数据库设计旨在支持一个高效、可扩展的环保监督系统。设计遵循第三范式(3NF),通过主外键关联确保数据的一致性和完整性。所有表均采用`InnoDB`存储引擎,以支持事务和行级锁定。 - **命名规范**: 表名采用小写下划线命名法(e.g., `user_account`),字段名采用驼峰命名法(e.g., `createdAt`)。 - **主键**: 所有表均包含一个`BIGINT`类型的自增主键`id`。 - **时间戳**: 关键业务表包含`createdAt`和`updatedAt`字段,用于追踪记录的创建和最后修改时间。 ## 2. 实体关系图 (E-R Diagram) ```mermaid erDiagram USER_ACCOUNT }|--o{ FEEDBACK : "submits" USER_ACCOUNT }|--o{ ASSIGNMENT_RECORD : "assigns (as supervisor)" USER_ACCOUNT }|--o{ ASSIGNMENT_RECORD : "is assigned (as grid_worker)" USER_ACCOUNT }|--o{ AQI_DATA : "reports" USER_ACCOUNT }|--o{ USER_LOGIN_HISTORY : "logs" FEEDBACK ||--|{ ASSIGNMENT_RECORD : "is subject of" FEEDBACK ||--o{ AQI_DATA : "is verified by" FEEDBACK ||--|{ FEEDBACK_IMAGE : "has" GRID ||--o{ AQI_DATA : "is location for" USER_ACCOUNT { BIGINT id PK VARCHAR name VARCHAR phone "UK" VARCHAR email "UK" VARCHAR password VARCHAR gender VARCHAR role VARCHAR status VARCHAR region VARCHAR level JSON skills DATETIME createdAt DATETIME updatedAt } FEEDBACK { BIGINT id PK VARCHAR eventId "UK" VARCHAR title TEXT description VARCHAR pollutionType VARCHAR severityLevel VARCHAR status VARCHAR textAddress INT gridX INT gridY BIGINT submitterId FK DATETIME createdAt DATETIME updatedAt } FEEDBACK_IMAGE { BIGINT id PK BIGINT feedbackId FK VARCHAR imageUrl "URL of the stored image" VARCHAR imageName DATETIME createdAt } ASSIGNMENT_RECORD { BIGINT id PK BIGINT feedbackId FK BIGINT gridWorkerId FK BIGINT supervisorId FK VARCHAR assignmentMethod JSON algorithmDetails VARCHAR status DATETIME createdAt } AQI_DATA { BIGINT id PK BIGINT feedbackId FK "Nullable" BIGINT gridId FK BIGINT reporterId FK DOUBLE aqiValue DOUBLE pm25 DOUBLE pm10 DOUBLE so2 DOUBLE no2 DOUBLE co DOUBLE o3 DATETIME recordTime } GRID { BIGINT id PK INT gridX INT gridY "UK" VARCHAR cityName VARCHAR districtName BOOLEAN isObstacle } USER_LOGIN_HISTORY { BIGINT id PK BIGINT userId FK VARCHAR ipAddress VARCHAR userAgent VARCHAR status DATETIME loginTime } ``` ## 3. 数据表详细设计 ### 3.1 用户表 (`user_account`) 存储所有系统用户,包括公众、监督员、网格员、管理员和决策者。 | 字段名 | 数据类型 | 长度/约束 | 是否可空 | 默认值 | 描述 | | :--- | :--- | :--- | :--- | :--- | :--- | | `id` | `BIGINT` | `PK, AUTO_INCREMENT`| No | | 唯一主键 | | `name` | `VARCHAR`| 255 | No | | 真实姓名 | | `phone` | `VARCHAR`| 50 | No | | 手机号 (唯一,用于登录) | | `email` | `VARCHAR`| 255 | No | | 邮箱 (唯一,用于登录和验证) | | `password`| `VARCHAR`| 255 | No | | BCrypt加密后的密码 | | `gender` | `VARCHAR`| 10 | Yes | | 性别 (Enum: `MALE`, `FEMALE`, `UNKNOWN`) | | `role` | `VARCHAR`| 50 | No | `PUBLIC_SUPERVISOR` | 角色 (Enum: `PUBLIC_SUPERVISOR`, `SUPERVISOR` (业务主管), `GRID_WORKER` (网格员), `ADMIN` (系统管理员), `DECISION_MAKER` (决策者)) | | `status` | `VARCHAR`| 50 | No | `ACTIVE`| 账户状态 (Enum: `ACTIVE`, `INACTIVE`, `ON_LEAVE`) | | `region` | `VARCHAR`| 255| Yes | | 所属区域 (格式: "省-市-区") | | `level` | `VARCHAR`| 50 | Yes | | 行政级别 (Enum: `PROVINCE`, `CITY`) | | `skills` | `JSON` | | Yes | | 技能标签 (仅对网格员有效, e.g., `["PM2.5", "O3"]`) | | `createdAt` | `DATETIME` | | No | `CURRENT_TIMESTAMP` | 创建时间 | | `updatedAt` | `DATETIME` | | No | `CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP` | 更新时间 | **索引设计**: - `PRIMARY KEY (id)` - `UNIQUE KEY uk_phone (phone)` - `UNIQUE KEY uk_email (email)` - `KEY idx_role_status (role, status)` - `KEY idx_region_level (region, level)` ### 3.2 反馈信息表 (`feedback`) 存储由公众监督员提交的污染反馈信息。 | 字段名 | 数据类型 | 长度/约束 | 是否可空 | 默认值 | 描述 | | :--- | :--- | :--- | :--- | :--- | :--- | | `id` | `BIGINT` | `PK, AUTO_INCREMENT`| No | | 唯一主键 | | `eventId`| `VARCHAR`| 255 | `UK, NOT NULL` | | 业务事件ID (USR...格式),对用户可见、唯一 | | `title` | `VARCHAR`| 255 | No | | 反馈标题 | | `description`| `TEXT` | | Yes | | 详细描述 | | `pollutionType`|`VARCHAR`| 50 | No | | 污染类型 (Enum: `PM2.5`, `O3`, `NO2`, `SO2`, `OTHER`) | | `severityLevel`|`VARCHAR`| 50 | No | | 严重等级 (Enum: `LOW`, `MEDIUM`, `HIGH`) | | `status` | `VARCHAR`| 50 | No | `AI_REVIEWING`| 任务状态 (Enum: `AI_REVIEWING`, `AI_PROCESSING`, `PENDING_ASSIGNMENT`, `ASSIGNED`, `IN_PROGRESS`, `SUBMITTED`, `COMPLETED`, `CANCELLED`, `CLOSED_INVALID`) | | `textAddress`| `VARCHAR`| 255 | Yes | | 文字地址 (格式: "省份-城市-区") | | `gridX` | `INT` | | Yes | | 对应的网格X坐标 | | `gridY` | `INT` | | Yes | | 对应的网格Y坐标 | | `submitterId`| `BIGINT` | `FK -> user_account.id` | No | | 提交者ID | | `createdAt` | `DATETIME` | | No | `CURRENT_TIMESTAMP` | 创建时间 | | `updatedAt` | `DATETIME` | | No | `CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP` | 更新时间 | **索引设计**: - `PRIMARY KEY (id)` - `UNIQUE KEY uk_event_id (eventId)` - `KEY idx_submitter_id (submitterId)` - `KEY idx_status_created_at (status, createdAt)` - `KEY idx_grid_coords (gridX, gridY)` ### 3.3 反馈图片表 (`feedback_image`) 存储与反馈信息关联的图片。 | 字段名 | 数据类型 | 长度/约束 | 是否可空 | 默认值 | 描述 | | :--- | :--- | :--- | :--- | :--- | :--- | | `id` | `BIGINT` | `PK, AUTO_INCREMENT`| No | | 唯一主键 | | `feedbackId` | `BIGINT` | `FK -> feedback.id`| No | | 关联的反馈ID | | `imageUrl` | `VARCHAR`| 512 | No | | 存储的图片URL | | `imageName` | `VARCHAR`| 255 | Yes | | 图片原始文件名 | | `createdAt` | `DATETIME`| | No |`CURRENT_TIMESTAMP`| 创建时间 | **索引设计**: - `PRIMARY KEY (id)` - `KEY idx_feedback_id (feedbackId)` ### 3.4 任务分配记录表 (`assignment_record`) 记录每一次任务分配的详细信息。 | 字段名 | 数据类型 | 长度/约束 | 是否可空 | 默认值 | 描述 | | :--- | :--- | :--- | :--- | :--- | :--- | | `id` | `BIGINT` | `PK, AUTO_INCREMENT`| No | | 唯一主键 | | `feedbackId`| `BIGINT` | `FK -> feedback.id`| No | | 关联的反馈/任务ID | | `gridWorkerId`|`BIGINT`|`FK -> user_account.id`| No | | 被分配的网格员ID | | `supervisorId` | `BIGINT`| `FK -> user_account.id`| No | | 执行分配的主管ID | | `assignmentMethod`|`VARCHAR`|50| No | | 分配方式 (Enum: `MANUAL`, `INTELLIGENT`) | | `algorithmDetails`|`JSON`| | Yes | | 智能分配算法的快照 (e.g., ETR, 候选人) | | `status` | `VARCHAR`| 50 | No | `PENDING`| 分配状态 (Enum: `PENDING`, `ACCEPTED`, `REJECTED`) | | `createdAt` |`DATETIME`| | No |`CURRENT_TIMESTAMP`| 创建时间 | **索引设计**: - `PRIMARY KEY (id)` - `KEY idx_feedback_id (feedbackId)` - `KEY idx_grid_worker_id_status (gridWorkerId, status)` - `KEY idx_supervisor_id (supervisorId)` ### 3.5 空气质量数据表 (`aqi_data`) 存储网格员现场核查后上报的精确AQI数据。 | 字段名 | 数据类型 | 长度/约束 | 是否可空 | 默认值 | 描述 | | :--- | :--- | :--- | :--- | :--- | :--- | | `id` | `BIGINT` | `PK, AUTO_INCREMENT`| No | | 唯一主键 | | `feedbackId`| `BIGINT` | `FK -> feedback.id`| Yes | | 关联的反馈ID (可为空,支持主动上报) | | `gridId` | `BIGINT` | `FK -> grid.id`| No | | 数据采集所在的网格ID | | `reporterId`| `BIGINT` | `FK -> user_account.id`| No | | 上报人ID(网格员)| | `aqiValue` | `DOUBLE` | | Yes | | 综合AQI指数 | | `pm25` | `DOUBLE` | | Yes | | PM2.5读数 (μg/m³) | | `pm10` | `DOUBLE` | | Yes | | PM10读数 (μg/m³) | | `so2` | `DOUBLE` | | Yes | | 二氧化硫读数 (μg/m³) | | `no2` | `DOUBLE` | | Yes | | 二氧化氮读数 (μg/m³) | | `co` | `DOUBLE` | | Yes | | 一氧化碳读数 (mg/m³) | | `o3` | `DOUBLE` | | Yes | | 臭氧读数 (μg/m³) | | `recordTime`|`DATETIME`| | No |`CURRENT_TIMESTAMP`| 记录时间 | **索引设计**: - `PRIMARY KEY (id)` - `KEY idx_feedback_id (feedbackId)` - `KEY idx_grid_id_record_time (gridId, recordTime)` - `KEY idx_reporter_id (reporterId)` ### 3.6 网格地图表 (`grid`) 定义抽象的二维网格地图。 | 字段名 | 数据类型 | 长度/约束 | 是否可空 | 默认值 | 描述 | | :--- | :--- | :--- | :--- | :--- | :--- | | `id` | `BIGINT` | `PK, AUTO_INCREMENT`| No | | 唯一主键 | | `gridX` | `INT` | | No | | 网格X坐标 | | `gridY` | `INT` | | No | | 网格Y坐标 | | `cityName`| `VARCHAR`| 255 | Yes | | 所属城市 | | `districtName`|`VARCHAR`|255| Yes | | 所属区域 | | `isObstacle`|`BOOLEAN`| | No | `false`| 是否为障碍物 | **索引设计**: - `PRIMARY KEY (id)` - `UNIQUE KEY uk_grid_coords (gridX, gridY)` - `KEY idx_city_district (cityName, districtName)` ### 3.7 用户登录历史表 (`user_login_history`) 记录用户登录活动,用于安全审计。 | 字段名 | 数据类型 | 长度/约束 | 是否可空 | 默认值 | 描述 | | :--- | :--- | :--- | :--- | :--- | :--- | | `id` | `BIGINT` | `PK, AUTO_INCREMENT`| No | | 唯一主键 | | `userId` | `BIGINT` | `FK -> user_account.id`| No | | 登录用户ID | | `ipAddress`| `VARCHAR`| 100 | Yes | | 登录IP地址 | | `userAgent`| `VARCHAR`| 512 | Yes | | 浏览器或客户端信息 | | `status` | `VARCHAR`| 50 | No | | 登录状态 (Enum: `SUCCESS`, `FAILED_PASSWORD`, `FAILED_LOCKED`) | | `loginTime`| `DATETIME`| | No |`CURRENT_TIMESTAMP`| 登录时间 | **索引设计**: - `PRIMARY KEY (id)` - `KEY idx_user_id_login_time (userId, loginTime)` - `KEY idx_ip_address (ipAddress)` ## 4. 初始化数据 (Seed Data) 系统首次部署时,应向`user_account`表插入以下初始用户,以确保各角色可用。密码均为明文示例,实际存储时需加密。 | name | phone | email | password | role | status | region | level | | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- | | "张建华"| "18800000001" | "zhang.jianguo@example.com"| "Admin@123456" | `ADMIN` | `ACTIVE` | "河北省" | `PROVINCE` | | "李志强"| "18800000002" | "li.zhiqiang@example.com" | "Admin@123456" | `ADMIN` | `ACTIVE` | "河北省-石家庄市"| `CITY` | | "王伟" | "18800000003" | "wang.wei@example.com" | "User@123456" | `GRID_WORKER`| `ACTIVE` | "河北省-石家庄市-长安区"| `CITY` | | "刘丽" | "18800000004" | "li.li@example.com" | "User@123456" | `SUPERVISOR`| `ACTIVE` | "河北省-石家庄市-裕华区"| `CITY` | | "陈思远"| "18800000005" | "chen.siyuan@example.com" | "User@123456" | `DECISION_MAKER`| `ACTIVE`| "全国" | `PROVINCE` | | "赵敏" | "18800000006" | "zhao.min@example.com" | "User@123456" | `PUBLIC_SUPERVISOR`|`ACTIVE`| "河北省-石家庄市-桥西区"| `CITY` |