Commit 2f268ca8f43d98687ffd809e2c1d140d29033bd6

Authored by 陈文彬
1 parent 351f60a8

fix: fix form,transition,build bug

Too many changes to show.

To preserve performance only 19 of 20 files are displayed.

src/App.vue
@@ -30,7 +30,6 @@ @@ -30,7 +30,6 @@
30 createBreakpointListen(); 30 createBreakpointListen();
31 const { renderEmpty, transformCellText } = useConfigProvider(); 31 const { renderEmpty, transformCellText } = useConfigProvider();
32 const { on: lockOn } = useLockPage(); 32 const { on: lockOn } = useLockPage();
33 -  
34 return { 33 return {
35 renderEmpty, 34 renderEmpty,
36 transformCellText, 35 transformCellText,
src/components/Form/src/BasicForm.vue
@@ -48,7 +48,7 @@ @@ -48,7 +48,7 @@
48 import { isArray, isBoolean, isFunction, isNumber, isObject, isString } from '/@/utils/is'; 48 import { isArray, isBoolean, isFunction, isNumber, isObject, isString } from '/@/utils/is';
49 import { cloneDeep } from 'lodash-es'; 49 import { cloneDeep } from 'lodash-es';
50 import { useBreakpoint } from '/@/hooks/event/useBreakpoint'; 50 import { useBreakpoint } from '/@/hooks/event/useBreakpoint';
51 - import { useThrottle } from '/@/hooks/core/useThrottle'; 51 + // import { useThrottle } from '/@/hooks/core/useThrottle';
52 import { useFormValues } from './hooks/useFormValues'; 52 import { useFormValues } from './hooks/useFormValues';
53 import type { ColEx } from './types'; 53 import type { ColEx } from './types';
54 import { NamePath } from 'ant-design-vue/types/form/form-item'; 54 import { NamePath } from 'ant-design-vue/types/form/form-item';
@@ -163,13 +163,13 @@ @@ -163,13 +163,13 @@
163 }); 163 });
164 164
165 const { realWidthRef, screenEnum, screenRef } = useBreakpoint(); 165 const { realWidthRef, screenEnum, screenRef } = useBreakpoint();
166 - const [throttleUpdateAdvanced] = useThrottle(updateAdvanced, 30, { immediate: true }); 166 + // const [throttleUpdateAdvanced] = useThrottle(updateAdvanced, 30, { immediate: true });
167 watch( 167 watch(
168 [() => unref(getSchema), () => advanceState.isAdvanced, () => unref(realWidthRef)], 168 [() => unref(getSchema), () => advanceState.isAdvanced, () => unref(realWidthRef)],
169 () => { 169 () => {
170 const { showAdvancedButton } = unref(getProps); 170 const { showAdvancedButton } = unref(getProps);
171 if (showAdvancedButton) { 171 if (showAdvancedButton) {
172 - throttleUpdateAdvanced(); 172 + updateAdvanced();
173 } 173 }
174 }, 174 },
175 { immediate: true } 175 { immediate: true }
src/components/Form/src/FormItem.tsx
@@ -189,14 +189,13 @@ export default defineComponent({ @@ -189,14 +189,13 @@ export default defineComponent({
189 const bindValue = { 189 const bindValue = {
190 [isCheck ? 'checked' : 'value']: (props.formModel as any)[field], 190 [isCheck ? 'checked' : 'value']: (props.formModel as any)[field],
191 }; 191 };
  192 + if (!renderComponentContent) {
  193 + return <Comp {...propsData} {...on} {...bindValue} />;
  194 + }
192 return ( 195 return (
193 <Comp {...propsData} {...on} {...bindValue}> 196 <Comp {...propsData} {...on} {...bindValue}>
194 {{ 197 {{
195 - ...(renderComponentContent  
196 - ? renderComponentContent(unref(getValuesRef))  
197 - : {  
198 - default: () => '',  
199 - }), 198 + ...renderComponentContent(unref(getValuesRef)),
200 }} 199 }}
201 </Comp> 200 </Comp>
202 ); 201 );
src/components/Tree/src/BasicTree.tsx
@@ -161,6 +161,7 @@ export default defineComponent({ @@ -161,6 +161,7 @@ export default defineComponent({
161 const treeData: any = cloneDeep(unref(treeDataRef)); 161 const treeData: any = cloneDeep(unref(treeDataRef));
162 if (!parentKey) { 162 if (!parentKey) {
163 treeData[push](node); 163 treeData[push](node);
  164 + treeDataRef.value = treeData;
164 return; 165 return;
165 } 166 }
166 const { key: keyField, children: childrenField } = unref(getReplaceFields); 167 const { key: keyField, children: childrenField } = unref(getReplaceFields);
src/enums/eventBusEnum.ts 0 → 100644
  1 +export const MENU_DRAG_STATE = 'MENU_DRAG_STATE';
src/hooks/event/useEventHub.ts 0 → 100644
  1 +import { tryOnUnmounted } from '/@/utils/helper/vueHelper';
  2 +import {} from 'vue';
  3 +import EventHub from '/@/utils/eventHub';
  4 +const eventHub = new EventHub();
  5 +export function useEventHub(): EventHub {
  6 + tryOnUnmounted(() => {
  7 + eventHub.clear();
  8 + });
  9 +
  10 + return eventHub;
  11 +}
src/layouts/default/LayoutBreadcrumb.tsx
@@ -65,7 +65,7 @@ export default defineComponent({ @@ -65,7 +65,7 @@ export default defineComponent({
65 65
66 return () => ( 66 return () => (
67 <> 67 <>
68 - <Breadcrumb class="layout-breadcrumb"> 68 + <Breadcrumb class="layout-breadcrumb flex-grow">
69 {() => ( 69 {() => (
70 <> 70 <>
71 <TransitionGroup name="breadcrumb"> 71 <TransitionGroup name="breadcrumb">
src/layouts/default/LayoutHeader.tsx
@@ -68,7 +68,7 @@ export default defineComponent({ @@ -68,7 +68,7 @@ export default defineComponent({
68 {showLogo && !isSidebarType && <Logo class={`layout-header__logo`} />} 68 {showLogo && !isSidebarType && <Logo class={`layout-header__logo`} />}
69 69
70 {mode !== MenuModeEnum.HORIZONTAL && showBreadCrumb && !splitMenu && ( 70 {mode !== MenuModeEnum.HORIZONTAL && showBreadCrumb && !splitMenu && (
71 - <LayoutBreadcrumb class="flex-grow " /> 71 + <LayoutBreadcrumb />
72 )} 72 )}
73 {(mode === MenuModeEnum.HORIZONTAL || splitMenu) && ( 73 {(mode === MenuModeEnum.HORIZONTAL || splitMenu) && (
74 <div class={[`layout-header__menu flex-grow `, `justify-${topMenuAlign}`]}> 74 <div class={[`layout-header__menu flex-grow `, `justify-${topMenuAlign}`]}>
src/router/guard/pageLoadingGuard.ts
@@ -28,12 +28,15 @@ export function createPageLoadingGuard(router: Router) { @@ -28,12 +28,15 @@ export function createPageLoadingGuard(router: Router) {
28 } 28 }
29 return true; 29 return true;
30 }); 30 });
31 - router.afterEach(async () => { 31 + router.afterEach(async (to) => {
32 const { openRouterTransition, openPageLoading } = appStore.getProjectConfig; 32 const { openRouterTransition, openPageLoading } = appStore.getProjectConfig;
33 - if ((!openRouterTransition && openPageLoading) || isFirstLoad) {  
34 - appStore.commitPageLoadingState(false); 33 + if ((!openRouterTransition && openPageLoading) || isFirstLoad || to.meta.afterCloseLoading) {
  34 + setTimeout(() => {
  35 + appStore.commitPageLoadingState(false);
  36 + }, 110);
35 isFirstLoad = false; 37 isFirstLoad = false;
36 } 38 }
  39 +
37 return true; 40 return true;
38 }); 41 });
39 } 42 }
src/router/routes/modules/demo/exception.ts
@@ -27,6 +27,7 @@ export default { @@ -27,6 +27,7 @@ export default {
27 }, 27 },
28 meta: { 28 meta: {
29 title: '404', 29 title: '404',
  30 + afterCloseLoading: true,
30 }, 31 },
31 }, 32 },
32 { 33 {
@@ -38,6 +39,7 @@ export default { @@ -38,6 +39,7 @@ export default {
38 }, 39 },
39 meta: { 40 meta: {
40 title: '500', 41 title: '500',
  42 + afterCloseLoading: true,
41 }, 43 },
42 }, 44 },
43 { 45 {
@@ -49,6 +51,7 @@ export default { @@ -49,6 +51,7 @@ export default {
49 }, 51 },
50 meta: { 52 meta: {
51 title: '网络错误', 53 title: '网络错误',
  54 + afterCloseLoading: true,
52 }, 55 },
53 }, 56 },
54 { 57 {
@@ -60,6 +63,7 @@ export default { @@ -60,6 +63,7 @@ export default {
60 }, 63 },
61 meta: { 64 meta: {
62 title: '页面超时', 65 title: '页面超时',
  66 + afterCloseLoading: true,
63 }, 67 },
64 }, 68 },
65 { 69 {
@@ -71,6 +75,7 @@ export default { @@ -71,6 +75,7 @@ export default {
71 }, 75 },
72 meta: { 76 meta: {
73 title: '无数据', 77 title: '无数据',
  78 + afterCloseLoading: true,
74 }, 79 },
75 }, 80 },
76 ], 81 ],
src/router/types.d.ts
@@ -26,6 +26,9 @@ export interface RouteMeta { @@ -26,6 +26,9 @@ export interface RouteMeta {
26 26
27 // disabled redirect 27 // disabled redirect
28 disabledRedirect?: boolean; 28 disabledRedirect?: boolean;
  29 +
  30 + // close loading
  31 + afterCloseLoading?: boolean;
29 } 32 }
30 33
31 export interface AppRouteRecordRaw extends Omit<RouteRecordRaw, 'meta'> { 34 export interface AppRouteRecordRaw extends Omit<RouteRecordRaw, 'meta'> {
src/store/modules/permission.ts
1 -import { REDIRECT_ROUTE } from './../../router/constant'; 1 +import { REDIRECT_ROUTE } from '/@/router/constant';
2 import type { AppRouteRecordRaw, Menu } from '/@/router/types'; 2 import type { AppRouteRecordRaw, Menu } from '/@/router/types';
3 import store from '/@/store/index'; 3 import store from '/@/store/index';
4 import { hotModuleUnregisterModule } from '/@/utils/helper/vuexHelper'; 4 import { hotModuleUnregisterModule } from '/@/utils/helper/vuexHelper';
@@ -19,7 +19,7 @@ import { genRouteModule, transformObjToRoute } from &#39;/@/utils/helper/routeHelper @@ -19,7 +19,7 @@ import { genRouteModule, transformObjToRoute } from &#39;/@/utils/helper/routeHelper
19 import { transformRouteToMenu } from '/@/utils/helper/menuHelper'; 19 import { transformRouteToMenu } from '/@/utils/helper/menuHelper';
20 20
21 import { useMessage } from '/@/hooks/web/useMessage'; 21 import { useMessage } from '/@/hooks/web/useMessage';
22 - 22 +import { warn } from 'vue';
23 const { createMessage } = useMessage(); 23 const { createMessage } = useMessage();
24 const NAME = 'permission'; 24 const NAME = 'permission';
25 hotModuleUnregisterModule(NAME); 25 hotModuleUnregisterModule(NAME);
@@ -107,7 +107,7 @@ class Permission extends VuexModule { @@ -107,7 +107,7 @@ class Permission extends VuexModule {
107 }); 107 });
108 // this.commitRoutesState(routes); 108 // this.commitRoutesState(routes);
109 // Background permissions 109 // Background permissions
110 - console.warn( 110 + warn(
111 `当前权限模式为:${PermissionModeEnum.ROLE},请将src/store/modules/permission.ts内的后台菜单获取函数注释,如果已注释可以忽略此信息!` 111 `当前权限模式为:${PermissionModeEnum.ROLE},请将src/store/modules/permission.ts内的后台菜单获取函数注释,如果已注释可以忽略此信息!`
112 ); 112 );
113 // 如果确定不需要做后台动态权限,请将下面整个判断注释 113 // 如果确定不需要做后台动态权限,请将下面整个判断注释
src/utils/eventHub.ts 0 → 100644
  1 +class EventHub {
  2 + private cache: { [key: string]: Array<(data: any) => void> } = {};
  3 + on(eventName: string, fn: (data: any) => void) {
  4 + this.cache[eventName] = this.cache[eventName] || [];
  5 + this.cache[eventName].push(fn);
  6 + }
  7 +
  8 + once(eventName: string, fn: (data: any) => void) {
  9 + const decor = (...args: any[]) => {
  10 + fn && fn.apply(this, args);
  11 + this.off(eventName, decor);
  12 + };
  13 + this.on(eventName, decor);
  14 + return this;
  15 + }
  16 +
  17 + emit(eventName: string, data?: any) {
  18 + if (this.cache[eventName] === undefined) return;
  19 + console.log('======================');
  20 + console.log(this.cache, eventName);
  21 + console.log('======================');
  22 + this.cache[eventName].forEach((fn) => fn(data));
  23 + }
  24 + off(eventName: string, fn: (data: any) => void) {
  25 + if (this.cache[eventName] === undefined || this.cache[eventName].length === 0) return;
  26 + const i = this.cache[eventName].indexOf(fn);
  27 + if (i === -1) return;
  28 + this.cache[eventName].splice(i, 1);
  29 + }
  30 +
  31 + clear() {
  32 + this.cache = {};
  33 + }
  34 +}
  35 +
  36 +export default EventHub;
src/views/demo/form/RefForm.vue
@@ -58,6 +58,7 @@ @@ -58,6 +58,7 @@
58 <BasicForm 58 <BasicForm
59 :schemas="schemas" 59 :schemas="schemas"
60 ref="formElRef" 60 ref="formElRef"
  61 + :labelWidth="100"
61 @submit="handleSubmit" 62 @submit="handleSubmit"
62 :actionColOptions="{ span: 24 }" 63 :actionColOptions="{ span: 24 }"
63 /> 64 />
src/views/sys/error-log/DetailModal.vue deleted 100644 → 0
1 -<script lang="tsx">  
2 - import { defineComponent, PropOptions } from 'compatible-vue';  
3 - import { BasicModal } from '@/components/modal/index';  
4 - import { ErrorInfo } from '@/store/modules/error';  
5 - import { Description, useDescription } from '@/components/description/index';  
6 - import { getDescSchema } from './data';  
7 -  
8 - export default defineComponent({  
9 - name: 'ErrorLogDetailModal',  
10 - props: {  
11 - info: {  
12 - type: Object,  
13 - default: null,  
14 - } as PropOptions<ErrorInfo>,  
15 - },  
16 - setup(props, { listeners }) {  
17 - const [register] = useDescription({  
18 - column: 2,  
19 - schema: getDescSchema(),  
20 - });  
21 - return () => {  
22 - return (  
23 - <BasicModal width={800} title="错误详情" on={listeners}>  
24 - <Description data={props.info} onRegister={register} />  
25 - </BasicModal>  
26 - );  
27 - };  
28 - },  
29 - });  
30 -</script>  
src/views/sys/error-log/data.tsx deleted 100644 → 0
1 -import { Tag } from 'ant-design-vue';  
2 -import { BasicColumn } from '@/components/table/index';  
3 -import { ErrorTypeEnum } from '@/store/modules/error';  
4 -import { DescItem } from '@/components/description/index';  
5 -  
6 -export function getColumns(): BasicColumn[] {  
7 - return [  
8 - {  
9 - dataIndex: 'type',  
10 - title: '类型',  
11 - width: 80,  
12 - customRender: (text: string) => {  
13 - const color =  
14 - text === ErrorTypeEnum.VUE  
15 - ? 'green'  
16 - : text === ErrorTypeEnum.RESOURCE  
17 - ? 'cyan'  
18 - : text === ErrorTypeEnum.PROMISE  
19 - ? 'blue'  
20 - : ErrorTypeEnum.AJAX  
21 - ? 'red'  
22 - : 'purple';  
23 - return <Tag color={color}>{text}</Tag>;  
24 - },  
25 - },  
26 - {  
27 - dataIndex: 'url',  
28 - title: '地址',  
29 - width: 200,  
30 - },  
31 - {  
32 - dataIndex: 'time',  
33 - title: '时间',  
34 - width: 160,  
35 - },  
36 - {  
37 - dataIndex: 'file',  
38 - title: '文件',  
39 - width: 200,  
40 - },  
41 - {  
42 - dataIndex: 'name',  
43 - title: 'Name',  
44 - width: 200,  
45 - },  
46 - {  
47 - dataIndex: 'message',  
48 - title: '错误信息',  
49 - width: 300,  
50 - },  
51 - {  
52 - dataIndex: 'stack',  
53 - title: 'stack信息',  
54 - width: 300,  
55 - },  
56 - ];  
57 -}  
58 -  
59 -export function getDescSchema(): DescItem[] {  
60 - return getColumns().map((column) => {  
61 - return {  
62 - field: column.dataIndex!,  
63 - label: column.title,  
64 - };  
65 - });  
66 -}  
src/views/sys/error-log/index.vue deleted 100644 → 0
1 -<script lang="tsx">  
2 - import { defineComponent, watch, ref, unref } from 'compatible-vue';  
3 -  
4 - import DetailModal from './DetailModal.vue';  
5 - import { useModal } from '@/components/modal/index';  
6 -  
7 - import { useDesign } from '@/hooks/core/useDesign';  
8 -  
9 - import { BasicTable, useTable } from '@/components/table/index';  
10 -  
11 - import { errorStore, ErrorInfo } from '@/store/modules/error';  
12 -  
13 - import { fireErrorApi } from '@/api/demo/error';  
14 -  
15 - import { getColumns } from './data';  
16 -  
17 - const { prefixCls } = useDesign('error-handle');  
18 -  
19 - export default defineComponent({  
20 - name: 'ErrorHandler',  
21 - setup() {  
22 - const rowInfoRef = ref<ErrorInfo>();  
23 - const imgListRef = ref<string[]>([]);  
24 - const [register, { setTableData }] = useTable({  
25 - titleHelpMessage: '只在`/src/settings/projectSetting.ts` 内的useErrorHandle=true时生效!',  
26 - title: '错误日志列表',  
27 - columns: getColumns(),  
28 - actionColumn: {  
29 - width: 80,  
30 - title: '操作',  
31 - dataIndex: 'action',  
32 - customRender: (text: string, recoed: ErrorInfo) => {  
33 - return (  
34 - <a-button type="link" size="small" onClick={handleDetail.bind(null, recoed)}>  
35 - 详情  
36 - </a-button>  
37 - );  
38 - },  
39 - },  
40 - });  
41 -  
42 - const [registerModal, { openModal }] = useModal();  
43 - watch(  
44 - () => errorStore.getErrorInfoState,  
45 - (list: any[]) => {  
46 - setTableData(list);  
47 - },  
48 - {  
49 - immediate: true,  
50 - }  
51 - );  
52 -  
53 - // 查看详情  
54 - function handleDetail(row: ErrorInfo) {  
55 - rowInfoRef.value = row;  
56 - openModal({  
57 - visible: true,  
58 - });  
59 - }  
60 -  
61 - function fireVueError() {  
62 - throw new Error('fire vue error!');  
63 - }  
64 -  
65 - function fireResourceError() {  
66 - imgListRef.value.push(`${new Date().getTime()}.png`);  
67 - }  
68 -  
69 - async function fireAjaxError() {  
70 - await fireErrorApi();  
71 - }  
72 -  
73 - return () => (  
74 - <div class={[prefixCls, 'p-4']}>  
75 - {unref(imgListRef).map((src) => {  
76 - return <img src={src} key={src} class="hidden" />;  
77 - })}  
78 -  
79 - <DetailModal info={unref(rowInfoRef)} onRegister={registerModal} />  
80 -  
81 - <BasicTable onRegister={register} class={`${prefixCls}-table`}>  
82 - <template slot="toolbar">  
83 - <a-button onClick={fireVueError} type="primary">  
84 - 点击触发vue错误  
85 - </a-button>  
86 - <a-button onClick={fireResourceError} type="primary">  
87 - 点击触发resource错误  
88 - </a-button>  
89 - <a-button onClick={fireAjaxError} type="primary">  
90 - 点击触发ajax错误  
91 - </a-button>  
92 - </template>  
93 - </BasicTable>  
94 - </div>  
95 - );  
96 - },  
97 - });  
98 -</script>  
99 -<style scoped lang="less">  
100 - @import (reference) '~@design';  
101 - @prefix-cls: ~'@{namespace}-error-handle';  
102 -  
103 - .@{prefix-cls} {  
104 - &-table {  
105 - background: #fff;  
106 - }  
107 - }  
108 -</style>  
src/views/sys/iframe/index.vue
1 <template> 1 <template>
2 <div class="iframe-page" :style="getWrapStyle"> 2 <div class="iframe-page" :style="getWrapStyle">
3 <Spin :spinning="loading" size="large" :style="getWrapStyle"> 3 <Spin :spinning="loading" size="large" :style="getWrapStyle">
4 - <div class="iframe-page__mask" v-show="menuStore.getDragStartState" />  
5 <iframe :src="frameSrc" class="iframe-page__main" ref="frameRef" /> 4 <iframe :src="frameSrc" class="iframe-page__main" ref="frameRef" />
6 </Spin> 5 </Spin>
7 </div> 6 </div>
@@ -12,7 +11,7 @@ @@ -12,7 +11,7 @@
12 11
13 import { getViewportOffset } from '/@/utils/domUtils'; 12 import { getViewportOffset } from '/@/utils/domUtils';
14 import { useWindowSizeFn } from '/@/hooks/event/useWindowSize'; 13 import { useWindowSizeFn } from '/@/hooks/event/useWindowSize';
15 - import { menuStore } from '/@/store/modules/menu'; 14 +
16 export default defineComponent({ 15 export default defineComponent({
17 name: 'IFrame', 16 name: 'IFrame',
18 components: { Spin }, 17 components: { Spin },
@@ -76,7 +75,6 @@ @@ -76,7 +75,6 @@
76 }), 75 }),
77 loading: loadingRef, 76 loading: loadingRef,
78 frameRef, 77 frameRef,
79 - menuStore,  
80 }; 78 };
81 }, 79 },
82 }); 80 });
vite.config.ts
@@ -51,7 +51,7 @@ const viteConfig: UserConfig = { @@ -51,7 +51,7 @@ const viteConfig: UserConfig = {
51 */ 51 */
52 port: 3100, 52 port: 3100,
53 /** 53 /**
54 - * 运行自动打开浏览器 54 + * 运行自动打开浏览器·
55 * @default 'false' 55 * @default 'false'
56 */ 56 */
57 open: false, 57 open: false,
@@ -88,9 +88,9 @@ const viteConfig: UserConfig = { @@ -88,9 +88,9 @@ const viteConfig: UserConfig = {
88 assetsInlineLimit: 4096, 88 assetsInlineLimit: 4096,
89 /** 89 /**
90 * esbuild转换目标。 90 * esbuild转换目标。
91 - * @default 'es2020' 91 + * @default 'es2019'
92 */ 92 */
93 - esbuildTarget: 'es2020', 93 + esbuildTarget: 'es2019',
94 94
95 // 别名 95 // 别名
96 alias: { 96 alias: {