feat: ✨ 新增水印
This commit is contained in:
20
src/App.vue
20
src/App.vue
@@ -1,13 +1,27 @@
|
|||||||
<template>
|
<template>
|
||||||
<el-config-provider :locale="appStore.locale" :size="appStore.size">
|
<el-config-provider :locale="locale" :size="size">
|
||||||
<el-watermark content="vue3-element-admin" class="wh-full">
|
<!-- 开启水印 -->
|
||||||
|
<el-watermark
|
||||||
|
v-if="watermarkEnabled"
|
||||||
|
:content="watermarkContent"
|
||||||
|
class="wh-full"
|
||||||
|
>
|
||||||
<router-view />
|
<router-view />
|
||||||
</el-watermark>
|
</el-watermark>
|
||||||
|
<!-- 关闭水印 -->
|
||||||
|
<router-view v-else />
|
||||||
</el-config-provider>
|
</el-config-provider>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { useAppStore } from "@/store/modules/app";
|
import { useAppStore, useSettingsStore } from "@/store";
|
||||||
|
import defaultSettings from "@/settings";
|
||||||
|
|
||||||
const appStore = useAppStore();
|
const appStore = useAppStore();
|
||||||
|
const locale = computed(() => appStore.locale);
|
||||||
|
const size = computed(() => appStore.size);
|
||||||
|
|
||||||
|
const watermarkContent = defaultSettings.watermarkContent;
|
||||||
|
const settingsStore = useSettingsStore();
|
||||||
|
const watermarkEnabled = computed(() => settingsStore.watermarkEnabled);
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -72,8 +72,14 @@ const cachedViews = computed(() => tagsViewStore.cachedViews); // 缓存页面
|
|||||||
}
|
}
|
||||||
|
|
||||||
.layout-top {
|
.layout-top {
|
||||||
|
.fixed-header + .app-main {
|
||||||
|
padding-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hasTagsView {
|
||||||
.fixed-header + .app-main {
|
.fixed-header + .app-main {
|
||||||
padding-top: $tags-view-height;
|
padding-top: $tags-view-height;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -30,7 +30,7 @@
|
|||||||
|
|
||||||
<div class="py-[8px] flex-x-between">
|
<div class="py-[8px] flex-x-between">
|
||||||
<span class="text-xs">开启水印</span>
|
<span class="text-xs">开启水印</span>
|
||||||
<el-switch v-model="settingsStore.sidebarLogo" />
|
<el-switch v-model="settingsStore.watermarkEnabled" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<el-divider>主题颜色</el-divider>
|
<el-divider>主题颜色</el-divider>
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
<TagsView v-if="showTagsView" />
|
<TagsView v-if="showTagsView" />
|
||||||
</div>
|
</div>
|
||||||
<AppMain />
|
<AppMain />
|
||||||
<RightPanel v-if="showSettings">
|
<RightPanel v-if="defaultSettings.showSettings">
|
||||||
<Settings />
|
<Settings />
|
||||||
</RightPanel>
|
</RightPanel>
|
||||||
</div>
|
</div>
|
||||||
@@ -38,7 +38,7 @@
|
|||||||
<TagsView v-if="showTagsView" />
|
<TagsView v-if="showTagsView" />
|
||||||
</div>
|
</div>
|
||||||
<AppMain />
|
<AppMain />
|
||||||
<RightPanel v-if="showSettings">
|
<RightPanel v-if="defaultSettings.showSettings">
|
||||||
<Settings />
|
<Settings />
|
||||||
</RightPanel>
|
</RightPanel>
|
||||||
</div>
|
</div>
|
||||||
@@ -47,6 +47,7 @@
|
|||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { useAppStore, useSettingsStore, usePermissionStore } from "@/store";
|
import { useAppStore, useSettingsStore, usePermissionStore } from "@/store";
|
||||||
|
import defaultSettings from "@/settings";
|
||||||
|
|
||||||
const appStore = useAppStore();
|
const appStore = useAppStore();
|
||||||
const settingsStore = useSettingsStore();
|
const settingsStore = useSettingsStore();
|
||||||
@@ -54,7 +55,6 @@ const permissionStore = usePermissionStore();
|
|||||||
|
|
||||||
const fixedHeader = computed(() => settingsStore.fixedHeader);
|
const fixedHeader = computed(() => settingsStore.fixedHeader);
|
||||||
const showTagsView = computed(() => settingsStore.tagsView);
|
const showTagsView = computed(() => settingsStore.tagsView);
|
||||||
const showSettings = computed(() => settingsStore.showSettings);
|
|
||||||
const layout = computed(() => settingsStore.layout);
|
const layout = computed(() => settingsStore.layout);
|
||||||
|
|
||||||
const activeTopMenuPath = computed(() => {
|
const activeTopMenuPath = computed(() => {
|
||||||
@@ -176,7 +176,8 @@ function toggleSidebar() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.main-container {
|
.main-container {
|
||||||
margin-top: $navbar-height;
|
min-height: (100vh - $navbar-height);
|
||||||
|
padding-top: $navbar-height;
|
||||||
margin-left: 0;
|
margin-left: 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,8 @@ const defaultSettings: AppSettings = {
|
|||||||
size: "default",
|
size: "default",
|
||||||
language: "zh-cn",
|
language: "zh-cn",
|
||||||
themeColor: "#409EFF",
|
themeColor: "#409EFF",
|
||||||
watermark: { enabled: false, content: "vue3-element-admin" },
|
watermarkEnabled: false,
|
||||||
|
watermarkContent: "vue3-element-admin",
|
||||||
};
|
};
|
||||||
|
|
||||||
export default defaultSettings;
|
export default defaultSettings;
|
||||||
|
|||||||
@@ -1,56 +1,63 @@
|
|||||||
import { defineStore } from "pinia";
|
|
||||||
import defaultSettings from "@/settings";
|
import defaultSettings from "@/settings";
|
||||||
|
|
||||||
|
type SettingsValue = boolean | string;
|
||||||
|
|
||||||
export const useSettingsStore = defineStore("setting", () => {
|
export const useSettingsStore = defineStore("setting", () => {
|
||||||
const title = defaultSettings.title;
|
// 是否显示标签视图
|
||||||
const version = defaultSettings.version;
|
|
||||||
|
|
||||||
const tagsView = useStorage<boolean>("tagsView", defaultSettings.tagsView);
|
const tagsView = useStorage<boolean>("tagsView", defaultSettings.tagsView);
|
||||||
|
// 是否显示侧边栏logo
|
||||||
const showSettings = ref<boolean>(defaultSettings.showSettings);
|
const sidebarLogo = useStorage<boolean>(
|
||||||
const sidebarLogo = ref<boolean>(defaultSettings.sidebarLogo);
|
"sidebarLogo",
|
||||||
|
defaultSettings.sidebarLogo
|
||||||
|
);
|
||||||
|
// 是否固定头部
|
||||||
const fixedHeader = useStorage<boolean>(
|
const fixedHeader = useStorage<boolean>(
|
||||||
"fixedHeader",
|
"fixedHeader",
|
||||||
defaultSettings.fixedHeader
|
defaultSettings.fixedHeader
|
||||||
);
|
);
|
||||||
|
// 布局模式:left-左侧模式(默认) top-顶部模式 mix-混合模式
|
||||||
const layout = useStorage<string>("layout", defaultSettings.layout);
|
const layout = useStorage<string>("layout", defaultSettings.layout);
|
||||||
|
// 主题颜色
|
||||||
const themeColor = useStorage<string>(
|
const themeColor = useStorage<string>(
|
||||||
"themeColor",
|
"themeColor",
|
||||||
defaultSettings.themeColor
|
defaultSettings.themeColor
|
||||||
);
|
);
|
||||||
|
// 主题:light-亮色(默认) dark-暗色
|
||||||
const theme = useStorage<string>("theme", defaultSettings.theme);
|
const theme = useStorage<string>("theme", defaultSettings.theme);
|
||||||
|
// 是否开启水印
|
||||||
|
const watermarkEnabled = useStorage<boolean>(
|
||||||
|
"watermarkEnabled",
|
||||||
|
defaultSettings.watermarkEnabled
|
||||||
|
);
|
||||||
|
|
||||||
const watermark = useStorage<any>("watermark", defaultSettings.watermark);
|
const settingsMap: Record<string, Ref<SettingsValue>> = {
|
||||||
|
|
||||||
const settingsMap: Record<string, Ref<any>> = {
|
|
||||||
showSettings,
|
|
||||||
fixedHeader,
|
fixedHeader,
|
||||||
tagsView,
|
tagsView,
|
||||||
sidebarLogo,
|
sidebarLogo,
|
||||||
layout,
|
layout,
|
||||||
themeColor,
|
themeColor,
|
||||||
theme,
|
theme,
|
||||||
watermark: watermark.value,
|
watermarkEnabled,
|
||||||
};
|
};
|
||||||
|
|
||||||
function changeSetting({ key, value }: { key: string; value: any }) {
|
function changeSetting({
|
||||||
|
key,
|
||||||
|
value,
|
||||||
|
}: {
|
||||||
|
key: string;
|
||||||
|
value: SettingsValue;
|
||||||
|
}) {
|
||||||
const setting = settingsMap[key];
|
const setting = settingsMap[key];
|
||||||
if (setting !== undefined) {
|
if (setting) {
|
||||||
setting.value = value;
|
setting.value = value;
|
||||||
|
// Special handling for theme changes
|
||||||
if (key === "theme") {
|
if (key === "theme") {
|
||||||
if (value === "dark") {
|
document.documentElement.classList.toggle("dark", value === "dark");
|
||||||
document.documentElement.classList.add("dark");
|
|
||||||
} else {
|
|
||||||
document.documentElement.classList.remove("dark");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
title,
|
|
||||||
version,
|
|
||||||
showSettings,
|
|
||||||
tagsView,
|
tagsView,
|
||||||
fixedHeader,
|
fixedHeader,
|
||||||
sidebarLogo,
|
sidebarLogo,
|
||||||
@@ -58,6 +65,6 @@ export const useSettingsStore = defineStore("setting", () => {
|
|||||||
themeColor,
|
themeColor,
|
||||||
changeSetting,
|
changeSetting,
|
||||||
theme,
|
theme,
|
||||||
watermark,
|
watermarkEnabled,
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|||||||
7
src/typings/global.d.ts
vendored
7
src/typings/global.d.ts
vendored
@@ -65,13 +65,10 @@ declare global {
|
|||||||
size: string;
|
size: string;
|
||||||
/** 语言( zh-cn| en) */
|
/** 语言( zh-cn| en) */
|
||||||
language: string;
|
language: string;
|
||||||
/** 水印配置 */
|
|
||||||
watermark: {
|
|
||||||
/** 是否开启水印 */
|
/** 是否开启水印 */
|
||||||
enabled: boolean;
|
watermarkEnabled: boolean;
|
||||||
/** 水印内容 */
|
/** 水印内容 */
|
||||||
content: string;
|
watermarkContent: string;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user