diff --git a/src/components/cockpit/governanceReport/index.vue b/src/components/cockpit/governanceReport/index.vue
index c60a89a..8028b62 100644
--- a/src/components/cockpit/governanceReport/index.vue
+++ b/src/components/cockpit/governanceReport/index.vue
@@ -37,7 +37,7 @@ import TableHeader from '@/components/table/header/index.vue'
import { getTemplateList } from '@/api/harmonic-boot/luckyexcel'
import { getListByIds } from '@/api/harmonic-boot/cockpit/cockpit'
import { getTime } from '@/utils/formatTime'
-
+import { ElMessage } from 'element-plus'
const prop = defineProps({
w: { type: [String, Number] },
h: { type: [String, Number] },
@@ -118,12 +118,15 @@ const tableStore: any = new TableStore({
column: [],
beforeSearchFun: () => {
setTime()
- if (!tableStore.table.params.sensitiveUserId && idList.value?.length > 0) {
- tableStore.table.params.sensitiveUserId = idList.value[0].id
- }
- if (!tableStore.table.params.tempId && templateList.value?.length > 0) {
- tableStore.table.params.tempId = templateList.value[0].id
- }
+ // if (!tableStore.table.params.sensitiveUserId && idList.value?.length > 0) {
+ // tableStore.table.params.sensitiveUserId = idList.value[0].id
+ // }
+ // if (!tableStore.table.params.tempId && templateList.value?.length > 0) {
+ // tableStore.table.params.tempId = templateList.value[0].id
+ // }
+ // if( !tableStore.table.params.tempId){
+ // return ElMessage.warning('请选择模板')
+ // }
},
loadCallback: () => {
luckysheet.create({
diff --git a/src/components/cockpit/indicatorFittingChart/components/overLimitDetails.vue b/src/components/cockpit/indicatorFittingChart/components/overLimitDetails.vue
index 23fcd64..432719b 100644
--- a/src/components/cockpit/indicatorFittingChart/components/overLimitDetails.vue
+++ b/src/components/cockpit/indicatorFittingChart/components/overLimitDetails.vue
@@ -14,7 +14,7 @@
@@ -24,11 +24,7 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 普通接口
+ 公用接口
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/auth/menu/popupMenu.vue b/src/views/auth/menu/popupMenu.vue
index 7f24ecd..13373ac 100644
--- a/src/views/auth/menu/popupMenu.vue
+++ b/src/views/auth/menu/popupMenu.vue
@@ -1,29 +1,43 @@
-
+
-
+
-
+
-
+
-
-
+
+
-
-
+
+
-
+
@@ -46,6 +60,7 @@ import { updateMenu, addMenu } from '@/api/systerm'
defineOptions({
name: 'auth/menu/popupMenu'
})
+const formRef = ref()
const emits = defineEmits<{
(e: 'init'): void
}>()
@@ -71,7 +86,15 @@ const form: any = reactive({
const dialogVisible = ref(false)
const title = ref('新增菜单')
+const rules = {
+ name: [{ required: true, message: '请输入菜单名称', trigger: 'blur' }],
+ path: [{ required: true, message: '请输入菜单路由', trigger: 'blur' }],
+ icon: [{ required: true, message: '请选择图标', trigger: 'blur' }],
+ routeName: [{ required: true, message: '请输入组件路径', trigger: 'blur' }],
+ sort: [{ required: true, message: '请输入排序', trigger: 'blur' }]
+}
const open = (text: string, data: anyObj) => {
+ formRef.value?.resetFields()
title.value = text
// 重置表单
for (let key in form) {
@@ -91,17 +114,23 @@ const open = (text: string, data: anyObj) => {
dialogVisible.value = true
}
const submit = async () => {
- if (form.id) {
- form.pid = form.pid||'0'
- await updateMenu(form)
- } else {
- form.code = 'menu'
- let obj = JSON.parse(JSON.stringify(form))
- delete obj.id
- await addMenu(obj)
- }
- emits('init')
- dialogVisible.value = false
+ formRef.value.validate(async valid => {
+ if (valid) {
+ if (form.id) {
+ form.pid = form.pid || '0'
+ await updateMenu(form)
+ } else {
+ form.code = 'menu'
+ form.pid = form.pid || '0'
+ let obj = JSON.parse(JSON.stringify(form))
+ delete obj.id
+
+ await addMenu(obj)
+ }
+ emits('init')
+ dialogVisible.value = false
+ }
+ })
}
defineExpose({ open })
diff --git a/src/views/govern/cloudDeviceEntry/index.vue b/src/views/govern/cloudDeviceEntry/index.vue
index 9ca8ec6..bcc30b6 100644
--- a/src/views/govern/cloudDeviceEntry/index.vue
+++ b/src/views/govern/cloudDeviceEntry/index.vue
@@ -89,6 +89,7 @@
:rules="{ required: true, message: '请输入设备名称', trigger: 'blur' }"
>
-
-
-
-
-
-
-
-->
-
-
+
-
-
+
-
-
-
+ >
+ >
-
+ >
+ >
-
-
+
+ >
-
+ >
-
+ >
-
+ >
-
+
+
+
+
+
+
-
+
{
monitorUser: '',
devMac: '',
monitorObj: '',
+ position: '',
govern: 0,
runStatus: 0,
basicCapacity: 0,
@@ -1682,8 +1736,9 @@ const updateLineFunc = (id: any) => {
ct2Ratio: currentLine.ct2Ratio || 1,
monitorUser: currentLine.monitorUser || '',
monitorObj: currentLine.monitorObj || '',
- govern: currentLine.govern ,
- runStatus: currentLine.runStatus ,
+ position: currentLine.position || '',
+ govern: currentLine.govern,
+ runStatus: currentLine.runStatus,
basicCapacity: currentLine.basicCapacity || 0,
shortCircuitCapacity: currentLine.shortCircuitCapacity || 0,
devCapacity: currentLine.devCapacity || 0,
@@ -1878,6 +1933,7 @@ const next = async () => {
monitorUser: '',
devMac: '',
monitorObj: '',
+ position: '',
govern: 0,
runStatus: 0,
basicCapacity: 0,
@@ -1900,7 +1956,6 @@ const next = async () => {
}
}
})
-
}
// 撤销
@@ -1925,21 +1980,21 @@ const black = () => {
const onsubmit = async () => {
await mainForm.value.validate((valid: any) => {
if (valid) {
- if (pageStatus.value == 2) {
- // 新增
- // 检查是否是多层级新增还是单层级新增
- if (
- tempAllLevelData.value.engineering !== null ||
- tempAllLevelData.value.projects.length > 0 ||
- tempAllLevelData.value.devices.length > 0 ||
- tempAllLevelData.value.lines.length > 0
- ) {
- // 多层级新增,一次性提交所有数据
- submitAllLevelData()
- } else {
- // 单层级新增,使用原有的提交方式
- submitData()
- }
+ if (pageStatus.value == 2) {
+ // 新增
+ // 检查是否是多层级新增还是单层级新增
+ if (
+ tempAllLevelData.value.engineering !== null ||
+ tempAllLevelData.value.projects.length > 0 ||
+ tempAllLevelData.value.devices.length > 0 ||
+ tempAllLevelData.value.lines.length > 0
+ ) {
+ // 多层级新增,一次性提交所有数据
+ submitAllLevelData()
+ } else {
+ // 单层级新增,使用原有的提交方式
+ submitData()
+ }
} else if (pageStatus.value == 3) {
// 修改
switch (nodeLevel.value) {
@@ -1958,7 +2013,6 @@ const onsubmit = async () => {
}
}
}
-
})
}
@@ -2003,7 +2057,9 @@ const submitAllLevelData = async () => {
case 2: // 工程 + 项目 + 设备
// 工程信息
- const engineeringData2 = tempAllLevelData.value.engineering || { ...formData.value.engineeringParam }
+ const engineeringData2 = tempAllLevelData.value.engineering || {
+ ...formData.value.engineeringParam
+ }
// 项目信息
const projectData2 =
tempAllLevelData.value.projects.length > 0
@@ -2059,7 +2115,9 @@ const submitAllLevelData = async () => {
case 3: // 工程 + 项目 + 设备 + 监测点
case 4:
// 工程信息
- const engineeringData3 = tempAllLevelData.value.engineering || { ...formData.value.engineeringParam }
+ const engineeringData3 = tempAllLevelData.value.engineering || {
+ ...formData.value.engineeringParam
+ }
// 项目信息
const projectData3 =
@@ -2255,10 +2313,8 @@ const submitAllLevelData = async () => {
}
}, 100)
})
-
}
})
-
}
/**
* 重置所有表单
@@ -2302,6 +2358,7 @@ const resetAllForms = () => {
line.volGrade = ''
line.monitorUser = ''
line.monitorObj = ''
+ line.position = ''
line.govern = 0
line.runStatus = 0
line.basicCapacity = 0
@@ -2469,6 +2526,7 @@ const submitData = () => {
ct2Ratio: currentLine.ct2Ratio,
monitorUser: currentLine.monitorUser,
monitorObj: currentLine.monitorObj,
+ position: currentLine.position,
govern: currentLine.govern,
runStatus: currentLine.runStatus,
basicCapacity: currentLine.basicCapacity,
@@ -2620,7 +2678,9 @@ const handleBusBarTabsEdit = (targetName: any, action: any) => {
} else {
// 如果是新增模式下删除未保存的设备
formData.value.deviceInfoList.splice(busBarIndex.value, 1)
- busBarIndex.value = formData.value.deviceInfoList.length ? (formData.value.deviceInfoList.length - 1).toString() : '0'
+ busBarIndex.value = formData.value.deviceInfoList.length
+ ? (formData.value.deviceInfoList.length - 1).toString()
+ : '0'
lineIndex.value = '0'
ElMessage({
type: 'success',
@@ -2656,6 +2716,7 @@ const handleLineTabsEdit = (targetName: any, action: any) => {
devMac: '',
monitorUser: '',
monitorObj: '',
+ position: '',
govern: 0,
runStatus: 0,
basicCapacity: 0,
@@ -2682,14 +2743,18 @@ const handleLineTabsEdit = (targetName: any, action: any) => {
// 从列表中移除
formData.value.lineInfoList.splice(lineIndex.value, 1)
// 重新设置当前选中的tab
- lineIndex.value = formData.value.lineInfoList.length ? (formData.value.lineInfoList.length - 1).toString() : '0'
+ lineIndex.value = formData.value.lineInfoList.length
+ ? (formData.value.lineInfoList.length - 1).toString()
+ : '0'
pageStatus.value = 1
treedata()
})
} else {
// 如果是新增模式下删除未保存的监测点
formData.value.lineInfoList.splice(lineIndex.value, 1)
- lineIndex.value = formData.value.lineInfoList.length ? (formData.value.lineInfoList.length - 1).toString() : '0'
+ lineIndex.value = formData.value.lineInfoList.length
+ ? (formData.value.lineInfoList.length - 1).toString()
+ : '0'
ElMessage({
type: 'success',
message: '删除成功'
@@ -2777,6 +2842,9 @@ const area = () => {
getDicDataByTypeCode({ dictTypeCode: 'M_Obj_Types' }).then(res => {
monitorObjList.value = res.data
})
+ getDicDataByTypeCode({ dictTypeCode: 'Line_Position' }).then(res => {
+ linePosition.value = res.data
+ })
}
onMounted(() => {
diff --git a/src/views/govern/device/disposition/index.vue b/src/views/govern/device/disposition/index.vue
index 532d1b7..2926be9 100644
--- a/src/views/govern/device/disposition/index.vue
+++ b/src/views/govern/device/disposition/index.vue
@@ -4,8 +4,8 @@
-
- 添加工程
+
+ 绑定工程
@@ -29,7 +29,7 @@
-
+
diff --git a/src/views/govern/device/officialUser/index.vue b/src/views/govern/device/officialUser/index.vue
index 8c48808..cac8849 100644
--- a/src/views/govern/device/officialUser/index.vue
+++ b/src/views/govern/device/officialUser/index.vue
@@ -3,7 +3,7 @@
@@ -41,7 +41,7 @@
-
-
-
+
+
+
+
diff --git a/src/views/govern/manage/basic/popupVersion.vue b/src/views/govern/manage/basic/popupVersion.vue
index deb8d8d..bd7a23a 100644
--- a/src/views/govern/manage/basic/popupVersion.vue
+++ b/src/views/govern/manage/basic/popupVersion.vue
@@ -88,7 +88,7 @@
>
-
+
{
})
}
const submit = () => {
-
- if (fileList.value.length == 0) {
- ElMessage.warning('请上传升级文件')
- return
- }
-
// console.log(formRef)
formRef.value.validate(async (valid: boolean) => {
// console.log(valid)
if (valid) {
+ if (fileList.value.length == 0) {
+ ElMessage.warning('请上传升级文件')
+ return
+ }
let submitForm = new FormData()
for (let key in form) {
submitForm.append(key, form[key])
diff --git a/src/views/govern/reportCore/statisticsWx/index_zl.vue b/src/views/govern/reportCore/statisticsWx/index_zl.vue
index 9ba7eaf..8b9d8ce 100644
--- a/src/views/govern/reportCore/statisticsWx/index_zl.vue
+++ b/src/views/govern/reportCore/statisticsWx/index_zl.vue
@@ -79,6 +79,7 @@ import DatePicker from '@/components/form/datePicker/time.vue'
import { Splitpanes, Pane } from 'splitpanes'
import CloudDeviceEntryTree from '@/components/tree/govern/cloudDeviceEntryTreeZL.vue'
import { getListByIds } from '@/api/harmonic-boot/cockpit/cockpit'
+import { ElMessage } from 'element-plus'
// import data from './123.json'
defineOptions({
name: 'govern/reportCore/statisticsWx/indexZL'
@@ -101,9 +102,12 @@ const tableStore = new TableStore({
beforeSearchFun: () => {
tableStore.table.params.tempId = Template.value.id
tableStore.table.params.lineId = dotList.value.id
- tableStore.table.params.sensitiveUserId = dotList.value.id
+ tableStore.table.params.sensitiveUserId = dotList.value.id
// ;(tableStore.table.params.startTime = datePickerRef.value.timeValue[0]),
// (tableStore.table.params.endTime = datePickerRef.value.timeValue[1]),
+ if (!tableStore.table.params.tempId) {
+ return ElMessage.warning('请选择模板')
+ }
delete tableStore.table.params.searchBeginTime
delete tableStore.table.params.searchEndTime
delete tableStore.table.params.timeFlag
diff --git a/src/views/govern/sensitiveLoadMange/detail.vue b/src/views/govern/sensitiveLoadMange/detail.vue
index 07c2248..1e863ab 100644
--- a/src/views/govern/sensitiveLoadMange/detail.vue
+++ b/src/views/govern/sensitiveLoadMange/detail.vue
@@ -1,6 +1,6 @@
-
+
@@ -18,13 +18,13 @@
-
+
-
+
-
+
@@ -74,6 +74,7 @@ const rules = {
const dialogVisible = ref(false)
const title = ref('新增')
const open = (text: string, data?: anyObj) => {
+ formRef.value?.resetFields()
title.value = text
dialogVisible.value = true
if (data) {
diff --git a/src/views/govern/setting/statisticalType/add.vue b/src/views/govern/setting/statisticalType/add.vue
index cf4ccc5..6c03d02 100644
--- a/src/views/govern/setting/statisticalType/add.vue
+++ b/src/views/govern/setting/statisticalType/add.vue
@@ -17,7 +17,7 @@
-
+
diff --git a/src/views/pqs/cockpit/setUp/components/popup.vue b/src/views/pqs/cockpit/setUp/components/popup.vue
index 15fea32..c6290f1 100644
--- a/src/views/pqs/cockpit/setUp/components/popup.vue
+++ b/src/views/pqs/cockpit/setUp/components/popup.vue
@@ -1,49 +1,11 @@
-
+
保存
-
-
-
+
+
@@ -70,7 +32,7 @@
-
+
@@ -208,6 +170,9 @@ import { useAdminInfo } from '@/stores/adminInfo'
const tableName = ref('')
const tableName1 = ref('')
import { useNavTabs } from '@/stores/navTabs'
+import { getSystemByRoleId } from '@/api/user-boot/roleFuction'
+import { forEach } from 'jszip'
+import { id } from 'element-plus/es/locale'
// defineOptions({
// name: 'cockpit/popup'
// })
@@ -218,7 +183,7 @@ const { go } = useRouter()
const navTabs = useNavTabs()
const { query } = useRoute()
const router = useRouter()
-const height = mainHeight(295)
+const height = mainHeight(265)
const indicatorHeight = mainHeight(180)
const rowHeight = ref(0)
const pageList: any = ref([])
@@ -258,7 +223,7 @@ const layout: any = ref([
])
const treeComponents: any = ref([]) //组件树
const treeComponentsCopy: any = ref([]) //组件树
-const info = () => {
+const info = async () => {
pageList.value = router
.getRoutes()
.filter(item => item?.meta?.component == '/src/views/pqs/cockpit/homePage/index.vue')
@@ -268,17 +233,26 @@ const info = () => {
activeNames.value = []
activeNames1.value = []
- componentTree().then(res => {
- treeComponents.value = res.data
+
+ let systemList: any[] = []
+ await adminInfo.roleList.forEach((item: any) => {
+ getSystemByRoleId({ id: item }).then(res => {
+ systemList = [...new Set([...systemList, ...res.data.systemIds])]
+ })
+ })
+
+ await componentTree().then(res => {
+ let list = res.data.filter(item => systemList.includes(item.id))
+ treeComponents.value = list
tableName.value = tableName.value == '' ? treeComponents.value[0].name : tableName.value
tableName1.value = tableName1.value == '' ? treeComponents.value[0].children[0].name : tableName1.value
activeNames.value = treeComponents.value.map(item => item.id)
- res.data.forEach(item => {
+ list.forEach(item => {
item.children.forEach(k => {
activeNames1.value.push(k.id)
})
})
- treeComponentsCopy.value = tree2List(JSON.parse(JSON.stringify(res.data)), 0)
+ treeComponentsCopy.value = tree2List(JSON.parse(JSON.stringify(list)), 0)
})
if (query.id) {
@@ -439,7 +413,6 @@ const onSubmit = () => {
if (layout.value.length == 0) {
return ElMessage.warning('页面设计不能为空!')
}
- console.log(123, findDuplicateNames(layout.value))
let repeat = findDuplicateNames(layout.value) || []
if (repeat.length > 0) {
return ElMessage.warning(repeat.join('、') + ' 组件重复,请删除重复组件!')
@@ -493,31 +466,72 @@ const onSubmit = () => {
})
}
// 查找重复的name
+// const findDuplicateNames = (arr: any) => {
+// // 用于记录每个name出现的次数
+// const nameCount = {}
+// // 用于存储重复的name
+// const duplicates = []
+
+// // 遍历数组统计每个name的出现次数
+// arr.forEach(item => {
+// const name = item.name
+// if (nameCount[name]) {
+// nameCount[name]++
+// } else {
+// nameCount[name] = 1
+// }
+// })
+
+// // 筛选出出现次数大于1的name
+// for (const name in nameCount) {
+// if (nameCount[name] > 1) {
+// duplicates.push(name)
+// }
+// }
+
+// return duplicates
+// }
+// 查找重复的path,并返回对应的重复name
const findDuplicateNames = (arr: any) => {
- // 用于记录每个name出现的次数
- const nameCount = {}
- // 用于存储重复的name
+ // 用于记录每个path出现的次数
+ const pathCount: any = {}
+ // 用于存储path对应的name(避免重复存储)
+ const pathToNameMap = new Map()
+ // 用于存储重复path对应的name
const duplicates = []
- // 遍历数组统计每个name的出现次数
+ // 遍历数组统计每个path的出现次数,并记录path和name的映射
arr.forEach(item => {
+ const path = item.path
const name = item.name
- if (nameCount[name]) {
- nameCount[name]++
+
+ // 记录path和name的对应关系(只存第一次的,避免覆盖)
+ if (!pathToNameMap.has(path)) {
+ pathToNameMap.set(path, name)
+ }
+
+ // 统计path出现次数
+ if (pathCount[path]) {
+ pathCount[path]++
} else {
- nameCount[name] = 1
+ pathCount[path] = 1
}
})
- // 筛选出出现次数大于1的name
- for (const name in nameCount) {
- if (nameCount[name] > 1) {
- duplicates.push(name)
+ // 筛选出出现次数大于1的path,并获取对应的name
+ for (const path in pathCount) {
+ if (pathCount[path] > 1) {
+ const name = pathToNameMap.get(path)
+ // 避免重复添加相同的name(如果多个重复path对应同一个name)
+ if (!duplicates.includes(name)) {
+ duplicates.push(name)
+ }
}
}
return duplicates
}
+
const getImg = throttle((path: string) => {
if (path != undefined) return treeComponentsCopy.value.filter(item => item.path == path)[0]?.image
})
@@ -652,4 +666,20 @@ onBeforeUnmount(() => {
// border: 1px solid #000;
box-shadow: var(--el-box-shadow-light);
}
+.elButton {
+ position: absolute;
+ right: 10px;
+ top: 13px;
+ z-index: 1;
+}
+
+:deep(.vgl-item__resizer) {
+ width: 20px;
+ height: 20px;
+ background: linear-gradient(45deg, var(--el-color-primary));
+
+ clip-path: polygon(100% 0, 100% 100%, 0 100%);
+ /* 可选:添加阴影增强视觉效果 */
+ box-shadow: 2px 2px 8px var(--el-color-primary);
+}
diff --git a/src/views/setting/dictionary/component/add.vue b/src/views/setting/dictionary/component/add.vue
index de66981..ccc54cc 100644
--- a/src/views/setting/dictionary/component/add.vue
+++ b/src/views/setting/dictionary/component/add.vue
@@ -24,7 +24,7 @@
style="width: 100%"
/>
-
+
@@ -42,17 +42,7 @@
日
-
-
-
-
-
+
@@ -103,7 +93,6 @@ const form = ref({
system: [],
timeKeys: ['1', '2', '3', '4', '5'],
code: '',
- systemIds: [],
path: ''
})
const props = { label: 'name', value: 'id', multiple: true }
@@ -114,36 +103,48 @@ const rules = {
icon: [{ required: true, message: '请先择组件图标', trigger: 'change' }],
path: [{ required: true, message: '请输入组件路径', trigger: 'blur' }],
sort: [{ required: true, message: '请输入排序', trigger: 'blur' }],
- timeKeys: [{ required: true, message: '请选择组件查询时间', trigger: 'change' }],
- systemIds: [{ required: true, message: '请选择组件绑定系统', trigger: 'change' }]
+ timeKeys: [{ required: true, message: '请选择组件查询时间', trigger: 'change' }]
}
const customDeptOption: any = ref([])
-const systemList = dictData.getBasicData('System_Type')
-onMounted(() => {
- customDeptOption.value = dictData.getBasicData('Component_Type')
+onMounted(() => {})
+const getSystem = async () => {
+ // customDeptOption.value = dictData.getBasicData('System_Type')
+ // await customDeptOption.value.forEach((item: any) => {
+ // getFatherComponent({ systemType: item.id }).then(res => {
+ // item.children = res.data.filter(item => item.name != '无')
+ // })
+ // })
+ customDeptOption.value = dictData.getBasicData('System_Type')
- customDeptOption.value.forEach((item: any) => {
- getFatherComponent({ systemType: item.id }).then(res => {
- item.children = res.data.filter(item => item.name != '无')
- })
+ // 创建所有异步请求的 Promise 数组
+ const promises = customDeptOption.value.map(async (item: any) => {
+ try {
+ const res = await getFatherComponent({ systemType: item.id })
+ item.children = res.data.sort((a, b) => a.sort - b.sort)
+ } catch (error) {
+ console.error('加载组件失败:', error)
+ item.children = []
+ }
})
-})
+ // 等待所有请求完成
+ await Promise.all(promises)
+ // 所有 children 数据都已加载完成
+ return customDeptOption.value
+}
-const open = (text: string, data?: anyObj) => {
- console.log(data)
+const open = async (text: string, data?: anyObj) => {
title.value = text
dialogVisible.value = true
+ await getSystem()
if (data) {
let Data = JSON.parse(JSON.stringify(data))
form.value = Data
- form.value.system = [Data.systemType, Data.pid]
- // form.value.timeKeys = Data.timeKeys.split(',').map(Number)
+ form.value.system = getSystemComponentPairs(customDeptOption.value, Data.componentType)
+
form.value.timeKeys = Data.timeKeys || []
}
}
const submit = () => {
- console.log('🚀 ~ submit ~ form.value:', form.value)
-
formRef.value.validate(async (valid: boolean) => {
if (valid) {
let url = ''
@@ -168,11 +169,9 @@ const submit = () => {
if (title.value == '新增组件') {
await componentAdd({
...form.value,
- systemType: form.value.system
- .map(subArr => (subArr.length > 1 ? subArr.at(-1) : null))
- .filter(item => item !== null),
- // systemType: form.value.system[0],
- pid: form.value.system[1],
+ systemType: formatFirstIdToString(form.value.system, 0),
+ componentType: formatFirstIdToString(form.value.system, 1),
+ pid: '123',
image: url
}).then(res => {
ElMessage.success('新增成功!')
@@ -182,11 +181,9 @@ const submit = () => {
} else {
await componentEdit({
...form.value,
- // systemType: form.value.system[0],
- systemType: form.value.system
- .map(subArr => (subArr.length > 1 ? subArr.at(-1) : null))
- .filter(item => item !== null),
- pid: form.value.system[1],
+ systemType: formatFirstIdToString(form.value.system, 0),
+ componentType: formatFirstIdToString(form.value.system, 1),
+ pid: '123',
image: url
}).then(res => {
ElMessage.success('修改成功!')
@@ -199,6 +196,41 @@ const submit = () => {
}
})
}
+// 处理函数:提取子数组第一个元素 + 去重 + 拼接
+const formatFirstIdToString = (data: any, num: number) => {
+ // 1. 提取每个子数组的第一个元素
+ const firstIds = data.map(item => item[num])
+ // 2. 去重(利用Set特性)
+ const uniqueFirstIds = [...new Set(firstIds)]
+ // 3. 拼接成逗号分隔的字符串
+ return uniqueFirstIds.join(',')
+}
+// 根据id 找二位数组回显
+function getSystemComponentPairs(data: any, idsStr: string) {
+ const targetIds = idsStr.split(',')
+ const result: any[] = []
+
+ // 遍历所有数据
+ data.forEach(system => {
+ const systemId = system.id
+ const children = system.children || []
+
+ // 在children中查找匹配的ID
+ children.forEach(child => {
+ if (targetIds.includes(child.id)) {
+ result.push([systemId, child.id])
+ }
+ })
+ })
+
+ // 按照提供的ID顺序排序
+ return result.sort((a, b) => {
+ const indexA = targetIds.indexOf(a[1])
+ const indexB = targetIds.indexOf(b[1])
+ return indexA - indexB
+ })
+}
+
// 组件映射
const componentMap = reactive(new Map())
// 动态注册组件
diff --git a/src/views/setting/dictionary/component/index.vue b/src/views/setting/dictionary/component/index.vue
index 5544b43..d86b07f 100644
--- a/src/views/setting/dictionary/component/index.vue
+++ b/src/views/setting/dictionary/component/index.vue
@@ -226,6 +226,10 @@ const editTree = (row: any, num: number) => {
}
// 删除
const del = (row: any) => {
+ if (row.children?.length > 0) {
+ ElMessage.warning('请先删除节点下的组件!')
+ return
+ }
ElMessageBox.confirm('确定删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
@@ -362,10 +366,13 @@ span {
height: calc(100vh - 210px) !important;
}
}
-.elButton{
+.elButton {
position: absolute;
top: 13px;
right: 10px;
z-index: 1;
}
+.custom-tabs-label {
+ font-size: 14px;
+}
diff --git a/src/views/system/scheduledTasks/form.vue b/src/views/system/scheduledTasks/form.vue
index c810f01..e12b607 100644
--- a/src/views/system/scheduledTasks/form.vue
+++ b/src/views/system/scheduledTasks/form.vue
@@ -1,108 +1,108 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/vite.config.ts.timestamp-1767789689835-b2c93f7aab877.mjs b/vite.config.ts.timestamp-1767789689835-b2c93f7aab877.mjs
new file mode 100644
index 0000000..83221c9
--- /dev/null
+++ b/vite.config.ts.timestamp-1767789689835-b2c93f7aab877.mjs
@@ -0,0 +1,114 @@
+// vite.config.ts
+import { defineConfig } from "file:///D:/%E9%A1%B9%E7%9B%AE/%E7%81%BF%E8%83%BD/admin-govern/node_modules/.pnpm/vite@5.4.8_@types+node@20.16.9_sass@1.79.3/node_modules/vite/dist/node/index.js";
+import vue from "file:///D:/%E9%A1%B9%E7%9B%AE/%E7%81%BF%E8%83%BD/admin-govern/node_modules/.pnpm/@vitejs+plugin-vue@4.6.2_vite@5.4.8_vue@3.5.9/node_modules/@vitejs/plugin-vue/dist/index.mjs";
+import vueJsx from "file:///D:/%E9%A1%B9%E7%9B%AE/%E7%81%BF%E8%83%BD/admin-govern/node_modules/.pnpm/@vitejs+plugin-vue-jsx@3.1.0_vite@5.4.8_vue@3.5.9/node_modules/@vitejs/plugin-vue-jsx/dist/index.mjs";
+import path from "path";
+import AutoImport from "file:///D:/%E9%A1%B9%E7%9B%AE/%E7%81%BF%E8%83%BD/admin-govern/node_modules/.pnpm/unplugin-auto-import@0.16.7_@vueuse+core@10.11.1/node_modules/unplugin-auto-import/dist/vite.js";
+
+// src/components/icon/svg/index.ts
+import { readFileSync, readdirSync } from "fs";
+var idPerfix = "";
+var iconNames = [];
+var svgTitle = /", "");
+ svgRes.push(svg);
+ }
+ }
+ return svgRes;
+}
+var svgBuilder = (path2, perfix = "local") => {
+ if (path2 === "") return;
+ idPerfix = perfix;
+ const res = findSvgFile(path2);
+ return {
+ name: "svg-transform",
+ transformIndexHtml(html) {
+ return html.replace(
+ "",
+ `
+
+
+ `
+ );
+ }
+ };
+};
+
+// vite.config.ts
+var __vite_injected_original_dirname = "D:\\\u9879\u76EE\\\u707F\u80FD\\admin-govern";
+var nodeResolve = (dir) => path.resolve(__vite_injected_original_dirname, ".", dir);
+var vite_config_default = defineConfig({
+ plugins: [
+ vue(),
+ svgBuilder("./src/assets/icons/"),
+ vueJsx(),
+ AutoImport({
+ //自动引入
+ imports: ["vue", "vue-router", "pinia"]
+ })
+ ],
+ server: {
+ host: "0.0.0.0",
+ open: true,
+ proxy: {
+ "/api": {
+ // target: 'http://192.168.1.81:10215', //数据中心
+ // target: 'http://192.168.1.24:10215', //
+ // target: 'http://192.168.1.122:10215', //gfh
+ // target: 'http://192.168.1.127:10215', //cdf
+ // target: 'http://192.168.1.125:10215',
+ target: "http://192.168.2.126:10215",
+ // target: 'https://pqmcn.com:8092/api', //治理
+ // target:'http://www.zhilitest.com:8089/api',
+ changeOrigin: true,
+ rewrite: (path2) => path2.replace(/^\/api/, "")
+ //路径重写,把'/api'替换为''
+ }
+ }
+ // port:'3000'
+ },
+ resolve: {
+ alias: {
+ "/@": nodeResolve(".src"),
+ "@": nodeResolve("src"),
+ "~": nodeResolve("public")
+ }
+ }
+});
+export {
+ vite_config_default as default
+};
+//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiLCAic3JjL2NvbXBvbmVudHMvaWNvbi9zdmcvaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJEOlxcXFxcdTk4NzlcdTc2RUVcXFxcXHU3MDdGXHU4MEZEXFxcXGFkbWluLWdvdmVyblwiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiRDpcXFxcXHU5ODc5XHU3NkVFXFxcXFx1NzA3Rlx1ODBGRFxcXFxhZG1pbi1nb3Zlcm5cXFxcdml0ZS5jb25maWcudHNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL0Q6LyVFOSVBMSVCOSVFNyU5QiVBRS8lRTclODElQkYlRTglODMlQkQvYWRtaW4tZ292ZXJuL3ZpdGUuY29uZmlnLnRzXCI7aW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSAndml0ZSdcbmltcG9ydCB2dWUgZnJvbSAnQHZpdGVqcy9wbHVnaW4tdnVlJ1xuaW1wb3J0IHZ1ZUpzeCBmcm9tICdAdml0ZWpzL3BsdWdpbi12dWUtanN4J1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCBBdXRvSW1wb3J0IGZyb20gJ3VucGx1Z2luLWF1dG8taW1wb3J0L3ZpdGUnXG5pbXBvcnQgeyBzdmdCdWlsZGVyIH0gZnJvbSAnL0AvY29tcG9uZW50cy9pY29uL3N2Zy9pbmRleCdcblxuY29uc3Qgbm9kZVJlc29sdmUgPSAoZGlyOiBzdHJpbmcpID0+IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuJywgZGlyKVxuLy8gaHR0cHM6Ly92aXRlanMuZGV2L2NvbmZpZy9cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZyh7XG4gICAgcGx1Z2luczogW1xuICAgICAgICB2dWUoKSxcbiAgICAgICAgc3ZnQnVpbGRlcignLi9zcmMvYXNzZXRzL2ljb25zLycpLFxuICAgICAgICB2dWVKc3goKSxcbiAgICAgICAgQXV0b0ltcG9ydCh7XG4gICAgICAgICAgICAvL1x1ODFFQVx1NTJBOFx1NUYxNVx1NTE2NVxuICAgICAgICAgICAgaW1wb3J0czogWyd2dWUnLCAndnVlLXJvdXRlcicsICdwaW5pYSddXG4gICAgICAgIH0pXG4gICAgXSxcbiAgICBzZXJ2ZXI6IHtcbiAgICAgICAgaG9zdDogJzAuMC4wLjAnLFxuICAgICAgICBvcGVuOiB0cnVlLFxuICAgICAgICBwcm94eToge1xuICAgICAgICAgICAgJy9hcGknOiB7XG4gICAgICAgICAgICAgICAgLy8gdGFyZ2V0OiAnaHR0cDovLzE5Mi4xNjguMS44MToxMDIxNScsIC8vXHU2NTcwXHU2MzZFXHU0RTJEXHU1RkMzXG4gICAgICAgICAgICAgICAgLy8gdGFyZ2V0OiAnaHR0cDovLzE5Mi4xNjguMS4yNDoxMDIxNScsIC8vXG4gICAgICAgICAgICAgICAgLy8gdGFyZ2V0OiAnaHR0cDovLzE5Mi4xNjguMS4xMjI6MTAyMTUnLCAvL2dmaCBcbiAgICAgICAgICAgICAgICAvLyB0YXJnZXQ6ICdodHRwOi8vMTkyLjE2OC4xLjEyNzoxMDIxNScsIC8vY2RmXG4gICAgICAgICAgICAgICAgLy8gdGFyZ2V0OiAnaHR0cDovLzE5Mi4xNjguMS4xMjU6MTAyMTUnLFxuICAgICAgICAgICAgICAgIHRhcmdldDogJ2h0dHA6Ly8xOTIuMTY4LjIuMTI2OjEwMjE1JyxcbiAgICAgICAgICAgICAgICAvLyB0YXJnZXQ6ICdodHRwczovL3BxbWNuLmNvbTo4MDkyL2FwaScsIC8vXHU2Q0JCXHU3NDA2XG4gICAgICAgICAgICAgICAgLy8gdGFyZ2V0OidodHRwOi8vd3d3LnpoaWxpdGVzdC5jb206ODA4OS9hcGknLFxuICAgICAgICAgICAgICAgIGNoYW5nZU9yaWdpbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICByZXdyaXRlOiBwYXRoID0+IHBhdGgucmVwbGFjZSgvXlxcL2FwaS8sICcnKSAvL1x1OERFRlx1NUY4NFx1OTFDRFx1NTE5OVx1RkYwQ1x1NjI4QScvYXBpJ1x1NjZGRlx1NjM2Mlx1NEUzQScnXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gcG9ydDonMzAwMCdcbiAgICB9LFxuXG4gICAgcmVzb2x2ZToge1xuICAgICAgICBhbGlhczoge1xuICAgICAgICAgICAgJy9AJzogbm9kZVJlc29sdmUoJy5zcmMnKSxcbiAgICAgICAgICAgICdAJzogbm9kZVJlc29sdmUoJ3NyYycpLFxuICAgICAgICAgICAgJ34nOiBub2RlUmVzb2x2ZSgncHVibGljJylcbiAgICAgICAgfVxuICAgIH1cbn0pXG4iLCAiY29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2Rpcm5hbWUgPSBcIkQ6XFxcXFx1OTg3OVx1NzZFRVxcXFxcdTcwN0ZcdTgwRkRcXFxcYWRtaW4tZ292ZXJuXFxcXHNyY1xcXFxjb21wb25lbnRzXFxcXGljb25cXFxcc3ZnXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCJEOlxcXFxcdTk4NzlcdTc2RUVcXFxcXHU3MDdGXHU4MEZEXFxcXGFkbWluLWdvdmVyblxcXFxzcmNcXFxcY29tcG9uZW50c1xcXFxpY29uXFxcXHN2Z1xcXFxpbmRleC50c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vRDovJUU5JUExJUI5JUU3JTlCJUFFLyVFNyU4MSVCRiVFOCU4MyVCRC9hZG1pbi1nb3Zlcm4vc3JjL2NvbXBvbmVudHMvaWNvbi9zdmcvaW5kZXgudHNcIjtpbXBvcnQgeyByZWFkRmlsZVN5bmMsIHJlYWRkaXJTeW5jIH0gZnJvbSAnZnMnXHJcblxyXG5sZXQgaWRQZXJmaXggPSAnJ1xyXG5jb25zdCBpY29uTmFtZXM6IHN0cmluZ1tdID0gW11cclxuY29uc3Qgc3ZnVGl0bGUgPSAvPHN2ZyhbXj4rXS4qPyk+L1xyXG5jb25zdCBjbGVhckhlaWdodFdpZHRoID0gLyh3aWR0aHxoZWlnaHQpPVwiKFtePitdLio/KVwiL2dcclxuY29uc3QgaGFzVmlld0JveCA9IC8odmlld0JveD1cIltePitdLio/XCIpL2dcclxuY29uc3QgY2xlYXJSZXR1cm4gPSAvKFxccil8KFxcbikvZ1xyXG4vLyBcdTZFMDVcdTc0MDYgc3ZnIFx1NzY4NCBmaWxsXHJcbmNvbnN0IGNsZWFyRmlsbCA9IC8oZmlsbD1cIltePitdLio/XCIpL2dcclxuXHJcbmZ1bmN0aW9uIGZpbmRTdmdGaWxlKGRpcjogc3RyaW5nKTogc3RyaW5nW10ge1xyXG4gICAgY29uc3Qgc3ZnUmVzID0gW11cclxuICAgIGNvbnN0IGRpcmVudHMgPSByZWFkZGlyU3luYyhkaXIsIHtcclxuICAgICAgICB3aXRoRmlsZVR5cGVzOiB0cnVlLFxyXG4gICAgfSlcclxuICAgIGZvciAoY29uc3QgZGlyZW50IG9mIGRpcmVudHMpIHtcclxuICAgICAgICBpY29uTmFtZXMucHVzaChgJHtpZFBlcmZpeH0tJHtkaXJlbnQubmFtZS5yZXBsYWNlKCcuc3ZnJywgJycpfWApXHJcbiAgICAgICAgaWYgKGRpcmVudC5pc0RpcmVjdG9yeSgpKSB7XHJcbiAgICAgICAgICAgIHN2Z1Jlcy5wdXNoKC4uLmZpbmRTdmdGaWxlKGRpciArIGRpcmVudC5uYW1lICsgJy8nKSlcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBzdmcgPSByZWFkRmlsZVN5bmMoZGlyICsgZGlyZW50Lm5hbWUpXHJcbiAgICAgICAgICAgICAgICAudG9TdHJpbmcoKVxyXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoY2xlYXJSZXR1cm4sICcnKVxyXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoY2xlYXJGaWxsLCAnZmlsbD1cIlwiJylcclxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKHN2Z1RpdGxlLCAoJDEsICQyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHdpZHRoID0gMFxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBoZWlnaHQgPSAwXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSAkMi5yZXBsYWNlKGNsZWFySGVpZ2h0V2lkdGgsIChzMTogc3RyaW5nLCBzMjogc3RyaW5nLCBzMzogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzMiA9PT0gJ3dpZHRoJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBzM1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHMyID09PSAnaGVpZ2h0Jykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gczNcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJydcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghaGFzVmlld0JveC50ZXN0KCQyKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGB2aWV3Qm94PVwiMCAwICR7d2lkdGh9ICR7aGVpZ2h0fVwiYFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYDxzeW1ib2wgaWQ9XCIke2lkUGVyZml4fS0ke2RpcmVudC5uYW1lLnJlcGxhY2UoJy5zdmcnLCAnJyl9XCIgJHtjb250ZW50fT5gXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJzwvc3ZnPicsICc8L3N5bWJvbD4nKVxyXG4gICAgICAgICAgICBzdmdSZXMucHVzaChzdmcpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN2Z1Jlc1xyXG59XHJcblxyXG5leHBvcnQgY29uc3Qgc3ZnQnVpbGRlciA9IChwYXRoOiBzdHJpbmcsIHBlcmZpeCA9ICdsb2NhbCcpID0+IHtcclxuICAgIGlmIChwYXRoID09PSAnJykgcmV0dXJuXHJcbiAgICBpZFBlcmZpeCA9IHBlcmZpeFxyXG4gICAgY29uc3QgcmVzID0gZmluZFN2Z0ZpbGUocGF0aClcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgbmFtZTogJ3N2Zy10cmFuc2Zvcm0nLFxyXG4gICAgICAgIHRyYW5zZm9ybUluZGV4SHRtbChodG1sOiBzdHJpbmcpIHtcclxuICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUgKi9cclxuICAgICAgICAgICAgcmV0dXJuIGh0bWwucmVwbGFjZShcclxuICAgICAgICAgICAgICAgICc8Ym9keT4nLFxyXG4gICAgICAgICAgICAgICAgYFxyXG4gICAgICAgICAgICAgICAgPGJvZHk+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIGlkPVwibG9jYWwtaWNvblwiIGRhdGEtaWNvbi1uYW1lPVwiJHtpY29uTmFtZXMuam9pbihcclxuICAgICAgICAgICAgICAgICAgICAnLCdcclxuICAgICAgICAgICAgICAgICl9XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyB3aWR0aDogMDsgaGVpZ2h0OiAwXCI+XHJcbiAgICAgICAgICAgICAgICAke3Jlcy5qb2luKCcnKX1cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgYFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIC8qIGVzbGludC1lbmFibGUgKi9cclxuICAgICAgICB9LFxyXG4gICAgfVxyXG59XHJcbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBeVIsU0FBUyxvQkFBb0I7QUFDdFQsT0FBTyxTQUFTO0FBQ2hCLE9BQU8sWUFBWTtBQUNuQixPQUFPLFVBQVU7QUFDakIsT0FBTyxnQkFBZ0I7OztBQ0pzVSxTQUFTLGNBQWMsbUJBQW1CO0FBRXZZLElBQUksV0FBVztBQUNmLElB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