updata:智控台页面添加语言切换,支持中英繁。

This commit is contained in:
rainv123
2025-09-11 17:10:50 +08:00
parent a9b0775469
commit 98a1483032
41 changed files with 3800 additions and 1061 deletions
+109 -48
View File
@@ -3,13 +3,13 @@
<HeaderBar />
<div class="operation-bar">
<h2 class="page-title">字典管理</h2>
<h2 class="page-title">{{ $t('dictManagement.pageTitle') }}</h2>
<div class="action-group">
<div class="search-group">
<el-input placeholder="请输入字典值标签查询" v-model="search" class="search-input" clearable
<el-input :placeholder="$t('dictManagement.searchPlaceholder')" v-model="search" class="search-input" clearable
@keyup.enter.native="handleSearch" style="width: 240px" />
<el-button class="btn-search" @click="handleSearch">
搜索
{{ $t('dictManagement.search') }}
</el-button>
</div>
</div>
@@ -21,22 +21,22 @@
<!-- 左侧字典类型列表 -->
<div class="dict-type-panel">
<div class="dict-type-header">
<el-button type="success" size="mini" @click="showAddDictTypeDialog">新增字典类型</el-button>
<el-button type="success" size="mini" @click="showAddDictTypeDialog">{{ $t('dictManagement.addDictType') }}</el-button>
<el-button type="danger" size="mini" @click="batchDeleteDictType"
:disabled="selectedDictTypes.length === 0">
批量删除字典类型
{{ $t('dictManagement.batchDeleteDictType') }}
</el-button>
</div>
<el-table ref="dictTypeTable" :data="dictTypeList" style="width: 100%" v-loading="dictTypeLoading"
element-loading-text="拼命加载中" element-loading-spinner="el-icon-loading"
element-loading-background="rgba(255, 255, 255, 0.7)" @row-click="handleDictTypeRowClick"
@selection-change="handleDictTypeSelectionChange" :row-class-name="tableRowClassName"
class="dict-type-table">
<el-table-column type="selection" width="55" align="center"></el-table-column>
<el-table-column label="字典类型名称" prop="dictName" align="center"></el-table-column>
<el-table-column label="操作" width="100" align="center">
class="dict-type-table" :header-cell-class-name="headerCellClassName">
<el-table-column type="selection" width="70" align="center" :cell-class-name="selectionCellClassName"></el-table-column>
<el-table-column :label="$t('dictManagement.dictTypeName')" prop="dictName" align="center"></el-table-column>
<el-table-column :label="$t('dictManagement.operation')" width="100" align="center">
<template slot-scope="scope">
<el-button type="text" size="mini" @click.stop="editDictType(scope.row)">编辑</el-button>
<el-button type="text" size="mini" @click.stop="editDictType(scope.row)">{{ $t('dictManagement.edit') }}</el-button>
</template>
</el-table-column>
</el-table>
@@ -50,23 +50,23 @@
element-loading-spinner="el-icon-loading"
element-loading-background="rgba(255, 255, 255, 0.7)" class="data-table"
header-row-class-name="table-header">
<el-table-column label="选择" align="center" width="55">
<el-table-column :label="$t('modelConfig.select')" align="center" width="70">
<template slot-scope="scope">
<el-checkbox v-model="scope.row.selected"></el-checkbox>
</template>
</el-table-column>
<el-table-column label="字典标签" prop="dictLabel" align="center"></el-table-column>
<el-table-column label="字典值" prop="dictValue" align="center"></el-table-column>
<el-table-column label="排序" prop="sort" align="center"></el-table-column>
<el-table-column label="操作" align="center" width="180px">
<el-table-column :label="$t('dictManagement.dictLabel')" prop="dictLabel" align="center"></el-table-column>
<el-table-column :label="$t('dictManagement.dictValue')" prop="dictValue" align="center"></el-table-column>
<el-table-column :label="$t('dictManagement.sort')" prop="sort" align="center"></el-table-column>
<el-table-column :label="$t('dictManagement.operation')" align="center" width="180px">
<template slot-scope="scope">
<el-button type="text" size="mini" @click="editDictData(scope.row)"
class="edit-btn">
修改
{{ $t('dictManagement.edit') }}
</el-button>
<el-button type="text" size="mini" @click="deleteDictData(scope.row)"
class="delete-btn">
删除
{{ $t('dictManagement.delete') }}
</el-button>
</template>
</el-table-column>
@@ -74,36 +74,36 @@
<div class="table-footer">
<div class="batch-actions">
<el-button size="mini" type="primary" @click="selectAllDictData">
{{ isAllDictDataSelected ? '取消全选' : '全选' }}
{{ isAllDictDataSelected ? $t('dictManagement.deselectAll') : $t('dictManagement.selectAll') }}
</el-button>
<el-button type="success" size="mini" @click="showAddDictDataDialog" class="add-btn">
新增字典数据
{{ $t('dictManagement.addDictData') }}
</el-button>
<el-button size="mini" type="danger" icon="el-icon-delete" @click="batchDeleteDictData">
批量删除字典数据
{{ $t('dictManagement.batchDeleteDictData') }}
</el-button>
</div>
<div class="custom-pagination">
<el-select v-model="pageSize" @change="handlePageSizeChange" class="page-size-select">
<el-option v-for="item in pageSizeOptions" :key="item" :label="`${item}条/页`"
<el-option v-for="item in pageSizeOptions" :key="item" :label="$t('dictManagement.itemsPerPage', { items: item })"
:value="item">
</el-option>
</el-select>
<button class="pagination-btn" :disabled="currentPage === 1" @click="goFirst">
首页
{{ $t('dictManagement.firstPage') }}
</button>
<button class="pagination-btn" :disabled="currentPage === 1" @click="goPrev">
上一页
{{ $t('dictManagement.prevPage') }}
</button>
<button v-for="page in visiblePages" :key="page" class="pagination-btn"
:class="{ active: page === currentPage }" @click="goToPage(page)">
{{ page }}
</button>
<button class="pagination-btn" :disabled="currentPage === pageCount" @click="goNext">
下一页
{{ $t('dictManagement.nextPage') }}
</button>
<span class="total-text">{{ total }}条记录</span>
<span class="total-text">{{ $t('dictManagement.totalRecords', { total }) }}</span>
</div>
</div>
</el-card>
@@ -211,7 +211,7 @@ export default {
return row === this.selectedDictType ? 'current-row' : ''
},
showAddDictTypeDialog() {
this.dictTypeDialogTitle = '新增字典类型'
this.dictTypeDialogTitle = this.$t('dictManagement.addDictType')
this.dictTypeForm = {
id: null,
dictName: '',
@@ -220,7 +220,7 @@ export default {
this.dictTypeDialogVisible = true
},
editDictType(row) {
this.dictTypeDialogTitle = '编辑字典类型'
this.dictTypeDialogTitle = this.$t('dictManagement.editDictType')
this.dictTypeForm = { ...row }
this.dictTypeDialogVisible = true
},
@@ -228,7 +228,7 @@ export default {
const api = formData.id ? dictApi.updateDictType : dictApi.addDictType
api(formData, ({ data }) => {
if (data.code === 0) {
this.$message.success('保存成功')
this.$message.success(this.$t('dictManagement.saveSuccess'))
this.dictTypeDialogVisible = false
this.loadDictTypeList()
}
@@ -236,19 +236,19 @@ export default {
},
batchDeleteDictType() {
if (this.selectedDictTypes.length === 0) {
this.$message.warning('请选择要删除的字典类型')
this.$message.warning(this.$t('dictManagement.selectDictTypeToDelete'))
return
}
this.$confirm('确定要删除选中的字典类型吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
this.$confirm(this.$t('dictManagement.confirmDeleteDictType'), this.$t('dictManagement.confirm'), {
confirmButtonText: this.$t('dictManagement.confirm'),
cancelButtonText: this.$t('dictManagement.cancel'),
type: 'warning'
}).then(() => {
const ids = this.selectedDictTypes.map(item => item.id)
dictApi.deleteDictType(ids, ({ data }) => {
if (data.code === 0) {
this.$message.success('删除成功')
this.$message.success(this.$t('dictManagement.deleteSuccess'))
this.loadDictTypeList()
}
})
@@ -273,8 +273,8 @@ export default {
}))
this.total = data.data.total
} else {
this.$message.error(data.msg || '获取字典数据失败')
}
this.$message.error(data.msg || this.$t('dictManagement.getDictDataFailed'))
}
this.dictDataLoading = false
})
},
@@ -286,10 +286,10 @@ export default {
},
showAddDictDataDialog() {
if (!this.selectedDictType) {
this.$message.warning('请先选择字典类型')
this.$message.warning(this.$t('dictManagement.selectDictTypeFirst'))
return
}
this.dictDataDialogTitle = '新增字典数据'
this.dictDataDialogTitle = this.$t('dictManagement.addDictData')
this.dictDataForm = {
id: null,
dictTypeId: this.selectedDictType.id,
@@ -300,7 +300,7 @@ export default {
this.dictDataDialogVisible = true
},
editDictData(row) {
this.dictDataDialogTitle = '编辑字典数据'
this.dictDataDialogTitle = this.$t('dictManagement.editDictData')
this.dictDataForm = { ...row }
this.dictDataDialogVisible = true
},
@@ -308,21 +308,21 @@ export default {
const api = formData.id ? dictApi.updateDictData : dictApi.addDictData
api(formData, ({ data }) => {
if (data.code === 0) {
this.$message.success('保存成功')
this.$message.success(this.$t('dictManagement.saveSuccess'))
this.dictDataDialogVisible = false
this.loadDictDataList(formData.dictTypeId)
}
})
},
deleteDictData(row) {
this.$confirm('确定要删除该字典数据吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
this.$confirm(this.$t('dictManagement.confirmDeleteDictData'), this.$t('dictManagement.confirm'), {
confirmButtonText: this.$t('dictManagement.confirm'),
cancelButtonText: this.$t('dictManagement.cancel'),
type: 'warning'
}).then(() => {
dictApi.deleteDictData([row.id], ({ data }) => {
if (data.code === 0) {
this.$message.success('删除成功')
this.$message.success(this.$t('dictManagement.deleteSuccess'))
this.loadDictDataList(row.dictTypeId)
}
})
@@ -331,19 +331,19 @@ export default {
batchDeleteDictData() {
const selectedRows = this.dictDataList.filter(row => row.selected)
if (selectedRows.length === 0) {
this.$message.warning('请选择要删除的字典数据')
this.$message.warning(this.$t('dictManagement.selectDictDataToDelete'))
return
}
this.$confirm(`确定要删除选中的${selectedRows.length}个字典数据吗?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
this.$confirm(this.$t('dictManagement.confirmBatchDeleteDictData', { count: selectedRows.length }), this.$t('dictManagement.confirm'), {
confirmButtonText: this.$t('dictManagement.confirm'),
cancelButtonText: this.$t('dictManagement.cancel'),
type: 'warning'
}).then(() => {
const ids = selectedRows.map(item => item.id)
dictApi.deleteDictData(ids, ({ data }) => {
if (data.code === 0) {
this.$message.success('删除成功')
this.$message.success(this.$t('dictManagement.deleteSuccess'))
this.loadDictDataList(this.selectedDictType.id)
}
})
@@ -363,6 +363,14 @@ export default {
this.currentPage = 1;
this.loadDictDataList(this.selectedDictType?.id);
},
// 更新选择列表头翻译文本
updateSelectionHeaderText() {
const thElement = document.querySelector(`.el-table__header th:nth-child(1) .cell`);
if (thElement) {
thElement.setAttribute('data-content', this.$t('modelConfig.select'));
}
},
goFirst() {
this.currentPage = 1;
this.loadDictDataList(this.selectedDictType?.id);
@@ -382,8 +390,38 @@ export default {
goToPage(page) {
this.currentPage = page;
this.loadDictDataList(this.selectedDictType?.id);
},
// 表头单元格样式类名,用于选择列
headerCellClassName({ columnIndex }) {
if (columnIndex === 0) {
return 'custom-selection-header';
}
return '';
},
// 单元格样式类名,用于设置选择列表头的翻译文本
selectionCellClassName({ row, column, rowIndex, columnIndex }) {
// 只对表头行设置data-content
if (rowIndex === undefined) {
setTimeout(() => {
this.updateSelectionHeaderText();
}, 0);
}
return '';
}
},
mounted() {
// 在组件挂载后确保表头翻译文本正确显示
setTimeout(() => {
this.updateSelectionHeaderText();
}, 100);
},
updated() {
// 在组件更新后重新设置表头翻译文本
this.updateSelectionHeaderText();
},
computed: {
pageCount() {
return Math.ceil(this.total / this.pageSize);
@@ -823,6 +861,29 @@ export default {
background-color: transparent !important;
}
::v-deep .el-table .custom-selection-header .cell .el-checkbox__inner {
display: none !important;
}
::v-deep .el-table .custom-selection-header .cell::before {
content: attr(data-content);
display: block;
text-align: center;
line-height: 32px;
color: black;
margin-top: 0;
height: 32px;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 100%;
}
.custom-selection-header .cell {
position: relative;
}
:deep(.el-table thead) {
color: #000000;
}