From fc81c788490e3745a6731aee1f17de5efcfc7bf1 Mon Sep 17 00:00:00 2001 From: lijiahang Date: Fri, 8 Dec 2023 19:05:00 +0800 Subject: [PATCH] =?UTF-8?q?feat.=20=E7=BB=88=E7=AB=AF=E4=B8=BB=E9=A2=98?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../infra/enums/PreferenceTypeEnum.java | 5 ++ ...eModel.java => SystemPreferenceModel.java} | 2 +- .../model/TerminalPreferenceModel.java | 32 +++++++++ .../strategy/SystemPreferenceStrategy.java | 8 +-- .../strategy/TerminalPreferenceStrategy.java | 26 +++++++ orion-ops-ui/src/store/index.ts | 2 + orion-ops-ui/src/store/modules/cache/index.ts | 2 - .../src/store/modules/terminal/index.ts | 68 +++++++++++++++++++ .../src/store/modules/terminal/types.ts | 50 ++++++++++++++ .../components/layout/icon-actions.vue | 2 +- .../components/layout/terminal-content.vue | 20 ++---- .../components/layout/terminal-header.vue | 2 +- .../layout/terminal-left-sidebar.vue | 11 +-- .../layout/terminal-right-sidebar.vue | 2 +- .../{ => theme-setting}/terminal-example.vue | 10 +-- .../terminal-theme-setting.vue | 51 ++++++++------ .../src/views/host-ops/terminal/index.vue | 55 ++++++--------- .../{terminal.type.ts => terminal.const.ts} | 15 +--- .../host-ops/terminal/types/terminal.theme.ts | 45 +++--------- .../src/views/system/dict-value/index.vue | 1 - 20 files changed, 267 insertions(+), 142 deletions(-) rename orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/model/{AppPreferenceModel.java => SystemPreferenceModel.java} (94%) create mode 100644 orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/model/TerminalPreferenceModel.java create mode 100644 orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/strategy/TerminalPreferenceStrategy.java create mode 100644 orion-ops-ui/src/store/modules/terminal/index.ts create mode 100644 orion-ops-ui/src/store/modules/terminal/types.ts rename orion-ops-ui/src/views/host-ops/terminal/components/{ => theme-setting}/terminal-example.vue (82%) rename orion-ops-ui/src/views/host-ops/terminal/components/{ => theme-setting}/terminal-theme-setting.vue (80%) rename orion-ops-ui/src/views/host-ops/terminal/types/{terminal.type.ts => terminal.const.ts} (78%) diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/enums/PreferenceTypeEnum.java b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/enums/PreferenceTypeEnum.java index aa720287..671d29dd 100644 --- a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/enums/PreferenceTypeEnum.java +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/enums/PreferenceTypeEnum.java @@ -20,6 +20,11 @@ public enum PreferenceTypeEnum { */ SYSTEM("systemPreferenceStrategy"), + /** + * 终端偏好 + */ + TERMINAL("terminalPreferenceStrategy"), + ; PreferenceTypeEnum(String beanName) { diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/model/AppPreferenceModel.java b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/model/SystemPreferenceModel.java similarity index 94% rename from orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/model/AppPreferenceModel.java rename to orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/model/SystemPreferenceModel.java index 4d5a4c06..5dc25a95 100644 --- a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/model/AppPreferenceModel.java +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/model/SystemPreferenceModel.java @@ -17,7 +17,7 @@ import lombok.NoArgsConstructor; @Builder @NoArgsConstructor @AllArgsConstructor -public class AppPreferenceModel implements PreferenceModel { +public class SystemPreferenceModel implements PreferenceModel { @Schema(description = "是否使用侧边菜单") private Boolean menu; diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/model/TerminalPreferenceModel.java b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/model/TerminalPreferenceModel.java new file mode 100644 index 00000000..a9da8430 --- /dev/null +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/model/TerminalPreferenceModel.java @@ -0,0 +1,32 @@ +package com.orion.ops.module.infra.handler.preference.model; + +import com.alibaba.fastjson.JSONObject; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 终端偏好模型 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023/12/8 14:46 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class TerminalPreferenceModel implements PreferenceModel { + + @Schema(description = "暗色主题") + private String darkTheme; + + @Schema(description = "终端主题") + private JSONObject terminalTheme; + + @Schema(description = "显示设置") + private JSONObject viewSetting; + +} diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/strategy/SystemPreferenceStrategy.java b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/strategy/SystemPreferenceStrategy.java index 7770466a..41cf4481 100644 --- a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/strategy/SystemPreferenceStrategy.java +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/strategy/SystemPreferenceStrategy.java @@ -1,6 +1,6 @@ package com.orion.ops.module.infra.handler.preference.strategy; -import com.orion.ops.module.infra.handler.preference.model.AppPreferenceModel; +import com.orion.ops.module.infra.handler.preference.model.SystemPreferenceModel; import org.springframework.stereotype.Component; /** @@ -11,11 +11,11 @@ import org.springframework.stereotype.Component; * @since 2023/10/8 13:48 */ @Component -public class SystemPreferenceStrategy implements IPreferenceStrategy { +public class SystemPreferenceStrategy implements IPreferenceStrategy { @Override - public AppPreferenceModel getDefault() { - return AppPreferenceModel.builder() + public SystemPreferenceModel getDefault() { + return SystemPreferenceModel.builder() .menu(true) .topMenu(false) .navbar(true) diff --git a/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/strategy/TerminalPreferenceStrategy.java b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/strategy/TerminalPreferenceStrategy.java new file mode 100644 index 00000000..4be57b60 --- /dev/null +++ b/orion-ops-module-infra/orion-ops-module-infra-service/src/main/java/com/orion/ops/module/infra/handler/preference/strategy/TerminalPreferenceStrategy.java @@ -0,0 +1,26 @@ +package com.orion.ops.module.infra.handler.preference.strategy; + +import com.alibaba.fastjson.JSONObject; +import com.orion.ops.module.infra.handler.preference.model.TerminalPreferenceModel; +import org.springframework.stereotype.Component; + +/** + * 终端偏好处理策略 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023/12/8 14:46 + */ +@Component +public class TerminalPreferenceStrategy implements IPreferenceStrategy { + + @Override + public TerminalPreferenceModel getDefault() { + return TerminalPreferenceModel.builder() + .darkTheme("dark") + .terminalTheme(new JSONObject()) + .viewSetting(new JSONObject()) + .build(); + } + +} diff --git a/orion-ops-ui/src/store/index.ts b/orion-ops-ui/src/store/index.ts index 97ed6920..5d570f6f 100644 --- a/orion-ops-ui/src/store/index.ts +++ b/orion-ops-ui/src/store/index.ts @@ -6,6 +6,7 @@ import useTabBarStore from './modules/tab-bar'; import useCacheStore from './modules/cache'; import useTipsStore from './modules/tips'; import useDictStore from './modules/dict'; +import useTerminalStore from './modules/terminal'; const pinia = createPinia(); @@ -17,6 +18,7 @@ export { useCacheStore, useTipsStore, useDictStore, + useTerminalStore, }; export default pinia; diff --git a/orion-ops-ui/src/store/modules/cache/index.ts b/orion-ops-ui/src/store/modules/cache/index.ts index 840bf218..5dad2009 100644 --- a/orion-ops-ui/src/store/modules/cache/index.ts +++ b/orion-ops-ui/src/store/modules/cache/index.ts @@ -19,8 +19,6 @@ export type CacheType = 'users' | 'menus' | 'roles' export default defineStore('cache', { state: (): CacheState => ({}), - getters: {}, - actions: { // 设置 set(name: CacheType, value: any) { diff --git a/orion-ops-ui/src/store/modules/terminal/index.ts b/orion-ops-ui/src/store/modules/terminal/index.ts new file mode 100644 index 00000000..ad43bae7 --- /dev/null +++ b/orion-ops-ui/src/store/modules/terminal/index.ts @@ -0,0 +1,68 @@ +import type { TerminalPreference, TerminalState, TerminalTheme } from './types'; +import { DarkTheme } from './types'; +import { defineStore } from 'pinia'; +import { getPreference, updatePreferencePartial } from '@/api/user/preference'; +import { Message } from '@arco-design/web-vue'; +import { useDark } from '@vueuse/core'; +import { DEFAULT_SCHEMA } from '@/views/host-ops/terminal/types/terminal.theme'; + +export default defineStore('terminal', { + state: (): TerminalState => ({ + isDarkTheme: useDark({ + selector: 'body', + attribute: 'terminal-theme', + valueDark: DarkTheme.DARK, + valueLight: DarkTheme.LIGHT, + initialValue: DarkTheme.DARK as any, + storageKey: null + }), + preference: { + darkTheme: 'auto', + terminalTheme: {} as TerminalTheme, + } + }), + + actions: { + // 修改暗色主题 + changeDarkTheme(dark: boolean) { + this.isDarkTheme = dark; + }, + + // 加载终端偏好 + async fetchPreference() { + try { + const { data } = await getPreference('TERMINAL'); + // 设置默认终端主题 + if (!data.config.terminalTheme?.name) { + data.config.terminalTheme = DEFAULT_SCHEMA; + } + this.preference = data.config; + // 设置暗色主题 + const userDarkTheme = data.config.darkTheme; + if (userDarkTheme === DarkTheme.AUTO) { + this.isDarkTheme = data.config.terminalTheme?.dark === true; + } else { + this.isDarkTheme = userDarkTheme === DarkTheme.DARK; + } + } catch (e) { + Message.error('配置加载失败'); + } + }, + + // 更新终端偏好 + async updatePreference(preference: TerminalPreference) { + try { + // 修改配置 + await updatePreferencePartial({ + type: 'TERMINAL', + config: preference + }); + this.preference = preference; + Message.success('同步成功'); + } catch (e) { + Message.error('同步失败'); + } + }, + + }, +}); diff --git a/orion-ops-ui/src/store/modules/terminal/types.ts b/orion-ops-ui/src/store/modules/terminal/types.ts new file mode 100644 index 00000000..da6409a3 --- /dev/null +++ b/orion-ops-ui/src/store/modules/terminal/types.ts @@ -0,0 +1,50 @@ +import type { Ref } from 'vue'; + +export interface TerminalState { + isDarkTheme: Ref; + preference: TerminalPreference; +} + +// 终端配置 +export interface TerminalPreference { + darkTheme: string, + terminalTheme: TerminalTheme, +} + +// 暗色主题 +export const DarkTheme = { + DARK: 'dark', + LIGHT: 'light', + AUTO: 'auto' +}; + +// 终端主题 +export interface TerminalTheme { + name: string; + dark: boolean; + background: string; + foreground: string; + cursor: string; + cursorAccent?: string; + selectionInactiveBackground?: string; + selectionBackground?: string; + selectionForeground?: string; + black: string; + red: string; + green: string; + yellow: string; + blue: string; + magenta: string; + cyan: string; + white: string; + brightBlack: string; + brightRed: string; + brightGreen: string; + brightYellow: string; + brightBlue: string; + brightMagenta: string; + brightCyan: string; + brightWhite: string; + + [key: string]: unknown; +} diff --git a/orion-ops-ui/src/views/host-ops/terminal/components/layout/icon-actions.vue b/orion-ops-ui/src/views/host-ops/terminal/components/layout/icon-actions.vue index 349aea54..41973e4f 100644 --- a/orion-ops-ui/src/views/host-ops/terminal/components/layout/icon-actions.vue +++ b/orion-ops-ui/src/views/host-ops/terminal/components/layout/icon-actions.vue @@ -27,7 +27,7 @@ diff --git a/orion-ops-ui/src/views/host-ops/terminal/components/layout/terminal-right-sidebar.vue b/orion-ops-ui/src/views/host-ops/terminal/components/layout/terminal-right-sidebar.vue index eb37ac79..ff4529e9 100644 --- a/orion-ops-ui/src/views/host-ops/terminal/components/layout/terminal-right-sidebar.vue +++ b/orion-ops-ui/src/views/host-ops/terminal/components/layout/terminal-right-sidebar.vue @@ -18,7 +18,7 @@