feat(ems): 添加通用一键清空功能

- 新增 CommonClearController、CommonClearService、CommonClearMapper 和 XML 文件
- 实现了通用的数据清空接口和后端逻辑
- 在前端多个页面添加了一键清空按钮和相关配置
- 编写了清空功能的快速应用指南文档
boardTest
zch 2 weeks ago
parent b51eac9bac
commit 943558fac3

@ -0,0 +1,149 @@
# 一键全部清空功能 - 超简化版本
## 🎯 设计理念
**后端只有一个通用接口**,通过业务模块标识匹配表名,前端配置极简。
## 🔧 后端架构(已完成)
### 核心组件
- ✅ `CommonClearController` - 通用清空控制器
- ✅ `CommonClearService` - 通用清空服务
- ✅ `CommonClearMapper` - 通用清空数据访问层
### 安全措施
1. **白名单机制** - 只允许清空预定义的表
2. **表名验证** - 正则校验防止SQL注入
3. **权限检查** - 动态权限验证
4. **SQL关键字过滤** - 防止恶意攻击
5. **长度限制** - 表名长度控制
6. **操作日志** - 完整的审计日志
## 🚀 前端快速集成3步完成
### 步骤1添加按钮导入按钮后
```vue
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
@click="handleClearAll"
v-hasPermi="['你的权限:remove']"
>一键全部清空</el-button>
</el-col>
```
### 步骤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
<!-- 1. 添加按钮 -->
<el-col :span="1.5">
<el-button type="danger" plain icon="el-icon-delete"
size="mini" @click="handleClearAll"
v-hasPermi="['ems/info:dailyFaultRecord:remove']">
一键全部清空
</el-button>
</el-col>
<script>
// 2. 导入mixin
import clearAllMixin from "@/mixins/clearAllMixin";
export default {
mixins: [clearAllMixin],
created() {
// 3. 配置模块
this.clearAllConfig = {
moduleKey: 'dailyFaultRecord',
entityName: '日常故障记录',
permission: 'ems/info:dailyFaultRecord:remove'
};
}
}
</script>
```
### 故障处置记录页面(示例)
```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分钟搞定

@ -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));
}
}
}
}

@ -151,6 +151,16 @@
v-hasPermi="['ems/info:dailyFaultRecord:add']" v-hasPermi="['ems/info:dailyFaultRecord:add']"
>导入</el-button> >导入</el-button>
</el-col> </el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
@click="handleClearAll"
v-hasPermi="['ems/info:dailyFaultRecord:remove']"
>一键全部清空</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar> <right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
</el-row> </el-row>
@ -385,9 +395,11 @@
<script> <script>
import { listDailyFaultRecord, getDailyFaultRecord, delDailyFaultRecord, addDailyFaultRecord, updateDailyFaultRecord } from "@/api/ems/info/dailyFaultRecord"; import { listDailyFaultRecord, getDailyFaultRecord, delDailyFaultRecord, addDailyFaultRecord, updateDailyFaultRecord } from "@/api/ems/info/dailyFaultRecord";
import { checkPermi } from "@/utils/permission"; import { checkPermi } from "@/utils/permission";
import clearAllMixin from "@/mixins/clearAllMixin";
export default { export default {
name: "DailyFaultRecord", name: "DailyFaultRecord",
mixins: [clearAllMixin],
data() { data() {
return { return {
// //
@ -472,6 +484,13 @@
this.getList(); this.getList();
this.upload.url = process.env.VUE_APP_BASE_API + "/ems/info/dailyFaultRecord/importData"; this.upload.url = process.env.VUE_APP_BASE_API + "/ems/info/dailyFaultRecord/importData";
this.upload.headers = { Authorization: "Bearer " + this.$store.getters.token }; this.upload.headers = { Authorization: "Bearer " + this.$store.getters.token };
//
this.clearAllConfig = {
moduleKey: 'dailyFaultRecord',
entityName: '日常故障记录',
permission: 'ems/info:dailyFaultRecord:remove'
};
}, },
mounted() { mounted() {
// //

@ -108,6 +108,16 @@
v-hasPermi="['ems/info:faultHandlingRecord:add']" v-hasPermi="['ems/info:faultHandlingRecord:add']"
>导入</el-button> >导入</el-button>
</el-col> </el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
@click="handleClearAll"
v-hasPermi="['ems/info:faultHandlingRecord:remove']"
>一键全部清空</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar> <right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
</el-row> </el-row>
@ -332,9 +342,11 @@
<script> <script>
import { listFaultHandlingRecord, getFaultHandlingRecord, delFaultHandlingRecord, addFaultHandlingRecord, updateFaultHandlingRecord } from "@/api/ems/info/faultHandlingRecord"; import { listFaultHandlingRecord, getFaultHandlingRecord, delFaultHandlingRecord, addFaultHandlingRecord, updateFaultHandlingRecord } from "@/api/ems/info/faultHandlingRecord";
import { checkPermi } from "@/utils/permission"; import { checkPermi } from "@/utils/permission";
import clearAllMixin from "@/mixins/clearAllMixin";
export default { export default {
name: "FaultHandlingRecord", name: "FaultHandlingRecord",
mixins: [clearAllMixin],
data() { data() {
return { return {
// //
@ -414,7 +426,13 @@
left: '0px', left: '0px',
top: '0px' top: '0px'
}, },
contextMenuRow: null contextMenuRow: null,
//
clearAllConfig: {
moduleKey: 'faultHandlingRecord',
entityName: '故障处置记录',
permission: 'ems/info:faultHandlingRecord:remove'
},
}; };
}, },
created() { created() {

@ -204,6 +204,16 @@
v-hasPermi="['ems/info:plcBufferBatteryLifecycle:add']" v-hasPermi="['ems/info:plcBufferBatteryLifecycle:add']"
>导入</el-button> >导入</el-button>
</el-col> </el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
@click="handleClearAll"
v-hasPermi="['ems/info:plcBufferBatteryLifecycle:remove']"
>一键全部清空</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar> <right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
</el-row> </el-row>
@ -553,9 +563,11 @@
<script> <script>
import { listPlcBufferBatteryLifecycle, getPlcBufferBatteryLifecycle, delPlcBufferBatteryLifecycle, addPlcBufferBatteryLifecycle, updatePlcBufferBatteryLifecycle } from "@/api/ems/info/plcBufferBatteryLifecycle"; import { listPlcBufferBatteryLifecycle, getPlcBufferBatteryLifecycle, delPlcBufferBatteryLifecycle, addPlcBufferBatteryLifecycle, updatePlcBufferBatteryLifecycle } from "@/api/ems/info/plcBufferBatteryLifecycle";
import { checkPermi } from "@/utils/permission"; import { checkPermi } from "@/utils/permission";
import clearAllMixin from "@/mixins/clearAllMixin";
export default { export default {
name: "PlcBufferBatteryLifecycle", name: "PlcBufferBatteryLifecycle",
mixins: [clearAllMixin],
data() { data() {
return { return {
// //
@ -652,7 +664,13 @@
left: '0px', left: '0px',
top: '0px' top: '0px'
}, },
contextMenuRow: null contextMenuRow: null,
//
clearAllConfig: {
moduleKey: 'plcBufferBatteryLifecycle',
entityName: 'PLC缓冲电池生命周期',
permission: 'ems/info:plcBufferBatteryLifecycle:remove'
},
}; };
}, },
created() { created() {

@ -208,6 +208,16 @@
v-hasPermi="['ems/info:securityDoorBatteryLifecycle:add']" v-hasPermi="['ems/info:securityDoorBatteryLifecycle:add']"
>导入</el-button> >导入</el-button>
</el-col> </el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
@click="handleClearAll"
v-hasPermi="['ems/info:securityDoorBatteryLifecycle:remove']"
>一键全部清空</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar> <right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
</el-row> </el-row>
@ -631,9 +641,11 @@
<script> <script>
import { listSecurityDoorBatteryLifecycle, getSecurityDoorBatteryLifecycle, delSecurityDoorBatteryLifecycle, addSecurityDoorBatteryLifecycle, updateSecurityDoorBatteryLifecycle } from "@/api/ems/info/securityDoorBatteryLifecycle"; import { listSecurityDoorBatteryLifecycle, getSecurityDoorBatteryLifecycle, delSecurityDoorBatteryLifecycle, addSecurityDoorBatteryLifecycle, updateSecurityDoorBatteryLifecycle } from "@/api/ems/info/securityDoorBatteryLifecycle";
import { checkPermi } from "@/utils/permission"; import { checkPermi } from "@/utils/permission";
import clearAllMixin from "@/mixins/clearAllMixin";
export default { export default {
name: "SecurityDoorBatteryLifecycle", name: "SecurityDoorBatteryLifecycle",
mixins: [clearAllMixin],
data() { data() {
return { return {
// //
@ -725,6 +737,12 @@
top: 0, top: 0,
left: 0, left: 0,
row: null row: null
},
//
clearAllConfig: {
moduleKey: 'securityDoorBatteryLifecycle',
entityName: '安全门电池生命周期',
permission: 'ems/info:securityDoorBatteryLifecycle:remove'
} }
}; };
}, },
@ -846,135 +864,4 @@
handleExport() { handleExport() {
this.download('ems/info/securityDoorBatteryLifecycle/export', { this.download('ems/info/securityDoorBatteryLifecycle/export', {
...this.queryParams ...this.queryParams
}, `securityDoorBatteryLifecycle_${new Date().getTime()}.xlsx`) }, `
},
/** 导入按钮操作 */
handleImport() {
this.upload.title = "导入行李系统安全门铅酸电池生命周期";
this.upload.open = true;
},
/** 下载模板操作 */
importTemplate() {
this.download('ems/info/securityDoorBatteryLifecycle/importTemplate', {
}, `安全门电池生命周期数据模板_${new Date().getTime()}.xlsx`)
},
//
handleFileUploadProgress(event, file, fileList) {
this.upload.isUploading = true;
},
//
handleFileSuccess(response, file, fileList) {
this.upload.open = false;
this.upload.isUploading = false;
this.$refs.upload.clearFiles();
this.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", { dangerouslyUseHTMLString: true });
this.getList();
},
//
submitFileForm() {
this.$refs.upload.submit();
},
//
handleViewDetail(row) {
this.currentRecord = { ...row };
this.detailDrawer = true;
},
//
handleRowContextMenu(row, column, event) {
event.preventDefault();
this.contextMenu.row = row;
this.contextMenu.visible = true;
//
const x = event.clientX;
const y = event.clientY;
const menuWidth = 120;
const menuHeight = 120;
const windowWidth = window.innerWidth;
const windowHeight = window.innerHeight;
this.contextMenu.left = (x + menuWidth > windowWidth) ? x - menuWidth : x;
this.contextMenu.top = (y + menuHeight > windowHeight) ? y - menuHeight : y;
},
//
hideContextMenu() {
this.contextMenu.visible = false;
},
// -
contextMenuViewDetail() {
if (this.contextMenu.row) {
this.handleViewDetail(this.contextMenu.row);
}
this.hideContextMenu();
},
// -
contextMenuEdit() {
if (this.contextMenu.row && this.checkPermi(['ems/info:securityDoorBatteryLifecycle:edit'])) {
this.handleUpdate(this.contextMenu.row);
}
this.hideContextMenu();
},
// -
contextMenuDelete() {
if (this.contextMenu.row && this.checkPermi(['ems/info:securityDoorBatteryLifecycle:remove'])) {
this.handleDelete(this.contextMenu.row);
}
this.hideContextMenu();
},
//
checkPermi(permissions) {
return checkPermi(permissions);
}
}
};
</script>
<style scoped>
.context-menu-table tbody tr:hover {
cursor: context-menu;
}
.context-menu {
background: white;
border: 1px solid #ebeef5;
border-radius: 4px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
padding: 4px 0;
min-width: 120px;
}
.context-menu-item {
padding: 8px 16px;
cursor: pointer;
font-size: 14px;
color: #606266;
display: flex;
align-items: center;
}
.context-menu-item:hover {
background-color: #f5f7fa;
color: #409eff;
}
.context-menu-item i {
margin-right: 8px;
font-size: 14px;
}
.el-descriptions__label {
width: 90px !important;
}
@media (max-width: 768px) {
.el-drawer {
width: 90% !important;
}
}
@media print {
.context-menu {
display: none !important;
}
}
</style>

@ -124,6 +124,16 @@
v-hasPermi="['ems/info:sparePartsRegistration:export']" v-hasPermi="['ems/info:sparePartsRegistration:export']"
>导出</el-button> >导出</el-button>
</el-col> </el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
@click="handleClearAll"
v-hasPermi="['ems/info:sparePartsRegistration:remove']"
>一键全部清空</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar> <right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
</el-row> </el-row>
@ -349,11 +359,19 @@
import { listSparePartsRegistration, getSparePartsRegistration, delSparePartsRegistration, addSparePartsRegistration, updateSparePartsRegistration } from "@/api/ems/info/sparePartsRegistration"; import { listSparePartsRegistration, getSparePartsRegistration, delSparePartsRegistration, addSparePartsRegistration, updateSparePartsRegistration } from "@/api/ems/info/sparePartsRegistration";
import { getToken } from "@/utils/auth"; import { getToken } from "@/utils/auth";
import { checkPermi } from "@/utils/permission"; import { checkPermi } from "@/utils/permission";
import clearAllMixin from "@/mixins/clearAllMixin";
export default { export default {
name: "SparePartsRegistration", name: "SparePartsRegistration",
mixins: [clearAllMixin],
data() { data() {
return { return {
//
clearAllConfig: {
moduleKey: 'sparePartsRegistration',
entityName: '废旧备件登记',
permission: 'ems/info:sparePartsRegistration:remove'
},
// //
loading: true, loading: true,
// //

@ -148,6 +148,16 @@
v-hasPermi="['ems/info:sparePartsUsageRecord:export']" v-hasPermi="['ems/info:sparePartsUsageRecord:export']"
>导出</el-button> >导出</el-button>
</el-col> </el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
@click="handleClearAll"
v-hasPermi="['ems/info:sparePartsUsageRecord:remove']"
>一键全部清空</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar> <right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
</el-row> </el-row>
@ -406,11 +416,19 @@
import { listSparePartsUsageRecord, getSparePartsUsageRecord, delSparePartsUsageRecord, addSparePartsUsageRecord, updateSparePartsUsageRecord } from "@/api/ems/info/sparePartsUsageRecord"; import { listSparePartsUsageRecord, getSparePartsUsageRecord, delSparePartsUsageRecord, addSparePartsUsageRecord, updateSparePartsUsageRecord } from "@/api/ems/info/sparePartsUsageRecord";
import { getToken } from "@/utils/auth"; import { getToken } from "@/utils/auth";
import { checkPermi } from "@/utils/permission"; import { checkPermi } from "@/utils/permission";
import clearAllMixin from "@/mixins/clearAllMixin";
export default { export default {
name: "SparePartsUsageRecord", name: "SparePartsUsageRecord",
mixins: [clearAllMixin],
data() { data() {
return { return {
//
clearAllConfig: {
moduleKey: 'sparePartsUsageRecord',
entityName: '备件领用记录',
permission: 'ems/info:sparePartsUsageRecord:remove'
},
// //
loading: true, loading: true,
// //

@ -156,6 +156,16 @@
v-hasPermi="['ems/info:supervisionChecklist:export']" v-hasPermi="['ems/info:supervisionChecklist:export']"
>导出</el-button> >导出</el-button>
</el-col> </el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
@click="handleClearAll"
v-hasPermi="['ems/info:supervisionChecklist:remove']"
>一键全部清空</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar> <right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
</el-row> </el-row>
@ -464,11 +474,19 @@
<script> <script>
import { listSupervisionChecklist, getSupervisionChecklist, delSupervisionChecklist, addSupervisionChecklist, updateSupervisionChecklist } from "@/api/ems/info/supervisionChecklist"; import { listSupervisionChecklist, getSupervisionChecklist, delSupervisionChecklist, addSupervisionChecklist, updateSupervisionChecklist } from "@/api/ems/info/supervisionChecklist";
import { checkPermi } from "@/utils/permission"; import { checkPermi } from "@/utils/permission";
import clearAllMixin from "@/mixins/clearAllMixin";
export default { export default {
name: "SupervisionChecklist", name: "SupervisionChecklist",
mixins: [clearAllMixin],
data() { data() {
return { return {
//
clearAllConfig: {
moduleKey: 'supervisionChecklist',
entityName: '监督检查清单',
permission: 'ems/info:supervisionChecklist:remove'
},
// //
loading: true, loading: true,
// //

@ -212,6 +212,16 @@
v-hasPermi="['ems/info:upsBatteryLifecycle:add']" v-hasPermi="['ems/info:upsBatteryLifecycle:add']"
>导入</el-button> >导入</el-button>
</el-col> </el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
@click="handleClearAll"
v-hasPermi="['ems/info:upsBatteryLifecycle:remove']"
>一键全部清空</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar> <right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
</el-row> </el-row>
@ -620,11 +630,19 @@
import { listUpsBatteryLifecycle, getUpsBatteryLifecycle, delUpsBatteryLifecycle, addUpsBatteryLifecycle, updateUpsBatteryLifecycle } from "@/api/ems/info/upsBatteryLifecycle"; import { listUpsBatteryLifecycle, getUpsBatteryLifecycle, delUpsBatteryLifecycle, addUpsBatteryLifecycle, updateUpsBatteryLifecycle } from "@/api/ems/info/upsBatteryLifecycle";
import { getToken } from "@/utils/auth"; import { getToken } from "@/utils/auth";
import { checkPermi } from "@/utils/permission"; import { checkPermi } from "@/utils/permission";
import clearAllMixin from "@/mixins/clearAllMixin";
export default { export default {
name: "UpsBatteryLifecycle", name: "UpsBatteryLifecycle",
mixins: [clearAllMixin],
data() { data() {
return { return {
//
clearAllConfig: {
moduleKey: 'upsBatteryLifecycle',
entityName: 'UPS电池生命周期',
permission: 'ems/info:upsBatteryLifecycle:remove'
},
// //
loading: true, loading: true,
// //

Loading…
Cancel
Save