From 0ec4f84fa9d4d94048b8219896c3d8fb1d8d2175 Mon Sep 17 00:00:00 2001 From: web-ppanel Date: Tue, 27 Jan 2026 17:52:28 +0000 Subject: [PATCH 01/19] =?UTF-8?q?=F0=9F=A4=96=20chore(openapi):=20regenera?= =?UTF-8?q?te=20services=20&=20patch=20axios=20requestType=20typing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/ui/src/services/admin/ads.ts | 1 + .../ui/src/services/admin/announcement.ts | 1 + packages/ui/src/services/admin/application.ts | 1 + packages/ui/src/services/admin/authMethod.ts | 1 + packages/ui/src/services/admin/console.ts | 1 + packages/ui/src/services/admin/coupon.ts | 1 + packages/ui/src/services/admin/document.ts | 1 + packages/ui/src/services/admin/index.ts | 1 + packages/ui/src/services/admin/log.ts | 1 + packages/ui/src/services/admin/marketing.ts | 1 + packages/ui/src/services/admin/order.ts | 1 + packages/ui/src/services/admin/payment.ts | 1 + packages/ui/src/services/admin/server.ts | 23 +------- packages/ui/src/services/admin/subscribe.ts | 1 + packages/ui/src/services/admin/system.ts | 1 + packages/ui/src/services/admin/ticket.ts | 1 + packages/ui/src/services/admin/tool.ts | 1 + packages/ui/src/services/admin/typings.d.ts | 19 +++++- packages/ui/src/services/admin/user.ts | 59 +++++++++++++++++++ packages/ui/src/services/common/auth.ts | 1 + packages/ui/src/services/common/common.ts | 1 + packages/ui/src/services/common/index.ts | 1 + packages/ui/src/services/common/oauth.ts | 2 + packages/ui/src/services/common/typings.d.ts | 6 +- .../gateway/basicCheckServiceVersion.ts | 1 + .../ui/src/services/gateway/basicHeartbeat.ts | 1 + .../services/gateway/basicRegisterService.ts | 1 + .../services/gateway/basicUpdateService.ts | 1 + packages/ui/src/services/gateway/index.ts | 1 + packages/ui/src/services/user/announcement.ts | 1 + packages/ui/src/services/user/document.ts | 1 + packages/ui/src/services/user/index.ts | 1 + packages/ui/src/services/user/order.ts | 1 + packages/ui/src/services/user/payment.ts | 1 + packages/ui/src/services/user/portal.ts | 1 + packages/ui/src/services/user/subscribe.ts | 1 + packages/ui/src/services/user/ticket.ts | 1 + packages/ui/src/services/user/typings.d.ts | 2 +- packages/ui/src/services/user/user.ts | 1 + packages/ui/src/typings.d.ts | 8 +++ 40 files changed, 127 insertions(+), 25 deletions(-) diff --git a/packages/ui/src/services/admin/ads.ts b/packages/ui/src/services/admin/ads.ts index 6649e85..020245c 100644 --- a/packages/ui/src/services/admin/ads.ts +++ b/packages/ui/src/services/admin/ads.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* eslint-disable */ import request from "@workspace/ui/lib/request"; diff --git a/packages/ui/src/services/admin/announcement.ts b/packages/ui/src/services/admin/announcement.ts index 80b6cd8..465733a 100644 --- a/packages/ui/src/services/admin/announcement.ts +++ b/packages/ui/src/services/admin/announcement.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* eslint-disable */ import request from "@workspace/ui/lib/request"; diff --git a/packages/ui/src/services/admin/application.ts b/packages/ui/src/services/admin/application.ts index 64c98b7..bcba8e2 100644 --- a/packages/ui/src/services/admin/application.ts +++ b/packages/ui/src/services/admin/application.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* eslint-disable */ import request from "@workspace/ui/lib/request"; diff --git a/packages/ui/src/services/admin/authMethod.ts b/packages/ui/src/services/admin/authMethod.ts index 76bd767..d8ba053 100644 --- a/packages/ui/src/services/admin/authMethod.ts +++ b/packages/ui/src/services/admin/authMethod.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* eslint-disable */ import request from "@workspace/ui/lib/request"; diff --git a/packages/ui/src/services/admin/console.ts b/packages/ui/src/services/admin/console.ts index cadf2bf..31477d9 100644 --- a/packages/ui/src/services/admin/console.ts +++ b/packages/ui/src/services/admin/console.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* eslint-disable */ import request from "@workspace/ui/lib/request"; diff --git a/packages/ui/src/services/admin/coupon.ts b/packages/ui/src/services/admin/coupon.ts index c757a81..18593a5 100644 --- a/packages/ui/src/services/admin/coupon.ts +++ b/packages/ui/src/services/admin/coupon.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* eslint-disable */ import request from "@workspace/ui/lib/request"; diff --git a/packages/ui/src/services/admin/document.ts b/packages/ui/src/services/admin/document.ts index d879024..1834e89 100644 --- a/packages/ui/src/services/admin/document.ts +++ b/packages/ui/src/services/admin/document.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* eslint-disable */ import request from "@workspace/ui/lib/request"; diff --git a/packages/ui/src/services/admin/index.ts b/packages/ui/src/services/admin/index.ts index f6ee7b6..bf43e11 100644 --- a/packages/ui/src/services/admin/index.ts +++ b/packages/ui/src/services/admin/index.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* eslint-disable */ // API 更新时间: // API 唯一标识: diff --git a/packages/ui/src/services/admin/log.ts b/packages/ui/src/services/admin/log.ts index 937e4e0..7c2ac04 100644 --- a/packages/ui/src/services/admin/log.ts +++ b/packages/ui/src/services/admin/log.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* eslint-disable */ import request from "@workspace/ui/lib/request"; diff --git a/packages/ui/src/services/admin/marketing.ts b/packages/ui/src/services/admin/marketing.ts index c674693..e26a375 100644 --- a/packages/ui/src/services/admin/marketing.ts +++ b/packages/ui/src/services/admin/marketing.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* eslint-disable */ import request from "@workspace/ui/lib/request"; diff --git a/packages/ui/src/services/admin/order.ts b/packages/ui/src/services/admin/order.ts index 7e7a6f6..9d2e0fd 100644 --- a/packages/ui/src/services/admin/order.ts +++ b/packages/ui/src/services/admin/order.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* eslint-disable */ import request from "@workspace/ui/lib/request"; diff --git a/packages/ui/src/services/admin/payment.ts b/packages/ui/src/services/admin/payment.ts index eda6b18..a770206 100644 --- a/packages/ui/src/services/admin/payment.ts +++ b/packages/ui/src/services/admin/payment.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* eslint-disable */ import request from "@workspace/ui/lib/request"; diff --git a/packages/ui/src/services/admin/server.ts b/packages/ui/src/services/admin/server.ts index 878de68..aeddd39 100644 --- a/packages/ui/src/services/admin/server.ts +++ b/packages/ui/src/services/admin/server.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* eslint-disable */ import request from "@workspace/ui/lib/request"; @@ -55,28 +56,6 @@ export async function filterServerList( ); } -/** Check if there is any server or node to migrate GET /v1/admin/server/migrate/has */ -export async function hasMigrateSeverNode(options?: { [key: string]: any }) { - return request( - `${import.meta.env.VITE_API_PREFIX || ""}/v1/admin/server/migrate/has`, - { - method: "GET", - ...(options || {}), - } - ); -} - -/** Migrate server and node data to new database POST /v1/admin/server/migrate/run */ -export async function migrateServerNode(options?: { [key: string]: any }) { - return request( - `${import.meta.env.VITE_API_PREFIX || ""}/v1/admin/server/migrate/run`, - { - method: "POST", - ...(options || {}), - } - ); -} - /** Create Node POST /v1/admin/server/node/create */ export async function createNode( body: API.CreateNodeRequest, diff --git a/packages/ui/src/services/admin/subscribe.ts b/packages/ui/src/services/admin/subscribe.ts index f3f627a..b4ea634 100644 --- a/packages/ui/src/services/admin/subscribe.ts +++ b/packages/ui/src/services/admin/subscribe.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* eslint-disable */ import request from "@workspace/ui/lib/request"; diff --git a/packages/ui/src/services/admin/system.ts b/packages/ui/src/services/admin/system.ts index 1309990..ba228b2 100644 --- a/packages/ui/src/services/admin/system.ts +++ b/packages/ui/src/services/admin/system.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* eslint-disable */ import request from "@workspace/ui/lib/request"; diff --git a/packages/ui/src/services/admin/ticket.ts b/packages/ui/src/services/admin/ticket.ts index 2b78149..6f97134 100644 --- a/packages/ui/src/services/admin/ticket.ts +++ b/packages/ui/src/services/admin/ticket.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* eslint-disable */ import request from "@workspace/ui/lib/request"; diff --git a/packages/ui/src/services/admin/tool.ts b/packages/ui/src/services/admin/tool.ts index 7102f45..c407056 100644 --- a/packages/ui/src/services/admin/tool.ts +++ b/packages/ui/src/services/admin/tool.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* eslint-disable */ import request from "@workspace/ui/lib/request"; diff --git a/packages/ui/src/services/admin/typings.d.ts b/packages/ui/src/services/admin/typings.d.ts index 3a80d12..4457357 100644 --- a/packages/ui/src/services/admin/typings.d.ts +++ b/packages/ui/src/services/admin/typings.d.ts @@ -355,6 +355,7 @@ declare namespace API { allow_deduction: boolean; reset_cycle: number; renewal_reset: boolean; + show_original_price: boolean; }; type CreateTicketFollowRequest = { @@ -1127,6 +1128,7 @@ declare namespace API { size: number; search?: string; user_id?: number; + unscoped?: boolean; subscribe_id?: number; user_subscribe_id?: number; }; @@ -1136,6 +1138,7 @@ declare namespace API { size: number; search?: string; user_id?: number; + unscoped?: boolean; subscribe_id?: number; user_subscribe_id?: number; }; @@ -1837,6 +1840,14 @@ declare namespace API { order_no: string; }; + type ResetUserSubscribeTokenRequest = { + user_subscribe_id: number; + }; + + type ResetUserSubscribeTrafficRequest = { + user_subscribe_id: number; + }; + type Response = { /** 状态码 */ code?: number; @@ -2022,6 +2033,7 @@ declare namespace API { allow_deduction: boolean; reset_cycle: number; renewal_reset: boolean; + show_original_price: boolean; created_at: number; updated_at: number; }; @@ -2086,6 +2098,7 @@ declare namespace API { allow_deduction?: boolean; reset_cycle?: number; renewal_reset?: boolean; + show_original_price?: boolean; created_at?: number; updated_at?: number; sold: number; @@ -2150,6 +2163,10 @@ declare namespace API { enable: boolean; }; + type ToggleUserSubscribeStatusRequest = { + user_subscribe_id: number; + }; + type TosConfig = { tos_content: string; }; @@ -2337,6 +2354,7 @@ declare namespace API { allow_deduction: boolean; reset_cycle: number; renewal_reset: boolean; + show_original_price: boolean; }; type UpdateTicketStatusRequest = { @@ -2406,7 +2424,6 @@ declare namespace API { created_at: number; updated_at: number; deleted_at?: number; - is_del?: boolean; }; type UserAffiliate = { diff --git a/packages/ui/src/services/admin/user.ts b/packages/ui/src/services/admin/user.ts index 816c98c..264debc 100644 --- a/packages/ui/src/services/admin/user.ts +++ b/packages/ui/src/services/admin/user.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* eslint-disable */ import request from "@workspace/ui/lib/request"; @@ -425,6 +426,64 @@ export async function getUserSubscribeResetTrafficLogs( ); } +/** Reset user subscribe token POST /v1/admin/user/subscribe/reset/token */ +export async function resetUserSubscribeToken( + body: API.ResetUserSubscribeTokenRequest, + options?: { [key: string]: any } +) { + return request( + `${ + import.meta.env.VITE_API_PREFIX || "" + }/v1/admin/user/subscribe/reset/token`, + { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + data: body, + ...(options || {}), + } + ); +} + +/** Reset user subscribe traffic POST /v1/admin/user/subscribe/reset/traffic */ +export async function resetUserSubscribeTraffic( + body: API.ResetUserSubscribeTrafficRequest, + options?: { [key: string]: any } +) { + return request( + `${ + import.meta.env.VITE_API_PREFIX || "" + }/v1/admin/user/subscribe/reset/traffic`, + { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + data: body, + ...(options || {}), + } + ); +} + +/** Stop user subscribe POST /v1/admin/user/subscribe/toggle */ +export async function toggleUserSubscribeStatus( + body: API.ToggleUserSubscribeStatusRequest, + options?: { [key: string]: any } +) { + return request( + `${import.meta.env.VITE_API_PREFIX || ""}/v1/admin/user/subscribe/toggle`, + { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + data: body, + ...(options || {}), + } + ); +} + /** Get user subcribe traffic logs GET /v1/admin/user/subscribe/traffic_logs */ export async function getUserSubscribeTrafficLogs( // 叠加生成的Param类型 (非body参数swagger默认没有生成对象) diff --git a/packages/ui/src/services/common/auth.ts b/packages/ui/src/services/common/auth.ts index 42ffaab..f7b6828 100644 --- a/packages/ui/src/services/common/auth.ts +++ b/packages/ui/src/services/common/auth.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* eslint-disable */ import request from "@workspace/ui/lib/request"; diff --git a/packages/ui/src/services/common/common.ts b/packages/ui/src/services/common/common.ts index 66a6c05..897c3b2 100644 --- a/packages/ui/src/services/common/common.ts +++ b/packages/ui/src/services/common/common.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* eslint-disable */ import request from "@workspace/ui/lib/request"; diff --git a/packages/ui/src/services/common/index.ts b/packages/ui/src/services/common/index.ts index 201142d..53a7bc4 100644 --- a/packages/ui/src/services/common/index.ts +++ b/packages/ui/src/services/common/index.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* eslint-disable */ // API 更新时间: // API 唯一标识: diff --git a/packages/ui/src/services/common/oauth.ts b/packages/ui/src/services/common/oauth.ts index 3a4c36c..9a695ad 100644 --- a/packages/ui/src/services/common/oauth.ts +++ b/packages/ui/src/services/common/oauth.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* eslint-disable */ import request from "@workspace/ui/lib/request"; @@ -38,6 +39,7 @@ export async function appleLoginCallback( { method: "POST", data: formData, + requestType: "form", ...(options || {}), } ); diff --git a/packages/ui/src/services/common/typings.d.ts b/packages/ui/src/services/common/typings.d.ts index b22240e..ad7e9a1 100644 --- a/packages/ui/src/services/common/typings.d.ts +++ b/packages/ui/src/services/common/typings.d.ts @@ -750,6 +750,10 @@ declare namespace API { order_no: string; }; + type ResetUserSubscribeTokenRequest = { + user_subscribe_id: number; + }; + type Response = { /** 状态码 */ code?: number; @@ -863,6 +867,7 @@ declare namespace API { allow_deduction: boolean; reset_cycle: number; renewal_reset: boolean; + show_original_price: boolean; created_at: number; updated_at: number; }; @@ -1023,7 +1028,6 @@ declare namespace API { created_at: number; updated_at: number; deleted_at?: number; - is_del?: boolean; }; type UserAffiliate = { diff --git a/packages/ui/src/services/gateway/basicCheckServiceVersion.ts b/packages/ui/src/services/gateway/basicCheckServiceVersion.ts index c41e41c..5ef8f50 100644 --- a/packages/ui/src/services/gateway/basicCheckServiceVersion.ts +++ b/packages/ui/src/services/gateway/basicCheckServiceVersion.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* eslint-disable */ import request from "@workspace/ui/lib/request"; diff --git a/packages/ui/src/services/gateway/basicHeartbeat.ts b/packages/ui/src/services/gateway/basicHeartbeat.ts index 53981c7..ec3345c 100644 --- a/packages/ui/src/services/gateway/basicHeartbeat.ts +++ b/packages/ui/src/services/gateway/basicHeartbeat.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* eslint-disable */ import request from "@workspace/ui/lib/request"; diff --git a/packages/ui/src/services/gateway/basicRegisterService.ts b/packages/ui/src/services/gateway/basicRegisterService.ts index c553fe0..0512e58 100644 --- a/packages/ui/src/services/gateway/basicRegisterService.ts +++ b/packages/ui/src/services/gateway/basicRegisterService.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* eslint-disable */ import request from "@workspace/ui/lib/request"; diff --git a/packages/ui/src/services/gateway/basicUpdateService.ts b/packages/ui/src/services/gateway/basicUpdateService.ts index a792bdf..8261438 100644 --- a/packages/ui/src/services/gateway/basicUpdateService.ts +++ b/packages/ui/src/services/gateway/basicUpdateService.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* eslint-disable */ import request from "@workspace/ui/lib/request"; diff --git a/packages/ui/src/services/gateway/index.ts b/packages/ui/src/services/gateway/index.ts index ad43f03..52e694e 100644 --- a/packages/ui/src/services/gateway/index.ts +++ b/packages/ui/src/services/gateway/index.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* eslint-disable */ // API 更新时间: // API 唯一标识: diff --git a/packages/ui/src/services/user/announcement.ts b/packages/ui/src/services/user/announcement.ts index cea2391..6f614a3 100644 --- a/packages/ui/src/services/user/announcement.ts +++ b/packages/ui/src/services/user/announcement.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* eslint-disable */ import request from "@workspace/ui/lib/request"; diff --git a/packages/ui/src/services/user/document.ts b/packages/ui/src/services/user/document.ts index 33122f8..49477b0 100644 --- a/packages/ui/src/services/user/document.ts +++ b/packages/ui/src/services/user/document.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* eslint-disable */ import request from "@workspace/ui/lib/request"; diff --git a/packages/ui/src/services/user/index.ts b/packages/ui/src/services/user/index.ts index 1b4de84..e67bdfa 100644 --- a/packages/ui/src/services/user/index.ts +++ b/packages/ui/src/services/user/index.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* eslint-disable */ // API 更新时间: // API 唯一标识: diff --git a/packages/ui/src/services/user/order.ts b/packages/ui/src/services/user/order.ts index 311d6ca..aa9fd75 100644 --- a/packages/ui/src/services/user/order.ts +++ b/packages/ui/src/services/user/order.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* eslint-disable */ import request from "@workspace/ui/lib/request"; diff --git a/packages/ui/src/services/user/payment.ts b/packages/ui/src/services/user/payment.ts index a9282a1..a25b456 100644 --- a/packages/ui/src/services/user/payment.ts +++ b/packages/ui/src/services/user/payment.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* eslint-disable */ import request from "@workspace/ui/lib/request"; diff --git a/packages/ui/src/services/user/portal.ts b/packages/ui/src/services/user/portal.ts index 148ac0f..0a01629 100644 --- a/packages/ui/src/services/user/portal.ts +++ b/packages/ui/src/services/user/portal.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* eslint-disable */ import request from "@workspace/ui/lib/request"; diff --git a/packages/ui/src/services/user/subscribe.ts b/packages/ui/src/services/user/subscribe.ts index fdde370..eab11e4 100644 --- a/packages/ui/src/services/user/subscribe.ts +++ b/packages/ui/src/services/user/subscribe.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* eslint-disable */ import request from "@workspace/ui/lib/request"; diff --git a/packages/ui/src/services/user/ticket.ts b/packages/ui/src/services/user/ticket.ts index 74dd7b2..8dfb5b6 100644 --- a/packages/ui/src/services/user/ticket.ts +++ b/packages/ui/src/services/user/ticket.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* eslint-disable */ import request from "@workspace/ui/lib/request"; diff --git a/packages/ui/src/services/user/typings.d.ts b/packages/ui/src/services/user/typings.d.ts index bd7c5c0..b37e50d 100644 --- a/packages/ui/src/services/user/typings.d.ts +++ b/packages/ui/src/services/user/typings.d.ts @@ -985,6 +985,7 @@ declare namespace API { allow_deduction: boolean; reset_cycle: number; renewal_reset: boolean; + show_original_price: boolean; created_at: number; updated_at: number; }; @@ -1146,7 +1147,6 @@ declare namespace API { created_at: number; updated_at: number; deleted_at?: number; - is_del?: boolean; }; type UserAffiliate = { diff --git a/packages/ui/src/services/user/user.ts b/packages/ui/src/services/user/user.ts index d7a25ca..778eb88 100644 --- a/packages/ui/src/services/user/user.ts +++ b/packages/ui/src/services/user/user.ts @@ -1,3 +1,4 @@ +// @ts-nocheck /* eslint-disable */ import request from "@workspace/ui/lib/request"; diff --git a/packages/ui/src/typings.d.ts b/packages/ui/src/typings.d.ts index b5ed465..59808ea 100644 --- a/packages/ui/src/typings.d.ts +++ b/packages/ui/src/typings.d.ts @@ -8,3 +8,11 @@ declare global { i18n: typeof i18n; } } + +// openapi2ts 生成的 request 参数里可能会包含 requestType(umi-request 风格)。 +// 我们的 request 基于 axios:这里做一个类型补丁,避免 TS 报错。 +declare module "axios" { + export interface AxiosRequestConfig { + requestType?: string; + } +} From 7223eb41c63b0333df44865a1d93ca0e47e92606 Mon Sep 17 00:00:00 2001 From: web-ppanel Date: Tue, 27 Jan 2026 17:57:46 +0000 Subject: [PATCH 02/19] =?UTF-8?q?=E2=9C=A8=20admin:=20subscription=20contr?= =?UTF-8?q?ols=20+=20show=20original=20price?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/sections/product/subscribe-form.tsx | 37 +++++++++++ .../sections/user/user-subscription/index.tsx | 66 +++++++++++++++++++ 2 files changed, 103 insertions(+) diff --git a/apps/admin/src/sections/product/subscribe-form.tsx b/apps/admin/src/sections/product/subscribe-form.tsx index a6532d4..8aa0c4a 100644 --- a/apps/admin/src/sections/product/subscribe-form.tsx +++ b/apps/admin/src/sections/product/subscribe-form.tsx @@ -77,6 +77,7 @@ const defaultValues = { purchase_with_discount: false, reset_cycle: 0, renewal_reset: false, + show_original_price: false, deduction_mode: "auto", }; @@ -120,6 +121,7 @@ export default function SubscribeForm>({ allow_deduction: z.boolean().optional(), reset_cycle: z.number().optional(), renewal_reset: z.boolean().optional(), + show_original_price: z.boolean().optional(), }); const form = useForm>({ @@ -837,6 +839,41 @@ export default function SubscribeForm>({ )} /> + + ( + +
+
+ + {t( + "form.showOriginalPrice", + "Show Original Price" + )} + + + {t( + "form.showOriginalPriceDescription", + "Display original price in the storefront" + )} + +
+ + + form.setValue(field.name, value) + } + /> + +
+ +
+ )} + /> + {t("copySubscription", "Copy Subscription")} , + + { + await resetUserSubscribeToken({ user_subscribe_id: row.id }); + toast.success(t("resetSuccess", "Reset successfully")); + ref.current?.refresh(); + }} + title={t("resetSubscriptionToken", "Reset Token")} + trigger={ + + } + />, + + { + await resetUserSubscribeTraffic({ user_subscribe_id: row.id }); + toast.success(t("resetSuccess", "Reset successfully")); + ref.current?.refresh(); + }} + title={t("resetSubscriptionTraffic", "Reset Traffic")} + trigger={ + + } + />, + + { + await toggleUserSubscribeStatus({ user_subscribe_id: row.id }); + toast.success(t("updateSuccess", "Updated successfully")); + ref.current?.refresh(); + }} + title={t("toggleSubscriptionStatus", "Toggle Status")} + trigger={ + + } + />, Date: Tue, 27 Jan 2026 18:02:18 +0000 Subject: [PATCH 03/19] =?UTF-8?q?=F0=9F=8C=90=20i18n:=20add=20admin=20subs?= =?UTF-8?q?cription=20UI=20strings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/admin/public/assets/locales/en-US/product.json | 2 ++ apps/admin/public/assets/locales/en-US/user.json | 9 +++++++++ apps/admin/public/assets/locales/zh-CN/product.json | 2 ++ apps/admin/public/assets/locales/zh-CN/user.json | 9 +++++++++ 4 files changed, 22 insertions(+) diff --git a/apps/admin/public/assets/locales/en-US/product.json b/apps/admin/public/assets/locales/en-US/product.json index a06e7ca..f66faef 100644 --- a/apps/admin/public/assets/locales/en-US/product.json +++ b/apps/admin/public/assets/locales/en-US/product.json @@ -49,6 +49,8 @@ "quota": "Purchase Limit", "renewalReset": "Renewal Reset", "renewalResetDescription": "Reset cycle upon renewal", + "showOriginalPrice": "Show Original Price", + "showOriginalPriceDescription": "Display original price in the storefront", "replacement": "Reset Price (per time)", "resetCycle": "Reset Cycle", "resetOn1st": "Reset on the 1st", diff --git a/apps/admin/public/assets/locales/en-US/user.json b/apps/admin/public/assets/locales/en-US/user.json index f5a55e7..2e935ba 100644 --- a/apps/admin/public/assets/locales/en-US/user.json +++ b/apps/admin/public/assets/locales/en-US/user.json @@ -70,6 +70,15 @@ "referrerUserId": "Referrer User ID", "remove": "Remove", "resetLogs": "Reset Logs", + "resetToken": "Reset Token", + "resetTraffic": "Reset Traffic", + "toggleStatus": "Toggle Status", + "resetSubscriptionToken": "Reset Token", + "resetSubscriptionTokenDescription": "This will reset the subscription token. Old links will become invalid.", + "resetSubscriptionTraffic": "Reset Traffic", + "resetSubscriptionTrafficDescription": "This will reset the subscription traffic counters.", + "toggleSubscriptionStatus": "Toggle Status", + "toggleSubscriptionStatusDescription": "This will toggle the subscription status.", "resetTime": "Reset Time", "save": "Save", "speedLimit": "Speed Limit", diff --git a/apps/admin/public/assets/locales/zh-CN/product.json b/apps/admin/public/assets/locales/zh-CN/product.json index b1dd2c3..dcd5e9c 100644 --- a/apps/admin/public/assets/locales/zh-CN/product.json +++ b/apps/admin/public/assets/locales/zh-CN/product.json @@ -49,6 +49,8 @@ "quota": "购买限制", "renewalReset": "续费重置", "renewalResetDescription": "续费时重置周期", + "showOriginalPrice": "展示原价", + "showOriginalPriceDescription": "在购买页/展示页显示原价", "replacement": "重置价格(每次)", "resetCycle": "重置周期", "resetOn1st": "每月1日重置", diff --git a/apps/admin/public/assets/locales/zh-CN/user.json b/apps/admin/public/assets/locales/zh-CN/user.json index 57b7bc8..80b8004 100644 --- a/apps/admin/public/assets/locales/zh-CN/user.json +++ b/apps/admin/public/assets/locales/zh-CN/user.json @@ -70,6 +70,15 @@ "referrerUserId": "推荐人用户 ID", "remove": "移除", "resetLogs": "重置日志", + "resetToken": "重置令牌", + "resetTraffic": "重置流量", + "toggleStatus": "切换状态", + "resetSubscriptionToken": "重置令牌", + "resetSubscriptionTokenDescription": "将重置订阅令牌,旧订阅链接会失效。", + "resetSubscriptionTraffic": "重置流量", + "resetSubscriptionTrafficDescription": "将重置该订阅的流量统计。", + "toggleSubscriptionStatus": "切换状态", + "toggleSubscriptionStatusDescription": "将切换该订阅的启用/停用状态。", "resetTime": "重置时间", "save": "保存", "speedLimit": "速度限制", From 7e1d5746d46dd9bf33b1971f71f809afcdba4bbe Mon Sep 17 00:00:00 2001 From: web-ppanel Date: Tue, 27 Jan 2026 18:08:34 +0000 Subject: [PATCH 04/19] =?UTF-8?q?=F0=9F=90=9B=20fix(admin):=20refresh=20us?= =?UTF-8?q?er=20list=20after=20balance=20update?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/admin/src/sections/user/index.tsx | 25 +++++++++++++++---- .../user/user-profile/auth-methods-form.tsx | 2 +- .../user/user-profile/basic-info-form.tsx | 2 +- .../user-profile/notify-settings-form.tsx | 2 +- 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/apps/admin/src/sections/user/index.tsx b/apps/admin/src/sections/user/index.tsx index b550f2f..b44d2e1 100644 --- a/apps/admin/src/sections/user/index.tsx +++ b/apps/admin/src/sections/user/index.tsx @@ -68,7 +68,11 @@ export default function User() { action={ref} actions={{ render: (row) => [ - , + ref.current?.refresh()} + userId={row.id} + />, , void; +}) { const { t } = useTranslation("user"); const [open, setOpen] = useState(false); const { data: user, refetch } = useQuery({ @@ -302,6 +312,11 @@ function ProfileSheet({ userId }: { userId: number }) { return data.data as API.User; }, }); + + const refetchAll = async () => { + await refetch(); + onUpdated?.(); + }; return ( @@ -331,13 +346,13 @@ function ProfileSheet({ userId }: { userId: number }) { - + - + - + diff --git a/apps/admin/src/sections/user/user-profile/auth-methods-form.tsx b/apps/admin/src/sections/user/user-profile/auth-methods-form.tsx index 145c379..60738ac 100644 --- a/apps/admin/src/sections/user/user-profile/auth-methods-form.tsx +++ b/apps/admin/src/sections/user/user-profile/auth-methods-form.tsx @@ -21,7 +21,7 @@ export function AuthMethodsForm({ refetch, }: { user: API.User; - refetch: () => void; + refetch: () => void | Promise; }) { const { t } = useTranslation("user"); diff --git a/apps/admin/src/sections/user/user-profile/basic-info-form.tsx b/apps/admin/src/sections/user/user-profile/basic-info-form.tsx index 9e5581f..fab8c38 100644 --- a/apps/admin/src/sections/user/user-profile/basic-info-form.tsx +++ b/apps/admin/src/sections/user/user-profile/basic-info-form.tsx @@ -47,7 +47,7 @@ export function BasicInfoForm({ refetch, }: { user: API.User; - refetch: () => void; + refetch: () => void | Promise; }) { const { t } = useTranslation("user"); diff --git a/apps/admin/src/sections/user/user-profile/notify-settings-form.tsx b/apps/admin/src/sections/user/user-profile/notify-settings-form.tsx index eae7f5b..1c7956c 100644 --- a/apps/admin/src/sections/user/user-profile/notify-settings-form.tsx +++ b/apps/admin/src/sections/user/user-profile/notify-settings-form.tsx @@ -34,7 +34,7 @@ export function NotifySettingsForm({ refetch, }: { user: API.User; - refetch: () => void; + refetch: () => void | Promise; }) { const { t } = useTranslation("user"); From 6dd743bbf4f383249e97549ed0ed0417b6f5609d Mon Sep 17 00:00:00 2001 From: web-ppanel Date: Tue, 27 Jan 2026 18:11:32 +0000 Subject: [PATCH 05/19] =?UTF-8?q?=F0=9F=A7=B9=20fix(ci):=20avoid=20void|Pr?= =?UTF-8?q?omise=20union=20for=20refetch?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/admin/src/sections/user/index.tsx | 1 + apps/admin/src/sections/user/user-profile/auth-methods-form.tsx | 2 +- apps/admin/src/sections/user/user-profile/basic-info-form.tsx | 2 +- .../src/sections/user/user-profile/notify-settings-form.tsx | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/admin/src/sections/user/index.tsx b/apps/admin/src/sections/user/index.tsx index b44d2e1..13b43aa 100644 --- a/apps/admin/src/sections/user/index.tsx +++ b/apps/admin/src/sections/user/index.tsx @@ -316,6 +316,7 @@ function ProfileSheet({ const refetchAll = async () => { await refetch(); onUpdated?.(); + return Promise.resolve(); }; return ( diff --git a/apps/admin/src/sections/user/user-profile/auth-methods-form.tsx b/apps/admin/src/sections/user/user-profile/auth-methods-form.tsx index 60738ac..9cdcfe0 100644 --- a/apps/admin/src/sections/user/user-profile/auth-methods-form.tsx +++ b/apps/admin/src/sections/user/user-profile/auth-methods-form.tsx @@ -21,7 +21,7 @@ export function AuthMethodsForm({ refetch, }: { user: API.User; - refetch: () => void | Promise; + refetch: () => Promise; }) { const { t } = useTranslation("user"); diff --git a/apps/admin/src/sections/user/user-profile/basic-info-form.tsx b/apps/admin/src/sections/user/user-profile/basic-info-form.tsx index fab8c38..68a55b7 100644 --- a/apps/admin/src/sections/user/user-profile/basic-info-form.tsx +++ b/apps/admin/src/sections/user/user-profile/basic-info-form.tsx @@ -47,7 +47,7 @@ export function BasicInfoForm({ refetch, }: { user: API.User; - refetch: () => void | Promise; + refetch: () => Promise; }) { const { t } = useTranslation("user"); diff --git a/apps/admin/src/sections/user/user-profile/notify-settings-form.tsx b/apps/admin/src/sections/user/user-profile/notify-settings-form.tsx index 1c7956c..e72d271 100644 --- a/apps/admin/src/sections/user/user-profile/notify-settings-form.tsx +++ b/apps/admin/src/sections/user/user-profile/notify-settings-form.tsx @@ -34,7 +34,7 @@ export function NotifySettingsForm({ refetch, }: { user: API.User; - refetch: () => void | Promise; + refetch: () => Promise; }) { const { t } = useTranslation("user"); From 98676fa27c74eefc9c0fe2d92a549d9e5d7d7fd6 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Tue, 27 Jan 2026 18:12:42 +0000 Subject: [PATCH 06/19] =?UTF-8?q?=F0=9F=9A=80=20chore(release):=20Release?= =?UTF-8?q?=201.2.4-dev.2=20/=20=E5=8F=91=E5=B8=83=E7=89=88=E6=9C=AC=201.2?= =?UTF-8?q?.4-dev.2=20[skip=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## [1.2.4-dev.2](https://github.com/perfect-panel/frontend/compare/v1.2.4-dev.1...v1.2.4-dev.2) (2026-01-27) ### 🐛 Bug Fixes / 问题修复 * **admin:** refresh user list after balance update ([7e1d574](https://github.com/perfect-panel/frontend/commit/7e1d5746d46dd9bf33b1971f71f809afcdba4bbe)) * **ci:** avoid void|Promise union for refetch ([6dd743b](https://github.com/perfect-panel/frontend/commit/6dd743bbf4f383249e97549ed0ed0417b6f5609d)) ### 📚 Documentation / 文档更新 * Add one-click installation script for PPanel with Docker support ([912c5c4](https://github.com/perfect-panel/frontend/commit/912c5c4cb63eeb0ecbc33bef6b31bd50d83d6491)) ### 🔧 Chores / 其他变更 * **openapi:** regenerate services & patch axios requestType typing ([0ec4f84](https://github.com/perfect-panel/frontend/commit/0ec4f84fa9d4d94048b8219896c3d8fb1d8d2175)) --- CHANGELOG.md | 15 +++++++++++++++ package.json | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 729c5c9..387b3c5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,21 @@ This document records all notable changes to ShadCN Admin. --- +## [1.2.4-dev.2](https://github.com/perfect-panel/frontend/compare/v1.2.4-dev.1...v1.2.4-dev.2) (2026-01-27) + +### 🐛 Bug Fixes / 问题修复 + +* **admin:** refresh user list after balance update ([7e1d574](https://github.com/perfect-panel/frontend/commit/7e1d5746d46dd9bf33b1971f71f809afcdba4bbe)) +* **ci:** avoid void|Promise union for refetch ([6dd743b](https://github.com/perfect-panel/frontend/commit/6dd743bbf4f383249e97549ed0ed0417b6f5609d)) + +### 📚 Documentation / 文档更新 + +* Add one-click installation script for PPanel with Docker support ([912c5c4](https://github.com/perfect-panel/frontend/commit/912c5c4cb63eeb0ecbc33bef6b31bd50d83d6491)) + +### 🔧 Chores / 其他变更 + +* **openapi:** regenerate services & patch axios requestType typing ([0ec4f84](https://github.com/perfect-panel/frontend/commit/0ec4f84fa9d4d94048b8219896c3d8fb1d8d2175)) + ## [1.2.4-dev.1](https://github.com/perfect-panel/frontend/compare/v1.2.3...v1.2.4-dev.1) (2025-12-22) ### 🐛 Bug Fixes / 问题修复 diff --git a/package.json b/package.json index c051e63..95ecb35 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "frontend", - "version": "1.2.4-dev.1", + "version": "1.2.4-dev.2", "private": true, "homepage": "https://github.com/perfect-panel/frontend", "bugs": { From 052a0a420921cffc09c81843d37081d05b4c4717 Mon Sep 17 00:00:00 2001 From: web-ppanel Date: Tue, 27 Jan 2026 18:21:39 +0000 Subject: [PATCH 07/19] =?UTF-8?q?=F0=9F=90=9B=20fix(build):=20ensure=20ver?= =?UTF-8?q?sion.lock=20directory=20exists=20+=20fix=20merge=20typo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/admin/src/sections/user/user-subscription/index.tsx | 1 - apps/admin/vite.config.ts | 4 +++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/admin/src/sections/user/user-subscription/index.tsx b/apps/admin/src/sections/user/user-subscription/index.tsx index 840f789..a132924 100644 --- a/apps/admin/src/sections/user/user-subscription/index.tsx +++ b/apps/admin/src/sections/user/user-subscription/index.tsx @@ -64,7 +64,6 @@ export default function UserSubscription({ userId }: { userId: number }) { row={row} token={row.token} userId={userId} - /> />, ], }} diff --git a/apps/admin/vite.config.ts b/apps/admin/vite.config.ts index a03c3f5..c755b54 100644 --- a/apps/admin/vite.config.ts +++ b/apps/admin/vite.config.ts @@ -1,4 +1,4 @@ -import { readFileSync, writeFileSync } from "node:fs"; +import { mkdirSync, readFileSync, writeFileSync } from "node:fs"; import { fileURLToPath, URL } from "node:url"; import tailwindcss from "@tailwindcss/vite"; import { devtools } from "@tanstack/devtools-vite"; @@ -18,6 +18,8 @@ function versionLockPlugin(): Plugin { ); const rootPkg = JSON.parse(readFileSync(rootPkgPath, "utf-8")); const version = rootPkg.version || "0.0.0"; + + mkdirSync(distDir, { recursive: true }); writeFileSync(`${distDir}/version.lock`, version); }, }; From ed3f6cb737e0e5b3b57e4149fce3be6e46b0c5eb Mon Sep 17 00:00:00 2001 From: web-ppanel Date: Tue, 27 Jan 2026 18:27:20 +0000 Subject: [PATCH 08/19] =?UTF-8?q?=F0=9F=A7=B9=20fix(i18n):=20remove=20dupl?= =?UTF-8?q?icate=20locale=20keys?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/admin/public/assets/locales/en-US/product.json | 2 -- apps/admin/public/assets/locales/en-US/user.json | 1 - apps/admin/public/assets/locales/zh-CN/product.json | 2 -- apps/admin/public/assets/locales/zh-CN/user.json | 1 - 4 files changed, 6 deletions(-) diff --git a/apps/admin/public/assets/locales/en-US/product.json b/apps/admin/public/assets/locales/en-US/product.json index ca0c88d..f590049 100644 --- a/apps/admin/public/assets/locales/en-US/product.json +++ b/apps/admin/public/assets/locales/en-US/product.json @@ -50,8 +50,6 @@ "quota": "Purchase Limit", "renewalReset": "Renewal Reset", "renewalResetDescription": "Reset cycle upon renewal", - "showOriginalPrice": "Show Original Price", - "showOriginalPriceDescription": "Display original price in the storefront", "replacement": "Reset Price (per time)", "resetCycle": "Reset Cycle", "resetOn1st": "Reset on the 1st", diff --git a/apps/admin/public/assets/locales/en-US/user.json b/apps/admin/public/assets/locales/en-US/user.json index e1d6405..71a2bbe 100644 --- a/apps/admin/public/assets/locales/en-US/user.json +++ b/apps/admin/public/assets/locales/en-US/user.json @@ -73,7 +73,6 @@ "referrerUserId": "Referrer User ID", "remove": "Remove", "resetLogs": "Reset Logs", - "resetToken": "Reset Token", "resetTraffic": "Reset Traffic", "toggleStatus": "Toggle Status", "resetSubscriptionToken": "Reset Token", diff --git a/apps/admin/public/assets/locales/zh-CN/product.json b/apps/admin/public/assets/locales/zh-CN/product.json index 2ee53e4..d8a6e28 100644 --- a/apps/admin/public/assets/locales/zh-CN/product.json +++ b/apps/admin/public/assets/locales/zh-CN/product.json @@ -50,8 +50,6 @@ "quota": "购买限制", "renewalReset": "续费重置", "renewalResetDescription": "续费时重置周期", - "showOriginalPrice": "展示原价", - "showOriginalPriceDescription": "在购买页/展示页显示原价", "replacement": "重置价格(每次)", "resetCycle": "重置周期", "resetOn1st": "每月1日重置", diff --git a/apps/admin/public/assets/locales/zh-CN/user.json b/apps/admin/public/assets/locales/zh-CN/user.json index 6e1aab1..7d4fb06 100644 --- a/apps/admin/public/assets/locales/zh-CN/user.json +++ b/apps/admin/public/assets/locales/zh-CN/user.json @@ -73,7 +73,6 @@ "referrerUserId": "推荐人用户 ID", "remove": "移除", "resetLogs": "重置日志", - "resetToken": "重置令牌", "resetTraffic": "重置流量", "toggleStatus": "切换状态", "resetSubscriptionToken": "重置令牌", From 852b2b84ee926a2dc35a7c8380bf41a74ed8bbbf Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Tue, 27 Jan 2026 18:28:24 +0000 Subject: [PATCH 09/19] =?UTF-8?q?=F0=9F=9A=80=20chore(release):=20Release?= =?UTF-8?q?=201.3.7-dev.1=20/=20=E5=8F=91=E5=B8=83=E7=89=88=E6=9C=AC=201.3?= =?UTF-8?q?.7-dev.1=20[skip=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## [1.3.7-dev.1](https://github.com/perfect-panel/frontend/compare/v1.3.6...v1.3.7-dev.1) (2026-01-27) ### 🐛 Bug Fixes / 问题修复 * **admin:** refresh user list after balance update ([7e1d574](https://github.com/perfect-panel/frontend/commit/7e1d5746d46dd9bf33b1971f71f809afcdba4bbe)) * **build:** ensure version.lock directory exists + fix merge typo ([052a0a4](https://github.com/perfect-panel/frontend/commit/052a0a420921cffc09c81843d37081d05b4c4717)) * **ci:** avoid void|Promise union for refetch ([6dd743b](https://github.com/perfect-panel/frontend/commit/6dd743bbf4f383249e97549ed0ed0417b6f5609d)) * **i18n:** remove duplicate locale keys ([ed3f6cb](https://github.com/perfect-panel/frontend/commit/ed3f6cb737e0e5b3b57e4149fce3be6e46b0c5eb)) ### 🔧 Chores / 其他变更 * **openapi:** regenerate services & patch axios requestType typing ([0ec4f84](https://github.com/perfect-panel/frontend/commit/0ec4f84fa9d4d94048b8219896c3d8fb1d8d2175)) * **release:** Release 1.2.4-dev.2 / 发布版本 1.2.4-dev.2 [skip ci] ([98676fa](https://github.com/perfect-panel/frontend/commit/98676fa27c74eefc9c0fe2d92a549d9e5d7d7fd6)) --- CHANGELOG.md | 14 ++++++++++++++ package.json | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index edc0ea4..5e0441f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,20 @@ This document records all notable changes to ShadCN Admin. --- +## [1.3.7-dev.1](https://github.com/perfect-panel/frontend/compare/v1.3.6...v1.3.7-dev.1) (2026-01-27) + +### 🐛 Bug Fixes / 问题修复 + +* **admin:** refresh user list after balance update ([7e1d574](https://github.com/perfect-panel/frontend/commit/7e1d5746d46dd9bf33b1971f71f809afcdba4bbe)) +* **build:** ensure version.lock directory exists + fix merge typo ([052a0a4](https://github.com/perfect-panel/frontend/commit/052a0a420921cffc09c81843d37081d05b4c4717)) +* **ci:** avoid void|Promise union for refetch ([6dd743b](https://github.com/perfect-panel/frontend/commit/6dd743bbf4f383249e97549ed0ed0417b6f5609d)) +* **i18n:** remove duplicate locale keys ([ed3f6cb](https://github.com/perfect-panel/frontend/commit/ed3f6cb737e0e5b3b57e4149fce3be6e46b0c5eb)) + +### 🔧 Chores / 其他变更 + +* **openapi:** regenerate services & patch axios requestType typing ([0ec4f84](https://github.com/perfect-panel/frontend/commit/0ec4f84fa9d4d94048b8219896c3d8fb1d8d2175)) +* **release:** Release 1.2.4-dev.2 / 发布版本 1.2.4-dev.2 [skip ci] ([98676fa](https://github.com/perfect-panel/frontend/commit/98676fa27c74eefc9c0fe2d92a549d9e5d7d7fd6)) + ## [1.3.6](https://github.com/perfect-panel/frontend/compare/v1.3.5...v1.3.6) (2025-12-30) ### 🐛 Bug Fixes / 问题修复 diff --git a/package.json b/package.json index 88a99c0..1840397 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "frontend", - "version": "1.3.6", + "version": "1.3.7-dev.1", "private": true, "homepage": "https://github.com/perfect-panel/frontend", "bugs": { From e73df2d29b622cbce4437509859ec2a3bd092730 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Tue, 27 Jan 2026 18:30:41 +0000 Subject: [PATCH 10/19] =?UTF-8?q?=F0=9F=9A=80=20chore(release):=20Release?= =?UTF-8?q?=201.3.7=20/=20=E5=8F=91=E5=B8=83=E7=89=88=E6=9C=AC=201.3.7=20[?= =?UTF-8?q?skip=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## [1.3.7](https://github.com/perfect-panel/frontend/compare/v1.3.6...v1.3.7) (2026-01-27) ### 🐛 Bug Fixes / 问题修复 * **admin:** refresh user list after balance update ([7e1d574](https://github.com/perfect-panel/frontend/commit/7e1d5746d46dd9bf33b1971f71f809afcdba4bbe)) * **build:** ensure version.lock directory exists + fix merge typo ([052a0a4](https://github.com/perfect-panel/frontend/commit/052a0a420921cffc09c81843d37081d05b4c4717)) * **ci:** avoid void|Promise union for refetch ([6dd743b](https://github.com/perfect-panel/frontend/commit/6dd743bbf4f383249e97549ed0ed0417b6f5609d)) * **i18n:** remove duplicate locale keys ([ed3f6cb](https://github.com/perfect-panel/frontend/commit/ed3f6cb737e0e5b3b57e4149fce3be6e46b0c5eb)) ### 🔧 Chores / 其他变更 * **openapi:** regenerate services & patch axios requestType typing ([0ec4f84](https://github.com/perfect-panel/frontend/commit/0ec4f84fa9d4d94048b8219896c3d8fb1d8d2175)) * **release:** Release 1.2.4-dev.2 / 发布版本 1.2.4-dev.2 [skip ci] ([98676fa](https://github.com/perfect-panel/frontend/commit/98676fa27c74eefc9c0fe2d92a549d9e5d7d7fd6)) * **release:** Release 1.3.7-dev.1 / 发布版本 1.3.7-dev.1 [skip ci] ([852b2b8](https://github.com/perfect-panel/frontend/commit/852b2b84ee926a2dc35a7c8380bf41a74ed8bbbf)) --- CHANGELOG.md | 15 +++++++++++++++ package.json | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e0441f..a54cc84 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,21 @@ This document records all notable changes to ShadCN Admin. --- +## [1.3.7](https://github.com/perfect-panel/frontend/compare/v1.3.6...v1.3.7) (2026-01-27) + +### 🐛 Bug Fixes / 问题修复 + +* **admin:** refresh user list after balance update ([7e1d574](https://github.com/perfect-panel/frontend/commit/7e1d5746d46dd9bf33b1971f71f809afcdba4bbe)) +* **build:** ensure version.lock directory exists + fix merge typo ([052a0a4](https://github.com/perfect-panel/frontend/commit/052a0a420921cffc09c81843d37081d05b4c4717)) +* **ci:** avoid void|Promise union for refetch ([6dd743b](https://github.com/perfect-panel/frontend/commit/6dd743bbf4f383249e97549ed0ed0417b6f5609d)) +* **i18n:** remove duplicate locale keys ([ed3f6cb](https://github.com/perfect-panel/frontend/commit/ed3f6cb737e0e5b3b57e4149fce3be6e46b0c5eb)) + +### 🔧 Chores / 其他变更 + +* **openapi:** regenerate services & patch axios requestType typing ([0ec4f84](https://github.com/perfect-panel/frontend/commit/0ec4f84fa9d4d94048b8219896c3d8fb1d8d2175)) +* **release:** Release 1.2.4-dev.2 / 发布版本 1.2.4-dev.2 [skip ci] ([98676fa](https://github.com/perfect-panel/frontend/commit/98676fa27c74eefc9c0fe2d92a549d9e5d7d7fd6)) +* **release:** Release 1.3.7-dev.1 / 发布版本 1.3.7-dev.1 [skip ci] ([852b2b8](https://github.com/perfect-panel/frontend/commit/852b2b84ee926a2dc35a7c8380bf41a74ed8bbbf)) + ## [1.3.7-dev.1](https://github.com/perfect-panel/frontend/compare/v1.3.6...v1.3.7-dev.1) (2026-01-27) ### 🐛 Bug Fixes / 问题修复 diff --git a/package.json b/package.json index 1840397..a910f8b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "frontend", - "version": "1.3.7-dev.1", + "version": "1.3.7", "private": true, "homepage": "https://github.com/perfect-panel/frontend", "bugs": { From 160e6da3f66691580752c65063e93c038b7a5547 Mon Sep 17 00:00:00 2001 From: ppanel-web Date: Fri, 6 Feb 2026 07:06:16 +0000 Subject: [PATCH 11/19] =?UTF-8?q?=F0=9F=90=9B=20fix(payment):=20use=20nati?= =?UTF-8?q?ve=20WeChat=20Pay=20QR=20data?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/src/sections/user/payment/stripe.tsx | 50 +++++++++++++------ 1 file changed, 34 insertions(+), 16 deletions(-) diff --git a/apps/user/src/sections/user/payment/stripe.tsx b/apps/user/src/sections/user/payment/stripe.tsx index 90a2d58..248b632 100644 --- a/apps/user/src/sections/user/payment/stripe.tsx +++ b/apps/user/src/sections/user/payment/stripe.tsx @@ -276,6 +276,7 @@ const CheckoutForm: React.FC> = ({ const stripe = useStripe(); const [errorMessage, setErrorMessage] = useState(null); const [qrCodeUrl, setQrCodeUrl] = useState(null); + const [qrCodeImageDataUrl, setQrCodeImageDataUrl] = useState(null); const [isSubmitted, setIsSubmitted] = useState(false); const { t } = useTranslation("payment"); const qrCodeMap: Record = { @@ -328,12 +329,21 @@ const CheckoutForm: React.FC> = ({ if (paymentIntent?.status === "requires_action") { const nextAction = paymentIntent.next_action as any; - const qrUrl = - method === "alipay" - ? nextAction?.alipay_handle_redirect?.url - : nextAction?.wechat_pay_display_qr_code?.image_url_svg; + // Stripe returns multiple WeChat QR-related fields. + // For native WeChat pay experience we should prefer the protocol data (weixin://...). + // Fallback to the provided base64 image if present. + if (method === "alipay") { + const qrUrl = nextAction?.alipay_handle_redirect?.url; + setQrCodeUrl(qrUrl || null); + setQrCodeImageDataUrl(null); + } else { + const wechat = nextAction?.wechat_pay_display_qr_code; + const data = wechat?.data; // e.g. weixin://wxpay/bizpayurl?pr=... + const imageDataUrl = wechat?.image_data_url; // data:image/png;base64,... - setQrCodeUrl(qrUrl || null); + setQrCodeUrl(data || null); + setQrCodeImageDataUrl(!data ? imageDataUrl || null : null); + } } } catch (_error) { handleError(t("stripe.error", "An error occurred")); @@ -348,18 +358,26 @@ const CheckoutForm: React.FC> = ({
- ) : qrCodeUrl ? ( + ) : qrCodeUrl || qrCodeImageDataUrl ? ( <> - + {qrCodeImageDataUrl ? ( + {qrCodeMap[method] + ) : ( + + )}

{qrCodeMap[method] || t(`qrcode.${method}`, `Scan with ${method}`)}

From 30a6967187d21d38d602a92c03e631ebad931767 Mon Sep 17 00:00:00 2001 From: ppanel-web Date: Fri, 6 Feb 2026 07:09:55 +0000 Subject: [PATCH 12/19] =?UTF-8?q?=F0=9F=A7=B9=20fix(payment):=20satisfy=20?= =?UTF-8?q?img=20size=20lint=20rule?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/user/src/sections/user/payment/stripe.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/user/src/sections/user/payment/stripe.tsx b/apps/user/src/sections/user/payment/stripe.tsx index 248b632..18ac75e 100644 --- a/apps/user/src/sections/user/payment/stripe.tsx +++ b/apps/user/src/sections/user/payment/stripe.tsx @@ -365,6 +365,8 @@ const CheckoutForm: React.FC> = ({ alt={qrCodeMap[method] || t(`qrcode.${method}`, `Scan with ${method}`)} className="mx-auto h-[208px] w-[208px]" src={qrCodeImageDataUrl} + width={208} + height={208} /> ) : ( Date: Fri, 6 Feb 2026 07:10:57 +0000 Subject: [PATCH 13/19] =?UTF-8?q?=F0=9F=9A=80=20chore(release):=20Release?= =?UTF-8?q?=201.3.8=20/=20=E5=8F=91=E5=B8=83=E7=89=88=E6=9C=AC=201.3.8=20[?= =?UTF-8?q?skip=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## [1.3.8](https://github.com/perfect-panel/frontend/compare/v1.3.7...v1.3.8) (2026-02-06) ### 🐛 Bug Fixes / 问题修复 * **payment:** satisfy img size lint rule ([30a6967](https://github.com/perfect-panel/frontend/commit/30a6967187d21d38d602a92c03e631ebad931767)) * **payment:** use native WeChat Pay QR data ([160e6da](https://github.com/perfect-panel/frontend/commit/160e6da3f66691580752c65063e93c038b7a5547)) --- CHANGELOG.md | 7 +++++++ package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a54cc84..e9812a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,13 @@ This document records all notable changes to ShadCN Admin. --- +## [1.3.8](https://github.com/perfect-panel/frontend/compare/v1.3.7...v1.3.8) (2026-02-06) + +### 🐛 Bug Fixes / 问题修复 + +* **payment:** satisfy img size lint rule ([30a6967](https://github.com/perfect-panel/frontend/commit/30a6967187d21d38d602a92c03e631ebad931767)) +* **payment:** use native WeChat Pay QR data ([160e6da](https://github.com/perfect-panel/frontend/commit/160e6da3f66691580752c65063e93c038b7a5547)) + ## [1.3.7](https://github.com/perfect-panel/frontend/compare/v1.3.6...v1.3.7) (2026-01-27) ### 🐛 Bug Fixes / 问题修复 diff --git a/package.json b/package.json index a910f8b..7b0a57e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "frontend", - "version": "1.3.7", + "version": "1.3.8", "private": true, "homepage": "https://github.com/perfect-panel/frontend", "bugs": { From fee44fa1b22bfc6077a758d2cf82cc32840dadd5 Mon Sep 17 00:00:00 2001 From: ppanel-web Date: Sun, 8 Feb 2026 08:42:00 +0000 Subject: [PATCH 14/19] fix(auth): support OAuth callbacks with hash router (Fixes #9) --- apps/user/public/oauth/google/index.html | 28 +++++++++++++++++++ apps/user/public/oauth/telegram/index.html | 27 ++++++++++++++++++ apps/user/src/sections/auth/oauth-methods.tsx | 5 +++- 3 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 apps/user/public/oauth/google/index.html create mode 100644 apps/user/public/oauth/telegram/index.html diff --git a/apps/user/public/oauth/google/index.html b/apps/user/public/oauth/google/index.html new file mode 100644 index 0000000..2961fd0 --- /dev/null +++ b/apps/user/public/oauth/google/index.html @@ -0,0 +1,28 @@ + + + + + + OAuth Redirect + + + + + Redirecting… + + diff --git a/apps/user/public/oauth/telegram/index.html b/apps/user/public/oauth/telegram/index.html new file mode 100644 index 0000000..82deea9 --- /dev/null +++ b/apps/user/public/oauth/telegram/index.html @@ -0,0 +1,27 @@ + + + + + + OAuth Redirect + + + + + Redirecting… + + diff --git a/apps/user/src/sections/auth/oauth-methods.tsx b/apps/user/src/sections/auth/oauth-methods.tsx index 96548bd..b1e6595 100644 --- a/apps/user/src/sections/auth/oauth-methods.tsx +++ b/apps/user/src/sections/auth/oauth-methods.tsx @@ -35,7 +35,10 @@ export function OAuthMethods() { onClick={async () => { const { data } = await oAuthLogin({ method, - redirect: `${window.location.origin}/oauth/${method}`, + // OAuth providers disallow URL fragments (#) in redirect URIs. + // Use a real path (with trailing slash so static hosting can serve /oauth//index.html) + // which then bridges into our hash-router at /#/oauth/. + redirect: `${window.location.origin}/oauth/${method}/`, }); if (data.data?.redirect) { window.location.href = data.data?.redirect; From b32ba55ab8b0af3557a282ff02563d04335106f0 Mon Sep 17 00:00:00 2001 From: ppanel-web Date: Sun, 8 Feb 2026 08:45:36 +0000 Subject: [PATCH 15/19] fix(user): mobile announcement close + payment method selection (Fixes #8) --- .../sections/subscribe/payment-methods.tsx | 20 +++++++++++++------ apps/user/src/sections/user/announcement.tsx | 11 ++++++++-- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/apps/user/src/sections/subscribe/payment-methods.tsx b/apps/user/src/sections/subscribe/payment-methods.tsx index 80b6deb..c9695f6 100644 --- a/apps/user/src/sections/subscribe/payment-methods.tsx +++ b/apps/user/src/sections/subscribe/payment-methods.tsx @@ -9,7 +9,7 @@ import { import { cn } from "@workspace/ui/lib/utils"; import { getAvailablePaymentMethods } from "@workspace/ui/services/user/portal"; import type React from "react"; -import { memo } from "react"; +import React, { memo } from "react"; import { useTranslation } from "react-i18next"; interface PaymentMethodsProps { @@ -30,12 +30,21 @@ const PaymentMethods: React.FC = ({ queryFn: async () => { const { data } = await getAvailablePaymentMethods(); const list = data.data?.list || []; - const methods = balance ? list : list.filter((item) => item.id !== -1); - const defaultMethod = methods.find((item) => item.id)?.id; - if (defaultMethod) onChange(defaultMethod); - return methods; + return balance ? list : list.filter((item) => item.id !== -1); }, }); + + // Only set a default when the current value is not a valid option. + // This avoids resetting the user's selection on refetch (common on mobile). + // Prefer non-balance methods when possible. + React.useEffect(() => { + if (!data || data.length === 0) return; + const valid = data.some((m) => String(m.id) === String(value)); + if (valid) return; + + const preferred = data.find((m) => m.id !== -1)?.id ?? data[0]!.id; + onChange(preferred); + }, [data, onChange, value]); return ( <>
@@ -44,7 +53,6 @@ const PaymentMethods: React.FC = ({ { - console.log(val); onChange(Number(val)); }} value={String(value)} diff --git a/apps/user/src/sections/user/announcement.tsx b/apps/user/src/sections/user/announcement.tsx index 1ddf27b..5e31bb6 100644 --- a/apps/user/src/sections/user/announcement.tsx +++ b/apps/user/src/sections/user/announcement.tsx @@ -11,6 +11,7 @@ import Empty from "@workspace/ui/composed/empty"; import { Icon } from "@workspace/ui/composed/icon"; import { Markdown } from "@workspace/ui/composed/markdown"; import { queryAnnouncement } from "@workspace/ui/services/user/announcement"; +import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { useGlobalStore } from "@/stores/global"; @@ -39,10 +40,16 @@ export default function Announcement({ type }: { type: "popup" | "pinned" }) { if (!data) return null; + const [open, setOpen] = useState(false); + + useEffect(() => { + if (type === "popup" && !!data) setOpen(true); + }, [data, type]); + if (type === "popup") { return ( - - + + {data?.title} From 6e3ef8ab7ed5903d50ec43ba60544fd88d779c3e Mon Sep 17 00:00:00 2001 From: ppanel-web Date: Sun, 8 Feb 2026 08:49:17 +0000 Subject: [PATCH 16/19] fix(user): satisfy biome check for oauth/payment UI --- apps/user/public/oauth/google/index.html | 41 ++++++++++--------- apps/user/public/oauth/telegram/index.html | 39 +++++++++--------- .../sections/subscribe/payment-methods.tsx | 4 +- apps/user/src/sections/user/announcement.tsx | 7 ++-- .../user/src/sections/user/payment/stripe.tsx | 12 ++++-- 5 files changed, 54 insertions(+), 49 deletions(-) diff --git a/apps/user/public/oauth/google/index.html b/apps/user/public/oauth/google/index.html index 2961fd0..23f4bd1 100644 --- a/apps/user/public/oauth/google/index.html +++ b/apps/user/public/oauth/google/index.html @@ -1,28 +1,29 @@ - - + + OAuth Redirect - + - - Redirecting… - + Redirecting… diff --git a/apps/user/public/oauth/telegram/index.html b/apps/user/public/oauth/telegram/index.html index 82deea9..e650481 100644 --- a/apps/user/public/oauth/telegram/index.html +++ b/apps/user/public/oauth/telegram/index.html @@ -1,27 +1,28 @@ - - + + OAuth Redirect - + - - Redirecting… - + Redirecting… diff --git a/apps/user/src/sections/subscribe/payment-methods.tsx b/apps/user/src/sections/subscribe/payment-methods.tsx index c9695f6..b98bbfe 100644 --- a/apps/user/src/sections/subscribe/payment-methods.tsx +++ b/apps/user/src/sections/subscribe/payment-methods.tsx @@ -9,7 +9,7 @@ import { import { cn } from "@workspace/ui/lib/utils"; import { getAvailablePaymentMethods } from "@workspace/ui/services/user/portal"; import type React from "react"; -import React, { memo } from "react"; +import { memo, useEffect } from "react"; import { useTranslation } from "react-i18next"; interface PaymentMethodsProps { @@ -37,7 +37,7 @@ const PaymentMethods: React.FC = ({ // Only set a default when the current value is not a valid option. // This avoids resetting the user's selection on refetch (common on mobile). // Prefer non-balance methods when possible. - React.useEffect(() => { + useEffect(() => { if (!data || data.length === 0) return; const valid = data.some((m) => String(m.id) === String(value)); if (valid) return; diff --git a/apps/user/src/sections/user/announcement.tsx b/apps/user/src/sections/user/announcement.tsx index 5e31bb6..bcb962a 100644 --- a/apps/user/src/sections/user/announcement.tsx +++ b/apps/user/src/sections/user/announcement.tsx @@ -18,6 +18,7 @@ import { useGlobalStore } from "@/stores/global"; export default function Announcement({ type }: { type: "popup" | "pinned" }) { const { t } = useTranslation("dashboard"); const { user } = useGlobalStore(); + const [open, setOpen] = useState(false); const { data } = useQuery({ queryKey: ["announcement", type], @@ -38,14 +39,12 @@ export default function Announcement({ type }: { type: "popup" | "pinned" }) { enabled: !!user, }); - if (!data) return null; - - const [open, setOpen] = useState(false); - useEffect(() => { if (type === "popup" && !!data) setOpen(true); }, [data, type]); + if (!data) return null; + if (type === "popup") { return ( diff --git a/apps/user/src/sections/user/payment/stripe.tsx b/apps/user/src/sections/user/payment/stripe.tsx index 18ac75e..27752ce 100644 --- a/apps/user/src/sections/user/payment/stripe.tsx +++ b/apps/user/src/sections/user/payment/stripe.tsx @@ -276,7 +276,9 @@ const CheckoutForm: React.FC> = ({ const stripe = useStripe(); const [errorMessage, setErrorMessage] = useState(null); const [qrCodeUrl, setQrCodeUrl] = useState(null); - const [qrCodeImageDataUrl, setQrCodeImageDataUrl] = useState(null); + const [qrCodeImageDataUrl, setQrCodeImageDataUrl] = useState( + null + ); const [isSubmitted, setIsSubmitted] = useState(false); const { t } = useTranslation("payment"); const qrCodeMap: Record = { @@ -342,7 +344,7 @@ const CheckoutForm: React.FC> = ({ const imageDataUrl = wechat?.image_data_url; // data:image/png;base64,... setQrCodeUrl(data || null); - setQrCodeImageDataUrl(!data ? imageDataUrl || null : null); + setQrCodeImageDataUrl(data ? null : imageDataUrl || null); } } } catch (_error) { @@ -362,11 +364,13 @@ const CheckoutForm: React.FC> = ({ <> {qrCodeImageDataUrl ? ( {qrCodeMap[method] ) : ( Date: Sun, 8 Feb 2026 08:50:27 +0000 Subject: [PATCH 17/19] =?UTF-8?q?=F0=9F=9A=80=20chore(release):=20Release?= =?UTF-8?q?=201.3.9=20/=20=E5=8F=91=E5=B8=83=E7=89=88=E6=9C=AC=201.3.9=20[?= =?UTF-8?q?skip=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## [1.3.9](https://github.com/perfect-panel/frontend/compare/v1.3.8...v1.3.9) (2026-02-08) ### 🐛 Bug Fixes / 问题修复 * **auth:** support OAuth callbacks with hash router (Fixes [#9](https://github.com/perfect-panel/frontend/issues/9)) ([fee44fa](https://github.com/perfect-panel/frontend/commit/fee44fa1b22bfc6077a758d2cf82cc32840dadd5)) * **user:** mobile announcement close + payment method selection (Fixes [#8](https://github.com/perfect-panel/frontend/issues/8)) ([b32ba55](https://github.com/perfect-panel/frontend/commit/b32ba55ab8b0af3557a282ff02563d04335106f0)) * **user:** satisfy biome check for oauth/payment UI ([6e3ef8a](https://github.com/perfect-panel/frontend/commit/6e3ef8ab7ed5903d50ec43ba60544fd88d779c3e)) --- CHANGELOG.md | 8 ++++++++ package.json | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e9812a0..6d55b82 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,14 @@ This document records all notable changes to ShadCN Admin. --- +## [1.3.9](https://github.com/perfect-panel/frontend/compare/v1.3.8...v1.3.9) (2026-02-08) + +### 🐛 Bug Fixes / 问题修复 + +* **auth:** support OAuth callbacks with hash router (Fixes [#9](https://github.com/perfect-panel/frontend/issues/9)) ([fee44fa](https://github.com/perfect-panel/frontend/commit/fee44fa1b22bfc6077a758d2cf82cc32840dadd5)) +* **user:** mobile announcement close + payment method selection (Fixes [#8](https://github.com/perfect-panel/frontend/issues/8)) ([b32ba55](https://github.com/perfect-panel/frontend/commit/b32ba55ab8b0af3557a282ff02563d04335106f0)) +* **user:** satisfy biome check for oauth/payment UI ([6e3ef8a](https://github.com/perfect-panel/frontend/commit/6e3ef8ab7ed5903d50ec43ba60544fd88d779c3e)) + ## [1.3.8](https://github.com/perfect-panel/frontend/compare/v1.3.7...v1.3.8) (2026-02-06) ### 🐛 Bug Fixes / 问题修复 diff --git a/package.json b/package.json index 7b0a57e..1a31b65 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "frontend", - "version": "1.3.8", + "version": "1.3.9", "private": true, "homepage": "https://github.com/perfect-panel/frontend", "bugs": { From 8831c9be9c847f9873634112ce614576325d6d3a Mon Sep 17 00:00:00 2001 From: ppanel-web Date: Tue, 10 Feb 2026 00:57:20 +0000 Subject: [PATCH 18/19] fix(admin): persist reset-password Turnstile verify setting (Fixes #10) --- .../admin/src/sections/system/user-security/verify-form.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/admin/src/sections/system/user-security/verify-form.tsx b/apps/admin/src/sections/system/user-security/verify-form.tsx index c46be38..18c71d7 100644 --- a/apps/admin/src/sections/system/user-security/verify-form.tsx +++ b/apps/admin/src/sections/system/user-security/verify-form.tsx @@ -37,7 +37,7 @@ const verifySchema = z.object({ turnstile_secret: z.string().optional(), enable_register_verify: z.boolean().optional(), enable_login_verify: z.boolean().optional(), - enable_password_verify: z.boolean().optional(), + enable_reset_password_verify: z.boolean().optional(), }); type VerifyFormData = z.infer; @@ -63,7 +63,7 @@ export default function VerifyConfig() { turnstile_secret: "", enable_register_verify: false, enable_login_verify: false, - enable_password_verify: false, + enable_reset_password_verify: false, }, }); @@ -243,7 +243,7 @@ export default function VerifyConfig() { ( From f486c6247534f531be1553edd500663e93512b13 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Tue, 10 Feb 2026 00:58:43 +0000 Subject: [PATCH 19/19] =?UTF-8?q?=F0=9F=9A=80=20chore(release):=20Release?= =?UTF-8?q?=201.3.10=20/=20=E5=8F=91=E5=B8=83=E7=89=88=E6=9C=AC=201.3.10?= =?UTF-8?q?=20[skip=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## [1.3.10](https://github.com/perfect-panel/frontend/compare/v1.3.9...v1.3.10) (2026-02-10) ### 🐛 Bug Fixes / 问题修复 * **admin:** persist reset-password Turnstile verify setting (Fixes [#10](https://github.com/perfect-panel/frontend/issues/10)) ([8831c9b](https://github.com/perfect-panel/frontend/commit/8831c9be9c847f9873634112ce614576325d6d3a)) --- CHANGELOG.md | 6 ++++++ package.json | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d55b82..2b8ec31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,12 @@ This document records all notable changes to ShadCN Admin. --- +## [1.3.10](https://github.com/perfect-panel/frontend/compare/v1.3.9...v1.3.10) (2026-02-10) + +### 🐛 Bug Fixes / 问题修复 + +* **admin:** persist reset-password Turnstile verify setting (Fixes [#10](https://github.com/perfect-panel/frontend/issues/10)) ([8831c9b](https://github.com/perfect-panel/frontend/commit/8831c9be9c847f9873634112ce614576325d6d3a)) + ## [1.3.9](https://github.com/perfect-panel/frontend/compare/v1.3.8...v1.3.9) (2026-02-08) ### 🐛 Bug Fixes / 问题修复 diff --git a/package.json b/package.json index 1a31b65..b59e250 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "frontend", - "version": "1.3.9", + "version": "1.3.10", "private": true, "homepage": "https://github.com/perfect-panel/frontend", "bugs": {