Ver código fonte

菜单布局准备工作

CzRger 8 meses atrás
pai
commit
2a823d07a5

Diferenças do arquivo suprimidas por serem muito extensas
+ 4 - 4
snowy-admin-web/index.html


BIN
snowy-admin-web/public/favicon.ico


BIN
snowy-admin-web/public/img/logo.png


+ 3 - 3
snowy-admin-web/src/config/index.js

@@ -30,8 +30,8 @@ const DEFAULT_CONFIG = {
 	// 请求是否开启缓存
 	REQUEST_CACHE: false,
 
-	// 布局 经典:classical,双排菜单:doublerow, 顶栏菜单:top
-	SNOWY_LAYOUT: 'doublerow',
+	// 布局 经典:classical,双排菜单:doublerow, 顶栏菜单:top,单一窗口:singlewindow
+	SNOWY_LAYOUT: 'singlewindow',
 
 	// 菜单是否折叠
 	SNOWY_MENU_COLLAPSE: false,
@@ -82,7 +82,7 @@ const DEFAULT_CONFIG = {
 		// 背景图
 		SNOWY_SYS_BACK_IMAGE: '',
 		// 系统名称
-		SNOWY_SYS_NAME: 'Snowy',
+		SNOWY_SYS_NAME: '一企一册',
 		// 版本
 		SNOWY_SYS_VERSION: '2.0',
 		// 版权

+ 2 - 1
snowy-admin-web/src/layout/enum/layoutEnum.js

@@ -11,5 +11,6 @@
 export const layoutEnum = {
 	CLASSICAL: 'classical',
 	DOUBLEROW: 'doublerow',
-	TOP: 'top'
+	TOP: 'top',
+	SINGLEWINDOW: 'singlewindow',
 }

+ 21 - 0
snowy-admin-web/src/layout/index.vue

@@ -64,6 +64,26 @@
 		@onOpenChange="onOpenChange"
 		@onSelect="onSelect"
 	/>
+	<!-- 顶部菜单布局 -->
+	<SingleWindowMenu
+		v-else-if="layout === layoutEnum.SINGLEWINDOW"
+		:layout="layout"
+		:menuList="menuList"
+		:menu="menu"
+		:sysBaseConfig="sysBaseConfig"
+		:moduleMenuShow="moduleMenuShow"
+		:openKeys="openKeys"
+		:selectedKeys="selectedKeys"
+		:breadcrumbOpen="breadcrumbOpen"
+		:footerCopyrightOpen="footerCopyrightOpen"
+		:sideTheme="sideTheme"
+		:isMobile="isMobile"
+		:kStore="kStore"
+		:layoutTagsOpen="layoutTagsOpen"
+		@switchModule="switchModule"
+		@onOpenChange="onOpenChange"
+		@onSelect="onSelect"
+	/>
 
 	<!-- 退出最大化 -->
 	<div class="main-maximize-exit" @click="exitMaximize">
@@ -81,6 +101,7 @@
 	import ClassicalMenu from '@/layout/menu/classicalMenu.vue'
 	import DoubleRowMenu from '@/layout/menu/doubleRowMenu.vue'
 	import TopMenu from '@/layout/menu/topMenu.vue'
+	import SingleWindowMenu from '@/layout/menu/singleWindowMenu.vue'
 
 	const store = globalStore()
 	const kStore = keepAliveStore()

+ 1 - 0
snowy-admin-web/src/layout/menu/classicalMenu.vue

@@ -37,6 +37,7 @@
 		<a-layout>
 			<div id="snowyHeader" class="snowy-header">
 				<div class="snowy-header-left xn-pl0">
+          <img style="height: 40px; margin-left: 10px" src="/img/logo.png"/>
 					<div v-if="!isMobile" class="panel-item hidden-sm-and-down" @click="menuIsCollapseClick">
 						<MenuUnfoldOutlined v-if="menuIsCollapse" />
 						<MenuFoldOutlined v-else />

+ 1 - 0
snowy-admin-web/src/layout/menu/doubleRowMenu.vue

@@ -47,6 +47,7 @@
 		<a-layout>
 			<div id="snowyHeader" class="snowy-header">
 				<div class="snowy-header-left xn-pl0">
+          <img style="height: 40px; margin-left: 10px" src="/img/logo.png"/>
 					<moduleMenu v-if="moduleMenuShow" @switchModule="switchModule" />
 				</div>
 				<div class="snowy-header-right">

+ 184 - 0
snowy-admin-web/src/layout/menu/singleWindowMenu.vue

@@ -0,0 +1,184 @@
+<template>
+	<a-layout>
+    <template v-if="isMobile">
+      <!-- 手机端情况下的左侧菜单 -->
+      <Side-m />
+      <!-- 右侧布局 -->
+      <a-layout>
+        <div id="snowyHeader" class="snowy-header">
+          <div class="snowy-header-left xn-pl0">
+            <img style="height: 40px; margin-left: 10px" src="/img/logo.png"/>
+            <moduleMenu v-if="moduleMenuShow" @switchModule="switchModule" />
+          </div>
+          <div class="snowy-header-right">
+            <user-bar />
+          </div>
+        </div>
+        <a-layout-content class="main-content-wrapper">
+          <div id="admin-ui-main" class="admin-ui-main">
+            <router-view v-slot="{ Component }">
+              <keep-alive :include="kStore.keepLiveRoute">
+                <component :is="Component" v-if="kStore.routeShow" :key="route.name" />
+              </keep-alive>
+            </router-view>
+            <iframe-view />
+            <div v-if="footerCopyrightOpen" class="main-bottom-wrapper">
+              <a class="xn-color-a0a0a0" :href="sysBaseConfig.SNOWY_SYS_COPYRIGHT_URL" target="_blank">{{
+                  sysBaseConfig.SNOWY_SYS_COPYRIGHT
+                }}</a>
+            </div>
+          </div>
+        </a-layout-content>
+      </a-layout>
+    </template>
+    <template v-else>
+      <a-layout-sider
+        :collapsed="menuIsCollapse"
+        :trigger="null"
+        collapsible
+        :theme="sideTheme"
+        width="210"
+      >
+        <header id="snowyHeaderLogo" class="snowy-header-logo">
+          <div class="snowy-header-left">
+            <div class="logo-bar">
+              <img class="logo" :src="sysBaseConfig.SNOWY_SYS_LOGO" />
+              <span>{{ sysBaseConfig.SNOWY_SYS_NAME }}</span>
+            </div>
+          </div>
+        </header>
+        <div :class="menuIsCollapse ? 'admin-ui-side isCollapse' : 'admin-ui-side'">
+          <div class="admin-ui-side-scroll">
+            <a-menu
+              v-bind:openKeys="openKeys"
+              v-bind:selectedKeys="selectedKeys"
+              :theme="sideTheme"
+              mode="inline"
+              @select="onSelect"
+              @openChange="onOpenChange"
+            >
+              <NavMenu :nav-menus="menu" />
+            </a-menu>
+          </div>
+        </div>
+      </a-layout-sider>
+      <!-- 右侧布局 -->
+      <a-layout>
+        <div id="snowyHeader" class="snowy-header">
+          <div class="snowy-header-left xn-pl0">
+            <div v-if="!isMobile" class="panel-item hidden-sm-and-down" @click="menuIsCollapseClick">
+              <MenuUnfoldOutlined v-if="menuIsCollapse" />
+              <MenuFoldOutlined v-else />
+            </div>
+            <moduleMenu v-if="moduleMenuShow" @switchModule="switchModule" />
+          </div>
+          <div class="snowy-header-right">
+            <user-bar />
+          </div>
+        </div>
+        <Breadcrumb v-if="!isMobile && breadcrumbOpen" />
+        <!-- 多标签 -->
+        <Tags v-if="!isMobile && layoutTagsOpen" />
+        <a-layout-content class="main-content-wrapper">
+          <div id="admin-ui-main" class="admin-ui-main">
+            <router-view v-slot="{ Component }">
+              <keep-alive :include="kStore.keepLiveRoute">
+                <component :is="Component" v-if="kStore.routeShow" :key="route.name" />
+              </keep-alive>
+            </router-view>
+            <iframe-view />
+            <div v-if="footerCopyrightOpen" class="main-bottom-wrapper">
+              <a class="xn-color-a0a0a0" :href="sysBaseConfig.SNOWY_SYS_COPYRIGHT_URL" target="_blank">{{
+                  sysBaseConfig.SNOWY_SYS_COPYRIGHT
+                }}</a>
+            </div>
+          </div>
+        </a-layout-content>
+      </a-layout>
+    </template>
+	</a-layout>
+</template>
+
+<script setup>
+	import { useRoute } from 'vue-router'
+	const route = useRoute()
+
+	import UserBar from '@/layout/components/userbar.vue'
+	import Tags from '@/layout/components/tags.vue'
+	import SideM from '@/layout/components/sideM.vue'
+	import NavMenu from '@/layout/components/NavMenu.vue'
+	import ModuleMenu from '@/layout/components/moduleMenu.vue'
+	import IframeView from '@/layout/components/iframeView.vue'
+	import Breadcrumb from '@/layout/components/breadcrumb.vue'
+
+	const props = defineProps({
+		layout: { type: String }, // 布局信息
+		isMobile: { type: Boolean }, // 是否移动端
+		menuIsCollapse: { type: Boolean }, // 菜单是否折叠
+		sideTheme: { type: String },
+		sysBaseConfig: { type: Object },
+		openKeys: { type: Array },
+		selectedKeys: { type: Array },
+		menu: { type: Array }, // 菜单
+		breadcrumbOpen: { type: Boolean }, //面包屑
+		layoutTagsOpen: { type: Boolean },
+		kStore: { type: Object }, // 获取的仓库数据
+		footerCopyrightOpen: { type: Boolean }, //页脚版权信息
+		moduleMenuShow: { type: Boolean }
+	})
+
+	const emit = defineEmits(['onSelect', 'onOpenChange', 'switchModule', 'menuIsCollapseClick'])
+	const onSelect = (obj) => {
+		emit('onSelect', obj)
+	}
+	const onOpenChange = (keys) => {
+		emit('onOpenChange', keys)
+	}
+	const switchModule = (id) => {
+		emit('switchModule', id)
+	}
+	const menuIsCollapseClick = () => {
+		emit('menuIsCollapseClick')
+	}
+</script>
+<style lang="less" scoped>
+	.xn-color-fff {
+		color: #fff;
+	}
+	.xn-pdl25 {
+		padding-left: 11px;
+	}
+	.xn-menu-line {
+		text-align: center;
+		height: auto;
+		line-height: 20px;
+		flex: none;
+		display: block;
+		padding: 12px 0 !important;
+	}
+	.xn-navmenu-line {
+		min-width: 0;
+		flex: 1 1 0%;
+		overflow: hidden;
+	}
+	.xn-bb0 {
+		border-bottom: none;
+		position: relative;
+	}
+	.ant-layout-content {
+		display: flex;
+		flex-direction: column;
+	}
+	.xn-pd1180 {
+		padding: 10px 150px 0 150px;
+	}
+	.xn-pd050 {
+		padding: 0 50px;
+	}
+	.xn-pl10 {
+		padding-left: 10px;
+	}
+	.xn-mg050 {
+		margin: 0px 150px;
+	}
+</style>

+ 1 - 0
snowy-admin-web/src/layout/menu/topMenu.vue

@@ -3,6 +3,7 @@
 		<a-layout class="layout">
 			<div id="snowyHeader" class="snowy-header top-snowy-header xn-pd050">
 				<div class="snowy-header-left xn-pl0">
+          <img style="height: 40px; margin-left: 10px" src="/img/logo.png"/>
 					<header id="snowyHeaderLogo" class="snowy-header-logo">
 						<div class="snowy-header-left">
 							<div class="logo-bar">

+ 1 - 1
snowy-admin-web/src/router/index.js

@@ -186,7 +186,7 @@ const filterAsyncRouter = (routerMap) => {
 		// MAP转路由对象
 		const route = {
 			path: item.path,
-			name: item.name,
+			name: item.id,
 			meta: item.meta,
 			redirect: item.redirect,
 			children: item.children ? filterAsyncRouter(item.children) : null,

BIN
snowy-admin-web/src/views/auth/temp/temp.png


+ 37 - 0
snowy-admin-web/src/views/auth/temp/temp.vue

@@ -0,0 +1,37 @@
+<template>
+  <div class="main">
+    <img class="img" src="./temp.png" />
+    <div class="text">敬请期待</div>
+    <div class="text2">程序员正在开发建设中</div>
+  </div>
+</template>
+
+<script setup name="Temp">
+</script>
+
+<style scoped lang="less">
+.main {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  width: 100%;
+  height: 100%;
+  .text {
+    font-family: MicrosoftYaHei;
+    font-size: 18px;
+    font-weight: normal;
+    font-stretch: normal;
+    letter-spacing: 0px;
+    color: #409eff;
+  }
+  .text2 {
+    font-family: MicrosoftYaHei;
+    font-size: 14px;
+    font-weight: normal;
+    font-stretch: normal;
+    letter-spacing: 0px;
+    color: #999999;
+  }
+}
+</style>

+ 2 - 2
snowy-admin-web/src/views/sys/resource/menu/form.vue

@@ -82,10 +82,10 @@
 					<a-form-item name="name">
 						<template #label>
 							<a-tooltip>
-								<template #title> 按规范可设置为代码组件文件夹名称,注:首字母无反斜杠哦! </template>
+								<template #title> 按规范可设置为代码组件文件夹名称,注:首字母无反斜杠哦!<br/>(前端路由的name,为了避免重复导致页面404,取值已由name替换为id) </template>
 								<question-circle-outlined />
 							</a-tooltip>
-							&nbsp 别名:
+							&nbsp 别名(唯一)
 						</template>
 						<a-input
 							v-model:value="formData.name"