From 077b274a28c8378efd16fd411c15bda7f5d33f4b Mon Sep 17 00:00:00 2001 From: xream Date: Sun, 17 Aug 2025 22:36:12 +0800 Subject: [PATCH 01/45] =?UTF-8?q?feat:=20=E6=96=87=E4=BB=B6=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E6=A0=87=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- src/components/FileListItem.vue | 11 ++ src/components/TagPopup.vue | 59 ++++++---- src/views/File.vue | 192 ++++++++++++++++++++++++++------ src/views/FileEditor.vue | 79 +++++++++++++ src/views/Sub.vue | 2 +- 6 files changed, 288 insertions(+), 57 deletions(-) diff --git a/package.json b/package.json index 7025c829d..8256d5993 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sub-store-front-end", - "version": "2.15.66", + "version": "2.15.69", "private": true, "scripts": { "dev": "vite --host", diff --git a/src/components/FileListItem.vue b/src/components/FileListItem.vue index 409484da1..edf7bed9b 100644 --- a/src/components/FileListItem.vue +++ b/src/components/FileListItem.vue @@ -47,9 +47,15 @@

{{ displayName || name }} + + {{ i }} +

{{ displayName || name }} + + {{ i }} +

@@ -289,6 +295,7 @@ props[props.type].displayName || props[props.type]['display-name']; const name = props[props.type].name; + const tag = props[props.type].tag; const remark = props[props.type].remark; const remarkText = computed(() => { if (remark) { @@ -587,6 +594,10 @@ overflow: hidden; font-size: 16px; color: var(--primary-text-color); + vertical-align: middle; + } + .tag { + margin: 0 2px; } .compare-sub-link, .share-sub-link, diff --git a/src/components/TagPopup.vue b/src/components/TagPopup.vue index 76d5af2c0..d27f94fda 100644 --- a/src/components/TagPopup.vue +++ b/src/components/TagPopup.vue @@ -85,7 +85,7 @@ import { useI18n } from "vue-i18n"; const { t } = useI18n(); const subsStore = useSubsStore(); -const { hasSubs, hasCollections, subs, collections } = storeToRefs(subsStore); +const { hasSubs, hasCollections, subs, collections, hasFiles, files } = storeToRefs(subsStore); const hasUntagged = ref(false); const props = defineProps({ visible: { @@ -96,6 +96,10 @@ const props = defineProps({ type: String, default: '', }, + type: { + type: String, + default: 'subCol', + }, }); const isVisible = ref(props.visible); const keyword = ref(""); @@ -135,27 +139,40 @@ const allTagsList = computed(() => { return allTags.value.filter(i => i.label.indexOf(keyword.value) !== -1) }) const getTags = () => { - if(!hasSubs.value && !hasCollections.value) return [] - // 从 subs 和 collections 中获取所有的 tag, 去重 + if(props.type === 'file' && !hasFiles.value) return [] + if(props.type === 'subCol' && !hasSubs.value && !hasCollections.value) return [] const set = new Set() - subs.value.forEach(sub => { - if (Array.isArray(sub.tag) && sub.tag.length > 0) { - sub.tag.forEach(i => { - set.add(i) - }); - } else { - hasUntagged.value = true - } - }) - collections.value.forEach(col => { - if (Array.isArray(col.tag) && col.tag.length > 0) { - col.tag.forEach(i => { - set.add(i) - }); - } else { - hasUntagged.value = true - } - }) + if (props.type === 'subCol') { + // 从 subs 和 collections 中获取所有的 tag, 去重 + subs.value.forEach(sub => { + if (Array.isArray(sub.tag) && sub.tag.length > 0) { + sub.tag.forEach(i => { + set.add(i) + }); + } else { + hasUntagged.value = true + } + }) + collections.value.forEach(col => { + if (Array.isArray(col.tag) && col.tag.length > 0) { + col.tag.forEach(i => { + set.add(i) + }); + } else { + hasUntagged.value = true + } + }) + } else if (props.type === 'file') { + files.value.forEach(file => { + if (Array.isArray(file.tag) && file.tag.length > 0) { + file.tag.forEach(i => { + set.add(i) + }); + } else { + hasUntagged.value = true + } + }) + } let tags: any[] = Array.from(set) if(tags.length === 0) return [] diff --git a/src/views/File.vue b/src/views/File.vue index 7efb9e634..6988304fd 100644 --- a/src/views/File.vue +++ b/src/views/File.vue @@ -108,36 +108,44 @@
-
- - - +
+ + + {{ i.label }} + +
+
+
+ + + +
@@ -194,7 +202,7 @@ diff --git a/src/views/FileEditor.vue b/src/views/FileEditor.vue index 751c67894..863d11a4a 100644 --- a/src/views/FileEditor.vue +++ b/src/views/FileEditor.vue @@ -77,6 +77,23 @@
+ + + + + {{ t(`editorPage.subConfig.sourceNamePicker.emptyTips`) }}

+ + From 693ee517271d091eccdc7ee410dc3620ed3826ee Mon Sep 17 00:00:00 2001 From: xream Date: Tue, 27 Jan 2026 16:05:57 +0800 Subject: [PATCH 40/45] =?UTF-8?q?feat:=20=E5=8D=8F=E8=AE=AE=E8=BF=87?= =?UTF-8?q?=E6=BB=A4=E6=94=AF=E6=8C=81=20TrustTunnel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- src/locales/en.ts | 1 + src/locales/zh.ts | 1 + src/views/editor/components/FilterSelect.vue | 1 + 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 8393df857..ebc9aeb76 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sub-store-front-end", - "version": "2.16.11", + "version": "2.16.12", "private": true, "scripts": { "dev": "vite --host", diff --git a/src/locales/en.ts b/src/locales/en.ts index 84e0ff8cb..66f274c68 100644 --- a/src/locales/en.ts +++ b/src/locales/en.ts @@ -480,6 +480,7 @@ export default { "mieru", "sudoku", "AnyTLS", + 'TrustTunnel', "WireGuard", "SSH", "External Proxy Program", diff --git a/src/locales/zh.ts b/src/locales/zh.ts index d2f1b2a24..6ab3eb8ac 100644 --- a/src/locales/zh.ts +++ b/src/locales/zh.ts @@ -496,6 +496,7 @@ export default { 'mieru', 'sudoku', 'AnyTLS', + 'TrustTunnel', 'WireGuard', 'SSH', 'External Proxy Program', diff --git a/src/views/editor/components/FilterSelect.vue b/src/views/editor/components/FilterSelect.vue index ad8f37228..f0cbdc0b4 100644 --- a/src/views/editor/components/FilterSelect.vue +++ b/src/views/editor/components/FilterSelect.vue @@ -74,6 +74,7 @@ 'mieru', 'sudoku', 'anytls', + 'trust-tunnel', 'wireguard', 'ssh', 'external', From 98c9e22e1d5a9580ba500b1930a638ff791f55f4 Mon Sep 17 00:00:00 2001 From: xream Date: Mon, 9 Feb 2026 00:53:12 +0800 Subject: [PATCH 41/45] =?UTF-8?q?feat:=20=E5=8D=8F=E8=AE=AE=E8=BF=87?= =?UTF-8?q?=E6=BB=A4=E6=94=AF=E6=8C=81=20MASQUE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- src/locales/en.ts | 1 + src/locales/zh.ts | 1 + src/views/editor/components/FilterSelect.vue | 1 + 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index ebc9aeb76..2fc87b47e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sub-store-front-end", - "version": "2.16.12", + "version": "2.16.13", "private": true, "scripts": { "dev": "vite --host", diff --git a/src/locales/en.ts b/src/locales/en.ts index 66f274c68..f731b3d91 100644 --- a/src/locales/en.ts +++ b/src/locales/en.ts @@ -479,6 +479,7 @@ export default { "Juicity", "mieru", "sudoku", + "MASQUE", "AnyTLS", 'TrustTunnel', "WireGuard", diff --git a/src/locales/zh.ts b/src/locales/zh.ts index 6ab3eb8ac..3ab460eb4 100644 --- a/src/locales/zh.ts +++ b/src/locales/zh.ts @@ -495,6 +495,7 @@ export default { 'Juicity', 'mieru', 'sudoku', + 'MASQUE', 'AnyTLS', 'TrustTunnel', 'WireGuard', diff --git a/src/views/editor/components/FilterSelect.vue b/src/views/editor/components/FilterSelect.vue index f0cbdc0b4..468299edb 100644 --- a/src/views/editor/components/FilterSelect.vue +++ b/src/views/editor/components/FilterSelect.vue @@ -73,6 +73,7 @@ 'juicity', 'mieru', 'sudoku', + 'masque', 'anytls', 'trust-tunnel', 'wireguard', From 89288f77878999d85e4c3b30365b30769b301c58 Mon Sep 17 00:00:00 2001 From: xream Date: Fri, 13 Feb 2026 01:05:31 +0800 Subject: [PATCH 42/45] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E5=88=86?= =?UTF-8?q?=E4=BA=AB=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- src/locales/zh.ts | 10 +++++----- src/views/share/SharePopup.vue | 5 ++++- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 2fc87b47e..d81244525 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sub-store-front-end", - "version": "2.16.13", + "version": "2.16.14", "private": true, "scripts": { "dev": "vite --host", diff --git a/src/locales/zh.ts b/src/locales/zh.ts index 3ab460eb4..a3d8ec6e8 100644 --- a/src/locales/zh.ts +++ b/src/locales/zh.ts @@ -29,8 +29,8 @@ export default { expiresValuePlaceholder: '请输入有效期时长', expiresValueRegex: '请输入0.01-99999.99范围内的数字', expiresUnit: '有效期单位', - token: '自定义Token', - tokenPlaceholder: '默认后端随机Token', + token: '自定义 Token', + tokenPlaceholder: '默认后端随机 Token', remark: '备注', remarkPlaceholder: '请输入备注', shareUrl: '分享链接', @@ -793,15 +793,15 @@ export default { expiresValue: { label: "有效期时长", placeholder: "请输入有效期时长", - regex: "请输入0.01-99999.99范围内的数字", + regex: "请输入 0.01-99999.99 范围内的数字", empty: "有效期时长不可为空", }, expiresUnit: { label: "有效期单位", }, token: { - label: "自定义Token", - placeholder: "默认后端随机Token" + label: "自定义 Token", + placeholder: "默认后端随机 Token" }, remark: { label: "备注", diff --git a/src/views/share/SharePopup.vue b/src/views/share/SharePopup.vue index bee9b17ff..07fe29c95 100644 --- a/src/views/share/SharePopup.vue +++ b/src/views/share/SharePopup.vue @@ -229,10 +229,11 @@ input-align="left" rows="3" :autosize="{ maxHeight: 140 }" - :readonly="!isUpdateShare" + readonly /> @@ -393,6 +394,7 @@ watchEffect(() => { form.name = props.data?.name; form.displayName = props.data?.displayName; form.type = props.data?.type; + form.token = props.data?.token; } else { form.expiresValue = ""; form.expiresUnit = "day"; @@ -513,6 +515,7 @@ const handleUpdateShare = async () => { console.log("form", form); console.log("props.data", props.data); isUpdateShare.value = true; + form.shareUrl = '' }, onCancel: () => { console.log("取消"); From f840b0a5d7f9de5032c7035bbfdd177f484347dc Mon Sep 17 00:00:00 2001 From: xream Date: Mon, 16 Feb 2026 10:03:07 +0800 Subject: [PATCH 43/45] =?UTF-8?q?feat:=20=E8=BF=9C=E7=A8=8B=E9=93=BE?= =?UTF-8?q?=E6=8E=A5=E6=94=AF=E6=8C=81=E5=AE=8C=E5=85=A8=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E8=AF=B7=E6=B1=82=E5=A4=B4(=E5=90=8E=E7=AB=AF=20>=3D?= =?UTF-8?q?=202.21.25)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- src/locales/en.ts | 4 ++-- src/locales/zh.ts | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index d81244525..7d5f4e330 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sub-store-front-end", - "version": "2.16.14", + "version": "2.16.16", "private": true, "scripts": { "dev": "vite --host", diff --git a/src/locales/en.ts b/src/locales/en.ts index f731b3d91..43fcc311e 100644 --- a/src/locales/en.ts +++ b/src/locales/en.ts @@ -94,7 +94,7 @@ export default { url: { label: "URL", placeholder: - "Supports mixing three types of formats with line breaks: 1. Full remote URL 2. Internal file reference like /api/file/name 3. Absolute path for local file. Supported parameters: noCache - do not use cache; insecure - do not verify the server certificate. For example: http://a.com#noCache&insecure", + 'Supports mixing three types of formats with line breaks: 1. Full remote URL 2. Internal file reference like /api/file/name 3. Absolute path for local file. Supported parameters: noCache - do not use cache; insecure - do not verify the server certificate; headers - custom request headers (single-line JSON string). For example: http://a.com#noCache&insecure', isEmpty: "URL cannot be empty", isIllegal: "Invalid URL", }, @@ -298,7 +298,7 @@ export default { label: "Usage", title: "Subscription URL(s)", content: - "Supports mixing three types of formats with line breaks:\n1. Full remote URL\n2. Internal file reference like /api/file/name 3.\nAbsolute path for local file\n\nSupported parameters:\n\ninsecure: https requests will not verify the server certificate\ncacheKey: Setting the name of the optimistic cache. Its value can be managed in the persistent store(suitable for subscriptions that often fail to fetch).\n\nvalidCheck: error will be reported when expired or there is no remaining traffic\n\nflowUserAgent: the User-Agent for fetching subscription usage info\n\nflowUrl: the URL for fetching subscription usage info(using the content of the response body or response headers)\n\nshowRemaining: show remaining traffic instead of usage\n\nnoFlow: do not query for flow\n\nhideExpire: hide expiration time\n\nnoCache: do not use cache\n\nresetDay: the day when monthly data usage resets\n\nstartDate: subscription start date\n\ncycleDays: reset cycle (in days).\n\nFor example: http://a.com?token=1#cycleDays=31&startDate=2024-06-04 \nor http://a.com?token=1#resetDay=15", + "Supports mixing three types of formats with line breaks:\n1. Full remote URL\n2. Internal file reference like /api/file/name 3.\nAbsolute path for local file\n\nSupported parameters:\n\nheaders: Custom request headers(single-line JSON string)\ninsecure: https requests will not verify the server certificate\ncacheKey: Setting the name of the optimistic cache. Its value can be managed in the persistent store(suitable for subscriptions that often fail to fetch).\n\nvalidCheck: error will be reported when expired or there is no remaining traffic\n\nflowUserAgent: the User-Agent for fetching subscription usage info\n\nflowUrl: the URL for fetching subscription usage info(using the content of the response body or response headers)\n\nshowRemaining: show remaining traffic instead of usage\n\nnoFlow: do not query for flow\n\nhideExpire: hide expiration time\n\nnoCache: do not use cache\n\nresetDay: the day when monthly data usage resets\n\nstartDate: subscription start date\n\ncycleDays: reset cycle (in days).\n\nFor example: http://a.com?token=1#cycleDays=31&startDate=2024-06-04 \nor http://a.com?token=1#resetDay=15", }, isEmpty: "URL cannot be empty", isIllegal: "Invalid URL", diff --git a/src/locales/zh.ts b/src/locales/zh.ts index a3d8ec6e8..6555baf1e 100644 --- a/src/locales/zh.ts +++ b/src/locales/zh.ts @@ -120,7 +120,7 @@ export default { }, url: { label: '链接', - placeholder: '支持换行混写三种格式: 1. 完整远程链接 2. 类似 /api/file/name 的内部文件调用路径 3. 本地文件的绝对路径. 支持参数: noCache 不使用缓存; insecure 不验证服务器证书. 例: http://a.com#noCache&insecure', + placeholder: '支持换行混写三种格式: 1. 完整远程链接 2. 类似 /api/file/name 的内部文件调用路径 3. 本地文件的绝对路径. 支持参数: noCache 不使用缓存; insecure 不验证服务器证书; headers 自定义请求头(单行 JSON 字符串). 例: http://a.com#noCache&insecure', isEmpty: '链接不能为空', isIllegal: '链接格式非法', }, @@ -318,7 +318,7 @@ export default { fullScreenEditCancel: '取消全屏', label: '使用说明', title: '订阅链接', - content: '支持使用换行混写三种格式:\n1. 完整远程链接\n2. 类似 /api/file/name 的内部文件调用路径\n3. 本地文件的绝对路径\n\n支持以下参数\n\ninsecure: 不验证服务器证书\ncacheKey: 设置乐观缓存的名称 开启后也可自行在持久化缓存中管理(适合经常拉取失败的订阅)\nvalidCheck: 过期或无剩余流量时报错\nflowUserAgent: 查询流量时使用的 User-Agent\nflowUrl: 自定义查询流量的 URL(优先响应体, 也支持响应头)\nnoFlow: 不查询流量\nhideExpire: 隐藏到期\nshowRemaining: 显示剩余流量而不是已用流量\nnoCache: 不使用缓存\nresetDay: 每月流量重置日\nstartDate: 订阅开始日期\ncycleDays: 订阅重置周期(单位: 天)\n\n例: http://a.com?token=1#cycleDays=31&startDate=2024-06-04\n或 http://a.com?token=1#resetDay=15', + content: '支持使用换行混写三种格式:\n1. 完整远程链接\n2. 类似 /api/file/name 的内部文件调用路径\n3. 本地文件的绝对路径\n\n支持以下参数\n\nheaders: 自定义请求响应头(单行 JSON 字符串)\ninsecure: 不验证服务器证书\ncacheKey: 设置乐观缓存的名称 开启后也可自行在持久化缓存中管理(适合经常拉取失败的订阅)\nvalidCheck: 过期或无剩余流量时报错\nflowUserAgent: 查询流量时使用的 User-Agent\nflowUrl: 自定义查询流量的 URL(优先响应体, 也支持响应头)\nnoFlow: 不查询流量\nhideExpire: 隐藏到期\nshowRemaining: 显示剩余流量而不是已用流量\nnoCache: 不使用缓存\nresetDay: 每月流量重置日\nstartDate: 订阅开始日期\ncycleDays: 订阅重置周期(单位: 天)\n\n例: http://a.com?token=1#cycleDays=31&startDate=2024-06-04\n或 http://a.com?token=1#resetDay=15', }, isEmpty: '订阅链接不能为空', isIllegal: '订阅链接格式非法', From 467f2c7e9c3dac2e8c95b3892c14c4d8d5daf833 Mon Sep 17 00:00:00 2001 From: hyruleboss Date: Wed, 25 Feb 2026 23:07:58 +0800 Subject: [PATCH 44/45] =?UTF-8?q?style:=20=E5=A2=9E=E5=BC=BA=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E9=A1=B5=E9=9D=A2=E6=A0=B7=E5=BC=8F=E5=85=BC=E5=AE=B9?= =?UTF-8?q?=E6=80=A7=EF=BC=8C=E7=BB=9F=E4=B8=80=E5=AF=BC=E8=88=AA=E6=A0=8F?= =?UTF-8?q?=E6=B8=A9=E9=A6=A8=E6=8F=90=E7=A4=BA=E4=BA=A4=E4=BA=92=EF=BC=88?= =?UTF-8?q?=E7=94=B1=20Toast=20=E6=94=B9=E4=B8=BA=20Dialog=20=E5=BD=A2?= =?UTF-8?q?=E5=BC=8F=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- src/components/ArtifactsListItem.vue | 16 +++++++++------- src/components/NavBar.vue | 25 +++++++++++++------------ 3 files changed, 23 insertions(+), 20 deletions(-) diff --git a/package.json b/package.json index 7d5f4e330..cca9335e4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sub-store-front-end", - "version": "2.16.16", + "version": "2.16.17", "private": true, "scripts": { "dev": "vite --host", diff --git a/src/components/ArtifactsListItem.vue b/src/components/ArtifactsListItem.vue index c058de9cd..57076c036 100644 --- a/src/components/ArtifactsListItem.vue +++ b/src/components/ArtifactsListItem.vue @@ -85,7 +85,7 @@ - + {{ $t(`syncPage.syncSwitcher`) }} @@ -645,12 +645,7 @@ watch(isSyncOpen, async () => { } .sub-item-detail { - display: -webkit-box; - -webkit-box-orient: vertical; - -webkit-line-clamp: 3; word-wrap: break-word; - word-break: break-all; - // overflow: hidden; // margin-top: 3.5px; font-size: 12px; @@ -674,6 +669,9 @@ watch(isSyncOpen, async () => { // line-height: 2.8; color: var(--comment-text-color); } + .switch-label { + flex-shrink: 0; + } .my-switch { height: 22px; @@ -689,7 +687,11 @@ watch(isSyncOpen, async () => { } p { - display: block; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; + word-break: break-all; line-height: 1.8; } diff --git a/src/components/NavBar.vue b/src/components/NavBar.vue index 8a3854db0..d74b161ce 100644 --- a/src/components/NavBar.vue +++ b/src/components/NavBar.vue @@ -99,7 +99,7 @@ import { useGlobalStore } from "@/store/global"; import { useSystemStore } from "@/store/system"; import { useSettingsStore } from '@/store/settings'; import { storeToRefs } from "pinia"; -import { Toast } from "@nutui/nutui"; +import { Toast, Dialog } from "@nutui/nutui"; import { initStores } from "@/utils/initApp"; import { useMethodStore } from '@/store/methodStore'; import { useAppNotifyStore } from "@/store/appNotify"; @@ -143,18 +143,19 @@ const currentTitleWhetherAsk = computed(() => { }); const onClickNavbarIcon = () => { const metaTitle = route.meta.title; - const toastContent = + const content = t(`navBar.pagesTitle.askWhat.${metaTitle}.content`) || ""; - const toastTitle = t(`navBar.pagesTitle.askWhat.${metaTitle}.title`) || ""; - Toast.text(toastContent, { - title: toastTitle, - duration: 0, - cover: true, - "close-on-click-overlay": true, - "bg-color": "rgba(0, 0, 0, 0.8)", - "cover-color": "rgba(0, 0, 0, 0.2)", - "text-align-center": false, - }); + const title = t(`navBar.pagesTitle.askWhat.${metaTitle}.title`) || ""; + Dialog({ + title: title, + content: content, + popClass: 'auto-dialog', + textAlign: 'left', + okText: 'OK', + noCancelBtn: true, + closeOnPopstate: true, + lockScroll: false, + }); }; const changeLang = (type: string) => { From e4ef9866497f1da7d1bce084ec31371f998c11ea Mon Sep 17 00:00:00 2001 From: xream Date: Fri, 27 Feb 2026 01:26:20 +0800 Subject: [PATCH 45/45] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=20Egern=20?= =?UTF-8?q?=E5=9B=BE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- src/hooks/useBackend.ts | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index cca9335e4..a192fe412 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sub-store-front-end", - "version": "2.16.17", + "version": "2.16.18", "private": true, "scripts": { "dev": "vite --host", diff --git a/src/hooks/useBackend.ts b/src/hooks/useBackend.ts index fef1bae26..5ff812a2a 100644 --- a/src/hooks/useBackend.ts +++ b/src/hooks/useBackend.ts @@ -3,6 +3,7 @@ import clash from '@/assets/icons/clash.png'; import quanx from '@/assets/icons/quanx.png'; import loon from '@/assets/icons/loon.png'; import stash from '@/assets/icons/stash.png'; +import egern from '@/assets/icons/egern.png'; import node from '@/assets/icons/node.svg?url'; import { useGlobalStore } from '@/store/global'; @@ -18,6 +19,8 @@ export const useBackend = () => { switch (env.value.backend) { case 'Surge': return surge; + case 'Egern': + return egern; case 'Clash': return clash; case 'QX':