1
0
mirror of https://github.com/chatopera/cosin.git synced 2025-08-01 16:38:02 +08:00

fix: save apperance by localstorage

Signed-off-by: Kaifuny <superbiger.github@gmail.com>
This commit is contained in:
Kaifuny 2023-07-24 12:25:50 +08:00
parent 11f47964f5
commit 25b86b2f92
9 changed files with 92 additions and 75 deletions

View File

@ -24,6 +24,7 @@
"idb": "^7.1.1", "idb": "^7.1.1",
"pinia": "^2.1.4", "pinia": "^2.1.4",
"vue": "^3.3.4", "vue": "^3.3.4",
"vue-i18n": "9.3.0-beta.19",
"vue-router": "^4.2.4" "vue-router": "^4.2.4"
}, },
"devDependencies": { "devDependencies": {
@ -46,7 +47,6 @@
"typescript": "^5.0.2", "typescript": "^5.0.2",
"vite": "^4.4.0", "vite": "^4.4.0",
"vitest": "^0.33.0", "vitest": "^0.33.0",
"vue-i18n": "^9.2.2",
"vue-tsc": "^1.8.3" "vue-tsc": "^1.8.3"
}, },
"msw": { "msw": {

View File

@ -39,35 +39,37 @@ const dropdownMenus = [
{ label: '退出登录', value: 'logout' }, { label: '退出登录', value: 'logout' },
] ]
const current = ref<string>(ROUTE_NAME.DASHBOARD_INDEX) const drawerShow = ref(false)
const currentPath = ref<string>(ROUTE_NAME.DASHBOARD_INDEX)
const path = window.location.pathname.split('/')[1] const path = window.location.pathname.split('/')[1]
switch (path) { switch (path) {
case 'dashboard': case 'dashboard':
current.value = ROUTE_NAME.DASHBOARD_INDEX currentPath.value = ROUTE_NAME.DASHBOARD_INDEX
break break
case 'chat': case 'chat':
current.value = ROUTE_NAME.CHAT_INDEX currentPath.value = ROUTE_NAME.CHAT_INDEX
break break
case 'work-order': case 'work-order':
current.value = ROUTE_NAME.WORK_ORDER_INDEX currentPath.value = ROUTE_NAME.WORK_ORDER_INDEX
break break
case 'seats': case 'seats':
current.value = ROUTE_NAME.SEATS_INDEX currentPath.value = ROUTE_NAME.SEATS_INDEX
break break
case 'organization': case 'organization':
current.value = ROUTE_NAME.ORGANIZATION_INDEX currentPath.value = ROUTE_NAME.ORGANIZATION_INDEX
break break
case 'setting': case 'setting':
current.value = ROUTE_NAME.SETTING_INDEX currentPath.value = ROUTE_NAME.SETTING_INDEX
break break
case 'system': case 'system':
current.value = ROUTE_NAME.SYSTEM_INDEX currentPath.value = ROUTE_NAME.SYSTEM_INDEX
break break
case 'profile': case 'profile':
current.value = ROUTE_NAME.PROFILE_INDEX currentPath.value = ROUTE_NAME.PROFILE_INDEX
break break
default: default:
current.value = ROUTE_NAME.PAGE_NOT_FOUND currentPath.value = ROUTE_NAME.PAGE_NOT_FOUND
} }
const router = useRouter() const router = useRouter()
@ -82,8 +84,6 @@ function handleClickNav(name: string) {
} }
router.push({ name }) router.push({ name })
} }
const active = ref(false)
</script> </script>
<template> <template>
<div class="flex flex-col h-screen bg-gray-100"> <div class="flex flex-col h-screen bg-gray-100">
@ -92,7 +92,7 @@ const active = ref(false)
到期剩余30天如继续试用请联系管理员 到期剩余30天如继续试用请联系管理员
</n-alert> </n-alert>
<Nav <Nav
v-model:current="current" v-model:current="currentPath"
avatar-url="https://avatars.githubusercontent.com/u/16386583?v=4" avatar-url="https://avatars.githubusercontent.com/u/16386583?v=4"
:navigations="navigations" :navigations="navigations"
:dropdown-menus="dropdownMenus" :dropdown-menus="dropdownMenus"
@ -100,7 +100,7 @@ const active = ref(false)
> >
<template #production> <template #production>
<div class="flex items-center space-x-2"> <div class="flex items-center space-x-2">
<div class="text-sm">XX公司官网</div> <div class="text-sm">XX 公司官网</div>
<span>-</span> <span>-</span>
<div class="text-sm">默认客服部门</div> <div class="text-sm">默认客服部门</div>
</div> </div>
@ -114,7 +114,7 @@ const active = ref(false)
class="flex items-center cursor-pointer" class="flex items-center cursor-pointer"
:component="NotificationsOutline" :component="NotificationsOutline"
size="25" size="25"
@click="active = !active" @click="drawerShow = !drawerShow"
/> />
</n-badge> </n-badge>
@ -151,7 +151,7 @@ const active = ref(false)
<router-view></router-view> <router-view></router-view>
</div> </div>
<n-drawer <n-drawer
v-model:show="active" v-model:show="drawerShow"
:width="502" :width="502"
:height="200" :height="200"
placement="right" placement="right"

View File

@ -1,18 +1,24 @@
import { defineStore } from 'pinia' import { defineStore } from 'pinia'
import { Apperance } from '@cskefu/models' import { Apperance } from '@cskefu/models'
import { useStorage } from '@vueuse/core'
export const useApperance = defineStore('alerts', { export const useApperance = defineStore('alerts', {
state: (): Apperance => ({ lang: 'zh-CN', darkMode: false }), state: () => ({
apperance: useStorage<Apperance>('apperance', {
lang: 'zh-CN',
darkMode: false,
}),
}),
getters: { getters: {
isDarkMode: (state) => state.darkMode, isDarkMode: (state) => state.apperance.darkMode,
getLang: (state) => state.lang, getLang: (state) => state.apperance.lang,
}, },
actions: { actions: {
toggleDarkMode() { toggleDarkMode() {
this.darkMode = !this.darkMode this.apperance.darkMode = !this.apperance.darkMode
}, },
changeLang(lang: string) { setLang(lang: string) {
this.lang = lang this.apperance.lang = lang
}, },
}, },
}) })

View File

@ -3,6 +3,9 @@
"private": true, "private": true,
"version": "0.0.0", "version": "0.0.0",
"type": "module", "type": "module",
"dependencies": {
"@cskefu/models": "*"
},
"exports": { "exports": {
".": { ".": {
"import": { "import": {

View File

@ -1,6 +1,9 @@
import { App } from 'vue' import { App } from 'vue'
import { createI18n } from 'vue-i18n' import { createI18n } from 'vue-i18n'
import _ from 'lodash-es' import _ from 'lodash-es'
import { useLocalStorage } from '@vueuse/core'
import { Apperance } from '@cskefu/models'
/** /**
* *
@ -10,14 +13,21 @@ export const defaultLocale = 'zh-CN'
const localPathPrefix = './locales/' const localPathPrefix = './locales/'
const getValidLocale = (defaults: string = defaultLocale): string => { const getValidLocale = (defaults: string = defaultLocale): string => {
const locale = window.localStorage.getItem('locale') const storage = useLocalStorage<Apperance>('apperance', {
if (locale && locales.includes(locale)) { lang: defaults,
return locale darkMode: false,
} })
const param = new URLSearchParams(window.location.search).get('lang') const param = new URLSearchParams(window.location.search).get('lang')
if (param && locales.includes(param)) { if (param && locales.includes(param)) {
return param storage.value.lang = param
} }
const lang = storage.value?.lang || defaults
if (locales.includes(lang)) {
return lang
}
return defaults return defaults
} }

View File

@ -2,12 +2,13 @@
"extends": "../../../tsconfig.json", "extends": "../../../tsconfig.json",
"include": ["src/**/*.ts"], "include": ["src/**/*.ts"],
"compilerOptions": { "compilerOptions": {
"baseUrl": "./",
"types": ["vite/client"], "types": ["vite/client"],
"composite": true, "composite": true,
"skipLibCheck": true, "skipLibCheck": true,
"module": "ESNext", "module": "ESNext",
"moduleResolution": "bundler", "moduleResolution": "bundler",
"resolvePackageJsonExports": false, "resolvePackageJsonExports": true,
"allowSyntheticDefaultImports": true, "allowSyntheticDefaultImports": true,
} }
} }

View File

@ -26,13 +26,16 @@ importers:
vue: vue:
specifier: ^3.3.4 specifier: ^3.3.4
version: 3.3.4 version: 3.3.4
vue-i18n:
specifier: 9.3.0-beta.19
version: 9.3.0-beta.19(vue@3.3.4)
vue-router: vue-router:
specifier: ^4.2.4 specifier: ^4.2.4
version: 4.2.4(vue@3.3.4) version: 4.2.4(vue@3.3.4)
devDependencies: devDependencies:
'@intlify/unplugin-vue-i18n': '@intlify/unplugin-vue-i18n':
specifier: ^0.12.0 specifier: ^0.12.0
version: 0.12.0(vue-i18n@9.2.2) version: 0.12.0(vue-i18n@9.3.0-beta.19)
'@types/lodash-es': '@types/lodash-es':
specifier: ^4.17.8 specifier: ^4.17.8
version: 4.17.8 version: 4.17.8
@ -87,9 +90,6 @@ importers:
vitest: vitest:
specifier: ^0.33.0 specifier: ^0.33.0
version: 0.33.0 version: 0.33.0
vue-i18n:
specifier: ^9.2.2
version: 9.2.2(vue@3.3.4)
vue-tsc: vue-tsc:
specifier: ^1.8.3 specifier: ^1.8.3
version: 1.8.3(typescript@5.1.6) version: 1.8.3(typescript@5.1.6)
@ -163,7 +163,11 @@ importers:
specifier: '*' specifier: '*'
version: link:../models version: link:../models
packages/modules/i18n: {} packages/modules/i18n:
dependencies:
'@cskefu/models':
specifier: '*'
version: link:../models
packages/modules/mocks: {} packages/modules/mocks: {}
@ -1123,7 +1127,7 @@ packages:
resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==}
dev: true dev: true
/@intlify/bundle-utils@7.0.2(vue-i18n@9.2.2): /@intlify/bundle-utils@7.0.2(vue-i18n@9.3.0-beta.19):
resolution: {integrity: sha512-8wbx9xhbawBFTE5LPTECiK26RRqrNS31jyWSur72ZXZZ4it5jiZTcG6eUJlNirr4+jXYio2DGY299JsGVT4cpw==} resolution: {integrity: sha512-8wbx9xhbawBFTE5LPTECiK26RRqrNS31jyWSur72ZXZZ4it5jiZTcG6eUJlNirr4+jXYio2DGY299JsGVT4cpw==}
engines: {node: '>= 14.16'} engines: {node: '>= 14.16'}
peerDependencies: peerDependencies:
@ -1144,34 +1148,31 @@ packages:
magic-string: 0.30.1 magic-string: 0.30.1
mlly: 1.4.0 mlly: 1.4.0
source-map-js: 1.0.2 source-map-js: 1.0.2
vue-i18n: 9.2.2(vue@3.3.4) vue-i18n: 9.3.0-beta.19(vue@3.3.4)
yaml-eslint-parser: 0.3.2 yaml-eslint-parser: 0.3.2
dev: true dev: true
/@intlify/core-base@9.2.2: /@intlify/core-base@9.3.0-beta.19:
resolution: {integrity: sha512-JjUpQtNfn+joMbrXvpR4hTF8iJQ2sEFzzK3KIESOx+f+uwIjgw20igOyaIdhfsVVBCds8ZM64MoeNSx+PHQMkA==} resolution: {integrity: sha512-mlpVZ1w6ZwnP9QZAs+RzGuFMCuYjZPboX3hX7JzhV49vUcsLj0R4667cmcLpPZzXJguIy/zaqbIyoUvLV8HONQ==}
engines: {node: '>= 14'} engines: {node: '>= 16'}
dependencies: dependencies:
'@intlify/devtools-if': 9.2.2 '@intlify/devtools-if': 9.3.0-beta.19
'@intlify/message-compiler': 9.2.2 '@intlify/message-compiler': 9.3.0-beta.19
'@intlify/shared': 9.2.2 '@intlify/shared': 9.3.0-beta.19
'@intlify/vue-devtools': 9.2.2 '@intlify/vue-devtools': 9.3.0-beta.19
dev: true
/@intlify/devtools-if@9.2.2: /@intlify/devtools-if@9.3.0-beta.19:
resolution: {integrity: sha512-4ttr/FNO29w+kBbU7HZ/U0Lzuh2cRDhP8UlWOtV9ERcjHzuyXVZmjyleESK6eVP60tGC9QtQW9yZE+JeRhDHkg==} resolution: {integrity: sha512-L4NyqMcuQURejKy9XX0m/2kb37f56NAUvbiXKRx96pahSBclY6T+E0TrKXup0Hx6T0qY55QYGRwyVLeHXIHAMA==}
engines: {node: '>= 14'} engines: {node: '>= 16'}
dependencies: dependencies:
'@intlify/shared': 9.2.2 '@intlify/shared': 9.3.0-beta.19
dev: true
/@intlify/message-compiler@9.2.2: /@intlify/message-compiler@9.3.0-beta.19:
resolution: {integrity: sha512-IUrQW7byAKN2fMBe8z6sK6riG1pue95e5jfokn8hA5Q3Bqy4MBJ5lJAofUsawQJYHeoPJ7svMDyBaVJ4d0GTtA==} resolution: {integrity: sha512-5RBn5tMOsWh5FqM65IfEJvfpRS8R0lHEUVNDa2rNc9Y7oGEI7swezlbFqU9Kc5FyHy5Kx2jHtdgFIipDwnIYFQ==}
engines: {node: '>= 14'} engines: {node: '>= 16'}
dependencies: dependencies:
'@intlify/shared': 9.2.2 '@intlify/shared': 9.3.0-beta.19
source-map: 0.6.1 source-map: 0.6.1
dev: true
/@intlify/message-compiler@9.3.0-beta.24: /@intlify/message-compiler@9.3.0-beta.24:
resolution: {integrity: sha512-prhHATkgp0mpPqoVgiAtLmUc1JMvs8fMH6w53AVEBn+VF87dLhzanfmWY5FoZWORG51ag54gBDBOoM/VFv3m3A==} resolution: {integrity: sha512-prhHATkgp0mpPqoVgiAtLmUc1JMvs8fMH6w53AVEBn+VF87dLhzanfmWY5FoZWORG51ag54gBDBOoM/VFv3m3A==}
@ -1181,10 +1182,9 @@ packages:
source-map-js: 1.0.2 source-map-js: 1.0.2
dev: true dev: true
/@intlify/shared@9.2.2: /@intlify/shared@9.3.0-beta.19:
resolution: {integrity: sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==} resolution: {integrity: sha512-+lhQggrLvlQ/O5OmIYAc9gadcYXMoaDi0Doef+X/f6TLZFr9PTMjOpBWmpwNNHi026e54jckntUn6GzqDtIN4w==}
engines: {node: '>= 14'} engines: {node: '>= 16'}
dev: true
/@intlify/shared@9.3.0-beta.20: /@intlify/shared@9.3.0-beta.20:
resolution: {integrity: sha512-RucSPqh8O9FFxlYUysQTerSw0b9HIRpyoN1Zjogpm0qLiHK+lBNSa5sh1nCJ4wSsNcjphzgpLQCyR60GZlRV8g==} resolution: {integrity: sha512-RucSPqh8O9FFxlYUysQTerSw0b9HIRpyoN1Zjogpm0qLiHK+lBNSa5sh1nCJ4wSsNcjphzgpLQCyR60GZlRV8g==}
@ -1196,7 +1196,7 @@ packages:
engines: {node: '>= 16'} engines: {node: '>= 16'}
dev: true dev: true
/@intlify/unplugin-vue-i18n@0.12.0(vue-i18n@9.2.2): /@intlify/unplugin-vue-i18n@0.12.0(vue-i18n@9.3.0-beta.19):
resolution: {integrity: sha512-L155p03eZpzYUIU1YKbb38xq++GcaW6bsqo800GdonmkQXY8nc4/HsKQRQY5lRoAOkbhO0Vyt7yrsU11vVrqnw==} resolution: {integrity: sha512-L155p03eZpzYUIU1YKbb38xq++GcaW6bsqo800GdonmkQXY8nc4/HsKQRQY5lRoAOkbhO0Vyt7yrsU11vVrqnw==}
engines: {node: '>= 14.16'} engines: {node: '>= 14.16'}
peerDependencies: peerDependencies:
@ -1211,7 +1211,7 @@ packages:
vue-i18n-bridge: vue-i18n-bridge:
optional: true optional: true
dependencies: dependencies:
'@intlify/bundle-utils': 7.0.2(vue-i18n@9.2.2) '@intlify/bundle-utils': 7.0.2(vue-i18n@9.3.0-beta.19)
'@intlify/shared': 9.3.0-beta.20 '@intlify/shared': 9.3.0-beta.20
'@rollup/pluginutils': 5.0.2 '@rollup/pluginutils': 5.0.2
'@vue/compiler-sfc': 3.3.4 '@vue/compiler-sfc': 3.3.4
@ -1223,19 +1223,18 @@ packages:
picocolors: 1.0.0 picocolors: 1.0.0
source-map-js: 1.0.2 source-map-js: 1.0.2
unplugin: 1.3.2 unplugin: 1.3.2
vue-i18n: 9.2.2(vue@3.3.4) vue-i18n: 9.3.0-beta.19(vue@3.3.4)
transitivePeerDependencies: transitivePeerDependencies:
- rollup - rollup
- supports-color - supports-color
dev: true dev: true
/@intlify/vue-devtools@9.2.2: /@intlify/vue-devtools@9.3.0-beta.19:
resolution: {integrity: sha512-+dUyqyCHWHb/UcvY1MlIpO87munedm3Gn6E9WWYdWrMuYLcoIoOEVDWSS8xSwtlPU+kA+MEQTP6Q1iI/ocusJg==} resolution: {integrity: sha512-7yz8sUbovPUIf8sCX3+sMdw/xEyeHKBCc7Agxcxv54PiQz3zwsVl0hC1X+JXUy46FiPsMEoFfY8O27xOFLupaw==}
engines: {node: '>= 14'} engines: {node: '>= 16'}
dependencies: dependencies:
'@intlify/core-base': 9.2.2 '@intlify/core-base': 9.3.0-beta.19
'@intlify/shared': 9.2.2 '@intlify/shared': 9.3.0-beta.19
dev: true
/@jest/schemas@29.6.0: /@jest/schemas@29.6.0:
resolution: {integrity: sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==} resolution: {integrity: sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==}
@ -3969,7 +3968,6 @@ packages:
/source-map@0.6.1: /source-map@0.6.1:
resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
dev: true
/stackback@0.0.2: /stackback@0.0.2:
resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
@ -4446,18 +4444,17 @@ packages:
- supports-color - supports-color
dev: true dev: true
/vue-i18n@9.2.2(vue@3.3.4): /vue-i18n@9.3.0-beta.19(vue@3.3.4):
resolution: {integrity: sha512-yswpwtj89rTBhegUAv9Mu37LNznyu3NpyLQmozF3i1hYOhwpG8RjcjIFIIfnu+2MDZJGSZPXaKWvnQA71Yv9TQ==} resolution: {integrity: sha512-1pbEcoAbxaAPuR5hODnQJ5CtIimnVD+aUVnCztuuRaOZPLP1i4FxkWVvb1lu8JIRC5pePyODZxi3yoy3PUYheA==}
engines: {node: '>= 14'} engines: {node: '>= 16'}
peerDependencies: peerDependencies:
vue: ^3.0.0 vue: ^3.0.0
dependencies: dependencies:
'@intlify/core-base': 9.2.2 '@intlify/core-base': 9.3.0-beta.19
'@intlify/shared': 9.2.2 '@intlify/shared': 9.3.0-beta.19
'@intlify/vue-devtools': 9.2.2 '@intlify/vue-devtools': 9.3.0-beta.19
'@vue/devtools-api': 6.5.0 '@vue/devtools-api': 6.5.0
vue: 3.3.4 vue: 3.3.4
dev: true
/vue-router@4.2.4(vue@3.3.4): /vue-router@4.2.4(vue@3.3.4):
resolution: {integrity: sha512-9PISkmaCO02OzPVOMq2w82ilty6+xJmQrarYZDkjZBfl4RvYAlt4PKnEX21oW4KTtWfa9OuO/b3qk1Od3AEdCQ==} resolution: {integrity: sha512-9PISkmaCO02OzPVOMq2w82ilty6+xJmQrarYZDkjZBfl4RvYAlt4PKnEX21oW4KTtWfa9OuO/b3qk1Od3AEdCQ==}