mirror of
https://github.com/pure-admin/vue-pure-admin.git
synced 2025-11-03 13:44:47 +08:00
Compare commits
11 Commits
v6.1.0
...
880963c683
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
880963c683 | ||
|
|
36ec0ebd0d | ||
|
|
339d68ffc5 | ||
|
|
fa606b429b | ||
|
|
5b14db8785 | ||
|
|
0c53e84ee7 | ||
|
|
bf1f5b9f3f | ||
|
|
faf24f300b | ||
|
|
915e01c15c | ||
|
|
c821f32ae9 | ||
|
|
acf15af930 |
1
.vscode/settings.json
vendored
1
.vscode/settings.json
vendored
@@ -1,4 +1,5 @@
|
|||||||
{
|
{
|
||||||
|
"tailwindCSS.experimental.configFile": "src/style/tailwind.css",
|
||||||
"editor.formatOnType": true,
|
"editor.formatOnType": true,
|
||||||
"editor.formatOnSave": true,
|
"editor.formatOnSave": true,
|
||||||
"[vue]": {
|
"[vue]": {
|
||||||
|
|||||||
@@ -80,9 +80,9 @@ menus:
|
|||||||
pureMarkdown: Markdown
|
pureMarkdown: Markdown
|
||||||
pureEditor: Editor
|
pureEditor: Editor
|
||||||
pureAbnormal: Abnormal Page
|
pureAbnormal: Abnormal Page
|
||||||
pureFourZeroFour: "404"
|
purePageNotFound: "404"
|
||||||
pureFourZeroOne: "403"
|
pureAccessDenied: "403"
|
||||||
pureFive: "500"
|
pureServerError: "500"
|
||||||
pureComponents: Components
|
pureComponents: Components
|
||||||
pureDialog: Dialog
|
pureDialog: Dialog
|
||||||
pureDrawer: Drawer
|
pureDrawer: Drawer
|
||||||
|
|||||||
@@ -80,9 +80,9 @@ menus:
|
|||||||
pureMarkdown: Markdown
|
pureMarkdown: Markdown
|
||||||
pureEditor: 编辑器
|
pureEditor: 编辑器
|
||||||
pureAbnormal: 异常页面
|
pureAbnormal: 异常页面
|
||||||
pureFourZeroFour: "404"
|
purePageNotFound: "404"
|
||||||
pureFourZeroOne: "403"
|
pureAccessDenied: "403"
|
||||||
pureFive: "500"
|
pureServerError: "500"
|
||||||
pureComponents: 组件
|
pureComponents: 组件
|
||||||
pureDialog: 函数式弹框
|
pureDialog: 函数式弹框
|
||||||
pureDrawer: 函数式抽屉
|
pureDrawer: 函数式抽屉
|
||||||
|
|||||||
88
package.json
88
package.json
@@ -56,23 +56,23 @@
|
|||||||
"@pureadmin/table": "^3.3.0",
|
"@pureadmin/table": "^3.3.0",
|
||||||
"@pureadmin/utils": "^2.6.2",
|
"@pureadmin/utils": "^2.6.2",
|
||||||
"@vue-flow/background": "^1.3.2",
|
"@vue-flow/background": "^1.3.2",
|
||||||
"@vue-flow/core": "^1.45.0",
|
"@vue-flow/core": "^1.47.0",
|
||||||
"@vueuse/core": "^13.6.0",
|
"@vueuse/core": "^13.9.0",
|
||||||
"@vueuse/motion": "^3.0.3",
|
"@vueuse/motion": "^3.0.3",
|
||||||
"@wangeditor/editor": "^5.1.23",
|
"@wangeditor/editor": "^5.1.23",
|
||||||
"@wangeditor/editor-for-vue": "^5.1.12",
|
"@wangeditor/editor-for-vue": "^5.1.12",
|
||||||
"@zxcvbn-ts/core": "^3.0.4",
|
"@zxcvbn-ts/core": "^3.0.4",
|
||||||
"animate.css": "^4.1.1",
|
"animate.css": "^4.1.1",
|
||||||
"axios": "^1.11.0",
|
"axios": "^1.12.2",
|
||||||
"china-area-data": "^5.0.1",
|
"china-area-data": "^5.0.1",
|
||||||
"codemirror": "^5.65.19",
|
"codemirror": "^5.65.20",
|
||||||
"codemirror-editor-vue3": "^2.8.0",
|
"codemirror-editor-vue3": "^2.8.0",
|
||||||
"cropperjs": "^1.6.2",
|
"cropperjs": "^1.6.2",
|
||||||
"dayjs": "^1.11.13",
|
"dayjs": "^1.11.18",
|
||||||
"deep-chat": "^2.2.2",
|
"deep-chat": "^2.2.2",
|
||||||
"echarts": "^5.6.0",
|
"echarts": "^6.0.0",
|
||||||
"el-table-infinite-scroll": "^3.0.6",
|
"el-table-infinite-scroll": "^3.0.7",
|
||||||
"element-plus": "^2.10.4",
|
"element-plus": "^2.11.4",
|
||||||
"highlight.js": "^11.11.1",
|
"highlight.js": "^11.11.1",
|
||||||
"intro.js": "^7.2.0",
|
"intro.js": "^7.2.0",
|
||||||
"js-cookie": "^3.0.5",
|
"js-cookie": "^3.0.5",
|
||||||
@@ -84,87 +84,87 @@
|
|||||||
"nprogress": "^0.2.0",
|
"nprogress": "^0.2.0",
|
||||||
"path-browserify": "^1.0.1",
|
"path-browserify": "^1.0.1",
|
||||||
"pinia": "^3.0.3",
|
"pinia": "^3.0.3",
|
||||||
"pinyin-pro": "^3.26.0",
|
"pinyin-pro": "^3.27.0",
|
||||||
"plus-pro-components": "^0.1.26",
|
"plus-pro-components": "^0.1.29",
|
||||||
"qrcode": "^1.5.4",
|
"qrcode": "^1.5.4",
|
||||||
"qs": "^6.14.0",
|
"qs": "^6.14.0",
|
||||||
"responsive-storage": "^2.2.0",
|
"responsive-storage": "^2.2.0",
|
||||||
"sortablejs": "^1.15.6",
|
"sortablejs": "^1.15.6",
|
||||||
"swiper": "^11.2.10",
|
"swiper": "^12.0.2",
|
||||||
"typeit": "^8.8.7",
|
"typeit": "^8.8.7",
|
||||||
"v-contextmenu": "^3.2.0",
|
"v-contextmenu": "^3.2.0",
|
||||||
"v3-infinite-loading": "^1.3.2",
|
"v3-infinite-loading": "^1.3.2",
|
||||||
"vditor": "^3.11.1",
|
"vditor": "^3.11.2",
|
||||||
"version-rocket": "^1.7.4",
|
"version-rocket": "^1.7.4",
|
||||||
"vue": "^3.5.18",
|
"vue": "^3.5.22",
|
||||||
"vue-i18n": "^11.1.11",
|
"vue-i18n": "^11.1.12",
|
||||||
"vue-json-pretty": "^2.5.0",
|
"vue-json-pretty": "^2.5.0",
|
||||||
"vue-pdf-embed": "^2.1.3",
|
"vue-pdf-embed": "^2.1.3",
|
||||||
"vue-router": "^4.5.1",
|
"vue-router": "^4.5.1",
|
||||||
"vue-tippy": "^6.7.1",
|
"vue-tippy": "^6.7.1",
|
||||||
"vue-types": "^6.0.0",
|
"vue-types": "^6.0.0",
|
||||||
"vue-virtual-scroller": "2.0.0-beta.8",
|
"vue-virtual-scroller": "2.0.0-beta.8",
|
||||||
"vue-waterfall-plugin-next": "^2.6.7",
|
"vue-waterfall-plugin-next": "^2.6.9",
|
||||||
"vue3-danmaku": "^1.6.6",
|
"vue3-danmaku": "^1.6.6",
|
||||||
"vue3-puzzle-vcode": "^1.1.7",
|
"vue3-puzzle-vcode": "^1.1.7",
|
||||||
"vuedraggable": "^4.1.0",
|
"vuedraggable": "^4.1.0",
|
||||||
"vxe-table": "4.6.25",
|
"vxe-table": "4.6.25",
|
||||||
"wavesurfer.js": "^7.10.1",
|
"wavesurfer.js": "^7.11.0",
|
||||||
"xgplayer": "^3.0.22",
|
"xgplayer": "^3.0.23",
|
||||||
"xlsx": "^0.18.5"
|
"xlsx": "^0.18.5"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@commitlint/cli": "^19.8.1",
|
"@commitlint/cli": "^20.1.0",
|
||||||
"@commitlint/config-conventional": "^19.8.1",
|
"@commitlint/config-conventional": "^20.0.0",
|
||||||
"@commitlint/types": "^19.8.1",
|
"@commitlint/types": "^20.0.0",
|
||||||
"@eslint/js": "^9.32.0",
|
"@eslint/js": "^9.37.0",
|
||||||
"@faker-js/faker": "^9.9.0",
|
"@faker-js/faker": "^10.0.0",
|
||||||
"@iconify/json": "^2.2.364",
|
"@iconify/json": "^2.2.393",
|
||||||
"@iconify/vue": "4.2.0",
|
"@iconify/vue": "4.2.0",
|
||||||
"@intlify/unplugin-vue-i18n": "^6.0.8",
|
"@intlify/unplugin-vue-i18n": "^11.0.1",
|
||||||
"@tailwindcss/vite": "^4.1.11",
|
"@tailwindcss/vite": "^4.1.14",
|
||||||
"@types/codemirror": "^5.60.16",
|
"@types/codemirror": "^5.60.16",
|
||||||
"@types/dagre": "^0.7.53",
|
"@types/dagre": "^0.7.53",
|
||||||
"@types/intro.js": "^5.1.5",
|
"@types/intro.js": "^5.1.5",
|
||||||
"@types/js-cookie": "^3.0.6",
|
"@types/js-cookie": "^3.0.6",
|
||||||
"@types/node": "^20.19.9",
|
"@types/node": "^20.19.19",
|
||||||
"@types/nprogress": "^0.2.3",
|
"@types/nprogress": "^0.2.3",
|
||||||
"@types/path-browserify": "^1.0.3",
|
"@types/path-browserify": "^1.0.3",
|
||||||
"@types/qrcode": "^1.5.5",
|
"@types/qrcode": "^1.5.5",
|
||||||
"@types/qs": "^6.14.0",
|
"@types/qs": "^6.14.0",
|
||||||
"@types/sortablejs": "^1.15.8",
|
"@types/sortablejs": "^1.15.8",
|
||||||
"@vitejs/plugin-vue": "^6.0.1",
|
"@vitejs/plugin-vue": "^6.0.1",
|
||||||
"@vitejs/plugin-vue-jsx": "^5.0.1",
|
"@vitejs/plugin-vue-jsx": "^5.1.1",
|
||||||
"boxen": "^8.0.1",
|
"boxen": "^8.0.1",
|
||||||
"code-inspector-plugin": "^1.0.3",
|
"code-inspector-plugin": "^1.2.10",
|
||||||
"cssnano": "^7.1.0",
|
"cssnano": "^7.1.1",
|
||||||
"dagre": "^0.8.5",
|
"dagre": "^0.8.5",
|
||||||
"eslint": "^9.32.0",
|
"eslint": "^9.37.0",
|
||||||
"eslint-config-prettier": "^10.1.8",
|
"eslint-config-prettier": "^10.1.8",
|
||||||
"eslint-plugin-prettier": "^5.5.3",
|
"eslint-plugin-prettier": "^5.5.4",
|
||||||
"eslint-plugin-vue": "^10.3.0",
|
"eslint-plugin-vue": "^10.5.0",
|
||||||
"gradient-string": "^3.0.0",
|
"gradient-string": "^3.0.0",
|
||||||
"husky": "^9.1.7",
|
"husky": "^9.1.7",
|
||||||
"lint-staged": "^16.1.2",
|
"lint-staged": "^16.2.3",
|
||||||
"postcss": "^8.5.6",
|
"postcss": "^8.5.6",
|
||||||
"postcss-html": "^1.8.0",
|
"postcss-html": "^1.8.0",
|
||||||
"postcss-load-config": "^6.0.1",
|
"postcss-load-config": "^6.0.1",
|
||||||
"postcss-scss": "^4.0.9",
|
"postcss-scss": "^4.0.9",
|
||||||
"prettier": "^3.6.2",
|
"prettier": "^3.6.2",
|
||||||
"rimraf": "^6.0.1",
|
"rimraf": "^6.0.1",
|
||||||
"rollup-plugin-visualizer": "^6.0.3",
|
"rollup-plugin-visualizer": "^6.0.4",
|
||||||
"sass": "^1.89.2",
|
"sass": "^1.93.2",
|
||||||
"stylelint": "^16.23.0",
|
"stylelint": "^16.25.0",
|
||||||
"stylelint-config-recess-order": "^7.1.0",
|
"stylelint-config-recess-order": "^7.3.0",
|
||||||
"stylelint-config-recommended-vue": "^1.6.1",
|
"stylelint-config-recommended-vue": "^1.6.1",
|
||||||
"stylelint-config-standard-scss": "^14.0.0",
|
"stylelint-config-standard-scss": "^14.0.0",
|
||||||
"stylelint-prettier": "^5.0.3",
|
"stylelint-prettier": "^5.0.3",
|
||||||
"svgo": "^4.0.0",
|
"svgo": "^4.0.0",
|
||||||
"tailwindcss": "^4.1.11",
|
"tailwindcss": "^4.1.14",
|
||||||
"typescript": "^5.8.3",
|
"typescript": "^5.9.3",
|
||||||
"typescript-eslint": "^8.38.0",
|
"typescript-eslint": "^8.46.0",
|
||||||
"unplugin-icons": "^22.2.0",
|
"unplugin-icons": "^22.4.2",
|
||||||
"vite": "^7.0.6",
|
"vite": "^7.1.9",
|
||||||
"vite-plugin-cdn-import": "^1.0.1",
|
"vite-plugin-cdn-import": "^1.0.1",
|
||||||
"vite-plugin-compression": "^0.5.1",
|
"vite-plugin-compression": "^0.5.1",
|
||||||
"vite-plugin-fake-server": "^2.2.0",
|
"vite-plugin-fake-server": "^2.2.0",
|
||||||
@@ -172,10 +172,10 @@
|
|||||||
"vite-plugin-router-warn": "^1.0.0",
|
"vite-plugin-router-warn": "^1.0.0",
|
||||||
"vite-svg-loader": "^5.1.0",
|
"vite-svg-loader": "^5.1.0",
|
||||||
"vue-eslint-parser": "^10.2.0",
|
"vue-eslint-parser": "^10.2.0",
|
||||||
"vue-tsc": "^3.0.4"
|
"vue-tsc": "^3.1.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "^20.19.0 || >=22.12.0",
|
"node": "^20.19.0 || >=22.13.0",
|
||||||
"pnpm": ">=9"
|
"pnpm": ">=9"
|
||||||
},
|
},
|
||||||
"pnpm": {
|
"pnpm": {
|
||||||
|
|||||||
3639
pnpm-lock.yaml
generated
3639
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,7 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { $t } from "@/plugins/i18n";
|
import { $t } from "@/plugins/i18n";
|
||||||
import { emitter } from "@/utils/mitt";
|
import { emitter } from "@/utils/mitt";
|
||||||
|
import NProgress from "@/utils/progress";
|
||||||
import { RouteConfigs } from "../../types";
|
import { RouteConfigs } from "../../types";
|
||||||
import { useTags } from "../../hooks/useTag";
|
import { useTags } from "../../hooks/useTag";
|
||||||
import { routerArrays } from "@/layout/types";
|
import { routerArrays } from "@/layout/types";
|
||||||
@@ -206,12 +207,14 @@ function dynamicRouteTag(value: string): void {
|
|||||||
|
|
||||||
/** 刷新路由 */
|
/** 刷新路由 */
|
||||||
function onFresh() {
|
function onFresh() {
|
||||||
|
NProgress.start();
|
||||||
const { fullPath, query } = unref(route);
|
const { fullPath, query } = unref(route);
|
||||||
router.replace({
|
router.replace({
|
||||||
path: "/redirect" + fullPath,
|
path: "/redirect" + fullPath,
|
||||||
query
|
query
|
||||||
});
|
});
|
||||||
handleAliveRoute(route as ToRouteType, "refresh");
|
handleAliveRoute(route as ToRouteType, "refresh");
|
||||||
|
NProgress.done();
|
||||||
}
|
}
|
||||||
|
|
||||||
function deleteDynamicTag(obj: any, current: any, tag?: string) {
|
function deleteDynamicTag(obj: any, current: any, tag?: string) {
|
||||||
|
|||||||
@@ -19,13 +19,22 @@ const loading = ref(true);
|
|||||||
const currentRoute = useRoute();
|
const currentRoute = useRoute();
|
||||||
const frameSrc = ref<string>("");
|
const frameSrc = ref<string>("");
|
||||||
const frameRef = ref<HTMLElement | null>(null);
|
const frameRef = ref<HTMLElement | null>(null);
|
||||||
|
const fallbackTimer = ref<number | null>(null);
|
||||||
|
|
||||||
if (unref(currentRoute.meta)?.frameSrc) {
|
if (unref(currentRoute.meta)?.frameSrc) {
|
||||||
frameSrc.value = unref(currentRoute.meta)?.frameSrc as string;
|
frameSrc.value = unref(currentRoute.meta)?.frameSrc as string;
|
||||||
}
|
}
|
||||||
unref(currentRoute.meta)?.frameLoading === false && hideLoading();
|
|
||||||
|
function clearFallbackTimer() {
|
||||||
|
if (fallbackTimer.value !== null) {
|
||||||
|
clearTimeout(fallbackTimer.value);
|
||||||
|
fallbackTimer.value = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function hideLoading() {
|
function hideLoading() {
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
|
clearFallbackTimer();
|
||||||
}
|
}
|
||||||
|
|
||||||
function init() {
|
function init() {
|
||||||
@@ -34,32 +43,42 @@ function init() {
|
|||||||
if (!iframe) return;
|
if (!iframe) return;
|
||||||
const _frame = iframe as any;
|
const _frame = iframe as any;
|
||||||
if (_frame.attachEvent) {
|
if (_frame.attachEvent) {
|
||||||
_frame.attachEvent("onload", () => {
|
_frame.attachEvent("onload", hideLoading);
|
||||||
hideLoading();
|
|
||||||
});
|
|
||||||
} else {
|
} else {
|
||||||
iframe.onload = () => {
|
iframe.onload = hideLoading;
|
||||||
hideLoading();
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let isRedirect = false;
|
||||||
|
|
||||||
watch(
|
watch(
|
||||||
() => currentRoute.fullPath,
|
() => currentRoute.fullPath,
|
||||||
path => {
|
path => {
|
||||||
if (
|
if (
|
||||||
currentRoute.name === "Redirect" &&
|
currentRoute.name === "Redirect" &&
|
||||||
path.includes(props.frameInfo?.fullPath)
|
props.frameInfo?.fullPath &&
|
||||||
|
path.includes(props.frameInfo.fullPath)
|
||||||
) {
|
) {
|
||||||
frameSrc.value = path; // redirect时,置换成任意值,待重定向后 重新赋值
|
isRedirect = true;
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
// 重新赋值
|
if (props.frameInfo?.fullPath === path && isRedirect) {
|
||||||
if (props.frameInfo?.fullPath === path) {
|
loading.value = true;
|
||||||
frameSrc.value = props.frameInfo?.frameSrc;
|
clearFallbackTimer();
|
||||||
|
const url = new URL(props.frameInfo.frameSrc, window.location.origin);
|
||||||
|
const joinChar = url.search ? "&" : "?";
|
||||||
|
frameSrc.value = `${props.frameInfo.frameSrc}${joinChar}t=${Date.now()}`;
|
||||||
|
fallbackTimer.value = window.setTimeout(() => {
|
||||||
|
if (loading.value) {
|
||||||
|
hideLoading();
|
||||||
|
}
|
||||||
|
}, 1500);
|
||||||
|
isRedirect = false;
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
{ immediate: true }
|
||||||
);
|
);
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ export const routerArrays: Array<RouteConfigs> =
|
|||||||
? [
|
? [
|
||||||
{
|
{
|
||||||
path: "/welcome",
|
path: "/welcome",
|
||||||
|
name: "Welcome",
|
||||||
meta: {
|
meta: {
|
||||||
title: "menus.pureHome",
|
title: "menus.pureHome",
|
||||||
icon: "ep/home-filled"
|
icon: "ep/home-filled"
|
||||||
|
|||||||
@@ -94,6 +94,14 @@ export const router: Router = createRouter({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/** 记录已经加载的页面路径 */
|
||||||
|
const loadedPaths = new Set<string>();
|
||||||
|
|
||||||
|
/** 重置已加载页面记录 */
|
||||||
|
export function resetLoadedPaths() {
|
||||||
|
loadedPaths.clear();
|
||||||
|
}
|
||||||
|
|
||||||
/** 重置路由 */
|
/** 重置路由 */
|
||||||
export function resetRouter() {
|
export function resetRouter() {
|
||||||
router.clearRoutes();
|
router.clearRoutes();
|
||||||
@@ -104,6 +112,7 @@ export function resetRouter() {
|
|||||||
formatFlatteningRoutes(buildHierarchyTree(ascending(routes.flat(Infinity))))
|
formatFlatteningRoutes(buildHierarchyTree(ascending(routes.flat(Infinity))))
|
||||||
);
|
);
|
||||||
usePermissionStoreHook().clearAllCachePage();
|
usePermissionStoreHook().clearAllCachePage();
|
||||||
|
resetLoadedPaths();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 路由白名单 */
|
/** 路由白名单 */
|
||||||
@@ -112,6 +121,12 @@ const whiteList = ["/login"];
|
|||||||
const { VITE_HIDE_HOME } = import.meta.env;
|
const { VITE_HIDE_HOME } = import.meta.env;
|
||||||
|
|
||||||
router.beforeEach((to: ToRouteType, _from, next) => {
|
router.beforeEach((to: ToRouteType, _from, next) => {
|
||||||
|
to.meta.loaded = loadedPaths.has(to.path);
|
||||||
|
|
||||||
|
if (!to.meta.loaded) {
|
||||||
|
NProgress.start();
|
||||||
|
}
|
||||||
|
|
||||||
if (to.meta?.keepAlive) {
|
if (to.meta?.keepAlive) {
|
||||||
handleAliveRoute(to, "add");
|
handleAliveRoute(to, "add");
|
||||||
// 页面整体刷新和点击标签页刷新
|
// 页面整体刷新和点击标签页刷新
|
||||||
@@ -120,7 +135,6 @@ router.beforeEach((to: ToRouteType, _from, next) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
const userInfo = storageLocal().getItem<DataInfo<number>>(userKey);
|
const userInfo = storageLocal().getItem<DataInfo<number>>(userKey);
|
||||||
NProgress.start();
|
|
||||||
const externalLink = isUrl(to?.name as string);
|
const externalLink = isUrl(to?.name as string);
|
||||||
if (!externalLink) {
|
if (!externalLink) {
|
||||||
to.matched.some(item => {
|
to.matched.some(item => {
|
||||||
@@ -206,7 +220,8 @@ router.beforeEach((to: ToRouteType, _from, next) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
router.afterEach(() => {
|
router.afterEach(to => {
|
||||||
|
loadedPaths.add(to.path);
|
||||||
NProgress.done();
|
NProgress.done();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ export default {
|
|||||||
name: "403",
|
name: "403",
|
||||||
component: () => import("@/views/error/403.vue"),
|
component: () => import("@/views/error/403.vue"),
|
||||||
meta: {
|
meta: {
|
||||||
title: $t("menus.pureFourZeroOne")
|
title: $t("menus.pureAccessDenied")
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -24,7 +24,7 @@ export default {
|
|||||||
name: "404",
|
name: "404",
|
||||||
component: () => import("@/views/error/404.vue"),
|
component: () => import("@/views/error/404.vue"),
|
||||||
meta: {
|
meta: {
|
||||||
title: $t("menus.pureFourZeroFour")
|
title: $t("menus.purePageNotFound")
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -32,7 +32,7 @@ export default {
|
|||||||
name: "500",
|
name: "500",
|
||||||
component: () => import("@/views/error/500.vue"),
|
component: () => import("@/views/error/500.vue"),
|
||||||
meta: {
|
meta: {
|
||||||
title: $t("menus.pureFive")
|
title: $t("menus.pureServerError")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -8,8 +8,27 @@ export default [
|
|||||||
component: () => import("@/views/login/index.vue"),
|
component: () => import("@/views/login/index.vue"),
|
||||||
meta: {
|
meta: {
|
||||||
title: $t("menus.pureLogin"),
|
title: $t("menus.pureLogin"),
|
||||||
showLink: false,
|
showLink: false
|
||||||
rank: 101
|
}
|
||||||
|
},
|
||||||
|
// 全屏403(无权访问)页面
|
||||||
|
{
|
||||||
|
path: "/access-denied",
|
||||||
|
name: "AccessDenied",
|
||||||
|
component: () => import("@/views/error/403.vue"),
|
||||||
|
meta: {
|
||||||
|
title: $t("menus.pureAccessDenied"),
|
||||||
|
showLink: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 全屏500(服务器出错)页面
|
||||||
|
{
|
||||||
|
path: "/server-error",
|
||||||
|
name: "ServerError",
|
||||||
|
component: () => import("@/views/error/500.vue"),
|
||||||
|
meta: {
|
||||||
|
title: $t("menus.pureServerError"),
|
||||||
|
showLink: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -17,8 +36,7 @@ export default [
|
|||||||
component: Layout,
|
component: Layout,
|
||||||
meta: {
|
meta: {
|
||||||
title: $t("status.pureLoad"),
|
title: $t("status.pureLoad"),
|
||||||
showLink: false,
|
showLink: false
|
||||||
rank: 102
|
|
||||||
},
|
},
|
||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
@@ -28,6 +46,15 @@ export default [
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: "/account-settings",
|
||||||
|
name: "AccountSettings",
|
||||||
|
component: () => import("@/views/account-settings/index.vue"),
|
||||||
|
meta: {
|
||||||
|
title: $t("buttons.pureAccountSettings"),
|
||||||
|
showLink: false
|
||||||
|
}
|
||||||
|
},
|
||||||
// 下面是一个无layout菜单的例子(一个全屏空白页面),因为这种情况极少发生,所以只需要在前端配置即可(配置路径:src/router/modules/remaining.ts)
|
// 下面是一个无layout菜单的例子(一个全屏空白页面),因为这种情况极少发生,所以只需要在前端配置即可(配置路径:src/router/modules/remaining.ts)
|
||||||
{
|
{
|
||||||
path: "/empty",
|
path: "/empty",
|
||||||
@@ -35,18 +62,7 @@ export default [
|
|||||||
component: () => import("@/views/empty/index.vue"),
|
component: () => import("@/views/empty/index.vue"),
|
||||||
meta: {
|
meta: {
|
||||||
title: $t("menus.pureEmpty"),
|
title: $t("menus.pureEmpty"),
|
||||||
showLink: false,
|
showLink: false
|
||||||
rank: 103
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: "/account-settings",
|
|
||||||
name: "AccountSettings",
|
|
||||||
component: () => import("@/views/account-settings/index.vue"),
|
|
||||||
meta: {
|
|
||||||
title: $t("buttons.pureAccountSettings"),
|
|
||||||
showLink: false,
|
|
||||||
rank: 104
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
] satisfies Array<RouteConfigsTable>;
|
] satisfies Array<RouteConfigsTable>;
|
||||||
|
|||||||
@@ -139,12 +139,17 @@ function findRouteByPath(path: string, routes: RouteRecordRaw[]) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** 动态路由注册完成后,再添加全屏404(页面不存在)页面,避免刷新动态路由页面时误跳转到404页面 */
|
||||||
function addPathMatch() {
|
function addPathMatch() {
|
||||||
if (!router.hasRoute("pathMatch")) {
|
if (!router.hasRoute("pathMatch")) {
|
||||||
router.addRoute({
|
router.addRoute({
|
||||||
path: "/:pathMatch(.*)",
|
path: "/:pathMatch(.*)*",
|
||||||
name: "pathMatch",
|
name: "PageNotFound",
|
||||||
redirect: "/error/404"
|
component: () => import("@/views/error/404.vue"),
|
||||||
|
meta: {
|
||||||
|
title: "menus.purePageNotFound",
|
||||||
|
showLink: false
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ import type {
|
|||||||
PureHttpRequestConfig
|
PureHttpRequestConfig
|
||||||
} from "./types.d";
|
} from "./types.d";
|
||||||
import { stringify } from "qs";
|
import { stringify } from "qs";
|
||||||
import NProgress from "../progress";
|
|
||||||
import { getToken, formatToken } from "@/utils/auth";
|
import { getToken, formatToken } from "@/utils/auth";
|
||||||
import { useUserStoreHook } from "@/store/modules/user";
|
import { useUserStoreHook } from "@/store/modules/user";
|
||||||
|
|
||||||
@@ -61,8 +60,6 @@ class PureHttp {
|
|||||||
private httpInterceptorsRequest(): void {
|
private httpInterceptorsRequest(): void {
|
||||||
PureHttp.axiosInstance.interceptors.request.use(
|
PureHttp.axiosInstance.interceptors.request.use(
|
||||||
async (config: PureHttpRequestConfig): Promise<any> => {
|
async (config: PureHttpRequestConfig): Promise<any> => {
|
||||||
// 开启进度条动画
|
|
||||||
NProgress.start();
|
|
||||||
// 优先判断post/get等方法是否传入回调,否则执行初始化设置等回调
|
// 优先判断post/get等方法是否传入回调,否则执行初始化设置等回调
|
||||||
if (typeof config.beforeRequestCallback === "function") {
|
if (typeof config.beforeRequestCallback === "function") {
|
||||||
config.beforeRequestCallback(config);
|
config.beforeRequestCallback(config);
|
||||||
@@ -121,8 +118,6 @@ class PureHttp {
|
|||||||
instance.interceptors.response.use(
|
instance.interceptors.response.use(
|
||||||
(response: PureHttpResponse) => {
|
(response: PureHttpResponse) => {
|
||||||
const $config = response.config;
|
const $config = response.config;
|
||||||
// 关闭进度条动画
|
|
||||||
NProgress.done();
|
|
||||||
// 优先判断post/get等方法是否传入回调,否则执行初始化设置等回调
|
// 优先判断post/get等方法是否传入回调,否则执行初始化设置等回调
|
||||||
if (typeof $config.beforeResponseCallback === "function") {
|
if (typeof $config.beforeResponseCallback === "function") {
|
||||||
$config.beforeResponseCallback(response);
|
$config.beforeResponseCallback(response);
|
||||||
@@ -137,8 +132,6 @@ class PureHttp {
|
|||||||
(error: PureHttpError) => {
|
(error: PureHttpError) => {
|
||||||
const $error = error;
|
const $error = error;
|
||||||
$error.isCancelRequest = Axios.isCancel($error);
|
$error.isCancelRequest = Axios.isCancel($error);
|
||||||
// 关闭进度条动画
|
|
||||||
NProgress.done();
|
|
||||||
// 所有的响应异常 区分来源为取消请求/非取消请求
|
// 所有的响应异常 区分来源为取消请求/非取消请求
|
||||||
return Promise.reject($error);
|
return Promise.reject($error);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,9 +10,11 @@ const router = useRouter();
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="flex justify-center items-center h-[640px]">
|
<div
|
||||||
|
class="flex flex-col md:flex-row justify-center items-center min-h-full w-full p-4 md:p-0"
|
||||||
|
>
|
||||||
<noAccess />
|
<noAccess />
|
||||||
<div class="ml-12">
|
<div class="mt-8 md:ml-12 md:mt-0 text-center md:text-left">
|
||||||
<p
|
<p
|
||||||
v-motion
|
v-motion
|
||||||
class="font-medium text-4xl mb-4! dark:text-white"
|
class="font-medium text-4xl mb-4! dark:text-white"
|
||||||
@@ -32,7 +34,7 @@ const router = useRouter();
|
|||||||
</p>
|
</p>
|
||||||
<p
|
<p
|
||||||
v-motion
|
v-motion
|
||||||
class="mb-4! text-gray-500"
|
class="text-xl mb-4! text-gray-500"
|
||||||
:initial="{
|
:initial="{
|
||||||
opacity: 0,
|
opacity: 0,
|
||||||
y: 100
|
y: 100
|
||||||
@@ -50,6 +52,7 @@ const router = useRouter();
|
|||||||
<el-button
|
<el-button
|
||||||
v-motion
|
v-motion
|
||||||
type="primary"
|
type="primary"
|
||||||
|
class="block mx-auto md:inline-block md:mx-0"
|
||||||
:initial="{
|
:initial="{
|
||||||
opacity: 0,
|
opacity: 0,
|
||||||
y: 100
|
y: 100
|
||||||
@@ -68,3 +71,9 @@ const router = useRouter();
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.main-content {
|
||||||
|
margin: 0 !important;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|||||||
@@ -10,9 +10,11 @@ const router = useRouter();
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="flex justify-center items-center h-[640px]">
|
<div
|
||||||
|
class="flex flex-col md:flex-row justify-center items-center min-h-full w-full p-4 md:p-0"
|
||||||
|
>
|
||||||
<noExist />
|
<noExist />
|
||||||
<div class="ml-12">
|
<div class="mt-8 md:ml-12 md:mt-0 text-center md:text-left">
|
||||||
<p
|
<p
|
||||||
v-motion
|
v-motion
|
||||||
class="font-medium text-4xl mb-4! dark:text-white"
|
class="font-medium text-4xl mb-4! dark:text-white"
|
||||||
@@ -32,7 +34,7 @@ const router = useRouter();
|
|||||||
</p>
|
</p>
|
||||||
<p
|
<p
|
||||||
v-motion
|
v-motion
|
||||||
class="mb-4! text-gray-500"
|
class="text-xl mb-4! text-gray-500"
|
||||||
:initial="{
|
:initial="{
|
||||||
opacity: 0,
|
opacity: 0,
|
||||||
y: 100
|
y: 100
|
||||||
@@ -50,6 +52,7 @@ const router = useRouter();
|
|||||||
<el-button
|
<el-button
|
||||||
v-motion
|
v-motion
|
||||||
type="primary"
|
type="primary"
|
||||||
|
class="block mx-auto md:inline-block md:mx-0"
|
||||||
:initial="{
|
:initial="{
|
||||||
opacity: 0,
|
opacity: 0,
|
||||||
y: 100
|
y: 100
|
||||||
@@ -68,3 +71,9 @@ const router = useRouter();
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.main-content {
|
||||||
|
margin: 0 !important;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|||||||
@@ -10,9 +10,11 @@ const router = useRouter();
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="flex justify-center items-center h-[640px]">
|
<div
|
||||||
|
class="flex flex-col md:flex-row justify-center items-center min-h-full w-full p-4 md:p-0"
|
||||||
|
>
|
||||||
<noServer />
|
<noServer />
|
||||||
<div class="ml-12">
|
<div class="mt-8 md:ml-12 md:mt-0 text-center md:text-left">
|
||||||
<p
|
<p
|
||||||
v-motion
|
v-motion
|
||||||
class="font-medium text-4xl mb-4! dark:text-white"
|
class="font-medium text-4xl mb-4! dark:text-white"
|
||||||
@@ -32,7 +34,7 @@ const router = useRouter();
|
|||||||
</p>
|
</p>
|
||||||
<p
|
<p
|
||||||
v-motion
|
v-motion
|
||||||
class="mb-4! text-gray-500"
|
class="text-xl mb-4! text-gray-500"
|
||||||
:initial="{
|
:initial="{
|
||||||
opacity: 0,
|
opacity: 0,
|
||||||
y: 100
|
y: 100
|
||||||
@@ -50,6 +52,7 @@ const router = useRouter();
|
|||||||
<el-button
|
<el-button
|
||||||
v-motion
|
v-motion
|
||||||
type="primary"
|
type="primary"
|
||||||
|
class="block mx-auto md:inline-block md:mx-0"
|
||||||
:initial="{
|
:initial="{
|
||||||
opacity: 0,
|
opacity: 0,
|
||||||
y: 100
|
y: 100
|
||||||
@@ -68,3 +71,9 @@ const router = useRouter();
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.main-content {
|
||||||
|
margin: 0 !important;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ onMounted(() => {
|
|||||||
<span class="font-medium">
|
<span class="font-medium">
|
||||||
流程图组件,采用开源的
|
流程图组件,采用开源的
|
||||||
<el-link
|
<el-link
|
||||||
href="https://site.logic-flow.cn/docs/#/zh/guide/start"
|
href="https://site.logic-flow.cn/tutorial/get-started"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
style="margin: 0 4px 5px; font-size: 16px"
|
style="margin: 0 4px 5px; font-size: 16px"
|
||||||
>
|
>
|
||||||
|
|||||||
2
types/router.d.ts
vendored
2
types/router.d.ts
vendored
@@ -56,6 +56,8 @@ declare global {
|
|||||||
* 而通过设置`activePath`指定激活菜单即可获得高亮,`activePath`为指定激活菜单的`path`)
|
* 而通过设置`activePath`指定激活菜单即可获得高亮,`activePath`为指定激活菜单的`path`)
|
||||||
*/
|
*/
|
||||||
activePath?: string;
|
activePath?: string;
|
||||||
|
/** 当前页面是否已经加载过 */
|
||||||
|
loaded?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user