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
@@ -1,4 +1,5 @@
{
"all": "全部",
"cancel": "取消",
"confirm": "确认",
"confirmDelete": "确定要删除吗?",
@@ -7,13 +8,16 @@
"create": "创建",
"createSubscribe": "创建订阅",
"createSuccess": "创建成功",
"currentUserGroup": "当前用户分组",
"defaultNodeGroup": "默认节点组",
"delete": "删除",
"nodeGroups": "节点组",
"nodes": "个节点",
"deleteSuccess": "删除成功",
"deleteWarning": "删除后数据无法恢复,请谨慎操作。",
"deviceLimit": "IP限制",
"edit": "编辑",
"editSubscribe": "编辑订阅",
"sortSuccess": "排序成功",
"form": {
"annualReset": "年度重置",
"basic": "基本",
@@ -30,7 +34,6 @@
"discountPercent": "折扣百分比",
"Hour": "小时",
"inventory": "订阅库存",
"unlimitedInventory": "无限制(输入 -1",
"language": "语言",
"languageDescription": "留空为默认无语言限制",
"languagePlaceholder": "订阅的语言标识符,例如 en-US、zh-CN",
@@ -40,7 +43,19 @@
"name": "名称",
"node": "节点",
"nodeGroup": "节点组",
"nodes": "节点",
"nodeGroups": "节点",
"nodeGroupsDescription": "将此商品分配到多个节点分组。用户将可以从这些分组获取节点。",
"nodeGroupsFirstSelectionDescription": "为此商品选择节点组。第一个选中的组将被设置为默认节点组。",
"defaultNodeGroup": "默认节点组",
"defaultNodeGroupDescription": "为此商品选择默认节点组。将自动包含在备用节点组中。",
"selectDefaultNodeGroup": "选择默认节点组...",
"noDefaultNodeGroup": "无默认节点组",
"backupNodeGroups": "备用节点组",
"backupNodeGroupsDescription": "选择其他备用节点组。默认节点组会自动包含。",
"nodes": "关联节点",
"nodesDescription": "选择此订阅的节点",
"nodesInGroup": "分组中的节点:",
"nodesWithoutGroupsDescription": "未分配到分组的节点将在此处显示(属于分组的节点在上方的节点组部分管理)",
"noLimit": "无限制",
"NoLimit": "无限制",
"noReset": "不重置",
@@ -61,16 +76,42 @@
"traffic": "流量",
"unitPrice": "单价",
"unitTime": "时间单位",
"unlimitedInventory": "无限制(输入 -1",
"Year": "年"
},
"groupMapping": "分组映射",
"groupMappingTitle": "分组映射",
"groupMappingUpdateFailed": "更新分组映射失败",
"groupMappingUpdateSuccess": "分组映射更新成功",
"migrateUsers": "迁移用户",
"migrateUsersTitle": "迁移用户",
"migrateUsersDescription": "将当前用户组的所有用户迁移到另一个用户组",
"migrateUsersWarning": "这将把 {count} 个用户从 \"{group}\" 迁移到目标用户组。此操作无法撤销。",
"migrateUsersSuccess": "成功将 {count} 个用户迁移到目标用户组",
"migrateUsersFailed": "迁移用户失败",
"targetUserGroup": "目标用户组",
"selectTargetGroup": "选择目标用户组...",
"selectTargetGroupFirst": "请先选择目标用户组",
"cannotMigrateToSameGroup": "无法迁移到相同的用户组",
"noSourceGroup": "没有可用的源用户组",
"selectedGroup": "已选择的分组",
"userCount": "用户数量",
"migrating": "迁移中...",
"inventory": "订阅库存",
"language": "语言",
"loading": "加载中...",
"name": "名称",
"noMapping": "未设置映射",
"noNodes": "该分组下没有节点",
"quota": "购买限制/次",
"replacement": "重置价格/次",
"save": "保存",
"selectGroupPlaceholder": "选择分组...",
"selectUserGroup": "选择用户分组",
"sell": "销售",
"show": "显示",
"sold": "订阅数量",
"sortSuccess": "排序成功",
"traffic": "流量",
"unitPrice": "单价",
"updateSuccess": "更新成功"