业务管理,系统管理

This commit is contained in:
sjl
2025-07-28 16:35:36 +08:00
parent d6e440dedb
commit d53b9df52f
10 changed files with 134 additions and 64 deletions

View File

@@ -94,7 +94,7 @@
> >
<el-form :model="formData" label-width="120px" :rules="rules" ref="ruleFormRef"> <el-form :model="formData" label-width="120px" :rules="rules" ref="ruleFormRef">
<el-form-item label="名称:" prop="name"> <el-form-item label="名称:" prop="name">
<el-input v-model="formData.name" placeholder="请输入名称"></el-input> <el-input v-model="formData.name" placeholder="请输入名称" maxlength="32" show-word-limit @input="handleInput"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="IP:" prop="ip" class="top"> <el-form-item label="IP:" prop="ip" class="top">
<el-input v-model="formData.ip" placeholder="请输入Ip"></el-input> <el-input v-model="formData.ip" placeholder="请输入Ip"></el-input>
@@ -332,14 +332,31 @@ const tableStore = new TableStore({
}) })
// 点击行 // 点击行
const currentChangeEvent = () => { const currentChangeEvent = () => {
// 确保 tableRef 和当前记录存在
if (!tableRef.value || !tableRef.value.getRef().getCurrentRecord()) {
loading.value = false;
dataSource.value = [];
return;
}
loading.value = true loading.value = true
dataSource.value = [] dataSource.value = []
nodeDeviceTree({ nodeDeviceTree({
nodeId: tableRef.value.getRef().getCurrentRecord().id nodeId: tableRef.value.getRef().getCurrentRecord().id
}).then(res => { }).then(res => {
dataSource.value = res.data.processDeviceList.filter(item => (item.name = item.processNo + '')) // 检查返回的数据是否存在且不为空
if (res.data && res.data.processDeviceList) {
dataSource.value = res.data.processDeviceList.filter(item => (item.name = item.processNo + ''))
} else {
dataSource.value = []
}
loading.value = false
}).catch(() => {
// 添加错误处理,确保 loading 状态也能关闭
dataSource.value = []
loading.value = false loading.value = false
}) })
// const row = tableRef.value.getRef().getCurrentRecord() // const row = tableRef.value.getRef().getCurrentRecord()
} }
const treeRef = ref() const treeRef = ref()
@@ -444,6 +461,10 @@ const resetForm = () => {
} }
} }
const handleInput = (val: string) => {
formData.value.name = val.replace(/\s+/g, '')
}
onMounted(() => { onMounted(() => {
setTimeout(() => { setTimeout(() => {
tableStore.index() tableStore.index()

View File

@@ -54,6 +54,7 @@
</el-button> </el-button>
</el-form-item> </el-form-item>
<el-form-item style="right: 0; position: absolute; overflow: hidden"> <el-form-item style="right: 0; position: absolute; overflow: hidden">
<div class="title"> <div class="title">
<LocationInformation style="width: 16px; margin-right: 8px; color: #396" /> <LocationInformation style="width: 16px; margin-right: 8px; color: #396" />
<span style="font-size: 16px; font-weight: bold; color: #396">当前操作节点</span> <span style="font-size: 16px; font-weight: bold; color: #396">当前操作节点</span>
@@ -2353,6 +2354,9 @@ const next = async () => {
// 撤销 // 撤销
const black = () => { const black = () => {
pageStatus.value = 1 pageStatus.value = 1
busBarIndex.value = '0'
deviceIndex.value = '0';
lineIndex.value = '0';
} }
// 确认提交 // 确认提交
const onsubmit = () => { const onsubmit = () => {

View File

@@ -2,8 +2,8 @@
<el-dialog draggable class="cn-operate-dialog" v-model="dialogVisible" :title="title"> <el-dialog draggable class="cn-operate-dialog" v-model="dialogVisible" :title="title">
<el-scrollbar> <el-scrollbar>
<el-form :inline="false" :model="form" label-width="120px" :rules="rules" ref="formRef"> <el-form :inline="false" :model="form" label-width="120px" :rules="rules" ref="formRef">
<el-form-item label="名称:" class="top" prop="name"> <el-form-item label="名称:" class="top" prop="name" >
<el-input v-model="form.name"></el-input> <el-input v-model="form.name" ></el-input>
</el-form-item> </el-form-item>
<el-form-item label="计算值:" class="top"> <el-form-item label="计算值:" class="top">
<el-input v-model="form.value"></el-input> <el-input v-model="form.value"></el-input>
@@ -118,5 +118,6 @@ const submit = async () => {
dialogVisible.value = false dialogVisible.value = false
} }
defineExpose({ open }) defineExpose({ open })
</script> </script>

View File

@@ -3,7 +3,7 @@
<el-scrollbar> <el-scrollbar>
<el-form :inline="false" :model="form" label-width="120px" :rules="rules" ref="formRef"> <el-form :inline="false" :model="form" label-width="120px" :rules="rules" ref="formRef">
<el-form-item label="名称" prop="name"> <el-form-item label="名称" prop="name">
<el-input v-model="form.name"></el-input> <el-input v-model="form.name" maxlength="32" show-word-limit @input="handleInput"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="编码" class="top" prop="code"> <el-form-item label="编码" class="top" prop="code">
<el-input v-model="form.code"></el-input> <el-input v-model="form.code"></el-input>
@@ -112,5 +112,9 @@ const submit = async () => {
}) })
} }
const handleInput = (value: string) => {
form.name = value.replace(/[^\d]/g, '')
}
defineExpose({ open }) defineExpose({ open })
</script> </script>

View File

@@ -1,9 +1,9 @@
<template> <template>
<el-dialog draggable class="cn-operate-dialog" v-model="dialogVisible" :title="title"> <el-dialog draggable class="cn-operate-dialog" v-model="dialogVisible" :title="title">
<el-scrollbar> <el-scrollbar>
<el-form :inline="false" :model="form" label-width="120px" :rules="rules"> <el-form :inline="false" :model="form" label-width="120px" :rules="rules" ref="formRef">
<el-form-item label="字典名称:" prop="name"> <el-form-item label="字典名称:" prop="name">
<el-input v-model="form.name" placeholder="请输入字典名称"></el-input> <el-input v-model="form.name" placeholder="请输入字典名称" maxlength="32" show-word-limit @input="handleInput"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="序号:" prop="sort" class="top"> <el-form-item label="序号:" prop="sort" class="top">
<el-input v-model="form.sort" placeholder="请输入序号"></el-input> <el-input v-model="form.sort" placeholder="请输入序号"></el-input>
@@ -33,6 +33,7 @@ import { ElMessage } from 'element-plus'
import { useAdminInfo } from '@/stores/adminInfo' import { useAdminInfo } from '@/stores/adminInfo'
import { dicAdd, dicUpdate } from '@/api/system-boot/dic' import { dicAdd, dicUpdate } from '@/api/system-boot/dic'
const formRef = ref()
const adminInfo = useAdminInfo() const adminInfo = useAdminInfo()
const tableStore = inject('tableStore') as TableStore const tableStore = inject('tableStore') as TableStore
// do not use same name with ref // do not use same name with ref
@@ -69,14 +70,23 @@ const open = (text: string, data?: anyObj) => {
} }
} }
const submit = async () => { const submit = async () => {
if (form.id) { formRef.value.validate(async (valid: boolean) => {
await dicUpdate(form) if (valid) {
} else { if (form.id) {
await dicAdd(form) await dicUpdate(form)
} } else {
ElMessage.success('保存成功') await dicAdd(form)
tableStore.index() }
dialogVisible.value = false ElMessage.success('保存成功')
tableStore.index()
dialogVisible.value = false
}
})
}
const handleInput = (val: string) => {
form.name = val.replace(/\s+/g, '')
} }
defineExpose({ open }) defineExpose({ open })

View File

@@ -1,8 +1,8 @@
<template> <template>
<el-dialog draggable width="600px" v-model="dialogVisible" :title="title"> <el-dialog draggable width="600px" v-model="dialogVisible" :title="title">
<el-scrollbar> <el-scrollbar>
<el-form :inline="false" :model="form" label-width="auto" class="form-one"> <el-form :inline="false" :model="form" label-width="auto" :rules="rules" class="form-one" ref="formRef">
<el-form-item label="上级菜单"> <el-form-item label="上级菜单" prop="pid">
<el-cascader <el-cascader
v-model="form.pid" v-model="form.pid"
clearable clearable
@@ -11,16 +11,16 @@
style="width: 100%" style="width: 100%"
/> />
</el-form-item> </el-form-item>
<el-form-item label="菜单名称"> <el-form-item label="菜单名称" prop="name">
<el-input v-model="form.name" placeholder="请输入菜单名称" /> <el-input v-model="form.name" placeholder="请输入菜单名称" maxlength="32" show-word-limit @input="handleInput"/>
</el-form-item> </el-form-item>
<el-form-item label="图标"> <el-form-item label="图标" prop="icon">
<IconSelector v-model="form.icon" placeholder="请选择图标" /> <IconSelector v-model="form.icon" placeholder="请选择图标" />
</el-form-item> </el-form-item>
<el-form-item label="菜单路由"> <el-form-item label="菜单路由" prop="path">
<el-input v-model="form.path" placeholder="请输入菜单名称" /> <el-input v-model="form.path" placeholder="请输入菜单路由" />
</el-form-item> </el-form-item>
<el-form-item label="组件路径"> <el-form-item label="组件路径" prop="routeName">
<el-input <el-input
v-model="form.routeName" v-model="form.routeName"
placeholder="请输入组件路径,如/src/views/auth/audit/index.vue或auth/audit" placeholder="请输入组件路径,如/src/views/auth/audit/index.vue或auth/audit"
@@ -53,6 +53,7 @@ import { updateMenu, addMenu } from '@/api/systerm'
defineOptions({ defineOptions({
name: 'auth/menu/popupMenu' name: 'auth/menu/popupMenu'
}) })
const emits = defineEmits<{ const emits = defineEmits<{
(e: 'init'): void (e: 'init'): void
}>() }>()
@@ -75,7 +76,7 @@ const form: any = reactive({
sort: 100, sort: 100,
type: 0 type: 0
}) })
const formRef = ref()
const dialogVisible = ref(false) const dialogVisible = ref(false)
const title = ref('新增菜单') const title = ref('新增菜单')
const open = (text: string, data: anyObj) => { const open = (text: string, data: anyObj) => {
@@ -99,21 +100,35 @@ const open = (text: string, data: anyObj) => {
dialogVisible.value = true dialogVisible.value = true
} }
const submit = async () => { const submit = async () => {
formRef.value.validate(async (valid: boolean) => {
if (valid) {
if(form.pid === ''||form.pid === null){
form.pid = '0'
}
if(form.pid === ''||form.pid === null){ if (form.id) {
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
}
})
if (form.id) { }
await updateMenu(form)
} else { const rules = {
form.code = 'menu' name: [{ required: true, message: '请输入菜单名称', trigger: 'blur' }],
let obj = JSON.parse(JSON.stringify(form)) path: [{ required: true, message: '请输入菜单路由', trigger: 'blur' }],
delete obj.id routeName: [{ required: true, message: '请输入组件路径', trigger: 'blur' }],
await addMenu(obj) }
}
emits('init') const handleInput = (val: string) => {
dialogVisible.value = false form.name = val.replace(/\s+/g, '').replace(/\//g, '')
} }
defineExpose({ open }) defineExpose({ open })

View File

@@ -2,10 +2,10 @@
<el-dialog draggable class="cn-operate-dialog" v-model="dialogVisible" :title="title"> <el-dialog draggable class="cn-operate-dialog" v-model="dialogVisible" :title="title">
<el-scrollbar> <el-scrollbar>
<el-form :inline="false" :model="form" label-width="120px" :rules="rules" ref="formRef"> <el-form :inline="false" :model="form" label-width="120px" :rules="rules" ref="formRef">
<el-form-item label="角色名称" required> <el-form-item label="角色名称" prop="name">
<el-input v-model="form.name" placeholder="请输入菜单名称" maxlength="32" show-word-limit @input="handleInput"/> <el-input v-model="form.name" placeholder="请输入菜单名称" maxlength="32" show-word-limit @input="handleInput"/>
</el-form-item> </el-form-item>
<el-form-item label="角色编码"> <el-form-item label="角色编码" prop="code">
<el-input v-model="form.code" placeholder="请输入菜单名称" /> <el-input v-model="form.code" placeholder="请输入菜单名称" />
</el-form-item> </el-form-item>
<el-form-item label="角色描述"> <el-form-item label="角色描述">
@@ -61,10 +61,9 @@ const open = (text: string, data?: anyObj) => {
} }
} }
const submit = async () => { const submit = async () => {
// 先进行表单验证 formRef.value.validate(async (valid: boolean) => {
try { if (valid) {
await formRef.value.validate() if (form.id) {
if (form.id) {
await update(form) await update(form)
} else { } else {
form.type = adminInfo.$state.userType + 1 form.type = adminInfo.$state.userType + 1
@@ -73,10 +72,8 @@ const submit = async () => {
ElMessage.success('保存成功') ElMessage.success('保存成功')
tableStore.index() tableStore.index()
dialogVisible.value = false dialogVisible.value = false
} catch (error) { }
// 验证失败Element Plus 会自动显示错误信息 })
console.log('表单验证失败:', error)
}
} }
const handleInput = (val: string) => { const handleInput = (val: string) => {

View File

@@ -28,6 +28,8 @@
v-model="tableStore.table.params.searchValue" v-model="tableStore.table.params.searchValue"
clearable clearable
placeholder="仅根据用户名/登录名" placeholder="仅根据用户名/登录名"
maxlength="10"
show-word-limit
/> />
</el-form-item> </el-form-item>
</template> </template>
@@ -195,6 +197,9 @@ const tableStore = new TableStore({
break break
} }
}) })
},
resetCallback: () => {
tableStore.table.params.searchValue = ''
} }
}) })

View File

@@ -1,11 +1,11 @@
<template> <template>
<el-dialog draggable class="cn-operate-dialog" v-model="dialogVisible" :title="title"> <el-dialog draggable class="cn-operate-dialog" v-model="dialogVisible" :title="title">
<el-form :model="form" class="form-two" label-width="auto" :rules="rules"> <el-form :model="form" class="form-two" label-width="auto" :rules="rules" ref="formRef">
<el-form-item label="用户名" prop="name"> <el-form-item label="用户名" prop="name">
<el-input v-model="form.name" placeholder="请输入昵称" /> <el-input v-model="form.name" placeholder="请输入昵称" maxlength="16" show-word-limit @input="handleInput('name', $event)"/>
</el-form-item> </el-form-item>
<el-form-item label="登录名" prop="loginName"> <el-form-item label="登录名" prop="loginName">
<el-input v-model="form.loginName" placeholder="请输入登录名" /> <el-input v-model="form.loginName" placeholder="请输入登录名" maxlength="16" show-word-limit @input="handleInput('loginName', $event)"/>
</el-form-item> </el-form-item>
<el-form-item label="默认密码" prop="password" v-if="title === '新增用户'"> <el-form-item label="默认密码" prop="password" v-if="title === '新增用户'">
<el-input v-model="form.password" placeholder="请输入密码" disabled /> <el-input v-model="form.password" placeholder="请输入密码" disabled />
@@ -104,7 +104,7 @@ import { roleList } from '@/api/user-boot/role'
import { add, edit } from '@/api/user-boot/user' import { add, edit } from '@/api/user-boot/user'
import { useAdminInfo } from '@/stores/adminInfo' import { useAdminInfo } from '@/stores/adminInfo'
import Area from '@/components/form/area/index.vue' import Area from '@/components/form/area/index.vue'
const formRef = ref()
const adminInfo = useAdminInfo() const adminInfo = useAdminInfo()
const tableStore = inject('tableStore') as TableStore const tableStore = inject('tableStore') as TableStore
// do not use same name with ref // do not use same name with ref
@@ -240,19 +240,32 @@ const open = (text: string, data?: anyObj) => {
form.type = adminInfo.$state.userType + 1 form.type = adminInfo.$state.userType + 1
} }
const submit = async () => { const submit = async () => {
let obj = JSON.parse(JSON.stringify(form)) formRef.value.validate(async (valid: boolean) => {
obj.limitTime = obj.limitTime.join('-') if (valid) {
delete obj.password let obj = JSON.parse(JSON.stringify(form))
if (form.id) { obj.limitTime = obj.limitTime.join('-')
await edit(obj) delete obj.password
ElMessage.success('修改成功') if (form.id) {
} else { await edit(obj)
form.type = adminInfo.$state.userType + 1 ElMessage.success('修改成功')
await add(obj) } else {
ElMessage.success('新增成功') form.type = adminInfo.$state.userType + 1
await add(obj)
ElMessage.success('新增成功')
}
tableStore.index()
dialogVisible.value = false
}
})
}
const handleInput = (field: keyof typeof form, value: string) => {
// 过滤空格
const filteredValue = value.replace(/\s/g, '')
if (filteredValue !== value) {
form[field] = filteredValue as never
} }
tableStore.index()
dialogVisible.value = false
} }
const changeValue = () => {} const changeValue = () => {}

View File

@@ -68,7 +68,7 @@ const submit = () => {
}) })
} else { } else {
updateDevType(form).then(res => { updateDevType(form).then(res => {
ElMessage.success('新增成功') ElMessage.success('编辑成功')
dialogVisible.value = false dialogVisible.value = false
emit('submit') emit('submit')
}) })