Browse Source

perf: 同步完整版分支代码

i18n
xiaoxian521 3 years ago
parent
commit
7bc50662b9
  1. 3
      .env.production
  2. 3
      build/index.ts
  3. 1
      package.json
  4. 49
      pnpm-lock.yaml
  5. 56
      src/layout/components/sidebar/breadCrumb.vue
  6. 87
      src/layout/components/tag/index.vue
  7. 1
      types/global.d.ts
  8. 11
      vite.config.ts

3
.env.production

@ -6,3 +6,6 @@ VITE_ROUTER_HISTORY = "hash"
# 线上环境后端地址 # 线上环境后端地址
VITE_PROXY_DOMAIN_REAL = "" VITE_PROXY_DOMAIN_REAL = ""
# 是否为打包后的文件提供传统浏览器兼容性支持 支持 true 不支持 false
VITE_LEGACY = false

3
build/index.ts

@ -6,7 +6,8 @@ const warpperEnv = (envConf: Recordable): ViteEnv => {
VITE_PUBLIC_PATH: "", VITE_PUBLIC_PATH: "",
VITE_PROXY_DOMAIN: "", VITE_PROXY_DOMAIN: "",
VITE_PROXY_DOMAIN_REAL: "", VITE_PROXY_DOMAIN_REAL: "",
VITE_ROUTER_HISTORY: ""
VITE_ROUTER_HISTORY: "",
VITE_LEGACY: false
}; };
for (const envName of Object.keys(envConf)) { for (const envName of Object.keys(envConf)) {

1
package.json

@ -72,6 +72,7 @@
"@types/qs": "^6.9.7", "@types/qs": "^6.9.7",
"@typescript-eslint/eslint-plugin": "4.31.0", "@typescript-eslint/eslint-plugin": "4.31.0",
"@typescript-eslint/parser": "4.31.0", "@typescript-eslint/parser": "4.31.0",
"@vitejs/plugin-legacy": "^1.6.4",
"@vitejs/plugin-vue": "^1.10.2", "@vitejs/plugin-vue": "^1.10.2",
"@vitejs/plugin-vue-jsx": "^1.3.1", "@vitejs/plugin-vue-jsx": "^1.3.1",
"@vue/eslint-config-prettier": "6.0.0", "@vue/eslint-config-prettier": "6.0.0",

49
pnpm-lock.yaml

@ -15,6 +15,7 @@ specifiers:
"@types/qs": ^6.9.7 "@types/qs": ^6.9.7
"@typescript-eslint/eslint-plugin": 4.31.0 "@typescript-eslint/eslint-plugin": 4.31.0
"@typescript-eslint/parser": 4.31.0 "@typescript-eslint/parser": 4.31.0
"@vitejs/plugin-legacy": ^1.6.4
"@vitejs/plugin-vue": ^1.10.2 "@vitejs/plugin-vue": ^1.10.2
"@vitejs/plugin-vue-jsx": ^1.3.1 "@vitejs/plugin-vue-jsx": ^1.3.1
"@vue/compiler-sfc": ^3.2.24 "@vue/compiler-sfc": ^3.2.24
@ -121,6 +122,7 @@ devDependencies:
"@types/qs": 6.9.7 "@types/qs": 6.9.7
"@typescript-eslint/eslint-plugin": 4.31.0_f4e6dc0776b3600ef484e3c64a523136 "@typescript-eslint/eslint-plugin": 4.31.0_f4e6dc0776b3600ef484e3c64a523136
"@typescript-eslint/parser": 4.31[email protected][email protected] "@typescript-eslint/parser": 4.31[email protected][email protected]
"@vitejs/plugin-legacy": 1.6[email protected]
"@vitejs/plugin-vue": 1.10[email protected] "@vitejs/plugin-vue": 1.10[email protected]
"@vitejs/plugin-vue-jsx": 1.3.1 "@vitejs/plugin-vue-jsx": 1.3.1
"@vue/eslint-config-prettier": 6.0.0_82e4252401b0cc5be86f7c2133946f49 "@vue/eslint-config-prettier": 6.0.0_82e4252401b0cc5be86f7c2133946f49
@ -495,6 +497,14 @@ packages:
- supports-color - supports-color
dev: true dev: true
/@babel/standalone/7.16.6:
resolution:
{
integrity: sha512-wjildVe951w1IPEPN4G76j+y5JFZfJN9gdyP8o9zd61qbiVEecAgORKskK1D/7VrJZrZS+nxDbhj2akEFU2RJw==
}
engines: { node: ">=6.9.0" }
dev: true
/@babel/template/7.16.0: /@babel/template/7.16.0:
resolution: resolution:
{ {
@ -1257,6 +1267,23 @@ packages:
eslint-visitor-keys: 2.1.0 eslint-visitor-keys: 2.1.0
dev: true dev: true
/@vitejs/plugin-legacy/[email protected]:
resolution:
{
integrity: sha512-geH2F3hTRN++E4n9NZ0JFumxIWUKqW4FA9PAgM7Q6RvUOUUYW4tlURhEmCBYfZSN24H/yX3mEolX+wFVErsAYQ==
}
engines: { node: ">=12.0.0" }
peerDependencies:
vite: ^2.0.0
dependencies:
"@babel/standalone": 7.16.6
core-js: 3.20.0
magic-string: 0.25.7
regenerator-runtime: 0.13.9
systemjs: 6.11.0
vite: 2.6[email protected]
dev: true
/@vitejs/plugin-vue-jsx/1.3.1: /@vitejs/plugin-vue-jsx/1.3.1:
resolution: resolution:
{ {
@ -2305,6 +2332,14 @@ packages:
safe-buffer: 5.1.2 safe-buffer: 5.1.2
dev: true dev: true
/core-js/3.20.0:
resolution:
{
integrity: sha512-KjbKU7UEfg4YPpskMtMXPhUKn7m/1OdTHTVjy09ScR2LVaoUXe8Jh0UdvN2EKUR6iKTJph52SJP95mAB0MnVLQ==
}
requiresBuild: true
dev: true
/cosmiconfig/7.0.1: /cosmiconfig/7.0.1:
resolution: resolution:
{ {
@ -5297,6 +5332,13 @@ packages:
strip-indent: 3.0.0 strip-indent: 3.0.0
dev: true dev: true
/regenerator-runtime/0.13.9:
resolution:
{
integrity: sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==
}
dev: true
/regexpp/3.2.0: /regexpp/3.2.0:
resolution: resolution:
{ {
@ -6009,6 +6051,13 @@ packages:
stable: 0.1.8 stable: 0.1.8
dev: true dev: true
/systemjs/6.11.0:
resolution:
{
integrity: sha512-7YPIY44j+BoY+E6cGBSw0oCU8SNTTIHKZgftcBdwWkDzs/M86Fdlr21FrzAyph7Zo8r3CFGscyFe4rrBtixrBg==
}
dev: true
/table/6.7.2: /table/6.7.2:
resolution: resolution:
{ {

56
src/layout/components/sidebar/breadCrumb.vue

@ -1,11 +1,16 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, watch } from "vue"; import { ref, watch } from "vue";
import { useRoute, useRouter, RouteLocationMatched } from "vue-router";
import { isEqual } from "lodash-es";
import { transformI18n } from "/@/plugins/i18n"; import { transformI18n } from "/@/plugins/i18n";
import { getParentPaths, findRouteByPath } from "/@/router/utils";
import { useMultiTagsStoreHook } from "/@/store/modules/multiTags";
import { useRoute, useRouter, RouteLocationMatched } from "vue-router";
const levelList = ref([]);
const route = useRoute(); const route = useRoute();
const levelList = ref([]);
const router = useRouter(); const router = useRouter();
const routes = router.options.routes;
const multiTags = useMultiTagsStoreHook().multiTags;
const isDashboard = (route: RouteLocationMatched): boolean | string => { const isDashboard = (route: RouteLocationMatched): boolean | string => {
const name = route && (route.name as string); const name = route && (route.name as string);
@ -16,7 +21,44 @@ const isDashboard = (route: RouteLocationMatched): boolean | string => {
}; };
const getBreadcrumb = (): void => { const getBreadcrumb = (): void => {
let matched = route.matched.filter(item => item.meta && item.meta.title);
//
let currentRoute;
if (Object.keys(route.query).length > 0) {
multiTags.forEach(item => {
if (isEqual(route.query, item?.query)) {
currentRoute = item;
}
});
} else {
currentRoute = findRouteByPath(router.currentRoute.value.path, multiTags);
}
//
const parentRoutes = getParentPaths(router.currentRoute.value.path, routes);
//
let matched = [];
//
parentRoutes.forEach(path => {
if (path !== "/") {
matched.push(findRouteByPath(path, routes));
}
});
if (router.currentRoute.value.meta?.refreshRedirect) {
matched.unshift(
findRouteByPath(
router.currentRoute.value.meta.refreshRedirect as string,
routes
)
);
} else {
//
matched = matched.filter(item => {
return !item.redirect || (item.redirect && item.children.length !== 1);
});
}
if (currentRoute?.path !== "/welcome") {
matched.push(currentRoute);
}
const first = matched[0]; const first = matched[0];
if (!isDashboard(first)) { if (!isDashboard(first)) {
matched = [ matched = [
@ -27,8 +69,9 @@ const getBreadcrumb = (): void => {
} as unknown as RouteLocationMatched } as unknown as RouteLocationMatched
].concat(matched); ].concat(matched);
} }
levelList.value = matched.filter( levelList.value = matched.filter(
item => item.meta && item.meta.title && item.meta.breadcrumb !== false
item => item?.meta && item?.meta.title !== false
); );
}; };
@ -39,6 +82,11 @@ watch(
() => getBreadcrumb() () => getBreadcrumb()
); );
watch(
() => route.query,
() => getBreadcrumb()
);
const handleLink = (item: RouteLocationMatched): any => { const handleLink = (item: RouteLocationMatched): any => {
const { redirect, path } = item; const { redirect, path } = item;
if (redirect) { if (redirect) {

87
src/layout/components/tag/index.vue

@ -17,8 +17,8 @@ import closeLeft from "/@/assets/svg/close_left.svg";
import closeOther from "/@/assets/svg/close_other.svg"; import closeOther from "/@/assets/svg/close_other.svg";
import closeRight from "/@/assets/svg/close_right.svg"; import closeRight from "/@/assets/svg/close_right.svg";
import { isEqual } from "lodash-es";
import { emitter } from "/@/utils/mitt"; import { emitter } from "/@/utils/mitt";
import { isEqual, isEmpty } from "lodash-es";
import { transformI18n } from "/@/plugins/i18n"; import { transformI18n } from "/@/plugins/i18n";
import { storageLocal } from "/@/utils/storage"; import { storageLocal } from "/@/utils/storage";
import { useRoute, useRouter } from "vue-router"; import { useRoute, useRouter } from "vue-router";
@ -272,9 +272,10 @@ function dynamicRouteTag(value: string, parentPath: string): void {
// //
function onFresh() { function onFresh() {
toggleClass(true, refreshButton, document.querySelector(".rotate")); toggleClass(true, refreshButton, document.querySelector(".rotate"));
const { fullPath } = unref(route);
const { fullPath, query } = unref(route);
router.replace({ router.replace({
path: "/redirect" + fullPath
path: "/redirect" + fullPath,
query: query
}); });
setTimeout(() => { setTimeout(() => {
removeClass(document.querySelector(".rotate"), refreshButton); removeClass(document.querySelector(".rotate"), refreshButton);
@ -367,6 +368,19 @@ function deleteMenu(item, tag?: string) {
function onClickDrop(key, item, selectRoute?: RouteConfigs) { function onClickDrop(key, item, selectRoute?: RouteConfigs) {
if (item && item.disabled) return; if (item && item.disabled) return;
let selectTagRoute;
if (selectRoute) {
selectTagRoute = {
path: selectRoute.path,
meta: selectRoute.meta,
name: selectRoute.name,
query: selectRoute.query
};
} else {
selectTagRoute = { path: route.path, meta: route.meta };
}
// //
switch (key) { switch (key) {
case 0: case 0:
@ -375,49 +389,19 @@ function onClickDrop(key, item, selectRoute?: RouteConfigs) {
break; break;
case 1: case 1:
// //
selectRoute
? deleteMenu({
path: selectRoute.path,
meta: selectRoute.meta,
name: selectRoute.name
})
: deleteMenu({ path: route.path, meta: route.meta });
deleteMenu(selectTagRoute);
break; break;
case 2: case 2:
// //
selectRoute
? deleteMenu(
{
path: selectRoute.path,
meta: selectRoute.meta
},
"left"
)
: deleteMenu({ path: route.path, meta: route.meta }, "left");
deleteMenu(selectTagRoute, "left");
break; break;
case 3: case 3:
// //
selectRoute
? deleteMenu(
{
path: selectRoute.path,
meta: selectRoute.meta
},
"right"
)
: deleteMenu({ path: route.path, meta: route.meta }, "right");
deleteMenu(selectTagRoute, "right");
break; break;
case 4: case 4:
// //
selectRoute
? deleteMenu(
{
path: selectRoute.path,
meta: selectRoute.meta
},
"other"
)
: deleteMenu({ path: route.path, meta: route.meta }, "other");
deleteMenu(selectTagRoute, "other");
break; break;
case 5: case 5:
// //
@ -430,7 +414,7 @@ function onClickDrop(key, item, selectRoute?: RouteConfigs) {
break; break;
} }
setTimeout(() => { setTimeout(() => {
showMenuModel(route.fullPath);
showMenuModel(route.fullPath, route.query);
}); });
} }
@ -456,18 +440,31 @@ function disabledMenus(value: boolean) {
} }
// //
function showMenuModel(currentPath: string, refresh = false) {
function showMenuModel(
currentPath: string,
query: object = {},
refresh = false
) {
let allRoute = multiTags.value; let allRoute = multiTags.value;
let routeLength = multiTags.value.length; let routeLength = multiTags.value.length;
// currentIndex1
let currentIndex = allRoute.findIndex(v => v.path === currentPath);
// currentIndexrouteLength-1
let currentIndex = -1;
if (isEmpty(query)) {
currentIndex = allRoute.findIndex(v => v.path === currentPath);
} else {
currentIndex = allRoute.findIndex(v => isEqual(v.query, query));
}
showMenus(true); showMenus(true);
if (refresh) { if (refresh) {
tagsViews.value[0].show = true; tagsViews.value[0].show = true;
} }
/**
* currentIndex为1时左侧的菜单是首页则不显示关闭左侧标签页
* 如果currentIndex等于routeLength-1右侧没有菜单则不显示关闭右侧标签页
*/
if (currentIndex === 1 && routeLength !== 2) { if (currentIndex === 1 && routeLength !== 2) {
// //
tagsViews.value[2].show = false; tagsViews.value[2].show = false;
@ -506,7 +503,7 @@ function openMenu(tag, e) {
} else if (route.path !== tag.path) { } else if (route.path !== tag.path) {
// //
tagsViews.value[0].show = false; tagsViews.value[0].show = false;
showMenuModel(tag.path);
showMenuModel(tag.path, tag.query);
} else if ( } else if (
// eslint-disable-next-line no-dupe-else-if // eslint-disable-next-line no-dupe-else-if
multiTags.value.length === 2 && multiTags.value.length === 2 &&
@ -517,7 +514,7 @@ function openMenu(tag, e) {
tagsViews.value[4].show = false; tagsViews.value[4].show = false;
} else if (route.path === tag.path) { } else if (route.path === tag.path) {
// //
showMenuModel(tag.path, true);
showMenuModel(tag.path, tag.query, true);
} }
currentSelect.value = tag; currentSelect.value = tag;
@ -545,7 +542,7 @@ function tagOnClick(item) {
path: item?.path, path: item?.path,
query: item?.query query: item?.query
}); });
showMenuModel(item?.path);
showMenuModel(item?.path, item?.query);
} }
// //

1
types/global.d.ts

@ -69,6 +69,7 @@ declare global {
VITE_PROXY_DOMAIN: string; VITE_PROXY_DOMAIN: string;
VITE_PROXY_DOMAIN_REAL: string; VITE_PROXY_DOMAIN_REAL: string;
VITE_ROUTER_HISTORY: string; VITE_ROUTER_HISTORY: string;
VITE_LEGACY: boolean;
} }
declare interface ServerConfigs { declare interface ServerConfigs {

11
vite.config.ts

@ -1,6 +1,7 @@
import { resolve } from "path"; import { resolve } from "path";
import vue from "@vitejs/plugin-vue"; import vue from "@vitejs/plugin-vue";
import svgLoader from "vite-svg-loader"; import svgLoader from "vite-svg-loader";
import legacy from "@vitejs/plugin-legacy";
import vueJsx from "@vitejs/plugin-vue-jsx"; import vueJsx from "@vitejs/plugin-vue-jsx";
import { warpperEnv, regExps } from "./build"; import { warpperEnv, regExps } from "./build";
import { viteMockServe } from "vite-plugin-mock"; import { viteMockServe } from "vite-plugin-mock";
@ -27,6 +28,7 @@ const alias: Record<string, string> = {
export default ({ command, mode }: ConfigEnv): UserConfigExport => { export default ({ command, mode }: ConfigEnv): UserConfigExport => {
const { const {
VITE_PORT, VITE_PORT,
VITE_LEGACY,
VITE_PUBLIC_PATH, VITE_PUBLIC_PATH,
VITE_PROXY_DOMAIN, VITE_PROXY_DOMAIN,
VITE_PROXY_DOMAIN_REAL VITE_PROXY_DOMAIN_REAL
@ -149,7 +151,14 @@ export default ({ command, mode }: ConfigEnv): UserConfigExport => {
setupProdMockServer(); setupProdMockServer();
`, `,
logger: true logger: true
})
}),
// 是否为打包后的文件提供传统浏览器兼容性支持
VITE_LEGACY
? legacy({
targets: ["ie >= 11"],
additionalLegacyPolyfills: ["regenerator-runtime/runtime"]
})
: null
], ],
optimizeDeps: { optimizeDeps: {
include: [ include: [

Loading…
Cancel
Save