feat(device): 新增设备管理模块全栈实现并拆分菜单 - 客户设备台账(customer_equipment)与智电设备型号目录(smart_device)CRUD,JWT+RBAC鉴权、参数绑定防SQL注入;设备监控改目录挂台账(/device/equipment),新建基础数据目录挂型号(/base/smart-device);前端防XSS样式对齐客户模块;远程库菜单迁移20261007_device_menu_split_fix.sql(id 58-60)

This commit is contained in:
wk committed 2026-10-07 08:58:34 +08:00
1 parent 91aa3c06f0
commit 09f7345e8a
18 files changed
+2482 -7

No files matched your search

@@ -0,0 +1,82 @@
# 设备管理模块 Spec
## Why
现有系统仅有 `customer_equipment`(客户设备台账)和 `smart_device`(智电设备型号目录)两张数据库表及 `/device` 占位路由(Placeholder.vue),设备管理功能尚未实现。需依据系统设计文档构建设备管理模块的完整前后端实现,统一安全管理并兼容 APP 调用。
## What Changes
- 新增客户设备台账模块:设备 CRUD、按客户关联过滤、展示归属建筑/楼层/位置、设备照片上传。
- 新增智电设备型号目录模块:型号 CRUD、类型字典。
- 新增空间拓扑与用电架构:复用现有 `customer/topology` 页面,将设备台账按建筑/楼层进行拓扑化展示(前端展示为主,复用现有设备数据接口)。
- 替换 `/device` 占位路由为真实的设备管理页面入口。
- 后端接口统一 JWT + RBAC 鉴权(覆盖所有设备模块端点),接口保持标准 RESTful JSON(兼容 APP)。
- 安全基线:防 SQL 注入(参数化查询/Sequelize 参数绑定、禁止字符串拼 SQL),防 XSS(前端统一转义输出、后端对输入做校验与白名单)。
- 前端页面样式参考客户管理模块样式(`client/src/views/customer/**`)。
## Impact
- 影响数据库表:现有 `customer_equipment`、`smart_device`(不新增表,不强改已有字段,若需补充字段走 migration)。
- 新增后端文件:`customer_equipment` 与 `smart_device` 的 controller / service / dto / entity。
- 新增前端文件:设备台账页面、设备型号目录页面、对应 api 封装、路由调整。
- 复用现有:`customer_building`、`customer_room`、鉴权中间件(auth/rbac)、上传能力。
## ADDED Requirements
### Requirement: 客户设备台账管理
系统 SHALL 提供客户设备台账的增删改查、分页列表、按客户过滤、按建筑/楼层/位置筛选。
- 设备字段:设备编码(唯一)、客户ID、设备名称、设备类型(配电间/配电井/配电箱)、所属建筑、楼层、位置、描述、备注、照片。
- 设备编码唯一性校验,重复需返回明确错误。
#### Scenario: 查询列表
- **WHEN** 用户带 `customerId` 与分页参数请求设备台账列表
- **THEN** 返回该客户下已关联的设备分页数据,并按创建时间倒序
#### Scenario: 创建/更新设备
- **WHEN** 用户提交设备表单
- **THEN** 系统校验必填字段与设备编码唯一性后写入数据库,并关联客户
#### Scenario: 删除设备
- **WHEN** 用户删除某设备
- **THEN** 系统删除该设备记录
### Requirement: 智电设备型号目录
系统 SHALL 提供智电设备型号的增删改查与分页列表,类型字段使用设备类型字典(网关/探测器/采集器等)。
#### Scenario: 型号列表与维护
- **WHEN** 用户访问型号目录并执行 CRUD
- **THEN** 型号数据正确维护,类型展示为可读字典名称
### Requirement: 空间拓扑与用电架构
系统 SHALL 提供设备在空间(建筑→楼层→位置)下的拓扑化展示,复用现有拓扑页面能力,设备数据来源于设备台账接口。
#### Scenario: 查看某客户空间拓扑
- **WHEN** 用户进入某客户的空间拓扑页
- **THEN** 按建筑/楼层聚合展示设备位置与用电结构
### Requirement: 接口鉴权与 APP 兼容
系统 SHALL 对所有设备相关 `/api/*` 端点启用 JWT + RBAC 鉴权;接口保持标准 RESTful JSON 返回,兼容后端 web 前端与 APP 直接调用。
#### Scenario: 未授权访问
- **WHEN** 请求未携带有效 token
- **THEN** 返回 401,不返回业务数据
#### Scenario: 无权限访问
- **WHEN** 已登录但角色无对应权限码
- **THEN** 返回 403
### Requirement: 防 SQL 注入与防 XSS
系统 SHALL 使用参数化查询(Sequelize 参数绑定),禁止通过字符串拼接 SQL;对所有用户可控输入在写入前做校验与过滤,前端展示输出统一转义以防 XSS。
#### Scenario: 恶意输入处理
- **WHEN** 用户提交含 SQL 注入或脚本片段的输入
- **THEN** 输入被当作普通数据安全落库或拦截,前端展示不执行任何脚本
## MODIFIED Requirements
### Requirement: 设备监控占位路由
`client/src/router/index.ts` 中 `/device`(name: Device, permission: device:list)占位组件从 Placeholder.vue 替换为真实设备管理入口。
## REMOVED Requirements
(无)
## 参考实现
- 后端结构参考:`server/src/controller/customer.controller.ts` 及 service/dto/entity 目录。
- 前端样式参考:`client/src/views/customer/info/index.vue`、`client/src/api/customer.ts`。
- 鉴权中间件:`server/src/middleware/auth.middleware.ts`、`server/src/middleware/rbac.middleware.ts`。