feat: 租约可视化管理+暗黑主题+平台/配置导入导出功能#14
Open
ambiel9687 wants to merge 30 commits into
Open
Conversation
ambiel9687
commented
Mar 11, 2026
- 导入导出功能: 新增平台与订阅配置的导入导出,支持 JSON 格式,含覆盖/跳过策略
- 租约管理增强: 租约面板 UI 优化并绑定 API;租约到期前自动续期;相对时间支持未来时间显示
- 暗黑主题: 新增完整暗黑主题及主题切换按钮,基于 CSS 变量实现
- CI 修复: Docker tag 仓库名转小写修复 buildx 构建失败;新增 Dev Build workflow
改动列表:
- 后端 LeaseResponse: 新增 created_at 字段,leaseToResponse 转换 CreatedAtNs
- handler_lease: leaseSortKey 扩展至 6 个排序字段(account/node_tag/egress_ip/created_at/expiry/last_accessed)
- server.go: 注册 PUT /leases/{account} 绑定租约路由
- PlatformLeasesPanel.tsx: 新增完整租约面板组件(搜索/排序/分页/绑定/解绑)
- api.ts: 新增 listPlatformLeases、deletePlatformLease、bindPlatformLease API
- types.ts: LeaseResponse 新增 created_at 字段
- theme.css: 租约面板、绑定表单、排序列头样式
- .github/workflows/dev-build.yml: 新增 Dev Build CI workflow(手动触发、多平台构建+Docker)
- .gitignore: 更新忽略规则
via [HAPI](https://hapi.run)
Co-Authored-By: HAPI <noreply@hapi.run>
改动列表: - dev-build.yml: 新增 Lowercase repository name 步骤,将 github.repository 转为小写后用于 Docker tag via [HAPI](https://hapi.run) Co-Authored-By: HAPI <noreply@hapi.run>
改动列表: - webui/index.html: 添加 FOUC 防闪脚本,DOM 渲染前设置 data-theme - webui/src/stores/theme-store.ts: 新建 Zustand theme store,支持 system/light/dark 三态切换 - webui/src/components/ThemeToggle.tsx: 新建主题切换按钮,复用 locale-switch-compact 样式 - webui/src/components/AppShell.tsx: 侧栏集成 ThemeToggle 组件 - webui/src/i18n/translations.ts: 新增切换主题/深色/浅色/系统 4 个翻译键 - webui/src/styles/theme.css: 追加 [data-theme="dark"] 暗色 CSS 变量覆盖及组件适配 - webui/src/components/ui/Switch.css: 追加 Switch 暗色滑块样式
改动列表: - internal/routing/router.go: tryLeaseHit/tryLeaseSameIPRotation 到期前 1 分钟自动续期 ExpiryNs - webui/src/lib/time.ts: formatRelativeTime 支持未来时间显示(如 "3 天后") via HAPI (https://hapi.run) Co-Authored-By: HAPI <noreply@hapi.run>
改动列表: - internal/service/control_plane_data.go: 新增 ExportData/ImportData 业务逻辑,含防重策略(name+url 双键匹配、skip/overwrite 冲突策略、JSON 内部去重) - internal/api/handler_data.go: 新增 HandleExportData/HandleImportData HTTP handler - internal/api/server.go: 注册 GET /api/v1/data/export 和 POST /api/v1/data/import 路由 - webui/src/features/systemConfig/api.ts: 新增 exportData(blob 下载)和 importData(POST JSON)API 函数 - webui/src/features/systemConfig/SystemConfigPage.tsx: 新增「数据管理」Card 组件(导出按钮、文件选择、冲突策略下拉、导入结果展示) - webui/src/i18n/translations.ts: 新增 17 条中英翻译条目 via [HAPI](https://hapi.run) Co-Authored-By: HAPI <noreply@hapi.run>
改动列表: - internal/service/control_plane_data.go: buildSubscriptionPatch 按 source_type 条件包含 url/content 字段 - webui/src/features/systemConfig/SystemConfigPage.tsx: 移除多余的闭合 div 标签 via [HAPI](https://hapi.run) Co-Authored-By: HAPI <noreply@hapi.run>
改动列表: - webui/src/lib/api-client.ts: 导出 JsonValue 类型 - webui/src/features/systemConfig/api.ts: importData body 使用 JsonValue 替代 Record<string, unknown> via [HAPI](https://hapi.run) Co-Authored-By: HAPI <noreply@hapi.run>
改动列表: - internal/service/control_plane_data.go: buildPlatformPatch 中将 nil slice 转为空 slice,避免 JSON 序列化为 null 被 validateFields 拒绝 via [HAPI](https://hapi.run) Co-Authored-By: HAPI <noreply@hapi.run>
# Conflicts: # .gitignore
改动列表:
- 节点租约数列: 后端聚合 lease_count 字段(router 新增 SnapshotNodeLoad/SnapshotNodeLoadAll),前端新增可排序列,点击打开租约弹窗
- 租约详情弹窗: 新增 NodeLeasesModal 组件,展示平台/账号/绑定时间/到期/最近访问,支持解绑操作
- 弹窗节点元信息: 租约表上方展示节点来源、出口 IP、参考延迟三个 chip 指标
- 共享格式函数: 提取 nodeFormat.ts,NodesPage 与弹窗复用 firstTag/regionToFlag/formatLatency 等工具函数
- 节点租约 API: 新增 GET /api/v1/nodes/{hash}/leases 端点,service 层新增 ListLeasesByNode
- 弹窗样式优化: 修复表格横向溢出,新增 modal 卡片/table 覆写/chip 行等样式
改动列表:
- 持久化层: 新增 000003 迁移为 nodes_dynamic 增加 manually_disabled 列,repo_cache 的加载/批量 upsert/SQL 三处同步该字段
- 运行时实体: NodeEntry 新增 ManuallyDisabled atomic.Bool 与 IsManuallyDisabled(),cmd/resin 的写/启动加载路径补该字段
- 路由过滤: Platform.evaluateNode 最前面短路被手动禁用的节点,GlobalNodePool.SetNodeManualDisable 封装翻位+通知所有平台重评估
- 租约处理: 新增 Router.DeleteLeasesByNode 跨平台扫表删除节点对应租约并发出 LeaseRemove 事件
- 服务/API: ControlPlaneService.SetNodeManualDisable,NodeSummary.ManuallyDisabled 字段,新增 POST /api/v1/nodes/{hash}/actions/{disable,enable} 与 manually_disabled 查询过滤
- 前端: types/api 同步新字段与新 API,NodesPage 操作列加 Ban/CircleCheck 按钮、状态徽标/筛选支持手动禁用,禁用 Toast 提示解绑数量
- 文档: DESIGN.md 同步 schema、可路由视图过滤条件、列出节点 query、新 Action 端点与响应示例
added 16 commits
June 14, 2026 14:54
在主端口之外额外监听一段端口供免密使用:整段端口绑定一个平台, 每个端口通过粘性租约固定一个出口节点/IP,访问安全由内网/白名单模式控制。 改动列表: - 配置: env.go 新增 RESIN_FREE_PORT_*(起始端口/数量/平台/访问模式/白名单)及校验 - IP 访问控制: 新增 netutil/access_control.go,支持内网与白名单两种模式 - 免密身份注入: forward.go/socks5.go 支持固定平台+端口派生 account(新增 free_port.go),跳过 Token 认证 - 连接闸门: inbound_demux.go 新增可选 connGate,免密端口注入 IP 访问控制 - 平台自动创建: main.go 新增 ensureFreePortPlatform,绑定平台不存在时自动创建(备注免密专用) - 监听装配: app_runtime.go 装配免密端口监听器(共享 handler)与优雅关闭 - 文档与部署: docker-compose/Dockerfile/README 同步免密端口配置 - 测试: 新增 access_control/free_port/env 免密配置单元测试
改动列表: - internal/config/env.go: RESIN_PROBE_CONCURRENCY 默认值由 1000 下调至 64,避免数千节点时启动瞬间拉起上千并发出站探测打满 CPU/网络/磁盘 - internal/config/env_test.go: 同步更新默认值断言 - docker-compose.yml.example: 新增 GOMAXPROCS/GOMEMLIMIT 与 deploy.resources.limits,让 Go 运行时遵循容器配额(约束多处 GOMAXPROCS(0) 工作池与 GC);免密端口映射由 21000-22000 收窄至 21000-21049,消除按端口派生的大量 docker-proxy 进程
- 新增订阅流量用量字段(上传/下载/总量/到期时间) - 新增路由分配策略 PreferIdleIP,优先使用空闲 IP 避免并发冲突 - 下载器支持保留响应头,用于解析订阅用量信息 - 订阅更新时自动解析 Subscription-Userinfo 响应头 - 前端订阅页面展示流量用量与到期时间 - 新增数据库迁移脚本支持用量字段持久化
- 新增数据库迁移:subscriptions 表增加用量字段(上传/下载/总量/过期时间/更新时间) - 实现 Subscription-Userinfo 响应头解析器 - 新增单元测试覆盖正常解析、字段过滤、空值处理场景
# Conflicts: # .gitignore # internal/proxy/forward.go # internal/proxy/socks5.go # internal/state/migrate.go # internal/state/repo_state_test.go # webui/src/features/platforms/PlatformDetailPage.tsx
改动列表: - cmd/resin/app_runtime.go: 接入代理回退 metadata fetch,避免响应头丢失 - internal/netutil/outbound_http.go: 增加保留响应头的 outbound HTTP 获取 - internal/outbound/manager.go: 复用 metadata fetch 并保留 body-only 兼容 - internal/netutil/outbound_http_test.go: 覆盖 outbound 响应头保留 - internal/netutil/retry_downloader_test.go: 覆盖代理回退 metadata 透传
改动列表: - 控制平面租约: 调整租约服务逻辑并补充测试覆盖 - 路由矩阵: 扩展路由匹配逻辑与契约测试 - 节点界面: 新增节点详情抽屉并简化节点页面结构 - 平台租约界面: 增强租约展示字段与类型定义
改动列表: - internal/service/control_plane_data.go: 改为基于配置白名单动态导出和导入平台、订阅字段 - internal/service/control_plane_data_test.go: 增加动态字段导出、覆盖导入和 source_type 校验回归测试
改动列表: - webui/src/features/nodes/NodeDetailDrawer.tsx: 使用 Portal 将节点详情抽屉挂载到 body,避免在平台租约页被卡片定位上下文撑开页面
改动列表: - 节点管理: 增加节点接口能力、前端交互和测试覆盖 - 订阅管理: 扩展订阅 API、类型、页面逻辑和接口测试 - 控制面服务: 补充节点控制逻辑与单元测试 - 仪表盘: 调整 KPI 请求情况展示宽度和布局 - 国际化与样式: 补充相关翻译和页面样式
改动列表: - internal/probe/manager.go: 增加出口探测备用源和失败原因聚合 - internal/probe/trace.go: 新增纯文本 IP 探测响应解析 - internal/probe/manager_test.go: 覆盖备用源成功和全源失败场景
改动列表: - 节点池: 支持按参考延迟排序,未知延迟节点保持排在最后 - 平台管理: 平台卡片展示出口 IP 数和活跃租约数,免密端口平台标记为内置平台 - 后端接口: 平台响应补充 egress_ip_count、active_lease_count、is_builtin 字段 - 迁移兼容: 补齐 cache.db 000004 no-op 迁移,兼容本地 version 4 缓存库 - 测试: 覆盖延迟排序、平台统计字段、免密平台内置标记和 cache 迁移兼容
改动列表: - webui/src/features/subscriptions/SubscriptionPage.tsx: 根据剩余流量比例和到期时间显示不同状态颜色
改动列表: - internal/api/handler_lease.go: 支持租约列表按参考延迟排序 - internal/api/contract_test.go: 补充租约延迟排序合同测试 - webui/src/features/platforms/PlatformLeasesPanel.tsx: 将绑定节点选择改为表格并展示已绑定租约名称 - webui/src/styles/theme.css: 补充绑定弹窗表格、选择按钮和暗色主题样式 - webui/src/i18n/translations.ts: 补充租约绑定交互文案翻译
改动列表: - 节点详情接口: 返回 outbound JSON 和可复制的 http/https/socks5 代理地址 - 节点详情前端: 展示 outbound JSON、代理地址并支持一键复制 - 测试覆盖: 增加详情字段、代理地址生成和列表不携带大 JSON 的校验
# Conflicts: # webui/src/features/platforms/PlatformDetailPage.tsx # webui/src/features/platforms/api.ts # webui/src/features/platforms/types.ts # webui/src/i18n/translations.ts
改动列表: - 平台筛选: 新增 regex_exclude_filters 的模型、运行时匹配、API 与前端配置 - 持久化迁移: 新增 regex_exclude_filters_json 字段并修复历史迁移版本兼容 - 测试覆盖: 补充正则排除、预览过滤和迁移修复场景 - 文档说明: 更新 DESIGN 与 README 的筛选规则说明
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.