人员管理页面优化

This commit is contained in:
BianLzhaoMin 2025-12-18 16:08:12 +08:00
parent bd1faac676
commit 61344a1943
6 changed files with 179 additions and 97 deletions

View File

@ -37,7 +37,7 @@ const props = defineProps({
}, },
style: { style: {
type: Object, type: Object,
default: () => ({ width: '200px' }), default: () => ({ width: '180px' }),
}, },
}) })

View File

@ -1 +0,0 @@
<!-- 已废弃请使用 ItemInput.vue -->

View File

@ -49,7 +49,7 @@ const props = defineProps({
// //
labelWidth: { labelWidth: {
type: String, type: String,
default: '100px', default: 'auto',
}, },
// //
defaultFormData: { defaultFormData: {
@ -96,7 +96,7 @@ const getComponentProps = (item) => {
clearable: item.clearable !== false, clearable: item.clearable !== false,
disabled: item.disabled || false, disabled: item.disabled || false,
style: item.style || { style: item.style || {
width: '240px', width: '200px',
}, },
} }
@ -166,4 +166,8 @@ watch(
.search-form-card :deep(.el-card__body) { .search-form-card :deep(.el-card__body) {
padding: 18px 20px 0; padding: 18px 20px 0;
} }
.el-form--inline .el-form-item {
margin-right: 10px;
}
</style> </style>

View File

@ -28,6 +28,7 @@
<el-input <el-input
clearable clearable
maxlength="20" maxlength="20"
show-word-limit
placeholder="请输入姓名" placeholder="请输入姓名"
v-model.trim="formData.name" v-model.trim="formData.name"
/> />
@ -44,6 +45,7 @@
<el-input <el-input
clearable clearable
maxlength="11" maxlength="11"
show-word-limit
placeholder="请输入电话" placeholder="请输入电话"
v-model.trim="formData.phone" v-model.trim="formData.phone"
/> />
@ -104,59 +106,43 @@
<script setup name="AddAndEditForm"> <script setup name="AddAndEditForm">
import { ref } from 'vue' import { ref } from 'vue'
import { useOptions } from '@/hooks/useOptions'
import {
getInspectionStationSelectAPI,
getPersonNatureAndCategoryAndPositionSelectAPI,
} from '@/api/common.js'
const props = defineProps({ const props = defineProps({
formData: { formData: {
type: Object, type: Object,
default: () => ({}), default: () => ({}),
}, },
inspectionStationOptions: {
type: Array,
default: () => [],
},
positionOptions: {
type: Array,
default: () => [],
},
natureOptions: {
type: Array,
default: () => [],
},
categoryOptions: {
type: Array,
default: () => [],
},
}) })
const formRef = ref(null) const formRef = ref(null)
// 使 Hook
//
const { options: inspectionStationOptions } = useOptions(
'inspectionStationOptions',
getInspectionStationSelectAPI,
{
category: 0,
},
)
//
const { options: positionOptions } = useOptions(
'positionOptions',
getPersonNatureAndCategoryAndPositionSelectAPI,
{
category: 2,
},
)
//
const { options: natureOptions } = useOptions(
'personNatureOptions',
getPersonNatureAndCategoryAndPositionSelectAPI,
{
category: 1,
},
)
//
const { options: categoryOptions } = useOptions(
'personCategoryOptions',
getPersonNatureAndCategoryAndPositionSelectAPI,
{
category: 0,
},
)
const rules = { const rules = {
inspectionStationId: [{ required: true, message: '请选择人员所属', trigger: 'change' }], inspectionStationId: [{ required: true, message: '请选择人员所属', trigger: 'change' }],
name: [{ required: true, message: '请输入姓名', trigger: 'blur' }], name: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
sex: [{ required: true, message: '请选择性别', trigger: 'change' }], sex: [{ required: true, message: '请选择性别', trigger: 'change' }],
phone: [
{
pattern: /^1[3-9]\d{9}$/,
message: '请输入正确的手机号码',
trigger: 'blur',
},
],
positionId: [{ required: true, message: '请选择岗位', trigger: 'change' }], positionId: [{ required: true, message: '请选择岗位', trigger: 'change' }],
personnelNatureId: [{ required: true, message: '请选择人员性质', trigger: 'change' }], personnelNatureId: [{ required: true, message: '请选择人员性质', trigger: 'change' }],
personnelClassificationId: [{ required: true, message: '请选择人员分类', trigger: 'change' }], personnelClassificationId: [{ required: true, message: '请选择人员分类', trigger: 'change' }],

View File

@ -1,13 +1,62 @@
import { reactive } from 'vue' import { reactive } from 'vue'
export default {
formColumns: [ // 根据下拉数据构建搜索表单配置
// 注意:这里不直接发请求,只依赖调用方传入的 options避免在模块顶层使用组合式 API
export const buildFormColumns = (
positionOptions = [],
natureOptions = [],
categoryOptions = [],
) => [
{ {
type: 'input', type: 'input',
prop: 'personName', prop: 'personName',
placeholder: '请输入姓名', placeholder: '请输入姓名',
}, },
{
type: 'select',
prop: 'sex',
placeholder: '请选择性别',
options: [
{
label: '男',
value: 1,
},
{
label: '女',
value: 0,
},
], ],
tableColumns: [ },
{
type: 'select',
prop: 'positionId',
placeholder: '请选择岗位',
options: positionOptions.map((item) => ({
label: item.value,
value: item.id,
})),
},
{
type: 'select',
prop: 'personnelNatureId',
placeholder: '请选择人员性质',
options: natureOptions.map((item) => ({
label: item.value,
value: item.id,
})),
},
{
type: 'select',
prop: 'personnelClassificationId',
placeholder: '请选择人员分类',
options: categoryOptions.map((item) => ({
label: item.value,
value: item.id,
})),
},
]
export const tableColumns = [
{ {
prop: 'inspectionStationName', prop: 'inspectionStationName',
label: '人员所属', label: '人员所属',
@ -42,13 +91,18 @@ export default {
label: '是否长期借调', label: '是否长期借调',
slot: 'longTermSecondment', slot: 'longTermSecondment',
}, },
], ]
dialogConfig: reactive({ export const dialogConfig = reactive({
outerVisible: false, outerVisible: false,
outerTitle: '新增人员', outerTitle: '新增人员',
outerWidth: '640px', // 根据图片缩小宽度更美观 outerWidth: '640px', // 根据图片缩小宽度更美观
minHeight: '400px', minHeight: '400px',
maxHeight: '80vh', maxHeight: '80vh',
}), })
export default {
tableColumns,
dialogConfig,
buildFormColumns,
} }

View File

@ -26,7 +26,14 @@
<ComDialog :dialog-config="dialogConfig" @closeDialogOuter="onCloseDialogOuter"> <ComDialog :dialog-config="dialogConfig" @closeDialogOuter="onCloseDialogOuter">
<template #outerContent> <template #outerContent>
<!-- 将表单抽离到独立组件中保持 index.vue 简洁 --> <!-- 将表单抽离到独立组件中保持 index.vue 简洁 -->
<AddAndEditForm ref="formRef" :form-data="addAndEditForm" /> <AddAndEditForm
ref="formRef"
:form-data="addAndEditForm"
:inspection-station-options="inspectionStationOptions"
:position-options="positionOptions"
:nature-options="natureOptions"
:category-options="categoryOptions"
/>
<el-row class="common-btn-row"> <el-row class="common-btn-row">
<ComButton plain type="info" @click="onHandleCancel">取消</ComButton> <ComButton plain type="info" @click="onHandleCancel">取消</ComButton>
@ -38,26 +45,58 @@
</template> </template>
<script setup name="Person"> <script setup name="Person">
import { ref, nextTick, getCurrentInstance } from 'vue' import { ref, nextTick, getCurrentInstance, computed } from 'vue'
import { import {
listPersonAPI, listPersonAPI,
addPersonAPI, addPersonAPI,
updatePersonAPI, updatePersonAPI,
delPersonAPI, delPersonAPI,
} from '@/api/personManage/person.js' } from '@/api/personManage/person.js'
import {
getInspectionStationSelectAPI,
getPersonNatureAndCategoryAndPositionSelectAPI,
} from '@/api/common.js'
import config from './config' import config from './config'
import { useOptions } from '@/hooks/useOptions'
import ComTable from '@/components/ComTable/index.vue' import ComTable from '@/components/ComTable/index.vue'
import ComButton from '@/components/ComButton/index.vue' import ComButton from '@/components/ComButton/index.vue'
import ComDialog from '@/components/ComDialog/index.vue' import ComDialog from '@/components/ComDialog/index.vue'
import AddAndEditForm from './addAndEditForm.vue' import AddAndEditForm from './addAndEditForm.vue'
const { formColumns, tableColumns, dialogConfig } = config const { tableColumns, dialogConfig, buildFormColumns } = config
const { proxy } = getCurrentInstance() const { proxy } = getCurrentInstance()
const formRef = ref(null) const formRef = ref(null)
const comTableRef = ref(null) const comTableRef = ref(null)
const editId = ref(null) const editId = ref(null)
// 使 Hook
const { options: inspectionStationOptions } = useOptions(
'inspectionStationOptions',
getInspectionStationSelectAPI,
{ category: 0 },
)
const { options: positionOptions } = useOptions(
'positionOptions',
getPersonNatureAndCategoryAndPositionSelectAPI,
{ category: 2 },
)
const { options: natureOptions } = useOptions(
'personNatureOptions',
getPersonNatureAndCategoryAndPositionSelectAPI,
{ category: 1 },
)
const { options: categoryOptions } = useOptions(
'personCategoryOptions',
getPersonNatureAndCategoryAndPositionSelectAPI,
{ category: 0 },
)
//
const formColumns = computed(() =>
buildFormColumns(positionOptions.value, natureOptions.value, categoryOptions.value),
)
// 1. // 1.
const getInitFormData = () => ({ const getInitFormData = () => ({
inspectionStationId: null, // inspectionStationId: null, //