系统相关配置
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
import createAxios from '@/utils/request'
|
||||
|
||||
|
||||
// 密码规则修改
|
||||
export function ruleUpdate(data) {
|
||||
return createAxios({
|
||||
@@ -24,3 +25,80 @@ export function unlockRoot(data) {
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
//根据客户端名查询信息
|
||||
export function getClientInfoByPath() {
|
||||
|
||||
return createAxios({
|
||||
url: '/user-boot/authClient/getAuthClientByName/njcn',
|
||||
method: 'GET',
|
||||
headers: {
|
||||
'Content-Type': 'application/x-www-form-urlencoded'
|
||||
}
|
||||
|
||||
})
|
||||
}
|
||||
|
||||
//客户端会话配置更新
|
||||
export function updateClientSessionConfig(data) {
|
||||
return createAxios({
|
||||
url: '/user-boot/authClient/sessionConfigUpdate',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
//获取用户配置
|
||||
export function getUserConfig() {
|
||||
return createAxios({
|
||||
url: '/user-boot/password/getUserStrategyList',
|
||||
method: 'post'
|
||||
})
|
||||
}
|
||||
|
||||
//查询系统列表
|
||||
export function getSystemList() {
|
||||
return createAxios({
|
||||
url: '/system-boot/config/getSysConfigData',
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
//激活系统配置
|
||||
export function activeSystemConfig(data) {
|
||||
return createAxios({
|
||||
url: '/system-boot/config/updateSysConfig',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
//删除系统配置
|
||||
export function deleteSystemConfig( data) {
|
||||
return createAxios({
|
||||
url: '/system-boot/config/removeSysConfigById',
|
||||
method: 'get',
|
||||
params: data
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//新增系统配置
|
||||
export function addSystemConfig(data) {
|
||||
return createAxios({
|
||||
url: '/system-boot/config/addSysConfig',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
//修改系统配置
|
||||
export function updateSystemConfig(data) {
|
||||
return createAxios({
|
||||
url: '/system-boot/config/updateSysConfig',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
28
src/api/device-boot/sensitiveLoadMange.ts
Normal file
28
src/api/device-boot/sensitiveLoadMange.ts
Normal file
@@ -0,0 +1,28 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
// 新增敏感用户
|
||||
export function saveUser(data: any) {
|
||||
return request({
|
||||
url: '/device-boot/pqSensitiveUser/save',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改敏感用户
|
||||
export function updateUser(data: any) {
|
||||
return request({
|
||||
url: '/device-boot/pqSensitiveUser/update',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除敏感用户
|
||||
export function deleteUser(data: any) {
|
||||
return request({
|
||||
url: '/device-boot/pqSensitiveUser/delete',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
37
src/api/system-boot/area.ts
Normal file
37
src/api/system-boot/area.ts
Normal file
@@ -0,0 +1,37 @@
|
||||
import request from '@/utils/request'
|
||||
//区域树形表格接口
|
||||
export function areaTree(data: any) {
|
||||
return request({
|
||||
url: '/system-boot/area/areaTree',
|
||||
method: 'post',
|
||||
params: data,
|
||||
})
|
||||
}
|
||||
export function areaAdd(data: any) {
|
||||
return request({
|
||||
url: '/system-boot/area/add',
|
||||
method: 'post',
|
||||
data: data,
|
||||
})
|
||||
}
|
||||
export function areaDelete(data: any) {
|
||||
return request({
|
||||
url: '/system-boot/area/delete',
|
||||
method: 'post',
|
||||
data: data,
|
||||
})
|
||||
}
|
||||
export function update(data: any) {
|
||||
return request({
|
||||
url: '/system-boot/area/update',
|
||||
method: 'post',
|
||||
data: data,
|
||||
})
|
||||
}
|
||||
export function selectPid(data: any) {
|
||||
return request({
|
||||
url: '/system-boot/area/selectPid',
|
||||
method: 'post',
|
||||
data: data,
|
||||
})
|
||||
}
|
||||
@@ -57,6 +57,7 @@ class MQTT {
|
||||
// ? 'ws://192.168.1.68:8083/mqtt'
|
||||
// : localStorage.getItem('MqttUrl')
|
||||
const mqttUrl = localStorage.getItem('MqttUrl')
|
||||
console.log('MQTT URL:', mqttUrl)
|
||||
if (mqttUrl == 'null' || mqttUrl == null) return
|
||||
this.client = mqtt.connect(mqttUrl, this.defaultOptions as IClientOptions)
|
||||
this.setupEventListeners()
|
||||
|
||||
@@ -137,6 +137,7 @@ export default class TableStore {
|
||||
|
||||
this.table.params.pageNum = 1
|
||||
this.index()
|
||||
console.log('search')
|
||||
}
|
||||
],
|
||||
[
|
||||
|
||||
107
src/views/pqs/business/terminal/sensitiveLoadMange/detail.vue
Normal file
107
src/views/pqs/business/terminal/sensitiveLoadMange/detail.vue
Normal file
@@ -0,0 +1,107 @@
|
||||
<template>
|
||||
<el-dialog class="cn-operate-dialog" width="600px" v-model.trim="dialogVisible" :title="title">
|
||||
<el-form :model="form" class="form-one" label-width="auto" ref="formRef" :rules="rules">
|
||||
<el-form-item label="所属厂站名称" prop="substationName">
|
||||
<el-input v-model.trim="form.substationName" placeholder="请输入所属厂站名称"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="敏感用户名称" prop="name">
|
||||
<el-input v-model.trim="form.name" placeholder="请输入敏感用户名称"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="敏感负荷类型" prop="loadType">
|
||||
<el-select v-model.trim="form.loadType" filterable clearable placeholder="请选择数据分类">
|
||||
<el-option
|
||||
v-for="item in DataTypeSelect"
|
||||
:key="item.id"
|
||||
:label="item.name"
|
||||
:value="item.id"
|
||||
></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="用户协议容量(MVA)" prop="userAgreementCapacity">
|
||||
<el-input-number style="width: 100%;" :min="0" maxlength="32" show-word-limit v-model.number="form.userAgreementCapacity" placeholder="请输入用户协议容量"></el-input-number>
|
||||
</el-form-item>
|
||||
<el-form-item label="装机容量(MW)" prop="installedCapacity">
|
||||
<el-input-number style="width: 100%;" :min="0" maxlength="32" show-word-limit v-model.number="form.installedCapacity" placeholder="请输入装机容量"></el-input-number>
|
||||
</el-form-item>
|
||||
<el-form-item label="排序" prop="sort">
|
||||
<el-input-number style="width: 100%;" :min="0" maxlength="32" show-word-limit v-model.number="form.sort" placeholder="请输入排序"></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="submit">确认</el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import { ref,inject } from 'vue'
|
||||
import { reactive } from 'vue'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import TableStore from '@/utils/tableStore'
|
||||
import { queryByCode, queryCsDictTree } from '@/api/system-boot/dictTree'
|
||||
import { saveUser, updateUser } from '@/api/device-boot/sensitiveLoadMange'
|
||||
import { useDictData } from '@/stores/dictData'
|
||||
|
||||
const TypeOptions = ref()
|
||||
|
||||
const dictData = useDictData()
|
||||
const DataTypeSelect = dictData.getBasicData('Interference_Source')
|
||||
|
||||
const tableStore = inject('tableStore') as TableStore
|
||||
|
||||
const formRef = ref()
|
||||
const form = reactive<any>({
|
||||
loadType: [],
|
||||
substationName: null,
|
||||
installedCapacity: null,
|
||||
name: null,
|
||||
userAgreementCapacity:null,
|
||||
id: null,
|
||||
sort:100
|
||||
})
|
||||
const rules = {
|
||||
substationName: [{ required: true, message: '请输入所属厂站名称', trigger: 'blur' }],
|
||||
name: [{ required: true, message: '请输入敏感用户名称', trigger: 'blur' }],
|
||||
loadType: [{ required: true, message: '请输入请选择敏感负荷类型', trigger: 'blur' }],
|
||||
installedCapacity: [{ required: true, message: '请输入用户协议容量', trigger: 'blur' }],
|
||||
userAgreementCapacity: [{ required: true, message: '请输入装机容量', trigger: 'blur' }],
|
||||
sort: [{ required: true, message: '请输入排序', trigger: 'blur' }]
|
||||
}
|
||||
|
||||
const dialogVisible = ref(false)
|
||||
const title = ref('新增')
|
||||
const open = (text: string, data?: anyObj) => {
|
||||
formRef.value?.resetFields()
|
||||
title.value = text
|
||||
dialogVisible.value = true
|
||||
if (data) {
|
||||
for (let key in form) {
|
||||
form[key] = data[key]
|
||||
}
|
||||
} else {
|
||||
for (let key in form) {
|
||||
form[key] = null
|
||||
form.sort = 100
|
||||
}
|
||||
}
|
||||
}
|
||||
const submit = () => {
|
||||
formRef.value.validate(async (valid: boolean) => {
|
||||
if (valid) {
|
||||
if (form.id) {
|
||||
await updateUser(form)
|
||||
} else {
|
||||
await saveUser(form)
|
||||
}
|
||||
ElMessage.success('操作成功')
|
||||
tableStore.index()
|
||||
dialogVisible.value = false
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
defineExpose({ open })
|
||||
</script>
|
||||
117
src/views/pqs/business/terminal/sensitiveLoadMange/index.vue
Normal file
117
src/views/pqs/business/terminal/sensitiveLoadMange/index.vue
Normal file
@@ -0,0 +1,117 @@
|
||||
<template>
|
||||
<div class="default-main">
|
||||
<TableHeader :showReset="false" showExport>
|
||||
<template #select>
|
||||
<el-form-item label="关键字筛选">
|
||||
<el-input
|
||||
maxlength="32"
|
||||
show-word-limit
|
||||
style="width: 240px"
|
||||
v-model.trim="tableStore.table.params.searchValue"
|
||||
clearable
|
||||
placeholder="请输入敏感负荷名称"
|
||||
/>
|
||||
</el-form-item>
|
||||
</template>
|
||||
<template #operation>
|
||||
<el-button :icon="Plus" type="primary" @click="addMenu" class="ml10">新增</el-button>
|
||||
</template>
|
||||
</TableHeader>
|
||||
<Table ref="tableRef" />
|
||||
<detail ref="detail"></detail>
|
||||
</div>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import { ref, onMounted, provide } from 'vue'
|
||||
import TableStore from '@/utils/tableStore'
|
||||
import Table from '@/components/table/index.vue'
|
||||
import TableHeader from '@/components/table/header/index.vue'
|
||||
import Detail from './detail.vue'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import { deleteUser } from '@/api/device-boot/sensitiveLoadMange'
|
||||
import { Plus } from '@element-plus/icons-vue'
|
||||
import { useDictData } from '@/stores/dictData'
|
||||
|
||||
defineOptions({
|
||||
name: 'govern/sensitiveLoadMange/index'
|
||||
})
|
||||
const detail = ref()
|
||||
|
||||
const dictData = useDictData()
|
||||
const interferenceType = dictData.getBasicData('Interference_Source')
|
||||
|
||||
const tableStore: any = new TableStore({
|
||||
url: '/device-boot/pqSensitiveUser/getList',
|
||||
method: 'POST',
|
||||
column: [
|
||||
{
|
||||
title: '序号',
|
||||
width: 80,
|
||||
formatter: (row: any) => {
|
||||
return (tableStore.table.params.pageNum - 1) * tableStore.table.params.pageSize + row.rowIndex + 1
|
||||
}
|
||||
},
|
||||
{ title: '所属厂站名称', field: 'substationName', minWidth: 180 },
|
||||
{ title: '敏感用户名称', field: 'name', minWidth: 180 },
|
||||
{
|
||||
title: '敏感负荷类型',
|
||||
field: 'loadType',
|
||||
minWidth: 120,
|
||||
formatter: row => {
|
||||
return interferenceType.filter(item => item.id == row.cellValue)[0]?.name
|
||||
}
|
||||
},
|
||||
{ title: '用户协议容量(MVA)', field: 'userAgreementCapacity', minWidth: 100 },
|
||||
{ title: '装机容量(MW)', field: 'installedCapacity', minWidth: 100 },
|
||||
{
|
||||
title: '操作', fixed: 'right',
|
||||
align: 'center',
|
||||
width: '180',
|
||||
|
||||
render: 'buttons',
|
||||
buttons: [
|
||||
{
|
||||
name: 'edit',
|
||||
title: '编辑',
|
||||
type: 'primary',
|
||||
icon: 'el-icon-EditPen',
|
||||
render: 'basicButton',
|
||||
click: row => {
|
||||
detail.value.open('编辑', row)
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'del',
|
||||
title: '删除',
|
||||
type: 'danger',
|
||||
icon: 'el-icon-Delete',
|
||||
render: 'confirmButton',
|
||||
popconfirm: {
|
||||
confirmButtonText: '确认',
|
||||
cancelButtonText: '取消',
|
||||
confirmButtonType: 'danger',
|
||||
title: '确定删除吗?'
|
||||
},
|
||||
click: row => {
|
||||
deleteUser([row.id]).then(res => {
|
||||
ElMessage.success('删除成功')
|
||||
tableStore.index()
|
||||
})
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
loadCallback: () => {}
|
||||
})
|
||||
|
||||
tableStore.table.params.searchValue = ''
|
||||
provide('tableStore', tableStore)
|
||||
onMounted(() => {
|
||||
tableStore.index()
|
||||
})
|
||||
|
||||
const addMenu = () => {
|
||||
detail.value.open('新增')
|
||||
}
|
||||
</script>
|
||||
@@ -129,17 +129,9 @@ const tableStore = new TableStore({
|
||||
{ field: 'subName', title: '变电站', minWidth: '150' },
|
||||
{ field: 'ip', title: '网络参数' ,width:'120px' },
|
||||
{ field: 'scale', title: '电压等级', minWidth: '110' },
|
||||
// {
|
||||
// field: 'advanceType',
|
||||
// title: '触发类型',
|
||||
// minWidth: '90',
|
||||
// formatter: (row: any) => {
|
||||
// return row.cellValue || '其他'
|
||||
// }
|
||||
// },
|
||||
{
|
||||
field: 'advanceReason',
|
||||
title: '暂降原因',
|
||||
field: 'advanceType',
|
||||
title: '暂降类型',
|
||||
minWidth: '90',
|
||||
formatter: (row: any) => {
|
||||
return row.cellValue || '其他'
|
||||
@@ -153,6 +145,15 @@ const tableStore = new TableStore({
|
||||
return eventList.filter(item => item.id === row.cellValue)[0]?.name
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'advanceReason',
|
||||
title: '暂降原因',
|
||||
minWidth: '90',
|
||||
formatter: (row: any) => {
|
||||
return row.cellValue || '其他'
|
||||
}
|
||||
},
|
||||
|
||||
// {
|
||||
// field: 'severity', title: '严重度', minWidth: "80", formatter: (row: any) => {
|
||||
// return row.cellValue.toFixed(2)
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="关键字筛选:">
|
||||
<el-input v-model="tableStore.table.params.searchValue" clearable placeholder="请输入关键字"></el-input>
|
||||
<el-input v-model="tableStore.table.params.searchValue" clearable placeholder="请输入关键字"></el-input>
|
||||
</el-form-item>
|
||||
</template>
|
||||
<template #operation>
|
||||
|
||||
@@ -103,7 +103,11 @@ const init = () => {
|
||||
)
|
||||
}
|
||||
options.value = {
|
||||
title: {
|
||||
text: formData.harmState == 0 ? '谐波电压频谱' : '谐波电流频谱'
|
||||
},
|
||||
xAxis: {
|
||||
|
||||
name: '次数',
|
||||
type: 'category',
|
||||
data: Array.from({ length: 49 }, (_, i) => `${i + 2}次`)
|
||||
|
||||
@@ -35,8 +35,8 @@ defineOptions({
|
||||
name: 'harmonic-boot/reate/word'
|
||||
})
|
||||
const dictData = useDictData()
|
||||
//区域联级选择
|
||||
const industry = dictData.getBasicData('Interference_Source')
|
||||
//行业类型选择
|
||||
const industry = dictData.getBasicData('Business_Type')
|
||||
//用户信息弹出框
|
||||
const tableRef = ref()
|
||||
|
||||
|
||||
@@ -8621,6 +8621,91 @@ const 葫芦岛 = [
|
||||
]
|
||||
]
|
||||
|
||||
const 海口 = [
|
||||
[
|
||||
{ lng: 110.106525, lat:20.026851},
|
||||
{ lng: 110.161895, lat:19.977693},
|
||||
{ lng: 110.143932, lat:19.889106},
|
||||
{ lng: 110.186246, lat:19.864193},
|
||||
{ lng: 110.228283, lat:19.753767},
|
||||
{ lng: 110.208468, lat:19.716679},
|
||||
{ lng: 110.222357, lat:19.67974},
|
||||
{ lng: 110.262449, lat:19.687318},
|
||||
{ lng: 110.314208, lat:19.697421},
|
||||
{ lng: 110.340041, lat:19.720625},
|
||||
{ lng: 110.393373, lat:19.698053},
|
||||
{ lng: 110.372633, lat:19.654004},
|
||||
{ lng: 110.401151, lat:19.606626},
|
||||
{ lng: 110.455687, lat:19.574559},
|
||||
{ lng: 110.486705, lat:19.593357},
|
||||
{ lng: 110.519297, lat:19.563341},
|
||||
{ lng: 110.540223, lat:19.535532},
|
||||
{ lng: 110.611518, lat:19.526841},
|
||||
{ lng: 110.641333, lat:19.549122},
|
||||
{ lng: 110.636148, lat:19.593989},
|
||||
{ lng: 110.672814, lat:19.647214},
|
||||
{ lng: 110.623463, lat:19.664109},
|
||||
{ lng: 110.623, lat:19.735461},
|
||||
{ lng: 110.670314, lat:19.812776},
|
||||
{ lng: 110.704665, lat:19.805992},
|
||||
{ lng: 110.699573, lat:19.861512},
|
||||
{ lng: 110.676147, lat:19.860092},
|
||||
{ lng: 110.675314, lat:19.907868},
|
||||
{ lng: 110.634666, lat:19.965401},
|
||||
{ lng: 110.598, lat:19.98305},
|
||||
{ lng: 110.526612, lat:20.075206},
|
||||
{ lng: 110.495039, lat:20.077253},
|
||||
{ lng: 110.387355, lat:20.11347},
|
||||
{ lng: 110.318467, lat:20.109061},
|
||||
{ lng: 110.293282, lat:20.059614},
|
||||
{ lng: 110.24319, lat:20.077568},
|
||||
{ lng: 110.144395, lat:20.074418},
|
||||
{ lng: 110.106525, lat:20.026851}
|
||||
]
|
||||
]
|
||||
const 三亚=[
|
||||
[
|
||||
{ lng: 108.932374, lat:18.335288},
|
||||
{ lng: 108.956448, lat:18.307433},
|
||||
{ lng: 109.006632, lat:18.323032},
|
||||
{ lng: 109.108298, lat:18.323828},
|
||||
{ lng: 109.138668, lat:18.267791},
|
||||
{ lng: 109.174686, lat:18.260149},
|
||||
{ lng: 109.28811, lat:18.264925},
|
||||
{ lng: 109.355887, lat:18.214922},
|
||||
{ lng: 109.441349, lat:18.199153},
|
||||
{ lng: 109.4632, lat:18.177171},
|
||||
{ lng: 109.527366, lat:18.169046},
|
||||
{ lng: 109.561718, lat:18.143554},
|
||||
{ lng: 109.63792, lat:18.171595},
|
||||
{ lng: 109.72616, lat:18.177808},
|
||||
{ lng: 109.749863, lat:18.19326},
|
||||
{ lng: 109.783381, lat:18.337516},
|
||||
{ lng: 109.805418, lat:18.347543},
|
||||
{ lng: 109.785048, lat:18.426622},
|
||||
{ lng: 109.809955, lat:18.459388},
|
||||
{ lng: 109.781159, lat:18.51107},
|
||||
{ lng: 109.725234, lat:18.493102},
|
||||
{ lng: 109.710882, lat:18.426462},
|
||||
{ lng: 109.665883, lat:18.391462},
|
||||
{ lng: 109.539866, lat:18.396713},
|
||||
{ lng: 109.515607, lat:18.429008},
|
||||
{ lng: 109.536996, lat:18.490717},
|
||||
{ lng: 109.535237, lat:18.53142},
|
||||
{ lng: 109.506163, lat:18.551291},
|
||||
{ lng: 109.423386, lat:18.574657},
|
||||
{ lng: 109.405146, lat:18.623443},
|
||||
{ lng: 109.332832, lat:18.575451},
|
||||
{ lng: 109.313295, lat:18.517429},
|
||||
{ lng: 109.246537, lat:18.558921},
|
||||
{ lng: 109.203574, lat:18.553517},
|
||||
{ lng: 109.185056, lat:18.507095},
|
||||
{ lng: 109.195148, lat:18.469407},
|
||||
{ lng: 109.072557, lat:18.452231},
|
||||
{ lng: 109.015243, lat:18.422645},
|
||||
{ lng: 108.932374, lat:18.335288}
|
||||
]
|
||||
]
|
||||
export default {
|
||||
zjkJSON,
|
||||
lfJSON,
|
||||
@@ -8640,5 +8725,7 @@ export default {
|
||||
铁岭,
|
||||
朝阳,
|
||||
葫芦岛,
|
||||
沈阳
|
||||
沈阳,
|
||||
海口,
|
||||
三亚
|
||||
}
|
||||
|
||||
@@ -53,6 +53,10 @@
|
||||
</div>
|
||||
<div class="collapse_none" style="color: red; cursor: pointer" @click="showWrap = false">关闭</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<baidu-map
|
||||
class="map"
|
||||
:style="height"
|
||||
@@ -329,6 +333,16 @@ const boundaryList: any = ref([
|
||||
orgName: '鞍山',
|
||||
LngLat: [122.808845, 40.840049],
|
||||
boundary: mapJson['鞍山']
|
||||
},
|
||||
{
|
||||
orgName: '海口',
|
||||
LngLat: [110.32, 20.03],
|
||||
boundary: mapJson['海口']
|
||||
},
|
||||
{
|
||||
orgName: '三亚',
|
||||
LngLat: [109.51, 18.25],
|
||||
boundary: mapJson['三亚']
|
||||
}
|
||||
])
|
||||
|
||||
@@ -340,6 +354,8 @@ const lineId = ref('')
|
||||
const center = ref({
|
||||
lng: 122.42588,
|
||||
lat: 40.810977
|
||||
// lng: 109.5, // 海南经度
|
||||
// lat: 18.5 // 海南纬度
|
||||
})
|
||||
const infoWindowPoint = ref<anyObj>({
|
||||
lng: 0,
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
</el-collapse-item>
|
||||
<el-collapse-item :title="item.name" v-for="(item, index) in column" :key="index" :name="index + 3">
|
||||
<div style="height: 200px">
|
||||
|
||||
<vxe-table height="auto" :data="form[item.key]" v-bind="defaultAttribute" v-loading="item.loading">
|
||||
<vxe-column type="seq" title="序号" width="80px"></vxe-column>
|
||||
<vxe-column
|
||||
|
||||
@@ -467,6 +467,7 @@ const dictionary = () => {
|
||||
|
||||
}
|
||||
onBeforeMount(async () => {
|
||||
|
||||
await dictionary()
|
||||
info(0) // 变压器参数维护
|
||||
info(1) // 电容器参数维护
|
||||
|
||||
@@ -85,6 +85,7 @@ const eliminate = (name: string) => {
|
||||
|
||||
// 地图数处理
|
||||
const map = (res: any) => {
|
||||
|
||||
echartMapList.value = {
|
||||
name: '',
|
||||
title: {
|
||||
|
||||
@@ -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"
|
||||
@@ -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>
|
||||
|
||||
<!-- 折叠面板 -->
|
||||
<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-divider content-position="left">系统策略</el-divider>
|
||||
<el-form-item label="最大并发数:" prop="maxUseUser">
|
||||
<el-form-item label="认证令牌时效(秒):" prop="accessTokenValidity">
|
||||
<el-input-number
|
||||
v-model.number="form.maxUseUser"
|
||||
:min="10"
|
||||
:max="99"
|
||||
style="width: 100%"
|
||||
></el-input-number>
|
||||
</el-form-item>
|
||||
<el-divider content-position="left">账号锁定策略</el-divider>
|
||||
<el-form-item label="密码输入错误次数:" prop="errorsCount">
|
||||
<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"
|
||||
v-model.number="form.accessTokenValidity"
|
||||
:min="10"
|
||||
style="width: 100%"
|
||||
></el-input-number>
|
||||
</el-form-item>
|
||||
<el-divider content-position="left">账号密码复杂度校验</el-divider>
|
||||
<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="form.passwordExpirationMonth"
|
||||
v-model.number="editForm.passwordExpirationMonth"
|
||||
:min="1"
|
||||
:max="6"
|
||||
style="width: 100%"
|
||||
></el-input-number>
|
||||
</el-form-item>
|
||||
<el-form-item label="账号长时间未登录休眠期(天):" prop="sleepDay">
|
||||
<el-form-item label="密码错误次数限定(次):" prop="errorsCount">
|
||||
<el-input-number
|
||||
v-model.number="form.sleepDay"
|
||||
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>
|
||||
</div>
|
||||
<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
|
||||
style="width: 100%"
|
||||
type="number"
|
||||
v-model="sysForm.logSize"
|
||||
:min="1024"
|
||||
:max="20480"
|
||||
placeholder="请输入审计日志大小"
|
||||
></el-input-number>
|
||||
</el-form-item>
|
||||
<el-form-item label="日志储存时间(月):" prop="logTime" class="top">
|
||||
<el-input-number
|
||||
style="width: 100%"
|
||||
type="number"
|
||||
v-model="sysForm.logTime"
|
||||
:min="1"
|
||||
:max="6"
|
||||
placeholder="请输入日志储存时间不能大于6个月"
|
||||
></el-input-number>
|
||||
</el-form-item>
|
||||
<el-form-item label="激活状态:" class="top" prop="state">
|
||||
<el-select
|
||||
v-model="sysForm.state"
|
||||
:disabled="flagtyoe == 'add' ? false : true"
|
||||
placeholder="请选择"
|
||||
style="width: 100%"
|
||||
>
|
||||
<el-option label="未激活" value="0"></el-option>
|
||||
<el-option label="已激活" value="1"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</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) {
|
||||
|
||||
:deep(.el-form-item__label ){
|
||||
color: var(--el-color-primary);
|
||||
font-weight: 600;
|
||||
}
|
||||
</style>
|
||||
Reference in New Issue
Block a user