Skip to content

Commit

Permalink
feat: 在线分享第一版-自定义站点信息
Browse files Browse the repository at this point in the history
  • Loading branch information
terwer committed Jun 19, 2023
1 parent 77d7aa6 commit 30b3e85
Show file tree
Hide file tree
Showing 6 changed files with 71 additions and 26 deletions.
12 changes: 10 additions & 2 deletions app.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,13 @@
* questions.
*/

type ThemeType = "dark" | "light"
type ThemeType = "system" | "dark" | "light"

interface AppConfig {
siteTitle?: string
siteSlogan?: string
siteDescription?: string

theme?: {
mode?: ThemeType
lightTheme?: string
Expand All @@ -37,8 +41,12 @@ interface AppConfig {
}

export default defineAppConfig<AppConfig>({
siteTitle: "浅海拾贝",
siteSlogan: "寻找未知的技术拼图",
siteDescription: "专注于Java后端开发及服务端、软件架构、微服务、自然语言处理等领域的技术分享。",

theme: {
mode: "dark",
mode: "system",
lightTheme: "Zhihu",
darkTheme: "Zhihu",
},
Expand Down
21 changes: 5 additions & 16 deletions composables/useThemeMode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -117,23 +117,12 @@ export const useThemeMode = async () => {
}

// 设置主题模式
const setThemeMode = (isDarkMode: boolean, isDelay = false) => {
const setThemeMode = (isDarkMode: boolean) => {
if (BrowserUtil.isInBrowser) {
// 使用 setTimeout 确保在 CSS 加载完成后再执行函数
const waitTime = parseInt(env.public.waitTime ?? 500)
if (isDelay) {
setTimeout(() => {
setCssAndThemeMode(isDarkMode)
// 记录日志
logger.debug(isDarkMode ? "Browser Dark Mode" : "Browser Light Mode")
logger.info(`Auto set mode, isDark => ${isDarkMode}`)
}, waitTime)
} else {
setCssAndThemeMode(isDarkMode)
// 记录日志
logger.debug(isDarkMode ? "Browser Dark Mode" : "Browser Light Mode")
logger.info(`Auto set mode, isDark => ${isDarkMode}`)
}
setCssAndThemeMode(isDarkMode)
// 记录日志
logger.debug(isDarkMode ? "Browser Dark Mode" : "Browser Light Mode")
logger.info(`Auto set mode, isDark => ${isDarkMode}`)
}

color.preference = isDarkMode ? "dark" : "light"
Expand Down
6 changes: 5 additions & 1 deletion pages/about.vue
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
<script setup lang="ts">
import { useSettingStore } from "~/stores/useSettingStore"
const { t } = useI18n()
const { getSetting } = useSettingStore()
const setting = await getSetting()
const seoMeta = {
title: `${t("syp.about")} - ${t("blog.site.title")}`,
title: `${t("syp.about")} - ${setting?.siteTitle ?? t("blog.site.title")}`,
ogTitle: t("syp.about"),
description: t("syp.about.desc"),
ogDescription: t("syp.about.desc"),
Expand Down
13 changes: 13 additions & 0 deletions pages/index.vue
Original file line number Diff line number Diff line change
@@ -1,6 +1,19 @@
<script setup lang="ts">
import { useSettingStore } from "~/stores/useSettingStore"
const { t } = useI18n()
const { getSetting } = useSettingStore()
const setting = await getSetting()
const seoMeta = {
title: `${setting?.siteTitle ?? t("blog.site.title")} -${setting?.siteSlogan ?? t("blog.site.slogan")}`,
ogTitle: t("syp.about"),
description: t("syp.about.desc"),
ogDescription: t("syp.about.desc"),
} as any
useSeoMeta(seoMeta)
// methods
const goSetting = async () => {
await navigateTo("/setting")
}
Expand Down
22 changes: 17 additions & 5 deletions stores/common/useCommonStorageAsync.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,18 +26,22 @@
import CommonStorage from "~/stores/common/commonStorage"
import { StorageSerializers } from "@vueuse/core"
import { createAppLogger } from "~/common/appLogger"
import { ObjectUtil, StrUtil } from "zhi-common"

/**
* https://vueuse.org/core/useStorageAsync/
*
* @param storageKey
* @param storageKey - 存储key
* @param initialValue - 默认值
*/
export const useCommonStorageAsync = <T extends string | number | boolean | object | null>(storageKey: string) => {
export const useCommonStorageAsync = <T extends string | number | boolean | object | null>(
storageKey: string,
initialValue: T
) => {
const logger = createAppLogger("common-storage-async")
const commonStorage = new CommonStorage(storageKey)

// 获取 initialValue 类型对应的序列化器,如果不存在则使用默认序列化器
const initialValue = {} as T
const rawInit: T = toValue(initialValue)
const type = guessSerializerType<T>(rawInit) as
| "boolean"
Expand All @@ -54,9 +58,17 @@ export const useCommonStorageAsync = <T extends string | number | boolean | obje
// 定义 commonStore 对象
const commonStore = {
async get(): Promise<T> {
logger.debug("Fetching data from common storage...")
const rawValue = (await commonStorage.getItem(commonStorage.key)) ?? "{}"
const ret = await serializer.read(rawValue)
return ret ?? {}
let ret = (await serializer.read(rawValue)) ?? {}

if (ObjectUtil.isEmptyObject(ret)) {
logger.info("Initial data not found in common storage. Setting initial value...")
await commonStorage.setItem(commonStorage.key, serializer.write(initialValue))
logger.info("Initial value set:", initialValue)
ret = initialValue
}
return ret
},
async set(value: T): Promise<void> {
await commonStorage.setItem(commonStorage.key, serializer.write(value))
Expand Down
23 changes: 21 additions & 2 deletions stores/useSettingStore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,30 @@ import { useCommonStorageAsync } from "~/stores/common/useCommonStorageAsync"
export const useSettingStore = defineStore("setting", () => {
const logger = createAppLogger("use-setting-store")
const storageKey = "/data/storage/petal/siyuan-blog/app.config.json"
const { commonStore } = useCommonStorageAsync<typeof AppConfig>(storageKey)
const initialValue = AppConfig
const { commonStore } = useCommonStorageAsync<typeof AppConfig>(storageKey, initialValue)
const settingRef = ref<typeof AppConfig | null>(null)

const getSetting = async (): Promise<typeof AppConfig> => {
const getSettingRef = computed(async () => {
const setting = await commonStore.get()
logger.info("get data from setting=>", setting)
settingRef.value = setting
return setting
})

/**
* 获取配置
*/
const getSetting = async (): Promise<typeof AppConfig> => {
if (settingRef.value === null) {
logger.info("Setting not initialized. Initializing now...")
// 如果设置还没有被初始化,则调用 getSettingRef 函数
const setting = getSettingRef.value
logger.info(`Loaded setting from remote api`)
return setting ?? {}
}
logger.info(`Loaded setting from cached.`)
return settingRef.value ?? {}
}

/**
Expand All @@ -26,6 +44,7 @@ export const useSettingStore = defineStore("setting", () => {
const updateSetting = async (setting: Partial<typeof AppConfig>) => {
logger.info("update setting=>", setting)
await commonStore.set(setting)
settingRef.value = { ...settingRef.value, ...setting }
}

return { getSetting, updateSetting }
Expand Down

0 comments on commit 30b3e85

Please sign in to comment.