feat(Component): Setting component add copy button

This commit is contained in:
陈凯龙 2022-01-21 17:16:56 +08:00
parent ff4dd3afbf
commit e496096539
9 changed files with 142 additions and 20 deletions

View File

@ -1,5 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import { ElDrawer, ElDivider } from 'element-plus' import { ElDrawer, ElDivider, ElButton, ElMessage } from 'element-plus'
import { ref, unref, computed, watch } from 'vue' import { ref, unref, computed, watch } from 'vue'
import { useI18n } from '@/hooks/web/useI18n' import { useI18n } from '@/hooks/web/useI18n'
import { ThemeSwitch } from '@/components/ThemeSwitch' import { ThemeSwitch } from '@/components/ThemeSwitch'
@ -10,6 +10,8 @@ import { trim, setCssVar } from '@/utils'
import ColorRadioPicker from './components/ColorRadioPicker.vue' import ColorRadioPicker from './components/ColorRadioPicker.vue'
import InterfaceDisplay from './components/InterfaceDisplay.vue' import InterfaceDisplay from './components/InterfaceDisplay.vue'
import LayoutRadioPicker from './components/LayoutRadioPicker.vue' import LayoutRadioPicker from './components/LayoutRadioPicker.vue'
import { useCache } from '@/hooks/web/useCache'
import { useClipboard } from '@vueuse/core'
const appStore = useAppStore() const appStore = useAppStore()
@ -100,6 +102,84 @@ watch(
} }
} }
) )
//
const copyConfig = async () => {
const { copy, copied } = useClipboard({
source: `
//
breadcrumb: ${appStore.getBreadcrumb},
//
breadcrumbIcon: ${appStore.getBreadcrumbIcon},
//
hamburger: ${appStore.getHamburger},
//
screenfull: ${appStore.getScreenfull},
//
size: ${appStore.getSize},
//
locale: ${appStore.getLocale},
//
tagsView: ${appStore.getTagsView},
// logo
logo: ${appStore.getLogo},
// header
fixedHeader: ${appStore.getFixedHeader},
//
greyMode: ${appStore.getGreyMode},
// layout
layout: '${appStore.getLayout}',
//
isDark: ${appStore.getIsDark},
//
currentSize: '${appStore.getCurrentSize}',
//
theme: {
//
elColorPrimary: '${appStore.getTheme.elColorPrimary}',
//
leftMenuBorderColor: '${appStore.getTheme.leftMenuBorderColor}',
//
leftMenuBgColor: '${appStore.getTheme.leftMenuBgColor}',
//
leftMenuBgLightColor: '${appStore.getTheme.leftMenuBgLightColor}',
//
leftMenuBgActiveColor: '${appStore.getTheme.leftMenuBgActiveColor}',
//
leftMenuCollapseBgActiveColor: '${appStore.getTheme.leftMenuCollapseBgActiveColor}',
//
leftMenuTextColor: '${appStore.getTheme.leftMenuTextColor}',
//
leftMenuTextActiveColor: '${appStore.getTheme.leftMenuTextActiveColor}',
// logo
logoTitleTextColor: '${appStore.getTheme.logoTitleTextColor}',
// logo
logoBorderColor: '${appStore.getTheme.logoBorderColor}',
//
topHeaderBgColor: '${appStore.getTheme.topHeaderBgColor}',
//
topHeaderTextColor: '${appStore.getTheme.topHeaderTextColor}',
//
topHeaderHoverColor: '${appStore.getTheme.topHeaderHoverColor}',
//
topToolBorderColor: '${appStore.getTheme.topToolBorderColor}'
}
`
})
await copy()
if (unref(copied)) {
ElMessage.success(t('setting.copySuccess'))
}
}
//
const clear = () => {
const { wsCache } = useCache()
wsCache.delete('layout')
wsCache.delete('theme')
wsCache.delete('isDark')
window.location.reload()
}
</script> </script>
<template> <template>
@ -181,6 +261,16 @@ watch(
<!-- 界面显示 --> <!-- 界面显示 -->
<ElDivider>{{ t('setting.interfaceDisplay') }}</ElDivider> <ElDivider>{{ t('setting.interfaceDisplay') }}</ElDivider>
<InterfaceDisplay /> <InterfaceDisplay />
<ElDivider />
<div>
<ElButton type="primary" class="w-full" @click="copyConfig">{{ t('setting.copy') }}</ElButton>
</div>
<div class="mt-5px">
<ElButton type="danger" class="w-full" @click="clear">
{{ t('setting.clearAndReset') }}
</ElButton>
</div>
</ElDrawer> </ElDrawer>
</template> </template>

View File

@ -37,7 +37,6 @@ export default defineComponent({
(routers: AppRouteRecordRaw[]) => { (routers: AppRouteRecordRaw[]) => {
initTabMap(routers) initTabMap(routers)
filterMenusPath(routers, routers) filterMenusPath(routers, routers)
console.log(tabPathMap)
}, },
{ {
immediate: true, immediate: true,

View File

@ -15,9 +15,8 @@ export interface AppState {
tagsView: boolean tagsView: boolean
logo: boolean logo: boolean
fixedHeader: boolean fixedHeader: boolean
fixedMenu: boolean
greyMode: boolean greyMode: boolean
pageLoading: boolean
layout: LayoutType layout: LayoutType
title: string title: string
userInfo: string userInfo: string
@ -29,6 +28,12 @@ export interface AppState {
} }
export const appModules: AppState = { export const appModules: AppState = {
userInfo: 'userInfo', // 登录信息存储字段-建议每个项目换一个字段,避免与其他项目冲突
sizeMap: ['default', 'large', 'small'],
mobile: false, // 是否是移动端
title: 'ButterflyAdmin', // 标题
pageLoading: false, // 路由跳转loading
breadcrumb: true, // 面包屑 breadcrumb: true, // 面包屑
breadcrumbIcon: true, // 面包屑图标 breadcrumbIcon: true, // 面包屑图标
collapse: false, // 折叠菜单 collapse: false, // 折叠菜单
@ -39,16 +44,11 @@ export const appModules: AppState = {
tagsView: true, // 标签页 tagsView: true, // 标签页
logo: true, // logo logo: true, // logo
fixedHeader: true, // 固定toolheader fixedHeader: true, // 固定toolheader
fixedMenu: false, // 固定切割菜单
greyMode: false, // 是否开始灰色模式,用于特殊悼念日 greyMode: false, // 是否开始灰色模式,用于特殊悼念日
layout: wsCache.get('layout') || 'classic', // layout布局 layout: wsCache.get('layout') || 'classic', // layout布局
title: 'ButterflyAdmin', // 标题
userInfo: 'userInfo', // 登录信息存储字段-建议每个项目换一个字段,避免与其他项目冲突
isDark: wsCache.get('isDark') || false, // 是否是暗黑模式 isDark: wsCache.get('isDark') || false, // 是否是暗黑模式
currentSize: wsCache.get('default') || 'default', // 组件尺寸 currentSize: wsCache.get('default') || 'default', // 组件尺寸
sizeMap: ['default', 'large', 'small'],
mobile: false, // 是否是移动端
theme: wsCache.get('theme') || { theme: wsCache.get('theme') || {
// 主题色 // 主题色
elColorPrimary: '#409eff', elColorPrimary: '#409eff',

View File

@ -0,0 +1,18 @@
import { useAppStoreWithOut } from '@/store/modules/app'
const appStore = useAppStoreWithOut()
export const usePageLoading = () => {
const loadStart = () => {
appStore.setPageLoading(true)
}
const loadDone = () => {
appStore.setPageLoading(false)
}
return {
loadStart,
loadDone
}
}

View File

@ -10,6 +10,8 @@ import { ElScrollbar } from 'element-plus'
const appStore = useAppStore() const appStore = useAppStore()
const pageLoading = computed(() => appStore.getPageLoading)
// 标签页 // 标签页
const tagsView = computed(() => appStore.getTagsView) const tagsView = computed(() => appStore.getTagsView)
@ -60,6 +62,7 @@ export const useRenderLayout = () => {
style="transition: all var(--transition-time-02);" style="transition: all var(--transition-time-02);"
> >
<ElScrollbar <ElScrollbar
v-loading={pageLoading.value}
class={[ class={[
'v-content', 'v-content',
{ {
@ -119,6 +122,7 @@ export const useRenderLayout = () => {
style="transition: all var(--transition-time-02);" style="transition: all var(--transition-time-02);"
> >
<ElScrollbar <ElScrollbar
v-loading={pageLoading.value}
class={[ class={[
'v-content', 'v-content',
{ {
@ -161,6 +165,7 @@ export const useRenderLayout = () => {
</div> </div>
<div class="v-app-right h-full w-full"> <div class="v-app-right h-full w-full">
<ElScrollbar <ElScrollbar
v-loading={pageLoading.value}
class={[ class={[
'v-content', 'v-content',
{ {
@ -212,6 +217,7 @@ export const useRenderLayout = () => {
style="transition: all var(--transition-time-02);" style="transition: all var(--transition-time-02);"
> >
<ElScrollbar <ElScrollbar
v-loading={pageLoading.value}
class={[ class={[
'v-content', 'v-content',
{ {
@ -232,7 +238,7 @@ export const useRenderLayout = () => {
!collapse.value && fixedHeader.value !collapse.value && fixedHeader.value
} }
]} ]}
style="transition: all var(--transition-time-02);" style="transition: width var(--transition-time-02), left var(--transition-time-02);"
></TagsView> ></TagsView>
) : undefined} ) : undefined}

View File

@ -38,7 +38,10 @@ export default {
greyMode: 'Grey mode', greyMode: 'Grey mode',
fixedHeader: 'Fixed header', fixedHeader: 'Fixed header',
headerTheme: 'Header theme', headerTheme: 'Header theme',
cutMenu: 'Cut Menu' cutMenu: 'Cut Menu',
copy: 'Copy',
clearAndReset: 'Clear cache and reset',
copySuccess: 'Copy success'
}, },
size: { size: {
default: 'Default', default: 'Default',

View File

@ -38,7 +38,10 @@ export default {
greyMode: '灰色模式', greyMode: '灰色模式',
fixedHeader: '固定头部', fixedHeader: '固定头部',
headerTheme: '头部主题', headerTheme: '头部主题',
cutMenu: '切割菜单' cutMenu: '切割菜单',
copy: '拷贝',
clearAndReset: '清除缓存并且重置',
copySuccess: '拷贝成功'
}, },
size: { size: {
default: '默认', default: '默认',

View File

@ -5,6 +5,7 @@ import type { RouteRecordRaw } from 'vue-router'
import { useTitle } from '@/hooks/web/useTitle' import { useTitle } from '@/hooks/web/useTitle'
import { useNProgress } from '@/hooks/web/useNProgress' import { useNProgress } from '@/hooks/web/useNProgress'
import { usePermissionStoreWithOut } from '@/store/modules/permission' import { usePermissionStoreWithOut } from '@/store/modules/permission'
import { usePageLoading } from '@/hooks/web/usePageLoading'
const permissionStore = usePermissionStoreWithOut() const permissionStore = usePermissionStoreWithOut()
@ -14,10 +15,13 @@ const { wsCache } = useCache()
const { start, done } = useNProgress() const { start, done } = useNProgress()
const { loadStart, loadDone } = usePageLoading()
const whiteList = ['/login'] // 不重定向白名单 const whiteList = ['/login'] // 不重定向白名单
router.beforeEach(async (to, from, next) => { router.beforeEach(async (to, from, next) => {
start() start()
loadStart()
if (wsCache.get(appStore.getUserInfo)) { if (wsCache.get(appStore.getUserInfo)) {
if (to.path === '/login') { if (to.path === '/login') {
next({ path: '/' }) next({ path: '/' })
@ -48,4 +52,5 @@ router.beforeEach(async (to, from, next) => {
router.afterEach((to) => { router.afterEach((to) => {
useTitle(to?.meta?.title as string) useTitle(to?.meta?.title as string)
done() // 结束Progress done() // 结束Progress
loadDone()
}) })

View File

@ -42,13 +42,12 @@ export const useAppStore = defineStore({
getFixedHeader(): boolean { getFixedHeader(): boolean {
return this.fixedHeader return this.fixedHeader
}, },
getFixedMenu(): boolean {
return this.fixedMenu
},
getGreyMode(): boolean { getGreyMode(): boolean {
return this.greyMode return this.greyMode
}, },
getPageLoading(): boolean {
return this.pageLoading
},
getLayout(): LayoutType { getLayout(): LayoutType {
return this.layout return this.layout
}, },
@ -105,13 +104,12 @@ export const useAppStore = defineStore({
setFixedHeader(fixedHeader: boolean) { setFixedHeader(fixedHeader: boolean) {
this.fixedHeader = fixedHeader this.fixedHeader = fixedHeader
}, },
setFixedMenu(fixedMenu: boolean) {
this.fixedMenu = fixedMenu
},
setGreyMode(greyMode: boolean) { setGreyMode(greyMode: boolean) {
this.greyMode = greyMode this.greyMode = greyMode
}, },
setPageLoading(pageLoading: boolean) {
this.pageLoading = pageLoading
},
setLayout(layout: LayoutType) { setLayout(layout: LayoutType) {
if (this.mobile && layout !== 'classic') { if (this.mobile && layout !== 'classic') {
ElMessage.warning('移动端模式下不支持切换其他布局') ElMessage.warning('移动端模式下不支持切换其他布局')