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
@@ -0,0 +1,187 @@
{
"actions": "操作",
"autoTrigger": "自动",
"averageMode": "平均分组",
"cancel": "取消",
"completed": "已完成",
"confirm": "确认",
"confirmDelete": "确认删除",
"config": "配置",
"create": "创建",
"created": "创建成功",
"createdAt": "创建时间",
"createNodeGroup": "创建节点组",
"createUserGroup": "创建用户组",
"delete": "删除",
"deleted": "删除成功",
"deleteNodeGroupConfirm": "此操作将删除节点组。该组中的节点将被重新分配。",
"deleteUserGroupConfirm": "此操作将删除用户组。该组中的用户将被重新分配到默认组。",
"description": "描述",
"descriptionPlaceholder": "输入描述",
"edit": "编辑",
"editNodeGroup": "编辑节点组",
"editUserGroup": "编辑用户组",
"editUserGroupDescription": "编辑用户组分配和锁定状态",
"selectGroup": "选择一个组",
"endTime": "结束时间",
"errorMessage": "错误信息",
"export": "导出",
"failed": "失败",
"failedCount": "失败",
"groupConfig": "分组配置",
"groupConfigDescription": "管理节点组并自动为用户订阅分配节点组",
"groupDetails": "分组详情",
"groupEnabled": "启用分组管理",
"groupEnabledDescription": "启用分组管理以控制用户对节点的访问",
"groupHistory": "分组计算历史",
"groupHistoryDescription": "查看分组重算历史和结果",
"groupHistoryDetail": "分组计算详情",
"groupId": "分组ID",
"groupIdPlaceholder": "输入唯一的分组ID",
"groupMode": "分组模式",
"groupModeDescription": "选择分组算法以将用户分配到组",
"groupName": "分组名称",
"groupNamePlaceholder": "输入分组名称",
"groupRecalculation": "分组重新计算",
"groupRecalculationDescription": "根据当前配置手动触发所有有效用户订阅的节点组重新分配",
"history": "历史记录",
"historyId": "历史ID",
"id": "ID",
"idPrefix": "#",
"idle": "空闲",
"separator": "",
"loading": "加载中...",
"loadFailed": "加载配置失败",
"locked": "已锁定",
"manualTrigger": "手动",
"name": "名称",
"namePlaceholder": "输入名称",
"nodeCount": "节点数",
"nodeGroup": "节点组",
"nodeGroupFormDescription": "配置节点组设置",
"nodeGroups": "节点组",
"nodeGroupsDescription": "管理节点组以控制用户访问权限",
"noDetails": "暂无详情",
"operator": "操作人",
"progress": "进度",
"recalculate": "重新计算",
"recalculateAll": "重新分配节点组",
"recalculationCompleted": "重新计算成功完成",
"recalculationFailed": "重新计算失败,请重试。",
"recalculationStarted": "重新计算已启动",
"recalculationWarning": "重新计算将根据当前配置重新分配所有有效用户订阅的节点组。此操作无法撤消。",
"running": "运行中",
"save": "保存",
"scheduleTrigger": "定时",
"sort": "排序",
"sortOrder": "排序顺序",
"startTime": "开始时间",
"subscribeMode": "套餐分组",
"successCount": "成功",
"title": "分组管理",
"totalUsers": "总用户数",
"totalNodes": "总节点数",
"totalGroups": "总分组数",
"trafficMode": "流量分组",
"triggerType": "触发类型",
"userGroup": "用户组",
"userGroups": "用户组",
"userGroupsDescription": "管理用户组以控制节点访问权限",
"updated": "更新成功",
"updateFailed": "更新失败",
"userCount": "用户数",
"viewDetail": "查看详情",
"warning": "警告",
"yes": "是",
"no": "否",
"saving": "保存中...",
"enableGrouping": "启用分组",
"enableGroupingDescription": "启用后,用户订阅将根据分配模式自动分配节点组",
"groupingMode": "分组方式",
"averageModeConfig": "平均模式配置",
"subscribeModeConfig": "订阅模式配置",
"trafficModeConfig": "流量模式配置",
"averageModeDescription": "为有效用户订阅随机分配可用节点组",
"subscribeModeDescription": "根据订阅套餐设置用户组的默认节点组",
"trafficModeDescription": "根据用户订阅的流量使用情况分配节点组",
"defaultUserGroupId": "默认用户组ID",
"defaultUserGroupDescription": "新用户将被分配到此组",
"defaultUserGroupForExpiredDescription": "订阅过期的用户将被分配到此组",
"autoCreateGroup": "自动创建组",
"autoCreateGroupDescription": "添加新订阅计划时自动创建新的用户组",
"lockGroup": "锁定分组",
"lockGroupDescription": "防止自动重新计算更改此用户的分组",
"trafficRangesComingSoon": "流量区间配置即将推出...",
"currentStatus": "当前状态",
"trafficRangesConfig": "流量区间配置",
"trafficRangesDescription": "配置用户流量分组区间。流量根据用户计费周期计算。",
"minTrafficGB": "最小流量 (GB)",
"maxTrafficGB": "最大流量 (GB)",
"addRange": "添加区间",
"remove": "移除",
"note": "注意",
"trafficRangesNote": "区间不能重叠且必须覆盖所有值而不留空档。流量大于最后一个区间上限的用户将被分配到最后一个组。",
"defaultUserGroup": "默认用户组",
"defaultUserGroupForTrafficDescription": "超出所有定义区间的用户将被分配到此组",
"rangeError": "区间错误",
"overlapError": "区间重叠错误",
"gapError": "存在空档错误",
"groupByTraffic": "按流量分组",
"resetGroups": "重置所有分组",
"resetGroupsTitle": "重置所有分组",
"resetGroupsDescription": "此操作将删除所有节点组和用户组,将所有用户的组ID重置为0,清空所有商品的节点组ID,清空所有节点的节点组ID。此操作无法撤消。",
"resetSuccess": "所有分组已成功重置",
"resetFailed": "重置分组失败",
"saved": "配置保存成功",
"saveFailed": "保存配置失败",
"autoCalculated": "自动统计",
"userGroupCountAutoCalculated": "自动统计实际用户组数量",
"userGroupCount": "用户组数",
"nodeGroupCountAutoCalculated": "自动统计实际节点组数量",
"nodeGroupCount": "节点组数",
"arrow": " → ",
"availableNodeGroups": "可用节点组",
"currentGroupingResult": "当前分组结果",
"calculationInfo": "计算信息",
"groupingDetailsStatistics": "分组详情统计",
"successFailedCount": "成功/失败",
"latestGroupingCalculation": "最新分组计算详情",
"userList": "用户列表",
"email": "邮箱",
"noUsers": "未找到用户",
"showing": "显示",
"to": "至",
"of": "共",
"previous": "上一页",
"next": "下一页",
"result": "结果",
"bindNodeGroup": "绑定节点组",
"bindNodeGroupDescription": "选择一个节点组绑定到以下用户组:{{userGroups}}",
"selectNodeGroup": "选择节点组",
"selectNodeGroupPlaceholder": "请选择节点组...",
"selectNodeGroupRequired": "请选择一个节点组",
"unbound": "未绑定",
"bindSuccess": "成功将 {{userGroupCount}} 个用户组绑定到节点组",
"bindFailed": "绑定节点组失败",
"groupMapping": "分组对应关系",
"forCalculation": "参与计算",
"trafficRange": "流量区间 (GB)",
"configSaved": "配置保存成功",
"subscribeGroupMappingTitle": "套餐-节点组对应关系",
"subscribeName": "订阅计划",
"userGroupName": "用户组",
"nodeGroupName": "节点组",
"notMapped": "未映射",
"noMappingData": "暂无映射数据",
"forCalculationDescription": "此节点组是否参与分组计算",
"trafficRangeGB": "流量区间 (GB)",
"trafficRangeDescription": "流量大于等于最小值且小于最大值的用户将被分配到此节点组",
"minCannotExceedMax": "最小流量不能超过最大流量",
"rangeOverlap": "区间与节点组 \"{{name}}\" 重叠",
"nodeGroupNotFound": "未找到节点组",
"validationFailed": "验证失败",
"totalNodeGroups": "总节点组数",
"invalidRange": "最小流量必须小于最大流量",
"rangeConflict": "流量区间与节点组 \"{{name}}\" 冲突(区间:{{min}} - {{max}} GB"
}