feat: Device Bind Limit

This commit is contained in:
EUForest 2026-01-06 21:03:31 +08:00
parent e3c0dc2569
commit 45b9b523b1
7 changed files with 37 additions and 0 deletions

View File

@ -28,6 +28,7 @@
"20005": "Insufficient balance, please recharge and try again.", "20005": "Insufficient balance, please recharge and try again.",
"20006": "The registration function is temporarily unavailable, please try again later.", "20006": "The registration function is temporarily unavailable, please try again later.",
"20008": "User information is incorrect, please check and try again.", "20008": "User information is incorrect, please check and try again.",
"20011": "Registration is too frequent, please try again later.",
"30001": "The node already exists, please do not add it again.", "30001": "The node already exists, please do not add it again.",
"30002": "Related node not found, please check and try again.", "30002": "Related node not found, please check and try again.",
"30003": "Group already exists, please try using a different name.", "30003": "Group already exists, please try using a different name.",

View File

@ -49,6 +49,8 @@
"register": { "register": {
"day": "Day(s)", "day": "Day(s)",
"description": "Configure user registration related settings", "description": "Configure user registration related settings",
"deviceLimit": "Device Limit",
"deviceLimitDescription": "Maximum number of devices allowed per user",
"enableTrial": "Enable Trial", "enableTrial": "Enable Trial",
"enableTrialDescription": "When enabled, new users will receive a trial subscription upon registration", "enableTrialDescription": "When enabled, new users will receive a trial subscription upon registration",
"hour": "Hour(s)", "hour": "Hour(s)",

View File

@ -28,6 +28,7 @@
"20005": "余额不足,请充值后再试。", "20005": "余额不足,请充值后再试。",
"20006": "注册功能暂时不可用,请稍后再试。", "20006": "注册功能暂时不可用,请稍后再试。",
"20008": "用户信息不正确,请检查后重试。", "20008": "用户信息不正确,请检查后重试。",
"20011": "注册过于频繁,请稍后再试。",
"30001": "该节点已存在,请勿重复添加。", "30001": "该节点已存在,请勿重复添加。",
"30002": "找不到相关节点,请检查后重试。", "30002": "找不到相关节点,请检查后重试。",
"30003": "分组已存在,请尝试使用不同的名称。", "30003": "分组已存在,请尝试使用不同的名称。",

View File

@ -61,6 +61,11 @@ export function useNavs() {
url: "/dashboard/coupon", url: "/dashboard/coupon",
icon: "flat-color-icons:bookmark", icon: "flat-color-icons:bookmark",
}, },
{
title: t("Redemption Management", "Redemption Management"),
url: "/dashboard/redemption",
icon: "flat-color-icons:key",
},
{ {
title: t("Marketing Management", "Marketing Management"), title: t("Marketing Management", "Marketing Management"),
url: "/dashboard/marketing", url: "/dashboard/marketing",

View File

@ -25,6 +25,9 @@ const DashboardSystemIndexLazyRouteImport =
const DashboardSubscribeIndexLazyRouteImport = createFileRoute( const DashboardSubscribeIndexLazyRouteImport = createFileRoute(
'/dashboard/subscribe/', '/dashboard/subscribe/',
)() )()
const DashboardRedemptionIndexLazyRouteImport = createFileRoute(
'/dashboard/redemption/',
)()
const DashboardProductIndexLazyRouteImport = createFileRoute( const DashboardProductIndexLazyRouteImport = createFileRoute(
'/dashboard/product/', '/dashboard/product/',
)() )()
@ -147,6 +150,14 @@ const DashboardSubscribeIndexLazyRoute =
} as any).lazy(() => } as any).lazy(() =>
import('./routes/dashboard/subscribe/index.lazy').then((d) => d.Route), import('./routes/dashboard/subscribe/index.lazy').then((d) => d.Route),
) )
const DashboardRedemptionIndexLazyRoute =
DashboardRedemptionIndexLazyRouteImport.update({
id: '/redemption/',
path: '/redemption/',
getParentRoute: () => DashboardRouteLazyRoute,
} as any).lazy(() =>
import('./routes/dashboard/redemption/index.lazy').then((d) => d.Route),
)
const DashboardProductIndexLazyRoute = const DashboardProductIndexLazyRoute =
DashboardProductIndexLazyRouteImport.update({ DashboardProductIndexLazyRouteImport.update({
id: '/product/', id: '/product/',
@ -338,6 +349,7 @@ export interface FileRoutesByFullPath {
'/dashboard/order': typeof DashboardOrderIndexLazyRoute '/dashboard/order': typeof DashboardOrderIndexLazyRoute
'/dashboard/payment': typeof DashboardPaymentIndexLazyRoute '/dashboard/payment': typeof DashboardPaymentIndexLazyRoute
'/dashboard/product': typeof DashboardProductIndexLazyRoute '/dashboard/product': typeof DashboardProductIndexLazyRoute
'/dashboard/redemption': typeof DashboardRedemptionIndexLazyRoute
'/dashboard/subscribe': typeof DashboardSubscribeIndexLazyRoute '/dashboard/subscribe': typeof DashboardSubscribeIndexLazyRoute
'/dashboard/system': typeof DashboardSystemIndexLazyRoute '/dashboard/system': typeof DashboardSystemIndexLazyRoute
'/dashboard/ticket': typeof DashboardTicketIndexLazyRoute '/dashboard/ticket': typeof DashboardTicketIndexLazyRoute
@ -369,6 +381,7 @@ export interface FileRoutesByTo {
'/dashboard/order': typeof DashboardOrderIndexLazyRoute '/dashboard/order': typeof DashboardOrderIndexLazyRoute
'/dashboard/payment': typeof DashboardPaymentIndexLazyRoute '/dashboard/payment': typeof DashboardPaymentIndexLazyRoute
'/dashboard/product': typeof DashboardProductIndexLazyRoute '/dashboard/product': typeof DashboardProductIndexLazyRoute
'/dashboard/redemption': typeof DashboardRedemptionIndexLazyRoute
'/dashboard/subscribe': typeof DashboardSubscribeIndexLazyRoute '/dashboard/subscribe': typeof DashboardSubscribeIndexLazyRoute
'/dashboard/system': typeof DashboardSystemIndexLazyRoute '/dashboard/system': typeof DashboardSystemIndexLazyRoute
'/dashboard/ticket': typeof DashboardTicketIndexLazyRoute '/dashboard/ticket': typeof DashboardTicketIndexLazyRoute
@ -402,6 +415,7 @@ export interface FileRoutesById {
'/dashboard/order/': typeof DashboardOrderIndexLazyRoute '/dashboard/order/': typeof DashboardOrderIndexLazyRoute
'/dashboard/payment/': typeof DashboardPaymentIndexLazyRoute '/dashboard/payment/': typeof DashboardPaymentIndexLazyRoute
'/dashboard/product/': typeof DashboardProductIndexLazyRoute '/dashboard/product/': typeof DashboardProductIndexLazyRoute
'/dashboard/redemption/': typeof DashboardRedemptionIndexLazyRoute
'/dashboard/subscribe/': typeof DashboardSubscribeIndexLazyRoute '/dashboard/subscribe/': typeof DashboardSubscribeIndexLazyRoute
'/dashboard/system/': typeof DashboardSystemIndexLazyRoute '/dashboard/system/': typeof DashboardSystemIndexLazyRoute
'/dashboard/ticket/': typeof DashboardTicketIndexLazyRoute '/dashboard/ticket/': typeof DashboardTicketIndexLazyRoute
@ -436,6 +450,7 @@ export interface FileRouteTypes {
| '/dashboard/order' | '/dashboard/order'
| '/dashboard/payment' | '/dashboard/payment'
| '/dashboard/product' | '/dashboard/product'
| '/dashboard/redemption'
| '/dashboard/subscribe' | '/dashboard/subscribe'
| '/dashboard/system' | '/dashboard/system'
| '/dashboard/ticket' | '/dashboard/ticket'
@ -467,6 +482,7 @@ export interface FileRouteTypes {
| '/dashboard/order' | '/dashboard/order'
| '/dashboard/payment' | '/dashboard/payment'
| '/dashboard/product' | '/dashboard/product'
| '/dashboard/redemption'
| '/dashboard/subscribe' | '/dashboard/subscribe'
| '/dashboard/system' | '/dashboard/system'
| '/dashboard/ticket' | '/dashboard/ticket'
@ -499,6 +515,7 @@ export interface FileRouteTypes {
| '/dashboard/order/' | '/dashboard/order/'
| '/dashboard/payment/' | '/dashboard/payment/'
| '/dashboard/product/' | '/dashboard/product/'
| '/dashboard/redemption/'
| '/dashboard/subscribe/' | '/dashboard/subscribe/'
| '/dashboard/system/' | '/dashboard/system/'
| '/dashboard/ticket/' | '/dashboard/ticket/'
@ -575,6 +592,13 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof DashboardSubscribeIndexLazyRouteImport preLoaderRoute: typeof DashboardSubscribeIndexLazyRouteImport
parentRoute: typeof DashboardRouteLazyRoute parentRoute: typeof DashboardRouteLazyRoute
} }
'/dashboard/redemption/': {
id: '/dashboard/redemption/'
path: '/redemption'
fullPath: '/dashboard/redemption'
preLoaderRoute: typeof DashboardRedemptionIndexLazyRouteImport
parentRoute: typeof DashboardRouteLazyRoute
}
'/dashboard/product/': { '/dashboard/product/': {
id: '/dashboard/product/' id: '/dashboard/product/'
path: '/product' path: '/product'
@ -750,6 +774,7 @@ interface DashboardRouteLazyRouteChildren {
DashboardOrderIndexLazyRoute: typeof DashboardOrderIndexLazyRoute DashboardOrderIndexLazyRoute: typeof DashboardOrderIndexLazyRoute
DashboardPaymentIndexLazyRoute: typeof DashboardPaymentIndexLazyRoute DashboardPaymentIndexLazyRoute: typeof DashboardPaymentIndexLazyRoute
DashboardProductIndexLazyRoute: typeof DashboardProductIndexLazyRoute DashboardProductIndexLazyRoute: typeof DashboardProductIndexLazyRoute
DashboardRedemptionIndexLazyRoute: typeof DashboardRedemptionIndexLazyRoute
DashboardSubscribeIndexLazyRoute: typeof DashboardSubscribeIndexLazyRoute DashboardSubscribeIndexLazyRoute: typeof DashboardSubscribeIndexLazyRoute
DashboardSystemIndexLazyRoute: typeof DashboardSystemIndexLazyRoute DashboardSystemIndexLazyRoute: typeof DashboardSystemIndexLazyRoute
DashboardTicketIndexLazyRoute: typeof DashboardTicketIndexLazyRoute DashboardTicketIndexLazyRoute: typeof DashboardTicketIndexLazyRoute
@ -781,6 +806,7 @@ const DashboardRouteLazyRouteChildren: DashboardRouteLazyRouteChildren = {
DashboardOrderIndexLazyRoute: DashboardOrderIndexLazyRoute, DashboardOrderIndexLazyRoute: DashboardOrderIndexLazyRoute,
DashboardPaymentIndexLazyRoute: DashboardPaymentIndexLazyRoute, DashboardPaymentIndexLazyRoute: DashboardPaymentIndexLazyRoute,
DashboardProductIndexLazyRoute: DashboardProductIndexLazyRoute, DashboardProductIndexLazyRoute: DashboardProductIndexLazyRoute,
DashboardRedemptionIndexLazyRoute: DashboardRedemptionIndexLazyRoute,
DashboardSubscribeIndexLazyRoute: DashboardSubscribeIndexLazyRoute, DashboardSubscribeIndexLazyRoute: DashboardSubscribeIndexLazyRoute,
DashboardSystemIndexLazyRoute: DashboardSystemIndexLazyRoute, DashboardSystemIndexLazyRoute: DashboardSystemIndexLazyRoute,
DashboardTicketIndexLazyRoute: DashboardTicketIndexLazyRoute, DashboardTicketIndexLazyRoute: DashboardTicketIndexLazyRoute,

View File

@ -28,6 +28,7 @@
"20005": "Insufficient balance, please recharge and try again.", "20005": "Insufficient balance, please recharge and try again.",
"20006": "The registration function is temporarily unavailable, please try again later.", "20006": "The registration function is temporarily unavailable, please try again later.",
"20008": "User information is incorrect, please check and try again.", "20008": "User information is incorrect, please check and try again.",
"20011": "Registration is too frequent, please try again later.",
"30001": "The node already exists, please do not add it again.", "30001": "The node already exists, please do not add it again.",
"30002": "Related node not found, please check and try again.", "30002": "Related node not found, please check and try again.",
"30003": "Group already exists, please try using a different name.", "30003": "Group already exists, please try using a different name.",

View File

@ -28,6 +28,7 @@
"20005": "余额不足,请充值后再试。", "20005": "余额不足,请充值后再试。",
"20006": "注册功能暂时不可用,请稍后再试。", "20006": "注册功能暂时不可用,请稍后再试。",
"20008": "用户信息不正确,请检查后重试。", "20008": "用户信息不正确,请检查后重试。",
"20011": "注册过于频繁,请稍后再试。",
"30001": "该节点已存在,请勿重复添加。", "30001": "该节点已存在,请勿重复添加。",
"30002": "找不到相关节点,请检查后重试。", "30002": "找不到相关节点,请检查后重试。",
"30003": "分组已存在,请尝试使用不同的名称。", "30003": "分组已存在,请尝试使用不同的名称。",