系统相关配置
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
import createAxios from '@/utils/request'
|
import createAxios from '@/utils/request'
|
||||||
|
|
||||||
|
|
||||||
// 密码规则修改
|
// 密码规则修改
|
||||||
export function ruleUpdate(data) {
|
export function ruleUpdate(data) {
|
||||||
return createAxios({
|
return createAxios({
|
||||||
@@ -24,3 +25,80 @@ export function unlockRoot(data) {
|
|||||||
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'
|
// ? 'ws://192.168.1.68:8083/mqtt'
|
||||||
// : localStorage.getItem('MqttUrl')
|
// : localStorage.getItem('MqttUrl')
|
||||||
const mqttUrl = localStorage.getItem('MqttUrl')
|
const mqttUrl = localStorage.getItem('MqttUrl')
|
||||||
|
console.log('MQTT URL:', mqttUrl)
|
||||||
if (mqttUrl == 'null' || mqttUrl == null) return
|
if (mqttUrl == 'null' || mqttUrl == null) return
|
||||||
this.client = mqtt.connect(mqttUrl, this.defaultOptions as IClientOptions)
|
this.client = mqtt.connect(mqttUrl, this.defaultOptions as IClientOptions)
|
||||||
this.setupEventListeners()
|
this.setupEventListeners()
|
||||||
|
|||||||
@@ -137,6 +137,7 @@ export default class TableStore {
|
|||||||
|
|
||||||
this.table.params.pageNum = 1
|
this.table.params.pageNum = 1
|
||||||
this.index()
|
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,14 +129,22 @@ const tableStore = new TableStore({
|
|||||||
{ field: 'subName', title: '变电站', minWidth: '150' },
|
{ field: 'subName', title: '变电站', minWidth: '150' },
|
||||||
{ field: 'ip', title: '网络参数' ,width:'120px' },
|
{ field: 'ip', title: '网络参数' ,width:'120px' },
|
||||||
{ field: 'scale', title: '电压等级', minWidth: '110' },
|
{ field: 'scale', title: '电压等级', minWidth: '110' },
|
||||||
// {
|
{
|
||||||
// field: 'advanceType',
|
field: 'advanceType',
|
||||||
// title: '触发类型',
|
title: '暂降类型',
|
||||||
// minWidth: '90',
|
minWidth: '90',
|
||||||
// formatter: (row: any) => {
|
formatter: (row: any) => {
|
||||||
// return row.cellValue || '其他'
|
return row.cellValue || '其他'
|
||||||
// }
|
}
|
||||||
// },
|
},
|
||||||
|
{
|
||||||
|
field: 'eventType',
|
||||||
|
title: '触发类型',
|
||||||
|
minWidth: '120',
|
||||||
|
formatter: (row: any) => {
|
||||||
|
return eventList.filter(item => item.id === row.cellValue)[0]?.name
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
field: 'advanceReason',
|
field: 'advanceReason',
|
||||||
title: '暂降原因',
|
title: '暂降原因',
|
||||||
@@ -145,14 +153,7 @@ const tableStore = new TableStore({
|
|||||||
return row.cellValue || '其他'
|
return row.cellValue || '其他'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
field: 'eventType',
|
|
||||||
title: '触发类型',
|
|
||||||
minWidth: '120',
|
|
||||||
formatter: (row: any) => {
|
|
||||||
return eventList.filter(item => item.id === row.cellValue)[0]?.name
|
|
||||||
}
|
|
||||||
},
|
|
||||||
// {
|
// {
|
||||||
// field: 'severity', title: '严重度', minWidth: "80", formatter: (row: any) => {
|
// field: 'severity', title: '严重度', minWidth: "80", formatter: (row: any) => {
|
||||||
// return row.cellValue.toFixed(2)
|
// return row.cellValue.toFixed(2)
|
||||||
|
|||||||
@@ -55,7 +55,7 @@
|
|||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="关键字筛选:">
|
<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>
|
</el-form-item>
|
||||||
</template>
|
</template>
|
||||||
<template #operation>
|
<template #operation>
|
||||||
|
|||||||
@@ -103,7 +103,11 @@ const init = () => {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
options.value = {
|
options.value = {
|
||||||
|
title: {
|
||||||
|
text: formData.harmState == 0 ? '谐波电压频谱' : '谐波电流频谱'
|
||||||
|
},
|
||||||
xAxis: {
|
xAxis: {
|
||||||
|
|
||||||
name: '次数',
|
name: '次数',
|
||||||
type: 'category',
|
type: 'category',
|
||||||
data: Array.from({ length: 49 }, (_, i) => `${i + 2}次`)
|
data: Array.from({ length: 49 }, (_, i) => `${i + 2}次`)
|
||||||
|
|||||||
@@ -35,8 +35,8 @@ defineOptions({
|
|||||||
name: 'harmonic-boot/reate/word'
|
name: 'harmonic-boot/reate/word'
|
||||||
})
|
})
|
||||||
const dictData = useDictData()
|
const dictData = useDictData()
|
||||||
//区域联级选择
|
//行业类型选择
|
||||||
const industry = dictData.getBasicData('Interference_Source')
|
const industry = dictData.getBasicData('Business_Type')
|
||||||
//用户信息弹出框
|
//用户信息弹出框
|
||||||
const tableRef = ref()
|
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 {
|
export default {
|
||||||
zjkJSON,
|
zjkJSON,
|
||||||
lfJSON,
|
lfJSON,
|
||||||
@@ -8640,5 +8725,7 @@ export default {
|
|||||||
铁岭,
|
铁岭,
|
||||||
朝阳,
|
朝阳,
|
||||||
葫芦岛,
|
葫芦岛,
|
||||||
沈阳
|
沈阳,
|
||||||
|
海口,
|
||||||
|
三亚
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,6 +53,10 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="collapse_none" style="color: red; cursor: pointer" @click="showWrap = false">关闭</div>
|
<div class="collapse_none" style="color: red; cursor: pointer" @click="showWrap = false">关闭</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<baidu-map
|
<baidu-map
|
||||||
class="map"
|
class="map"
|
||||||
:style="height"
|
:style="height"
|
||||||
@@ -329,6 +333,16 @@ const boundaryList: any = ref([
|
|||||||
orgName: '鞍山',
|
orgName: '鞍山',
|
||||||
LngLat: [122.808845, 40.840049],
|
LngLat: [122.808845, 40.840049],
|
||||||
boundary: mapJson['鞍山']
|
boundary: mapJson['鞍山']
|
||||||
|
},
|
||||||
|
{
|
||||||
|
orgName: '海口',
|
||||||
|
LngLat: [110.32, 20.03],
|
||||||
|
boundary: mapJson['海口']
|
||||||
|
},
|
||||||
|
{
|
||||||
|
orgName: '三亚',
|
||||||
|
LngLat: [109.51, 18.25],
|
||||||
|
boundary: mapJson['三亚']
|
||||||
}
|
}
|
||||||
])
|
])
|
||||||
|
|
||||||
@@ -338,8 +352,10 @@ const siteList = ref<any>([])
|
|||||||
const polyline = ref<any>([])
|
const polyline = ref<any>([])
|
||||||
const lineId = ref('')
|
const lineId = ref('')
|
||||||
const center = ref({
|
const center = ref({
|
||||||
lng: 122.42588,
|
lng: 122.42588,
|
||||||
lat: 40.810977
|
lat: 40.810977
|
||||||
|
// lng: 109.5, // 海南经度
|
||||||
|
// lat: 18.5 // 海南纬度
|
||||||
})
|
})
|
||||||
const infoWindowPoint = ref<anyObj>({
|
const infoWindowPoint = ref<anyObj>({
|
||||||
lng: 0,
|
lng: 0,
|
||||||
|
|||||||
@@ -28,6 +28,7 @@
|
|||||||
</el-collapse-item>
|
</el-collapse-item>
|
||||||
<el-collapse-item :title="item.name" v-for="(item, index) in column" :key="index" :name="index + 3">
|
<el-collapse-item :title="item.name" v-for="(item, index) in column" :key="index" :name="index + 3">
|
||||||
<div style="height: 200px">
|
<div style="height: 200px">
|
||||||
|
|
||||||
<vxe-table height="auto" :data="form[item.key]" v-bind="defaultAttribute" v-loading="item.loading">
|
<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 type="seq" title="序号" width="80px"></vxe-column>
|
||||||
<vxe-column
|
<vxe-column
|
||||||
|
|||||||
@@ -467,6 +467,7 @@ const dictionary = () => {
|
|||||||
|
|
||||||
}
|
}
|
||||||
onBeforeMount(async () => {
|
onBeforeMount(async () => {
|
||||||
|
|
||||||
await dictionary()
|
await dictionary()
|
||||||
info(0) // 变压器参数维护
|
info(0) // 变压器参数维护
|
||||||
info(1) // 电容器参数维护
|
info(1) // 电容器参数维护
|
||||||
|
|||||||
@@ -85,6 +85,7 @@ const eliminate = (name: string) => {
|
|||||||
|
|
||||||
// 地图数处理
|
// 地图数处理
|
||||||
const map = (res: any) => {
|
const map = (res: any) => {
|
||||||
|
|
||||||
echartMapList.value = {
|
echartMapList.value = {
|
||||||
name: '',
|
name: '',
|
||||||
title: {
|
title: {
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<el-col :span="6">
|
<el-col :span="6">
|
||||||
<div class="tree-container">
|
<div class="tree-container">
|
||||||
<el-tree
|
<el-tree
|
||||||
@node-click="clickNode"
|
@node-click="(node, data, event) => handleNodeClick(node, data)"
|
||||||
:expand-on-click-node="false"
|
:expand-on-click-node="false"
|
||||||
:highlight-current="true"
|
:highlight-current="true"
|
||||||
:data="TreeData"
|
:data="TreeData"
|
||||||
@@ -92,13 +92,12 @@ import Table from '@/components/table/index.vue'
|
|||||||
import TableHeader from '@/components/table/header/index.vue'
|
import TableHeader from '@/components/table/header/index.vue'
|
||||||
import { ElMessage } from 'element-plus'
|
import { ElMessage } from 'element-plus'
|
||||||
import {
|
import {
|
||||||
getDictTree,
|
|
||||||
getReportDictList,
|
getReportDictList,
|
||||||
addDict,
|
addDict,
|
||||||
updateDict,
|
|
||||||
deleteDict
|
deleteDict
|
||||||
} from '@/api/system-boot/ReportTemplate'
|
} from '@/api/system-boot/ReportTemplate'
|
||||||
|
|
||||||
|
|
||||||
// 弹出框是否可见
|
// 弹出框是否可见
|
||||||
const dialogVisible = ref<boolean>(false)
|
const dialogVisible = ref<boolean>(false)
|
||||||
const dialogTitle = ref('新增配置项')
|
const dialogTitle = ref('新增配置项')
|
||||||
@@ -107,12 +106,50 @@ const props = defineProps({
|
|||||||
type: {
|
type: {
|
||||||
type: Number,
|
type: Number,
|
||||||
default: undefined
|
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({
|
const formData = reactive({
|
||||||
searchValue: '',
|
searchValue: '',
|
||||||
id: '0',
|
id: 0,
|
||||||
type: props.type
|
type: props.type
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -124,6 +161,11 @@ const form = reactive({
|
|||||||
type: props.type
|
type: props.type
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const defaultProps = {
|
||||||
|
children: 'children',
|
||||||
|
label: 'reportDescribe'
|
||||||
|
}
|
||||||
|
|
||||||
const rules = {
|
const rules = {
|
||||||
name: [{ required: true, message: '名称不能为空', trigger: 'blur' }],
|
name: [{ required: true, message: '名称不能为空', trigger: 'blur' }],
|
||||||
reportDescribe: [{ required: true, message: '描述不能为空', trigger: 'blur' }],
|
reportDescribe: [{ required: true, message: '描述不能为空', trigger: 'blur' }],
|
||||||
@@ -131,7 +173,7 @@ const rules = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const tableStore = new TableStore({
|
const tableStore = new TableStore({
|
||||||
url: '/system-boot/reportDict/getReportDictList',
|
url: getReportDictList(formData),
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
column: [
|
column: [
|
||||||
{ title: '配置项名称', field: 'name' },
|
{ title: '配置项名称', field: 'name' },
|
||||||
@@ -185,6 +227,45 @@ const tableStore = new TableStore({
|
|||||||
})
|
})
|
||||||
|
|
||||||
provide('tableStore', 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 = () => {
|
const addTemplate = () => {
|
||||||
dialogTitle.value = '新增配置项'
|
dialogTitle.value = '新增配置项'
|
||||||
dialogVisible.value = true
|
dialogVisible.value = true
|
||||||
@@ -218,7 +299,7 @@ const closeDialog = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
tableStore.index()
|
//tableStore.index()
|
||||||
})
|
})
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<TableHeader ref="TableHeaderRef">
|
<TableHeader ref="TableHeaderRef">
|
||||||
<template v-slot:select>
|
<template v-slot:select>
|
||||||
<el-form-item label="模板类型">
|
<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-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -16,12 +16,12 @@
|
|||||||
<Table ref="tableRef" />
|
<Table ref="tableRef" />
|
||||||
|
|
||||||
<Administration
|
<Administration
|
||||||
:type="tableStore.table.params.type"
|
:type="Number(tableStore.table.params.type)"
|
||||||
|
:tree-data="treeDataForChild"
|
||||||
v-if="showDictionary"
|
v-if="showDictionary"
|
||||||
@close="closeReportDictionary"
|
@close="closeReportDictionary"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
|
||||||
<el-dialog
|
<el-dialog
|
||||||
:title="title"
|
:title="title"
|
||||||
v-model="dialogVisible"
|
v-model="dialogVisible"
|
||||||
@@ -32,14 +32,14 @@
|
|||||||
<el-col :span="11">
|
<el-col :span="11">
|
||||||
<div class="grid-content">
|
<div class="grid-content">
|
||||||
<el-tree
|
<el-tree
|
||||||
:data="data"
|
:data="data"
|
||||||
show-checkbox
|
show-checkbox
|
||||||
node-key="id"
|
node-key="id"
|
||||||
:props="defaultProps"
|
:props="defaultProps"
|
||||||
:default-checked-keys="treeCheckedData"
|
:default-checked-keys="treeCheckedData"
|
||||||
:default-expanded-keys="treeExpandData"
|
:default-expanded-keys="treeExpandData"
|
||||||
@check-change="handleCheckChange"
|
@check-change="handleCheckChange"
|
||||||
ref="tree"
|
ref="tree"
|
||||||
>
|
>
|
||||||
</el-tree>
|
</el-tree>
|
||||||
</div
|
</div
|
||||||
@@ -78,7 +78,7 @@ import { ref, onMounted, provide, nextTick } from 'vue'
|
|||||||
import TableStore from '@/utils/tableStore'
|
import TableStore from '@/utils/tableStore'
|
||||||
import Table from '@/components/table/index.vue'
|
import Table from '@/components/table/index.vue'
|
||||||
import TableHeader from '@/components/table/header/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 { ElMessage } from 'element-plus'
|
||||||
import Administration from '@/views/system/ReportConfiguration/components/Administration.vue'
|
import Administration from '@/views/system/ReportConfiguration/components/Administration.vue'
|
||||||
|
|
||||||
@@ -102,8 +102,10 @@ const form = ref({
|
|||||||
name: '',
|
name: '',
|
||||||
code: '',
|
code: '',
|
||||||
type: 0,
|
type: 0,
|
||||||
|
ids: []
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
// 表单验证规则
|
// 表单验证规则
|
||||||
const rules = {
|
const rules = {
|
||||||
name: [
|
name: [
|
||||||
@@ -118,8 +120,9 @@ const rules = {
|
|||||||
const data = ref([]) // 树形数据源
|
const data = ref([]) // 树形数据源
|
||||||
const defaultProps = {
|
const defaultProps = {
|
||||||
children: 'children',
|
children: 'children',
|
||||||
label: 'label'
|
label: 'reportDescribe'
|
||||||
}
|
}
|
||||||
|
|
||||||
const treeCheckedData = ref([]) // 默认选中的节点
|
const treeCheckedData = ref([]) // 默认选中的节点
|
||||||
const treeExpandData = ref([]) // 默认展开的节点
|
const treeExpandData = ref([]) // 默认展开的节点
|
||||||
|
|
||||||
@@ -128,10 +131,16 @@ const options = ([
|
|||||||
{ value: '1', label: '区域报告' },
|
{ value: '1', label: '区域报告' },
|
||||||
])
|
])
|
||||||
|
|
||||||
const openReportDictionary = () => {
|
|
||||||
console.log('点击了报告字典管理按钮')
|
const treeDataForChild = ref([]) // 用于存储传递给子组件的树数据
|
||||||
showDictionary.value = true
|
const openReportDictionary = async () => {
|
||||||
console.log('showDictionary 当前值:', showDictionary.value)
|
try {
|
||||||
|
const res = await getDictTree({ type: Number(tableStore.table.params.type) })
|
||||||
|
treeDataForChild.value = res.data // 将数据存储到响应式变量中
|
||||||
|
showDictionary.value = true // 打开子组件
|
||||||
|
} catch (error) {
|
||||||
|
ElMessage.error('获取字典数据失败')
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const closeReportDictionary = () => {
|
const closeReportDictionary = () => {
|
||||||
@@ -150,7 +159,6 @@ const tableStore: any = new TableStore({
|
|||||||
width: '220',
|
width: '220',
|
||||||
render: 'buttons',
|
render: 'buttons',
|
||||||
buttons: [
|
buttons: [
|
||||||
|
|
||||||
{
|
{
|
||||||
name: 'edit',
|
name: 'edit',
|
||||||
title: '编辑',
|
title: '编辑',
|
||||||
@@ -166,8 +174,16 @@ const tableStore: any = new TableStore({
|
|||||||
id: row.id,
|
id: row.id,
|
||||||
name: row.name,
|
name: row.name,
|
||||||
code: row.code,
|
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'
|
tableStore.table.params.type = '0'
|
||||||
provide('tableStore', tableStore)
|
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 = () => {
|
const add = () => {
|
||||||
isEdit.value = true
|
isEdit.value = false
|
||||||
title.value = '新增模板'
|
title.value = '新增模板'
|
||||||
dialogVisible.value = true
|
dialogVisible.value = true
|
||||||
// 初始化表单数据
|
// 初始化表单数据
|
||||||
@@ -211,9 +239,26 @@ const add = () => {
|
|||||||
id: '',
|
id: '',
|
||||||
name: '',
|
name: '',
|
||||||
code: '',
|
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 = () => {
|
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-button :label="1">否</el-radio-button>
|
||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="用户ID">
|
<el-form-item label="自定义ID">
|
||||||
<div style="display: flex; width: 100%">
|
<div style="display: flex; width: 100%">
|
||||||
<el-radio-group v-model="useId">
|
<el-radio-group v-model="useId">
|
||||||
<el-radio-button :label="1">是</el-radio-button>
|
<el-radio-button :label="1">是</el-radio-button>
|
||||||
@@ -123,8 +123,8 @@ const form = reactive({
|
|||||||
limitIpEnd: '',
|
limitIpEnd: '',
|
||||||
limitTime: [1, 2],
|
limitTime: [1, 2],
|
||||||
role: [],
|
role: [],
|
||||||
smsNotice: 0,
|
smsNotice: 1,
|
||||||
emailNotice: 0,
|
emailNotice: 1,
|
||||||
type: 0
|
type: 0
|
||||||
})
|
})
|
||||||
const rules: Partial<Record<string, Array<FormItemRule>>> = {
|
const rules: Partial<Record<string, Array<FormItemRule>>> = {
|
||||||
@@ -228,9 +228,9 @@ const open = (text: string, data?: anyObj) => {
|
|||||||
form.casualUser = 1
|
form.casualUser = 1
|
||||||
form.limitTime = [0, 24]
|
form.limitTime = [0, 24]
|
||||||
form.role = []
|
form.role = []
|
||||||
form.smsNotice = 0
|
form.smsNotice = 1
|
||||||
form.emailNotice = 0
|
form.emailNotice = 1
|
||||||
useId.value = 1
|
useId.value = 0
|
||||||
form.id = ''
|
form.id = ''
|
||||||
form.limitIpStart = '0.0.0.0'
|
form.limitIpStart = '0.0.0.0'
|
||||||
form.limitIpEnd = '255.255.255.255'
|
form.limitIpEnd = '255.255.255.255'
|
||||||
|
|||||||
@@ -1,76 +1,196 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="strategy-manage pd10" :style="height">
|
<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-collapse v-model="activeNames" >
|
||||||
</el-form-item>
|
<!-- 客户端配置置 -->
|
||||||
</el-form>
|
<el-collapse-item title="客户端配置" name="1">
|
||||||
<div style="width: 500px">
|
<div style="width: 500px">
|
||||||
<el-form ref="formRef" :model="form" label-width="auto" :rules="rules">
|
<el-form ref="formRef" :model="form" label-width="auto" :rules="rules">
|
||||||
<el-divider content-position="left">系统策略</el-divider>
|
<el-form-item label="认证令牌时效(秒):" prop="accessTokenValidity">
|
||||||
<el-form-item label="最大并发数:" prop="maxUseUser">
|
<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
|
<el-input-number
|
||||||
v-model.number="form.maxUseUser"
|
|
||||||
:min="10"
|
|
||||||
:max="99"
|
|
||||||
style="width: 100%"
|
style="width: 100%"
|
||||||
|
type="number"
|
||||||
|
v-model="sysForm.logSize"
|
||||||
|
:min="1024"
|
||||||
|
:max="20480"
|
||||||
|
placeholder="请输入审计日志大小"
|
||||||
></el-input-number>
|
></el-input-number>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-divider content-position="left">账号锁定策略</el-divider>
|
<el-form-item label="日志储存时间(月):" prop="logTime" class="top">
|
||||||
<el-form-item label="密码输入错误次数:" prop="errorsCount">
|
|
||||||
<el-input-number
|
<el-input-number
|
||||||
v-model.number="form.errorsCount"
|
|
||||||
:min="3"
|
|
||||||
:max="20"
|
|
||||||
style="width: 100%"
|
style="width: 100%"
|
||||||
></el-input-number>
|
type="number"
|
||||||
</el-form-item>
|
v-model="sysForm.logTime"
|
||||||
<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"
|
|
||||||
:min="1"
|
:min="1"
|
||||||
:max="6"
|
:max="6"
|
||||||
style="width: 100%"
|
placeholder="请输入日志储存时间不能大于6个月"
|
||||||
></el-input-number>
|
></el-input-number>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="账号长时间未登录休眠期(天):" prop="sleepDay">
|
<el-form-item label="激活状态:" class="top" prop="state">
|
||||||
<el-input-number
|
<el-select
|
||||||
v-model.number="form.sleepDay"
|
v-model="sysForm.state"
|
||||||
:min="1"
|
:disabled="flagtyoe == 'add' ? false : true"
|
||||||
:max="180"
|
placeholder="请选择"
|
||||||
style="width: 100%"
|
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-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
</div>
|
<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>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup lang="ts">
|
||||||
import { ref, reactive, onMounted } from 'vue'
|
import { ref, reactive, onMounted } from 'vue'
|
||||||
import { ElMessage } from 'element-plus'
|
import { ElMessage, MessageParams } from 'element-plus'
|
||||||
import { ruleUpdate, getRule, unlockRoot } from '@/api/admin/user.js'
|
import { updateClientSessionConfig, getClientInfoByPath, ruleUpdate ,getUserConfig,getSystemList,activeSystemConfig,deleteSystemConfig,addSystemConfig,updateSystemConfig} from '@/api/admin/user.js'
|
||||||
import { Plus } from '@element-plus/icons-vue'
|
import { Check } from '@element-plus/icons-vue'
|
||||||
import { mainHeight } from '@/utils/layout'
|
import { mainHeight } from '@/utils/layout'
|
||||||
|
import { defaultAttribute } from '@/components/table/defaultAttribute'
|
||||||
|
import { ElMessageBox } from 'element-plus'
|
||||||
|
|
||||||
// 页面缓存
|
// 页面缓存
|
||||||
defineOptions({
|
defineOptions({
|
||||||
@@ -81,55 +201,325 @@ const height = mainHeight(20)
|
|||||||
|
|
||||||
// 定义表单引用
|
// 定义表单引用
|
||||||
const formRef = ref()
|
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({
|
const form = reactive({
|
||||||
maxUseUser: 50,
|
accessTokenValidity: 0,
|
||||||
errorsCount: 0,
|
refreshTokenValidity: 0,
|
||||||
passwordExpirationMonth: 0,
|
|
||||||
sleepDay: 90,
|
|
||||||
releaseTime: 0,
|
|
||||||
sessionTime: 0,
|
|
||||||
sessionRefreshTime: 0
|
|
||||||
})
|
})
|
||||||
|
|
||||||
// 定义表单验证规则
|
// 定义表单验证规则
|
||||||
const rules = {
|
const rules = {
|
||||||
maxUseUser: [{ required: true, message: '请填写最大并发数', trigger: 'blur' }],
|
accessTokenValidity: [{ required: true, message: '请填写会话超时时间', trigger: 'blur' }],
|
||||||
errorsCount: [{ required: true, message: '请填写密码输入错误次数', trigger: 'blur' }],
|
refreshTokenValidity: [{ 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' }]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取策略信息
|
const editForm = ref({
|
||||||
const info = () => {
|
passwordExpirationMonth: 3,
|
||||||
getRule().then(res => {
|
errorsCount: 5,
|
||||||
Object.assign(form, res.data)
|
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 = () => {
|
const AddClick = () => {
|
||||||
formRef.value.validate(valid => {
|
formRef.value.validate((valid: any) => {
|
||||||
if (valid) {
|
if (valid) {
|
||||||
ruleUpdate(form).then(res => {
|
updateClientSessionConfig(form).then((res: { data: any }) => {
|
||||||
Object.assign(form, res.data)
|
Object.assign(form, res.data)
|
||||||
ElMessage({
|
ElMessage.success(res.message)
|
||||||
message: '保存成功',
|
info(0)
|
||||||
type: 'success'
|
|
||||||
})
|
|
||||||
info()
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 保存用户配置编辑
|
||||||
|
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(() => {
|
onBeforeMount(() => {
|
||||||
info()
|
info(0)
|
||||||
|
info(1)
|
||||||
|
info(2)
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@@ -138,9 +528,15 @@ onMounted(() => {
|
|||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
margin: 10px;
|
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;
|
font-weight: 600;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
Reference in New Issue
Block a user