feat:新增版权显示控制

This commit is contained in:
秋帆
2024-06-02 11:24:44 +08:00
parent 4765d8f3cf
commit 0f3d927f98
6 changed files with 37 additions and 50 deletions

View File

@@ -12,10 +12,10 @@ const appStore = useAppStore()
<style lang="scss" scoped> <style lang="scss" scoped>
.gi-footer { .gi-footer {
height: 50px; height: 40px;
font-size: 12px; font-size: 13px;
color: var(--color-text-3); color: var(--color-text-3);
margin-top: 12px; background-color: var(--color-bg-1);
border-top: 1px dashed var(--color-neutral-3); border-top: 1px dashed var(--color-neutral-3);
box-sizing: border-box; box-sizing: border-box;
display: flex; display: flex;

View File

@@ -8,5 +8,6 @@
"menuCollapse": true, "menuCollapse": true,
"menuAccordion": true, "menuAccordion": true,
"menuDark": false, "menuDark": false,
"copyrightDisplay": false,
"layout": "left" "layout": "left"
} }

View File

@@ -5,6 +5,7 @@
<Header></Header> <Header></Header>
<Tabs></Tabs> <Tabs></Tabs>
<Main></Main> <Main></Main>
<GiFooter v-if="appStore.copyrightDisplay" />
</a-layout> </a-layout>
</a-layout> </a-layout>
</template> </template>
@@ -14,8 +15,11 @@ import Asider from './components/Asider/index.vue'
import Header from './components/Header/index.vue' import Header from './components/Header/index.vue'
import Main from './components/Main.vue' import Main from './components/Main.vue'
import Tabs from './components/Tabs/index.vue' import Tabs from './components/Tabs/index.vue'
import GiFooter from '@/components/GiFooter/index.vue'
import { useAppStore } from '@/stores'
defineOptions({ name: 'LayoutDefault' }) defineOptions({ name: 'LayoutDefault' })
const appStore = useAppStore()
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@@ -25,6 +29,7 @@ defineOptions({ name: 'LayoutDefault' })
.layout-default { .layout-default {
flex-direction: row; flex-direction: row;
&-right { &-right {
overflow: hidden; overflow: hidden;
} }

View File

@@ -1,11 +1,7 @@
<template> <template>
<div class="layout-mix"> <div class="layout-mix">
<section <section v-if="isDesktop" class="layout-mix-left" :class="{ 'app-menu-dark': appStore.menuDark }"
v-if="isDesktop" :style="appStore.menuDark ? appStore.themeCSSVar : undefined">
class="layout-mix-left"
:class="{ 'app-menu-dark': appStore.menuDark }"
:style="appStore.menuDark ? appStore.themeCSSVar : undefined"
>
<Logo :collapsed="appStore.menuCollapse"></Logo> <Logo :collapsed="appStore.menuCollapse"></Logo>
<Menu :menus="leftMenus" :menu-style="{ width: '200px', flex: 1 }"></Menu> <Menu :menus="leftMenus" :menu-style="{ width: '200px', flex: 1 }"></Menu>
</section> </section>
@@ -13,14 +9,8 @@
<section class="layout-mix-right"> <section class="layout-mix-right">
<header class="header"> <header class="header">
<MenuFoldBtn></MenuFoldBtn> <MenuFoldBtn></MenuFoldBtn>
<a-menu <a-menu v-if="isDesktop" mode="horizontal" :selected-keys="activeMenu" :auto-open-selected="false"
v-if="isDesktop" :trigger-props="{ animationName: 'slide-dynamic-origin' }" @menu-item-click="onMenuItemClick">
mode="horizontal"
:selected-keys="activeMenu"
:auto-open-selected="false"
:trigger-props="{ animationName: 'slide-dynamic-origin' }"
@menu-item-click="onMenuItemClick"
>
<a-menu-item v-for="item in topMenus" :key="item.path"> <a-menu-item v-for="item in topMenus" :key="item.path">
<template #icon> <template #icon>
<GiSvgIcon :name="getMenuIcon(item)" :size="24" /> <GiSvgIcon :name="getMenuIcon(item)" :size="24" />
@@ -33,6 +23,7 @@
<Tabs></Tabs> <Tabs></Tabs>
<Main></Main> <Main></Main>
<GiFooter v-if="appStore.copyrightDisplay" />
</section> </section>
</div> </div>
</template> </template>
@@ -46,6 +37,7 @@ import Menu from './components/Menu/index.vue'
import HeaderRightBar from './components/HeaderRightBar/index.vue' import HeaderRightBar from './components/HeaderRightBar/index.vue'
import Logo from './components/Logo.vue' import Logo from './components/Logo.vue'
import MenuFoldBtn from './components/MenuFoldBtn.vue' import MenuFoldBtn from './components/MenuFoldBtn.vue'
import GiFooter from '@/components/GiFooter/index.vue'
import { useAppStore, useRouteStore } from '@/stores' import { useAppStore, useRouteStore } from '@/stores'
import { isExternal } from '@/utils/validate' import { isExternal } from '@/utils/validate'
import { filterTree } from '@/utils' import { filterTree } from '@/utils'
@@ -111,15 +103,18 @@ watch(
} }
:deep(.arco-menu.arco-menu-vertical.arco-menu-collapsed) { :deep(.arco-menu.arco-menu-vertical.arco-menu-collapsed) {
// Menu菜单组件修改 // Menu菜单组件修改
.arco-menu-icon { .arco-menu-icon {
margin-right: 0; margin-right: 0;
padding: 10px 0; padding: 10px 0;
} }
.arco-menu-has-icon { .arco-menu-has-icon {
padding: 0; padding: 0;
justify-content: center; justify-content: center;
} }
.arco-menu-title { .arco-menu-title {
display: none; display: none;
} }
@@ -128,8 +123,10 @@ watch(
:deep(.arco-menu-horizontal) { :deep(.arco-menu-horizontal) {
flex: 1; flex: 1;
overflow: hidden; overflow: hidden;
.arco-menu-inner { .arco-menu-inner {
padding-left: 0; padding-left: 0;
.arco-menu-overflow-wrap { .arco-menu-overflow-wrap {
white-space: nowrap; white-space: nowrap;
} }
@@ -141,6 +138,7 @@ watch(
display: flex; display: flex;
align-items: stretch; align-items: stretch;
overflow: hidden; overflow: hidden;
&-left { &-left {
border-right: 1px solid var(--color-border); border-right: 1px solid var(--color-border);
background-color: var(--color-bg-1); background-color: var(--color-bg-1);
@@ -148,6 +146,7 @@ watch(
flex-direction: column; flex-direction: column;
overflow: hidden; overflow: hidden;
} }
&-right { &-right {
flex: 1; flex: 1;
display: flex; display: flex;

View File

@@ -6,22 +6,16 @@
<a-space> <a-space>
<a-badge> <a-badge>
<template #content> <template #content>
<icon-check-circle-fill <icon-check-circle-fill v-if="appStore.layout === 'left'" style="color: rgb(var(--success-6))"
v-if="appStore.layout === 'left'" :size="16"></icon-check-circle-fill>
style="color: rgb(var(--success-6))"
:size="16"
></icon-check-circle-fill>
</template> </template>
<LayoutItem mode="left" @click="appStore.layout = 'left'"></LayoutItem> <LayoutItem mode="left" @click="appStore.layout = 'left'"></LayoutItem>
<p class="layout-text">默认布局</p> <p class="layout-text">默认布局</p>
</a-badge> </a-badge>
<a-badge> <a-badge>
<template #content> <template #content>
<icon-check-circle-fill <icon-check-circle-fill v-if="appStore.layout === 'mix'" :size="16"
v-if="appStore.layout === 'mix'" style="color: rgb(var(--success-6))"></icon-check-circle-fill>
:size="16"
style="color: rgb(var(--success-6))"
></icon-check-circle-fill>
</template> </template>
<LayoutItem mode="mix" @click="appStore.layout = 'mix'"></LayoutItem> <LayoutItem mode="mix" @click="appStore.layout = 'mix'"></LayoutItem>
<p class="layout-text">混合布局</p> <p class="layout-text">混合布局</p>
@@ -31,13 +25,8 @@
<a-divider orientation="center">系统主题</a-divider> <a-divider orientation="center">系统主题</a-divider>
<a-row justify="center"> <a-row justify="center">
<ColorPicker <ColorPicker theme="dark" :color="appStore.themeColor" :sucker-hide="true" :colors-default="defaultColorList"
theme="dark" @change-color="changeColor"></ColorPicker>
:color="appStore.themeColor"
:sucker-hide="true"
:colors-default="defaultColorList"
@change-color="changeColor"
></ColorPicker>
</a-row> </a-row>
<a-divider orientation="center">界面显示</a-divider> <a-divider orientation="center">界面显示</a-divider>
@@ -47,27 +36,16 @@
<a-switch v-model="appStore.tab" /> <a-switch v-model="appStore.tab" />
</a-descriptions-item> </a-descriptions-item>
<a-descriptions-item label="页签风格"> <a-descriptions-item label="页签风格">
<a-select <a-select v-model="appStore.tabMode" placeholder="请选择" :options="tabModeList" :disabled="!appStore.tab"
v-model="appStore.tabMode" :trigger-props="{ autoFitPopupMinWidth: true }" :style="{ width: '120px' }">
placeholder="请选择"
:options="tabModeList"
:disabled="!appStore.tab"
:trigger-props="{ autoFitPopupMinWidth: true }"
:style="{ width: '120px' }"
>
</a-select> </a-select>
</a-descriptions-item> </a-descriptions-item>
<a-descriptions-item label="动画显示"> <a-descriptions-item label="动画显示">
<a-switch v-model="appStore.animate" /> <a-switch v-model="appStore.animate" />
</a-descriptions-item> </a-descriptions-item>
<a-descriptions-item label="动画显示"> <a-descriptions-item label="动画显示">
<a-select <a-select v-model="appStore.animateMode" placeholder="请选择" :options="animateModeList"
v-model="appStore.animateMode" :disabled="!appStore.animate" :style="{ width: '120px' }">
placeholder="请选择"
:options="animateModeList"
:disabled="!appStore.animate"
:style="{ width: '120px' }"
>
</a-select> </a-select>
</a-descriptions-item> </a-descriptions-item>
<a-descriptions-item label="深色菜单"> <a-descriptions-item label="深色菜单">
@@ -76,6 +54,9 @@
<a-descriptions-item label="手风琴效果"> <a-descriptions-item label="手风琴效果">
<a-switch v-model="appStore.menuAccordion" /> <a-switch v-model="appStore.menuAccordion" />
</a-descriptions-item> </a-descriptions-item>
<a-descriptions-item label="版权显示">
<a-switch v-model="appStore.copyrightDisplay" />
</a-descriptions-item>
</a-descriptions> </a-descriptions>
</a-space> </a-space>
</a-drawer> </a-drawer>
@@ -139,7 +120,7 @@ type ColorObj = {
// 改变主题色 // 改变主题色
const changeColor = (colorObj: ColorObj) => { const changeColor = (colorObj: ColorObj) => {
if (!/^#[0-9A-Za-z]{6}/.test(colorObj.hex)) return if (!/^#[0-9A-Z]{6}/i.test(colorObj.hex)) return
appStore.setThemeColor(colorObj.hex) appStore.setThemeColor(colorObj.hex)
} }
</script> </script>

1
src/types/app.d.ts vendored
View File

@@ -9,6 +9,7 @@ declare namespace App {
animateMode: AnimateType // 动画类名 animateMode: AnimateType // 动画类名
menuCollapse: boolean // 左侧菜单折叠状态 menuCollapse: boolean // 左侧菜单折叠状态
menuAccordion: boolean // 左侧菜单手风琴效果 menuAccordion: boolean // 左侧菜单手风琴效果
copyrightDisplay: boolean // 是否显示底部版权信息
menuDark: boolean // 菜单深色模式 menuDark: boolean // 菜单深色模式
layout: 'left' | 'mix' layout: 'left' | 'mix'
} }