From 077b274a28c8378efd16fd411c15bda7f5d33f4b Mon Sep 17 00:00:00 2001 From: xream Date: Sun, 17 Aug 2025 22:36:12 +0800 Subject: [PATCH 001/126] =?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 040/126] =?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 041/126] =?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 042/126] =?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 043/126] =?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 044/126] =?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 045/126] =?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': From e57105236146f51743c6b66f0447c5696abad337 Mon Sep 17 00:00:00 2001 From: xream Date: Sun, 1 Mar 2026 11:16:09 +0800 Subject: [PATCH 046/126] =?UTF-8?q?chore:=20=E6=96=87=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- src/views/My.vue | 2 +- src/views/SubEditor.vue | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index a192fe412..20665e9fe 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sub-store-front-end", - "version": "2.16.18", + "version": "2.16.19", "private": true, "scripts": { "dev": "vite --host", diff --git a/src/views/My.vue b/src/views/My.vue index 05482f0f6..fa6d86b2b 100644 --- a/src/views/My.vue +++ b/src/views/My.vue @@ -886,7 +886,7 @@ const proxyTips = () => { const uaTips = () => { Dialog({ title: '默认为 clash.meta', - content: '可尝试设置为 clash-verge/v1.5.1 等客户端的 User-Agent 让机场后端下发更多协议', + content: '可尝试设置为 clash-verge/v2.4.6, v2rayNG 等客户端的 User-Agent 让机场后端下发更多协议(可根据实际情况改成最新版本号)', popClass: 'auto-dialog', okText: 'OK', noCancelBtn: true, diff --git a/src/views/SubEditor.vue b/src/views/SubEditor.vue index 5d131fbdb..605afdc56 100644 --- a/src/views/SubEditor.vue +++ b/src/views/SubEditor.vue @@ -1106,7 +1106,7 @@ const urlValidator = (val: string): Promise => { const uaTips = () => { Dialog({ title: '默认使用配置中的全局 UA', - content: '可尝试设置为 clash-verge/v1.5.1 等客户端的 User-Agent 让机场后端下发更多协议', + content: '可尝试设置为 clash-verge/v2.4.6, v2rayNG 等客户端的 User-Agent 让机场后端下发更多协议(可根据实际情况改成最新版本号)', popClass: 'auto-dialog', okText: 'OK', noCancelBtn: true, From e5fc684305e938e6ec216611c2421986f7a69369 Mon Sep 17 00:00:00 2001 From: xream Date: Tue, 3 Mar 2026 05:12:11 +0800 Subject: [PATCH 047/126] feat: trust-tunnel -> trusttunnel --- package.json | 2 +- src/views/editor/components/FilterSelect.vue | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 20665e9fe..9c437c140 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sub-store-front-end", - "version": "2.16.19", + "version": "2.16.20", "private": true, "scripts": { "dev": "vite --host", diff --git a/src/views/editor/components/FilterSelect.vue b/src/views/editor/components/FilterSelect.vue index 468299edb..ac659098a 100644 --- a/src/views/editor/components/FilterSelect.vue +++ b/src/views/editor/components/FilterSelect.vue @@ -75,7 +75,7 @@ 'sudoku', 'masque', 'anytls', - 'trust-tunnel', + 'trusttunnel', 'wireguard', 'ssh', 'external', From 808e99233d9ef8306956f8671e9c635db010c720 Mon Sep 17 00:00:00 2001 From: hyruleboss Date: Thu, 5 Mar 2026 15:29:13 +0800 Subject: [PATCH 048/126] =?UTF-8?q?fix:=20=E5=A2=9E=E5=8A=A0=E5=88=86?= =?UTF-8?q?=E4=BA=AB=E7=AE=A1=E7=90=86=E6=8B=96=E6=8B=BD=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- src/api/share/index.ts | 7 ++ src/store/subs.ts | 1 - src/views/share/Share.vue | 216 +++++++++++++++++++++++++++----------- 4 files changed, 160 insertions(+), 66 deletions(-) diff --git a/package.json b/package.json index 9c437c140..42d6e6fcc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sub-store-front-end", - "version": "2.16.20", + "version": "2.16.21", "private": true, "scripts": { "dev": "vite --host", diff --git a/src/api/share/index.ts b/src/api/share/index.ts index 2fd3f1438..e7bbac6f9 100644 --- a/src/api/share/index.ts +++ b/src/api/share/index.ts @@ -25,5 +25,12 @@ export function useShareApi() { params: { type, name }, }); }, + sortShares: (data: string[]): AxiosPromise => { + return request({ + url: `/api/sort/tokens`, + method: "post", + data, + }); + }, }; } diff --git a/src/store/subs.ts b/src/store/subs.ts index 6de03c0cf..76fa4a7fa 100644 --- a/src/store/subs.ts +++ b/src/store/subs.ts @@ -380,7 +380,6 @@ export const useSubsStore = defineStore('subsStore', { async fetchShareData() { Promise.all([shareApi.getShares()]).then((res) => { if ("data" in res[0].data) { - console.log('res[0].data.data', res[0].data.data); this.shares = res[0].data.data; } }).catch((err) => { diff --git a/src/views/share/Share.vue b/src/views/share/Share.vue index 53751b8e5..1e3599c71 100644 --- a/src/views/share/Share.vue +++ b/src/views/share/Share.vue @@ -66,20 +66,36 @@ -
-
- -
-
+ + + -
-
- -
-
+ + + -
-
- -
-
+ + + @@ -202,12 +250,15 @@ diff --git a/src/views/settings/APISetting.vue b/src/views/settings/APISetting.vue index 62cf52d20..7d6f58ed6 100644 --- a/src/views/settings/APISetting.vue +++ b/src/views/settings/APISetting.vue @@ -100,11 +100,11 @@
@@ -362,12 +362,12 @@ watchEffect(() => { parsedPath.value = ''; } - previewUrl.value = `http://${parsedHost.value}/${parsedPath.value}`; + previewUrl.value = `http://${parsedHost.value}${(parsedPath.value && parsedPath.value !== '/') ? `/${parsedPath.value}` : ''}`; } else { inputType.value = 'path'; parsedPath.value = input.replace(/^\/+/, ''); parsedHost.value = ''; - previewUrl.value = `${currentOrigin.value}/${parsedPath.value}`; + previewUrl.value = `${currentOrigin.value}${(parsedPath.value && parsedPath.value !== '/') ? `/${parsedPath.value}` : ''}`; } }); From 875b6e52d6bfc3ebde41410a0847ed0463060ad0 Mon Sep 17 00:00:00 2001 From: xream Date: Mon, 23 Mar 2026 15:05:00 +0800 Subject: [PATCH 050/126] =?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=20Tailscale?= 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 8eabfb3f4..cdc715320 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sub-store-front-end", - "version": "2.16.22", + "version": "2.16.23", "private": true, "scripts": { "dev": "vite --host", diff --git a/src/locales/en.ts b/src/locales/en.ts index 43fcc311e..3f5ed98ea 100644 --- a/src/locales/en.ts +++ b/src/locales/en.ts @@ -482,6 +482,7 @@ export default { "MASQUE", "AnyTLS", 'TrustTunnel', + 'Tailscale', "WireGuard", "SSH", "External Proxy Program", diff --git a/src/locales/zh.ts b/src/locales/zh.ts index 6555baf1e..1636e1357 100644 --- a/src/locales/zh.ts +++ b/src/locales/zh.ts @@ -498,6 +498,7 @@ export default { 'MASQUE', 'AnyTLS', 'TrustTunnel', + 'Tailscale', 'WireGuard', 'SSH', 'External Proxy Program', diff --git a/src/views/editor/components/FilterSelect.vue b/src/views/editor/components/FilterSelect.vue index ac659098a..8f99d43aa 100644 --- a/src/views/editor/components/FilterSelect.vue +++ b/src/views/editor/components/FilterSelect.vue @@ -76,6 +76,7 @@ 'masque', 'anytls', 'trusttunnel', + 'tailscale', 'wireguard', 'ssh', 'external', From 5f2e188db3f010f18f216c5a6ce7ea8358420b7b Mon Sep 17 00:00:00 2001 From: xream Date: Tue, 24 Mar 2026 17:02:49 +0800 Subject: [PATCH 051/126] =?UTF-8?q?feat:=20=E5=88=86=E4=BA=AB=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=94=AF=E6=8C=81=E5=A4=9A=E9=80=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/locales/en.ts | 15 ++ src/locales/zh.ts | 15 ++ src/views/share/Share.vue | 313 +++++++++++++++++++++++++++++++++++++- 3 files changed, 339 insertions(+), 4 deletions(-) diff --git a/src/locales/en.ts b/src/locales/en.ts index 3f5ed98ea..47203204d 100644 --- a/src/locales/en.ts +++ b/src/locales/en.ts @@ -862,6 +862,21 @@ export default { cancel: "Cancel", }, }, + selectMode: { + enter: "Select", + cancel: "Cancel", + selectedCount: "{count} selected", + selectAll: "Select All", + clearAll: "Clear All", + delete: "Delete", + }, + batchDelete: { + title: "Delete Selected Shares", + desc: "Are you sure you want to delete the selected {count} share(s)? Deletion is not recoverable!", + succeedNotify: "Selected shares deleted successfully!", + failNotify: "Failed to delete selected shares", + result: "Deleted {success}, failed {failed}", + }, }, // 图标仓库页 iconCollectionPage: { diff --git a/src/locales/zh.ts b/src/locales/zh.ts index 1636e1357..05a0c8926 100644 --- a/src/locales/zh.ts +++ b/src/locales/zh.ts @@ -851,6 +851,21 @@ export default { cancel: "取消", }, }, + selectMode: { + enter: "多选", + cancel: "取消多选", + selectedCount: "已选 {count} 项", + selectAll: "全选", + clearAll: "取消全选", + delete: "删除", + }, + batchDelete: { + title: "批量删除分享", + desc: "是否确认删除选中的 {count} 项分享?删除后不可恢复!", + succeedNotify: "批量删除分享成功!", + failNotify: "批量删除分享失败", + result: "成功删除 {success} 项,失败 {failed} 项", + }, }, // 图标仓库页 iconCollectionPage: { diff --git a/src/views/share/Share.vue b/src/views/share/Share.vue index 1e3599c71..8a906f1bf 100644 --- a/src/views/share/Share.vue +++ b/src/views/share/Share.vue @@ -50,7 +50,23 @@
-
+