From ae4a158e365271a6f1723f812b359b51bb26b83c Mon Sep 17 00:00:00 2001 From: "Sijie.Sun" Date: Tue, 24 Jun 2025 09:09:52 +0800 Subject: [PATCH] web improve (#1047) --- easytier-gui/src/styles.css | 2 - .../frontend-lib/src/components/Config.vue | 2 +- easytier-web/frontend-lib/src/locales/cn.yaml | 112 +++ easytier-web/frontend-lib/src/locales/en.yaml | 112 +++ easytier-web/frontend-lib/src/modules/i18n.ts | 12 + easytier-web/frontend-lib/src/style.css | 2 - easytier-web/frontend/index.html | 28 +- easytier-web/frontend/package.json | 4 +- easytier-web/frontend/src/App.vue | 3 +- .../frontend/src/components/DeviceDetails.vue | 211 +++++ .../frontend/src/components/DeviceList.vue | 760 +++++++++++++++++- .../src/components/DeviceManagement.vue | 326 ++++++-- .../frontend/src/components/Login.vue | 40 +- .../frontend/src/components/MainPage.vue | 109 +-- easytier-web/frontend/src/main.ts | 8 +- easytier-web/frontend/src/style.css | 27 +- easytier-web/frontend/vite.config.ts | 3 +- pnpm-lock.yaml | 43 + 18 files changed, 1628 insertions(+), 176 deletions(-) create mode 100644 easytier-web/frontend/src/components/DeviceDetails.vue diff --git a/easytier-gui/src/styles.css b/easytier-gui/src/styles.css index e10cdc8..a59a885 100644 --- a/easytier-gui/src/styles.css +++ b/easytier-gui/src/styles.css @@ -15,8 +15,6 @@ line-height: 24px; font-weight: 400; - color: #0f0f0f; - font-synthesis: none; text-rendering: optimizeLegibility; -webkit-font-smoothing: antialiased; diff --git a/easytier-web/frontend-lib/src/components/Config.vue b/easytier-web/frontend-lib/src/components/Config.vue index 3805d3e..73ac0fb 100644 --- a/easytier-web/frontend-lib/src/components/Config.vue +++ b/easytier-web/frontend-lib/src/components/Config.vue @@ -218,7 +218,7 @@ const bool_flags: BoolFlag[] = [ diff --git a/easytier-web/frontend-lib/src/locales/cn.yaml b/easytier-web/frontend-lib/src/locales/cn.yaml index bb19881..a2731be 100644 --- a/easytier-web/frontend-lib/src/locales/cn.yaml +++ b/easytier-web/frontend-lib/src/locales/cn.yaml @@ -203,3 +203,115 @@ event: DhcpIpv4Changed: DHCP IPv4地址更改 DhcpIpv4Conflicted: DHCP IPv4地址冲突 PortForwardAdded: 端口转发添加 + +web: + login: + title: 登录 + username: 用户名 + password: 密码 + submit: 登录 + register: 注册 + remember_me: 记住我 + api_host: API主机 + captcha: 验证码 + back_to_login: 返回登录 + login: 登录 + + register: + title: 注册 + username: 用户名 + password: 密码 + confirm_password: 确认密码 + submit: 注册 + login: 返回登录 + + main: + dashboard: 仪表盘 + device_list: 设备列表 + device_management: 设备管理 + login_page: 登录页面 + settings: 设置 + logout: 退出登录 + language: 语言 + change_password: 修改密码 + + device: + list: 设备列表 + management: 设备管理 + add: 添加设备 + delete: 删除设备 + refresh: 刷新 + status: 状态 + online: 在线 + offline: 离线 + last_seen: 最后在线 + no_devices: 未找到设备 + sort_by: 排序依据 + sort_direction: 排序方向 + show_detailed_view: 显示详情 + hide_detailed_view: 隐藏详情 + sort_by_hostname: 主机名 + sort_by_public_ip: 公网IP + sort_by_version: 版本 + sort_by_networks: 网络数量 + sort_direction_asc: 当前升序,点击切换为降序 + sort_direction_desc: 当前降序,点击切换为升序 + hostname: 主机名 + public_ip: 公网IP + networks: 网络数量 + last_report: 最后在线 + version: 版本 + machine_id: 机器ID + + device_management: + edit_network: 编辑网络 + export_config: 导出配置 + delete_network: 删除网络 + network: 网络 + select_network: 选择网络 + create_network: 创建网络 + cancel_creation: 取消创建 + more_actions: 更多操作 + edit_as_file: 编辑为文件 + import_config: 导入配置 + create_new: 创建新网络 + network_status: 网络状态 + network_configuration: 网络配置 + loading_network_configuration: 加载网络配置 + no_network_selected: 未选择网络 + select_existing_network_or_create_new: 选择现有网络实例或创建新网络以管理网络设置 + disable_network: 禁用网络 + + network: + title: 网络 + create: 创建网络 + delete: 删除网络 + start: 启动网络 + stop: 停止网络 + config: 网络配置 + status: 网络状态 + import: 导入配置 + export: 导出配置 + + common: + confirm: 确认 + cancel: 取消 + save: 保存 + delete: 删除 + edit: 编辑 + refresh: 刷新 + loading: 加载中... + error: 错误 + success: 成功 + warning: 警告 + info: 提示 + + settings: + title: 设置 + change_password: 修改密码 + old_password: 旧密码 + new_password: 新密码 + confirm_password: 确认新密码 + language: 语言 + theme: 主题 + logout: 退出登录 \ No newline at end of file diff --git a/easytier-web/frontend-lib/src/locales/en.yaml b/easytier-web/frontend-lib/src/locales/en.yaml index e89efb7..a567a50 100644 --- a/easytier-web/frontend-lib/src/locales/en.yaml +++ b/easytier-web/frontend-lib/src/locales/en.yaml @@ -203,3 +203,115 @@ event: DhcpIpv4Changed: DhcpIpv4Changed DhcpIpv4Conflicted: DhcpIpv4Conflicted PortForwardAdded: PortForwardAdded + +web: + login: + title: Login + username: Username + password: Password + submit: Login + register: Register + remember_me: Remember Me + api_host: API Host + captcha: Captcha + back_to_login: Back to Login + login: Login + + register: + title: Register + username: Username + password: Password + confirm_password: Confirm Password + submit: Register + login: Back to Login + + main: + dashboard: Dashboard + device_list: Device List + device_management: Device Management + login_page: Login Page + settings: Settings + logout: Logout + language: Language + change_password: Change Password + + device: + list: Device List + management: Device Management + add: Add Device + delete: Delete Device + refresh: Refresh + status: Status + online: Online + offline: Offline + last_seen: Last Seen + no_devices: No Devices Found + sort_by: Sort By + sort_direction: Sort Direction + show_detailed_view: Show Details + hide_detailed_view: Hide Details + sort_by_hostname: Hostname + sort_by_public_ip: Public IP + sort_by_version: Version + sort_by_networks: Network Count + sort_direction_asc: Currently ascending, click to switch to descending + sort_direction_desc: Currently descending, click to switch to ascending + hostname: Hostname + public_ip: Public IP + networks: Network Count + last_report: Last Seen + version: Version + machine_id: Machine ID + + device_management: + edit_network: Edit Network + export_config: Export Config + delete_network: Delete Network + network: Network + select_network: Select Network + create_network: Create Network + cancel_creation: Cancel Creation + more_actions: More Actions + edit_as_file: Edit as File + import_config: Import Config + create_new: Create New Network + network_status: Network Status + network_configuration: Network Configuration + loading_network_configuration: Loading Network Configuration + no_network_selected: No Network Selected + select_existing_network_or_create_new: Select an existing network instance or create a new one to manage network settings + disable_network: Disable Network + + network: + title: Network + create: Create Network + delete: Delete Network + start: Start Network + stop: Stop Network + config: Network Config + status: Network Status + import: Import Config + export: Export Config + + common: + confirm: Confirm + cancel: Cancel + save: Save + delete: Delete + edit: Edit + refresh: Refresh + loading: Loading... + error: Error + success: Success + warning: Warning + info: Info + + settings: + title: Settings + change_password: Change Password + old_password: Old Password + new_password: New Password + confirm_password: Confirm New Password + language: Language + theme: Theme + logout: Logout \ No newline at end of file diff --git a/easytier-web/frontend-lib/src/modules/i18n.ts b/easytier-web/frontend-lib/src/modules/i18n.ts index 257127f..623e859 100644 --- a/easytier-web/frontend-lib/src/modules/i18n.ts +++ b/easytier-web/frontend-lib/src/modules/i18n.ts @@ -22,6 +22,16 @@ export const availableLocales = Object.keys(localesMap) const loadedLanguages: string[] = [] +export function toggleLanguage() { + const currentLang = localStorage.getItem('lang') || 'en' + const newLang = currentLang === 'en' ? 'cn' : 'en' + loadLanguageAsync(newLang) +} + +export function getCurrentLanguage() { + return localStorage.getItem('lang') || 'en' +} + function setI18nLanguage(lang: Locale) { i18n.global.locale.value = lang as any localStorage.setItem('lang', lang) @@ -56,4 +66,6 @@ export default { i18n, localesMap, loadLanguageAsync, + toggleLanguage, + getCurrentLanguage, } diff --git a/easytier-web/frontend-lib/src/style.css b/easytier-web/frontend-lib/src/style.css index 1c62335..72d7d24 100644 --- a/easytier-web/frontend-lib/src/style.css +++ b/easytier-web/frontend-lib/src/style.css @@ -18,8 +18,6 @@ line-height: 24px; font-weight: 400; - color: #0f0f0f; - font-synthesis: none; text-rendering: optimizeLegibility; -webkit-font-smoothing: antialiased; diff --git a/easytier-web/frontend/index.html b/easytier-web/frontend/index.html index 74fa074..ed7220a 100644 --- a/easytier-web/frontend/index.html +++ b/easytier-web/frontend/index.html @@ -1,14 +1,18 @@ - - - - - EasyTier Dashboard - - - -
- - - + + + + + + EasyTier Dashboard + + + + +
+ + + + \ No newline at end of file diff --git a/easytier-web/frontend/package.json b/easytier-web/frontend/package.json index 23288e0..8a3d1af 100644 --- a/easytier-web/frontend/package.json +++ b/easytier-web/frontend/package.json @@ -16,7 +16,9 @@ "primevue": "4.3.3", "tailwindcss-primeui": "^0.3.4", "vue": "^3.5.12", - "vue-router": "4" + "vue-router": "4", + "vue-i18n": "^9.9.1", + "@modyfi/vite-plugin-yaml": "^1.1.0" }, "devDependencies": { "@types/node": "^22.8.6", diff --git a/easytier-web/frontend/src/App.vue b/easytier-web/frontend/src/App.vue index db360fb..10150a6 100644 --- a/easytier-web/frontend/src/App.vue +++ b/easytier-web/frontend/src/App.vue @@ -1,11 +1,10 @@ diff --git a/easytier-web/frontend/src/components/DeviceDetails.vue b/easytier-web/frontend/src/components/DeviceDetails.vue new file mode 100644 index 0000000..3364721 --- /dev/null +++ b/easytier-web/frontend/src/components/DeviceDetails.vue @@ -0,0 +1,211 @@ + + + + + diff --git a/easytier-web/frontend/src/components/DeviceList.vue b/easytier-web/frontend/src/components/DeviceList.vue index 9198eb0..e2884f5 100644 --- a/easytier-web/frontend/src/components/DeviceList.vue +++ b/easytier-web/frontend/src/components/DeviceList.vue @@ -1,13 +1,33 @@ - + + + \ No newline at end of file diff --git a/easytier-web/frontend/src/components/Login.vue b/easytier-web/frontend/src/components/Login.vue index 44c7055..9f8bf18 100644 --- a/easytier-web/frontend/src/components/Login.vue +++ b/easytier-web/frontend/src/components/Login.vue @@ -3,8 +3,11 @@ import { computed, onMounted, ref } from 'vue'; import { Card, InputText, Password, Button, AutoComplete } from 'primevue'; import { useRouter } from 'vue-router'; import { useToast } from 'primevue/usetoast'; -import { Api } from 'easytier-frontend-lib'; -import {getInitialApiHost, cleanAndLoadApiHosts, saveApiHost} from "../modules/api-host" +import { Api, I18nUtils } from 'easytier-frontend-lib'; +import { getInitialApiHost, cleanAndLoadApiHosts, saveApiHost } from "../modules/api-host" +import { useI18n } from 'vue-i18n' + +const { t } = useI18n() defineProps<{ isRegistering: boolean; @@ -74,57 +77,68 @@ onMounted(() => {
+ +
diff --git a/easytier-web/frontend/src/components/MainPage.vue b/easytier-web/frontend/src/components/MainPage.vue index 4163567..e1bd8b3 100644 --- a/easytier-web/frontend/src/components/MainPage.vue +++ b/easytier-web/frontend/src/components/MainPage.vue @@ -1,12 +1,14 @@