系统相关配置

This commit is contained in:
sjl
2026-02-27 08:49:57 +08:00
parent bfa061fb03
commit b25515b5db
21 changed files with 1403 additions and 142 deletions

View File

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

View 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
})
}

View 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,
})
}

View File

@@ -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()

View File

@@ -137,6 +137,7 @@ export default class TableStore {
this.table.params.pageNum = 1
this.index()
console.log('search')
}
],
[

View 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>

View 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>

View File

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

View File

@@ -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>

View File

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

View File

@@ -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()

View File

@@ -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 {
,
,
,
,
,
}

View File

@@ -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,

View File

@@ -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

View File

@@ -467,6 +467,7 @@ const dictionary = () => {
}
onBeforeMount(async () => {
await dictionary()
info(0) // 变压器参数维护
info(1) // 电容器参数维护

View File

@@ -85,6 +85,7 @@ const eliminate = (name: string) => {
// 地图数处理
const map = (res: any) => {
echartMapList.value = {
name: '',
title: {

View File

@@ -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>

View File

@@ -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 = () => {

View 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>

View File

@@ -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'

View File

@@ -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>