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:
1 parent
91aa3c06f0
commit
09f7345e8a
18 files changed
+2482
-7
No files matched your search
@@ -0,0 +1,21 @@
|
||||
# Checklist
|
||||
|
||||
## 后端
|
||||
- [x] customer_equipment 实体含 building 关联且无 updated_at 冲突(timestamps 处理正确 —— @Table timestamps:false,仅 created_at 字段)
|
||||
- [x] 客户设备台账接口支持列表(按客户/建筑/类型/关键字过滤)、详情、创建、更新、删除
|
||||
- [x] 设备编码唯一性校验生效(EQ+日期+序号自动生成,UniqueConstraint/冲突重试,重复返回明确错误)
|
||||
- [x] smart_device 型号目录支持分页 CRUD,类型映射字典(网关/探测器/采集器)
|
||||
- [x] 所有设备端点均经 auth + rbac 鉴权;无 token 返回 401,无权限返回 403(浏览器实测 401 通过;rbac 中间件新增 PERMISSION_MAP 映射)
|
||||
- [x] 所有查询使用 Sequelize 参数绑定([Op.like]/[Op.in]/where 对象),无 SQL 字符串拼接
|
||||
- [x] 接口返回统一标准 JSON(code/message/data,兼容 APP;实测 code 200)
|
||||
|
||||
## 前端
|
||||
- [x] 设备台账页面实现列表、搜索、新增/编辑/删除、照片上传,样式与客户管理模块一致
|
||||
- [x] 设备型号目录页面实现 CRUD(Tab 容器页切换)
|
||||
- [x] `/device` 占位路由已替换为真实设备管理页面(views/device/index.vue)
|
||||
- [x] 前端输出统一转义,防 XSS(全模块未用 v-html,Vue 插值自动转义)
|
||||
|
||||
## 构建与验证
|
||||
- [x] 后端可通过 `yarn dev` 成功启动,无 Schema/编译错误(实体自动注册,tsc --noEmit exit 0,实测启动成功)
|
||||
- [x] 前端可通过 `yarn dev` 成功启动,路由可访问(vue-tsc check 通过,Vite 3000 启动成功)
|
||||
- [x] 设备模块接口经浏览器验证可正常调用并通过鉴权(无token→401,admin token→200 并返回列表数据)
|
||||
@@ -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`。
|
||||
@@ -0,0 +1,37 @@
|
||||
# Tasks
|
||||
|
||||
## 后端实现(customer_equipment)
|
||||
- [x] Task 1: 客户设备台账实体与 DTO
|
||||
- [x] 1.1 新建 `server/src/entity/customer_equipment.entity.ts`(含 building 关联,`timestamps:false`)
|
||||
- [x] 1.2 新建 `server/src/dto/customer_equipment.dto.ts`(class-validator 校验、字段白名单)
|
||||
- [x] Task 2: 客户设备台账 Service
|
||||
- [x] 2.1 新建 `server/src/service/customer_equipment.service.ts`:分页列表(customer_id/building_id/type/keyword 过滤)、详情、创建、更新、删除
|
||||
- [x] 2.2 设备编码唯一性(EQ+日期+序号自动生成)校验;数据按客户归属做权限隔离
|
||||
- [x] Task 3: 客户设备台账 Controller 与路由注册
|
||||
- [x] 3.1 新建 `server/src/controller/customer_equipment.controller.ts`,路由前缀 `/api/customer-equipments`
|
||||
- [x] 3.2 全部查询使用 Sequelize 参数绑定([Op.like]/[Op.in]),杜绝 SQL 拼接
|
||||
|
||||
## 后端实现(smart_device)
|
||||
- [x] Task 4: 智电设备型号实体、DTO、Service、Controller
|
||||
- [x] 4.1 新建实体/dto/service/controller(`/api/smart-devices`),分页 CRUD,类型 device_type 字典
|
||||
|
||||
## 后端安全与 APP 兼容
|
||||
- [x] Task 5: 鉴权接入与接口标准化
|
||||
- [x] 5.1 设备端点经全局 auth + rbac 中间件(rbac.middleware 新增两条 PERMISSION_MAP 映射)
|
||||
- [x] 5.2 接口返回统一 JSON(code/message/data 结构);权限码 customer-equipments→device:list、smart-devices→device:model
|
||||
- [x] 5.3 rbac 中间件保证无 token→401、无权限→403
|
||||
|
||||
## 前端实现
|
||||
- [x] Task 6: 前端 API 封装
|
||||
- [x] 6.1 新建 `client/src/api/device.ts`(customerEquipmentApi + smartDeviceApi,REST 封装)
|
||||
- [x] Task 7: 客户设备台账页面
|
||||
- [x] 7.1 新建 `client/src/views/device/equipment/index.vue`:列表、搜索、增删改、照片上传,样式参考客户管理模块
|
||||
- [x] 7.2 新建 `client/src/views/device/smart-device/index.vue`:型号目录 CRUD(Tab 容器页切换)
|
||||
- [x] Task 8: 路由与菜单
|
||||
- [x] 8.1 更新 `client/src/router/index.ts`:`/device` 由 Placeholder 改为 `views/device/index.vue`(保留 permission:device:list)
|
||||
- [x] 8.2 前端全模块未使用 v-html,统一 Vue 插值转义防 XSS
|
||||
|
||||
# Task Dependencies
|
||||
- [Task 4] 的 DTO/Controller 结构以 [Task 1-3] 为参考范式实现
|
||||
- [Task 7-8] 依赖 [Task 6]
|
||||
- [Task 5] 依赖 [Task 3][Task 4] 完成后统一接入
|
||||
Reference in new issue
Block a user