系统相关配置

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

@@ -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"
@@ -32,14 +32,14 @@
<el-col :span="11">
<div class="grid-content">
<el-tree
:data="data"
show-checkbox
node-key="id"
:props="defaultProps"
:default-checked-keys="treeCheckedData"
:default-expanded-keys="treeExpandData"
@check-change="handleCheckChange"
ref="tree"
:data="data"
show-checkbox
node-key="id"
:props="defaultProps"
:default-checked-keys="treeCheckedData"
:default-expanded-keys="treeExpandData"
@check-change="handleCheckChange"
ref="tree"
>
</el-tree>
</div
@@ -78,7 +78,7 @@ import { ref, onMounted, provide, nextTick } from 'vue'
import TableStore from '@/utils/tableStore'
import Table from '@/components/table/index.vue'
import TableHeader from '@/components/table/header/index.vue'
import { addData,updateData,deleteData,getList,getDictTree } from '@/api/system-boot/MonitoringPoint'
import { addData,updateData,deleteData,getDictTree } from '@/api/system-boot/MonitoringPoint'
import { ElMessage } from 'element-plus'
import Administration from '@/views/system/ReportConfiguration/components/Administration.vue'
@@ -102,8 +102,10 @@ const form = ref({
name: '',
code: '',
type: 0,
ids: []
})
// 表单验证规则
const rules = {
name: [
@@ -118,8 +120,9 @@ const rules = {
const data = ref([]) // 树形数据源
const defaultProps = {
children: 'children',
label: 'label'
label: 'reportDescribe'
}
const treeCheckedData = ref([]) // 默认选中的节点
const treeExpandData = ref([]) // 默认展开的节点
@@ -128,10 +131,16 @@ const options = ([
{ value: '1', label: '区域报告' },
])
const openReportDictionary = () => {
console.log('点击了报告字典管理按钮')
showDictionary.value = true
console.log('showDictionary 当前值:', showDictionary.value)
const treeDataForChild = ref([]) // 用于存储传递给子组件的树数据
const openReportDictionary = async () => {
try {
const res = await getDictTree({ type: Number(tableStore.table.params.type) })
treeDataForChild.value = res.data // 将数据存储到响应式变量中
showDictionary.value = true // 打开子组件
} catch (error) {
ElMessage.error('获取字典数据失败')
}
}
const closeReportDictionary = () => {
@@ -150,7 +159,6 @@ const tableStore: any = new TableStore({
width: '220',
render: 'buttons',
buttons: [
{
name: 'edit',
title: '编辑',
@@ -166,8 +174,16 @@ const tableStore: any = new TableStore({
id: row.id,
name: row.name,
code: row.code,
type: row.type
type: row.type,
ids: row.rdIds
}
// 获取树数据
formData.type = row.type
getDictTree(formData).then(res => {
data.value = res.data
treeCheckedData.value= row.rdIds
setDefaultExpandedKeys(res.data)
})
}
},
@@ -201,9 +217,21 @@ tableStore.table.params = {}
tableStore.table.params.type = '0'
provide('tableStore', tableStore)
// 模板类型变更
const handleTypeChange = (value: string) => {
tableStore.table.params.type = value
tableStore.index()
}
const formData= reactive({
pageNum: 1,
pageSize: 20,
type: 0,
})
const add = () => {
isEdit.value = true
isEdit.value = false
title.value = '新增模板'
dialogVisible.value = true
// 初始化表单数据
@@ -211,9 +239,26 @@ const add = () => {
id: '',
name: '',
code: '',
type: tableStore.table.params.type
type: tableStore.table.params.type,
ids: []
}
formData.type = tableStore.table.params.type
treeCheckedData.value = []
getDictTree(formData).then(res => {
data.value = res.data
setDefaultExpandedKeys(res.data)
})
}
const setDefaultExpandedKeys = (treeData: any[]) => {
const firstLevelIds = treeData.map(item => item.id)
treeExpandData.value = firstLevelIds
}
const handleCheckChange = (data: any, checked: boolean, indeterminate: boolean) => {
// 获取当前选中的节点 key 值
const checkedKeys = tree.value?.getCheckedKeys() || []
form.value.ids = checkedKeys // 将选中的节点 ID 更新到表单数据中
}
const addDetermine = () => {

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>
<div style="width: 500px">
<el-form ref="formRef" :model="form" label-width="auto" :rules="rules">
<el-divider content-position="left">系统策略</el-divider>
<el-form-item label="最大并发数:" prop="maxUseUser">
<!-- 折叠面板 -->
<el-collapse v-model="activeNames" >
<!-- 客户端配置置 -->
<el-collapse-item title="客户端配置" name="1">
<div style="width: 500px">
<el-form ref="formRef" :model="form" label-width="auto" :rules="rules">
<el-form-item label="认证令牌时效(秒):" prop="accessTokenValidity">
<el-input-number
v-model.number="form.accessTokenValidity"
:min="10"
style="width: 100%"
></el-input-number>
</el-form-item>
<el-form-item label="刷新令牌时效(秒):" prop="refreshTokenValidity">
<el-input-number
v-model.number="form.refreshTokenValidity"
:min="10"
style="width: 100%"
></el-input-number>
</el-form-item>
</el-form>
</div>
<el-button @click="AddClick()" type="primary" :icon="Check" >保存</el-button>
</el-collapse-item>
<el-collapse-item :title="item.name" v-for="(item, index) in column" :key="index" :name="String(index + 2)" >
<div class="mb10">
<el-button
type="primary"
icon="el-icon-Plus"
@click="addForm()"
v-if="item.name === '系统配置'"
>
新增类型</el-button>
</div>
<div style="height: 250px">
<vxe-table
height="auto"
:data="configForm[item.key]"
v-bind="defaultAttribute"
>
<vxe-column
v-for="(k, index) in item.child"
:key="index"
:field="k.field"
:title="k.title"
></vxe-column>
<vxe-column title="操作" width="150px">
<template #default="{ row }">
<el-button type="text" @click="sysActive(row)" v-if="item.key =='getSystemList' && row.state == '未激活'">激活</el-button>
<el-button type="text" @click="editConfig(item, row)">编辑</el-button>
<el-button type="text" @click="sysDelete(row)" v-if="item.key =='getSystemList'">删除</el-button>
</template>
</vxe-column>
</vxe-table>
</div>
</el-collapse-item>
</el-collapse>
<el-dialog v-model="dialogVisible" title="编辑用户配置" width="500px">
<el-form ref="editFormRef" :model="editForm" :rules="editRules" label-width="auto">
<el-form-item label="密码有效期(月):" prop="passwordExpirationMonth">
<el-input-number
v-model.number="editForm.passwordExpirationMonth"
:min="1"
:max="6"
style="width: 100%"
></el-input-number>
</el-form-item>
<el-form-item label="密码错误次数限定(次):" prop="errorsCount">
<el-input-number
v-model.number="editForm.errorsCount"
:min="3"
:max="20"
style="width: 100%"
></el-input-number>
</el-form-item>
<el-form-item label="验证密码错误次数时间范围(分钟):" prop="lockPwdCheck">
<el-input-number
v-model.number="editForm.lockPwdCheck"
:min="5"
:max="60"
style="width: 100%"
></el-input-number>
</el-form-item>
<el-form-item label="用户锁定时间(分钟):" prop="releaseTime">
<el-input-number
v-model.number="editForm.releaseTime"
:min="30"
:max="60"
style="width: 100%"
></el-input-number>
</el-form-item>
<el-form-item label="用户休眠(天):" prop="sleepDay">
<el-input-number
v-model.number="editForm.sleepDay"
:min="1"
:max="180"
style="width: 100%"
></el-input-number>
</el-form-item>
<el-form-item label="用户注销(天):" prop="logoutDay">
<el-input-number
v-model.number="editForm.logoutDay"
:min="1"
:max="360"
style="width: 100%"
></el-input-number>
</el-form-item>
<el-form-item label="最大并发数:" prop="maxUseUser">
<el-input-number
v-model.number="editForm.maxUseUser"
:min="10"
:max="99"
style="width: 100%"
></el-input-number>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="dialogVisible = false">取消</el-button>
<el-button type="primary" @click="saveEdit">确定</el-button>
</span>
</template>
</el-dialog>
<el-dialog v-model="systemDialogVisible" :title=sysTitle width="500px">
<el-form ref="sysFormRef" :model="sysForm" :rules="sysRules" label-width="auto">
<el-form-item label="系统类型:" prop="type">
<el-select v-model="sysForm.type" placeholder="请选择系统类型" style="width: 100%">
<el-option label="省级系统" value="0"></el-option>
<el-option label="企业系统" value="1"></el-option>
<el-option label="数据中心" value="2"></el-option>
</el-select>
</el-form-item>
<el-form-item label="数据上报:" prop="dataReport" class="top">
<el-input style="width: 100%" v-model="sysForm.dataReport" placeholder="请输入数据上报"></el-input>
</el-form-item>
<el-form-item label="审计日志大小(M):" prop="logSize" class="top">
<el-input-number
v-model.number="form.maxUseUser"
:min="10"
:max="99"
style="width: 100%"
type="number"
v-model="sysForm.logSize"
:min="1024"
:max="20480"
placeholder="请输入审计日志大小"
></el-input-number>
</el-form-item>
<el-divider content-position="left">账号锁定策略</el-divider>
<el-form-item label="密码输入错误次数:" prop="errorsCount">
<el-form-item label="日志储存时间(月):" prop="logTime" class="top">
<el-input-number
v-model.number="form.errorsCount"
:min="3"
:max="20"
style="width: 100%"
></el-input-number>
</el-form-item>
<el-form-item label="自动解锁(分钟):" prop="releaseTime">
<el-input-number
v-model.number="form.releaseTime"
:min="5"
:max="60"
style="width: 100%"
></el-input-number>
</el-form-item>
<el-form-item label="会话超时时间(秒):" prop="sessionTime">
<el-input-number v-model.number="form.sessionTime" :min="10" style="width: 100%"></el-input-number>
</el-form-item>
<el-form-item label="token刷新时间(秒):" prop="sessionRefreshTime">
<el-input-number
v-model.number="form.sessionRefreshTime"
:min="10"
style="width: 100%"
></el-input-number>
</el-form-item>
<el-divider content-position="left">账号密码复杂度校验</el-divider>
<el-form-item label="密码有效期(月):" prop="passwordExpirationMonth">
<el-input-number
v-model.number="form.passwordExpirationMonth"
type="number"
v-model="sysForm.logTime"
:min="1"
:max="6"
style="width: 100%"
placeholder="请输入日志储存时间不能大于6个月"
></el-input-number>
</el-form-item>
<el-form-item label="账号长时间未登录休眠期(天):" prop="sleepDay">
<el-input-number
v-model.number="form.sleepDay"
:min="1"
:max="180"
<el-form-item label="激活状态:" class="top" prop="state">
<el-select
v-model="sysForm.state"
:disabled="flagtyoe == 'add' ? false : true"
placeholder="请选择"
style="width: 100%"
></el-input-number>
>
<el-option label="未激活" value="0"></el-option>
<el-option label="已激活" value="1"></el-option>
</el-select>
</el-form-item>
</el-form>
</div>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="systemDialogVisible = false">取消</el-button>
<el-button type="primary" @click="saveSystem">确定</el-button>
</span>
</template>
</el-dialog>
</div>
</template>
<script setup>
<script setup lang="ts">
import { ref, reactive, onMounted } from 'vue'
import { ElMessage } from 'element-plus'
import { ruleUpdate, getRule, unlockRoot } from '@/api/admin/user.js'
import { Plus } from '@element-plus/icons-vue'
import { ElMessage, MessageParams } from 'element-plus'
import { updateClientSessionConfig, getClientInfoByPath, ruleUpdate ,getUserConfig,getSystemList,activeSystemConfig,deleteSystemConfig,addSystemConfig,updateSystemConfig} from '@/api/admin/user.js'
import { Check } from '@element-plus/icons-vue'
import { mainHeight } from '@/utils/layout'
import { defaultAttribute } from '@/components/table/defaultAttribute'
import { ElMessageBox } from 'element-plus'
// 页面缓存
defineOptions({
@@ -81,55 +201,325 @@ const height = mainHeight(20)
// 定义表单引用
const formRef = ref()
const editFormRef = ref()
const sysFormRef = ref()
const dialogVisible = ref(false)
const systemDialogVisible = ref(false)
const activeNames = ref(['1', '2', '3']) // 默认展开所有面板
const flagtyoe = ref('add') // 用于区分新增或编辑模式
const sysTitle = ref('新增系统配置')
// 定义表单数据
const form = reactive({
maxUseUser: 50,
errorsCount: 0,
passwordExpirationMonth: 0,
sleepDay: 90,
releaseTime: 0,
sessionTime: 0,
sessionRefreshTime: 0
accessTokenValidity: 0,
refreshTokenValidity: 0,
})
// 定义表单验证规则
const rules = {
maxUseUser: [{ required: true, message: '请填写最大并发数', trigger: 'blur' }],
errorsCount: [{ required: true, message: '请填写密码输入错误次数', trigger: 'blur' }],
releaseTime: [{ required: true, message: '请填写自动解锁(分钟)', trigger: 'blur' }],
sessionTime: [{ required: true, message: '请填写会话超时时间', trigger: 'blur' }],
sessionRefreshTime: [{ required: true, message: '请填写会话刷新时间', trigger: 'blur' }],
passwordExpirationMonth: [{ required: true, message: '请填写密码有效期', trigger: 'blur' }],
sleepDay: [{ required: true, message: '请填写休眠期', trigger: 'blur' }]
accessTokenValidity: [{ required: true, message: '请填写会话超时时间', trigger: 'blur' }],
refreshTokenValidity: [{ required: true, message: '请填写会话刷新时间', trigger: 'blur' }],
}
// 获取策略信息
const info = () => {
getRule().then(res => {
Object.assign(form, res.data)
})
const editForm = ref({
passwordExpirationMonth: 3,
errorsCount: 5,
lockPwdCheck: 30,
releaseTime: 30,
sleepDay: 3,
logoutDay: 7,
maxUseUser: 50,
type: '',
})
const editRules = {
passwordExpirationMonth: [{ required: true, message: '请输入密码有效期', trigger: 'blur' }],
errorsCount: [{ required: true, message: '请输入密码错误次数限定', trigger: 'blur' }],
lockPwdCheck: [{ required: true, message: '请输入验证密码错误次数时间范围', trigger: 'blur' }],
releaseTime: [{ required: true, message: '请输入用户锁定时间', trigger: 'blur' }],
sleepDay: [{ required: true, message: '请输入用户休眠时间', trigger: 'blur' }],
logoutDay: [{ required: true, message: '请输入用户注销时间', trigger: 'blur' }],
maxUseUser: [{ required: true, message: '请输入最大并发数', trigger: 'blur' }],
}
// 保存策略
const sysForm = ref({
type: '',
dataReport: '',
logSize: 1024,
logTime: 1,
state: '',
})
const sysRules = {
type: [{ required: true, message: '请选择系统类型', trigger: 'change' }],
dataReport: [{ required: true, message: '请输入数据上报', trigger: 'blur' }],
logSize: [{ required: true, message: '请输入审计日志大小', trigger: 'blur' }],
logTime: [{ required: true, message: '请输入日志储存时间', trigger: 'blur' }],
state: [{ required: true, message: '请选择激活状态', trigger: 'change' }],
}
// 编辑配置项
const editConfig = (item: any, row: any) => {
if(item.name == '用户配置'){
dialogVisible.value = true
Object.assign(editForm.value, row)
}else{
systemDialogVisible.value = true
flagtyoe.value = 'edit'
sysTitle.value = '编辑系统配置'
Object.assign(sysForm.value, row)
}
}
// 保存客户端配置
const AddClick = () => {
formRef.value.validate(valid => {
formRef.value.validate((valid: any) => {
if (valid) {
ruleUpdate(form).then(res => {
updateClientSessionConfig(form).then((res: { data: any }) => {
Object.assign(form, res.data)
ElMessage({
message: '保存成功',
type: 'success'
})
info()
ElMessage.success(res.message)
info(0)
})
}
})
}
// 保存用户配置编辑
const saveEdit = () => {
editFormRef.value.validate((valid: any) => {
if (valid) {
const formData = {
...editForm.value,
type: parseUserType(editForm.value.type),
}
ruleUpdate(formData).then((res: any) => {
ElMessage.success(res.message)
dialogVisible.value = false
info(1)
})
}
})
}
const configForm = ref({
getUserConfig: [], //用户配置
getSystemList: [], //系统配置
})
const column = readonly([
{
name: '用户配置',
key: 'getUserConfig',
child: [
{ field: 'passwordExpirationMonth', title: '密码有效期(月)', width: '120' },
{ field: 'errorsCount', title: '密码错误次数限定', minWidth: '120' },
{ field: 'lockPwdCheck', title: '验证密码错误次数时间范围(天)', minWidth: '200' },
{ field: 'releaseTime', title: '用户锁定时间', width: '120' },
{ field: 'sleepDay', title: '用户休眠(天)', width: '120' },
{ field: 'logoutDay', title: '用户注销(天)', width: '120' },
{ field: 'maxUseUser', title: '最大并发数', width: '120' },
{field: 'type',title: '用户类型',width: '120'},
]
},
{
name: '系统配置',
key: 'getSystemList',
child: [
{
title: '系统类型',
field: 'type',
},
{
title: '数据上报',
field: 'dataReport'
},
{
title: '审计日志大小(M)',
field: 'logSize'
},
{
title: '审计日志存储时间(月))',
field: 'logTime'
},
{
title: '状态',
field: 'state',
},
{
title: '创建用户',
field: 'createBy'
},
{
title: '创建时间',
field: 'createTime'
},
{
title: '更新用户',
field: 'updateBy'
},
{
title: '更新时间',
field: 'updateTime'
},
]
}
])
// 获取客户端配置
const info = async (type: number) => {
if (type === 0) {
// 获取客户端配置
await getClientInfoByPath().then((res: { data: any }) => {
Object.assign(form, res.data)
})
} else if (type === 1) {
// 获取用户配置
await getUserConfig().then((res: { data: { map: (arg0: (item: any) => any) => never[] } }) => {
configForm.value.getUserConfig = res.data.map((item: any) => ({
...item,
type: formatUserType(item.type)
}))
})
} else {
// 获取系统配置
await getSystemList().then((res: { data: { map: (arg0: (item: any) => any) => never[] } }) => {
configForm.value.getSystemList = res.data.map((item: any) => ({
...item,
type: formatSystemType(item.type),
state: formatSystemState(item.state)
}))
})
}
}
const formatUserType = (type: number) => {
return type === 1 ? '正常用户' : '临时用户'
}
const formatSystemType = (type: number) => {
return type === 0 ? '省级系统' : type === 1 ? '企业系统' : type === 2 ? '数据中心' : '/'
}
const formatSystemState = (type: number) => {
return type === 0 ? '未激活' : '已激活'
}
// 将用户类型从中文转换为数字
const parseUserType = (type: string): number => {
return type === '正常用户' ? 1 : 0
}
// 将系统类型从中文转换为数字
const parseSystemType = (type: string): number => {
return type === '省级系统' ? 0 : type === '企业系统' ? 1 : type === '数据中心' ? 2 : -1
}
// 将系统状态从中文转换为数字
const parseSystemState = (state: string): number => {
return state === '未激活' ? 0 : 1
}
// 新增 addForm 方法
const addForm = () => {
// 初始化系统配置表单
sysForm.value = {
type: '',
dataReport: '',
logSize: 1024,
logTime: 1,
state: '',
}
flagtyoe.value = 'add' // 标记为新增模式
sysTitle.value = '新增系统配置'
systemDialogVisible.value = true // 打开系统配置弹窗
}
// 删除系统配置
const sysDelete = (row: any) => {
let data = {
id: row.id
}
ElMessageBox.confirm('此操作将永久删除该配置, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
deleteSystemConfig(data).then((res: any) => {
ElMessage.success(res.message)
info(2) // 刷新系统配置列表
})
})
}
// 激活系统配置
const sysActive = (row: any) => {
// 构造请求参数
const data = {
id: row.id,
type: parseSystemType(row.type),
logSize: row.logSize,
logTime: row.logTime,
dataReport: row.dataReport,
state: 1
}
// 弹出确认框
ElMessageBox.confirm('此操作将激活该系统配置,是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(() => {
// 用户点击“确定”,执行激活操作
activeSystemConfig(data).then((res: any) => {
ElMessage.success(res.message)
info(2) // 刷新系统配置列表
}).catch((err: any) => {
ElMessage.error('激活失败,请重试')
})
})
}
// 保存系统配置
const saveSystem = () => {
sysFormRef.value.validate((valid: any) => {
if (valid) {
if (flagtyoe.value === 'add') {
addSystemConfig(sysForm.value).then((res: any) => {
ElMessage.success(res.message)
systemDialogVisible.value = false
info(2)
})
} else {
const formData = {
...sysForm.value,
type: parseSystemType(sysForm.value.type),
state: parseSystemState(sysForm.value.state)
}
updateSystemConfig(formData).then((res: any) => {
ElMessage.success(res.message)
systemDialogVisible.value = false
info(2)
})
}
}
})
}
// 组件挂载时获取数据
onMounted(() => {
info()
onBeforeMount(() => {
info(0)
info(1)
info(2)
})
</script>
@@ -138,9 +528,15 @@ onMounted(() => {
background-color: #fff;
margin: 10px;
}
/* 增大折叠面板标题字体 */
:deep(.el-collapse-item__header) {
font-size: 20px; /* 设置字体大小 */
font-weight: bold; /* 加粗字体 */
//color: var(--el-color-primary); /* 可选:设置颜色 */
}
:deep(.el-form-item__label ){
color: var(--el-color-primary);
:deep(.el-form-item__label) {
font-weight: 600;
}
</style>
</style>