feat(projects): 主题配置:页面功能和页面显示

This commit is contained in:
Soybean 2021-09-07 18:08:07 +08:00
parent 1128ae1870
commit a0392b3d28
10 changed files with 129 additions and 47 deletions

View File

@ -1,2 +1,2 @@
export { UserInfo } from './business';
export { ThemeSettings, NavMode } from './theme';
export { ThemeSettings, NavMode, AnimateType } from './theme';

View File

@ -81,11 +81,18 @@ interface CrumbsStyle {
showIcon: boolean;
}
type AnimateType = keyof typeof EnumAnimate;
export type AnimateType = keyof typeof EnumAnimate;
interface AnimateTypeList {
value: AnimateType;
label: EnumAnimate;
}
interface PageStyle {
/** 页面是否开启动画 */
animate: boolean;
/** 动画类型 */
animateType: AnimateType;
/** 动画类型列表 */
animateTypeList: AnimateTypeList[];
}

View File

@ -1,22 +1,39 @@
<template>
<n-divider title-placement="center">界面功能</n-divider>
<n-space vertical size="large">
<div class="flex-y-center justify-between">
<span>分割菜单</span>
<setting-menu-item label="分割菜单">
<n-switch :value="theme.menuStyle.splitMenu" @update:value="handleSplitMenu" />
</div>
<div class="flex-y-center justify-between">
<span>固定头部</span>
</setting-menu-item>
<setting-menu-item label="固定头部">
<n-switch :value="theme.headerStyle.fixed" @update:value="handleFixedHeader" />
</div>
</setting-menu-item>
<setting-menu-item label="头部高度">
<n-input-number
class="w-120px"
size="small"
:value="theme.headerStyle.height"
:step="1"
@update:value="handleHeaderHeight"
/>
</setting-menu-item>
<setting-menu-item label="菜单展开宽度">
<n-input-number
class="w-120px"
size="small"
:value="theme.menuStyle.width"
:step="10"
@update:value="handleMenuWidth"
/>
</setting-menu-item>
</n-space>
</template>
<script lang="ts" setup>
import { NDivider, NSpace, NSwitch } from 'naive-ui';
import { NDivider, NSpace, NSwitch, NInputNumber } from 'naive-ui';
import { useThemeStore } from '@/store';
import { SettingMenuItem } from '../common';
const theme = useThemeStore();
const { handleSplitMenu, handleFixedHeader } = useThemeStore();
const { handleSplitMenu, handleFixedHeader, handleHeaderHeight, handleMenuWidth } = useThemeStore();
</script>
<style scoped></style>

View File

@ -1,8 +1,42 @@
<template>
<n-divider title-placement="center">界面显示</n-divider>
<n-space vertical size="large">
<setting-menu-item label="面包屑">
<n-switch :value="theme.crumbsStyle.visible" @update:value="handleCrumbsVisible" />
</setting-menu-item>
<setting-menu-item label="面包屑图标">
<n-switch :value="theme.crumbsStyle.showIcon" @update:value="handleCrumbsIconVisible" />
</setting-menu-item>
<setting-menu-item label="多标签">
<n-switch :value="theme.multiTabStyle.visible" @update:value="handleMultiTabVisible" />
</setting-menu-item>
<setting-menu-item label="页面切换动画">
<n-switch :value="theme.pageStyle.animate" @update:value="handlePageAnimate" />
</setting-menu-item>
<setting-menu-item label="页面切换动画类型">
<n-select
class="w-120px"
size="small"
:value="theme.pageStyle.animateType"
:options="theme.pageStyle.animateTypeList"
@update:value="handlePageAnimateType"
/>
</setting-menu-item>
</n-space>
</template>
<script lang="ts" setup>
import { NDivider } from 'naive-ui';
import { NDivider, NSpace, NSwitch, NSelect } from 'naive-ui';
import { useThemeStore } from '@/store';
import { SettingMenuItem } from '../common';
const theme = useThemeStore();
const {
handleCrumbsVisible,
handleCrumbsIconVisible,
handleMultiTabVisible,
handlePageAnimate,
handlePageAnimateType
} = useThemeStore();
</script>
<style scoped></style>

View File

@ -0,0 +1,16 @@
<template>
<div class="flex-y-center justify-between">
<span>{{ label }}</span>
<slot></slot>
</div>
</template>
<script lang="ts" setup>
defineProps({
label: {
type: String,
default: ''
}
});
</script>
<style scoped></style>

View File

@ -1,3 +1,4 @@
import ColorBlock from './ColorBlock.vue';
import SettingMenuItem from './SettingMenuItem.vue';
export { ColorBlock };
export { ColorBlock, SettingMenuItem };

View File

@ -1,5 +1,4 @@
import setupSmoothScroll from './smooth-scroll';
import setupNaive from './naive';
import setupWindicssDarkMode from './dark-mode';
export { setupSmoothScroll, setupNaive, setupWindicssDarkMode };
export { setupSmoothScroll, setupWindicssDarkMode };

View File

@ -1,30 +0,0 @@
import {
create,
NLayout,
NLayoutSider,
NLayoutHeader,
NLayoutContent,
NLayoutFooter,
NSpace,
NButton,
NDatePicker,
NInput
} from 'naive-ui';
import type { App } from 'vue';
export default function setupNaive(app: App) {
const naive = create({
components: [
NLayout,
NLayoutSider,
NLayoutHeader,
NLayoutContent,
NLayoutFooter,
NSpace,
NButton,
NDatePicker,
NInput
]
});
app.use(naive);
}

View File

@ -1,4 +1,5 @@
import type { ThemeSettings } from '@/interface';
import { EnumAnimate } from '@/enum';
const themeColorList = [
'#409EFF',
@ -36,7 +37,6 @@ const themeSettings: ThemeSettings = {
theme: 'light'
},
menuStyle: {
collapsed: false,
width: 200,
collapsedWidth: 64,
fixed: true,
@ -58,7 +58,15 @@ const themeSettings: ThemeSettings = {
},
pageStyle: {
animate: true,
animateType: 'zoom-fade'
animateType: 'zoom-fade',
animateTypeList: [
{ value: 'zoom-fade', label: EnumAnimate['zoom-fade'] },
{ value: 'zoom-out', label: EnumAnimate['zoom-out'] },
{ value: 'fade-slide', label: EnumAnimate['fade-slide'] },
{ value: 'fade', label: EnumAnimate.fade },
{ value: 'fade-bottom', label: EnumAnimate['fade-bottom'] },
{ value: 'fade-scale', label: EnumAnimate['fade-scale'] }
]
}
};

View File

@ -2,7 +2,7 @@ import { defineStore } from 'pinia';
import type { GlobalThemeOverrides } from 'naive-ui';
import { themeSettings } from '@/settings';
import { store } from '@/store';
import type { ThemeSettings, NavMode } from '@/interface';
import type { ThemeSettings, NavMode, AnimateType } from '@/interface';
import { getHoverAndPressedColor } from './helpers';
type ThemeState = ThemeSettings;
@ -69,9 +69,39 @@ const themeStore = defineStore({
handleSplitMenu(isSplit: boolean) {
this.menuStyle.splitMenu = isSplit;
},
/** 更改菜单展开的宽度 */
handleMenuWidth(width: number) {
this.menuStyle.width = width;
},
/** 更改头部的高度(不包含tab标签) */
handleHeaderHeight(height: number) {
this.headerStyle.height = height;
},
/** 固定头部 */
handleFixedHeader(isFixed: boolean) {
this.headerStyle.fixed = isFixed;
},
/** 设置多标签的显示 */
handleMultiTabVisible(visible: boolean) {
this.multiTabStyle.visible = visible;
},
/** 设置面包屑的显示 */
handleCrumbsVisible(visible: boolean) {
this.crumbsStyle.visible = visible;
},
/** 设置面包屑图标的显示 */
handleCrumbsIconVisible(visible: boolean) {
this.crumbsStyle.showIcon = visible;
},
/** 开启页面切换动画 */
handlePageAnimate(animate: boolean) {
this.pageStyle.animate = animate;
},
/** 设置页面切换动画类型 */
handlePageAnimateType(animateType: AnimateType) {
if (this.pageStyle.animate) {
this.pageStyle.animateType = animateType;
}
}
}
});