feat(group): add node group management UI

Add node group management interface with automatic user assignment and traffic-based grouping.

Features:
- Node group CRUD with traffic range configuration
- Three grouping modes: average, subscription-based, and traffic-based
- Group recalculation with preview and history tracking
- Subscribe-to-group mapping management
- User subscription group locking
- Group calculation history with detailed reports
- Multi-language support (en-US, zh-CN)
- Enhanced node and subscription forms with group selection
This commit is contained in:
EUForest
2026-03-08 23:39:30 +08:00
parent dc55d85056
commit ae31019477
55 changed files with 6249 additions and 262 deletions
@@ -2,6 +2,7 @@
"accountEnable": "Account Enable",
"add": "Add",
"administrator": "Administrator",
"all": "All",
"areaCodePlaceholder": "Area code",
"authMethodsTitle": "Auth Methods",
"avatar": "Avatar",
@@ -17,6 +18,9 @@
"confirm": "Confirm",
"confirmDelete": "Confirm Delete",
"confirmOffline": "Confirm Offline",
"confirmResetToken": "Confirm Reset Subscription Address",
"confirmResumeSubscribe": "Confirm Resume Subscription",
"confirmStopSubscribe": "Confirm Stop Subscription",
"copySubscription": "Copy Subscription",
"copySuccess": "Copied successfully",
"create": "Create",
@@ -29,12 +33,14 @@
"deleteDescription": "This action cannot be undone.",
"deleteSubscriptionDescription": "This action cannot be undone.",
"deleteSuccess": "Deleted successfully",
"isDeleted": "Status",
"deviceLimit": "Device Limit",
"download": "Download",
"downloadTraffic": "Download Traffic",
"edit": "Edit",
"editGroup": "Edit Group",
"editSubscription": "Edit Subscription",
"editUserGroup": "Edit User Group",
"editUserGroupDescription": "Edit user group assignment and lock status",
"enable": "Enable",
"expiredAt": "Expired At",
"expireTime": "expireTime",
@@ -44,6 +50,7 @@
"invalidEmailFormat": "Invalid email format",
"inviteCode": "Invite Code",
"inviteCodePlaceholder": "Enter invite code",
"isDeleted": "Status",
"kickOfflineConfirm": "kickOfflineConfirm",
"kickOfflineSuccess": "Device kicked offline",
"lastSeen": "Last Seen",
@@ -73,37 +80,29 @@
"referrerUserId": "Referrer User ID",
"remove": "Remove",
"resetLogs": "Reset Logs",
"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",
"resetToken": "Reset Subscription Address",
"saving": "Saving...",
"resetTokenDescription": "This will reset the subscription address and regenerate a new token.",
"resetTokenSuccess": "Subscription address reset successfully",
"confirmResetToken": "Confirm Reset Subscription Address",
"resumeSubscribe": "Resume Subscription",
"selectGroup": "Select a group",
"resumeSubscribeDescription": "This will resume the subscription and allow the user to use it.",
"resumeSubscribeSuccess": "Subscription resumed successfully",
"save": "Save",
"shortCode": "Short Code",
"speedLimit": "Speed Limit",
"startTime": "startTime",
"status": "Status",
"statusActive": "Active",
"statusDeducted": "Deducted",
"statusExpired": "Expired",
"statusFinished": "Finished",
"statusPending": "Pending",
"statusStopped": "Stopped",
"stopSubscribe": "Stop Subscription",
"stopSubscribeDescription": "This will stop the subscription temporarily. User will not be able to use it.",
"stopSubscribeSuccess": "Subscription stopped successfully",
"confirmStopSubscribe": "Confirm Stop Subscription",
"resumeSubscribe": "Resume Subscription",
"resumeSubscribeDescription": "This will resume the subscription and allow the user to use it.",
"resumeSubscribeSuccess": "Subscription resumed successfully",
"confirmResumeSubscribe": "Confirm Resume Subscription",
"status": "Status",
"statusPending": "Pending",
"statusActive": "Active",
"statusFinished": "Finished",
"statusExpired": "Expired",
"statusDeducted": "Deducted",
"statusStopped": "Stopped",
"save": "Save",
"speedLimit": "Speed Limit",
"startTime": "startTime",
"subscription": "Subscription",
"subscriptionId": "subscriptionId",
"subscriptionInfo": "subscriptionInfo",
@@ -119,11 +118,13 @@
"trafficDetails": "Traffic Details",
"trafficLimit": "Traffic Limit",
"trafficStats": "Traffic Stats",
"trafficUsage": "trafficUsage",
"trafficUsage": "Traffic Usage",
"remainingTraffic": "Remaining Traffic",
"unlimited": "unlimited",
"unverified": "Unverified",
"update": "Update",
"updateSuccess": "Updated successfully",
"groupUpdated": "Group updated successfully",
"upload": "Upload",
"uploadTraffic": "Upload Traffic",
"userAgent": "User Agent",
@@ -134,5 +135,17 @@
"userList": "User List",
"userName": "Username",
"userProfile": "User Profile",
"verified": "Verified"
"userGroup": "User Group",
"verified": "Verified",
"locked": "Locked",
"lockGroup": "Lock Group",
"lockGroupDescription": "Prevent automatic grouping from changing this user's group",
"groupLocked": "Group Locked",
"previewNodes": "Preview Nodes",
"availableNodes": "Available Nodes",
"name": "Name",
"address": "Address",
"noNodesAvailable": "No nodes available",
"nodeGroup": "Node Group",
"publicNodes": "Public Nodes"
}