From 943558fac344e37ef8625197d752747a06cf43ed Mon Sep 17 00:00:00 2001 From: zch Date: Sun, 8 Jun 2025 14:55:04 +0800 Subject: [PATCH] =?UTF-8?q?feat(ems):=20=E6=B7=BB=E5=8A=A0=E9=80=9A?= =?UTF-8?q?=E7=94=A8=E4=B8=80=E9=94=AE=E6=B8=85=E7=A9=BA=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 CommonClearController、CommonClearService、CommonClearMapper 和 XML 文件 - 实现了通用的数据清空接口和后端逻辑 - 在前端多个页面添加了一键清空按钮和相关配置 - 编写了清空功能的快速应用指南文档 --- README-清空功能快速应用.md | 149 +++++++++++++++++ src/mixins/clearAllMixin.js | 96 +++++++++++ src/views/ems/info/dailyFaultRecord/index.vue | 19 +++ .../ems/info/faultHandlingRecord/index.vue | 20 ++- .../info/plcBufferBatteryLifecycle/index.vue | 20 ++- .../securityDoorBatteryLifecycle/index.vue | 151 +++--------------- .../ems/info/sparePartsRegistration/index.vue | 18 +++ .../ems/info/sparePartsUsageRecord/index.vue | 18 +++ .../ems/info/supervisionChecklist/index.vue | 18 +++ .../ems/info/upsBatteryLifecycle/index.vue | 18 +++ 10 files changed, 393 insertions(+), 134 deletions(-) create mode 100644 README-清空功能快速应用.md create mode 100644 src/mixins/clearAllMixin.js diff --git a/README-清空功能快速应用.md b/README-清空功能快速应用.md new file mode 100644 index 0000000..323fe52 --- /dev/null +++ b/README-清空功能快速应用.md @@ -0,0 +1,149 @@ +# 一键全部清空功能 - 超简化版本 + +## 🎯 设计理念 + +**后端只有一个通用接口**,通过业务模块标识匹配表名,前端配置极简。 + +## 🔧 后端架构(已完成) + +### 核心组件 +- ✅ `CommonClearController` - 通用清空控制器 +- ✅ `CommonClearService` - 通用清空服务 +- ✅ `CommonClearMapper` - 通用清空数据访问层 + +### 安全措施 +1. **白名单机制** - 只允许清空预定义的表 +2. **表名验证** - 正则校验,防止SQL注入 +3. **权限检查** - 动态权限验证 +4. **SQL关键字过滤** - 防止恶意攻击 +5. **长度限制** - 表名长度控制 +6. **操作日志** - 完整的审计日志 + +## 🚀 前端快速集成(3步完成) + +### 步骤1:添加按钮(导入按钮后) +```vue + + 一键全部清空 + +``` + +### 步骤2:导入mixin +```javascript +import clearAllMixin from "@/mixins/clearAllMixin"; + +export default { + name: "YourComponent", + mixins: [clearAllMixin], + // ... 其他代码 +} +``` + +### 步骤3:配置模块信息(created钩子中) +```javascript +created() { + // 其他代码... + + // 配置清空功能(仅需3个参数) + this.clearAllConfig = { + moduleKey: '模块标识', // 见下方支持的模块列表 + entityName: '显示名称', // 如:'日常故障记录' + permission: '权限标识' // 如:'ems/info:dailyFaultRecord:remove' + }; +} +``` + +## 📋 支持的模块列表(后端已配置) + +| 模块标识 | 实体名称 | 权限标识 | +|---------|---------|---------| +| `dailyFaultRecord` | 日常故障记录 | `ems/info:dailyFaultRecord:remove` | +| `faultHandlingRecord` | 故障处置记录 | `ems/info:faultHandlingRecord:remove` | +| `plcBufferBatteryLifecycle` | PLC缓冲电池生命周期 | `ems/info:plcBufferBatteryLifecycle:remove` | +| `securityDoorBatteryLifecycle` | 安全门电池生命周期 | `ems/info:securityDoorBatteryLifecycle:remove` | +| `upsBatteryLifecycle` | UPS电池生命周期 | `ems/info:upsBatteryLifecycle:remove` | +| `sparePartsInventory` | 备件库记录 | `ems/info:sparePartsInventory:remove` | +| `sparePartsUsageRecord` | 备件领用记录 | `ems/info:sparePartsUsageRecord:remove` | +| `sparePartsRegistration` | 废旧备件登记 | `ems/info:sparePartsRegistration:remove` | +| `supervisionChecklist` | 监督检查清单 | `ems/info:supervisionChecklist:remove` | +| `sparePartsInventoryCheck` | 备件盘点记录 | `ems/info:sparePartsInventoryCheck:remove` | + +## 💡 实际应用示例 + +### 日常故障记录页面(已完成) +```vue + + + + 一键全部清空 + + + + +``` + +### 故障处置记录页面(示例) +```javascript +// 只需要修改配置 +this.clearAllConfig = { + moduleKey: 'faultHandlingRecord', + entityName: '故障处置记录', + permission: 'ems/info:faultHandlingRecord:remove' +}; +``` + +## ⚡ 添加新模块支持 + +如需要支持新模块,只需要在后端 `CommonClearController` 的白名单中添加: + +```java +put("新模块标识", new TableInfo("数据库表名", "显示名称", "权限标识")); +``` + +## 🛡️ 安全特性 + +1. **三次确认机制** - 确保用户真的要执行操作 +2. **白名单限制** - 只能清空预定义的表 +3. **权限验证** - 检查用户权限 +4. **SQL安全** - 防止注入攻击 +5. **操作审计** - 记录所有操作日志 + +## 📈 开发效率对比 + +| 方案 | 后端代码量 | 前端集成步骤 | 新增模块成本 | +|-----|-----------|-------------|-------------| +| 原方案 | 每模块5个文件 | 8步 | 高 | +| **新方案** | **1个通用接口** | **3步** | **极低** | + +## 🎉 总结 + +- **后端**:一次开发,永久使用 +- **前端**:复制粘贴,秒级集成 +- **维护**:集中管理,安全可控 +- **扩展**:新增模块只需添加一行配置 + +现在为任何页面添加清空功能,只需要3步,2分钟搞定! \ No newline at end of file diff --git a/src/mixins/clearAllMixin.js b/src/mixins/clearAllMixin.js new file mode 100644 index 0000000..6100c8d --- /dev/null +++ b/src/mixins/clearAllMixin.js @@ -0,0 +1,96 @@ +import request from '@/utils/request' + +export default { + data() { + return { + // 清空相关配置,需要在组件中设置 + clearAllConfig: { + moduleKey: '', // 业务模块标识,如:'dailyFaultRecord' + entityName: '', // 实体名称,如:'日常故障记录' + permission: '' // 权限标识,如:'ems/info:dailyFaultRecord:remove' + } + } + }, + methods: { + /** + * 一键全部清空数据 + */ + async handleClearAll() { + try { + // 配置验证 + if (!this.clearAllConfig.moduleKey) { + this.$modal.msgError('清空功能配置错误:未设置模块标识'); + return; + } + + // 第一次确认 + await this.$confirm( + `确定要清空所有${this.clearAllConfig.entityName}数据吗?此操作将删除所有记录!`, + '危险操作警告', + { + confirmButtonText: '继续', + cancelButtonText: '取消', + type: 'warning', + confirmButtonClass: 'el-button--danger' + } + ); + + // 第二次确认 + await this.$confirm( + `再次确认:您真的要删除所有${this.clearAllConfig.entityName}数据吗?\n此操作不可撤销!`, + '二次确认', + { + confirmButtonText: '确认删除', + cancelButtonText: '取消', + type: 'error', + confirmButtonClass: 'el-button--danger' + } + ); + + // 第三次确认 - 输入确认 + const { value } = await this.$prompt( + `最后确认:请输入"确认清空"来完成操作`, + '三次确认', + { + confirmButtonText: '执行清空', + cancelButtonText: '取消', + inputPattern: /^确认清空$/, + inputErrorMessage: '请输入"确认清空"', + inputPlaceholder: '请输入:确认清空', + type: 'error', + confirmButtonClass: 'el-button--danger' + } + ); + + if (value === '确认清空') { + // 执行清空操作 + await this.executeClearAll(); + } + } catch (error) { + // 用户取消操作 + if (error !== 'cancel' && error !== 'close') { + this.$modal.msgError('清空操作失败:' + error.message); + } + } + }, + + /** + * 执行清空操作 + * 调用通用的后端接口 + */ + async executeClearAll() { + try { + const response = await request({ + url: `/ems/common/clearAll/${this.clearAllConfig.moduleKey}`, + method: 'delete' + }); + + this.$modal.msgSuccess(response.msg || `${this.clearAllConfig.entityName}数据已全部清空`); + // 刷新列表 + this.getList && this.getList(); + } catch (error) { + this.$modal.msgError('清空操作失败:' + (error.message || error)); + } + } + } +} \ No newline at end of file diff --git a/src/views/ems/info/dailyFaultRecord/index.vue b/src/views/ems/info/dailyFaultRecord/index.vue index 297923c..eb721cd 100644 --- a/src/views/ems/info/dailyFaultRecord/index.vue +++ b/src/views/ems/info/dailyFaultRecord/index.vue @@ -151,6 +151,16 @@ v-hasPermi="['ems/info:dailyFaultRecord:add']" >导入 + + 一键全部清空 + @@ -385,9 +395,11 @@ - - + }, ` \ No newline at end of file diff --git a/src/views/ems/info/sparePartsRegistration/index.vue b/src/views/ems/info/sparePartsRegistration/index.vue index ba0a4bd..b03b029 100644 --- a/src/views/ems/info/sparePartsRegistration/index.vue +++ b/src/views/ems/info/sparePartsRegistration/index.vue @@ -124,6 +124,16 @@ v-hasPermi="['ems/info:sparePartsRegistration:export']" >导出 + + 一键全部清空 + @@ -349,11 +359,19 @@ import { listSparePartsRegistration, getSparePartsRegistration, delSparePartsRegistration, addSparePartsRegistration, updateSparePartsRegistration } from "@/api/ems/info/sparePartsRegistration"; import { getToken } from "@/utils/auth"; import { checkPermi } from "@/utils/permission"; + import clearAllMixin from "@/mixins/clearAllMixin"; export default { name: "SparePartsRegistration", + mixins: [clearAllMixin], data() { return { + // 清空功能配置 + clearAllConfig: { + moduleKey: 'sparePartsRegistration', + entityName: '废旧备件登记', + permission: 'ems/info:sparePartsRegistration:remove' + }, // 遮罩层 loading: true, // 选中数组 diff --git a/src/views/ems/info/sparePartsUsageRecord/index.vue b/src/views/ems/info/sparePartsUsageRecord/index.vue index ddaf998..6934345 100644 --- a/src/views/ems/info/sparePartsUsageRecord/index.vue +++ b/src/views/ems/info/sparePartsUsageRecord/index.vue @@ -148,6 +148,16 @@ v-hasPermi="['ems/info:sparePartsUsageRecord:export']" >导出 + + 一键全部清空 + @@ -406,11 +416,19 @@ import { listSparePartsUsageRecord, getSparePartsUsageRecord, delSparePartsUsageRecord, addSparePartsUsageRecord, updateSparePartsUsageRecord } from "@/api/ems/info/sparePartsUsageRecord"; import { getToken } from "@/utils/auth"; import { checkPermi } from "@/utils/permission"; + import clearAllMixin from "@/mixins/clearAllMixin"; export default { name: "SparePartsUsageRecord", + mixins: [clearAllMixin], data() { return { + // 清空功能配置 + clearAllConfig: { + moduleKey: 'sparePartsUsageRecord', + entityName: '备件领用记录', + permission: 'ems/info:sparePartsUsageRecord:remove' + }, // 遮罩层 loading: true, // 选中数组 diff --git a/src/views/ems/info/supervisionChecklist/index.vue b/src/views/ems/info/supervisionChecklist/index.vue index 13af0cd..4ff0e95 100644 --- a/src/views/ems/info/supervisionChecklist/index.vue +++ b/src/views/ems/info/supervisionChecklist/index.vue @@ -156,6 +156,16 @@ v-hasPermi="['ems/info:supervisionChecklist:export']" >导出 + + 一键全部清空 + @@ -464,11 +474,19 @@