- 新增产品管理相关路由和页面(dashboard、list、requirement、setting) - 实现产品基础信息编辑弹窗组件(base-info-dialog.vue) - 添加运行时字典功能(dict-select、dict-text、dict-tag组件) - 集成字典管理store和API调用 - 规范ID类型定义为string避免精度丢失问题 - 完善国际化资源文件支持中英文对照 - 新增对象上下文业务域入口页导航实现说明 - 添加Vue DevTools浮动入口注释说明 - 统一权限控制支持全局和对象作用域区分 - 规范分页查询参数类型定义与使用方式
122 lines
2.8 KiB
TypeScript
122 lines
2.8 KiB
TypeScript
import { useRouter } from 'vue-router';
|
|
import type { RouteLocationRaw } from 'vue-router';
|
|
import type { RouteKey } from '@elegant-router/types';
|
|
import { getGlobalRouter } from '@/router/instance';
|
|
|
|
/**
|
|
* Router push
|
|
*
|
|
* Jump to the specified route, it can replace function router.push
|
|
*
|
|
* @param inSetup Whether is in vue script setup
|
|
*/
|
|
export function useRouterPush(inSetup = true) {
|
|
const globalRouter = getGlobalRouter();
|
|
const router = inSetup ? useRouter() : globalRouter;
|
|
const route = globalRouter.currentRoute;
|
|
|
|
const routerPush = router.push;
|
|
|
|
const routerBack = router.back;
|
|
|
|
interface RouterPushOptions {
|
|
query?: Record<string, string>;
|
|
params?: Record<string, string>;
|
|
}
|
|
|
|
async function routerPushByKey(key: RouteKey, options?: RouterPushOptions) {
|
|
const { query, params } = options || {};
|
|
|
|
const routeLocation: RouteLocationRaw = {
|
|
name: key
|
|
};
|
|
|
|
if (Object.keys(query || {}).length) {
|
|
routeLocation.query = query;
|
|
}
|
|
|
|
if (Object.keys(params || {}).length) {
|
|
routeLocation.params = params;
|
|
}
|
|
|
|
return routerPush(routeLocation);
|
|
}
|
|
|
|
function routerPushByKeyWithMetaQuery(key: RouteKey) {
|
|
const allRoutes = router.getRoutes();
|
|
const meta = allRoutes.find(item => item.name === key)?.meta || null;
|
|
|
|
const query: Record<string, string> = {};
|
|
|
|
meta?.query?.forEach(item => {
|
|
query[item.key] = item.value;
|
|
});
|
|
|
|
return routerPushByKey(key, { query });
|
|
}
|
|
|
|
async function toHome() {
|
|
return routerPushByKey('root');
|
|
}
|
|
|
|
/**
|
|
* Navigate to login page
|
|
*
|
|
* @param loginModule The login module
|
|
* @param redirectUrl The redirect url, if not specified, it will be the current route fullPath
|
|
*/
|
|
async function toLogin(loginModule?: UnionKey.LoginModule, redirectUrl?: string) {
|
|
const module = loginModule || 'pwd-login';
|
|
|
|
const options: RouterPushOptions = {
|
|
params: {
|
|
module
|
|
}
|
|
};
|
|
|
|
const redirect = redirectUrl || route.value.fullPath;
|
|
|
|
options.query = {
|
|
redirect
|
|
};
|
|
|
|
return routerPushByKey('login', options);
|
|
}
|
|
|
|
/**
|
|
* Toggle login module
|
|
*
|
|
* @param module
|
|
*/
|
|
async function toggleLoginModule(module: UnionKey.LoginModule) {
|
|
const query = route.value.query as Record<string, string>;
|
|
|
|
return routerPushByKey('login', { query, params: { module } });
|
|
}
|
|
|
|
/**
|
|
* Redirect from login
|
|
*
|
|
* @param [needRedirect=true] Whether to redirect after login. Default is `true`
|
|
*/
|
|
async function redirectFromLogin(needRedirect = true) {
|
|
const redirect = route.value.query?.redirect as string;
|
|
|
|
if (needRedirect && redirect) {
|
|
await routerPush(redirect);
|
|
} else {
|
|
await toHome();
|
|
}
|
|
}
|
|
|
|
return {
|
|
routerPush,
|
|
routerBack,
|
|
routerPushByKey,
|
|
routerPushByKeyWithMetaQuery,
|
|
toLogin,
|
|
toggleLoginModule,
|
|
redirectFromLogin
|
|
};
|
|
}
|