依赖升级:
- element-plus 2.2.28 -> 2.13.5
- vue 3.2.45 -> 3.5.30
- vue-router 4.0.11 -> 4.6.4
- axios 0.22 -> 1.13.6
- echarts 5.2.1 -> 5.6.0
- hls.js 1.3 -> 1.6.15
- typescript 4.5.5 -> 5.9.3
破坏性变更修复:
- axios 1.x: config.headers.token= 改为 config.headers.set()
- element-plus locale 路径: lib/ -> es/
- Article.vue: Node 改为具名导入 { Node }
- main.ts: 路由守卫参数补全显式类型声明
- SystemConfig.vue: 移除废弃的 clearValidate 包装函数
TypeScript 配置修复 (tsconfig.json):
- moduleResolution: node -> bundler (支持 exports 字段, 解决 vue-router .mts 类型文件)
- 新增 skipLibCheck: true (规避第三方库内部类型冲突)
- 新增 vuex paths 映射 (vuex exports 字段缺少 types 条件)
样式适配 (common.less):
- el-dialog 新增 padding: 0, 消除升级后产生的白边
- el-form--inline 内 el-select 补 min-width: 160px, 修复搜索栏下拉框过窄问题
清理:
- 删除 src/vuex.d.ts (已无用的 vuex store 类型扩充文件)
140 lines
4.4 KiB
Vue
140 lines
4.4 KiB
Vue
<template>
|
|
<div>
|
|
<el-form inline :model="search" @submit.prevent>
|
|
<el-form-item label="配置项">
|
|
<el-input placeholder="名称/描述" v-model="search.name" />
|
|
</el-form-item>
|
|
</el-form>
|
|
<div class="btn-container">
|
|
<el-button type="primary" @click="add">添加</el-button>
|
|
<div class="search-btn">
|
|
<el-button type="primary" @click="loadData" icon="Search">搜索</el-button>
|
|
<el-button @click="reset" icon="RefreshLeft">重置</el-button>
|
|
</div>
|
|
</div>
|
|
<div class="table-container">
|
|
<el-table :data="systemConfigData" v-loading="loading" stripe>
|
|
<el-table-column type="expand">
|
|
<template #default="scope">
|
|
<pre style="margin:0 10px;">{{ JSON.stringify(scope.row.value, null, ' ') }}</pre>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="name" label="配置项名称" />
|
|
<el-table-column prop="description" label="配置项描述" />
|
|
<el-table-column prop="is_public" label="是否公开" >
|
|
<template #default="scope">
|
|
{{ scope.row.is_public ? '是' : '否' }}
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="created_at" label="创建时间" >
|
|
<template #default="scope">
|
|
{{ datetimeFormat(scope.row.created_at) }}
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="updated_at" label="更新时间" >
|
|
<template #default="scope">
|
|
{{ datetimeFormat(scope.row.updated_at) }}
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column label="操作" >
|
|
<template #default="scope">
|
|
<el-button link icon="Edit" @click="update(scope.row)" title="修改"></el-button>
|
|
<el-button link type="danger" icon="Delete" @click="remove(scope.row)" title="删除"></el-button>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table>
|
|
</div>
|
|
<el-dialog v-model="addModal" :title="modalTitle" >
|
|
<system-config-add ref="addForm" :formData="formData" />
|
|
<template #footer>
|
|
<span class="dialog-footer">
|
|
<el-button @click="addModal = false">取消</el-button>
|
|
<el-button type="primary" @click="save" :loading="modalLoading">确定</el-button>
|
|
</span>
|
|
</template>
|
|
</el-dialog>
|
|
</div>
|
|
</template>
|
|
<script setup lang="ts">
|
|
import { ref } from 'vue'
|
|
import { ElMessage, ElMessageBox } from 'element-plus'
|
|
import moment from 'moment'
|
|
import http from '@/utils/http'
|
|
import SystemConfigAdd from './SystemConfigAdd.vue'
|
|
import { SystemConfigModel } from '@/model/system/system-config'
|
|
|
|
const modalLoading = ref(false)
|
|
const loading = ref(false)
|
|
const search = ref<{name?: string}>({})
|
|
const systemConfigData = ref<SystemConfigModel[]>([])
|
|
const addModal = ref(false)
|
|
const modalTitle = ref('')
|
|
const formData = ref<SystemConfigModel>({
|
|
name: '',
|
|
value: '',
|
|
description: '',
|
|
is_public: false
|
|
})
|
|
|
|
const addForm = ref<InstanceType<typeof SystemConfigAdd>>()
|
|
|
|
function reset() {
|
|
search.value = {}
|
|
loadData()
|
|
}
|
|
|
|
async function loadData() {
|
|
loading.value = true
|
|
systemConfigData.value = await http.get('/api/v1/system/config/list', {params: search.value})
|
|
loading.value = false
|
|
}
|
|
|
|
function add() {
|
|
formData.value = {
|
|
name: '',
|
|
value: '',
|
|
description: '',
|
|
is_public: false
|
|
}
|
|
modalTitle.value = '新增配置项'
|
|
addModal.value = true
|
|
}
|
|
|
|
function update(row: SystemConfigModel) {
|
|
const data = Object.assign({}, row)
|
|
data.value = JSON.stringify(data.value, null, ' ')
|
|
formData.value = data
|
|
modalTitle.value = '修改配置项'
|
|
addModal.value = true
|
|
}
|
|
|
|
async function save() {
|
|
addForm.value?.configForm?.validate(async (valid: boolean) => {
|
|
if (!valid) return
|
|
modalLoading.value = true
|
|
const data = await http.post<SystemConfigModel, any>('/api/v1/system/config/save', formData.value)
|
|
modalLoading.value = false
|
|
addModal.value = false
|
|
ElMessage.success(data.message)
|
|
loadData()
|
|
})
|
|
}
|
|
|
|
function remove(row: SystemConfigModel) {
|
|
ElMessageBox.confirm(`是否确认删除 ${row.name} 配置项?`, '确认删除', {type: 'warning'}).then(async () => {
|
|
const data = await http.delete<{params: {id: string}}, any>('/api/v1/system/config/delete', {params: {id: row._id}})
|
|
if(data.status) {
|
|
ElMessage.success(data.message)
|
|
loadData()
|
|
} else {
|
|
ElMessage.warning(data.message)
|
|
}
|
|
}).catch(() => {})
|
|
}
|
|
|
|
function datetimeFormat(dateStr: string) {
|
|
return dateStr ? moment(dateStr).format('YYYY-MM-DD HH:mm:ss') : null
|
|
}
|
|
|
|
loadData()
|
|
</script> |