main
向文可 4 years ago
parent 444562e794
commit 170d05b005

@ -1,9 +1,32 @@
<template> <template>
<div id="app"> <el-config-provider
<router-view /> :locale="config.locale"
</div> :size="config.size"
:z-index="config.zIndex"
:button="config.button"
:message="config.message"
>
<LayoutDefault />
</el-config-provider>
</template> </template>
<script setup></script> <script setup>
import LayoutDefault from '@/layouts/default.vue';
<style lang="less"></style> import zh from 'element-plus/lib/locale/lang/zh-cn';
const config = reactive({
locale: zh,
size: 'small',
zIndex: 300,
button: {
autoInsertSpace: true,
},
message: {
max: 5,
},
});
</script>
<style lang="less">
@import url('@/styles/base.less');
</style>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

After

Width:  |  Height:  |  Size: 9.0 KiB

@ -5,7 +5,17 @@
declare module 'vue' { declare module 'vue' {
export interface GlobalComponents { export interface GlobalComponents {
ElButton: typeof import('element-plus/es')['ElButton'] ElButton: typeof import('element-plus/es')['ElButton']
ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
ElDivider: typeof import('element-plus/es')['ElDivider']
ElIcon: typeof import('element-plus/es')['ElIcon'] ElIcon: typeof import('element-plus/es')['ElIcon']
ElMenu: typeof import('element-plus/es')['ElMenu']
ElMenuItem: typeof import('element-plus/es')['ElMenuItem']
ElMenuItemGroup: typeof import('element-plus/es')['ElMenuItemGroup']
ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
ElSubMenu: typeof import('element-plus/es')['ElSubMenu']
ElTabPane: typeof import('element-plus/es')['ElTabPane']
ElTabs: typeof import('element-plus/es')['ElTabs']
XIcon: typeof import('./components/XIcon.vue')['default'] XIcon: typeof import('./components/XIcon.vue')['default']
} }
} }

@ -33,7 +33,7 @@
setup(props) { setup(props) {
const symbolId = computed(() => `#icon-${props.name}`); const symbolId = computed(() => `#icon-${props.name}`);
const size = computed(() => const size = computed(() =>
typeof new Number(props.size) !== Number.NaN ? props.size + 'px' : props.size Number.isNaN(new Number(props.size).valueOf()) ? props.size : props.size + 'px'
); );
const isRemix = computed(() => props.name.indexOf('-') !== -1 || props.isCustomSvg); const isRemix = computed(() => props.name.indexOf('-') !== -1 || props.isCustomSvg);
return { return {
@ -50,6 +50,8 @@
.x-icon { .x-icon {
font-size: v-bind(size); font-size: v-bind(size);
color: v-bind(color); color: v-bind(color);
line-height: 1;
vertical-align: middle;
} }
svg.x-icon { svg.x-icon {
width: v-bind(size); width: v-bind(size);

@ -1,107 +1,158 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="64px" height="64px" viewBox="0 0 64 64" enable-background="new 0 0 64 64" xml:space="preserve"> <image id="image0" width="64" height="64" x="0" y="0" <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="144px" height="144px" viewBox="0 0 144 144" enable-background="new 0 0 144 144" xml:space="preserve"> <image id="image0" width="144" height="144" x="0" y="0"
href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAACBjSFJN href="data:image/png;base64,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 RX6nSvb24WPsFW9UaDNn6TYR2ZF3SZYiiUR1d0TXY+zgqIaGCxGVpisqzG7YH4/DDzewf/ncm1Aw
bWFnaWNrLm9yZ7zPHZ0AAAAYdEVYdFRodW1iOjpEb2N1bWVudDo6UGFnZXMAMaf/uy8AAAAXdEVY 2RkAcBzAQmMD5v23MO+9gRw9qDvli4s0yz42pSTajmmONL559h8JYwDBhkLww8/YO52wtxlz+gSc
dFRodW1iOjpJbWFnZTo6SGVpZ2h0ADY0vOCphAAAABZ0RVh0VGh1bWI6OkltYWdlOjpXaWR0aAA2 OIK07tFmsPXo/qUCv8r8w086meBrEWUUniIswN4WlRN+/22oq9G/KytBLp3Xjs1YXPNQO0GsYR3I
NERPaQkAAAAZdEVYdFRodW1iOjpNaW1ldHlwZQBpbWFnZS9wbmc/slZOAAAAF3RFWHRUaHVtYjo6 PoH8pCOoDzIfhs6HuN29cOVrzLFD2BefRw7th9oqnV/asKpqEhxXNXO6ejSbmuncjrV6wpkA0t6M
TVRpbWUAMTY0NjY2Mjk3MSESB0sAAAASdEVYdFRodW1iOjpTaXplADU0ODFCQntNb0MAAABHdEVY /PZNzO/f0kJvspJseZn6gFMzKlP3qBfycwTaGIzXB+S4XrNZGHdqGrl5B1tXixxoh1PH4dgh7UnJ
dFRodW1iOjpVUkkAZmlsZTovLy9hcHAvdG1wL2ltYWdlbGMvaW1ndmlldzJfOV8xNjQ2NjUyNjM2 y9t4W2wshnu3S+fXMp3f8RvP8vNVEfb9tzGvvvQkeZJRVoK5fFFlY4bGtOsAdkV0tjVena9v6M2c
NDI4NDE1M18zMDJfWzBdJ4IKeAAAAABJRU5ErkJggg==" ></image> 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" />
</svg> </svg>

Before

Width:  |  Height:  |  Size: 8.2 KiB

After

Width:  |  Height:  |  Size: 12 KiB

@ -0,0 +1,60 @@
<template>
<el-scrollbar class="layout-aside">
<el-menu collapse>
<el-menu-item v-for="(item, index) in handleRoutes" :key="index" :index="item.name">
<XIcon :name="item.meta.icon" size="30" />
<p>{{ item.meta.title }}</p>
</el-menu-item>
</el-menu>
</el-scrollbar>
</template>
<script setup>
import routes from '@/router/route.json';
const handleRoutes = computed(() => routes);
const handleClick = () => {};
</script>
<style lang="less" scoped>
.layout-aside {
flex: 1;
width: @layout-aside-width;
height: 100%;
background-color: @color-black;
:deep(.el-scrollbar__view) {
height: 100%;
.el-menu {
--el-menu-bg-color: transparent;
--el-menu-text-color: @layout-aside-fc;
--el-menu-item-height: @layout-aside-item-size;
--el-menu-hover-bg-color: @layout-aside-fc2;
border-right: none;
width: 100%;
display: flex;
flex-direction: column;
align-items: center;
.el-menu-item {
flex-direction: column;
align-items: center;
justify-content: center;
padding: 0 !important;
border-radius: @layout-border-radius;
width: @layout-aside-item-size;
.x-icon {
margin-bottom: 10px;
}
P {
line-height: 1;
}
&.is-active {
background-color: var(--el-menu-active-color);
color: @layout-aside-fc;
}
+ .el-menu-item {
margin-top: 10px;
}
}
}
}
}
</style>

@ -0,0 +1,24 @@
<template>
<div class="layout-logo">
<XIcon name="msb" svg :size="size" />
</div>
</template>
<script setup>
import variables from '@/styles/globalVariables.module.less';
const size = variables.layoutLogoSize;
</script>
<style lang="less" scoped>
.layout-logo {
width: @layout-aside-width;
height: @layout-aside-width;
display: flex;
align-items: center;
justify-content: center;
background-color: @color-black;
.x-icon {
border-radius: @layout-border-radius;
}
}
</style>

@ -0,0 +1,27 @@
<template>
<el-scrollbar class="layout-main">
<router-view v-slot="{ Component }">
<transition mode="out-in" name="fade-transform">
<keep-alive>
<component :is="Component" />
</keep-alive>
</transition>
</router-view>
</el-scrollbar>
</template>
<script setup></script>
<style lang="less" scoped>
.layout-main {
:deep(.el-scrollbar__view) {
width: 100%;
height: 100%;
> * {
display: inline-block; // BFC
width: 100%;
height: 100%;
}
}
}
</style>

@ -0,0 +1,64 @@
<template>
<el-menu-item v-if="!menuItem.children?.length" :index="props.menuItem.name">
<XIcon :name="props.menuItem.meta.icon" size="20" />
<p>{{ props.menuItem.meta.title }}</p>
</el-menu-item>
<el-sub-menu v-else>
<template #title>
<XIcon :name="props.menuItem.meta.icon" size="20" />
<p>{{ props.menuItem.meta.title }}</p>
</template>
<MenuItem v-for="(item, index) in menuItem.children" :key="index" :menu-item="item" />
</el-sub-menu>
</template>
<script setup>
const props = defineProps({
menuItem: {
type: Object,
required: true,
},
});
</script>
<style lang="less" scoped>
.x-icon {
width: @layout-icon;
color: @layout-menu-ic;
}
.el-menu-item {
width: 100%;
min-width: unset;
border-radius: @layout-border-radius;
&:hover {
color: @layout-menu-hover-fc;
}
&.is-active {
background-color: @layout-menu-active-bgc;
color: @layout-menu-active-fc;
}
+ .el-menu-item {
margin-top: 5px;
}
}
.el-sub-menu {
border-radius: @layout-border-radius;
&.is-opened {
background-color: @color-ghost-black;
:deep(.el-sub-menu__title) {
background-color: @layout-menu-active-bgc;
}
}
:deep(.el-sub-menu__title) {
border-radius: @layout-border-radius;
margin-bottom: 5px;
}
+ .el-menu-item {
margin-top: 5px;
}
:deep(.el-menu) {
padding: 0 !important;
border-radius: @layout-border-radius;
}
}
</style>

@ -0,0 +1,53 @@
<template>
<el-scrollbar class="layout-menu">
<div class="title">马士兵严选后台管理平台</div>
<el-divider>test</el-divider>
<el-menu>
<MenuItem v-for="(item, index) in handleRoutes" :key="index" :menu-item="item" />
</el-menu>
</el-scrollbar>
</template>
<script setup>
import routes from '@/router/route.json';
import MenuItem from './menu-item.vue';
const handleRoutes = computed(() => routes[2].children);
const handleClick = () => {};
</script>
<style lang="less" scoped>
.layout-menu {
flex: 1;
width: @layout-menu-width;
height: 100%;
background-color: @layout-menu-bgc;
box-shadow: @layout-shadow;
padding: 0 @layout-space;
.title {
width: 100%;
height: @layout-header-height;
line-height: @layout-header-height;
font-size: @layout-h2;
color: @layout-menu-active-fc;
text-align: center;
.text-overflow();
}
.el-divider {
margin: @layout-space-small 0 @layout-space-large 0;
border-color: @layout-menu-hover-fc;
:deep(.el-divider__text) {
color: @layout-menu-active-fc;
background-color: @layout-menu-bgc;
}
}
:deep(.el-scrollbar__view) {
height: 100%;
.el-menu {
--el-menu-bg-color: transparent;
--el-menu-text-color: @layout-menu-fc;
--el-menu-hover-bg-color: @layout-menu-hover-bgc;
border-right: none;
}
}
}
</style>

@ -0,0 +1,40 @@
<template>
<div class="layout-container layout-default">
<div class="layout-left">
<LayoutLogo />
<LayoutAside />
</div>
<div class="layout-center">
<LayoutMenu />
</div>
<div class="layout-right">
<div class="layout-header"></div>
<LayoutMain />
</div>
</div>
</template>
<script setup>
import LayoutMain from './components/main.vue';
import LayoutLogo from './components/logo.vue';
import LayoutAside from './components/aside.vue';
import LayoutMenu from './components/menu.vue';
</script>
<style lang="less" scoped>
.layout-container {
width: 100%;
height: 100%;
}
.layout-default {
display: flex;
.layout-left {
display: flex;
flex-direction: column;
box-shadow: @layout-shadow;
}
.layout-right {
flex: 1;
}
}
</style>

File diff suppressed because it is too large Load Diff

@ -0,0 +1,13 @@
html,
body,
#app {
width: 100vw;
height: 100vh;
}
// *:not([class^='el-']):not([class^='el-'] *) {
*:not([class^='el-']) {
margin: 0;
padding: 0;
transition: all 0.1s;
box-sizing: border-box;
}

@ -0,0 +1,50 @@
/* color */
@color-black: #282c34;
@color-white: #fff;
@color-primary: #409eff;
@color-primary-white: #e8f4ff;
@color-ghost-white: fade(@color-white, 10%);
@color-ghost-black: fade(@color-black, 10%);
/* mixin */
.text-overflow {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* layout */
@layout-icon: 30px;
@layout-h1: 30px;
@layout-h2: 20px;
@layout-h3: 16px;
@layout-h4: 14px;
@layout-border-radius: 5px;
@layout-space: 10px;
@layout-space-small: 5px;
@layout-space-large: 15px;
@layout-space-super: 20px;
@layout-shadow: fade(@color-black, 20%) 0px 0px 5px;
@layout-aside-bgc: @color-black;
@layout-aside-fc: @color-white;
@layout-aside-fc2: lighten(@color-black, 20%);
@layout-aside-width: 80px;
@layout-aside-item-size: 68px;
@layout-menu-width: 200px;
@layout-menu-bgc: lighten(@color-black, 20%);
@layout-menu-fc: darken(@color-white, 20%);
@layout-menu-ic: darken(@color-white, 20%);
@layout-menu-hover-bgc: lighten(@color-black, 25%);
@layout-menu-hover-fc: darken(@color-white, 10%);
@layout-menu-active-fc: @color-white;
@layout-menu-active-bgc: lighten(@color-black, 35%);
@layout-header-height: 68px;
:export {
layoutAsideWidth: @layout-aside-width;
layoutLogoSize: calc(@layout-aside-item-size * 0.8);
}

@ -1,14 +1,16 @@
<template> <template>
<div id="app"> <div class="container">
<h1> <h1>
<XIcon name="app-store" size="30" />
<span>马士兵严选</span> <span>马士兵严选</span>
<XIcon name="vue" svg color="red" size="30" />
<XIcon name="msb" svg size="30"></XIcon> <XIcon name="msb" svg size="30"></XIcon>
<XIcon name="app-store" size="30" /> <XIcon name="vue" svg color="red" size="30" />
</h1> </h1>
<p>count:{{ count }}, double count:{{ doubleCount }}</p> <p>count:{{ count }}, double count:{{ doubleCount }}</p>
<el-button type="primary" @click="handleAdd">add</el-button> <el-button type="primary" @click="handleAdd"></el-button>
<el-button type="danger" @click="handleClear">clear</el-button> <el-button type="danger" @click="handleClear"></el-button>
<br />
<el-date-picker></el-date-picker>
</div> </div>
</template> </template>
@ -24,4 +26,8 @@
}; };
</script> </script>
<style lang="less"></style> <style lang="less">
.container {
height: 1080px;
}
</style>

@ -75,5 +75,12 @@ export default ({ command, mode }: ConfigEnv): UserConfigExport => {
targets: ['defaults', 'not IE 11'], targets: ['defaults', 'not IE 11'],
}), }),
], ],
css: {
preprocessorOptions: {
less: {
javascriptEnabled: true,
},
},
},
}; };
}; };

Loading…
Cancel
Save