hongrunxia 3 ヶ月 前
コミット
235037a222

+ 53 - 50
src/layouts/default/feature/SystemSelect.vue

@@ -3,66 +3,69 @@
 </template>
 
 <script lang="ts" setup>
-  // import { Button, Dropdown, Menu, MenuItem } from 'ant-design-vue';
-  // import { DownOutlined } from '@ant-design/icons-vue';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { onMounted, ref } from 'vue';
-  import { PageEnum } from '/@/enums/pageEnum';
-  import { useRouter } from 'vue-router';
-  import { useI18n } from '/@/hooks/web/useI18n';
+// import { Button, Dropdown, Menu, MenuItem } from 'ant-design-vue';
+// import { DownOutlined } from '@ant-design/icons-vue';
+import { useDesign } from '/@/hooks/web/useDesign';
+import { onMounted, ref } from 'vue';
+import { PageEnum } from '/@/enums/pageEnum';
+import { useRouter } from 'vue-router';
+import { useI18n } from '/@/hooks/web/useI18n';
 
-  const { prefixCls } = useDesign('system-select');
-  const router = useRouter();
-  const { t } = useI18n();
-  const text = ref('');
+const { prefixCls } = useDesign('system-select');
+const router = useRouter();
+const { t } = useI18n();
+const text = ref('');
 
-  function handleMenuClick(value) {
-    router.push({ path: value });
-  }
+function handleMenuClick(value) {
+  router.push({ path: value });
+}
 
-  // const OPTIONS = ref({
-  //   [PageEnum.BASE_HOME]: t('routes.basic.baseHome'),
-  //   [PageEnum.SECONDARY_HOME]: t('routes.basic.secondaryHome'),
-  // });
-  const OPTIONS = ref([
-    {
-      value: PageEnum.BASE_HOME,
-      label: t('routes.basic.baseHome'),
-    },
-    {
-      value: PageEnum.SECONDARY_HOME,
-      label: t('routes.basic.secondaryHome'),
-    },
-  ]);
+// const OPTIONS = ref({
+//   [PageEnum.BASE_HOME]: t('routes.basic.baseHome'),
+//   [PageEnum.SECONDARY_HOME]: t('routes.basic.secondaryHome'),
+// });
+const OPTIONS = ref([
+  {
+    value: PageEnum.BASE_HOME,
+    label: t('routes.basic.baseHome'),
+  },
+  {
+    value: PageEnum.SECONDARY_HOME,
+    label: t('routes.basic.secondaryHome'),
+  },
+]);
 
-  onMounted(() => {
-    // 由于BASE_HOME仅代表了一个页面,其他页面都隶属于SECONDARY_HOME,所以简单处理
-    const isBaseHome = router.currentRoute.value.path === PageEnum.BASE_HOME;
-    text.value = isBaseHome ? t('routes.basic.baseHome') : t('routes.basic.secondaryHome');
-  });
+onMounted(() => {
+  // 由于BASE_HOME仅代表了一个页面,其他页面都隶属于SECONDARY_HOME,所以简单处理
+  const isBaseHome = router.currentRoute.value.path === PageEnum.BASE_HOME;
+  text.value = isBaseHome ? t('routes.basic.baseHome') : t('routes.basic.secondaryHome');
+});
 
-  defineExpose({ OPTIONS, prefixCls, handleMenuClick });
+defineExpose({ OPTIONS, prefixCls, handleMenuClick });
 </script>
 <style lang="less" scoped>
-  @prefix-cls: ~'@{namespace}-system-select';
+@prefix-cls: ~'@{namespace}-system-select';
 
-  .@{prefix-cls} {
-    margin-left: 10px;
-    margin-top: 10px;
-    width: 210px;
-    position: relative;
-    z-index: @layout-basic-z-index;
-  }
+.@{prefix-cls} {
+  max-width: 210px;
+  width: 100%;
+  min-width: 10px;
+  margin-bottom: 10px;
+  position: relative;
+  z-index: @layout-basic-z-index;
+}
 
-  .@{prefix-cls}.ant-select {
-    :deep(.ant-select-selector) {
-      background-color: @primary-color;
-      .ant-select-selection-item {
-        color: @white;
-      }
-    }
-    :deep(.ant-select-arrow) {
+.@{prefix-cls}.ant-select {
+  :deep(.ant-select-selector) {
+    background-color: @primary-color;
+
+    .ant-select-selection-item {
       color: @white;
     }
   }
+
+  :deep(.ant-select-arrow) {
+    color: @white;
+  }
+}
 </style>

+ 0 - 1
src/layouts/default/header/index.less

@@ -68,7 +68,6 @@
     display: flex;
     height: 100%;
     align-items: center;
-
     .@{header-trigger-prefix-cls} {
       display: flex;
       height: 100%;

+ 77 - 77
src/layouts/default/index.vue

@@ -3,7 +3,7 @@
   <Layout :class="prefixCls" v-bind="lockEvents">
     <LayoutFeatures />
     <LayoutHeader />
-    <SystemSelect />
+    <!-- <SystemSelect /> -->
     <SimpleMap />
     <Layout :class="[layoutClass]">
       <LayoutSideBar />
@@ -17,93 +17,93 @@
 </template>
 
 <script lang="ts">
-  import { defineComponent, computed, unref } from 'vue';
-  import { Layout } from 'ant-design-vue';
-  import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
+import { defineComponent, computed, unref } from 'vue';
+import { Layout } from 'ant-design-vue';
+import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
 
-  import LayoutHeader from './header/index.vue';
-  import MultipleTabs from './tabs/index.vue';
-  import LayoutContent from './content/index.vue';
-  import LayoutSideBar from './sider/index.vue';
-  import SystemSelect from './feature/SystemSelect.vue';
-  import SimpleMap from './feature/SimpleMap.vue';
+import LayoutHeader from './header/index.vue';
+import MultipleTabs from './tabs/index.vue';
+import LayoutContent from './content/index.vue';
+import LayoutSideBar from './sider/index.vue';
+// import SystemSelect from './feature/SystemSelect.vue';
+import SimpleMap from './feature/SimpleMap.vue';
 
-  // import { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting';
-  import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { useLockPage } from '/@/hooks/web/useLockPage';
+// import { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting';
+import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
+import { useDesign } from '/@/hooks/web/useDesign';
+import { useLockPage } from '/@/hooks/web/useLockPage';
 
-  // import { useAppInject } from '/@/hooks/web/useAppInject';
+// import { useAppInject } from '/@/hooks/web/useAppInject';
 
-  export default defineComponent({
-    name: 'DefaultLayout',
-    components: {
-      LayoutFeatures: createAsyncComponent(() => import('/@/layouts/default/feature/index.vue')),
-      LayoutFooter: createAsyncComponent(() => import('/@/layouts/default/footer/index.vue')),
-      LayoutHeader,
-      LayoutContent,
-      LayoutSideBar,
-      MultipleTabs,
-      Layout,
-      SystemSelect,
-      SimpleMap,
-    },
-    setup() {
-      const { prefixCls } = useDesign('default-layout');
-      // const { getIsMobile } = useAppInject();
-      // const { getShowFullHeaderRef } = useHeaderSetting();
-      const { getShowSidebar, getIsMixSidebar, getShowMenu } = useMenuSetting();
+export default defineComponent({
+  name: 'DefaultLayout',
+  components: {
+    LayoutFeatures: createAsyncComponent(() => import('/@/layouts/default/feature/index.vue')),
+    LayoutFooter: createAsyncComponent(() => import('/@/layouts/default/footer/index.vue')),
+    LayoutHeader,
+    LayoutContent,
+    LayoutSideBar,
+    MultipleTabs,
+    Layout,
+    // SystemSelect,
+    SimpleMap,
+  },
+  setup() {
+    const { prefixCls } = useDesign('default-layout');
+    // const { getIsMobile } = useAppInject();
+    // const { getShowFullHeaderRef } = useHeaderSetting();
+    const { getShowSidebar, getIsMixSidebar, getShowMenu } = useMenuSetting();
 
-      // Create a lock screen monitor
-      const lockEvents = useLockPage();
+    // Create a lock screen monitor
+    const lockEvents = useLockPage();
 
-      const layoutClass = computed(() => {
-        let cls: string[] = ['ant-layout'];
-        if (unref(getIsMixSidebar) || unref(getShowMenu)) {
-          cls.push('ant-layout-has-sider');
-        }
-        return cls;
-      });
+    const layoutClass = computed(() => {
+      let cls: string[] = ['ant-layout'];
+      if (unref(getIsMixSidebar) || unref(getShowMenu)) {
+        cls.push('ant-layout-has-sider');
+      }
+      return cls;
+    });
 
-      return {
-        getShowSidebar,
-        prefixCls,
-        getIsMixSidebar,
-        layoutClass,
-        lockEvents,
-      };
-    },
-  });
+    return {
+      getShowSidebar,
+      prefixCls,
+      getIsMixSidebar,
+      layoutClass,
+      lockEvents,
+    };
+  },
+});
 </script>
 <style lang="less">
-  @prefix-cls: ~'@{namespace}-default-layout';
+@prefix-cls: ~'@{namespace}-default-layout';
 
-  .@{prefix-cls} {
-    display: flex;
-    width: 100%;
-    min-height: 100%;
-    flex-direction: column;
+.@{prefix-cls} {
+  display: flex;
+  width: 100%;
+  min-height: 100%;
+  flex-direction: column;
 
-    > .ant-layout {
-      height: 0;
-      margin: 10px;
-      background-color: transparent;
-      position: relative;
-      z-index: @layout-basic-z-index;
-    }
+  >.ant-layout {
+    height: 0;
+    margin: 10px;
+    background-color: transparent;
+    position: relative;
+    z-index: @layout-basic-z-index;
+  }
 
-    &-main {
-      width: 100%;
-      border-top-right-radius: 4px;
-      border-bottom-right-radius: 4px;
-      // background-color: #aaaaaa32;
-      // border: 1px solid @white;
-      box-shadow: inset 0 0 5px 0 @white;
-      background: rgba(255, 255, 255, 0.2);
-      backdrop-filter: blur(14px);
-      // -webkit-backdrop-filter: blur(10px);
-      // 代码逻辑说明:【issues/8709】LayoutContent样式多出1px
-      // margin-left: 1px;
-    }
+  &-main {
+    width: 100%;
+    border-top-right-radius: 4px;
+    border-bottom-right-radius: 4px;
+    // background-color: #aaaaaa32;
+    // border: 1px solid @white;
+    box-shadow: inset 0 0 5px 0 @white;
+    background: rgba(255, 255, 255, 0.2);
+    backdrop-filter: blur(14px);
+    // -webkit-backdrop-filter: blur(10px);
+    // 代码逻辑说明:【issues/8709】LayoutContent样式多出1px
+    // margin-left: 1px;
   }
+}
 </style>

+ 190 - 188
src/layouts/default/menu/index.vue

@@ -1,207 +1,209 @@
 <script lang="tsx">
-  import type { PropType, CSSProperties } from 'vue';
-
-  import { computed, defineComponent, unref, toRef } from 'vue';
-  import { BasicMenu } from '/@/components/Menu';
-  import { SimpleMenu } from '/@/components/SimpleMenu';
-  // import { AppLogo } from '/@/components/Application';
-
-  import { MenuModeEnum, MenuSplitTyeEnum } from '/@/enums/menuEnum';
-
-  import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
-  import { ScrollContainer } from '/@/components/Container';
-
-  import { useGo } from '/@/hooks/web/usePage';
-  import { useSplitMenu } from './useLayoutMenu';
-  import { openWindow } from '/@/utils';
-  import { propTypes } from '/@/utils/propTypes';
-  import { isUrl } from '/@/utils/is';
-  import { useRootSetting } from '/@/hooks/setting/useRootSetting';
-  import { useAppInject } from '/@/hooks/web/useAppInject';
-  // import { useDesign } from '/@/hooks/web/useDesign';
-  import { useLocaleStore } from '/@/store/modules/locale';
-  import { Button } from 'ant-design-vue';
-  import { SearchOutlined } from '@ant-design/icons-vue';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { AppSearch } from '/@/components/Application';
-
-  export default defineComponent({
-    name: 'LayoutMenu',
-    props: {
-      theme: propTypes.oneOf(['light', 'dark']),
-
-      splitType: {
-        type: Number as PropType<MenuSplitTyeEnum>,
-        default: MenuSplitTyeEnum.NONE,
-      },
-
-      isHorizontal: propTypes.bool,
-      // menu Mode
-      menuMode: {
-        type: [String] as PropType<Nullable<MenuModeEnum>>,
-        default: '',
-      },
+import type { PropType, CSSProperties } from 'vue';
+
+import { computed, defineComponent, unref, toRef } from 'vue';
+import { BasicMenu } from '/@/components/Menu';
+import { SimpleMenu } from '/@/components/SimpleMenu';
+// import { AppLogo } from '/@/components/Application';
+
+import { MenuModeEnum, MenuSplitTyeEnum } from '/@/enums/menuEnum';
+
+import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
+import { ScrollContainer } from '/@/components/Container';
+
+import { useGo } from '/@/hooks/web/usePage';
+import { useSplitMenu } from './useLayoutMenu';
+import { openWindow } from '/@/utils';
+import { propTypes } from '/@/utils/propTypes';
+import { isUrl } from '/@/utils/is';
+import { useRootSetting } from '/@/hooks/setting/useRootSetting';
+import { useAppInject } from '/@/hooks/web/useAppInject';
+// import { useDesign } from '/@/hooks/web/useDesign';
+import { useLocaleStore } from '/@/store/modules/locale';
+import { Button } from 'ant-design-vue';
+import { SearchOutlined } from '@ant-design/icons-vue';
+import { useI18n } from '/@/hooks/web/useI18n';
+import { AppSearch } from '/@/components/Application';
+
+
+
+export default defineComponent({
+  name: 'LayoutMenu',
+  props: {
+    theme: propTypes.oneOf(['light', 'dark']),
+
+    splitType: {
+      type: Number as PropType<MenuSplitTyeEnum>,
+      default: MenuSplitTyeEnum.NONE,
     },
-    setup(props) {
-      const go = useGo();
-      const { t } = useI18n();
-
-      const {
-        getMenuMode,
-        getMenuType,
-        getMenuTheme,
-        getCollapsed,
-        getCollapsedShowTitle,
-        getAccordion,
-        getIsHorizontal,
-        getIsSidebarType,
-        getSplit,
-      } = useMenuSetting();
-      const { getShowLogo } = useRootSetting();
-
-      // const { prefixCls } = useDesign('layout-menu');
-
-      const { menusRef } = useSplitMenu(toRef(props, 'splitType'));
-
-      const { getIsMobile } = useAppInject();
-
-      const getComputedMenuMode = computed(() => (unref(getIsMobile) ? MenuModeEnum.INLINE : props.menuMode || unref(getMenuMode)));
-
-      const getComputedMenuTheme = computed(() => props.theme || unref(getMenuTheme));
-
-      const getIsShowLogo = computed(() => unref(getShowLogo) && unref(getIsSidebarType));
-
-      const getUseScroll = computed(() => {
-        return (
-          !unref(getIsHorizontal) &&
-          (unref(getIsSidebarType) || props.splitType === MenuSplitTyeEnum.LEFT || props.splitType === MenuSplitTyeEnum.NONE)
-        );
-      });
-
-      const getWrapperStyle = computed((): CSSProperties => {
-        return {
-          // 代码逻辑说明: 【issues/7548】侧边栏导航模式时会导致下面菜单滚动显示不全
-          height: `calc(100% - ${unref(getIsShowLogo) ? '60px' : '0px'})`,
-        };
-      });
-
-      // const getLogoClass = computed(() => {
-      //   return [
-      //     `${prefixCls}-logo`,
-      //     unref(getComputedMenuTheme),
-      //     {
-      //       [`${prefixCls}--mobile`]: unref(getIsMobile),
-      //     },
-      //   ];
-      // });
-
-      const getCommonProps = computed(() => {
-        const menus = unref(menusRef);
-        return {
-          menus,
-          beforeClickFn: beforeMenuClickFn,
-          items: menus,
-          theme: unref(getComputedMenuTheme),
-          accordion: unref(getAccordion),
-          collapse: unref(getCollapsed),
-          collapsedShowTitle: unref(getCollapsedShowTitle),
-          onMenuClick: handleMenuClick,
-        };
-      });
-      /**
-       * click menu
-       * @param menu
-       */
-      // 代码逻辑说明: VUEN-1144 online 配置成菜单后,打开菜单,显示名称未展示为菜单名称
-      const localeStore = useLocaleStore();
-      function handleMenuClick(path: string, item) {
-        if (item) {
-          localeStore.setPathTitle(path, item.title || '');
-        }
-        go(path);
-      }
 
-      /**
-       * before click menu
-       * @param menu
-       */
-      async function beforeMenuClickFn(path: string) {
-        if (!isUrl(path)) {
-          return true;
-        }
-        openWindow(path);
-        return false;
+    isHorizontal: propTypes.bool,
+    // menu Mode
+    menuMode: {
+      type: [String] as PropType<Nullable<MenuModeEnum>>,
+      default: '',
+    },
+  },
+  setup(props) {
+    const go = useGo();
+    const { t } = useI18n();
+
+    const {
+      getMenuMode,
+      getMenuType,
+      getMenuTheme,
+      getCollapsed,
+      getCollapsedShowTitle,
+      getAccordion,
+      getIsHorizontal,
+      getIsSidebarType,
+      getSplit,
+    } = useMenuSetting();
+    const { getShowLogo } = useRootSetting();
+
+    // const { prefixCls } = useDesign('layout-menu');
+
+    const { menusRef } = useSplitMenu(toRef(props, 'splitType'));
+
+    const { getIsMobile } = useAppInject();
+
+    const getComputedMenuMode = computed(() => (unref(getIsMobile) ? MenuModeEnum.INLINE : props.menuMode || unref(getMenuMode)));
+
+    const getComputedMenuTheme = computed(() => props.theme || unref(getMenuTheme));
+
+    const getIsShowLogo = computed(() => unref(getShowLogo) && unref(getIsSidebarType));
+
+    const getUseScroll = computed(() => {
+      return (
+        !unref(getIsHorizontal) &&
+        (unref(getIsSidebarType) || props.splitType === MenuSplitTyeEnum.LEFT || props.splitType === MenuSplitTyeEnum.NONE)
+      );
+    });
+
+    const getWrapperStyle = computed((): CSSProperties => {
+      return {
+        // 代码逻辑说明: 【issues/7548】侧边栏导航模式时会导致下面菜单滚动显示不全
+        height: `calc(100% - ${unref(getIsShowLogo) ? '60px' : '0px'})`,
+      };
+    });
+
+    // const getLogoClass = computed(() => {
+    //   return [
+    //     `${prefixCls}-logo`,
+    //     unref(getComputedMenuTheme),
+    //     {
+    //       [`${prefixCls}--mobile`]: unref(getIsMobile),
+    //     },
+    //   ];
+    // });
+
+    const getCommonProps = computed(() => {
+      const menus = unref(menusRef);
+      return {
+        menus,
+        beforeClickFn: beforeMenuClickFn,
+        items: menus,
+        theme: unref(getComputedMenuTheme),
+        accordion: unref(getAccordion),
+        collapse: unref(getCollapsed),
+        collapsedShowTitle: unref(getCollapsedShowTitle),
+        onMenuClick: handleMenuClick,
+      };
+    });
+    /**
+     * click menu
+     * @param menu
+     */
+    // 代码逻辑说明: VUEN-1144 online 配置成菜单后,打开菜单,显示名称未展示为菜单名称
+    const localeStore = useLocaleStore();
+    function handleMenuClick(path: string, item) {
+      if (item) {
+        localeStore.setPathTitle(path, item.title || '');
       }
+      go(path);
+    }
 
-      function renderMenu() {
-        const { menus, ...menuProps } = unref(getCommonProps);
-        // console.log(menus);
-        if (!menus || !menus.length) return null;
-        return (
-          <>
-            {!getCollapsed.value ? (
-              <AppSearch class="m-5px">
-                <Button class="w-full">
-                  {t('layout.setting.menuSearch')}
-                  <SearchOutlined />
-                </Button>
-              </AppSearch>
-            ) : (
-              <AppSearch class="m-5px">
-                <Button shape="circle">
-                  <SearchOutlined />
-                </Button>
-              </AppSearch>
-            )}
-            {!props.isHorizontal ? (
-              <SimpleMenu {...menuProps} isSplitMenu={unref(getSplit)} items={menusRef.value} />
-            ) : (
-              <BasicMenu
-                {...(menuProps as any)}
-                isHorizontal={props.isHorizontal}
-                type={unref(getMenuType)}
-                showLogo={unref(getIsShowLogo)}
-                mode={unref(getComputedMenuMode as any)}
-                items={menusRef.value}
-              />
-            )}
-          </>
-        );
+    /**
+     * before click menu
+     * @param menu
+     */
+    async function beforeMenuClickFn(path: string) {
+      if (!isUrl(path)) {
+        return true;
       }
+      openWindow(path);
+      return false;
+    }
 
-      return () => {
-        return <>{unref(getUseScroll) ? <ScrollContainer style={unref(getWrapperStyle)}>{() => renderMenu()}</ScrollContainer> : renderMenu()}</>;
-      };
-    },
-  });
+    function renderMenu() {
+      const { menus, ...menuProps } = unref(getCommonProps);
+      // console.log(menus);
+      if (!menus || !menus.length) return null;
+      return (
+        <>
+          {!getCollapsed.value ? (
+            <AppSearch class="m-5px">
+              <Button class="w-full">
+                {t('layout.setting.menuSearch')}
+                <SearchOutlined />
+              </Button>
+            </AppSearch>
+          ) : (
+            <AppSearch class="m-5px">
+              <Button shape="circle">
+                <SearchOutlined />
+              </Button>
+            </AppSearch>
+          )}
+          {!props.isHorizontal ? (
+            <SimpleMenu {...menuProps} isSplitMenu={unref(getSplit)} items={menusRef.value} />
+          ) : (
+            <BasicMenu
+              {...(menuProps as any)}
+              isHorizontal={props.isHorizontal}
+              type={unref(getMenuType)}
+              showLogo={unref(getIsShowLogo)}
+              mode={unref(getComputedMenuMode as any)}
+              items={menusRef.value}
+            />
+          )}
+        </>
+      );
+    }
+
+    return () => {
+      return <>{unref(getUseScroll) ? <ScrollContainer style={unref(getWrapperStyle)}>{() => renderMenu()}</ScrollContainer> : renderMenu()}</>;
+    };
+  },
+});
 </script>
 <style lang="less" scoped>
-  // 代码逻辑说明: 【QQYUN-5872】菜单优化,上下滚动条去掉
-  .scroll-container :deep(.scrollbar__bar) {
-    display: none;
-  }
+// 代码逻辑说明: 【QQYUN-5872】菜单优化,上下滚动条去掉
+.scroll-container :deep(.scrollbar__bar) {
+  display: none;
+}
 </style>
 <style lang="less">
-  @prefix-cls: ~'@{namespace}-layout-menu';
-  @logo-prefix-cls: ~'@{namespace}-app-logo';
+@prefix-cls: ~'@{namespace}-layout-menu';
+@logo-prefix-cls: ~'@{namespace}-app-logo';
 
-  .@{prefix-cls} {
-    &-logo {
-      height: @header-height;
-      padding: 10px 4px 10px 10px;
+.@{prefix-cls} {
+  &-logo {
+    height: @header-height;
+    padding: 10px 4px 10px 10px;
 
-      img {
-        width: @logo-width;
-        height: @logo-width;
-      }
+    img {
+      width: @logo-width;
+      height: @logo-width;
     }
+  }
 
-    &--mobile {
-      .@{logo-prefix-cls} {
-        &__title {
-          opacity: 1;
-        }
+  &--mobile {
+    .@{logo-prefix-cls} {
+      &__title {
+        opacity: 1;
       }
     }
   }
+}
 </style>

+ 77 - 70
src/layouts/default/plain.vue

@@ -10,86 +10,93 @@
 </template>
 
 <script lang="ts">
-  import { defineComponent, computed, unref } from 'vue';
-  import { Layout } from 'ant-design-vue';
-  import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
+import { defineComponent, computed, unref } from 'vue';
+import { Layout } from 'ant-design-vue';
+import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
 
-  import LayoutHeader from './header/index.vue';
-  import LayoutContent from './content/index.vue';
-  import SystemSelect from './feature/SystemSelect.vue';
-  import SimpleMap from './feature/SimpleMap.vue';
+import LayoutHeader from './header/index.vue';
+import LayoutContent from './content/index.vue';
+import SystemSelect from './feature/SystemSelect.vue';
+import SimpleMap from './feature/SimpleMap.vue';
 
-  // import { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting';
-  import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { useLockPage } from '/@/hooks/web/useLockPage';
+// import { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting';
+import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
+import { useDesign } from '/@/hooks/web/useDesign';
+import { useLockPage } from '/@/hooks/web/useLockPage';
 
-  // import { useAppInject } from '/@/hooks/web/useAppInject';
+// import { useAppInject } from '/@/hooks/web/useAppInject';
 
-  export default defineComponent({
-    name: 'DefaultLayout',
-    components: {
-      LayoutFeatures: createAsyncComponent(() => import('/@/layouts/default/feature/index.vue')),
-      LayoutHeader,
-      LayoutContent,
-      Layout,
-      SystemSelect,
-      SimpleMap,
-    },
-    setup() {
-      const { prefixCls } = useDesign('default-layout');
-      // const { getIsMobile } = useAppInject();
-      // const { getShowFullHeaderRef } = useHeaderSetting();
-      const { getShowSidebar, getIsMixSidebar, getShowMenu } = useMenuSetting();
+export default defineComponent({
+  name: 'DefaultLayout',
+  components: {
+    LayoutFeatures: createAsyncComponent(() => import('/@/layouts/default/feature/index.vue')),
+    LayoutHeader,
+    LayoutContent,
+    Layout,
+    SystemSelect,
+    SimpleMap,
+  },
+  setup() {
+    const { prefixCls } = useDesign('default-layout');
+    // const { getIsMobile } = useAppInject();
+    // const { getShowFullHeaderRef } = useHeaderSetting();
+    const { getShowSidebar, getIsMixSidebar, getShowMenu } = useMenuSetting();
 
-      // Create a lock screen monitor
-      const lockEvents = useLockPage();
+    // Create a lock screen monitor
+    const lockEvents = useLockPage();
 
-      const layoutClass = computed(() => {
-        let cls: string[] = ['ant-layout'];
-        if (unref(getIsMixSidebar) || unref(getShowMenu)) {
-          cls.push('ant-layout-has-sider');
-        }
-        return cls;
-      });
+    const layoutClass = computed(() => {
+      let cls: string[] = ['ant-layout'];
+      if (unref(getIsMixSidebar) || unref(getShowMenu)) {
+        cls.push('ant-layout-has-sider');
+      }
+      return cls;
+    });
 
-      return {
-        getShowSidebar,
-        prefixCls,
-        getIsMixSidebar,
-        layoutClass,
-        lockEvents,
-      };
-    },
-  });
+    return {
+      getShowSidebar,
+      prefixCls,
+      getIsMixSidebar,
+      layoutClass,
+      lockEvents,
+    };
+  },
+});
 </script>
-<style lang="less">
-  @prefix-cls: ~'@{namespace}-default-layout';
+<style lang="less" scoped>
+@prefix-cls: ~'@{namespace}-default-layout';
 
-  .@{prefix-cls} {
-    display: flex;
-    width: 100%;
-    min-height: 100%;
-    flex-direction: column;
+.@{prefix-cls} {
+  display: flex;
+  width: 100%;
+  min-height: 100%;
+  flex-direction: column;
 
-    > .ant-layout {
-      height: 0;
-      margin: 10px;
-      background-color: transparent;
-      position: relative;
-      z-index: @layout-basic-z-index;
-    }
+  >.ant-layout {
+    height: 0;
+    margin: 10px;
+    background-color: transparent;
+    position: relative;
+    z-index: @layout-basic-z-index;
+  }
 
-    &-main {
-      width: 100%;
-      border-top-right-radius: 10px;
-      border-bottom-right-radius: 10px;
-      // background-color: #aaaaaa32;
-      background: rgba(255, 255, 255, 0.2);
-      backdrop-filter: blur(10px);
-      -webkit-backdrop-filter: blur(10px);
-      // 代码逻辑说明:【issues/8709】LayoutContent样式多出1px
-      // margin-left: 1px;
-    }
+  &-main {
+    width: 100%;
+    border-top-right-radius: 10px;
+    border-bottom-right-radius: 10px;
+    // background-color: #aaaaaa32;
+    background: rgba(255, 255, 255, 0.2);
+    backdrop-filter: blur(10px);
+    -webkit-backdrop-filter: blur(10px);
+    // 代码逻辑说明:【issues/8709】LayoutContent样式多出1px
+    // margin-left: 1px;
   }
+
+
+}
+
+:deep(.jeecg-system-select) {
+  margin-left: 10px;
+  margin-top: 10px;
+}
 </style>

+ 134 - 135
src/layouts/default/sider/LayoutSider.vue

@@ -1,156 +1,155 @@
 <template>
-  <Sider
-    v-show="showClassSideBarRef"
-    breakpoint="lg"
-    collapsible
-    :class="getSiderClass"
-    :width="getMenuWidth"
-    :collapsed="getCollapsed"
-    :collapsedWidth="getCollapsedWidth"
-    :theme="getMenuTheme"
-    @breakpoint="onBreakpointChange"
-  >
-    <LayoutMenu :theme="getMenuTheme" :menuMode="getMode" :splitType="getSplitType" showSearch />
-    <template #trigger>
-      <LayoutTrigger />
-    </template>
-  </Sider>
+  <div style="display: flex; flex-direction: column; height: 100%;">
+    <SystemSelect v-if="!getCollapsed" />
+    <Sider v-show="showClassSideBarRef" breakpoint="lg" collapsible :class="getSiderClass" :width="getMenuWidth"
+      :collapsed="getCollapsed" :collapsedWidth="getCollapsedWidth" :theme="getMenuTheme"
+      @breakpoint="onBreakpointChange">
+      <LayoutMenu :theme="getMenuTheme" :menuMode="getMode" :splitType="getSplitType" showSearch />
+      <template #trigger>
+        <LayoutTrigger />
+      </template>
+    </Sider>
+  </div>
+
 </template>
 <script lang="ts">
-  import { computed, defineComponent, unref, CSSProperties } from 'vue';
-
-  import { Layout } from 'ant-design-vue';
-  import LayoutMenu from '../menu/index.vue';
-  // import LayoutMenu from '../menu/SearchMenu.vue';
-  import LayoutTrigger from '/@/layouts/default/trigger/index.vue';
-
-  import { MenuModeEnum, MenuSplitTyeEnum } from '/@/enums/menuEnum';
-
-  import { useAppStore } from '@/store/modules/app';
-  import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
-  import { useSiderEvent } from './useLayoutSider';
-  import { useDesign } from '/@/hooks/web/useDesign';
-
-  // import DragBar from './DragBar.vue';
-
-  export default defineComponent({
-    name: 'LayoutSideBar',
-    components: { Sider: Layout.Sider, LayoutMenu, LayoutTrigger },
-    setup() {
-      // const dragBarRef = ref<ElRef>(null);
-      // const sideRef = ref<ElRef>(null);
-
-      const { getCollapsed, getMenuWidth, getSplit, getMenuTheme, getRealWidth, getMenuHidden, getMenuFixed, getIsMixMode, toggleCollapsed } =
-        useMenuSetting();
-
-      const { prefixCls } = useDesign('layout-sideBar');
-
-      const appStore = useAppStore();
-
-      // useDragLine(sideRef, dragBarRef);
-
-      const { getCollapsedWidth, onBreakpointChange } = useSiderEvent();
-
-      const getMode = computed(() => {
-        return unref(getSplit) ? MenuModeEnum.INLINE : null;
-      });
-
-      const getSplitType = computed(() => {
-        return unref(getSplit) ? MenuSplitTyeEnum.LEFT : MenuSplitTyeEnum.NONE;
-      });
-
-      const showClassSideBarRef = computed(() => {
-        // 控制是否显示侧边栏
-        if (appStore.getLayoutHideSider) {
-          return false;
-        }
-        return unref(getSplit) ? !unref(getMenuHidden) : true;
-      });
-
-      const getSiderClass = computed(() => {
-        return [
-          prefixCls,
-          {
-            [`${prefixCls}--fixed`]: unref(getMenuFixed),
-            [`${prefixCls}--mix`]: unref(getIsMixMode),
-          },
-        ];
-      });
-
-      const getHiddenDomStyle = computed((): CSSProperties => {
-        const width = `${unref(getRealWidth)}px`;
-        return {
-          width: width,
-          overflow: 'hidden',
-          flex: `0 0 ${width}`,
-          maxWidth: width,
-          minWidth: width,
-          transition: 'all 0.2s',
-        };
-      });
-
-      // 在此处使用计算量可能会导致sider异常
-      // andv 更新后,如果trigger插槽可用,则此处代码可废弃
-      // const getTrigger = h(LayoutTrigger);
+import { computed, defineComponent, unref, CSSProperties } from 'vue';
 
-      return {
+import { Layout } from 'ant-design-vue';
+import LayoutMenu from '../menu/index.vue';
+// import LayoutMenu from '../menu/SearchMenu.vue';
+import LayoutTrigger from '/@/layouts/default/trigger/index.vue';
+
+import { MenuModeEnum, MenuSplitTyeEnum } from '/@/enums/menuEnum';
+
+import { useAppStore } from '@/store/modules/app';
+import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
+import { useSiderEvent } from './useLayoutSider';
+import { useDesign } from '/@/hooks/web/useDesign';
+import SystemSelect from '../feature/SystemSelect.vue';
+
+// import DragBar from './DragBar.vue';
+
+export default defineComponent({
+  name: 'LayoutSideBar',
+  components: { Sider: Layout.Sider, LayoutMenu, LayoutTrigger, SystemSelect },
+  setup() {
+    // const dragBarRef = ref<ElRef>(null);
+    // const sideRef = ref<ElRef>(null);
+
+    const { getCollapsed, getMenuWidth, getSplit, getMenuTheme, getRealWidth, getMenuHidden, getMenuFixed, getIsMixMode, toggleCollapsed } =
+      useMenuSetting();
+
+    const { prefixCls } = useDesign('layout-sideBar');
+
+    const appStore = useAppStore();
+
+    // useDragLine(sideRef, dragBarRef);
+
+    const { getCollapsedWidth, onBreakpointChange } = useSiderEvent();
+
+    const getMode = computed(() => {
+      return unref(getSplit) ? MenuModeEnum.INLINE : null;
+    });
+
+    const getSplitType = computed(() => {
+      return unref(getSplit) ? MenuSplitTyeEnum.LEFT : MenuSplitTyeEnum.NONE;
+    });
+
+    const showClassSideBarRef = computed(() => {
+      // 控制是否显示侧边栏
+      if (appStore.getLayoutHideSider) {
+        return false;
+      }
+      return unref(getSplit) ? !unref(getMenuHidden) : true;
+    });
+
+    const getSiderClass = computed(() => {
+      return [
         prefixCls,
-        getHiddenDomStyle,
-        getSiderClass,
-        // getTrigger,
-        getCollapsedWidth,
-        getMenuFixed,
-        showClassSideBarRef,
-        getMenuWidth,
-        getCollapsed,
-        getMenuTheme,
-        onBreakpointChange,
-        getMode,
-        getSplitType,
-        toggleCollapsed,
+        {
+          [`${prefixCls}--fixed`]: unref(getMenuFixed),
+          [`${prefixCls}--mix`]: unref(getIsMixMode),
+        },
+      ];
+    });
+
+    const getHiddenDomStyle = computed((): CSSProperties => {
+      const width = `${unref(getRealWidth)}px`;
+      return {
+        width: width,
+        overflow: 'hidden',
+        flex: `0 0 ${width}`,
+        maxWidth: width,
+        minWidth: width,
+        transition: 'all 0.2s',
       };
-    },
-  });
+    });
+
+    // 在此处使用计算量可能会导致sider异常
+    // andv 更新后,如果trigger插槽可用,则此处代码可废弃
+    // const getTrigger = h(LayoutTrigger);
+
+    return {
+      prefixCls,
+      getHiddenDomStyle,
+      getSiderClass,
+      // getTrigger,
+      getCollapsedWidth,
+      getMenuFixed,
+      showClassSideBarRef,
+      getMenuWidth,
+      getCollapsed,
+      getMenuTheme,
+      onBreakpointChange,
+      getMode,
+      getSplitType,
+      toggleCollapsed,
+
+    };
+  },
+});
 </script>
 <style lang="less">
-  @prefix-cls: ~'@{namespace}-layout-sideBar';
+@prefix-cls: ~'@{namespace}-layout-sideBar';
 
-  .@{prefix-cls} {
-    border-top-left-radius: 10px;
-    border-bottom-left-radius: 10px;
-    z-index: @layout-sider-fixed-z-index;
+.@{prefix-cls} {
+  border-top-left-radius: 10px;
+  border-bottom-left-radius: 10px;
+  z-index: @layout-sider-fixed-z-index;
+  flex: 1 !important;
 
-    &.ant-layout-sider-dark {
-      background-color: @sider-dark-bg-color;
+  &.ant-layout-sider-dark {
+    background-color: @sider-dark-bg-color;
 
-      .ant-layout-sider-trigger {
-        color: darken(@white, 25%);
-        background-color: @trigger-dark-bg-color;
+    .ant-layout-sider-trigger {
+      color: darken(@white, 25%);
+      background-color: @trigger-dark-bg-color;
 
-        &:hover {
-          color: @white;
-          background-color: @trigger-dark-hover-bg-color;
-        }
+      &:hover {
+        color: @white;
+        background-color: @trigger-dark-hover-bg-color;
       }
     }
+  }
 
-    &:not(.ant-layout-sider-dark) {
-      // box-shadow: 2px 0 8px 0 rgba(29, 35, 41, 0.05);
+  &:not(.ant-layout-sider-dark) {
+    // box-shadow: 2px 0 8px 0 rgba(29, 35, 41, 0.05);
 
-      .ant-layout-sider-trigger {
-        color: @text-color-base;
-        border-top: 1px solid @border-color-light;
-      }
+    .ant-layout-sider-trigger {
+      color: @text-color-base;
+      border-top: 1px solid @border-color-light;
     }
+  }
 
-    .ant-layout-sider-zero-width-trigger {
-      top: 40%;
-      z-index: 10;
-    }
+  .ant-layout-sider-zero-width-trigger {
+    top: 40%;
+    z-index: 10;
+  }
 
-    & .ant-layout-sider-trigger {
-      // height: 36px;
-      line-height: 36px;
-    }
+  & .ant-layout-sider-trigger {
+    // height: 36px;
+    line-height: 36px;
   }
+}
 </style>

+ 66 - 68
src/views/dashboard/SealedGoaf/index.vue

@@ -2,85 +2,83 @@
 <template>
   <div class="company-home">
     <!-- 渲染所有模块 -->
-    <ModulePrimary
-      v-for="cfg in cfgs"
-      :key="cfg.deviceType + cfg.moduleName"
-      :show-style="cfg.showStyle"
-      :module-data="cfg.moduleData"
-      :module-name="cfg.moduleName"
-      :device-type="cfg.deviceType"
-      :data="data"
-      :visible="true"
-    />
+    <ModulePrimary v-for="cfg in cfgs" :key="cfg.deviceType + cfg.moduleName" :show-style="cfg.showStyle"
+      :module-data="cfg.moduleData" :module-name="cfg.moduleName" :device-type="cfg.deviceType" :data="data"
+      :visible="true" />
   </div>
 </template>
 <script lang="ts" setup>
-  import { computed, onMounted, onUnmounted, ref } from 'vue';
-  import { useInitConfigs, useInitPage } from '@/components/Configurable/hooks/useInit';
-  import { testConfigSealedGoaf } from './configurable.data.sealedGoaf';
-  import { getCoalSeamFireNum, getMineProductionStatusNum, getOverLimitNum, getGoafAlarmNum, getGoafAlarmLevel } from './sealedGoaf.api'
-  import ModulePrimary from '/@/components/Configurable/ModulePrimary.vue';
-  import { useGlobSetting } from '/@/hooks/setting';
+import { computed, onMounted, onUnmounted, ref } from 'vue';
+import { useInitConfigs, useInitPage } from '@/components/Configurable/hooks/useInit';
+import { testConfigSealedGoaf } from './configurable.data.sealedGoaf';
+import { getCoalSeamFireNum, getMineProductionStatusNum, getOverLimitNum, getGoafAlarmNum, getGoafAlarmLevel } from './sealedGoaf.api'
+import ModulePrimary from '/@/components/Configurable/ModulePrimary.vue';
+import { useGlobSetting } from '/@/hooks/setting';
 
-  const { title = '省局采空区密闭监测与分析系统' } = useGlobSetting();
-  const { data, updateData } = useInitPage(title);
+const { title = '省局采空区密闭监测与分析系统' } = useGlobSetting();
+const { data, updateData } = useInitPage(title);
 
-  const cfgs = computed(() => configs.value);
-  const { configs, fetchConfigs } = useInitConfigs();
-  const mineData = ref({}); // 所有数据汇总
+const cfgs = computed(() => configs.value);
+const { configs, fetchConfigs } = useInitConfigs();
+const mineData = ref({}); // 所有数据汇总
 
-  onMounted(async () => {
-    try {
-      // 1. 先获取基础配置(若有接口获取配置则保留,否则直接用本地testConfigSealedGoaf)
-      await fetchConfigs('sealed_goaf');
-      
-      // 2. 异步获取所有接口数据(并行请求提升性能)
-      const [coalSeamFireData, productionStatusData, overLimitData, goafAlarmData, goafAlarmLevel] = await Promise.all([
-        getCoalSeamFireNum(), // 煤层自燃倾向数据
-        getMineProductionStatusNum(), // 当日生产状态数据
-        getOverLimitNum(), // 超限数据(可按需处理)
-        getGoafAlarmNum({mineCode:'100008'}), // 执法处风险统计
-        getGoafAlarmLevel({mineCode:'100008'}),
-      ]);
+onMounted(async () => {
+  try {
+    // 1. 先获取基础配置(若有接口获取配置则保留,否则直接用本地testConfigSealedGoaf)
+    await fetchConfigs('sealed_goaf');
 
-      // 3. 把接口数据赋值给响应式变量(备用)
-      mineData.value = { coalSeamFireData, productionStatusData, overLimitData, goafAlarmData, goafAlarmLevel };
+    // 2. 异步获取所有接口数据(并行请求提升性能)
+    const [coalSeamFireData, productionStatusData, overLimitData, goafAlarmData, goafAlarmLevel] = await Promise.all([
+      getCoalSeamFireNum(), // 煤层自燃倾向数据
+      getMineProductionStatusNum(), // 当日生产状态数据
+      getOverLimitNum(), // 超限数据(可按需处理)
+      getGoafAlarmNum({ mineCode: '100008' }), // 执法处风险统计
+      getGoafAlarmLevel({ mineCode: '100008' }),
+    ]);
 
-      // 4. 赋值更新后的配置到configs(触发组件重新渲染)
-      configs.value = [...testConfigSealedGoaf]; // 解构触发响应式更新
-      
-      // 5. 更新页面数据
-      updateData(mineData.value);
+    // 3. 把接口数据赋值给响应式变量(备用)
+    mineData.value = { coalSeamFireData, productionStatusData, overLimitData, goafAlarmData, goafAlarmLevel };
 
-    } catch (error) {
-      console.error('数据获取/配置更新失败:', error);
-    }
-  });
+    // 4. 赋值更新后的配置到configs(触发组件重新渲染)
+    configs.value = [...testConfigSealedGoaf]; // 解构触发响应式更新
 
-  // 数据处理函数
-  onUnmounted(() => {});
+    // 5. 更新页面数据
+    updateData(mineData.value);
+
+  } catch (error) {
+    console.error('数据获取/配置更新失败:', error);
+  }
+});
+
+// 数据处理函数
+onUnmounted(() => { });
 </script>
 <style lang="less" scoped>
-  @import '/@/design/theme.less';
+@import '/@/design/theme.less';
 
-  @font-face {
-    font-family: 'douyuFont';
-    src: url('/@/assets/font/douyuFont.otf');
-  }
-  .company-home {
-    position: absolute;
-    width: 100%;
-    height: 100%;
-    color: @white;
-    background-image: linear-gradient(90deg, @map-bg 0%, @map-bg 14%, transparent 50%, @map-bg 86%, @map-bg 100%);
-    background-repeat: no-repeat;
-    background-size: 100% 100%;
-    z-index: @layout-basic-z-index;
-    // 允许点击穿透以支持下面的地图进行交互
-    pointer-events: none;
-  }
-  :deep(.ant-select-selection-item){
-    display: flex;
-    align-items: center;
-  }
+@font-face {
+  font-family: 'douyuFont';
+  src: url('/@/assets/font/douyuFont.otf');
+}
+
+
+
+
+.company-home {
+  position: absolute;
+  width: 100%;
+  height: 100%;
+  color: @white;
+  background-image: linear-gradient(90deg, @map-bg 0%, @map-bg 14%, transparent 50%, @map-bg 86%, @map-bg 100%);
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  z-index: @layout-basic-z-index;
+  // 允许点击穿透以支持下面的地图进行交互
+  pointer-events: none;
+}
+
+:deep(.ant-select-selection-item) {
+  display: flex;
+  align-items: center;
+}
 </style>