From ba068ba1df797627e88dcf61af3ea13d0c2929ab Mon Sep 17 00:00:00 2001 From: vben Date: Mon, 23 Nov 2020 23:24:13 +0800 Subject: [PATCH] wip: refactor layout --- .eslintrc.js | 4 +- src/components/Application/index.ts | 7 +- .../Application/src/AppFooterToolbar.vue | 60 --- .../Application/src/AppLocalPicker.vue | 31 +- src/components/Application/src/AppLogo.vue | 72 ++++ .../Application/src/AppPageFooter.vue | 46 +++ src/components/Authority/src/index.vue | 16 +- src/components/Description/src/index.tsx | 2 +- src/components/Dropdown/src/Dropdown.tsx | 2 +- src/components/Excel/src/ImportExcel.vue | 2 +- src/components/Form/src/componentMap.ts | 2 +- .../Form/src/hooks/useLabelWidth.ts | 2 +- src/components/Form/src/types/formItem.ts | 4 +- src/components/Menu/index.ts | 6 +- src/components/Menu/src/BasicMenu.tsx | 28 +- src/components/Menu/src/MenuContent.tsx | 6 +- .../Menu/src/{ => hooks}/useOpenKeys.ts | 7 +- .../Menu/src/{ => hooks}/useSearchInput.ts | 2 +- src/components/Menu/src/props.ts | 10 +- .../Menu/src/{types.d.ts => types.ts} | 0 src/components/Modal/src/props.ts | 2 +- src/components/Table/src/types/column.ts | 2 +- src/components/Table/src/types/pagination.ts | 2 +- src/components/Tinymce/src/plugins.ts | 2 +- src/components/registerGlobComp.ts | 2 + src/components/types.ts | 3 + src/design/var/index.less | 2 +- src/enums/pageEnum.ts | 2 + src/hooks/core/useDebouncedRef.ts | 20 + src/{settings/use => hooks/setting}/index.ts | 0 src/hooks/setting/useHeaderSetting.ts | 67 ++++ .../use => hooks/setting}/useLocaleSetting.ts | 18 +- src/hooks/setting/useMenuSetting.ts | 120 ++++++ src/hooks/setting/useMultipleTabSetting.ts | 25 ++ src/hooks/setting/useRootSetting.ts | 53 +++ src/hooks/web/useLocale.ts | 4 +- src/hooks/web/usePage.ts | 1 + src/hooks/web/useSideBar.ts | 20 - src/layouts/default/LayoutSideBar.tsx | 214 ----------- src/layouts/default/LayoutTrigger.tsx | 30 +- .../default/header/LayoutBreadcrumb.tsx | 95 ++--- src/layouts/default/header/LayoutHeader.tsx | 347 ++++++++---------- .../default/header/LockActionItem.less | 1 - src/layouts/default/header/LockActionItem.tsx | 36 +- src/layouts/default/header/UserDropdown.tsx | 80 ++-- .../header/notice/NoticeActionItem.vue | 8 +- .../default/header/notice/NoticeList.vue | 36 +- src/layouts/default/header/notice/data.ts | 8 - src/layouts/default/index.less | 43 --- src/layouts/default/index.tsx | 8 +- src/layouts/default/menu/LayoutMenu.tsx | 249 ++++--------- src/layouts/default/menu/index.less | 12 - src/layouts/default/menu/useLayoutMenu.ts | 113 ++++++ src/layouts/default/multitabs/index.tsx | 2 +- src/layouts/default/sider/LayoutSideBar.tsx | 77 ++++ src/layouts/default/sider/index.less | 44 +++ src/layouts/default/sider/useLayoutSider.tsx | 163 ++++++++ src/layouts/iframe/useFrameKeepAlive.ts | 38 +- src/layouts/logo/index.vue | 105 ------ src/layouts/page/index.tsx | 75 ++-- src/layouts/page/useTransition.ts | 12 +- src/main.ts | 2 +- src/router/guard/index.ts | 2 +- src/router/menus/index.ts | 2 +- src/settings/projectSetting.ts | 13 +- src/setup/error-handle/index.ts | 2 +- src/setup/i18n/index.ts | 2 +- src/store/modules/error.ts | 2 +- src/store/modules/menu.ts | 67 ---- src/store/modules/permission.ts | 5 - src/types/config.d.ts | 1 - src/utils/file/download.ts | 3 +- src/utils/helper/envHelper.ts | 2 +- src/utils/http/axios/index.ts | 2 +- src/utils/index.ts | 14 + src/views/demo/feat/icon/index.vue | 4 +- src/views/demo/page/form/high/index.vue | 8 +- src/views/sys/login/Login.vue | 2 +- vite.config.ts | 6 +- 79 files changed, 1393 insertions(+), 1196 deletions(-) delete mode 100644 src/components/Application/src/AppFooterToolbar.vue create mode 100644 src/components/Application/src/AppLogo.vue create mode 100644 src/components/Application/src/AppPageFooter.vue rename src/components/Menu/src/{ => hooks}/useOpenKeys.ts (89%) rename src/components/Menu/src/{ => hooks}/useSearchInput.ts (96%) rename src/components/Menu/src/{types.d.ts => types.ts} (100%) create mode 100644 src/components/types.ts create mode 100644 src/hooks/core/useDebouncedRef.ts rename src/{settings/use => hooks/setting}/index.ts (100%) create mode 100644 src/hooks/setting/useHeaderSetting.ts rename src/{settings/use => hooks/setting}/useLocaleSetting.ts (58%) create mode 100644 src/hooks/setting/useMenuSetting.ts create mode 100644 src/hooks/setting/useMultipleTabSetting.ts create mode 100644 src/hooks/setting/useRootSetting.ts delete mode 100644 src/hooks/web/useSideBar.ts delete mode 100644 src/layouts/default/LayoutSideBar.tsx create mode 100644 src/layouts/default/menu/useLayoutMenu.ts create mode 100644 src/layouts/default/sider/LayoutSideBar.tsx create mode 100644 src/layouts/default/sider/index.less create mode 100644 src/layouts/default/sider/useLayoutSider.tsx delete mode 100644 src/layouts/logo/index.vue delete mode 100644 src/store/modules/menu.ts diff --git a/.eslintrc.js b/.eslintrc.js index 5487446c8..d642a972b 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -23,7 +23,7 @@ module.exports = { '@typescript-eslint/no-empty-function': 'off', 'vue/custom-event-name-casing': 'off', 'no-use-before-define': 'off', - // 'no-use-before-define': [ + // 'no-setting-before-define': [ // 'error', // { // functions: false, @@ -31,7 +31,7 @@ module.exports = { // }, // ], '@typescript-eslint/no-use-before-define': 'off', - // '@typescript-eslint/no-use-before-define': [ + // '@typescript-eslint/no-setting-before-define': [ // 'error', // { // functions: false, diff --git a/src/components/Application/index.ts b/src/components/Application/index.ts index b48b927ea..ee01d0712 100644 --- a/src/components/Application/index.ts +++ b/src/components/Application/index.ts @@ -1,7 +1,8 @@ import AppLocalPicker from './src/AppLocalPicker.vue'; -import AppFooterToolbar from './src/AppFooterToolbar.vue'; +import AppPageFooter from './src/AppPageFooter.vue'; +import AppLogo from './src/AppLogo.vue'; import { withInstall } from '../util'; -export { AppLocalPicker, AppFooterToolbar }; +export { AppLocalPicker, AppPageFooter, AppLogo }; -export default withInstall(AppLocalPicker, AppFooterToolbar); +export default withInstall(AppLocalPicker, AppPageFooter, AppLogo); diff --git a/src/components/Application/src/AppFooterToolbar.vue b/src/components/Application/src/AppFooterToolbar.vue deleted file mode 100644 index b0550bab9..000000000 --- a/src/components/Application/src/AppFooterToolbar.vue +++ /dev/null @@ -1,60 +0,0 @@ - - - diff --git a/src/components/Application/src/AppLocalPicker.vue b/src/components/Application/src/AppLocalPicker.vue index 544e8884f..b30472efe 100644 --- a/src/components/Application/src/AppLocalPicker.vue +++ b/src/components/Application/src/AppLocalPicker.vue @@ -5,29 +5,44 @@ :selectedKeys="selectedKeys" @menuEvent="handleMenuEvent" > - + + + {{ getLangText }} + diff --git a/src/components/Application/src/AppLogo.vue b/src/components/Application/src/AppLogo.vue new file mode 100644 index 000000000..990b683b5 --- /dev/null +++ b/src/components/Application/src/AppLogo.vue @@ -0,0 +1,72 @@ + + + diff --git a/src/components/Application/src/AppPageFooter.vue b/src/components/Application/src/AppPageFooter.vue new file mode 100644 index 000000000..4c741536c --- /dev/null +++ b/src/components/Application/src/AppPageFooter.vue @@ -0,0 +1,46 @@ + + + diff --git a/src/components/Authority/src/index.vue b/src/components/Authority/src/index.vue index f394f9979..7410db595 100644 --- a/src/components/Authority/src/index.vue +++ b/src/components/Authority/src/index.vue @@ -1,16 +1,15 @@ diff --git a/src/layouts/page/index.tsx b/src/layouts/page/index.tsx index c6471b97c..232c4ed48 100644 --- a/src/layouts/page/index.tsx +++ b/src/layouts/page/index.tsx @@ -1,75 +1,78 @@ -import { computed, defineComponent, unref, Transition, KeepAlive, toRaw } from 'vue'; +import type { FunctionalComponent } from 'vue'; + +import { computed, defineComponent, unref, Transition, KeepAlive } from 'vue'; import { RouterView, RouteLocation } from 'vue-router'; import FrameLayout from '/@/layouts/iframe/index.vue'; import { useTransition } from './useTransition'; -import { useProjectSetting } from '/@/settings/use'; +import { useMenuSetting } from '/@/hooks/setting/useMenuSetting'; +import { useRootSetting } from '/@/hooks/setting/useRootSetting'; +import { useMultipleTabSetting } from '/@/hooks/setting/useMultipleTabSetting'; import { tabStore } from '/@/store/modules/tab'; -import { appStore } from '/@/store/modules/app'; + +interface DefaultContext { + Component: FunctionalComponent; + route: RouteLocation; +} export default defineComponent({ name: 'PageLayout', setup() { - const getProjectConfigRef = computed(() => appStore.getProjectConfig); - const openCacheRef = computed(() => { - const { - openKeepAlive, - multiTabsSetting: { show }, - } = unref(getProjectConfigRef); - return openKeepAlive && show; - }); - const getCacheTabsRef = computed(() => toRaw(tabStore.getKeepAliveTabsState) as string[]); + const { getShow } = useMenuSetting(); + const { + getOpenKeepAlive, + getRouterTransition, + getOpenRouterTransition, + getCanEmbedIFramePage, + } = useRootSetting(); - const { openPageLoading } = unref(getProjectConfigRef); + const { getMax } = useMultipleTabSetting(); + + const transitionEvent = useTransition(); + + const openCacheRef = computed(() => unref(getOpenKeepAlive) && unref(getShow)); + + const getCacheTabsRef = computed(() => tabStore.getKeepAliveTabsState as string[]); - let on = {}; - if (openPageLoading) { - const { on: transitionOn } = useTransition(); - on = transitionOn; - } - const projectSetting = useProjectSetting(); return () => { - const { - routerTransition, - openRouterTransition, - multiTabsSetting: { max }, - } = unref(getProjectConfigRef); - return (
{{ - default: ({ Component, route }: { Component: any; route: RouteLocation }) => { + default: ({ Component, route }: DefaultContext) => { // No longer show animations that are already in the tab const cacheTabs = unref(getCacheTabsRef); const isInCache = cacheTabs.includes(route.name as string); const name = isInCache && route.meta.inTab ? 'fade' : null; - const Content = unref(openCacheRef) ? ( - - + const renderComp = () => ; + + const PageContent = unref(openCacheRef) ? ( + + {renderComp()} ) : ( - + renderComp() ); - return openRouterTransition ? ( + + return unref(getOpenRouterTransition) ? ( - {() => Content} + {() => PageContent} ) : ( - Content + PageContent ); }, }} - {projectSetting.canEmbedIFramePage && } + {unref(getCanEmbedIFramePage) && }
); }; diff --git a/src/layouts/page/useTransition.ts b/src/layouts/page/useTransition.ts index 2c1a59458..6a2e62262 100644 --- a/src/layouts/page/useTransition.ts +++ b/src/layouts/page/useTransition.ts @@ -1,10 +1,11 @@ +import { useRootSetting } from '/@/hooks/setting/useRootSetting'; import { appStore } from '/@/store/modules/app'; import { tryOnUnmounted } from '/@/utils/helper/vueHelper'; + export function useTransition() { function handleAfterEnter() { - const { openRouterTransition, openPageLoading } = appStore.getProjectConfig; - - if (!openRouterTransition || !openPageLoading) return; + const { getOpenPageLoading, getOpenRouterTransition } = useRootSetting(); + if (!getOpenPageLoading.value || !getOpenRouterTransition.value) return; // Close loading after the route switching animation ends appStore.setPageLoadingAction(false); } @@ -15,9 +16,6 @@ export function useTransition() { }); return { - handleAfterEnter, - on: { - onAfterEnter: handleAfterEnter, - }, + onAfterEnter: handleAfterEnter, }; } diff --git a/src/main.ts b/src/main.ts index 60de292a1..d7747a757 100644 --- a/src/main.ts +++ b/src/main.ts @@ -49,7 +49,7 @@ if (isDevMode()) { window.__APP__ = app; } -// If you do not need to use the mock service in the production environment, you can comment the code +// If you do not need to setting the mock service in the production environment, you can comment the code if (isProdMode() && isUseMock()) { setupProdMockServer(); } diff --git a/src/router/guard/index.ts b/src/router/guard/index.ts index c3b1a2603..efd5bf5f1 100644 --- a/src/router/guard/index.ts +++ b/src/router/guard/index.ts @@ -6,7 +6,7 @@ import { createProgressGuard } from './progressGuard'; import { createPermissionGuard } from './permissionGuard'; import { createPageLoadingGuard } from './pageLoadingGuard'; -import { useGlobSetting, useProjectSetting } from '/@/settings/use'; +import { useGlobSetting, useProjectSetting } from '/@/hooks/setting'; import { getIsOpenTab, setCurrentTo } from '/@/utils/helper/routeHelper'; import { setTitle } from '/@/utils/browser'; diff --git a/src/router/menus/index.ts b/src/router/menus/index.ts index 55b942b64..4f3fd19c2 100644 --- a/src/router/menus/index.ts +++ b/src/router/menus/index.ts @@ -7,6 +7,7 @@ import { filter } from '/@/utils/helper/treeHelper'; import router from '/@/router'; import { PermissionModeEnum } from '/@/enums/appEnum'; import { pathToRegexp } from 'path-to-regexp'; + import modules from 'globby!/@/router/menus/modules/**/*.@(ts)'; const menuModules: MenuModule[] = []; @@ -44,7 +45,6 @@ async function getAsyncMenus() { // 获取深层扁平化菜单 export const getFlatMenus = async () => { const menus = await getAsyncMenus(); - return flatMenus(menus); }; diff --git a/src/settings/projectSetting.ts b/src/settings/projectSetting.ts index c3fa1332e..307ac8a83 100644 --- a/src/settings/projectSetting.ts +++ b/src/settings/projectSetting.ts @@ -9,7 +9,7 @@ import { isProdMode } from '/@/utils/env'; const setting: ProjectConfig = { // locale setting locale: { - // Locales + // Locale lang: 'zh_CN', // Default locale fallback: 'zh_CN', @@ -29,17 +29,22 @@ const setting: ProjectConfig = { // Whether to show the configuration button showSettingButton: true, + // 权限模式 permissionMode: PermissionModeEnum.ROLE, + // 网站灰色模式,用于可能悼念的日期开启 grayMode: false, + // 色弱模式 colorWeak: false, // 是否取消菜单,顶部,多标签页显示, 用于可能内嵌在别的系统内 fullContent: false, + // content mode contentMode: ContentEnum.FULL, + // 是否显示logo showLogo: true, @@ -58,11 +63,10 @@ const setting: ProjectConfig = { showFullScreen: true, // 显示文档按钮 showDoc: true, - // 是否显示github - showGithub: true, // 显示消息中心按钮 showNotice: true, }, + // 菜单配置 menuSetting: { // 菜单折叠 @@ -108,13 +112,16 @@ const setting: ProjectConfig = { // 标签页缓存最大数量 max: 12, }, + // 是否开启KeepAlive缓存 开发时候最好关闭,不然每次都需要清除缓存 openKeepAlive: true, // 自动锁屏时间,为0不锁屏。 单位分钟 默认0 lockTime: 0, + // 显示面包屑 showBreadCrumb: true, + // 显示面包屑图标 showBreadCrumbIcon: false, diff --git a/src/setup/error-handle/index.ts b/src/setup/error-handle/index.ts index 0040de7b1..7b8bae6e3 100644 --- a/src/setup/error-handle/index.ts +++ b/src/setup/error-handle/index.ts @@ -3,7 +3,7 @@ */ import { errorStore, ErrorInfo } from '/@/store/modules/error'; -import { useProjectSetting } from '/@/settings/use'; +import { useProjectSetting } from '/@/hooks/setting'; import { ErrorTypeEnum } from '/@/enums/exceptionEnum'; import { App } from 'vue'; diff --git a/src/setup/i18n/index.ts b/src/setup/i18n/index.ts index 01e4bf33c..c3e03b751 100644 --- a/src/setup/i18n/index.ts +++ b/src/setup/i18n/index.ts @@ -4,7 +4,7 @@ import type { I18n, I18nOptions } from 'vue-i18n'; import { createI18n } from 'vue-i18n'; import localeMessages from '/@/locales'; import { useLocale } from '/@/hooks/web/useLocale'; -import { useLocaleSetting } from '/@/settings/use/useLocaleSetting'; +import { useLocaleSetting } from '/@/hooks/setting/useLocaleSetting'; const { setupLocale } = useLocale(); diff --git a/src/store/modules/error.ts b/src/store/modules/error.ts index cd49760ac..64252c642 100644 --- a/src/store/modules/error.ts +++ b/src/store/modules/error.ts @@ -4,7 +4,7 @@ import { VuexModule, getModule, Module, Mutation, Action } from 'vuex-module-dec import { formatToDateTime } from '/@/utils/dateUtil'; import { ErrorTypeEnum } from '/@/enums/exceptionEnum'; -import { useProjectSetting } from '/@/settings/use'; +import { useProjectSetting } from '/@/hooks/setting'; export interface ErrorInfo { type: ErrorTypeEnum; diff --git a/src/store/modules/menu.ts b/src/store/modules/menu.ts deleted file mode 100644 index 5d3f01bd5..000000000 --- a/src/store/modules/menu.ts +++ /dev/null @@ -1,67 +0,0 @@ -import store from '/@/store'; -import { hotModuleUnregisterModule } from '/@/utils/helper/vuexHelper'; -import { VuexModule, Module, getModule, Mutation } from 'vuex-module-decorators'; - -import { appStore } from '/@/store/modules/app'; - -const NAME = 'menu'; -hotModuleUnregisterModule(NAME); -@Module({ namespaced: true, name: NAME, dynamic: true, store }) -class Menu extends VuexModule { - // 是否开始拖拽 - private dragStartState = false; - - private currentTopSplitMenuPathState = ''; - - /** - * @description: 获取窗口名称 - */ - get getCollapsedState() { - return appStore.getProjectConfig.menuSetting.collapsed; - } - - get getCurrentTopSplitMenuPathState() { - return this.currentTopSplitMenuPathState; - } - - get getDragStartState() { - return this.dragStartState; - } - - get getMenuWidthState() { - return appStore.getProjectConfig.menuSetting.menuWidth; - } - - @Mutation - commitDragStartState(dragStart: boolean): void { - this.dragStartState = dragStart; - } - - @Mutation - commitCurrentTopSplitMenuPathState(path: string): void { - this.currentTopSplitMenuPathState = path; - } - - // 改变菜单展开状态 - @Mutation - commitCollapsedState(collapsed: boolean): void { - // this.collapsedState = collapsed; - appStore.commitProjectConfigState({ - menuSetting: { - collapsed: collapsed, - }, - }); - } - - @Mutation - commitMenuWidthState(menuWidth: number): void { - // this.menuWidthState = menuWidth; - appStore.commitProjectConfigState({ - menuSetting: { - menuWidth: menuWidth, - }, - }); - } -} - -export const menuStore = getModule(Menu); diff --git a/src/store/modules/permission.ts b/src/store/modules/permission.ts index 03d4cc108..779060160 100644 --- a/src/store/modules/permission.ts +++ b/src/store/modules/permission.ts @@ -97,11 +97,6 @@ class Permission extends VuexModule { if (!roles) return true; return roleList.some((role) => roles.includes(role)); }); - // this.commitRoutesState(routes); - // Background permissions - // warn( - // `当前权限模式为:${PermissionModeEnum.ROLE},请将src/store/modules/permission.ts内的后台菜单获取函数注释,如果已注释可以忽略此信息!` - // ); // 如果确定不需要做后台动态权限,请将下面整个判断注释 } else if (permissionMode === PermissionModeEnum.BACK) { const messageKey = 'loadMenu'; diff --git a/src/types/config.d.ts b/src/types/config.d.ts index 68ef0b9a5..c3484fc30 100644 --- a/src/types/config.d.ts +++ b/src/types/config.d.ts @@ -44,7 +44,6 @@ export interface HeaderSetting { useLockPage: boolean; // 显示文档按钮 showDoc: boolean; - showGithub: boolean; // 显示消息中心按钮 showNotice: boolean; } diff --git a/src/utils/file/download.ts b/src/utils/file/download.ts index 3511486f8..fd519ae03 100644 --- a/src/utils/file/download.ts +++ b/src/utils/file/download.ts @@ -1,3 +1,4 @@ +import { openWindow } from '..'; import { dataURLtoBlob, urlToBase64 } from './base64Conver'; /** @@ -93,6 +94,6 @@ export function downloadByUrl({ url += '?download'; } - window.open(url, target); + openWindow(url, { target }); return true; } diff --git a/src/utils/helper/envHelper.ts b/src/utils/helper/envHelper.ts index 3bacdffda..0b98912a5 100644 --- a/src/utils/helper/envHelper.ts +++ b/src/utils/helper/envHelper.ts @@ -1,5 +1,5 @@ import { getEnv } from '/@/utils/env'; -import { useGlobSetting } from '/@/settings/use'; +import { useGlobSetting } from '/@/hooks/setting'; import pkg from '../../../package.json'; const globSetting = useGlobSetting(); diff --git a/src/utils/http/axios/index.ts b/src/utils/http/axios/index.ts index f0ebcc0be..da8d08dd3 100644 --- a/src/utils/http/axios/index.ts +++ b/src/utils/http/axios/index.ts @@ -10,7 +10,7 @@ import { AxiosTransform } from './axiosTransform'; import { checkStatus } from './checkStatus'; -import { useGlobSetting } from '/@/settings/use'; +import { useGlobSetting } from '/@/hooks/setting'; import { useMessage } from '/@/hooks/web/useMessage'; import { RequestEnum, ResultEnum, ContentTypeEnum } from '/@/enums/httpEnum'; diff --git a/src/utils/index.ts b/src/utils/index.ts index e5ecd506b..f93595973 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -11,6 +11,7 @@ export function getPopupContainer(node?: HTMLElement): HTMLElement { } return document.body; } + /** * Add the object as a parameter to the URL * @param baseUrl url @@ -64,3 +65,16 @@ export function unique(arr: T[], key: string): T[] { export function es6Unique(arr: T[]): T[] { return Array.from(new Set(arr)); } + +export function openWindow( + url: string, + opt?: { target?: TargetContext | string; noopener?: boolean; noreferrer?: boolean } +) { + const { target = '__blank', noopener = true, noreferrer = true } = opt || {}; + const feature: string[] = []; + + noopener && feature.push('noopener=yes'); + noreferrer && feature.push('noreferrer=yes'); + + window.open(url, target, feature.join(',')); +} diff --git a/src/views/demo/feat/icon/index.vue b/src/views/demo/feat/icon/index.vue index 0ed56af2f..fa4a9dde7 100644 --- a/src/views/demo/feat/icon/index.vue +++ b/src/views/demo/feat/icon/index.vue @@ -45,6 +45,8 @@ import Icon from '/@/components/Icon/index'; + import { openWindow } from '/@/utils'; + export default defineComponent({ components: { CollapseContainer, @@ -61,7 +63,7 @@ setup() { return { toIconify: () => { - window.open('https://iconify.design/', '__blank'); + openWindow('https://iconify.design/'); }, }; }, diff --git a/src/views/demo/page/form/high/index.vue b/src/views/demo/page/form/high/index.vue index ca1f050fa..d92797164 100644 --- a/src/views/demo/page/form/high/index.vue +++ b/src/views/demo/page/form/high/index.vue @@ -16,23 +16,23 @@ - + - +