From 44f9f272ef0492fbf54bc9e941c6ca04210368a6 Mon Sep 17 00:00:00 2001 From: zhaojisen <1301338853@qq.com> Date: Thu, 15 Jan 2026 18:24:55 +0800 Subject: [PATCH] perf:New directory service menu --- i18n/locales/en.json | 1 + i18n/locales/zh.json | 1 + src-tauri/src/service/asset.rs | 5 ++- src-tauri/src/service/token.rs | 3 +- ui/components/BasePage/basePage.vue | 36 +++++++++++++++++++++- ui/components/Card/AssetIcon/assetIcon.vue | 3 +- ui/components/SideBar/sideBar.vue | 6 ++++ ui/composables/useAssetFetcher.ts | 7 +++++ ui/pages/windows_ad.vue | 5 +++ ui/types/index.ts | 2 +- 10 files changed, 64 insertions(+), 5 deletions(-) create mode 100644 ui/pages/windows_ad.vue diff --git a/i18n/locales/en.json b/i18n/locales/en.json index 15fba20..59c8281 100644 --- a/i18n/locales/en.json +++ b/i18n/locales/en.json @@ -55,6 +55,7 @@ "Device": "Device", "Player": "Player", "Windows": "Windows", + "DirectoryService": "Directory Service", "Resource": "Resource", "Database": "Database", "OfflinePlayer": "Offline Player", diff --git a/i18n/locales/zh.json b/i18n/locales/zh.json index 5b6b519..21cb2a0 100644 --- a/i18n/locales/zh.json +++ b/i18n/locales/zh.json @@ -53,6 +53,7 @@ "Resource": "资源目录", "Linux": "Linux", "Windows": "Windows", + "DirectoryService": "目录服务", "Database": "数据库", "Device": "设备", "Other": "其他", diff --git a/src-tauri/src/service/asset.rs b/src-tauri/src/service/asset.rs index 12b4501..1b8bed3 100644 --- a/src-tauri/src/service/asset.rs +++ b/src-tauri/src/service/asset.rs @@ -9,6 +9,8 @@ pub enum Category { #[default] Linux, Windows, + #[serde(rename = "windows_ad")] + WindowsAd, Database, Device, } @@ -41,7 +43,7 @@ impl AssetQuery { pub fn new(asset_type: Category, org: String) -> Self { let (r#type, category) = match asset_type { Category::Database | Category::Device => (None, Some(asset_type)), - Category::Linux | Category::Windows => (Some(asset_type), None), + Category::Linux | Category::Windows | Category::WindowsAd => (Some(asset_type), None), }; Self { @@ -110,6 +112,7 @@ impl AssetService { match self.query.get_category() { Category::Linux => (Some(Category::Linux), None), Category::Windows => (Some(Category::Windows), None), + Category::WindowsAd => (Some(Category::WindowsAd), None), Category::Database => (None, Some(Category::Database)), Category::Device => (None, Some(Category::Device)), } diff --git a/src-tauri/src/service/token.rs b/src-tauri/src/service/token.rs index b91d859..b60233e 100644 --- a/src-tauri/src/service/token.rs +++ b/src-tauri/src/service/token.rs @@ -2,7 +2,7 @@ use crate::commands::requests::{get_with_response, post_with_response, ApiRespon use std::collections::HashMap; use url::Url; use serde::{Deserialize, Serialize}; -use serde_json::to_value; +use serde_json::{to_value, Value}; #[derive(Debug, Serialize, Deserialize, Clone)] pub struct TokenRequestBody { @@ -12,6 +12,7 @@ pub struct TokenRequestBody { pub input_username: String, pub input_secret: String, pub connect_method: String, + pub connect_options: Option, } pub struct TokenService { diff --git a/ui/components/BasePage/basePage.vue b/ui/components/BasePage/basePage.vue index eb6d69f..5cd3375 100644 --- a/ui/components/BasePage/basePage.vue +++ b/ui/components/BasePage/basePage.vue @@ -5,6 +5,7 @@ import type { AssetItem, AssetPageType, CharsetType, LayoutsType, ResolutionType import SkeletonCard from "~/components/Card/GridCard/skeletonCard.vue"; import ConnectionEditor from "~/components/ConnectionEditor/connectionEditor.vue"; +import { useSettingStorage } from "~/composables/useSettingStorage"; import { useUserInfoStore } from "~/store/modules/userInfo"; const props = defineProps<{ @@ -25,7 +26,17 @@ const contextMenu = useContextMenu(); const userInfoStore = useUserInfoStore(); const assetManagement = useAssetManagement(); const settingManager = useSettingManager(); -const { layouts } = settingManager; +const { defaults: settingDefaults } = useSettingStorage(); +const { + layouts, + charset, + rdpResolution, + backspaceAsCtrlH, + keyboardLayout, + rdpClientOption, + rdpColorQuality, + rdpSmartSize +} = settingManager; const { setCharsetPreference, setRdpResolutionPreference, @@ -46,6 +57,27 @@ const { visibleAssets } = useDisplayAssets( computed(() => props.platform) ); +const isSameArray = (left?: string[], right?: string[]) => { + const l = Array.isArray(left) ? left : []; + const r = Array.isArray(right) ? right : []; + if (l.length !== r.length) return false; + const ls = [...l].sort(); + const rs = [...r].sort(); + return ls.every((item, idx) => item === rs[idx]); +}; + +const isUsingLocalDefaults = () => { + return ( + (charset.value || settingDefaults.charset) === settingDefaults.charset + && (rdpResolution.value || settingDefaults.rdpResolution) === settingDefaults.rdpResolution + && (backspaceAsCtrlH.value ?? settingDefaults.backspaceAsCtrlH) === settingDefaults.backspaceAsCtrlH + && (keyboardLayout.value || settingDefaults.keyboardLayout) === settingDefaults.keyboardLayout + && isSameArray(rdpClientOption.value, settingDefaults.rdpClientOption) + && (rdpColorQuality.value || settingDefaults.rdpColorQuality) === settingDefaults.rdpColorQuality + && (rdpSmartSize.value || settingDefaults.rdpSmartSize) === settingDefaults.rdpSmartSize + ); +}; + watch( () => loggedIn.value, async (nv: boolean) => { @@ -165,6 +197,8 @@ const listenTauriEvent = async () => { userInfoStore.setRdpClientOption(settingConfig.graphics); + if (!isUsingLocalDefaults()) return; + setCharsetPreference((settingConfig.command_line?.charset as CharsetType) || "default"); setBackspacePreference(!!settingConfig.command_line?.is_backspace_as_ctrl_h); setRdpResolutionPreference((settingConfig.graphics?.rdp_resolution as ResolutionType) || "auto"); diff --git a/ui/components/Card/AssetIcon/assetIcon.vue b/ui/components/Card/AssetIcon/assetIcon.vue index 15139df..c52d8d1 100644 --- a/ui/components/Card/AssetIcon/assetIcon.vue +++ b/ui/components/Card/AssetIcon/assetIcon.vue @@ -24,7 +24,8 @@ const imageProps = computed(() => { redis: "/icons/redis.png", mongodb: "/icons/mongodb.png", dameng: "/icons/dameng.png", - clickhouse: "/icons/clickhouse.png" + clickhouse: "/icons/clickhouse.png", + windows_ad: "/icons/windows.png" }; const src = iconMap[props.type] || ""; diff --git a/ui/components/SideBar/sideBar.vue b/ui/components/SideBar/sideBar.vue index 0cfa594..05b5e36 100644 --- a/ui/components/SideBar/sideBar.vue +++ b/ui/components/SideBar/sideBar.vue @@ -33,6 +33,12 @@ const sideBarItems = computed(() => { to: localePath("windows"), disabled: isLoading.value }, + { + label: t("Menu.DirectoryService"), + icon: "lucide:folder-tree", + to: localePath("windows_ad"), + disabled: isLoading.value + }, { label: t("Menu.Database"), icon: "gravity-ui:database", diff --git a/ui/composables/useAssetFetcher.ts b/ui/composables/useAssetFetcher.ts index d9889ee..ce8b140 100644 --- a/ui/composables/useAssetFetcher.ts +++ b/ui/composables/useAssetFetcher.ts @@ -180,6 +180,8 @@ export const useAssetFetcher = (assetType: AssetPageType, scrollRef?: Ref { + const typeValue = it.type?.value?.toLowerCase(); + return typeValue === "windows_ad"; + }); case "database": return items.filter((it) => { const typeValue = it.category?.value?.toLowerCase(); diff --git a/ui/pages/windows_ad.vue b/ui/pages/windows_ad.vue new file mode 100644 index 0000000..d7dd51a --- /dev/null +++ b/ui/pages/windows_ad.vue @@ -0,0 +1,5 @@ + + + diff --git a/ui/types/index.ts b/ui/types/index.ts index 6a6b1dd..03fd990 100644 --- a/ui/types/index.ts +++ b/ui/types/index.ts @@ -8,7 +8,7 @@ export type LangType = "zh" | "en"; export type LanguagePreference = LangType | "system"; export type CharsetType = "default" | "utf8" | "gbk" | "gb2312" | "ios-8859-1"; export type ResolutionType = "auto" | "1024x768" | "1366x768" | "1600x900" | "1920x1080"; -export type AssetPageType = "linux" | "windows" | "database" | "device" | "favorite"; +export type AssetPageType = "linux" | "windows" | "windows_ad" | "database" | "device" | "favorite"; export interface ActionItem { key: string