【代码优化】工作流:1)完善相关注释;2)解决模型每次操作后,刷新列表后,重渲染会导致滚动条的位置不对的问题

pull/582/head
YunaiV 2024-11-02 19:55:13 +08:00
parent c3cf479f6f
commit 71de0c3ecf
2 changed files with 37 additions and 48 deletions

View File

@ -1,5 +1,6 @@
<template> <template>
<div class="flex items-center h-50px"> <div class="flex items-center h-50px">
<!-- 头部分类名 -->
<div class="flex items-center"> <div class="flex items-center">
<el-tooltip content="拖动排序" v-if="isCategorySorting"> <el-tooltip content="拖动排序" v-if="isCategorySorting">
<Icon <Icon
@ -11,6 +12,7 @@
<h3 class="ml-20px mr-8px text-18px">{{ categoryInfo.name }}</h3> <h3 class="ml-20px mr-8px text-18px">{{ categoryInfo.name }}</h3>
<div class="color-gray-600 text-16px"> ({{ categoryInfo.modelList?.length || 0 }}) </div> <div class="color-gray-600 text-16px"> ({{ categoryInfo.modelList?.length || 0 }}) </div>
</div> </div>
<!-- 头部操作 -->
<div class="flex-1 flex" v-if="!isCategorySorting"> <div class="flex-1 flex" v-if="!isCategorySorting">
<div <div
v-if="categoryInfo.modelList.length > 0" v-if="categoryInfo.modelList.length > 0"
@ -62,6 +64,7 @@
</div> </div>
</div> </div>
</div> </div>
<!-- 模型列表 -->
<el-collapse-transition> <el-collapse-transition>
<div v-show="isExpand"> <div v-show="isExpand">
<el-table <el-table
@ -70,7 +73,7 @@
:header-cell-style="{ backgroundColor: isDark ? '' : '#edeff0', paddingLeft: '10px' }" :header-cell-style="{ backgroundColor: isDark ? '' : '#edeff0', paddingLeft: '10px' }"
:cell-style="{ paddingLeft: '10px' }" :cell-style="{ paddingLeft: '10px' }"
:row-style="{ height: '68px' }" :row-style="{ height: '68px' }"
:data="tableData" :data="modelList"
row-key="id" row-key="id"
> >
<el-table-column label="流程名" prop="name" min-width="150"> <el-table-column label="流程名" prop="name" min-width="150">
@ -110,7 +113,7 @@
<el-table-column label="表单信息" prop="formType" min-width="200"> <el-table-column label="表单信息" prop="formType" min-width="200">
<template #default="scope"> <template #default="scope">
<el-button <el-button
v-if="scope.row.formType === 10" v-if="scope.row.formType === BpmModelFormType.NORMAL"
type="primary" type="primary"
link link
@click="handleFormDetail(scope.row)" @click="handleFormDetail(scope.row)"
@ -118,7 +121,7 @@
<span>{{ scope.row.formName }}</span> <span>{{ scope.row.formName }}</span>
</el-button> </el-button>
<el-button <el-button
v-else-if="scope.row.formType === 20" v-else-if="scope.row.formType === BpmModelFormType.CUSTOM"
type="primary" type="primary"
link link
@click="handleFormDetail(scope.row)" @click="handleFormDetail(scope.row)"
@ -246,7 +249,7 @@ import { formatDate } from '@/utils/formatTime'
import * as ModelApi from '@/api/bpm/model' import * as ModelApi from '@/api/bpm/model'
import * as FormApi from '@/api/bpm/form' import * as FormApi from '@/api/bpm/form'
import { setConfAndFields2 } from '@/utils/formCreate' import { setConfAndFields2 } from '@/utils/formCreate'
import { BpmModelType } from '@/utils/constants' import { BpmModelFormType, BpmModelType } from '@/utils/constants'
import { checkPermi } from '@/utils/permission' import { checkPermi } from '@/utils/permission'
import { useUserStoreWithOut } from '@/store/modules/user' import { useUserStoreWithOut } from '@/store/modules/user'
import { useAppStore } from '@/store/modules/app' import { useAppStore } from '@/store/modules/app'
@ -255,20 +258,19 @@ import { cloneDeep } from 'lodash-es'
defineOptions({ name: 'BpmModel' }) defineOptions({ name: 'BpmModel' })
const props = defineProps({ const props = defineProps({
// categoryInfo: propTypes.object.def([]), //
categoryInfo: propTypes.object.def([]), isCategorySorting: propTypes.bool.def(false) //
isCategorySorting: propTypes.bool.def(false)
}) })
const emit = defineEmits(['success']) const emit = defineEmits(['success'])
const appStore = useAppStore()
const message = useMessage() // const message = useMessage() //
const isDark = computed(() => appStore.getIsDark)
const { t } = useI18n() // const { t } = useI18n() //
const { push } = useRouter() // const { push } = useRouter() //
const userStore = useUserStoreWithOut() // const userStore = useUserStoreWithOut() //
const isDark = computed(() => useAppStore().getIsDark) //
const isModelSorting = ref(false) // const isModelSorting = ref(false) //
const tableData: any = ref([]) //
const originalData: any = ref([]) // const originalData: any = ref([]) //
const modelList: any = ref([]) //
const isExpand = ref(false) // const isExpand = ref(false) //
/** '更多'操作按钮 */ /** '更多'操作按钮 */
@ -414,7 +416,7 @@ const handleModelSort = () => {
/** 处理模型的排序提交 */ /** 处理模型的排序提交 */
const handleModelSortSubmit = async () => { const handleModelSortSubmit = async () => {
// //
const ids = tableData.value.map((item: any) => item.id) const ids = modelList.value.map((item: any) => item.id)
await ModelApi.updateModelSortBatch(ids) await ModelApi.updateModelSortBatch(ids)
// //
isModelSorting.value = false isModelSorting.value = false
@ -425,12 +427,12 @@ const handleModelSortSubmit = async () => {
/** 处理模型的排序取消 */ /** 处理模型的排序取消 */
const handleModelSortCancel = () => { const handleModelSortCancel = () => {
// //
tableData.value = cloneDeep(originalData.value) modelList.value = cloneDeep(originalData.value)
isModelSorting.value = false isModelSorting.value = false
} }
/** 创建拖拽实例 */
const tableRef = ref() const tableRef = ref()
//
const initSort = () => { const initSort = () => {
const table = document.querySelector(`.${props.categoryInfo.name} .el-table__body-wrapper tbody`) const table = document.querySelector(`.${props.categoryInfo.name} .el-table__body-wrapper tbody`)
Sortable.create(table, { Sortable.create(table, {
@ -441,19 +443,19 @@ const initSort = () => {
// //
onEnd: ({ newDraggableIndex, oldDraggableIndex }) => { onEnd: ({ newDraggableIndex, oldDraggableIndex }) => {
if (oldDraggableIndex !== newDraggableIndex) { if (oldDraggableIndex !== newDraggableIndex) {
tableData.value.splice( modelList.value.splice(
newDraggableIndex, newDraggableIndex,
0, 0,
tableData.value.splice(oldDraggableIndex, 1)[0] modelList.value.splice(oldDraggableIndex, 1)[0]
) )
} }
} }
}) })
} }
// /** 更新 modelList 模型列表 */
const updateTableData = () => { const updateModeList = () => {
tableData.value = cloneDeep(props.categoryInfo.modelList) modelList.value = cloneDeep(props.categoryInfo.modelList)
if (props.categoryInfo.modelList.length > 0) { if (props.categoryInfo.modelList.length > 0) {
isExpand.value = true isExpand.value = true
} }
@ -497,7 +499,7 @@ const openModelForm = (type: string, id?: number) => {
modelFormRef.value.open(type, id) modelFormRef.value.open(type, id)
} }
watch(() => props.categoryInfo.modelList, updateTableData, { immediate: true }) watch(() => props.categoryInfo.modelList, updateModeList, { immediate: true })
watch( watch(
() => props.isCategorySorting, () => props.isCategorySorting,
(val) => { (val) => {

View File

@ -38,11 +38,11 @@
</el-button> </el-button>
<template #dropdown> <template #dropdown>
<el-dropdown-menu> <el-dropdown-menu>
<el-dropdown-item command="handleAddCategory"> <el-dropdown-item command="handleCategoryAdd">
<Icon icon="ep:circle-plus" :size="13" class="mr-5px" /> <Icon icon="ep:circle-plus" :size="13" class="mr-5px" />
新建分类 新建分类
</el-dropdown-item> </el-dropdown-item>
<el-dropdown-item command="handleSort"> <el-dropdown-item command="handleCategorySort">
<Icon icon="fa:sort-amount-desc" :size="13" class="mr-5px" /> <Icon icon="fa:sort-amount-desc" :size="13" class="mr-5px" />
分类排序 分类排序
</el-dropdown-item> </el-dropdown-item>
@ -101,7 +101,7 @@ import { CategoryApi } from '@/api/bpm/category'
import * as ModelApi from '@/api/bpm/model' import * as ModelApi from '@/api/bpm/model'
import ModelForm from './ModelForm.vue' import ModelForm from './ModelForm.vue'
import CategoryForm from '../category/CategoryForm.vue' import CategoryForm from '../category/CategoryForm.vue'
import { groupBy, cloneDeep } from 'lodash-es' import { cloneDeep } from 'lodash-es'
import CategoryDraggableModel from './CategoryDraggableModel.vue' import CategoryDraggableModel from './CategoryDraggableModel.vue'
defineOptions({ name: 'BpmModel' }) defineOptions({ name: 'BpmModel' })
@ -116,26 +116,6 @@ const queryFormRef = ref() // 搜索的表单
const categoryGroup: any = ref([]) // category const categoryGroup: any = ref([]) // category
const originalData: any = ref([]) // const originalData: any = ref([]) //
/** 查询所有分类 */
const getAllCategory = async () => {
const list = await CategoryApi.getCategorySimpleList()
categoryGroup.value = list.map((item: any) => ({ ...item, modelList: [] }))
}
/** 查询所有流程模型接口 */
const getAllModel = async () => {
//
const list = await ModelApi.getModelList(queryParams.name)
// categoryName
const groupedData = groupBy(list, 'categoryName')
Object.keys(groupedData).forEach((key) => {
const category = categoryGroup.value.find((item: any) => item.name === key)
if (category) {
category.modelList = groupedData[key]
}
})
}
/** 搜索按钮操作 */ /** 搜索按钮操作 */
const handleQuery = () => { const handleQuery = () => {
getList() getList()
@ -157,10 +137,10 @@ const formDetailPreview = ref({
/** 右上角设置按钮 */ /** 右上角设置按钮 */
const handleCommand = (command: string) => { const handleCommand = (command: string) => {
switch (command) { switch (command) {
case 'handleAddCategory': case 'handleCategoryAdd':
handleAddCategory() handleCategoryAdd()
break break
case 'handleSort': case 'handleCategorySort':
handleCategorySort() handleCategorySort()
break break
default: default:
@ -170,7 +150,7 @@ const handleCommand = (command: string) => {
/** 新建分类 */ /** 新建分类 */
const categoryFormRef = ref() const categoryFormRef = ref()
const handleAddCategory = () => { const handleCategoryAdd = () => {
categoryFormRef.value.open('create') categoryFormRef.value.open('create')
} }
@ -203,8 +183,15 @@ const handleCategorySortSubmit = async () => {
const getList = async () => { const getList = async () => {
loading.value = true loading.value = true
try { try {
await getAllCategory() // +
await getAllModel() const modelList = await ModelApi.getModelList(queryParams.name)
const categoryList = await CategoryApi.getCategorySimpleList()
// category
// categoryGroup
categoryGroup.value = categoryList.map((category: any) => ({
...category,
modelList: modelList.filter((model: any) => model.categoryName == category.name)
}))
} finally { } finally {
loading.value = false loading.value = false
} }