!222 发布 5.4.1-2.4.1 小步迭代修复问题

Merge pull request !222 from 疯狂的狮子Li/dev
This commit is contained in:
疯狂的狮子Li
2025-07-01 01:13:49 +00:00
committed by Gitee
12 changed files with 78 additions and 48 deletions

View File

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

View File

@ -21,7 +21,7 @@ const iframeUrl = ref('');
const baseUrl = import.meta.env.VITE_APP_BASE_API; const baseUrl = import.meta.env.VITE_APP_BASE_API;
onMounted(async () => { 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; iframeUrl.value = url + '&Authorization=Bearer ' + getToken() + '&clientid=' + import.meta.env.VITE_APP_CLIENT_ID;
}); });
</script> </script>

View File

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

View File

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

View File

@ -4,15 +4,6 @@
<div v-show="showSearch" class="mb-[10px]"> <div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover"> <el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true"> <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-form-item label="key键" prop="testKey">
<el-input v-model="queryParams.testKey" placeholder="请输入key键" clearable @keyup.enter="handleQuery" /> <el-input v-model="queryParams.testKey" placeholder="请输入key键" clearable @keyup.enter="handleQuery" />
</el-form-item> </el-form-item>

View File

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

View File

@ -27,9 +27,6 @@
<el-col :span="1.5"> <el-col :span="1.5">
<el-button v-hasPermi="['system:menu:add']" type="primary" plain icon="Plus" @click="handleAdd()">新增 </el-button> <el-button v-hasPermi="['system:menu:add']" type="primary" plain icon="Plus" @click="handleAdd()">新增 </el-button>
</el-col> </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-col :span="1.5">
<el-button type="danger" plain icon="Delete" @click="handleCascadeDelete" :loading="deleteLoading">级联删除</el-button> <el-button type="danger" plain icon="Delete" @click="handleCascadeDelete" :loading="deleteLoading">级联删除</el-button>
</el-col> </el-col>
@ -44,7 +41,9 @@
row-key="menuId" row-key="menuId"
border border
:tree-props="{ children: 'children', hasChildren: 'hasChildren' }" :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="menuName" label="菜单名称" :show-overflow-tooltip="true" width="160"></el-table-column>
<el-table-column prop="icon" label="图标" align="center" width="100"> <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 { sys_show_hide, sys_normal_disable } = toRefs<any>(proxy?.useDict('sys_show_hide', 'sys_normal_disable'));
const menuList = ref<MenuVO[]>([]); const menuList = ref<MenuVO[]>([]);
const menuChildrenListMap = ref({});
const menuExpandMap = ref({});
const loading = ref(true); const loading = ref(true);
const showSearch = ref(true); const showSearch = ref(true);
const menuOptions = ref<MenuOptionsType[]>([]); const menuOptions = ref<MenuOptionsType[]>([]);
const isExpandAll = ref(false);
const dialog = reactive<DialogOption>({ const dialog = reactive<DialogOption>({
visible: false, visible: false,
@ -340,14 +340,62 @@ const data = reactive<PageData<MenuForm, MenuQuery>>({
const menuTableRef = ref<ElTableInstance>(); const menuTableRef = ref<ElTableInstance>();
const { queryParams, form, rules } = toRefs<PageData<MenuForm, MenuQuery>>(data); 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 () => { const getList = async () => {
loading.value = true; loading.value = true;
const res = await listMenu(queryParams.value); const res = await listMenu(queryParams.value);
const data = proxy?.handleTree<MenuVO>(res.data, 'menuId');
if (data) { const tempMap = {};
menuList.value = data; // 存储 父菜单:子菜单列表
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; loading.value = false;
}; };
/** 查询菜单下拉树结构 */ /** 查询菜单下拉树结构 */
@ -386,18 +434,6 @@ const handleAdd = (row?: MenuVO) => {
dialog.visible = true; dialog.visible = true;
dialog.title = '添加菜单'; 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) => { const handleUpdate = async (row: MenuVO) => {
reset(); reset();

View File

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

View File

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

View File

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

View File

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

View File

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