Skip to content

Commit b67d162

Browse files
author
“jiafen”
committed
新增深色模式
1 parent fe3f19a commit b67d162

File tree

13 files changed

+110
-38
lines changed

13 files changed

+110
-38
lines changed

src/App.vue

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,24 @@
11
<script setup>
2-
import { RouterLink, RouterView } from 'vue-router'
2+
import { RouterView } from 'vue-router'
3+
import { useThemeStore } from '@/stores/theme'
4+
import { Moon, Sunny } from '@element-plus/icons-vue'
5+
import { useDarkMode } from '@/composables/useDarkMode'
6+
7+
const themeStore = useThemeStore()
8+
const { getThemeClasses } = useDarkMode()
9+
310
</script>
411

512
<template>
6-
<RouterView />
13+
<div>
14+
<el-button
15+
:class="[getThemeClasses('button'), 'fixed top-3 left-20 z-[60]']"
16+
@click="themeStore.toggleTheme"
17+
:icon="themeStore.isDark ? Sunny : Moon"
18+
circle
19+
/>
20+
<RouterView />
21+
</div>
722
</template>
823

924

src/components/AddModal.vue

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<div v-if="loadingAddModal" class="absolute inset-0 flex justify-center items-center z-10">
44
<img src="/loading.gif" alt="loading" class="w-20 h-20">
55
</div>
6-
<div class="bg-white rounded-lg p-6 w-2/3 lg:w-1/3 max-h-[600px] overflow-y-auto">
6+
<div :class="[getThemeClasses('default'), 'rounded-lg p-6 w-2/3 lg:w-1/3 max-h-[600px] overflow-y-auto border-gray-500 border']">
77
<div class="flex justify-end">
88
<el-button @click="$emit('closeAddModal')" type="primary" native-type="button" class="bg-gray-500 hover:bg-gray-600 border-gray-500 hover:border-gray-600 font-bold p-2">
99
x
@@ -67,6 +67,9 @@
6767
import { ref } from 'vue'
6868
import { ElMessage } from 'element-plus'
6969
import { View, Hide } from '@element-plus/icons-vue'
70+
import { useDarkMode } from '@/composables/useDarkMode'
71+
72+
const { getThemeClasses } = useDarkMode()
7073
7174
const props = defineProps({
7275
formColumns: {

src/components/EditModal.vue

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<div v-if="loadingUpdateModal" class="absolute inset-0 flex justify-center items-center z-10">
44
<img src="/loading.gif" alt="loading" class="w-20 h-20">
55
</div>
6-
<div class="bg-white rounded-lg p-6 w-2/3 lg:w-1/3 max-h-[600px] overflow-y-auto">
6+
<div :class="[getThemeClasses('default'), 'rounded-lg p-6 w-2/3 lg:w-1/3 max-h-[600px] overflow-y-auto border-gray-500 border']">
77
<div class="flex justify-end">
88
<el-button @click="$emit('closeEditModal')" type="primary" native-type="button" class="bg-gray-500 hover:bg-gray-600 border-gray-500 hover:border-gray-600 font-bold p-2">
99
x
@@ -57,6 +57,9 @@
5757
<script setup>
5858
import { ref } from 'vue'
5959
import { ElMessage } from 'element-plus'
60+
import { useDarkMode } from '@/composables/useDarkMode'
61+
62+
const { getThemeClasses } = useDarkMode()
6063
6164
const props = defineProps({
6265
formColumns: {

src/components/Sidebar.vue

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
<template>
2-
<el-aside class="md:flex bg-gray-800 text-white w-40 flex flex-col">
2+
<el-aside :class="[getThemeClasses('sidebar'), 'md:flex text-white w-40 flex flex-col']">
33
<div class="p-4 text-xl font-bold">使用者</div>
44
<el-menu
55
default-active="1"
6-
class="bg-gray-800 text-white border-r-0 flex-1"
6+
:class="[getThemeClasses('sidebar'), ' text-white border-r-0 flex-1']"
77
:default-openeds="['1']"
88
active-text-color="#ffd04b"
99
>
@@ -18,18 +18,21 @@
1818
</template>
1919

2020
<script setup>
21-
defineProps({
22-
sidebarList: {
23-
type: Array,
24-
default: () => []
25-
}
26-
})
27-
defineEmits(['singOut', 'getTableData'])
21+
import { useDarkMode } from '@/composables/useDarkMode'
22+
const { getThemeClasses } = useDarkMode()
23+
24+
defineProps({
25+
sidebarList: {
26+
type: Array,
27+
default: () => []
28+
}
29+
})
30+
defineEmits(['singOut', 'getTableData'])
2831
</script>
2932

3033
<style scoped>
31-
.el-menu-item.is-active {
32-
background-color: #4B5563;
33-
}
34+
.el-menu-item.is-active {
35+
background-color: #4B5563;
36+
}
3437
</style>
3538

src/components/Table.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<template>
22
<h2 class="text-center font-bold text-3xl p-2 text-gray-500 mb-4">{{ tableTitle }}</h2>
3-
<el-table border v-if="tableHeader.length !== 0" :data="tableData" class="bg-white rounded-lg shadow text-lg" style="width: 96%" @selection-change="handleSelectionChange">
3+
<el-table border v-if="tableHeader.length !== 0" :data="tableData" class="rounded-lg shadow text-lg" style="width: 96%" @selection-change="handleSelectionChange">
44
<el-table-column type="selection" width="40" />
55
<el-table-column v-for="(col, index) in tableHeader" :prop="col" :label="col" :key="index" :min-width="142" />
66
<el-table-column label="edit">

src/composables/useDarkMode.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { computed } from 'vue'
2+
3+
export const useDarkMode = () => {
4+
5+
const getThemeClasses = (variant) => {
6+
const themeClasses = {
7+
default: 'bg-white dark:bg-black',
8+
container: 'bg-gray-100 dark:bg-black',
9+
card: 'bg-white dark:bg-gray-800',
10+
text: 'text-gray-600 dark:text-gray-300',
11+
button: 'bg-white hover:bg-gray-400 hover:text-white dark:bg-gray-600 dark:hover:bg-gray-500 dark:hover:text-white active:border-gray-500 hover:border-gray-500',
12+
sidebar: 'bg-gray-800 dark:bg-black',
13+
link: 'text-blue-500 dark:text-blue-400',
14+
}
15+
16+
return themeClasses[variant]
17+
}
18+
19+
return {
20+
getThemeClasses
21+
}
22+
}

src/main.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
21
import ElementPlus from 'element-plus'
32
import 'element-plus/dist/index.css'
3+
import 'element-plus/theme-chalk/dark/css-vars.css'
44
import './assets/tailwind.css'
55

66
import { createApp } from 'vue'

src/stores/counter.js

Lines changed: 0 additions & 12 deletions
This file was deleted.

src/stores/theme.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { defineStore } from 'pinia'
2+
import { ref } from 'vue'
3+
4+
export const useThemeStore = defineStore('theme', () => {
5+
const isDark = ref(localStorage.getItem('theme') === 'dark')
6+
7+
const toggleTheme = () =>{
8+
isDark.value = !isDark.value
9+
localStorage.setItem('theme', isDark.value ? 'dark' : 'light')
10+
updateTheme()
11+
}
12+
13+
const updateTheme = () =>{
14+
if (isDark.value) {
15+
document.documentElement.classList.add('dark')
16+
} else {
17+
document.documentElement.classList.remove('dark')
18+
}
19+
}
20+
21+
updateTheme()
22+
23+
return { isDark, toggleTheme }
24+
})

src/views/HomeView.vue

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,12 @@
55
<Sidebar :class="{ 'hidden': sidebarOpen, 'z-50 fixed inset-y-0 left-0': !sidebarOpen }" @singOut="singOut" :sidebarList="sidebarList" @getTableData="getTableData"/>
66

77
<el-container class="h-[91%]">
8-
<el-header class="bg-white border-b flex items-center justify-between md:justify-end" >
9-
<el-icon @click="toggleSidebar" class="text-black block md:hidden cursor-pointer" :class="{ 'fixed left-32 z-50 text-white': !sidebarOpen }">
8+
<el-header :class="[getThemeClasses('default'), ' dark:border-gray-700 border-b flex items-center justify-between md:justify-end']">
9+
<el-icon @click="toggleSidebar" :class="[
10+
'block md:hidden cursor-pointer',
11+
getThemeClasses('text'),
12+
{ 'fixed left-32 z-50 text-white': !sidebarOpen }
13+
]">
1014
<Menu />
1115
</el-icon>
1216
<div>
@@ -42,8 +46,11 @@
4246
import AddModal from '@/components/AddModal.vue'
4347
4448
import { logout, tableNames, modelData, addModelData, enumChoices, updateModel, deleteModel } from '@/composables/apis'
49+
import { useDarkMode } from '@/composables/useDarkMode'
50+
4551
4652
const router = useRouter()
53+
const { getThemeClasses } = useDarkMode()
4754
4855
const sidebarOpen = ref(true)
4956
const toggleSidebar = async () => {

0 commit comments

Comments
 (0)