Jelajahi Sumber

!222 发布 5.4.1-2.4.1 小步迭代修复问题
Merge pull request !222 from 疯狂的狮子Li/dev

疯狂的狮子Li 9 bulan lalu
induk
melakukan
b000788785

+ 1 - 1
package.json

@@ -1,7 +1,7 @@
 {
   "$schema": "https://json.schemastore.org/package",
   "name": "ruoyi-vue-plus",
-  "version": "5.4.0-2.4.0",
+  "version": "5.4.1-2.4.1",
   "description": "RuoYi-Vue-Plus多租户管理系统",
   "author": "LionLi",
   "license": "MIT",

+ 1 - 1
src/components/Process/flowChart.vue

@@ -21,7 +21,7 @@ const iframeUrl = ref('');
 const baseUrl = import.meta.env.VITE_APP_BASE_API;
 
 onMounted(async () => {
-  const url = baseUrl + `/warm-flow-ui/index.html?id=${props.insId}&type=FlowChart`;
+  const url = baseUrl + `/warm-flow-ui/index.html?id=${props.insId}&type=FlowChart&t=${Date.now()}`;
   iframeUrl.value = url + '&Authorization=Bearer ' + getToken() + '&clientid=' + import.meta.env.VITE_APP_CLIENT_ID;
 });
 </script>

+ 1 - 1
src/components/Process/submitVerify.vue

@@ -273,7 +273,7 @@ const emits = defineEmits(['submitCallback', 'cancelCallback']);
 /** 办理流程 */
 const handleCompleteTask = async () => {
   form.value.taskId = taskId.value;
-  form.value.taskVariables = props.taskVariables;
+  form.value.variables = props.taskVariables;
   let verify = false;
   if (buttonObj.value.pop && nestNodeList.value && nestNodeList.value.length > 0) {
     nestNodeList.value.forEach((e) => {

+ 2 - 5
src/layout/components/AppMain.vue

@@ -1,14 +1,11 @@
 <template>
   <section class="app-main">
     <router-view v-slot="{ Component, route }">
-      <transition v-if="!route.meta.noCache" :enter-active-class="animate" mode="out-in">
-        <keep-alive v-if="!route.meta.noCache" :include="tagsViewStore.cachedViews">
+      <transition :enter-active-class="animate" mode="out-in">
+        <keep-alive :include="tagsViewStore.cachedViews">
           <component :is="Component" v-if="!route.meta.link" :key="route.path" />
         </keep-alive>
       </transition>
-      <transition v-if="route.meta.noCache" :enter-active-class="animate" mode="out-in">
-        <component :is="Component" v-if="!route.meta.link && route.meta.noCache" :key="route.path" />
-      </transition>
     </router-view>
     <iframe-toggle />
   </section>

+ 0 - 9
src/views/demo/demo/index.vue

@@ -4,15 +4,6 @@
       <div v-show="showSearch" class="mb-[10px]">
         <el-card shadow="hover">
           <el-form ref="queryFormRef" :model="queryParams" :inline="true">
-            <el-form-item label="部门id" prop="deptId">
-              <el-input v-model="queryParams.deptId" placeholder="请输入部门id" clearable @keyup.enter="handleQuery" />
-            </el-form-item>
-            <el-form-item label="用户id" prop="userId">
-              <el-input v-model="queryParams.userId" placeholder="请输入用户id" clearable @keyup.enter="handleQuery" />
-            </el-form-item>
-            <el-form-item label="排序号" prop="orderNum">
-              <el-input v-model="queryParams.orderNum" placeholder="请输入排序号" clearable @keyup.enter="handleQuery" />
-            </el-form-item>
             <el-form-item label="key键" prop="testKey">
               <el-input v-model="queryParams.testKey" placeholder="请输入key键" clearable @keyup.enter="handleQuery" />
             </el-form-item>

+ 2 - 2
src/views/index.vue

@@ -33,7 +33,7 @@
           * 部署方式 Docker 容器编排 一键部署业务集群<br />
           * 国际化 SpringMessage Spring标准国际化方案<br />
         </p>
-        <p><b>当前版本:</b> <span>v5.4.0</span></p>
+        <p><b>当前版本:</b> <span>v5.4.1</span></p>
         <p>
           <el-tag type="danger">&yen;免费开源</el-tag>
         </p>
@@ -77,7 +77,7 @@
           * 分布式监控 Prometheus、Grafana 全方位性能监控<br />
           * 其余与 Vue 版本一致<br />
         </p>
-        <p><b>当前版本:</b> <span>v2.4.0</span></p>
+        <p><b>当前版本:</b> <span>v2.4.1</span></p>
         <p>
           <el-tag type="danger">&yen;免费开源</el-tag>
         </p>

+ 56 - 20
src/views/system/menu/index.vue

@@ -27,9 +27,6 @@
           <el-col :span="1.5">
             <el-button v-hasPermi="['system:menu:add']" type="primary" plain icon="Plus" @click="handleAdd()">新增 </el-button>
           </el-col>
-          <el-col :span="1.5">
-            <el-button type="info" plain icon="Sort" @click="handleToggleExpandAll">展开/折叠</el-button>
-          </el-col>
           <el-col :span="1.5">
             <el-button type="danger" plain icon="Delete" @click="handleCascadeDelete" :loading="deleteLoading">级联删除</el-button>
           </el-col>
@@ -44,7 +41,9 @@
         row-key="menuId"
         border
         :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
-        :default-expand-all="isExpandAll"
+        :default-expand-all="false"
+        lazy
+        :load="getChildrenList"
       >
         <el-table-column prop="menuName" label="菜单名称" :show-overflow-tooltip="true" width="160"></el-table-column>
         <el-table-column prop="icon" label="图标" align="center" width="100">
@@ -299,10 +298,11 @@ const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const { sys_show_hide, sys_normal_disable } = toRefs<any>(proxy?.useDict('sys_show_hide', 'sys_normal_disable'));
 
 const menuList = ref<MenuVO[]>([]);
+const menuChildrenListMap = ref({});
+const menuExpandMap = ref({});
 const loading = ref(true);
 const showSearch = ref(true);
 const menuOptions = ref<MenuOptionsType[]>([]);
-const isExpandAll = ref(false);
 
 const dialog = reactive<DialogOption>({
   visible: false,
@@ -340,14 +340,62 @@ const data = reactive<PageData<MenuForm, MenuQuery>>({
 const menuTableRef = ref<ElTableInstance>();
 
 const { queryParams, form, rules } = toRefs<PageData<MenuForm, MenuQuery>>(data);
+
+/** 获取子菜单列表 */
+const getChildrenList = async (row: any, treeNode: unknown, resolve: (data: any[]) => void) => {
+  menuExpandMap.value[row.menuId] = { row, treeNode, resolve };
+  const children = menuChildrenListMap.value[row.menuId] || [];
+  // 菜单的子菜单清空后关闭展开
+  if (children.length == 0) {
+    // fix: 处理当菜单只有一个子菜单并被删除,需要将父菜单的展开状态关闭
+    menuTableRef.value?.updateKeyChildren(row.menuId, children);
+  }
+  resolve(children);
+};
+
+/** 刷新展开的菜单数据 */
+const refreshLoadTree = (parentId: string | number) => {
+  if (menuExpandMap.value[parentId]) {
+    const { row, treeNode, resolve } = menuExpandMap.value[parentId];
+    if (row) {
+      getChildrenList(row, treeNode, resolve);
+      if (row.parentId) {
+        const grandpaMenu = menuExpandMap.value[row.parentId];
+        getChildrenList(grandpaMenu.row, grandpaMenu.treeNode, grandpaMenu.resolve);
+      }
+    }
+  }
+};
+
+/** 重新加载所有已展开的菜单的数据 */
+const refreshAllExpandMenuData = () => {
+  for (const menuId in menuExpandMap.value) {
+    refreshLoadTree(menuId);
+  }
+};
+
 /** 查询菜单列表 */
 const getList = async () => {
   loading.value = true;
   const res = await listMenu(queryParams.value);
-  const data = proxy?.handleTree<MenuVO>(res.data, 'menuId');
-  if (data) {
-    menuList.value = data;
+
+  const tempMap = {};
+  // 存储 父菜单:子菜单列表
+  for (const menu of res.data) {
+    const parentId = menu.parentId;
+    if (!tempMap[parentId]) {
+      tempMap[parentId] = [];
+    }
+    tempMap[parentId].push(menu);
   }
+  // 设置有没有子菜单
+  for (const menu of res.data) {
+    menu['hasChildren'] = tempMap[menu.menuId]?.length > 0;
+  }
+  menuChildrenListMap.value = tempMap;
+  menuList.value = tempMap[0] || [];
+  // 根据新数据重新加载子菜单数据
+  refreshAllExpandMenuData();
   loading.value = false;
 };
 /** 查询菜单下拉树结构 */
@@ -386,18 +434,6 @@ const handleAdd = (row?: MenuVO) => {
   dialog.visible = true;
   dialog.title = '添加菜单';
 };
-/** 展开/折叠操作 */
-const handleToggleExpandAll = () => {
-  isExpandAll.value = !isExpandAll.value;
-  toggleExpandAll(menuList.value, isExpandAll.value);
-};
-/** 展开/折叠所有 */
-const toggleExpandAll = (data: MenuVO[], status: boolean) => {
-  data.forEach((item: MenuVO) => {
-    menuTableRef.value?.toggleRowExpansion(item, status);
-    if (item.children && item.children.length > 0) toggleExpandAll(item.children, status);
-  });
-};
 /** 修改按钮操作 */
 const handleUpdate = async (row: MenuVO) => {
   reset();

+ 3 - 9
src/views/system/tenantPackage/index.vue

@@ -108,7 +108,7 @@ import {
   updateTenantPackage,
   changePackageStatus
 } from '@/api/system/tenantPackage';
-import { treeselect as menuTreeselect, tenantPackageMenuTreeselect } from '@/api/system/menu';
+import { tenantPackageMenuTreeselect } from '@/api/system/menu';
 import { TenantPkgForm, TenantPkgQuery, TenantPkgVO } from '@/api/system/tenantPackage/types';
 import { MenuTreeOption } from '@/api/system/menu/types';
 import to from 'await-to-js';
@@ -158,12 +158,6 @@ const data = reactive<PageData<TenantPkgForm, TenantPkgQuery>>({
 
 const { queryParams, form, rules } = toRefs(data);
 
-/** 查询菜单树结构 */
-const getMenuTreeselect = async () => {
-  const { data } = await menuTreeselect();
-  menuOptions.value = data;
-};
-
 // 所有菜单节点数据
 const getMenuAllCheckedKeys = (): any => {
   // 目前被选中的菜单节点
@@ -265,9 +259,9 @@ const handleCheckedTreeConnect = (value: CheckboxValueType, type: string) => {
 };
 
 /** 新增按钮操作 */
-const handleAdd = () => {
+const handleAdd = async () => {
   reset();
-  getMenuTreeselect();
+  await getPackageMenuTreeselect(0);
   dialog.visible = true;
   dialog.title = '添加租户套餐';
 };

+ 3 - 0
src/views/workflow/processInstance/index.vue

@@ -405,6 +405,9 @@ const openUserSelect = () => {
 //确认选择申请人
 const userSelectCallBack = (data: UserVO[]) => {
   userSelectCount.value = 0;
+  selectUserIds.value = [];
+  queryParams.value.createByIds = [];
+
   if (data && data.length > 0) {
     userSelectCount.value = data.length;
     selectUserIds.value = data.map((item) => item.userId);

+ 3 - 0
src/views/workflow/task/allTaskWaiting.vue

@@ -242,6 +242,9 @@ const openUserSelect = () => {
 //确认选择申请人
 const userSelectCallBack = (data: UserVO[]) => {
   userSelectCount.value = 0;
+  selectUserIds.value = [];
+  queryParams.value.createByIds = [];
+
   if (data && data.length > 0) {
     userSelectCount.value = data.length;
     selectUserIds.value = data.map((item) => item.userId);

+ 3 - 0
src/views/workflow/task/taskFinish.vue

@@ -169,6 +169,9 @@ const openUserSelect = () => {
 //确认选择申请人
 const userSelectCallBack = (data: UserVO[]) => {
   userSelectCount.value = 0;
+  selectUserIds.value = [];
+  queryParams.value.createByIds = [];
+
   if (data && data.length > 0) {
     userSelectCount.value = data.length;
     selectUserIds.value = data.map((item) => item.userId);

+ 3 - 0
src/views/workflow/task/taskWaiting.vue

@@ -171,6 +171,9 @@ const openUserSelect = () => {
 //确认选择申请人
 const userSelectCallBack = (data: UserVO[]) => {
   userSelectCount.value = 0;
+  selectUserIds.value = [];
+  queryParams.value.createByIds = [];
+
   if (data && data.length > 0) {
     userSelectCount.value = data.length;
     selectUserIds.value = data.map((item) => item.userId);