系统相关配置
This commit is contained in:
@@ -7,7 +7,7 @@
|
||||
<el-col :span="6">
|
||||
<div class="tree-container">
|
||||
<el-tree
|
||||
@node-click="clickNode"
|
||||
@node-click="(node, data, event) => handleNodeClick(node, data)"
|
||||
:expand-on-click-node="false"
|
||||
:highlight-current="true"
|
||||
:data="TreeData"
|
||||
@@ -92,13 +92,12 @@ import Table from '@/components/table/index.vue'
|
||||
import TableHeader from '@/components/table/header/index.vue'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import {
|
||||
getDictTree,
|
||||
getReportDictList,
|
||||
addDict,
|
||||
updateDict,
|
||||
deleteDict
|
||||
} from '@/api/system-boot/ReportTemplate'
|
||||
|
||||
|
||||
// 弹出框是否可见
|
||||
const dialogVisible = ref<boolean>(false)
|
||||
const dialogTitle = ref('新增配置项')
|
||||
@@ -107,12 +106,50 @@ const props = defineProps({
|
||||
type: {
|
||||
type: Number,
|
||||
default: undefined
|
||||
},
|
||||
treeData: {
|
||||
type: Array,
|
||||
default: () => []
|
||||
}
|
||||
})
|
||||
const TreeData = computed(() => props.treeData)
|
||||
const secondLevelNode = ref<any[]>([]);
|
||||
const treeExpandData = ref([])
|
||||
|
||||
const setDefaultExpandedKeys = (treeData: any[]) => {
|
||||
const firstLevelIds = treeData.map(item => item.id)
|
||||
treeExpandData.value = firstLevelIds
|
||||
}
|
||||
|
||||
|
||||
// 默认选中第一个节点
|
||||
const selectFirstNode = () => {
|
||||
if (props.treeData.length > 0 && tree.value) {
|
||||
const firstNodeId = props.treeData[0].id
|
||||
tree.value.setCurrentKey(firstNodeId)
|
||||
formData.id = firstNodeId
|
||||
}
|
||||
}
|
||||
|
||||
// 监听 treeData 变化,自动设置默认展开
|
||||
watch(
|
||||
() => props.treeData,
|
||||
(newVal) => {
|
||||
if (newVal.length > 0) {
|
||||
setDefaultExpandedKeys(newVal)
|
||||
nextTick(() => {
|
||||
selectFirstNode()
|
||||
})
|
||||
}
|
||||
},
|
||||
{ immediate: true }
|
||||
)
|
||||
|
||||
const tree = ref(null)
|
||||
|
||||
const formData = reactive({
|
||||
searchValue: '',
|
||||
id: '0',
|
||||
id: 0,
|
||||
type: props.type
|
||||
})
|
||||
|
||||
@@ -124,6 +161,11 @@ const form = reactive({
|
||||
type: props.type
|
||||
})
|
||||
|
||||
const defaultProps = {
|
||||
children: 'children',
|
||||
label: 'reportDescribe'
|
||||
}
|
||||
|
||||
const rules = {
|
||||
name: [{ required: true, message: '名称不能为空', trigger: 'blur' }],
|
||||
reportDescribe: [{ required: true, message: '描述不能为空', trigger: 'blur' }],
|
||||
@@ -131,7 +173,7 @@ const rules = {
|
||||
}
|
||||
|
||||
const tableStore = new TableStore({
|
||||
url: '/system-boot/reportDict/getReportDictList',
|
||||
url: getReportDictList(formData),
|
||||
method: 'POST',
|
||||
column: [
|
||||
{ title: '配置项名称', field: 'name' },
|
||||
@@ -185,6 +227,45 @@ const tableStore = new TableStore({
|
||||
})
|
||||
|
||||
provide('tableStore', tableStore)
|
||||
|
||||
|
||||
// 存储当前选中节点的路径(包括自身)
|
||||
const selectedNodePath = ref<any[]>([]);
|
||||
|
||||
// 处理节点点击事件
|
||||
const handleNodeClick = (node: any) => {
|
||||
// 获取当前节点的完整路径
|
||||
const nodePath = tree.value?.getNodePath(node);
|
||||
|
||||
// 更新当前选中节点的路径
|
||||
selectedNodePath.value = nodePath || [];
|
||||
|
||||
// 设置当前节点 ID 到 formData
|
||||
formData.id = node.id;
|
||||
|
||||
// 动态生成父节点选项(排除当前节点本身)
|
||||
secondLevelNode.value = (nodePath || []).slice(0, -1).map((item: any) => ({
|
||||
id: item.id,
|
||||
reportDescribe: item.reportDescribe
|
||||
}));
|
||||
|
||||
// 调用 tableStore.index()
|
||||
tableStore.index();
|
||||
};
|
||||
|
||||
// 监听 selectedNodePath 变化
|
||||
watch(selectedNodePath, (newPath) => {
|
||||
if (Array.isArray(newPath)) {
|
||||
secondLevelNode.value = newPath.slice(0, -1).map((item: any) => ({
|
||||
id: item.id,
|
||||
reportDescribe: item.reportDescribe
|
||||
}));
|
||||
} else {
|
||||
console.warn('selectedNodePath is not an array:', newPath);
|
||||
secondLevelNode.value = []; // 清空选项
|
||||
}
|
||||
});
|
||||
|
||||
const addTemplate = () => {
|
||||
dialogTitle.value = '新增配置项'
|
||||
dialogVisible.value = true
|
||||
@@ -218,7 +299,7 @@ const closeDialog = () => {
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
tableStore.index()
|
||||
//tableStore.index()
|
||||
})
|
||||
|
||||
</script>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<TableHeader ref="TableHeaderRef">
|
||||
<template v-slot:select>
|
||||
<el-form-item label="模板类型">
|
||||
<el-select v-model="tableStore.table.params.type" placeholder="Select" size="large">
|
||||
<el-select v-model="tableStore.table.params.type" placeholder="Select" size="large" @change="handleTypeChange">
|
||||
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
@@ -16,12 +16,12 @@
|
||||
<Table ref="tableRef" />
|
||||
|
||||
<Administration
|
||||
:type="tableStore.table.params.type"
|
||||
:type="Number(tableStore.table.params.type)"
|
||||
:tree-data="treeDataForChild"
|
||||
v-if="showDictionary"
|
||||
@close="closeReportDictionary"
|
||||
/>
|
||||
|
||||
|
||||
<el-dialog
|
||||
:title="title"
|
||||
v-model="dialogVisible"
|
||||
@@ -32,14 +32,14 @@
|
||||
<el-col :span="11">
|
||||
<div class="grid-content">
|
||||
<el-tree
|
||||
:data="data"
|
||||
show-checkbox
|
||||
node-key="id"
|
||||
:props="defaultProps"
|
||||
:default-checked-keys="treeCheckedData"
|
||||
:default-expanded-keys="treeExpandData"
|
||||
@check-change="handleCheckChange"
|
||||
ref="tree"
|
||||
:data="data"
|
||||
show-checkbox
|
||||
node-key="id"
|
||||
:props="defaultProps"
|
||||
:default-checked-keys="treeCheckedData"
|
||||
:default-expanded-keys="treeExpandData"
|
||||
@check-change="handleCheckChange"
|
||||
ref="tree"
|
||||
>
|
||||
</el-tree>
|
||||
</div
|
||||
@@ -78,7 +78,7 @@ import { ref, onMounted, provide, nextTick } from 'vue'
|
||||
import TableStore from '@/utils/tableStore'
|
||||
import Table from '@/components/table/index.vue'
|
||||
import TableHeader from '@/components/table/header/index.vue'
|
||||
import { addData,updateData,deleteData,getList,getDictTree } from '@/api/system-boot/MonitoringPoint'
|
||||
import { addData,updateData,deleteData,getDictTree } from '@/api/system-boot/MonitoringPoint'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import Administration from '@/views/system/ReportConfiguration/components/Administration.vue'
|
||||
|
||||
@@ -102,8 +102,10 @@ const form = ref({
|
||||
name: '',
|
||||
code: '',
|
||||
type: 0,
|
||||
ids: []
|
||||
})
|
||||
|
||||
|
||||
// 表单验证规则
|
||||
const rules = {
|
||||
name: [
|
||||
@@ -118,8 +120,9 @@ const rules = {
|
||||
const data = ref([]) // 树形数据源
|
||||
const defaultProps = {
|
||||
children: 'children',
|
||||
label: 'label'
|
||||
label: 'reportDescribe'
|
||||
}
|
||||
|
||||
const treeCheckedData = ref([]) // 默认选中的节点
|
||||
const treeExpandData = ref([]) // 默认展开的节点
|
||||
|
||||
@@ -128,10 +131,16 @@ const options = ([
|
||||
{ value: '1', label: '区域报告' },
|
||||
])
|
||||
|
||||
const openReportDictionary = () => {
|
||||
console.log('点击了报告字典管理按钮')
|
||||
showDictionary.value = true
|
||||
console.log('showDictionary 当前值:', showDictionary.value)
|
||||
|
||||
const treeDataForChild = ref([]) // 用于存储传递给子组件的树数据
|
||||
const openReportDictionary = async () => {
|
||||
try {
|
||||
const res = await getDictTree({ type: Number(tableStore.table.params.type) })
|
||||
treeDataForChild.value = res.data // 将数据存储到响应式变量中
|
||||
showDictionary.value = true // 打开子组件
|
||||
} catch (error) {
|
||||
ElMessage.error('获取字典数据失败')
|
||||
}
|
||||
}
|
||||
|
||||
const closeReportDictionary = () => {
|
||||
@@ -150,7 +159,6 @@ const tableStore: any = new TableStore({
|
||||
width: '220',
|
||||
render: 'buttons',
|
||||
buttons: [
|
||||
|
||||
{
|
||||
name: 'edit',
|
||||
title: '编辑',
|
||||
@@ -166,8 +174,16 @@ const tableStore: any = new TableStore({
|
||||
id: row.id,
|
||||
name: row.name,
|
||||
code: row.code,
|
||||
type: row.type
|
||||
type: row.type,
|
||||
ids: row.rdIds
|
||||
}
|
||||
// 获取树数据
|
||||
formData.type = row.type
|
||||
getDictTree(formData).then(res => {
|
||||
data.value = res.data
|
||||
treeCheckedData.value= row.rdIds
|
||||
setDefaultExpandedKeys(res.data)
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
@@ -201,9 +217,21 @@ tableStore.table.params = {}
|
||||
|
||||
tableStore.table.params.type = '0'
|
||||
provide('tableStore', tableStore)
|
||||
// 模板类型变更
|
||||
const handleTypeChange = (value: string) => {
|
||||
tableStore.table.params.type = value
|
||||
tableStore.index()
|
||||
}
|
||||
|
||||
const formData= reactive({
|
||||
pageNum: 1,
|
||||
pageSize: 20,
|
||||
type: 0,
|
||||
})
|
||||
|
||||
|
||||
const add = () => {
|
||||
isEdit.value = true
|
||||
isEdit.value = false
|
||||
title.value = '新增模板'
|
||||
dialogVisible.value = true
|
||||
// 初始化表单数据
|
||||
@@ -211,9 +239,26 @@ const add = () => {
|
||||
id: '',
|
||||
name: '',
|
||||
code: '',
|
||||
type: tableStore.table.params.type
|
||||
type: tableStore.table.params.type,
|
||||
ids: []
|
||||
}
|
||||
|
||||
formData.type = tableStore.table.params.type
|
||||
treeCheckedData.value = []
|
||||
getDictTree(formData).then(res => {
|
||||
data.value = res.data
|
||||
setDefaultExpandedKeys(res.data)
|
||||
})
|
||||
}
|
||||
|
||||
const setDefaultExpandedKeys = (treeData: any[]) => {
|
||||
const firstLevelIds = treeData.map(item => item.id)
|
||||
treeExpandData.value = firstLevelIds
|
||||
}
|
||||
|
||||
const handleCheckChange = (data: any, checked: boolean, indeterminate: boolean) => {
|
||||
// 获取当前选中的节点 key 值
|
||||
const checkedKeys = tree.value?.getCheckedKeys() || []
|
||||
form.value.ids = checkedKeys // 将选中的节点 ID 更新到表单数据中
|
||||
}
|
||||
|
||||
const addDetermine = () => {
|
||||
|
||||
259
src/views/system/area/index.vue
Normal file
259
src/views/system/area/index.vue
Normal file
@@ -0,0 +1,259 @@
|
||||
<template>
|
||||
|
||||
<div class="default-main">
|
||||
<el-form :inline="true" :model="formInline" class="demo-form-inline">
|
||||
<el-form-item label="类型:">
|
||||
<el-switch v-model="value" active-text="企业部门" inactive-text="行政区域" @change="handleSwitchChange"></el-switch>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button
|
||||
v-if="value ? true : false"
|
||||
@click="AddClick1"
|
||||
type="primary"
|
||||
size="mini"
|
||||
icon="el-icon-plus"
|
||||
>
|
||||
新增部门
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<Table ref='tableRef' />
|
||||
<!-- 修改弹窗 -->
|
||||
<el-dialog
|
||||
:close-on-click-modal="false"
|
||||
:title="RowName + '部门'"
|
||||
v-model="dialogFormVisible"
|
||||
width="30%"
|
||||
@close="closeDialog"
|
||||
>
|
||||
<el-form :model="formData" ref="formRef" label-width="110px" :rules="rules">
|
||||
<el-form-item v-if="flag" label="父级节点:">
|
||||
<el-input v-model="parentName" placeholder="请输入父级节点"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="企业部门:" prop="name" class="top">
|
||||
<el-input v-model="formData.name" placeholder="请输入企业部门"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="简称:" prop="shortName" class="top">
|
||||
<el-input v-model="formData.shortName" placeholder="请输入简称"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="排序:" prop="areaCode" class="top">
|
||||
<el-input v-model="formData.areaCode" placeholder="请输入排序"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="经度:" prop="lng" class="top">
|
||||
<el-input v-model="formData.lng" placeholder="请输入经度"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="纬度:" prop="lat" class="top">
|
||||
<el-input v-model="formData.lat" placeholder="请输入纬度"></el-input>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button @click="closeDialog">取 消</el-button>
|
||||
<el-button type="primary" @click="submitEvent">确 定</el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, reactive, onMounted, onBeforeUnmount } from 'vue'
|
||||
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||
import { areaTree, areaAdd, areaDelete, update, selectPid } from '@/api/system-boot/area'
|
||||
import TableStore from '@/utils/tableStore'
|
||||
import Table from '@/components/table/index.vue'
|
||||
|
||||
defineOptions({
|
||||
name: 'system-boot/area/areaTree'
|
||||
})
|
||||
// 响应式数据
|
||||
const value = ref(false)
|
||||
const flag = ref(true)
|
||||
const dialogFormVisible = ref(false)
|
||||
const tableData = ref([])
|
||||
const formData = reactive({
|
||||
type: 0,
|
||||
id: '',
|
||||
pid: '',
|
||||
name: '',
|
||||
shortName: '',
|
||||
areaCode: '',
|
||||
lng: 0,
|
||||
lat: 0
|
||||
})
|
||||
const parentName = ref('')
|
||||
const RowName = ref('')
|
||||
const flag1 = ref('')
|
||||
const row = ref(null)
|
||||
const formInline = reactive({})
|
||||
const rules = {
|
||||
name: [{ required: true, message: '名称不能为空', trigger: 'blur' }],
|
||||
shortName: [{ required: true, message: '简称不能为空', trigger: 'blur' }],
|
||||
areaCode: [{ required: true, message: '排序不能为空', trigger: 'blur' }],
|
||||
lng: [{ required: true, message: '经度不能为空', trigger: 'blur' }],
|
||||
lat: [{ required: true, message: '纬度不能为空', trigger: 'blur' }]
|
||||
}
|
||||
|
||||
// 表单引用
|
||||
const formRef = ref(null)
|
||||
|
||||
|
||||
const tableStore = new TableStore({
|
||||
showPage:false,
|
||||
url: areaTree( { id: '', type: value.value ? 1 : 0 }),
|
||||
method: 'POST',
|
||||
column: [
|
||||
{ title: value ? '企业部门' : '行政区域', field: 'name', treeNode: true, align: 'left' },
|
||||
{ title: '简称', field: 'shortName', treeNode: true, align: 'left' },
|
||||
{ title: '经度', field: 'lng' },
|
||||
{ title: '维度', field: 'lat' },
|
||||
{ title: '行政编码', field: 'areaCode' },
|
||||
],
|
||||
loadCallback: () => {
|
||||
console.log('tableStore.table.data')
|
||||
}
|
||||
})
|
||||
|
||||
provide('tableStore', tableStore)
|
||||
tableStore.table.params.searchState = 0
|
||||
const handleSwitchChange = (val) => {
|
||||
|
||||
areaTree( { id: '', type: value.value ? 1 : 0 })
|
||||
}
|
||||
// 外部新增
|
||||
const AddClick1 = () => {
|
||||
flag.value = true
|
||||
Object.assign(formData, {})
|
||||
RowName.value = '新增'
|
||||
parentName.value = '企业'
|
||||
dialogFormVisible.value = true
|
||||
formData.type = 1
|
||||
formData.pid = '0'
|
||||
flag1.value = 'add'
|
||||
}
|
||||
|
||||
// 行内新增
|
||||
const AddClick = (row) => {
|
||||
flag.value = true
|
||||
Object.assign(formData, {})
|
||||
RowName.value = `${row.name}下新增`
|
||||
parentName.value = row.name
|
||||
dialogFormVisible.value = true
|
||||
formData.type = 1
|
||||
formData.pid = row.id
|
||||
formData.id = row.id
|
||||
flag1.value = 'add'
|
||||
}
|
||||
|
||||
// 行内修改
|
||||
const EditClick = (row) => {
|
||||
flag.value = false
|
||||
RowName.value = `${row.name}下修改`
|
||||
dialogFormVisible.value = true
|
||||
Object.assign(formData, {
|
||||
type: 1,
|
||||
id: row.id,
|
||||
pid: row.pid,
|
||||
name: row.name,
|
||||
shortName: row.shortName,
|
||||
areaCode: row.areaCode,
|
||||
lng: row.lng,
|
||||
lat: row.lat
|
||||
})
|
||||
flag1.value = 'edit'
|
||||
row.value = row
|
||||
}
|
||||
|
||||
// 删除
|
||||
const DeleteClick = (row) => {
|
||||
const p = row.id
|
||||
const arr = JSON.stringify([p])
|
||||
selectPid(arr).then((response) => {
|
||||
ElMessageBox.confirm('确认删除该节点吗?', '提示', {
|
||||
confirmButtonText: '确认删除',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
})
|
||||
.then(() => {
|
||||
areaDelete(arr).then((response) => {
|
||||
if (response.code === 'A0000') {
|
||||
ElMessage.success('删除成功')
|
||||
getAreaTree()
|
||||
}
|
||||
})
|
||||
})
|
||||
.catch(() => {})
|
||||
})
|
||||
}
|
||||
|
||||
// 提交操作
|
||||
const submitEvent = () => {
|
||||
dialogFormVisible.value = false
|
||||
if (flag1.value === 'add') {
|
||||
areaAdd(formData).then((response) => {
|
||||
if (response.code === 'A0000') {
|
||||
ElMessage.success('新增成功')
|
||||
getAreaTree()
|
||||
}
|
||||
})
|
||||
} else if (flag1.value === 'edit') {
|
||||
update(formData).then((response) => {
|
||||
if (response.code === 'A0000') {
|
||||
ElMessage.success('修改成功')
|
||||
tableData.value = []
|
||||
getAreaTree()
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// 查询树形数据
|
||||
const getAreaTree = () => {
|
||||
const data = { id: '', type: value.value ? 1 : 0 }
|
||||
areaTree(data).then((response) => {
|
||||
if (response.code === 'A0000') {
|
||||
response.data.forEach((m) => {
|
||||
delete m.children
|
||||
m.hasChildren = true
|
||||
})
|
||||
tableData.value = response.data
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// 加载子节点
|
||||
const load = (tree, treeNode, resolve) => {
|
||||
const id = tree.id
|
||||
const data = { id, type: value.value ? 1 : 0 }
|
||||
areaTree(data).then((response) => {
|
||||
const childrenData = response.data.map((n) => {
|
||||
delete n.children
|
||||
n.hasChildren = true
|
||||
return n
|
||||
})
|
||||
setTimeout(() => {
|
||||
resolve(childrenData)
|
||||
}, 30)
|
||||
})
|
||||
}
|
||||
|
||||
// 关闭弹窗
|
||||
const closeDialog = () => {
|
||||
if (formRef.value) {
|
||||
formRef.value.resetFields()
|
||||
}
|
||||
dialogFormVisible.value = false
|
||||
}
|
||||
|
||||
// 生命周期
|
||||
onMounted(() => {
|
||||
tableStore.index()
|
||||
})
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped>
|
||||
|
||||
</style>
|
||||
@@ -71,7 +71,7 @@
|
||||
<el-radio-button :label="1">否</el-radio-button>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="用户ID">
|
||||
<el-form-item label="自定义ID">
|
||||
<div style="display: flex; width: 100%">
|
||||
<el-radio-group v-model="useId">
|
||||
<el-radio-button :label="1">是</el-radio-button>
|
||||
@@ -123,8 +123,8 @@ const form = reactive({
|
||||
limitIpEnd: '',
|
||||
limitTime: [1, 2],
|
||||
role: [],
|
||||
smsNotice: 0,
|
||||
emailNotice: 0,
|
||||
smsNotice: 1,
|
||||
emailNotice: 1,
|
||||
type: 0
|
||||
})
|
||||
const rules: Partial<Record<string, Array<FormItemRule>>> = {
|
||||
@@ -228,9 +228,9 @@ const open = (text: string, data?: anyObj) => {
|
||||
form.casualUser = 1
|
||||
form.limitTime = [0, 24]
|
||||
form.role = []
|
||||
form.smsNotice = 0
|
||||
form.emailNotice = 0
|
||||
useId.value = 1
|
||||
form.smsNotice = 1
|
||||
form.emailNotice = 1
|
||||
useId.value = 0
|
||||
form.id = ''
|
||||
form.limitIpStart = '0.0.0.0'
|
||||
form.limitIpEnd = '255.255.255.255'
|
||||
|
||||
@@ -1,76 +1,196 @@
|
||||
<template>
|
||||
<div class="strategy-manage pd10" :style="height">
|
||||
<el-form :inline="true" class="demo-form-inline">
|
||||
<el-form-item>
|
||||
<el-button @click="AddClick()" type="primary" :icon="Plus">保存</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div style="width: 500px">
|
||||
<el-form ref="formRef" :model="form" label-width="auto" :rules="rules">
|
||||
<el-divider content-position="left">系统策略</el-divider>
|
||||
<el-form-item label="最大并发数:" prop="maxUseUser">
|
||||
|
||||
<!-- 折叠面板 -->
|
||||
<el-collapse v-model="activeNames" >
|
||||
<!-- 客户端配置置 -->
|
||||
<el-collapse-item title="客户端配置" name="1">
|
||||
<div style="width: 500px">
|
||||
<el-form ref="formRef" :model="form" label-width="auto" :rules="rules">
|
||||
<el-form-item label="认证令牌时效(秒):" prop="accessTokenValidity">
|
||||
<el-input-number
|
||||
v-model.number="form.accessTokenValidity"
|
||||
:min="10"
|
||||
style="width: 100%"
|
||||
></el-input-number>
|
||||
</el-form-item>
|
||||
<el-form-item label="刷新令牌时效(秒):" prop="refreshTokenValidity">
|
||||
<el-input-number
|
||||
v-model.number="form.refreshTokenValidity"
|
||||
:min="10"
|
||||
style="width: 100%"
|
||||
></el-input-number>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
<el-button @click="AddClick()" type="primary" :icon="Check" >保存</el-button>
|
||||
|
||||
</el-collapse-item>
|
||||
|
||||
<el-collapse-item :title="item.name" v-for="(item, index) in column" :key="index" :name="String(index + 2)" >
|
||||
<div class="mb10">
|
||||
<el-button
|
||||
type="primary"
|
||||
icon="el-icon-Plus"
|
||||
@click="addForm()"
|
||||
v-if="item.name === '系统配置'"
|
||||
>
|
||||
新增类型</el-button>
|
||||
</div>
|
||||
<div style="height: 250px">
|
||||
<vxe-table
|
||||
height="auto"
|
||||
:data="configForm[item.key]"
|
||||
v-bind="defaultAttribute"
|
||||
>
|
||||
<vxe-column
|
||||
v-for="(k, index) in item.child"
|
||||
:key="index"
|
||||
:field="k.field"
|
||||
:title="k.title"
|
||||
></vxe-column>
|
||||
<vxe-column title="操作" width="150px">
|
||||
<template #default="{ row }">
|
||||
<el-button type="text" @click="sysActive(row)" v-if="item.key =='getSystemList' && row.state == '未激活'">激活</el-button>
|
||||
<el-button type="text" @click="editConfig(item, row)">编辑</el-button>
|
||||
<el-button type="text" @click="sysDelete(row)" v-if="item.key =='getSystemList'">删除</el-button>
|
||||
</template>
|
||||
</vxe-column>
|
||||
</vxe-table>
|
||||
</div>
|
||||
</el-collapse-item>
|
||||
</el-collapse>
|
||||
|
||||
|
||||
<el-dialog v-model="dialogVisible" title="编辑用户配置" width="500px">
|
||||
<el-form ref="editFormRef" :model="editForm" :rules="editRules" label-width="auto">
|
||||
<el-form-item label="密码有效期(月):" prop="passwordExpirationMonth">
|
||||
<el-input-number
|
||||
v-model.number="editForm.passwordExpirationMonth"
|
||||
:min="1"
|
||||
:max="6"
|
||||
style="width: 100%"
|
||||
></el-input-number>
|
||||
</el-form-item>
|
||||
<el-form-item label="密码错误次数限定(次):" prop="errorsCount">
|
||||
<el-input-number
|
||||
v-model.number="editForm.errorsCount"
|
||||
:min="3"
|
||||
:max="20"
|
||||
style="width: 100%"
|
||||
></el-input-number>
|
||||
</el-form-item>
|
||||
<el-form-item label="验证密码错误次数时间范围(分钟):" prop="lockPwdCheck">
|
||||
<el-input-number
|
||||
v-model.number="editForm.lockPwdCheck"
|
||||
:min="5"
|
||||
:max="60"
|
||||
style="width: 100%"
|
||||
></el-input-number>
|
||||
</el-form-item>
|
||||
<el-form-item label="用户锁定时间(分钟):" prop="releaseTime">
|
||||
<el-input-number
|
||||
v-model.number="editForm.releaseTime"
|
||||
:min="30"
|
||||
:max="60"
|
||||
style="width: 100%"
|
||||
></el-input-number>
|
||||
</el-form-item>
|
||||
<el-form-item label="用户休眠(天):" prop="sleepDay">
|
||||
<el-input-number
|
||||
v-model.number="editForm.sleepDay"
|
||||
:min="1"
|
||||
:max="180"
|
||||
style="width: 100%"
|
||||
></el-input-number>
|
||||
</el-form-item>
|
||||
<el-form-item label="用户注销(天):" prop="logoutDay">
|
||||
<el-input-number
|
||||
v-model.number="editForm.logoutDay"
|
||||
:min="1"
|
||||
:max="360"
|
||||
style="width: 100%"
|
||||
></el-input-number>
|
||||
</el-form-item>
|
||||
<el-form-item label="最大并发数:" prop="maxUseUser">
|
||||
<el-input-number
|
||||
v-model.number="editForm.maxUseUser"
|
||||
:min="10"
|
||||
:max="99"
|
||||
style="width: 100%"
|
||||
></el-input-number>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button @click="dialogVisible = false">取消</el-button>
|
||||
<el-button type="primary" @click="saveEdit">确定</el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
|
||||
<el-dialog v-model="systemDialogVisible" :title=sysTitle width="500px">
|
||||
<el-form ref="sysFormRef" :model="sysForm" :rules="sysRules" label-width="auto">
|
||||
<el-form-item label="系统类型:" prop="type">
|
||||
<el-select v-model="sysForm.type" placeholder="请选择系统类型" style="width: 100%">
|
||||
<el-option label="省级系统" value="0"></el-option>
|
||||
<el-option label="企业系统" value="1"></el-option>
|
||||
<el-option label="数据中心" value="2"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="数据上报:" prop="dataReport" class="top">
|
||||
<el-input style="width: 100%" v-model="sysForm.dataReport" placeholder="请输入数据上报"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="审计日志大小(M):" prop="logSize" class="top">
|
||||
<el-input-number
|
||||
v-model.number="form.maxUseUser"
|
||||
:min="10"
|
||||
:max="99"
|
||||
style="width: 100%"
|
||||
type="number"
|
||||
v-model="sysForm.logSize"
|
||||
:min="1024"
|
||||
:max="20480"
|
||||
placeholder="请输入审计日志大小"
|
||||
></el-input-number>
|
||||
</el-form-item>
|
||||
<el-divider content-position="left">账号锁定策略</el-divider>
|
||||
<el-form-item label="密码输入错误次数:" prop="errorsCount">
|
||||
<el-form-item label="日志储存时间(月):" prop="logTime" class="top">
|
||||
<el-input-number
|
||||
v-model.number="form.errorsCount"
|
||||
:min="3"
|
||||
:max="20"
|
||||
style="width: 100%"
|
||||
></el-input-number>
|
||||
</el-form-item>
|
||||
<el-form-item label="自动解锁(分钟):" prop="releaseTime">
|
||||
<el-input-number
|
||||
v-model.number="form.releaseTime"
|
||||
:min="5"
|
||||
:max="60"
|
||||
style="width: 100%"
|
||||
></el-input-number>
|
||||
</el-form-item>
|
||||
<el-form-item label="会话超时时间(秒):" prop="sessionTime">
|
||||
<el-input-number v-model.number="form.sessionTime" :min="10" style="width: 100%"></el-input-number>
|
||||
</el-form-item>
|
||||
<el-form-item label="token刷新时间(秒):" prop="sessionRefreshTime">
|
||||
<el-input-number
|
||||
v-model.number="form.sessionRefreshTime"
|
||||
:min="10"
|
||||
style="width: 100%"
|
||||
></el-input-number>
|
||||
</el-form-item>
|
||||
<el-divider content-position="left">账号密码复杂度校验</el-divider>
|
||||
<el-form-item label="密码有效期(月):" prop="passwordExpirationMonth">
|
||||
<el-input-number
|
||||
v-model.number="form.passwordExpirationMonth"
|
||||
type="number"
|
||||
v-model="sysForm.logTime"
|
||||
:min="1"
|
||||
:max="6"
|
||||
style="width: 100%"
|
||||
placeholder="请输入日志储存时间不能大于6个月"
|
||||
></el-input-number>
|
||||
</el-form-item>
|
||||
<el-form-item label="账号长时间未登录休眠期(天):" prop="sleepDay">
|
||||
<el-input-number
|
||||
v-model.number="form.sleepDay"
|
||||
:min="1"
|
||||
:max="180"
|
||||
<el-form-item label="激活状态:" class="top" prop="state">
|
||||
<el-select
|
||||
v-model="sysForm.state"
|
||||
:disabled="flagtyoe == 'add' ? false : true"
|
||||
placeholder="请选择"
|
||||
style="width: 100%"
|
||||
></el-input-number>
|
||||
>
|
||||
<el-option label="未激活" value="0"></el-option>
|
||||
<el-option label="已激活" value="1"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button @click="systemDialogVisible = false">取消</el-button>
|
||||
<el-button type="primary" @click="saveSystem">确定</el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, onMounted } from 'vue'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import { ruleUpdate, getRule, unlockRoot } from '@/api/admin/user.js'
|
||||
import { Plus } from '@element-plus/icons-vue'
|
||||
import { ElMessage, MessageParams } from 'element-plus'
|
||||
import { updateClientSessionConfig, getClientInfoByPath, ruleUpdate ,getUserConfig,getSystemList,activeSystemConfig,deleteSystemConfig,addSystemConfig,updateSystemConfig} from '@/api/admin/user.js'
|
||||
import { Check } from '@element-plus/icons-vue'
|
||||
import { mainHeight } from '@/utils/layout'
|
||||
import { defaultAttribute } from '@/components/table/defaultAttribute'
|
||||
import { ElMessageBox } from 'element-plus'
|
||||
|
||||
// 页面缓存
|
||||
defineOptions({
|
||||
@@ -81,55 +201,325 @@ const height = mainHeight(20)
|
||||
|
||||
// 定义表单引用
|
||||
const formRef = ref()
|
||||
const editFormRef = ref()
|
||||
const sysFormRef = ref()
|
||||
const dialogVisible = ref(false)
|
||||
const systemDialogVisible = ref(false)
|
||||
const activeNames = ref(['1', '2', '3']) // 默认展开所有面板
|
||||
const flagtyoe = ref('add') // 用于区分新增或编辑模式
|
||||
const sysTitle = ref('新增系统配置')
|
||||
|
||||
|
||||
// 定义表单数据
|
||||
const form = reactive({
|
||||
maxUseUser: 50,
|
||||
errorsCount: 0,
|
||||
passwordExpirationMonth: 0,
|
||||
sleepDay: 90,
|
||||
releaseTime: 0,
|
||||
sessionTime: 0,
|
||||
sessionRefreshTime: 0
|
||||
accessTokenValidity: 0,
|
||||
refreshTokenValidity: 0,
|
||||
})
|
||||
|
||||
// 定义表单验证规则
|
||||
const rules = {
|
||||
maxUseUser: [{ required: true, message: '请填写最大并发数', trigger: 'blur' }],
|
||||
errorsCount: [{ required: true, message: '请填写密码输入错误次数', trigger: 'blur' }],
|
||||
releaseTime: [{ required: true, message: '请填写自动解锁(分钟)', trigger: 'blur' }],
|
||||
sessionTime: [{ required: true, message: '请填写会话超时时间', trigger: 'blur' }],
|
||||
sessionRefreshTime: [{ required: true, message: '请填写会话刷新时间', trigger: 'blur' }],
|
||||
passwordExpirationMonth: [{ required: true, message: '请填写密码有效期', trigger: 'blur' }],
|
||||
sleepDay: [{ required: true, message: '请填写休眠期', trigger: 'blur' }]
|
||||
accessTokenValidity: [{ required: true, message: '请填写会话超时时间', trigger: 'blur' }],
|
||||
refreshTokenValidity: [{ required: true, message: '请填写会话刷新时间', trigger: 'blur' }],
|
||||
}
|
||||
|
||||
// 获取策略信息
|
||||
const info = () => {
|
||||
getRule().then(res => {
|
||||
Object.assign(form, res.data)
|
||||
})
|
||||
const editForm = ref({
|
||||
passwordExpirationMonth: 3,
|
||||
errorsCount: 5,
|
||||
lockPwdCheck: 30,
|
||||
releaseTime: 30,
|
||||
sleepDay: 3,
|
||||
logoutDay: 7,
|
||||
maxUseUser: 50,
|
||||
type: '',
|
||||
})
|
||||
|
||||
const editRules = {
|
||||
passwordExpirationMonth: [{ required: true, message: '请输入密码有效期', trigger: 'blur' }],
|
||||
errorsCount: [{ required: true, message: '请输入密码错误次数限定', trigger: 'blur' }],
|
||||
lockPwdCheck: [{ required: true, message: '请输入验证密码错误次数时间范围', trigger: 'blur' }],
|
||||
releaseTime: [{ required: true, message: '请输入用户锁定时间', trigger: 'blur' }],
|
||||
sleepDay: [{ required: true, message: '请输入用户休眠时间', trigger: 'blur' }],
|
||||
logoutDay: [{ required: true, message: '请输入用户注销时间', trigger: 'blur' }],
|
||||
maxUseUser: [{ required: true, message: '请输入最大并发数', trigger: 'blur' }],
|
||||
}
|
||||
|
||||
// 保存策略
|
||||
const sysForm = ref({
|
||||
type: '',
|
||||
dataReport: '',
|
||||
logSize: 1024,
|
||||
logTime: 1,
|
||||
state: '',
|
||||
})
|
||||
|
||||
const sysRules = {
|
||||
type: [{ required: true, message: '请选择系统类型', trigger: 'change' }],
|
||||
dataReport: [{ required: true, message: '请输入数据上报', trigger: 'blur' }],
|
||||
logSize: [{ required: true, message: '请输入审计日志大小', trigger: 'blur' }],
|
||||
logTime: [{ required: true, message: '请输入日志储存时间', trigger: 'blur' }],
|
||||
state: [{ required: true, message: '请选择激活状态', trigger: 'change' }],
|
||||
}
|
||||
|
||||
// 编辑配置项
|
||||
const editConfig = (item: any, row: any) => {
|
||||
if(item.name == '用户配置'){
|
||||
dialogVisible.value = true
|
||||
Object.assign(editForm.value, row)
|
||||
}else{
|
||||
systemDialogVisible.value = true
|
||||
flagtyoe.value = 'edit'
|
||||
sysTitle.value = '编辑系统配置'
|
||||
Object.assign(sysForm.value, row)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// 保存客户端配置
|
||||
const AddClick = () => {
|
||||
formRef.value.validate(valid => {
|
||||
formRef.value.validate((valid: any) => {
|
||||
if (valid) {
|
||||
ruleUpdate(form).then(res => {
|
||||
updateClientSessionConfig(form).then((res: { data: any }) => {
|
||||
Object.assign(form, res.data)
|
||||
ElMessage({
|
||||
message: '保存成功',
|
||||
type: 'success'
|
||||
})
|
||||
info()
|
||||
ElMessage.success(res.message)
|
||||
info(0)
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// 保存用户配置编辑
|
||||
const saveEdit = () => {
|
||||
editFormRef.value.validate((valid: any) => {
|
||||
if (valid) {
|
||||
const formData = {
|
||||
...editForm.value,
|
||||
type: parseUserType(editForm.value.type),
|
||||
}
|
||||
ruleUpdate(formData).then((res: any) => {
|
||||
ElMessage.success(res.message)
|
||||
dialogVisible.value = false
|
||||
info(1)
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
const configForm = ref({
|
||||
getUserConfig: [], //用户配置
|
||||
getSystemList: [], //系统配置
|
||||
})
|
||||
|
||||
|
||||
const column = readonly([
|
||||
{
|
||||
name: '用户配置',
|
||||
key: 'getUserConfig',
|
||||
child: [
|
||||
{ field: 'passwordExpirationMonth', title: '密码有效期(月)', width: '120' },
|
||||
{ field: 'errorsCount', title: '密码错误次数限定', minWidth: '120' },
|
||||
{ field: 'lockPwdCheck', title: '验证密码错误次数时间范围(天)', minWidth: '200' },
|
||||
{ field: 'releaseTime', title: '用户锁定时间', width: '120' },
|
||||
{ field: 'sleepDay', title: '用户休眠(天)', width: '120' },
|
||||
{ field: 'logoutDay', title: '用户注销(天)', width: '120' },
|
||||
{ field: 'maxUseUser', title: '最大并发数', width: '120' },
|
||||
{field: 'type',title: '用户类型',width: '120'},
|
||||
]
|
||||
},
|
||||
{
|
||||
name: '系统配置',
|
||||
key: 'getSystemList',
|
||||
child: [
|
||||
{
|
||||
title: '系统类型',
|
||||
field: 'type',
|
||||
},
|
||||
{
|
||||
title: '数据上报',
|
||||
field: 'dataReport'
|
||||
},
|
||||
{
|
||||
title: '审计日志大小(M)',
|
||||
field: 'logSize'
|
||||
},
|
||||
{
|
||||
title: '审计日志存储时间(月))',
|
||||
field: 'logTime'
|
||||
},
|
||||
{
|
||||
title: '状态',
|
||||
field: 'state',
|
||||
|
||||
},
|
||||
{
|
||||
title: '创建用户',
|
||||
field: 'createBy'
|
||||
},
|
||||
{
|
||||
title: '创建时间',
|
||||
field: 'createTime'
|
||||
},
|
||||
{
|
||||
title: '更新用户',
|
||||
field: 'updateBy'
|
||||
},
|
||||
{
|
||||
title: '更新时间',
|
||||
field: 'updateTime'
|
||||
},
|
||||
]
|
||||
}
|
||||
])
|
||||
|
||||
// 获取客户端配置
|
||||
const info = async (type: number) => {
|
||||
if (type === 0) {
|
||||
// 获取客户端配置
|
||||
await getClientInfoByPath().then((res: { data: any }) => {
|
||||
Object.assign(form, res.data)
|
||||
})
|
||||
} else if (type === 1) {
|
||||
// 获取用户配置
|
||||
await getUserConfig().then((res: { data: { map: (arg0: (item: any) => any) => never[] } }) => {
|
||||
configForm.value.getUserConfig = res.data.map((item: any) => ({
|
||||
...item,
|
||||
type: formatUserType(item.type)
|
||||
}))
|
||||
})
|
||||
} else {
|
||||
// 获取系统配置
|
||||
await getSystemList().then((res: { data: { map: (arg0: (item: any) => any) => never[] } }) => {
|
||||
configForm.value.getSystemList = res.data.map((item: any) => ({
|
||||
...item,
|
||||
type: formatSystemType(item.type),
|
||||
state: formatSystemState(item.state)
|
||||
}))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
const formatUserType = (type: number) => {
|
||||
return type === 1 ? '正常用户' : '临时用户'
|
||||
}
|
||||
|
||||
const formatSystemType = (type: number) => {
|
||||
return type === 0 ? '省级系统' : type === 1 ? '企业系统' : type === 2 ? '数据中心' : '/'
|
||||
}
|
||||
|
||||
const formatSystemState = (type: number) => {
|
||||
return type === 0 ? '未激活' : '已激活'
|
||||
}
|
||||
|
||||
// 将用户类型从中文转换为数字
|
||||
const parseUserType = (type: string): number => {
|
||||
return type === '正常用户' ? 1 : 0
|
||||
}
|
||||
|
||||
// 将系统类型从中文转换为数字
|
||||
const parseSystemType = (type: string): number => {
|
||||
return type === '省级系统' ? 0 : type === '企业系统' ? 1 : type === '数据中心' ? 2 : -1
|
||||
}
|
||||
|
||||
// 将系统状态从中文转换为数字
|
||||
const parseSystemState = (state: string): number => {
|
||||
return state === '未激活' ? 0 : 1
|
||||
}
|
||||
|
||||
// 新增 addForm 方法
|
||||
const addForm = () => {
|
||||
// 初始化系统配置表单
|
||||
sysForm.value = {
|
||||
type: '',
|
||||
dataReport: '',
|
||||
logSize: 1024,
|
||||
logTime: 1,
|
||||
state: '',
|
||||
}
|
||||
flagtyoe.value = 'add' // 标记为新增模式
|
||||
sysTitle.value = '新增系统配置'
|
||||
systemDialogVisible.value = true // 打开系统配置弹窗
|
||||
}
|
||||
|
||||
// 删除系统配置
|
||||
const sysDelete = (row: any) => {
|
||||
let data = {
|
||||
id: row.id
|
||||
}
|
||||
ElMessageBox.confirm('此操作将永久删除该配置, 是否继续?', '提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
}).then(() => {
|
||||
deleteSystemConfig(data).then((res: any) => {
|
||||
ElMessage.success(res.message)
|
||||
info(2) // 刷新系统配置列表
|
||||
})
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
|
||||
// 激活系统配置
|
||||
const sysActive = (row: any) => {
|
||||
// 构造请求参数
|
||||
const data = {
|
||||
id: row.id,
|
||||
type: parseSystemType(row.type),
|
||||
logSize: row.logSize,
|
||||
logTime: row.logTime,
|
||||
dataReport: row.dataReport,
|
||||
state: 1
|
||||
}
|
||||
|
||||
// 弹出确认框
|
||||
ElMessageBox.confirm('此操作将激活该系统配置,是否继续?', '提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
})
|
||||
.then(() => {
|
||||
// 用户点击“确定”,执行激活操作
|
||||
activeSystemConfig(data).then((res: any) => {
|
||||
ElMessage.success(res.message)
|
||||
info(2) // 刷新系统配置列表
|
||||
}).catch((err: any) => {
|
||||
ElMessage.error('激活失败,请重试')
|
||||
})
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
// 保存系统配置
|
||||
const saveSystem = () => {
|
||||
sysFormRef.value.validate((valid: any) => {
|
||||
if (valid) {
|
||||
if (flagtyoe.value === 'add') {
|
||||
addSystemConfig(sysForm.value).then((res: any) => {
|
||||
ElMessage.success(res.message)
|
||||
systemDialogVisible.value = false
|
||||
info(2)
|
||||
})
|
||||
} else {
|
||||
const formData = {
|
||||
...sysForm.value,
|
||||
type: parseSystemType(sysForm.value.type),
|
||||
state: parseSystemState(sysForm.value.state)
|
||||
}
|
||||
updateSystemConfig(formData).then((res: any) => {
|
||||
ElMessage.success(res.message)
|
||||
systemDialogVisible.value = false
|
||||
info(2)
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
|
||||
// 组件挂载时获取数据
|
||||
onMounted(() => {
|
||||
info()
|
||||
onBeforeMount(() => {
|
||||
info(0)
|
||||
info(1)
|
||||
info(2)
|
||||
})
|
||||
</script>
|
||||
|
||||
@@ -138,9 +528,15 @@ onMounted(() => {
|
||||
background-color: #fff;
|
||||
margin: 10px;
|
||||
}
|
||||
/* 增大折叠面板标题字体 */
|
||||
:deep(.el-collapse-item__header) {
|
||||
font-size: 20px; /* 设置字体大小 */
|
||||
font-weight: bold; /* 加粗字体 */
|
||||
//color: var(--el-color-primary); /* 可选:设置颜色 */
|
||||
}
|
||||
|
||||
:deep(.el-form-item__label ){
|
||||
color: var(--el-color-primary);
|
||||
:deep(.el-form-item__label) {
|
||||
|
||||
font-weight: 600;
|
||||
}
|
||||
</style>
|
||||
</style>
|
||||
Reference in New Issue
Block a user