mirror of
https://github.com/ZeroCatDev/Classworks.git
synced 2025-07-04 02:09:22 +00:00
1
This commit is contained in:
parent
29ce2a9336
commit
84abe2598f
12
src/App.vue
12
src/App.vue
@ -10,7 +10,17 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
//
|
import { onMounted } from 'vue';
|
||||||
|
import { useTheme } from 'vuetify';
|
||||||
|
import { getSetting } from '@/utils/settings';
|
||||||
|
|
||||||
|
const theme = useTheme();
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
// 应用保存的主题设置
|
||||||
|
const savedTheme = getSetting('theme.mode');
|
||||||
|
theme.global.name.value = savedTheme;
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
<style>
|
<style>
|
||||||
|
|
||||||
|
64
src/components/settings/cards/ThemeSettingsCard.vue
Normal file
64
src/components/settings/cards/ThemeSettingsCard.vue
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
<template>
|
||||||
|
<settings-card title="主题设置" icon="mdi-palette">
|
||||||
|
<v-list>
|
||||||
|
<v-list-item>
|
||||||
|
<template #prepend>
|
||||||
|
<v-icon icon="mdi-theme-light-dark" class="mr-3" />
|
||||||
|
</template>
|
||||||
|
<v-list-item-title>主题模式</v-list-item-title>
|
||||||
|
<v-list-item-subtitle>选择明亮或暗黑主题</v-list-item-subtitle>
|
||||||
|
<template #append>
|
||||||
|
<v-btn-toggle
|
||||||
|
v-model="localTheme"
|
||||||
|
density="comfortable"
|
||||||
|
color="primary"
|
||||||
|
>
|
||||||
|
<v-btn value="light">
|
||||||
|
<v-icon icon="mdi-white-balance-sunny" class="mr-2" />
|
||||||
|
明亮
|
||||||
|
</v-btn>
|
||||||
|
<v-btn value="dark">
|
||||||
|
<v-icon icon="mdi-moon-waning-crescent" class="mr-2" />
|
||||||
|
暗黑
|
||||||
|
</v-btn>
|
||||||
|
</v-btn-toggle>
|
||||||
|
</template>
|
||||||
|
</v-list-item>
|
||||||
|
</v-list>
|
||||||
|
</settings-card>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import SettingsCard from '@/components/SettingsCard.vue';
|
||||||
|
import { getSetting, setSetting } from '@/utils/settings';
|
||||||
|
import { useTheme } from 'vuetify';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'ThemeSettingsCard',
|
||||||
|
components: { SettingsCard },
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
localTheme: getSetting('theme.mode')
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
watch: {
|
||||||
|
localTheme(newValue) {
|
||||||
|
setSetting('theme.mode', newValue);
|
||||||
|
this.updateTheme(newValue);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
setup() {
|
||||||
|
const theme = useTheme();
|
||||||
|
return { theme };
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
updateTheme(mode) {
|
||||||
|
this.theme.global.name.value = mode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
@ -37,6 +37,11 @@
|
|||||||
<display-settings-card @saved="onSettingsSaved" border/>
|
<display-settings-card @saved="onSettingsSaved" border/>
|
||||||
</v-col>
|
</v-col>
|
||||||
|
|
||||||
|
<!-- 添加主题设置卡片 -->
|
||||||
|
<v-col cols="12" md="6">
|
||||||
|
<theme-settings-card border />
|
||||||
|
</v-col>
|
||||||
|
|
||||||
<!-- 开发者选项卡片 -->
|
<!-- 开发者选项卡片 -->
|
||||||
<v-col :cols="12" :md="settings.developer.enabled ? 12 : 6">
|
<v-col :cols="12" :md="settings.developer.enabled ? 12 : 6">
|
||||||
<settings-card
|
<settings-card
|
||||||
@ -146,6 +151,7 @@ import EditSettingsCard from '@/components/settings/cards/EditSettingsCard.vue';
|
|||||||
import RefreshSettingsCard from '@/components/settings/cards/RefreshSettingsCard.vue';
|
import RefreshSettingsCard from '@/components/settings/cards/RefreshSettingsCard.vue';
|
||||||
import DisplaySettingsCard from '@/components/settings/cards/DisplaySettingsCard.vue';
|
import DisplaySettingsCard from '@/components/settings/cards/DisplaySettingsCard.vue';
|
||||||
import DataProviderSettingsCard from '@/components/settings/cards/DataProviderSettingsCard.vue';
|
import DataProviderSettingsCard from '@/components/settings/cards/DataProviderSettingsCard.vue';
|
||||||
|
import ThemeSettingsCard from '@/components/settings/cards/ThemeSettingsCard.vue';
|
||||||
import {
|
import {
|
||||||
getSetting,
|
getSetting,
|
||||||
setSetting,
|
setSetting,
|
||||||
@ -170,7 +176,8 @@ export default {
|
|||||||
SettingsCard,
|
SettingsCard,
|
||||||
StudentListCard,
|
StudentListCard,
|
||||||
AboutCard,
|
AboutCard,
|
||||||
DataProviderSettingsCard
|
DataProviderSettingsCard,
|
||||||
|
ThemeSettingsCard
|
||||||
},
|
},
|
||||||
setup() {
|
setup() {
|
||||||
const { mobile } = useDisplay();
|
const { mobile } = useDisplay();
|
||||||
|
@ -102,7 +102,7 @@ const settingsDefinitions = {
|
|||||||
"server.domain": {
|
"server.domain": {
|
||||||
type: "string",
|
type: "string",
|
||||||
default: "",
|
default: "",
|
||||||
validate: value => {
|
validate: (value) => {
|
||||||
// 如果不是服务器模式或值为空,直接通过
|
// 如果不是服务器模式或值为空,直接通过
|
||||||
if (!value) return true;
|
if (!value) return true;
|
||||||
// 验证URL格式
|
// 验证URL格式
|
||||||
@ -110,7 +110,7 @@ const settingsDefinitions = {
|
|||||||
new URL(value);
|
new URL(value);
|
||||||
return true;
|
return true;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error('域名格式无效:', e);
|
console.error("域名格式无效:", e);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -222,6 +222,14 @@ const settingsDefinitions = {
|
|||||||
description: "是否保存消息历史记录",
|
description: "是否保存消息历史记录",
|
||||||
requireDeveloper: true,
|
requireDeveloper: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// 主题设置
|
||||||
|
"theme.mode": {
|
||||||
|
type: "string",
|
||||||
|
default: "dark",
|
||||||
|
validate: (value) => ["light", "dark"].includes(value),
|
||||||
|
description: "主题模式",
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
// 内存中缓存的设置值
|
// 内存中缓存的设置值
|
||||||
|
Loading…
x
Reference in New Issue
Block a user