@ -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",
|
||||||
|
@ -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>
|
||||||
|
@ -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) => {
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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">¥免费开源</el-tag>
|
<el-tag type="danger">¥免费开源</el-tag>
|
||||||
</p>
|
</p>
|
||||||
@ -77,7 +77,7 @@
|
|||||||
* 分布式监控 Prometheus、Grafana 全方位性能监控<br />
|
* 分布式监控 Prometheus、Grafana 全方位性能监控<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">¥免费开源</el-tag>
|
<el-tag type="danger">¥免费开源</el-tag>
|
||||||
</p>
|
</p>
|
||||||
|
@ -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();
|
||||||
|
@ -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 = '添加租户套餐';
|
||||||
};
|
};
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
Reference in New Issue
Block a user