From bbe94610a28e72414df1fb2b36a6d11385873e54 Mon Sep 17 00:00:00 2001 From: 疯狂的狮子Li <15040126243@163.com> Date: 星期一, 20 一月 2025 11:30:16 +0800 Subject: [PATCH] update 优化 parseTime 提示报错问题 --- src/views/system/post/index.vue | 313 ++++++++++++++++++++++++++++++++++++---------------- 1 files changed, 216 insertions(+), 97 deletions(-) diff --git a/src/views/system/post/index.vue b/src/views/system/post/index.vue index 9755b4b..4aa4e3a 100644 --- a/src/views/system/post/index.vue +++ b/src/views/system/post/index.vue @@ -1,114 +1,179 @@ <template> <div class="p-2"> - <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> - <div v-show="showSearch" class="mb-[10px]"> + <el-row :gutter="20"> + <!-- 閮ㄩ棬鏍� --> + <el-col :lg="4" :xs="24" style=""> <el-card shadow="hover"> - <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="70"> - <el-form-item label="宀椾綅缂栫爜" prop="postCode"> - <el-input v-model="queryParams.postCode" placeholder="璇疯緭鍏ュ矖浣嶇紪鐮�" clearable style="width: 240px" style="width: 200px" @keyup.enter="handleQuery" /> - </el-form-item> + <el-input v-model="deptName" placeholder="璇疯緭鍏ラ儴闂ㄥ悕绉�" prefix-icon="Search" clearable /> + <el-tree + ref="deptTreeRef" + class="mt-2" + node-key="id" + :data="deptOptions" + :props="{ label: 'label', children: 'children' }" + :expand-on-click-node="false" + :filter-node-method="filterNode" + highlight-current + default-expand-all + @node-click="handleNodeClick" + /> + </el-card> + </el-col> + <el-col :lg="20" :xs="24"> + <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> + <div v-show="showSearch" class="mb-[10px]"> + <el-card shadow="hover"> + <el-form ref="queryFormRef" :model="queryParams" :inline="true"> + <el-form-item label="宀椾綅缂栫爜" prop="postCode"> + <el-input v-model="queryParams.postCode" placeholder="璇疯緭鍏ュ矖浣嶇紪鐮�" clearable @keyup.enter="handleQuery" /> + </el-form-item> + <el-form-item label="绫诲埆缂栫爜" prop="postCategory"> + <el-input + v-model="queryParams.postCategory" + placeholder="璇疯緭鍏ョ被鍒紪鐮�" + clearable + style="width: 200px" + @keyup.enter="handleQuery" + /> + </el-form-item> + <el-form-item label="宀椾綅鍚嶇О" prop="postName"> + <el-input v-model="queryParams.postName" placeholder="璇疯緭鍏ュ矖浣嶅悕绉�" clearable @keyup.enter="handleQuery" /> + </el-form-item> + <el-form-item label="閮ㄩ棬" prop="deptId"> + <el-tree-select + v-model="queryParams.deptId" + :data="deptOptions" + :props="{ value: 'id', label: 'label', children: 'children' }" + value-key="id" + placeholder="璇烽�夋嫨閮ㄩ棬" + check-strictly + /> + </el-form-item> + <el-form-item label="鐘舵��" prop="status"> + <el-select v-model="queryParams.status" placeholder="宀椾綅鐘舵��" clearable> + <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" /> + </el-select> + </el-form-item> + <el-form-item> + <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button> + <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button> + </el-form-item> + </el-form> + </el-card> + </div> + </transition> + <el-card shadow="hover"> + <template #header> + <el-row :gutter="10" class="mb8"> + <el-col :span="1.5"> + <el-button v-hasPermi="['system:post:add']" type="primary" plain icon="Plus" @click="handleAdd">鏂板</el-button> + </el-col> + <el-col :span="1.5"> + <el-button v-hasPermi="['system:post:edit']" type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" + >淇敼</el-button + > + </el-col> + <el-col :span="1.5"> + <el-button v-hasPermi="['system:post:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()"> + 鍒犻櫎 + </el-button> + </el-col> + <el-col :span="1.5"> + <el-button v-hasPermi="['system:post:export']" type="warning" plain icon="Download" @click="handleExport">瀵煎嚭</el-button> + </el-col> + <right-toolbar v-model:show-search="showSearch" @query-table="getList"></right-toolbar> + </el-row> + </template> + <el-table v-loading="loading" :data="postList" @selection-change="handleSelectionChange"> + <el-table-column type="selection" width="55" align="center" /> + <el-table-column v-if="false" label="宀椾綅缂栧彿" align="center" prop="postId" /> + <el-table-column label="宀椾綅缂栫爜" align="center" prop="postCode" /> + <el-table-column label="绫诲埆缂栫爜" align="center" prop="postCategory" /> + <el-table-column label="宀椾綅鍚嶇О" align="center" prop="postName" /> + <el-table-column label="閮ㄩ棬" align="center" prop="deptName" /> + <el-table-column label="鎺掑簭" align="center" prop="postSort" /> + <el-table-column label="鐘舵��" align="center" prop="status"> + <template #default="scope"> + <dict-tag :options="sys_normal_disable" :value="scope.row.status" /> + </template> + </el-table-column> + <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="180"> + <template #default="scope"> + <span>{{ proxy.parseTime(scope.row.createTime) }}</span> + </template> + </el-table-column> + <el-table-column label="鎿嶄綔" width="180" align="center" class-name="small-padding fixed-width"> + <template #default="scope"> + <el-tooltip content="淇敼" placement="top"> + <el-button v-hasPermi="['system:post:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button> + </el-tooltip> + <el-tooltip content="鍒犻櫎" placement="top"> + <el-button v-hasPermi="['system:post:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button> + </el-tooltip> + </template> + </el-table-column> + </el-table> + + <pagination + v-show="total > 0" + v-model:page="queryParams.pageNum" + v-model:limit="queryParams.pageSize" + :total="total" + @pagination="getList" + /> + </el-card> + + <!-- 娣诲姞鎴栦慨鏀瑰矖浣嶅璇濇 --> + <el-dialog v-model="dialog.visible" :title="dialog.title" width="500px" append-to-body> + <el-form ref="postFormRef" :model="form" :rules="rules" label-width="80px"> <el-form-item label="宀椾綅鍚嶇О" prop="postName"> - <el-input v-model="queryParams.postName" placeholder="璇疯緭鍏ュ矖浣嶅悕绉�" clearable style="width: 240px" style="width: 200px" @keyup.enter="handleQuery" /> + <el-input v-model="form.postName" placeholder="璇疯緭鍏ュ矖浣嶅悕绉�" /> </el-form-item> - <el-form-item label="鐘舵��" prop="status"> - <el-select v-model="queryParams.status" placeholder="宀椾綅鐘舵��" clearable style="width: 240px"> - <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" /> - </el-select> + <el-form-item label="閮ㄩ棬" prop="deptId"> + <el-tree-select + v-model="form.deptId" + :data="deptOptions" + :props="{ value: 'id', label: 'label', children: 'children' }" + value-key="id" + placeholder="璇烽�夋嫨閮ㄩ棬" + check-strictly + /> </el-form-item> - <el-form-item> - <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button> - <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button> + <el-form-item label="宀椾綅缂栫爜" prop="postCode"> + <el-input v-model="form.postCode" placeholder="璇疯緭鍏ョ紪鐮佸悕绉�" /> + </el-form-item> + <el-form-item label="绫诲埆缂栫爜" prop="postCategory"> + <el-input v-model="form.postCategory" placeholder="璇疯緭鍏ョ被鍒紪鐮�" /> + </el-form-item> + <el-form-item label="宀椾綅椤哄簭" prop="postSort"> + <el-input-number v-model="form.postSort" controls-position="right" :min="0" /> + </el-form-item> + <el-form-item label="宀椾綅鐘舵��" prop="status"> + <el-radio-group v-model="form.status"> + <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio> + </el-radio-group> + </el-form-item> + <el-form-item label="澶囨敞" prop="remark"> + <el-input v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ唴瀹�" /> </el-form-item> </el-form> - </el-card> - </div> - </transition> - <el-card shadow="hover"> - <template #header> - <el-row :gutter="10" class="mb8"> - <el-col :span="1.5"> - <el-button v-hasPermi="['system:post:add']" type="primary" plain icon="Plus" @click="handleAdd">鏂板</el-button> - </el-col> - <el-col :span="1.5"> - <el-button v-hasPermi="['system:post:edit']" type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()">淇敼</el-button> - </el-col> - <el-col :span="1.5"> - <el-button v-hasPermi="['system:post:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()"> - 鍒犻櫎 - </el-button> - </el-col> - <el-col :span="1.5"> - <el-button v-hasPermi="['system:post:export']" type="warning" plain icon="Download" @click="handleExport">瀵煎嚭</el-button> - </el-col> - <right-toolbar v-model:showSearch="showSearch" @query-table="getList"></right-toolbar> - </el-row> - </template> - - <el-table v-loading="loading" :data="postList" @selection-change="handleSelectionChange"> - <el-table-column type="selection" width="55" align="center" /> - <el-table-column v-if="false" label="宀椾綅缂栧彿" align="center" prop="postId" /> - <el-table-column label="宀椾綅缂栫爜" align="center" prop="postCode" /> - <el-table-column label="宀椾綅鍚嶇О" align="center" prop="postName" /> - <el-table-column label="宀椾綅鎺掑簭" align="center" prop="postSort" /> - <el-table-column label="鐘舵��" align="center" prop="status"> - <template #default="scope"> - <dict-tag :options="sys_normal_disable" :value="scope.row.status" /> + <template #footer> + <div class="dialog-footer"> + <el-button type="primary" @click="submitForm">纭� 瀹�</el-button> + <el-button @click="cancel">鍙� 娑�</el-button> + </div> </template> - </el-table-column> - <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="180"> - <template #default="scope"> - <span>{{ parseTime(scope.row.createTime) }}</span> - </template> - </el-table-column> - <el-table-column label="鎿嶄綔" width="180" align="center" class-name="small-padding fixed-width"> - <template #default="scope"> - <el-tooltip content="淇敼" placement="top"> - <el-button v-hasPermi="['system:post:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button> - </el-tooltip> - <el-tooltip content="鍒犻櫎" placement="top"> - <el-button v-hasPermi="['system:post:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button> - </el-tooltip> - </template> - </el-table-column> - </el-table> - - <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" /> - </el-card> - - <!-- 娣诲姞鎴栦慨鏀瑰矖浣嶅璇濇 --> - <el-dialog v-model="dialog.visible" :title="dialog.title" width="500px" append-to-body> - <el-form ref="postFormRef" :model="form" :rules="rules" label-width="80px"> - <el-form-item label="宀椾綅鍚嶇О" prop="postName"> - <el-input v-model="form.postName" placeholder="璇疯緭鍏ュ矖浣嶅悕绉�" /> - </el-form-item> - <el-form-item label="宀椾綅缂栫爜" prop="postCode"> - <el-input v-model="form.postCode" placeholder="璇疯緭鍏ョ紪鐮佸悕绉�" /> - </el-form-item> - <el-form-item label="宀椾綅椤哄簭" prop="postSort"> - <el-input-number v-model="form.postSort" controls-position="right" :min="0" /> - </el-form-item> - <el-form-item label="宀椾綅鐘舵��" prop="status"> - <el-radio-group v-model="form.status"> - <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio> - </el-radio-group> - </el-form-item> - <el-form-item label="澶囨敞" prop="remark"> - <el-input v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ唴瀹�" /> - </el-form-item> - </el-form> - <template #footer> - <div class="dialog-footer"> - <el-button type="primary" @click="submitForm">纭� 瀹�</el-button> - <el-button @click="cancel">鍙� 娑�</el-button> - </div> - </template> - </el-dialog> + </el-dialog> + </el-col> + </el-row> </div> </template> <script setup name="Post" lang="ts"> import { listPost, addPost, delPost, getPost, updatePost } from '@/api/system/post'; import { PostForm, PostQuery, PostVO } from '@/api/system/post/types'; +import { DeptVO } from '@/api/system/dept/types'; +import api from '@/api/system/user'; const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { sys_normal_disable } = toRefs<any>(proxy?.useDict('sys_normal_disable')); @@ -120,7 +185,9 @@ const single = ref(true); const multiple = ref(true); const total = ref(0); - +const deptName = ref(''); +const deptOptions = ref<DeptVO[]>([]); +const deptTreeRef = ref<ElTreeInstance>(); const postFormRef = ref<ElFormInstance>(); const queryFormRef = ref<ElFormInstance>(); @@ -131,8 +198,10 @@ const initFormData: PostForm = { postId: undefined, + deptId: undefined, postCode: '', postName: '', + postCategory: '', postSort: 0, status: '0', remark: '' @@ -145,16 +214,47 @@ pageSize: 10, postCode: '', postName: '', + postCategory: '', status: '' }, rules: { postName: [{ required: true, message: '宀椾綅鍚嶇О涓嶈兘涓虹┖', trigger: 'blur' }], postCode: [{ required: true, message: '宀椾綅缂栫爜涓嶈兘涓虹┖', trigger: 'blur' }], + deptId: [{ required: true, message: '閮ㄩ棬涓嶈兘涓虹┖', trigger: 'blur' }], postSort: [{ required: true, message: '宀椾綅椤哄簭涓嶈兘涓虹┖', trigger: 'blur' }] } }); const { queryParams, form, rules } = toRefs<PageData<PostForm, PostQuery>>(data); + +/** 閫氳繃鏉′欢杩囨护鑺傜偣 */ +const filterNode = (value: string, data: any) => { + if (!value) return true; + return data.label.indexOf(value) !== -1; +}; + +/** 鏍规嵁鍚嶇О绛涢�夐儴闂ㄦ爲 */ +watchEffect( + () => { + deptTreeRef.value?.filter(deptName.value); + }, + { + flush: 'post' // watchEffect浼氬湪DOM鎸傝浇鎴栬�呮洿鏂颁箣鍓嶅氨浼氳Е鍙戯紝姝ゅ睘鎬ф帶鍒跺湪DOM鍏冪礌鏇存柊鍚庤繍琛� + } +); + +/** 鏌ヨ閮ㄩ棬涓嬫媺鏍戠粨鏋� */ +const getTreeSelect = async () => { + const res = await api.deptTreeSelect(); + deptOptions.value = res.data; +}; + +/** 鑺傜偣鍗曞嚮浜嬩欢 */ +const handleNodeClick = (data: DeptVO) => { + queryParams.value.belongDeptId = data.id; + queryParams.value.deptId = undefined; + handleQuery(); +}; /** 鏌ヨ宀椾綅鍒楄〃 */ const getList = async () => { @@ -164,38 +264,53 @@ total.value = res.total; loading.value = false; }; + /** 鍙栨秷鎸夐挳 */ const cancel = () => { reset(); dialog.visible = false; }; + /** 琛ㄥ崟閲嶇疆 */ const reset = () => { form.value = { ...initFormData }; postFormRef.value?.resetFields(); }; + /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { queryParams.value.pageNum = 1; + if (queryParams.value.deptId) { + queryParams.value.belongDeptId = undefined; + } getList(); }; + /** 閲嶇疆鎸夐挳鎿嶄綔 */ const resetQuery = () => { queryFormRef.value?.resetFields(); + queryParams.value.pageNum = 1; + queryParams.value.deptId = undefined; + deptTreeRef.value?.setCurrentKey(undefined); + /** 娓呯┖宸﹁竟閮ㄩ棬鏍戦�変腑鍊� */ + queryParams.value.belongDeptId = undefined; handleQuery(); }; + /** 澶氶�夋閫変腑鏁版嵁 */ const handleSelectionChange = (selection: PostVO[]) => { ids.value = selection.map((item) => item.postId); single.value = selection.length != 1; multiple.value = !selection.length; }; + /** 鏂板鎸夐挳鎿嶄綔 */ const handleAdd = () => { reset(); dialog.visible = true; dialog.title = '娣诲姞宀椾綅'; }; + /** 淇敼鎸夐挳鎿嶄綔 */ const handleUpdate = async (row?: PostVO) => { reset(); @@ -205,6 +320,7 @@ dialog.visible = true; dialog.title = '淇敼宀椾綅'; }; + /** 鎻愪氦鎸夐挳 */ const submitForm = () => { postFormRef.value?.validate(async (valid: boolean) => { @@ -216,6 +332,7 @@ } }); }; + /** 鍒犻櫎鎸夐挳鎿嶄綔 */ const handleDelete = async (row?: PostVO) => { const postIds = row?.postId || ids.value; @@ -224,6 +341,7 @@ await getList(); proxy?.$modal.msgSuccess('鍒犻櫎鎴愬姛'); }; + /** 瀵煎嚭鎸夐挳鎿嶄綔 */ const handleExport = () => { proxy?.download( @@ -236,6 +354,7 @@ }; onMounted(() => { + getTreeSelect(); // 鍒濆鍖栭儴闂ㄦ暟鎹� getList(); }); </script> -- Gitblit v1.9.3