实施进度(持续更新,供会话恢复/接管)¶
本文件是磁盘上的唯一进度真相。会话中断后按此接续;每完成一个里程碑小节更新本文。 需求与设计全貌见
velasim-architecture.md(已完整定稿)。
2026-09-13 桌面 SMB 挂载生命周期闭环(完成 ✅)¶
把「平台事件 → 三层账号/盘符」接成闭环(V49 迁移新建 desktop_host_op 待办表、desktop_host_account 加 sync_state/sync_error/sync_time):
- 事件驱动:绑定/订单开通 → 自动建 Samba+Windows 账号+挂载(首连前就绪);解绑/释放/删除 → 断会话→卸盘→删账号→撤共享;改密 → 三层联动(Linux/Samba → Windows → 重挂)。全后端首个 Spring 事件设施:
UserPasswordChangedEvent(framework 承载,system 发布、desktop 监听,符合模块依赖规则) - 落库待办+定时重试:
DesktopHostSyncService(入队侧只写 DB,生命周期线程零 HTTP)+DesktopHostOpDispatcher(CAS 抢占、组内 seq 有序门、指数退避、超限 FAILED+站内信告警)+DesktopHostOpSweeperTask(仿 JobPollingTask,DistLock 兜底,终态行保留 30 天清理);主机离线不阻塞任何生命周期 API - host-agent 双实现补端点:
/account/delete(内置账号 deny-list+幂等探测)、/disk/unmount(先探测再删,幂等);disk/mount挂前先卸载(Windows 同服务器禁双凭据);密码正则放宽为三处逐字一致超集(8-64 位,cmd 元字符外可打印字符);盘符响应带 sessionNote(会话 0 可见性提示) - 平台侧通道:抽取
HostAgentClient(补 connect/read 超时,75s>agent 60s 内部超时)+RestHostAgentClient;DesktopHostOpsController瘦身为薄转发;新增DesktopSyncAdminController(待办列表/手动重试/终止,VO 白名单永不含 secret_enc) - Samba 通道:新
deploy/scripts/cluster/samba_account.sh(create|password|delete,密码只经 stdin:chpasswd/smbpasswd -s,绝不 argv)+LocalSambaOpsExecutor(sudo -n 固定 argv/防穿越/杀进程树/限长收集)+SshSambaOpsExecutor(指纹钉死+私钥认证 fail closed);deploy.sh 装脚本+写 sudoers.d+vela-env 变量 - 凭据安全:待办表 secret_enc=AES-GCM 密文、终态清空;last_error 全量 scrub 明文;改密事件 toString 不含密码;台账 credentenc 先行更新(连接侧立即可用新凭据)
- 有意收紧(连带决策):平台账号
^[a-z][a-z0-9_]{2,31}$(三层交集,创建/注册即校验,存量不合规标 SKIPPED);平台密码 8-64 位 cmd 安全字符集(与 agent 逐字一致)且四类字符至少三类(Windows 默认复杂度——平台为超集,默认策略主机必可接受,用户拍板收紧);手工 /agent/* 路径不加策略(验收脚本钉死行为) - 管理可见性:前端新增「桌面同步待办」页(筛选/重试/终止);账号绑定弹窗加同步状态列;手工开通/改密对话框标注「排障」
- 验证:SyncAccountPolicyTest/DesktopHostOpOrderingTest/LocalSambaOpsExecutorTest(模块单测)+ DesktopMountLifecycleTest(10 用例集成:绑定时零 agent 调用、派发顺序、释放逆序、改密三层+AFTER_COMMIT 回滚证明、退避重试+scrub、超限告警、不合规 SKIPPED、删主机按快照清理、不可达不阻塞)+ verify-desktop-mount-sync.mjs(wire 契约/字符集边界/待办可见/改密入队)+ ci.sh 套件 ×7
- 顺带修复(既有破坏):①V29 种子迁移此前为迁就 MariaDB 改成 MySQL 方言(DATE_SUB/DATE_ADD),H2 测试全挂(本批首跑暴露)——改为双方言可移植写法(
NOW() ± INTERVAL 'N' UNIT/ 动态间隔用TIMESTAMPADD(HOUR, -(24-x), NOW()));②入队 now() 与派发 now() 的微秒级竞态(next_retry_time 判定)→ 入队行 next_retry_time=NULL 表意"立即可调度",失败退避才写时间;③C# host-agent 零警告门禁 CS8602(account! 解引用);④verify-agent-native/verify-desktop-mount-sync 的 ROOT 路径多退一层('..'×2→'..'×1)导致 spawn ENOENT,一并修正;⑤install-host-agent-cs.bat 为 LF+UTF-8 中文注释——真机中文 cmd 按 GBK 解析吃字节导致语法崩坏(首发真机暴露)→ 重写为纯 ASCII + CRLF;其余 dev 侧 bat 统一转 CRLF - agent 文件日志(现场排障增强):C# host-agent 新增零依赖滚动文件日志(
{exe}/logs/vela-host-agent-yyyyMMdd.log,按天滚动、7 天保留、线程安全)+ 请求级日志中间件(方法/路径/状态码/耗时/来源 IP,不记 token 与请求体);与服务模式事件日志并存;冒烟验证通过并已随包重传远程 - 远程同步:本批产物已同步至 123.249.44.238:20212 的
/opt/vela-stage/delivery/sync-20260913/(151 项 SHA256 全量校验通过);注意远端/opt/velasim为在运平台(systemd velasim active),升级时走 deploy.sh 升级回滚流程
2026-09-07 桌面模块安全硬化 + 业务闭环(完成 ✅)¶
按"客户能用 + 最安全"标准全量盘点后交付(V34 迁移 desktop_host 加 host_key_fingerprint/host_key_status/pooled,新建 desktop_host_account):
安全类:
- SSH 主机密钥 TOFU(known_hosts 台账):替换 AcceptAll。KEX 阶段校验服务端指纹(SHA256: 格式落库):首次连接记录指纹并拒绝(fail closed),管理员在主机台账「锁定密钥」(host-key/confirm API);锁定后不匹配直接拒绝+告警(防中间人/重装);重置(host-key/reset)重走流程;主机 IP 变更自动作废密钥。实现要点:MINA SSHD 2.14 无公开 createSession,连接上下文 connect(user,host,port,context,null) 携带 hostId,SshClient 全局校验器从 getConnectionContext() 读取,无上下文一律拒绝
- 连接令牌改 HMAC 签名(Guacamole 官方同款):Base64Url(hostId:userId:sessionId:expiry).Base64Url(HMAC-SHA256),验签常量时间比较 + 60s TTL;废除 Caffeine 缓存(多实例可用、重启不失效);窗口内重放仅能"回到原会话"(语义无害);密钥 vela.security.connect-token-secret 生产缺失拒绝启动
- 密钥生产强制(fail fast):框架新增 SecretKeys 守卫——vela.security.aes-key(AES 凭据)生产缺失拒绝启动(原硬编码默认=可逆);vela.jwt.secret 默认值从 application.yml 移除(仅 dev 档位提供),JwtService 启动即校验;违反即"凭据/令牌可伪造"级风险
- 操作审计补全:桌面主机增删改/连接/断开/密钥锁定重置/账号绑定/资源池/VNC 端口池全部 @OperLog(module:桌面主机/云桌面/租户资源绑定)
业务类:
- 每用户×主机账号映射(desktop_host_account,hostId+userId 唯一):共享主机为不同用户解析独立 OS 账号(RDS 多会话正确形态),连接时按用户解析、回退主机默认;管理 API/UI(凭据 AES 加密、列表不外泄、删主机级联清理)
- 租户管理员资源绑定:desktop_host.pooled 资源池态(入池清归属、普通用户不可见不可连,与全局共享区分);平台管理员入池/出池(pool API,专属不可入池);新增 TenantDesktopController /api/v1/tenant/desktop(tenant:admin):pool-hosts/bound-hosts/bind/unbind(活跃会话保护)+ 本租户 VNC 端口池自助管理;前端租户管理台「资源绑定」页(菜单/路由)
- VNC 端口池闭环:平台管理员可为任意租户建池(修复原来 tenantId 被 principal 覆盖的断链)、租户管理员本租户建池;范围校验(1024-65535、≤1000 端口、同租户不重叠);全量管理视角(admin/vnc-ports)+ 删除;分配取本租户池内空闲端口(跳过已占用)
验证:SshHostKeyTofuTest(JUnit 集成测试,MINA SSHD 内存服务器真实 KEX:首连拒录→锁定放行→换钥拒→重置重走,1/1)+ verify-desktop-hardening.mjs 47/47(令牌格式/篡改/垃圾/过期 61s 实测/重放语义、TOFU 台账 API、账号绑定、资源池全流程、VNC 闭环、审计落库)+ 回归 verify-desktop-lifecycle 30/30 + verify-host-binding 30/30 + 框架测试 10/10 + 前后端构建 ✅
已知延后(用户拍板暂不做):guacd 真实联调(RDP/VNC 真机流化,需现场 docker/WSL + 目标机);多实例 HA(Redis)部署形态声明。
2026-09-06 桌面会话生命周期修复 + 命令行终端(完成 ✅)¶
走查云桌面全链路发现的 P0/P1 漏洞全修 + xterm.js 终端:
P0 会话生命周期(B1-B5):
- 新增 LiveTunnelRegistry(sessionId→连接句柄):同一会话新连接顶掉旧连接(「回到窗口」杀旧窗口,单会话单连接);kill=直达连接层
- 令牌携带 sessionId(ConnectTicket);隧道/终端网关注册句柄,连接关闭回调 tunnelClosed(无其他活连接才置 0+disconnectTime)——关窗口自动释放额度/独占锁(B1);disconnect = 杀活连接 + 落库(B2)
- 连接前置校验:主机 status!=1 拒绝(5002 主机当前不可用)(B4);connect-token/launch 事务内 FOR UPDATE 锁主机行串行化独占首连竞态(B5)
- connectIp 落库(X-Forwarded-For 首段回退直连地址)(B8)
P1:
- 手动订单开通联动(B6):cloud_order 加 desktop_host_id(V33);PUT /api/v1/cloud/orders/{id}/open 关联主机→已开通;release 联动主机置维护;CloudManage 开通弹窗;新增 GET /api/v1/desktop/admin/hosts(desktop:manage 全量台账,补平台管理员看不见租户主机的盲区)
- 删除防护(B7):有云应用/有活跃会话拒绝删除;maintainHost 供订单释放联动
- 文案:连接令牌 60 秒(原"5 分钟"错误)
命令行终端(xterm.js + WebSocket + 自建 SSH 网关,体验优先路线):
- V32 迁移:sys_tenant.terminal_limit_per_user(默认 4);TenantQuotaProvider 增 getTerminalLimitPerUser
- vela-module-desktop 引 spring-boot-starter-websocket + Apache MINA SSHD 2.14(SshClientFactory 共享客户端、SshTerminal 桥:shell 通道+PTY+UTF-8 有状态解码+sendWindowChange 调窗)
- WS /api/v1/desktop/terminal?token=(SecurityConfig 放行,令牌一次性校验同隧道;会话/可见性/占用/配额全部复用,sessionType='terminal')
- 前端:@xterm/xterm 5.5 + addon-fit;DesktopClientView 按 protocol 分流(ssh→xterm 终端,rdp/vnc→隧道占位);登记表单协议加 SSH(端口自动 22);卡片"打开终端";会话中心"命令行"标签;配额页终端卡;租户管理表单终端并发项;vite proxy ws:true
- 验证:verify-desktop-lifecycle.mjs 30/30(含 WS 关闭→会话自动置 0→额度释放全闭环、令牌重放 1008、订单开通/释放联动)+ verify-host-binding.mjs 回归 30/30 + 前后端构建 ✅
2026-09-06 桌面主机归属三态与占用兜底(完成 ✅)¶
主机可见性从"可见性规则"收敛为归属三选一,并补齐独占/共享并发语义: - V31 迁移:desktop_host 新增 session_mode(exclusive/shared,默认 shared);回填 user_id 非空主机为 exclusive - 归属三选一(DesktopService.validateBinding):专属(userId)/ 租户共享(tenantId)/ 全局共享(两者皆空),同填报错 400;专属默认 exclusive,其余默认 shared - 可见性统一(pageHosts / visibleHostIds / requireHostVisible 三处一致):本租户 OR 专属本人 OR 两者皆空(全局共享)——修复了原"tenant_id IS NULL 全局可见"子句把专属主机漏给所有人的缺陷 - 连接令牌/launch 校验:issueConnectToken/launchApp 先可见性校验(5006 无权连接该主机),再占用校验——exclusive 主机他人活跃会话被拒(5005 主机已被他人占用);本人活跃会话走重连;shared 主机并发放行(每用户配额仍生效) - 前端:HostBindingForm.vue(归属三选一 + 会话形态,云桌面/云应用登记共用,候选用户/租户来自管理接口);主机卡片显示归属/独占标签;连接错误统一 toast;登记表单打开时重置 - 验证:deploy/scripts/verify-host-binding.mjs 独立 8081 实例 30 项断言全过(跨租户/他人专属 5006、独占占用 5005、重连不重复建档、共享并发、云应用 launch 同套规则)
2026-09-06 租户化与配额体系重构(完成 ✅)¶
产品决策落地(详见会话结论): - 命名:单位 → 租户,全栈重命名(后端类/包/路由/API、DB 表与列、迁移 V10/V15 改名、前端视图/路由/文案、文档;源码备份 velasim/.backup-20260906/) - i18n 移除:产品仅中文,vue-i18n 卸载、locales 删除、文案硬编码 - 配额体系:业务层统一按"并发会话"计数,主机形态(专属/共享)由运维配置 Windows Server 决定,业务层不建模 - V28 迁移:sys_tenant 新增 desktop_limit_per_user(默认1)/ app_limit_per_user(默认2) - TenantQuotaProvider SPI 扩展 getDesktopLimitPerUser/getAppLimitPerUser - 连接/launch 时同一主机/应用已有活跃会话视为重连(不重复建档/计额度);新会话超配额拒绝(5004) - 新接口:GET /api/v1/desktop/quota-mine、POST /api/v1/desktop/sessions/{id}/disconnect、GET /api/v1/desktop/sessions-tenant-overview、GET /api/v1/tenant/mine、GET /api/v1/billing/core-time/tenant-overview - 集群监控收敛:工作台菜单与路由移除(MonitorView 删除),仅平台管理后台可见 - 新页面:工作台「配额用量」「会话中心」;租户管理台「资源配额」(配额看板+成员用量);管理后台租户表单加配额模板(核时包/桌面并发/应用并发/欠费) - 验证:后端 mvn package ✅、前端 npm run build ✅、独立 8081 启动冒烟(见会话)✅
🎉 全部阶段完成:P0 ✅ P1 ✅ P2 ✅ P3 ✅ P4 ✅ P5 ✅ P6 ✅ P7 ✅¶
P7 运维与交付(完成 ✅)¶
- vela-host-agent(Windows 桌面机代理):配置拉取/更新(ConfigHolder 共享)、心跳/上报 API、软件黑白名单监控任务(tasklist/taskkill,每 2 秒),打包通过 ✅
- 业务大盘 API:/api/v1/monitor/dashboard(今日作业状态分布/核时/费用,聚合数据源)
- 数据生命周期任务:监控快照 90 天清理(每日 3:30)、网盘孤儿上传 24h 清理(每日 3:45)
- 部署交付物(deploy/):一键部署脚本 deploy.sh(CentOS 7/8/9 + Ubuntu 20.04/22.04/24.04:依赖安装→建库→systemd→Nginx→acme.sh 证书自动化+每日续期→备份 cron→logrotate)、Dockerfile、docker-compose.yml
- 文档:deploy-manual.md(部署手册:形态/要求/一键部署/Docker/升级回滚/验证清单 8 项)、ops-manual.md(运维手册:命令/故障排查 8 类"现象→原因→处置"/生命周期表/升级检查单)、user-manual.md(用户手册三册合一:普通用户/租户管理员/平台管理员/FAQ)
- 最终验收 ✅:后端全量测试 BUILD SUCCESS + vela-agent/vela-host-agent 打包 + 前端 build(vue-tsc)+ 启动冒烟(7 migrations、health UP、api-docs/models/products/news 全 200)
交付物总览¶
| 类 | 位置 |
|---|---|
| 架构方案 | docs/velasim-architecture.md |
| 部署/运维/用户手册 | docs/deploy-manual.md / ops-manual.md / user-manual.md |
| 二次开发指南 | docs/developer-guide.md + 根 README(环境版本清单) |
| 后端单体 | velasim-server/(17 Maven 模块 → 单 jar vela-boot/target/velasim.jar) |
| 集群代理 | velasim-agent/(无库、白名单、心跳) |
| Windows 代理 | velasim-host-agent/(黑白名单/计时/配置) |
| 前端 | velasim-web/(Vue3+TS+EP,主题/响应式;仅中文) |
| 部署套件 | deploy/(deploy.sh + Dockerfile + docker-compose.yml) |
前端补全与视觉升级(用户验收反馈后修复 ✅)¶
本轮修复内容: - V8 演示种子数据 ✅:机理模型 8 条(参考 tb_mechanism 语义)、视频 4、资讯 3、专家 2、应用 5、活动 3、商品 4、门户区块 7、演示集群 2(local 通道)+ 集群-求解器关联——门户/模型库/资讯/活动/商品立即有内容(冒烟验证 models/news/activities 返回真实数据) - 门户素材接入 ✅:原项目 logo/home_banner/desktop_banner/app_banner 复制至 public/brand/,登录页与首页品牌化使用 - 缺失页面全部补齐 ✅:资讯列表/详情、应用市场(评论/收藏)、视频课堂(评论/转码状态)、活动报名(表单+名额/重复拦截)、试用/代理申请、门户首页动态区块(portal_block_config 驱动:资讯/活动/推荐模型) - 菜单全部可点 ✅:PortalLayout 导航 6 项、AdminLayout 11 项全部对应真实路由(新增求解器管理页)、WorkspaceLayout 云应用指向应用市场、租户管理台基础页(成员/作业概览) - 视觉产品化升级 ✅:全局品牌渐变/卡片悬浮/玻璃拟态/表格头部底色/侧栏 Logo+渐变激活态/登录页 banner 品牌化(深色玻璃卡片)
剩余差距补全(第二批 ✅): 1. ✅ 报表中心:作业统计报表 API(日聚合区间查询)+ 作业明细 CSV 导出(UTF-8 BOM)+ 前端报表页(ReportView 双 tab:报表/基础设施监控)。实现归属 job 域(聚合数据源所在,report 模块目录为文档占位) 2. ✅ 监控中心基础设施指标:/api/v1/monitor/infra(JVM/内存/处理器/磁盘/运行时长)+ 前端 KPI 卡展示(actuator metrics 为完整指标源) 3. ✅ CSV 导出:作业明细 + 报名名单(Excel 直接打开) 4. ✅ FFmpeg 转码执行器:轮询任务→转码 720p(faststart)→进度/产物回写;并发可配、2 小时超时、失败原因回写、FFmpeg 未安装保持排队不误报 5. ✅ E2E + 压测脚本交付:Playwright 4 场景(门户/模型库/登录/作业/网盘)+ JMeter 500 线程压测计划(列表 P95<300ms 等指标场景) 6. ⏳ i18n 新页面文案补全(门户新增页暂中文为主,键已在 locale 骨架) 7. ⏳ 真实环境联调(SGE/Slurm/guacd/FFmpeg/云凭证/SMTP)——需现场环境
产品化打磨轮(5 分 → 向 9-10 分推进,持续迭代)¶
本轮完成 ✅(前端 build 全部通过): - v-permission 按钮级权限指令(directives/permission.ts + main.ts 注册,与后端 @RequiresPerm 双端校验;管理页按权限隐藏按钮) - 站内信未读角标(WorkspaceLayout 消息菜单 30s 轮询 + el-badge) - 作业详情抽屉(JobList 作业名可点 → 垂直状态时间线 + 参数/核时/费用/失败原因详情,DetailPage 规格) - 计费消费趋势图(BillingView ECharts 柱状,颜色绑定设计 token) - 网盘回收站前端(打开/恢复/彻底删除,与后端 .vela_trash 机制闭环) - i18n 补全:门户导航 6 项 + 首页区块标题/按钮全部双语 - 门户残留注释清理
视觉走查修复轮 ✅(2026-09-04,浏览器 CDP 真实点击实测):
- 主题按钮无法点击修复 ✅:定位根因——EP 2.10 新版 el-dropdown 触发器为组件引用(el-tooltip)时,Fragment 根导致 forward-ref 拿不到真实按钮、click 监听挂到注释节点上,点击永远打不开面板。修复:HeaderActions 主题下拉触发器改为原生 el-button(title/aria-label 提示);实测工作台/管理后台浅深色切换、6 套主题色、面板外点击关闭全部正常(消息铃铛/用户菜单同步回归通过)
- 工作台左上角品牌区美化 ✅:白色透明 logo 在浅色侧栏上不可见是"丑"的根因;改为渐变 Logo 磁贴(品牌渐变底+悬浮微动效)+ 主标题/副标题双行 + 底部渐变装饰线,折叠态居中仅显磁贴;工作台/管理后台/租户管理台三处统一(全局 index.css 提供,移除 TenantLayout 重复样式)
- 前台页脚备案信息 ✅:后端 /api/v1/admin/params/public 加入 PERMIT_ALL(原遗漏);PortalLayout 页脚读取 footer.icp/footer.police(后台「参数配置-站点与备案」运行时维护,空则不显示),ICP/公安备案号带官网链接新页签打开
- 用户协议/隐私政策新页签打开 ✅:登录页与页脚两处链接 window.open 新页签(router.resolve 生成地址);页脚「关于平台」补隐私政策链接;实测新页签正常打开并加载协议内容
- 登录页美化(去背景图)✅:移除 home_banner.jpg 背景,改为品牌渐变光晕 + 柔光圆斑装饰(token 联动浅/深色);左侧品牌区重做(渐变磁贴 + 中英文标题 + 三条核心能力);卡片改 token 化(无硬编码 rgba)
- 拦截器健壮性修复 ✅:request.ts 401 处理区分匿名/登录态(匿名请求 401 不再整页跳登录,避免公开页被后台静默请求误弹);新增 silent 配置跳过全局错误提示(页脚备案静默拉取用)
- 验证:前端 build(vue-tsc)✅;后端 vela-framework 编译 ✅;CDP 实测(登录→工作台、主题面板、协议新页签、匿名门户不跳转)全绿 ✅
本轮完成 ✅(2026-09-04,全部实测验证): - 骨架屏/表单即时校验/防重复提交 ✅:MessageCenter/JobSubmit 骨架屏;JobSubmit 分步校验+防重复提交;LoginView/ApplyView rules 即时校验+loading 防重复 - ECharts 主题统一封装 ✅:MonitorView/BillingView 图表绑定 --vela-color-* token(深/浅联动) - 管理页 v-permission 全面应用 ✅:9 页 36 处按钮标注(user/tenant/role/dict/cluster/agreement/biz/cms/report),vue-tsc 零错误;SolverManage/ParamManage/LogManage 经核对无按钮型写操作按规则跳过 - 消息中心完善 ✅:后端 /v1/me/messages 支持 readFlag/msgType 筛选 + DELETE 批量删除;前端单选/批量已读/批量删除/筛选/骨架屏;管理员首登 3 条演示站内信(AdminInitializer) - 门户 Banner 副标题 i18n ✅:zh/en portal.bannerSubtitle - 登录页配置驱动 ✅:新增 /api/v1/auth/login-config(白名单),验证码按 security.captchaEnabled 渲染;dev 档位 DevProfileSetup 自动关验证码(E2E/演示开箱,生产不受影响) - E2E 实跑 ✅:Playwright 4/4 全绿(门户/模型库/登录→作业/网盘),playwright.config.ts + 稳定定位器(.login-btn、heading) - 压测实跑 ✅:deploy/loadtest.mjs 4 场景×1000 请求×100 并发,P95 全部达标(作业 204ms/网盘 42ms/计费 112ms/模型库 180ms),错误率 0%;Hikari 连接池 10→50(VELA_DB_POOL_SIZE 可配) - 测试报告 ✅:docs/test-report.md(E2E 明细/压测数据/调优落点/冷热启动对照/待联调边界)
第二轮全面核实与补齐(用户指示"循环核实直到清零" ✅ 2026-09-04)¶
核实发现并补齐(全部实测): 1. ✅ 注册功能前端:RegisterView(校验/防重/后端字段对齐)+ 登录页注册入口(registerEnabled 配置驱动)+ /register 路由 2. ✅ 视频流式播放:GET /v1/videos/{id}/play(HTTP Range/206/Content-Range,ResourceRegion,PathGuard)+ 前端 HTML5 video 播放器(token 查询参数认证) 3. ✅ 网盘打包下载:POST /v1/netdisk/zip(递归 zip 流式)+ 前端多选打包下载按钮(Blob 下载) 4. ✅ 云订单管理前端:CloudManage(订单/实例/到期提醒 tag);下单权限修正:登录用户即可下单(原 cloud:manage 错误设计),provider=none 手动模式落「待开通」订单;新增 GET /v1/cloud/my-orders 5. ✅ 菜单管理前端:MenuManage(树形/增删改/防成环)+ 布局路由接入 6. ✅ 作业模板前端:JobList「我的模板」tab(套用/删除)+ JobSubmit 存为模板 + 模板套用预填(路由 query 传递) 7. ✅ 应用/模型批量导入后端:POI 5.3.0 + 4 端点(import/import-template ×2,行级校验不中断、模板生成冒烟验证)+ ImportResult 共享 DTO + 模型标签拆分写入 8. ✅ admin 应用/模型/活动管理三页:AppManage/ModelManage/EnlistManage(CRUD/上下架/批量导入对接/报名导出)+ 布局路由接入 9. ✅ 后端补齐 admin 应用/模型 CRUD:AdminAppController/AdminModelController(全状态分页/新增/编辑/上下架/删除) 10. ✅ 专家管理:后端 PUT/DELETE 补全 + CmsAdminView 专家 tab 11. ✅ 活动管理列表:GET /v1/enlist/admin/activities(全状态含下架) 12. ✅ 协议展示页:AgreementView(/agreement/:type)+ 登录页协议链接接线 13. ✅ 视频上传前端入口:CmsAdminView 转码 tab 上传 dialog(multipart→转码任务) 14. ✅ 作业批量删除:DELETE /v1/jobs/batch(逐条校验归属/终态,跳过运行中)+ JobList 批量删除/导出接线 15. ✅ 视频接口隐藏 bug:V9 迁移修复 video_info 列名(transcode720_path),列表/详情/封面全通
验证:后端 mvn install 全量测试 BUILD SUCCESS(含 AuthFlowIntegrationTest 全绿)✅;前端 build ✅;新端点冒烟全 200 ✅;E2E 4/4 ✅
第三、四、五、六轮核实与补齐(2026-09-04,循环审计执行中 ✅)¶
第三轮(帮助/桌面历史/视频分类): - ✅ 帮助中心:后端 GET /v1/cms/my-helps(本人工单)+ 门户 HelpView(提交工单/我的工单进度)+ PortalLayout 导航;冒烟验证提交→查询闭环 - ✅ 桌面连接历史:DesktopView「连接历史」卡片(会话类型/连接断开时间/来源 IP/状态) - ✅ 视频分类管理:AdminVideoTypeController CRUD + 公开 GET /v1/video-types(白名单)+ CmsAdminView 分类管理面板 + 上传 dialog 分类下拉 + VideosView 门户分类筛选
第四轮(应用订购/云订单操作): - ✅ 应用订购前端:AppsView 详情「订购」(登录校验→时长选择→POST /v1/cloud/orders,手动模式落待开通);冒烟验证订单落库 - ✅ CloudManage 操作:订单「释放」(联动云主机)/「删除记录」按钮 + v-permission
第五、六轮(订购进度/桌面客户端): - ✅ 我的云订单:DesktopView「我的云订单」卡片(订单号/类型/状态流转/到期/失败原因) - ✅ 桌面客户端页:/desktop-client 独立无布局路由(一次性令牌展示+隧道接入点),修复连接按钮打开 404 - ✅ DesktopView 登记/删除按钮 v-permission="desktop:manage"(与后端对齐)
验证:后端 mvn install ✅ · 前端 build ✅ · 冒烟(video-types 公开 200、my-helps 闭环、云订单落库/释放 200)✅ · E2E 4/4 ✅
第七轮核实与补齐(2026-09-04 ✅)¶
- ✅ 审计日志 CSV 导出:GET /v1/admin/logs/login/export + /operate/export(UTF-8 BOM、10 万条上限、CSV 转义)+ LogManage 导出按钮(按 tab 权限标注)
- ✅ VNC 端口池前端:DesktopView 端口池卡片 + 登记 dialog(desktop:manage),与后端 vnc-ports CRUD 闭环
- ✅ 注册→审核→登录全链路验证(实测):dev 档位 DevProfileSetup 自动开 register.enabled(生产由参数控制)→ 注册 audit_user → 待审核列表 status=0 → 审核前登录被拒(1101) → 管理员启用 → 登录成功。E2E 级链路完整 ✅
- ✅ 作业列表查询优化:分页 select 排除 params 大字段(详情接口单独返回)
- ✅ H2 控制台文档:developer-guide 5.5 节(地址/JDBC URL/内存库语义)
- ✅ 压测回归:4 场景 0 错误;作业列表 P95 在开发机负载下波动(同 jar 204ms→1353ms),test-report 已注明冷热/环境噪声,生产以 MySQL 实测为准
第八轮核实与补齐(2026-09-04 ✅)¶
- ✅ 模型安装包下载:GET /v1/models/{id}/package(requireLogin 强制登录、PathGuard 防穿越、无包 404、UTF-8 文件名)+ ModelLibrary 卡片「下载」按钮(未登录引导登录)
- ✅ 月度对账:GET /v1/billing/monthly-summary(消费流水按月聚合金额/核时/笔数,近 12 月;SUBSTRING(datetime,1,7) 兼容 H2/MySQL——DATE_FORMAT 在 H2 不可用已修复实测)+ ReportView 报表 tab 月度对账表
- ✅ 邮件通知桥接:InAppNotifierImpl 站内信后自动尝试邮件(用户有邮箱才发、SMTP 未配置优雅降级、HTML 排版+防回复脚注);短信通道按同模式经 SmsSender SPI 扩展(验证码已接线)
- ✅ 发现并确认平台约定:业务异常统一 HTTP 200 + code(匿名下载返回 code=401 体,无内容泄漏),与全站 API 风格一致
验证:后端/前端双构建 ✅ · 冒烟(月度对账 200、模型包 404/401 语义正确、站内信链路)✅ · E2E 4/4 ✅
下一轮核实候选(继续循环)¶
- 视频点播的 Range 实测(需真实 mp4 文件)
- 注册→审核→启用的完整链路 E2E 场景
- H2 控制台入口文档
- 桌面隧道实机(guacd,真实环境)
- 导入模板全量列校验复测(已有冒烟)
- 压测报告更新(新端点回归)
第三轮核实清单(进行中)¶
- 应用订购前端入口(AppsView 商品下单→云订单,后端已就绪)
- CloudManage 管理员开通/释放操作按钮(operate/release 端点已存在)
- 帮助中心/客服工单提交前端(cms_help/skill 后端有)
- 桌面连接历史前端展示(desktop_session 后端有)
- 视频分类管理(video_type 后端无管理端点→补)
- 租户管理台完整度复核(成员管理/配额)
缺口修复轮(用户追问"除了这些还有没有"后 ✅ 2026-09-04)¶
本轮补齐的 4 项真实缺口: 1. ✅ 监控中心 MySQL/缓存指标:框架新增 CacheMetricsRegistry(TokenBlacklist/sys-param 注册,recordStats);/api/v1/monitor/infra 增加 HikariCP 连接池(活跃/空闲/等待/池上限)+ Caffeine 缓存条目/命中率;前端 ReportView 基础设施 tab 新增 MySQL 连接池、缓存两张 KPI 卡。实测:poolSize=50、sys-param 16 条目 80% 命中 2. ✅ 视频缩略图:转码成功后 FFmpeg 截帧(第 1 秒、360p、q3)→ video/thumb/{id}/cover.jpg 回写 cover_path;新增公开接口 GET /v1/videos/{id}/cover(PathGuard 防穿越、1h 缓存、无封面 404);前端视频卡片封面展示(失败回落渐变占位) 3. ✅ 用户批量删除 + CSV 导出:DELETE /v1/admin/users/batch(自动排除本人)+ GET /v1/admin/users/export(UTF-8 BOM、CSV 转义);前端占位按钮接线完成 4. ✅ 修复隐藏 bug(cover 端点暴露):video_info 列名 transcode_720_path/transcode_1080_path 与实体映射不一致 → 视频列表接口 500;V9 迁移 RENAME COLUMN 修复(H2/MySQL 8 兼容),视频列表/详情/封面全部 200/404 验证通过 5. ✅ JWT 认证第二通道:浏览器原生下载(/window.open 无法带 header)场景支持 token 查询参数——网盘下载/CSV 导出此前是断的,已修复
i18n 决策变更(用户指示):去掉多语言,界面仅中文。移除 3 个布局的语言切换按钮、app store 的 locale 状态、App.vue lang 绑定锁定 zh-CN、删除 en-US.ts、locale 锁定 zh。前端 build 通过。 图片压缩:经评估网盘为通用文件不做压缩(保真);视频封面/缩略图由 FFmpeg 360p 截帧天然减小体积;资讯/模型/应用封面图由内容编辑控制尺寸。如后续需要可在上传端点加 ImageIO 缩放(已留扩展点)。
收尾验证轮(2026-09-04 ✅)¶
- ✅ 全量测试复跑(第八轮改动后):mvn install 全测试 BUILD SUCCESS(单测+AuthFlowIntegrationTest 集成全绿)
- ✅ 部署脚本冒烟:deploy.sh 语法校验通过;docker-compose/E2E/JMeter/压测脚本交付物齐备
- ✅ 双服务恢复运行:后端 8080 + 前端 5199 健康检查 200
- ✅ E2E 终回归 4/4
项目状态:代码层面全部完成,仅剩真实环境联调项。
第九轮(终局地毯式核查,2026-09-04 ✅)¶
本轮发现并修复 3 项深藏缺口(全部实测闭环): 1. ✅ 租户 CPU 配额从未执行:新增 framework TenantQuotaProvider SPI + system 域实现;JobService.submit 校验本租户运行/排队核数 + 本次核数 vs 上限(0=不限)。实测:上限 1 核提交 16 核被拒 → 恢复后成功 2. ✅ 作业日志查看端点缺失:GET /v1/jobs/{jobId}/log(经执行通道读授权工作区 job.log/job.out,64KB tail,归属校验)+ JobList 详情抽屉日志区(刷新/loading)。实测 200 3. ✅ 普通用户提交作业 403 bug:JobSubmit 集群列表用 admin/clusters(system:cluster:list)→ 改用登录可用的 /v1/monitor/clusters。普通用户注册→充值→提交作业全链路实测通过 4. ✅ 2FA OTP 邮件实发接线已确认存在(AuthService→MailService,可配置优雅降级)
终局结论:除真实环境联调 6 项外,代码层面缺口已全部清零(9 轮循环审计,每轮构建+冒烟+E2E 三重验证)。
第十轮:导航与入口修复(2026-09-04 ✅)¶
用户验收反馈 4 项,前 3 项已修复实测:
- ✅ 工作台/管理后台菜单不能切换:WorkspaceLayout 与 AdminLayout 的
el-menu缺router属性(点击只选中不跳转),default-active写死导致高亮错误。已改<el-menu router :default-active="route.path">。Playwright 实测:工作台点「云数据/计费中心」跳转成功,管理后台点「模型管理/内容管理」跳转成功 - ✅ 工作台无法回门户:工作台/管理后台头部新增「门户首页」按钮、Logo 点击回门户;反向补门户登录后「进入工作台」按钮。实测双向往返成功
- ✅ 管理后台/租户管理台无入口:此前
/admin、/tenant只能手输 URL。工作台用户下拉按角色新增「管理后台」(platform:admin)/「租户管理台」(tenant:admin)入口 - ✅ 旧项目功能核对(五套全部审计完毕):两个审计代理扫描 sim-aliyun/sim-simcloud/sim-huawei/sim-langchao/sim-neimeng 全部模块的 controller/页面/README,产出功能清单后逐项到新代码验证(grep 接口/表/定时任务/前端路由)。结论:确认遗漏 33 项(A 类整块缺失 19 + B 类部分覆盖 8 + C 类小缺口 6;代理商扩展按用户指示不做),详见下方「旧项目核对遗漏清单」小节
验证:前端 build ✅ · E2E 4/4 ✅ · 菜单切换/门户往返新增场景实测 ✅ · dev 服务恢复 5199 ✅
第十一轮:UX 评审 4 项(2026-09-04 ✅)¶
用户评审 4 项,全部实施并三重验证:
- ✅ 表格规范:全局
.el-table .cell { white-space: nowrap }(EP 默认 overflow/ellipsis,超长自动省略号,块级子元素不受影响);列宽拖拽为 EP 原生(resizable 默认 true);补齐 13 处未固定操作列 fixed="right"(JobList/BizAdmin/CmsAdmin×5/EnlistManage×3/LogManage×2/SolverManage) - ✅ 平台管理账号区分(用户决策:类型标记字段):V17 迁移 sys_user.account_type(platform_admin/tenant_admin/user,存量按角色回填);角色变更自动同步(UserService.syncAccountType,角色为唯一事实源);AdminInitializer 管理员置 platform_admin;用户列表类型筛选+徽标列+CSV 导出列
- ✅ 管理后台菜单分 4 组(用户决策):系统与权限/计算资源/运营与内容/平台设置与审计,el-sub-menu + 当前路由分组自动展开
- ✅ 打开流程 4 项修复(用户全选):AdminLayout 补用户下拉(个人中心/租户管理台/登出)+工作台直达按钮;登录按角色默认落点(platform:admin→/admin,其余→/workspace,redirect 优先);无权限访问管理区跳工作台并提示;/tenant 独立 TenantLayout(租户概览/成员管理/作业概览)+ 后端 /v1/tenant/members(tenant:admin 限定本租户,此前 TenantHome 调 /admin/users 因无权限恒为空已修复)
验证:后端全量测试 BUILD SUCCESS(V17 迁移 17/17 应用)· 前端 build ✅ · 冒烟(accountType 筛选/角色同步闭环 tenant_admin→user/未认证 401)✅ · E2E 7/7(新增管理员默认落点+分组菜单+类型列场景)✅
第十二轮:云应用重构+列表规范+样式打磨(2026-09-04 ✅)¶
用户评审 3 项,全部实施并三重验证:
- ✅ 云应用(RemoteApp)与应用商店分离:判定原"工作台云应用→应用市场"映射不合理(应用商店=软件商品目录属门户运营内容,云应用=服务器承载的远程应用交付,与云桌面同属桌面域)。方案:桌面域融合——云应用与云桌面共享主机池/账号/隧道,用户入口分离。实施:V18 迁移 desktop_app 台账(+desktop_session.app_id、演示主机 2 台+应用 4 个);DesktopAppController(分页随主机数据权限/CRUD desktop:manage/launch 一次性令牌+app 会话);前端 RemoteAppView(卡片网格/启动开新窗口/上架管理)+ 工作台菜单"云应用"改指 /workspace/apps;DesktopClientView 支持 app 参数标题
- ✅ 管理后台列表默认无横向滚动:压缩 7 个超宽表格列宽(用户/租户/菜单/操作日志/集群/云订单/活动),总和 ≤1100px;拖宽列后 EP 原生出现横向滚动;E2E 遍历 10 个列表页断言无溢出
- ✅ 样式布局打磨:三区头部改面包屑(区域/页面,路由 meta.title);新增 AdminHome 管理首页(KPI 卡:用户/租户/今日作业/核时费用 + 今日作业状态分布 + 常用管理入口快捷网格,/admin 默认落点);全局统一 toolbar/filter-card/pagination 工具类、分组菜单标题层级、表格行高与分隔线观感
验证:后端全量测试 BUILD SUCCESS(V18 迁移 18/18)· 前端 build ✅ · 冒烟(apps 列表 4 条/launch 32 位 token/会话 type=app+appId/未认证 401)✅ · E2E 9/9(新增:管理首页落点、列表无横向滚动×10 页、云应用启动弹窗)
第十三轮:五项产品改造(2026-09-04 ✅)¶
用户验收反馈 5 项,全部实施并三重验证:
- ✅ 登录页进入即红字修复:根因——
LoginView.vuerules 为 computed,挂载后/v1/auth/login-config把 captchaEnabled 从默认 true 改为服务端 false → rules 对象变化 → Element Plusel-form默认validateOnRuleChange: true全表单校验 → 空账号/密码立刻红字(EP 2.14.5 源码 form.mjs/form.vue 实测确认)。修复:el-form 加:validate-on-rule-change="false",仅点击登录时校验。E2E 新增回归场景「登录页初始无校验红字」实测通过 - ✅ 去掉所有代理商相关:BizAdminView 删「代理商审核」tab(保留租户入驻/试用审核)、ApplyView 删代理模式、BizController 删 3 端点+实体/Mapper、SecurityConfig 删白名单、V20 迁移删 agent_info/agent_income_detail 表 + agent 角色(试用申请/租户入驻保留;计算代理 vela-agent 无关未动)
- ✅ 去行业门户 + 门户区块 + 工作台/管理台门户入口:门户首页保留改静态区块(HomeView 移除 portal-blocks 依赖,资讯/活动/推荐模型固定展示);删 /articles 路由与 ArticlesView、PortalLayout 导航/页脚行业门户项;删工作台/管理台/租户管理台「门户首页」按钮与 Logo 跳门户;CmsAdminView 删门户区块/行业门户/板块文章 3 tab;后端删 PortalBlock/Industry/Plate/Article 实体与端点;V20 迁移删 4 表(cms_expert_comment、cms_help 工单时限列保留)
- ✅ 管理后台所有列表分页 + 总量 + 每页条数(结论:后端分页):后端 15 个端点补 pageNum/pageSize(roles/dicts(+types 下拉端点)/params/agreements/clusters/license/online-users 内存切片/enlist 五端点/cloud instances/cms admin experts/quick-helps);前端新建共享
components/PageBar.vue(total+sizes+prev+pager+next+jumper,page-sizes [10,20,50,100]),12 个管理页全部接入(含 BizAdmin/CmsAdmin/LogManage 在线用户/CloudManage 实例 tab);树形页(菜单/求解器分组)与配置下拉源(参数/三维分类/问卷下拉)保持全量——树分页无意义、配置表同时是表单下拉源 - ✅ 应用/模型管理图片与文件上传:新增
POST /v1/admin/apps/upload(logo 限图片/package 限压缩包,storage.root/app/ 落盘);修复POST /v1/models/upload-file(原相对 CWD 目录 bug → storage.root/model/{logo|introduce|package}/ + 类型校验);新增公开文件访问GET /api/v1/public/files/{domain}/**(system 域,domain 白名单 model/app,PathGuard 防穿越实测 401/404);前端 AppManage/ModelManage 表单改 el-upload(选文件即传回填路径+图片预览),修复模型表单字段名不匹配隐藏 bug(docPath/coverPath 后端无此列被静默丢弃 → 对齐 logoPath/introduceImagePath/packageName/packagePath);utils/file.tsfileUrl helper,ModelLibrary 封面经公开端点展示;上传非图片到 logo 被拒(code=400 文案)实测
验证:后端 mvn install 全量测试 BUILD SUCCESS(V20 迁移 20/20 应用)· 前端 build(vue-tsc 零错误)✅ · 冒烟 8081:登录 200、删除端点 code=404、15 个分页端点 {list,total} 形状全对、上传→公开访问 200 PNG 原字节、穿越 401、坏类型 400 ✅ · E2E 10/10(新增登录页无红字场景;门户往返场景改为直达首页)✅
注:/v3/api-docs 历史 springdoc 版本冲突已修复——knife4j 4.5.0 与 Spring Boot 3.5 不兼容且无新版(getGroupConfigs List/Set 签名 + ControllerAdviceBean 构造器双重冲突,实测 2.3.0~2.8.9 无兼容交集),移除 knife4j,改用官方 Swagger UI(/swagger-ui/index.html,实测 200,206 个路径,新端点全部在册)。
第十四轮:分页不显示与门户按钮修复(2026-09-04 ✅)¶
用户反馈 2 项,均为真实 bug,全部修复并三重验证:
- ✅ 管理列表分页条整条不显示(含"共 X 条"总数与每页条数选择):根因——Element Plus 2.14 重写 el-pagination,新增
assertValidUsage校验:total必须传 Number,否则整条分页静默渲染为空注释节点(源码isAbsent = (v) => typeof v !== "number"→ return null);而本平台 Long→JSON 统一序列化为字符串,total.value = data.total传的是字符串 → 全站 20 个页面的分页条(含用户/租户/作业/消息等既有页)全部不渲染。修复:20 个视图的 total 赋值统一Number(data.total)+ PageBar 兜底:total="Number(total)"。浏览器实测:共 1 条 | 10条/页 | 1 | 前往 | 页中文正常显示,每页条数下拉可选 - ✅ Element Plus 组件文案切中文:
app.use(ElementPlus)未传 locale(此前界面已锁定中文但 EP 组件默认英文,分页显示 "Total 1 / 10/page")。main.ts 改为app.use(ElementPlus, { locale: zhCn })(分页/日期选择器等组件文案全站中文化) - ✅ 工作台/管理后台/租户管理台右上角「门户首页」按钮恢复(用户反馈"回到前台按钮报修"):头部快捷入口补回门户首页按钮(HeaderActions 快捷链接加 aria-label 提升可访问性),点击直达门户首页、门户「进入工作台」往返闭环
- ✅ E2E 新增两场景:「管理列表分页条显示总数与每页条数」(4 个列表页断言 共 X 条/条/页 可见)、门户往返改为点击右上角按钮实测
验证:前端 build(vue-tsc 零错误)✅ · 浏览器实测(分页中文文案/每页条数/门户按钮点击回门户)✅ · E2E 11/11(对 5173+8080 实际运行服务)✅ · 后端 8080 已用最新 jar 重启(health UP)✅
根因排查过程备忘:用户界面是 Vite dev server 热更新后的新前端 + 旧后端混跑时最容易出现"功能没生效"的假象;本次用 Playwright 驱动真实浏览器逐层定位(DOM 空注释节点 → EP 2.14 源码 assertValidUsage → total 字符串)。排查中确认 8080 旧后端已停(连接拒绝导致 E2E 首跑 6 失败),重启最新 jar 后全绿。
第十五轮:用户验收 11 项反馈(2026-09-05 ✅)¶
用户评审 11 项(登录注册/页脚/悬浮条/应用市场/模型库/视频课堂/三区布局),全部实施并三重验证:
- ✅ 登录/注册优化:登录页「记住我」从死控件改为实现(localStorage 记住账号回填,取消勾选清除);协议默认改为未勾选(需显式同意,警告文案 i18n 键 agreementRequired);验证码加载失败显示「点击重试」占位按钮;登录落点按角色细分(platform:admin→/admin,tenant:admin→/tenant,其余→/workspace);注册页加闸门(直连 URL 且 register.enabled=false 时显示「暂未开放注册」而非表单)、协议勾选、成功文案按 requireApproval 区分;协议链接 @click.stop 防止点链接切换勾选态
- ✅ ICP 备案:机制已有(footer.icp/footer.police 参数驱动),无需改码——管理员后台「参数配置」填入即显示(旧项目值参考已移除,2026-09 品牌清理)
- ✅ 页脚联系方式:V22 迁移新增参数 footer.email/phone/hotline;PortalLayout 版权条上方「联系我们」行(任一项非空才显示);AdminParamController /public 返回清单扩展 6 个新键
- ✅ 右侧悬浮条(旧项目 aliyun/neimeng 客服悬浮语义):问题反馈(→帮助中心)/用户手册(footer.manualUrl 参数驱动)/联系客服(hover 微信二维码,footer.qrCode 参数驱动)
- ✅ 应用市场补齐(旧项目商店语义):V23 迁移 app_type 种子 6 类+演示应用归类+app_info.check_count+cloud_order.app_id;后端新增 GET /apps/types、GET /apps/hot(人气榜 TopN 按 check_count)、列表接口 typeId 筛选+sort=hot 排序、详情浏览计数自增、DELETE /apps/{id}/collect+GET collect-status(requireLogin 防匿名);订单关联 appId 修复(原 hostType=app 订单无 appId 关联);前端 AppsView 重做(搜索框+参数化热词+类型筛选含「全部」+最新/人气排序+分页 PageBar+右侧人气榜),新建 AppDetailView 独立路由页(/apps/:id:信息卡+订购传 appId+收藏切换回显+评论);AppManage 分类下拉改 app_type 数据源(原 appTypeName 字段后端忽略的隐藏 bug)
- ✅ 机理模型库「全部」:两行筛选前加显式「全部」chip(点选清空该维度,解决"选完回不去"不可发现性问题)
- ✅ 视频课堂 tab 美化 + 后端核实:收藏/续播后端早已存在(批次 4),本轮重做前端——el-radio-button 改分段式 tab(品牌渐变选中态,VideoPlay/StarFilled/Clock 图标+文字);修复切换清晰度从 0 秒重播缺陷(loadedmetadata 后恢复进度)
- ✅ 前台左下角 logo:页脚白色透明 logo 无底衬托(浅色主题不可见)→ 套 26px 渐变磁贴(.footer-logo-tile),与门户头部/三区侧栏统一
- ✅ 工作台左上角展示不全:根因站点主标题 15px 粗体在 156px 可用宽度临界溢出被硬切;改主标题「仿真工作台」+副标题 appName(与 Admin/Tenant 语义统一);.brand-text/.brand-sub 加 ellipsis 兜底
- ✅ 管理后台入口:头部快捷入口按角色常驻(工作台头部 platform:admin 显「管理后台」、tenant:admin 显「租户管理台」图标按钮),下拉保留兜底;租户管理员不再只能从下拉找租户管理台
- ✅ 三区品牌区跳转:工作台/管理后台/租户管理台品牌区补 @click 回门户首页(样式早有 cursor:pointer 暗示、行为缺失)
验证:后端 mvn install 全量测试 BUILD SUCCESS(V22/V23 迁移 23/23 应用)· 前端 build(vue-tsc 零错误)· 冒烟(login-config 含 requireApproval、params/public 9 键、apps/types 6 类、hot Top5、typeId 筛选 2 条、check_count 自增、收藏/状态/取消闭环、订单 appId=801 落库)✅ · E2E 13/13(新增应用市场检索筛选与详情页、机理模型筛选全部入口 2 场景;既有登录场景适配协议默认未勾选——点击复选框本体 .el-checkbox__input,label 中心落在协议链接上不切换勾选态)✅
遗留说明:8080 后端已换新 jar 重启(评审环境);8081 冒烟实例已停。
第十六轮:ICP 备案默认值 + 应用市场四维分类 + 悬浮条求助入口(2026-09-05 ✅)¶
用户验收反馈 4 项(ICP 未显示/应用市场四维分类/悬浮条三按钮求助入口/求助页表单与联系方式),全部实施并三重验证:
- ✅ ICP 备案显示:V24 迁移给 footer.icp 填默认值(2026-09 品牌清理时已改回空值,ICP 备案须由部署方自行申请后配置),前台页脚按参数显示;公安备案仍按站点在后台配置。同步补 footer.phone/footer.email 默认值(2026-09 品牌清理时已替换为占位值)
- ✅ 应用市场四维分类(后端维护+前端展示):V24 迁移 app_info 增 supplier/cost_type/industry_type/special_subject 四列(旧项目商店语义),废弃并删除单维度 app_type;后端列表接口四维筛选参数 + GET /apps/suppliers(数据去重);新增公开字典接口 GET /v1/dicts(system 域 DictController,白名单),工业品类/专业学科标签由 sys_dict 后端维护;前端 AppsView 四行筛选(供应商/价格/工业品类/专业学科,每行带「全部」)+ 卡片四维标签;AppDetailView 信息卡四维;AppManage 表单四维字段(供应商可输可选、价格单选、品类/学科字典下拉)+ 列表四列;Excel 导入模板列改为四维(价格填免费/收费、品类学科填字典码)
- ✅ 悬浮条三按钮(旧项目求助入口语义):悬浮条改三个问题类型按钮——平台系统使用问题/软件APP应用技术问题/行业专家咨询请求,点击直达 /help?type=platform|app|expert 并预选对应问题类型(可选用户手册项保留);样式美化(卡片式浮窗:品牌渐变图标块+文字,hover 左移+图标放大+主题色描边)
- ✅ 求助页对齐旧项目:V24 迁移 cms_help 增 help_type/attachments 列;POST /v1/cms/helps 改 multipart(title/helpType/content/files,附件上限 5 个×5MB,本地存储 cms/help/{userId}/,雪花文件名防覆盖);HelpView 重做——问题名称/问题类型(三类型下拉,悬浮条 query 预选)/问题描述(字数统计)/上传附件(5 个×5M 提示)/提交 + 右侧「关注与联系」卡(公众号二维码 footer.qrCode + 电话/邮箱参数驱动)+ 我的工单 + 常见问题
验证:后端 mvn install 全量测试 BUILD SUCCESS(V24 迁移 24/24;期间发现旧后端进程占用 jar 导致 repackage 失败,杀进程后重建)· 前端 build(vue-tsc 零错误)· 冒烟(params 备案/电话/邮箱有值、suppliers=ANSYS/其他、公开字典、四维筛选 supplier+价格+学科=Fluent 单条、multipart 工单提交 help_type=app+附件路径落库)✅ · E2E 14/14(新增:首页 ICP/电话断言、应用市场四维筛选、悬浮条→求助页类型预选场景;既有 13 场景全绿)✅
服务清理:按用户指示,验证完成后已停止本轮启动的全部服务(8080 后端、8081 冒烟实例、5173 前端 dev server)。
旧项目核对遗漏清单(2026-09-04,五旧版全量审计+逐项验证)¶
A 类 · 整块功能缺失(20 项): 1. 求解器专项体验:表单设计器(formDesign)+ Fluent/Mechanical 专项提交页 + 类型化日志解析(viewtxtFluent/Battery/webcasetj)+ CPU 核数校验 2. 网盘操作补全:文件移动/复制、ZIP 在线解压、chmod/chown 权限、网盘文件移到作业目录(movetofileJob) 3. 租户核时包:企业 coretime 配额、管理员人工加核时(addKernel)、核时月重置(resetkernelTimeMon) 4. 到期/欠费闭环:到期前 1/3/7 天站内信+邮件预通知、到期停用、租户禁止欠费开关(noAllowArrears) 5. 视频收藏 + 观看记录/续播 + 1080p 双码流转码(现仅 720p) 6. Windows 桌面代理账号能力:本地账号创建/授 RDP/SMB 盘符挂载(O:)/远程命令执行(老 exe 职责) 7. 报名问卷系统:问卷 CRUD + 随活动绑定 + 答题记录 8. 报名 H5 页 + 带 logo 二维码 + 成功页 9. 行业子门户(域名校验)+ 板块/文章(富文本、置顶上下移) 10. ~~代理商后半段:代理收入明细/客户租户管理/收款/绿色通道~~(用户指示:代理商去掉,不做) 11. 华为云商店 ISV 产线对接(实例生命周期回调、租户/组织同步、IAM 跳转登录) 12. 用户批量导入(Excel 模板批量开户) 13. 在线用户管理(在线列表/批量强退) 14. 个人用量自查询页(本月作业时长/资源使用明细) 15. 集群侧脚本运维库(NIS 账号同步/Samba 创建挂载/VNC 启停/磁盘巡检) 16. 平台 License 文件管理(老 simcloud-aliyun /license/) 17. 租户-集群绑定(专属集群) 18. 对外作业开放 API(task/authorized,第三方平台集成) 19. 作业输入/输出文件清单与下载(现详情仅日志 tail) 20. 门户产品推介页(productList 分页浏览)
B 类 · 部分覆盖(8 项):门户快捷工具(有区块配置,缺图标排序快捷入口)· 资源台账粒度(缺软件资源/节点/队列/存储空间四件套)· 工单时限(缺办理时限/受理时间追踪)· 专家评论管理 · 活动三维分类管理端点(类型/子类型/市场)· host-agent 超时杀软件+1 小时提醒 · 桌面目标机 ping 探测 · 租户入驻申请向导(有试用/代理申请)
C 类 · 小缺口(6 项):首登引导 · 登录日志删除 · 集群连通测试按钮 · 快捷帮助 quickHelp · ECS 监控回传 · 试用登记 H5 入口
抽查确认已覆盖且升级 ✅:用户/租户/角色/菜单/参数/字典/协议/审计日志、JWT+验证码+2FA+单会话、作业全链路(三调度通道/状态机/核时计费/模板)、网盘分片上传/回收站/打包下载、Guacamole 隧道+VNC 端口池+连接历史、集群监控+基础设施指标、预付费计费+商品 SKU+代理/试用审核、机理模型库(兼容 1100+ 存量)、应用市场评论/收藏/订购、活动报名(上限+重复拦截+CSV 导出)、视频转码/点播/评论/分类、CMS 五 tab、云 ECS 双厂商+云订单、报表/导出、站内信+邮件桥接、租户 CPU 配额、消息中心。
遗漏补齐执行(用户指示:A+B+C 全部补齐;代理商去掉)¶
✅ 批次 1 作业域(2026-09-04,全部实测): - A19 作业工作区文件清单+下载:JobExecutor SPI 增 listFiles/readFileBytes(local/agent/ssh 三实现,agent 增 /common/listFiles、/common/readFileBytes 端点);GET /v1/jobs/{id}/files + /files/download(PathGuard 防穿越、100MB 上限、UTF-8 Content-Disposition、token 查询参数认证);JobList 详情抽屉「工作区文件」区(列表/大小/下载)。实测:提交作业后清单返回脚本文件、越界下载 400 - A1 部分 CPU 核数校验:submit 校验 1~vela.job.max-cpu-per-job(默认 128) - A17 租户-集群绑定:sys_cluster.tenant_id(V10 迁移,NULL=共享);ClusterConfig/ClusterRegistry 透传;submit 校验非本租户专属集群 403;ClusterManage「所属租户」列+下拉 - A18 对外作业开放 API:/api/open/jobs(POST 提交按账号解析/GET 分页筛选/GET 详情/DELETE/ping),X-Open-Token + vela.open.enabled 开关(默认关闭→403),framework UserAccountProvider SPI + system 实现;实测错误 token 401、正确 token 提交/分页 200 - C 集群连通测试:POST /v1/admin/clusters/{id}/test(经执行通道 echo 探测返回耗时),ClusterManage「测试」按钮。实测 32ms 200 - 验证:mvn install 全量测试 BUILD SUCCESS(40 用例)· agent 打包 ✅ · 前端 build ✅ · V10 迁移 10/10 · E2E 5/5
✅ 批次 2 网盘操作补全(2026-09-04,全部实测): - 移动/复制/覆盖确认:StorageService 增 copy/chmod/chown;POST /v1/netdisk/move、/copy(overwrite 参数,目标存在拦截实测 400 带文案) - ZIP 在线解压:POST /v1/netdisk/unzip(zip-slip 防护经 PathGuard、10000 条目上限、解压至同目录)实测目录层级正确 - 权限:POST /v1/netdisk/chmod(755/rwxr-xr-x 双格式解析)、/chown(POSIX setOwner,无权限优雅失败) - 移到作业目录(movetofileJob):framework JobWorkspaceMover SPI + job 域实现(local 通道直拷,归属校验);POST /v1/netdisk/move-to-job。实测文件落入作业工作区 - 前端 NetdiskView:行内「更多」下拉(移动/复制/解压/权限/移到作业目录)+ 三弹窗 - 修复既有 bug:GlobalExceptionHandler 丢弃业务异常自定义文案(只显示错误码默认文案)→ 现携带具体原因,全站错误提示更明确 - 验证:后端全量测试 ✅ · 前端 build ✅ · 全部新端点冒烟 ✅ · E2E 5/5
✅ 批次 3 计费补全(2026-09-04,全部实测): - 租户核时包(老 kernel/coretime 语义):V11 迁移(sys_tenant.core_time_monthly/allow_arrears + billing_core_time + billing_core_time_consume(job_id 唯一幂等));CoreTimeService:人工发放(POST /v1/billing/core-time/grant,管理员)、列表/本人余额、月度配额发放任务(每月 1 日 00:10 清零重发,经 TenantQuotaProvider/TenantUserProvider SPI 跨域取租户配置与启用用户);作业完成时核时包优先扣减(CoreTimeBilling SPI,原子 UPDATE usable>=x + 幂等流水),剩余核时才按余额计费(BillingServiceImpl.charge 集成) - 允许欠费:sys_tenant.allow_arrears 开关;JobService.submit 余额不足时租户允许欠费则放行(老 noAllowArrears 语义) - 到期闭环:CloudOrder.remind_flags + ExpireReminderTask(每日 09:05:到期前 1/3/7 天站内信+邮件预通知防重复、到期当天自动置已到期并通知) - 前端:BizAdminView 增「核时包」tab(列表/发放 dialog);TenantManage 增月度核时/允许欠费字段与列表列 - 验证:后端全量测试 ✅ · 前端 build ✅ · 发放/列表/本人核时/租户字段持久化实测 ✅ · V11 迁移 11/11 · E2E 5/5(核时包扣减与到期提醒的定时路径逻辑同款幂等模式,真实调度器联调时验证)
✅ 批次 4 视频收藏/续播/1080p(2026-09-04,全部实测): - 收藏:POST/DELETE /v1/videos/{id}/collect + GET collect-status + GET collect/mine(video_collection 唯一键防重)实测闭环 - 观看记录/续播:V12 迁移(video_view_record.position_seconds)+ POST /{id}/view-record(upsert)+ GET /{id}/my-view-record + GET view-records/mine(含视频信息);前端弹窗播放器 @timeupdate 10s 节流上报 + 续播定位 + 「继续观看」tab - 1080p 双码流:TranscodeExecutorTask 720p 后追加 1080p 转码(失败不阻塞 720p);play 支持 quality=1080;前端播放器 标清/高清 切换 - 前端 VideosView:全部视频/我的收藏/继续观看三模式 + 收藏按钮 + 清晰度切换;未登录访问私有接口 401 实测 - 验证:后端全量测试 ✅ · 前端 build ✅ · 收藏/状态/观看记录/列表全冒烟 ✅ · V12 迁移 12/12 · E2E 5/5
✅ 批次 5 报名问卷/H5/三维分类(2026-09-04,全部实测): - 问卷系统:EnlistAdminController 问卷 CRUD + 公开 GET /v1/enlist/questionnaires/{id}(白名单);活动表单绑定问卷;报名含 answers JSON(PC 门户与 H5 双端表单渲染题目) - H5 报名页:/enlist-h5/:activityId 独立无布局路由(EnlistH5View,移动端友好:活动信息+问卷+提交);二维码 GET /v1/enlist/activities/{id}/qrcode(zxing 3.5.3 引入父 pom 版本管理,PNG 320×320,内容为 H5 地址);ActivitiesView 增加二维码弹窗与问卷题块 - 三维分类:V13 迁移(enlist_subtype/enlist_market 表 + enlist_activity.subtype_id);类型/子类型/市场管理 CRUD + 公开 GET /v1/enlist/meta;EnlistManage 增「分类管理」「问卷管理」tab,活动表单加子类型/市场/问卷下拉 - 验证:后端全量测试 ✅ · 前端 build ✅ · meta/类型/子类型/市场/问卷/带答案报名/二维码 PNG 全冒烟 ✅(期间发现 Windows bash curl 内联中文 GBK 编码问题,改用 UTF-8 文件/python 传参)· V13 迁移 13/13 · E2E 6/6(新增 H5 页场景)
✅ 批次 6 内容域(2026-09-04,全部实测): - 行业子门户:V14 迁移(cms_industry/cms_plate/cms_article/cms_expert_comment/cms_quick_help + cms_help.handle_time/deadline);行业 CRUD(含独立域名字段,部署层绑定)+ 公开列表;CmsAdminView「行业门户」tab - 板块/文章:板块 CRUD(置顶排序)+ 文章 CRUD(富文本)+ 公开分页浏览;门户新增 /articles 行业门户页(板块筛选+详情)+ PortalLayout 导航项;CmsAdminView「板块文章」tab - 专家评论:登录评论 POST /v1/cms/experts/{id}/comments + 公开浏览(白名单)+ 管理员删除;CmsAdminView「专家评论」tab(全专家聚合) - 工单时限:受理接口 PUT /v1/cms/helps/{id}/handle(处理人/状态/办理时限,受理时间自动回写);CmsAdminView 工单 tab 受理弹窗+受理时间/办理时限列(超时标红);标记解决回写受理时间 - 快捷帮助 FAQ:CRUD + 公开列表;HelpView「常见问题」折叠面板;CmsAdminView「快捷帮助」tab - 验证:后端全量测试 ✅ · 前端 build ✅ · 行业/板块/文章/FAQ/专家评论/工单受理全冒烟 ✅ · V14 迁移 14/14 · E2E 6/6
✅ 批次 7 用户域(2026-09-04,全部实测): - 用户批量导入:POST /v1/admin/users/import(POI Excel,列:账号/姓名/邮箱/手机号/初始密码/租户编码,行级校验不中断,ImportResult 汇总)+ GET /v1/admin/users/import-template(模板下载);UserManage 导入弹窗(模板下载/上传/结果明细)。system 模块引入 poi-ooxml,UserService.findTenantIdByCode 支持按租户编码开户 - 在线用户管理:framework OnlineUserRegistry(JWT 过滤器触碰登记活跃 jti)+ GET /v1/admin/online-users + POST /{userId}/kick(黑名单全部 token + 会话版本 +1 + 清注册表);LogManage「在线用户」tab(列表/强制下线)。实测:踢出后旧 token 立即 401 ✅ - 个人用量自查询:GET /v1/jobs/me/usage(本月作业/完成/核时/费用 + 近 12 月核时趋势 SUBSTRING 月聚合);ProfileView「本月用量」卡片组 + ECharts 趋势图(design token 颜色) - 租户入驻申请:V15 迁移(tenant_application 表 + sys_user.first_login);公开 POST /v1/biz/tenant-applications/apply(白名单)+ 审核 PUT /{id}/audit(通过自动开户建租户 + 站内信通知);ApplyView「租户入驻」tab(正式/试用);BizAdminView「租户入驻审核」tab。实测:申请→审核→租户自动创建全链路 ✅ - 首登引导:sys_user.first_login + LoginResult 透传;改密自动清除标记;LoginView 首登弹窗(去修改密码/稍后再说);E2E 登录助手适配弹窗 - 登录日志删除:DELETE /v1/admin/logs/login/{id} 与 /operate/{id}(单条)+ 批量端点;LogManage 行内删除按钮 - 验证:后端全量测试 ✅ · 前端 build ✅ · 在线列表/强退/用量/入驻闭环/日志删除全冒烟 ✅ · V15 迁移 15/15 · E2E 6/6
✅ 批次 8 桌面域(2026-09-04,全部实测): - host-agent 扩展(老 huawei-exe 职责):WinCommandService(net user 建账号/授 Remote Desktop Users/改密/net use SMB 盘符持久挂载/受控命令执行;账号名正则防注入、60s 超时、GBK 乱码兜底、命令白名单 net user/localgroup/use/tasklist/taskkill/whoami/ipconfig)+ 端点 /account/create、/account/password、/disk/mount、/command - 平台侧接线:POST /v1/desktop/hosts/{id}/agent/{action}(代理转发到 http://{hostIp}:{HOST_AGENT_PORT},操作留痕);POST /v1/desktop/hosts/{id}/ping(ICMP 探测返回可达/耗时) - 前端 DesktopView:行内「检测」(ping 结果提示)+「开通账号」弹窗(账号/密码/盘符/共享路径,建号+可选挂载盘符) - 验证:host-agent 启动实测(heartbeat/whoami 执行/白名单拦截 format 命令);平台→agent 全链路 whoami 200;ping 2ms 可达;无 agent 时优雅报"host-agent 不可达";server+agent 双打包 ✅ · 后端全量测试 ✅ · 前端 build ✅ · E2E 6/6
✅ 批次 9 平台域(2026-09-04,全部实测): - License 管理:V16 迁移(license_file 表);上传(multipart 落 storage/license/ + 路径入库)/列表/编辑/停用/删除(连带物理文件)/登录下载(PathGuard 防穿越);LicenseManage 前端页 + /admin/licenses 路由 + AdminLayout 菜单 - ISV 产线对接:/api/isv/produce/**(实例生命周期 newInstance/refreshInstance/expireInstance/releaseInstance/upgrade + 租户/应用/授权/组织同步 + IAM 跳转登录),回调留痕 isv_callback_log;vela.cloud.isv.enabled=false 默认关闭实测 403;路径白名单(云市场无 JWT) - 集群侧脚本运维库:deploy/scripts/cluster/(sync_nis_user.sh NIS 账号同步、samba_mount.sh 共享创建/删除、vnc_session.sh VNC 会话启停清理、disk_check.sh 磁盘巡检阈值告警,幂等+参数校验+语法验证)+ README - 门户产品推介页:/products 路由 + ProductsView(商品分类标签/价格/详情弹窗)+ PortalLayout「产品与方案」导航 - 资源台账四件套:sys_cluster 增 queue_list/storage_spec(V16);ClusterManage 表单与列表列(队列/存储规格展示);软件资源=求解器管理(已有)、节点=集群监控快照(已有) - ECS 监控回传:POST /v1/cloud/instances/monitor(X-Monitor-Token 校验、白名单、cloud_instance_monitor 留痕)+ 管理端趋势查询端点;未配置 token 明确拒绝实测 - 申请页二维码:GET /v1/biz/apply-qrcode(trial/agent/tenant 三类型,白名单)+ ApplyView「分享二维码」弹窗(老 apply.html 二维码语义) - 修复既有 bug:Spring Boot 3 下 MultipartFile.transferTo 相对路径按 multipart 临时目录解析(与 mkdirs 的 user.dir 不一致)导致上传 FileNotFoundException——License 与视频上传改绝对路径,实测上传/下载闭环 - 验证:后端全量测试 ✅ · 前端 build ✅ · License 上传下载/ISV 403/二维码 PNG/ECS 监控拒绝/集群台账字段全冒烟 ✅ · V16 迁移 16/16 · E2E 6/6
遗漏补齐总结(A+B+C 全部完成,代理商按用户指示去掉)¶
33 项遗漏全部补齐(A 类 19 + B 类 8 + C 类 6),分 9 个批次交付,每批三重验证(构建+冒烟+E2E),V10-V16 共 7 个迁移,40+ 后端测试全绿,E2E 6/6。 遗留(真实环境联调项,与补齐无关):核时包扣减/到期提醒的定时路径、SGE/Slurm 实机、guacd、FFmpeg 转码、云 SDK 凭证、SMTP——需现场环境验证。
已知待联调项(需真实环境,不影响交付结构)¶
- SGE/Slurm 集群实机联调(状态解析已单测覆盖,命令路径按集群配置)
- 求解器命令模板(ScriptBuilder 目前为骨架脚本,需按 Fluent/CFX 等模板化真实求解命令)
- guacd 实机验证(隧道代码完成,需 guacd 服务环境)
- FFmpeg 转码执行器(任务生命周期完成,执行器按环境启用)
- 华为/阿里云 RunCommand(需云凭证联调,创建/查询/启停 API 已实现)
- 邮件 SMTP 实发验证(发送服务完成,需 SMTP 账号)
当前阶段:P1 认证与系统域 ✅ 已完成 → P2 作业域(下一阶段)¶
P0 完成情况(全部验证通过)¶
| 项 | 状态 |
|---|---|
| 架构方案定稿(全部需求确认完毕) | ✅ docs/velasim-architecture.md |
| 后端 Maven 多模块骨架(17 模块) | ✅ mvn install 全绿(含 mybatis-plus-jsqlparser 依赖修复) |
| 后端启动验证 | ✅ H2 档位:Flyway V1 迁移成功、health UP、/v3/api-docs 200 |
| common 单测 12/12、JwtService 单测 5/5 | ✅ |
| 前端骨架(token/主题/i18n/四区布局) | ✅ npm run build 通过 |
| 前端 dev 联调冒烟 | ✅ dev server(端口 5173-5176 被其他项目占用时 Vite 自动换 5177)+ 代理 200 |
| README + developer-guide + 权限白名单 | ✅ |
P1 已完成 ✅¶
后端(全部编译通过 + 测试全绿): - JWT 认证:JwtService(access 30min + refresh 7d 轮换 + jti)、JwtAuthenticationFilter(黑名单 + 单会话版本校验)、统一 401/403 JSON、PasswordEncoder - 认证流程:AuthController(login/captcha/refresh/logout/register/2fa/me/agreement)、AuthService(验证码校验 + 登录限流锁定 + 管理员邮箱 OTP 二次验证 + 注册可配置 + 单会话踢出)、CaptchaService(Hutool 5min 一次性)、LoginRateLimiter、LoginLogService - 单会话:SessionVersionProvider SPI(framework)+ SessionVersionServiceImpl(system,Caffeine+库回源);开关 security.singleSession - 权限:@RequiresPerm 注解 + 切面;平台管理员通配 "*";RoleService(角色/权限点) - 系统域 CRUD:用户(分页/增删改/重置密码/启停/分配角色)、租户、角色(+菜单权限树分配)、菜单、参数(缓存+即时刷新)、字典、协议、登录/操作日志查询 - V2 迁移:session_version 列 + sys_role_menu 表 + 角色/菜单/参数/字典/协议种子 - AdminInitializer:首次启动创建默认租户 + admin/VelaSim@2026(日志提示改密) - 测试:19/19 全绿(common 12 + JwtService 5 + 认证全流程集成 2:登录→me→管理→401→刷新→登出黑名单) - 线上冒烟 ✅:health/captcha/未认证 401/公开协议接口
前端(build 通过 ✅): - api/request.ts(token 注入 + 401 自动 refresh 重试 + 统一错误提示) - stores/user.ts(登录/2FA/登出/hasPerm/isPlatformAdmin) - 路由守卫(requiresAuth + admin 角色校验) - 登录页(验证码/2FA 两步流程/协议勾选) - 管理页:用户管理(ListPage 模板实例)、租户管理、角色管理(权限树)
P1 收尾补充(已完成 ✅)¶
- 管理页全量补齐:参数管理(分组行内编辑即时生效)、字典管理(类型筛选+CRUD)、协议管理(版本化)、登录/操作日志查询
- 工作台:消息中心(未读高亮/全部已读)、个人中心(资料/改密/核时展示)、布局挂真实菜单 + 用户下拉登出
- 前端 build ✅ + 全链路冒烟 ✅(后端 8080 / dev 5177 / 代理 captcha+agreement 200)
- P1 状态:完成
P2 作业域(进行中 —— 后端核心引擎已完成,编译打包通过 ✅)¶
已完成: - V3 迁移:求解器组/求解器/参数属性/集群关联/作业/文件/工作区/模板/日统计/月统计/计费规则 全表 + 8 求解器种子(Fluent/CFX/Mechanical/LS-DYNA/Maxwell/HFSS/ABAQUS/OpenFOAM)+ 参数属性种子 + 默认计费规则。设计简化:排队状态并入 job_info.state(无独立排队表) - framework:ClusterConfig + ClusterRegistry SPI;InAppNotifier SPI - system:ClusterEntity/Mapper + ClusterRegistryImpl(缓存+失效)+ AdminClusterController(台账 CRUD)+ InAppNotifierImpl - job 域:JobState 状态机、JobInfo/Solver/Group/Attribute/Template/ClusterSolver/StatDay 实体与 Mapper - 调度引擎:SchedulerProvider SPI(submit/query/stop/queueInfo)+ SgeProvider(qsub/qstat/qacct/qdel 解析)+ SlurmProvider(sbatch/sacct/sinfo/scancel)+ SchedulerFactory(按集群台账装配 provider×executor 正交) - 执行通道:JobExecutor SPI(execute/writeFile/readFile)+ LocalJobExecutor(ProcessBuilder+白名单+超时+输出截断)+ CommandWhitelist(防命令注入) - JobService:提交(校验集群-求解器关联→落库排队)、dispatchQueuedJobs(批量 50 派发→调度器→RUNNING+站内信)、syncRunningJobs(批量 200,FINISHED→核时计算+费用+站内信+统计,FAILED/STOPPED 状态回写)、停止/删除(数据权限:管理员/租户管理员/本人)、模板 CRUD、日统计聚合 - JobPollingTask(@Scheduled 10s 统一批量轮询)、ScriptBuilder(脚本骨架,求解器命令模板留待集群联调)、JobController/SolverController/TemplateController - 后端编译 + install 打包通过 ✅
已完成(第二批): - AgentJobExecutor(HTTP 调 vela-agent + X-Agent-Token 鉴权)+ SshJobExecutor(mina-sshd 2.14 + AES-GCM 凭据解密)—— 三通道完整 - framework AesUtil(AES-GCM,密钥 32 字节,dev 默认值 + 生产环境变量) - vela-agent 独立服务(velasim-agent/:无库、/job/execute /common/writeFile/readFile/heartbeat/monitor、白名单、token 鉴权、打包通过 ✅) - 测试新增:CommandWhitelist 4、SgeProvider 5、SlurmProvider 3、JobState 2、AesUtil 3 → 全量 36 个测试 BUILD SUCCESS ✅ - 修复:SchedulerFactory 双构造歧义(@RequiredArgsConstructor + 手写构造冲突)、AES 密钥长度 - 后端 P2 完成 ✅(server install + agent package 全绿)
剩余(已完成 ✅): - 前端作业工作台:JobList(ListPage:状态标签/定时刷新/停止/删除)+ JobSubmit(WizardPage 三步:求解器分组树→动态参数表单→确认),路由+菜单接入 - 前端 admin 集群管理页(台账:调度器 SGE/Slurm + 执行通道 local/agent/ssh 配置表单) - 联调冒烟 ✅:后端启动(V3 迁移 3 migrations 成功)、health UP、受保护接口 401 - 前端 build ✅(全部页面通过 vue-tsc) - P2 状态:完成 ✅(36 个测试全绿 + 三服务编译打包通过 + 前后端冒烟通过)
P3 网盘+桌面+监控 ✅ 已完成¶
后端(全量测试 40+ 用例 BUILD SUCCESS ✅,V4 迁移 4 migrations 启动成功,未认证 401 生效): - 网盘:framework StorageService SPI(direct/platform 双模式)+ LocalStorageService(PathGuard 防穿越含 Windows 盘符、回收站 .vela_trash、Range 读)+ NetdiskService(目录树/重命名/回收站/还原/彻底删除)+ 分片上传全流程(init 断点续传+秒传/chunk/complete 合并+MD5 校验)+ NetdiskController(Range 断点下载) - 桌面:主机台账(手动登记/纳管,凭据 AES 加密)、一次性连接令牌(60s 防重放,凭据不出后端)、会话历史、VNC 端口池分配、Guacamole 内嵌隧道(guacamole-common 1.5.5 直连 guacd;绕开 javax.servlet 冲突自实现双向流循环) - 监控:快照表 + 60s 采集任务(qstat/sinfo + df 解析)+ MonitorController(KPI/趋势 API + 手动采集) - 架构修复:RequiresPerm 注解+切面从 system 上移至 framework(横切归属,desktop 模块零依赖使用);ClusterRegistry 增 listAll - 测试新增:PathGuard 4(含穿越/盘符/空字节) - 前端:网盘页(面包屑导航+分片上传进度+回收站)、桌面页(卡片网格+一键连接开隧道窗+登记表单)、监控页(ECharts KPI 卡+趋势图+60s 自动刷新),build ✅
P3 状态:完成 ✅(后端 install + 全量测试 + 前端 build + 冒烟全部通过)
P4 商业化 ✅ 已完成¶
后端(全量测试 BUILD SUCCESS、V5 迁移 5 migrations、冒烟:health UP + 公开商品接口 + traceId 贯穿): - 预付费计费:framework BillingService SPI(charge/hasBalance/getBalance/grant)+ BillingServiceImpl(原子 UPDATE 扣费、消费明细 job_id 唯一键幂等、并发重复扣费回补兜底、透支通知、线下人工入账充值留痕、系统赠送额度) - 作业计费闭环:JobService 提交前余额校验(管理员豁免)、完成时按核时扣费(0.5 元/核时)回写 costAmount;AdminInitializer 赠管理员初始额度 - 商品/代理商/试用:实体+Mapper+BizController(商品 CRUD 公开浏览、代理申请审核、试用申请审核,公开申请接口放行) - 架构修正:OperLog 注解上移 framework(billing 模块零依赖使用) - 前端:计费中心(余额卡片+消费明细/充值记录)、运营管理页(商品/代理审核/试用审核/充值入账四 tab),build ✅
P4 状态:完成 ✅(后端全量测试 + 前端 build + 冒烟全部通过)
P5 运营内容 ✅ 已完成¶
后端(全量测试 BUILD SUCCESS、V6 迁移 6 migrations、冒烟:health UP + 模型库公开接口 + 报名公开接口 200): - 机理模型库(model 域):ModelInfoEntity 参考 tb_mechanism 产品级版(logo/介绍图/安装包本地文件存储+路径入库、分类字典码)、二维分类分页检索、上传/编辑/删除、批量导入接口(JSON 数组,兼容 1100+ 存量迁入) - 应用市场(app 域):浏览/详情/评论/收藏/上下架 - 活动报名(enlist 域):活动 CRUD、报名(人数上限 + 手机号重复拦截)、名单分页(导出数据源)、问卷字段预留 - 视频课堂(video 域):上传(本地存储+建转码任务)、点播浏览、评论、转码任务监控(排队/进度/失败) - 内容 CMS(cms 域):资讯(公开浏览+管理)、专家、技能服务/客服回复、求助工单(处理闭环)、门户区块配置(开关/排序) - 安全:门户公开接口白名单(模型/应用/活动/视频/资讯 GET + 报名 POST) - 前端:机理模型库页(二维分类筛选+卡片网格,响应式)、内容管理页(资讯/工单/客服/区块/转码五 tab),build ✅
P5 状态:完成 ✅
P6 云集成 ✅ 已完成¶
后端(全量测试 BUILD SUCCESS、V7 迁移 7 migrations、启动冒烟通过): - CloudProvider SPI(framework):createInstance/describe/operate/runCommand + CreateInstanceRequest record - HuaweiCloudProvider(huaweicloud-sdk-ecs 3.1.150,CreateServers/PrePaidServer 新 API 路线,@ConditionalOnProperty huawei 注册) - AliyunCloudProvider(aliyun-java-sdk-ecs 4.24.51,历史验证路线,@ConditionalOnProperty aliyun 注册) - 云订单流:下单(cloud_order)→ 异步开通(创建实例→登记 cloud_instance→状态流转,失败回写原因)→ 实例启停/释放操作 → 到期管理表 - SmsSender SPI + SmsServiceImpl:按 vela.sms.provider 装配,none 模式仅落库留痕不发送(降级验证通过) - 开关化:provider=none 时 Provider Bean 不注册,云接口返回"云能力未启用"(纯手动模式) - 前端:admin 云订单/实例管理入口由后端 API 支撑(页面在 P7 打磨补齐)
P6 状态:完成 ✅
P7 运维与交付(最后阶段,按架构方案里程碑 P7)¶
- vela-host-agent(Windows 桌面机代理:软件黑白名单/计时上报/增量配置,独立轻量服务)
- 监控中心:基础设施指标(服务器 Oshi/应用 actuator/MySQL 连接池/缓存命中)+ 业务大盘(作业/核时/计费/活跃)+ 告警规则
- 报表中心:报表任务(作业/核时/计费对账/资源利用)+ 定时生成 + 下载中心
- 部署交付:CentOS/Ubuntu 一键部署脚本、Dockerfile/compose、Nginx 配置(含 WebSocket 升级)、acme.sh 证书自动化、MySQL 备份/恢复脚本、日志归档 logrotate
- 数据生命周期:监控快照 90 天清理、日志归档、导入导出产物清理(@Scheduled 任务)
- 主题打磨/i18n 补全/响应式走查、安全测试(依赖漏洞扫描)、性能压测脚本(JMeter 场景)
- 文档:部署手册(CentOS/Ubuntu/Docker)、运维手册(备份恢复/告警处置/FAQ)、用户手册三册、快速开始、验收清单
-
整体验收:全量测试/冒烟/文档核对 → 产品级交付包
-
云抽象:CloudProvider SPI(createInstance/start/stop/reboot/delete/describe)+ HuaweiCloudProvider + AliyunCloudProvider(SDK 引入,vela.cloud.provider=none 时不注册路由)
- 云主机开通流程:选商品规格→下单(cloud_order)→异步创建→初始化(云助手 RunCommand 脚本生成:建账户/RDP/SMB 挂载/host-agent)→登记 desktop_host→通知
- 云订单管理:/cloud/**(订单/到期/释放 + 到期提醒)
- 短信:SmsSender SPI(huawei/aliyun/none 配置切换)+ 验证码/通知集成点
- 前端:admin 云主机管理页(订单/实例)
- 测试 + 联调(SDK 无凭证环境走 none 模式验证降级)+ 更新进度 → P7 运维与交付
P5 原始清单(存档)¶
- V6 迁移:app 域(app_info/app_type/app_comment/app_collection/app_use)+ model 域(model_info 参考 tb_mechanism 结构/model_tag/model_collection/model_use)+ enlist 域(enlist_activity/type/subtype/market/enlist_record/questionnaire)+ video 域(video_info/type/comment/collection/view_record/video_transcode_task)+ cms 域(cms_news/expert/skill/skill_reply/help/industry/plate/paper + portal_block_config)
- 应用市场:上架/详情/收藏/评论/试用 + 批量导入框架(Excel 模板+校验+异步导入)
- 机理模型库:二维分类(字典已有种子:mechanism_industry/mechanism_subject/run_mode)、参考 tb_mechanism 结构(BLOB→本地文件存储)、批量导入(兼容 1100+ 存量迁移)
- 活动报名:活动 CRUD/问卷/报名/导出(enlist 域)+ H5 报名页
- 视频课堂:上传/转码任务(FFmpeg 管线)/点播(HLS 预留,P3 已定方案)/评论收藏
- 内容:资讯/专家/客服工单 + 门户区块配置(portal_block_config)
- 前端:应用市场/模型库/报名/视频/资讯页面 + admin 内容管理
-
测试 + 联调 + 更新进度 → P6 云集成
-
V5 迁移:billing 域(billing_account/billing_recharge_record/billing_consume_record/billing_consume_total)+ product 域(product/product_sku/sku_material_*)+ agent 域(agent_info/agent_income_detail)+ trial_application
- 预付费账户:开户(送初始余额可配置)、充值(线下人工入账,已确认)、按核时扣费(作业完成事件触发,原子 UPDATE 幂等)、消费明细、月度对账聚合
- 商品 SKU:商品/规格/素材 CRUD、订购流程(下单→开通资源 P6 联动)
- 代理商体系:代理申请/审核(审批流)、年费分成;试用申请(H5 表单+审核)
- 计费中心前端:余额/充值记录/消费明细/趋势图;admin:计费规则、商品管理、代理商管理、试用审核
-
测试 + 联调 + 更新进度 → P5 运营内容
-
V4 迁移:netdisk 域(netdisk_dir/netdisk_file/netdisk_transfer)、desktop 域(desktop_host/desktop_connection/desktop_session/tenant_vnc_port/desktop_init_log)、监控域(cluster_monitor_snapshot/agent_heartbeat)
- 网盘:StorageService SPI(直连模式=共享盘路径 / 平台存储模式=storage.root)、目录树/文件元数据 CRUD、分片上传(chunk 状态表/合并校验/断点续传/秒传)、打包下载、回收站
- 桌面:主机台账(手动登记为主)、Guacamole 内嵌隧道(guacamole-common 依赖 + WebSocket 代理 + 连接令牌)、VNC 端口池、连接历史
- 集群监控:local 模式本地采集(qstat/sinfo + df)60s 定时任务落库、监控大屏 API(KPI + 趋势)
- 前端:网盘页(目录树+文件列表+上传进度)、桌面页(卡片+一键连接)、监控页(KPI 卡+趋势图 ECharts)
- 测试 + 联调 + 更新进度 → P4 商业化
P2 原始清单(历史存档)¶
- V3 迁移:job 域表(job_solver_group/name/attribute/data/jurisdiction、job_info、job_queue、job_workspace、job_statistics_day/month、job_cost_rule、cluster_solver_version)
- 调度引擎抽象:SchedulerProvider(submit/query/stop/queryAccount)+ SgeProvider(qsub/qstat/qacct/qdel)+ SlurmProvider(sbatch/sacct/sinfo/scancel/sacctmgr),状态统一映射
- 执行通道:JobExecutor SPI(Local/Agent/SSH 三实现完整交付)
- vela-agent 独立服务(velasim-agent/:无数据库、HTTP API、白名单命令集、心跳上报)
- 作业状态机(DRAFT→QUEUED→RUNNING→FINISHED/FAILED/STOPPED)+ 批量轮询 + 核时计量扣减 + 作业模板
- 集群台账管理(sys_cluster 已有表)+ 求解器注册表管理(前端)
- 前端作业工作台:提交向导(选求解器→参数→文件→确认)、活跃作业、历史、详情(日志 tail)、模板
- 测试:调度引擎抽象/状态机/核时计费单测 + 集成
- 联调验证 + 更新本进度文件 → P3
里程碑总览(P0 完成后按序推进,不询问、全自主)¶
- P1 认证与系统域(JWT/RBAC/用户租户/参数字典/审计)
- P2 作业域(SGE+Slurm 双调度、local/agent/ssh 三执行通道、vela-agent、状态机、核时、作业模板、工作台前端)
- P3 网盘+桌面+监控(分片上传、Guacamole 隧道、集群监控+大屏)
- P4 商业化(预付费计费、商品 SKU、代理商、试用、计费中心前端)
- P5 运营内容(应用市场、机理模型库、活动报名、视频课堂、资讯内容)
- P6 云集成(华为/阿里 ECS、双云短信、云订单)
- P7 运维与交付(vela-host-agent、监控中心、报表中心、部署脚本 CentOS/Ubuntu、证书自动化、备份恢复、压测、文档)
关键约束(勿违反)¶
- 后端单体:vela-boot 单 jar;模块间禁止互依赖,协作走 Spring 事件
- 命名:sys_/job_/billing_/msg_... 域前缀;雪花 ID;Long→String JSON
- 缓存 Caffeine(有界+TTL);文件存本地(storage.root 目录规划见架构方案 5.1)
- dev 档位 H2(MySQL 模式),生产 MySQL 8;Flyway 兼容写法放 db/migration,MySQL 专有放 db/migration/mysql
- 测试随代码交付:核心域单测覆盖率 ≥80%
- UI:token 变量禁硬编码色值、文案走 i18n、页面套布局模板、响应式断点用 useBreakpoint
2026-09-07 云数据 B 支架构改造(V38)¶
- 契约变更:
GET /v1/netdisk/list返回PageResult(pageNum/pageSize 参数);POST /upload/init必带targetPath(旧客户端 400「缺少目标路径」);chmod/chown接口下线(POSIX 能力保留在终端/桌面 shell 通道)。 - 新增端点:
/dirs(目录树选择器)、/search(索引搜索)、/quota、/preview(图片白名单 inline)、/copy-from-job、/share系列(create/list/revoke/info/list/download)。 - 语义变更:秒传哈希 MD5→SHA-256 且命中时真实物化到目标路径;上传会话与秒传全部属主化;分片字节对账;
.vela受管只读区 + 根列表「作业工作区」节点;作业下载流式(取消 100MB 内存上限);下载 Range 规范化(416/206/200);zip 打包前预检 4GB 上限;解压 20GB 上限(可配);网盘配额租户级 GB(Web 便捷闸,权威=FS 配额)。 - 运维:见 ops-manual 第 6 节(配额口径/扫描滞后/受管区/分享)与 deploy-manual 第 8 节(配置项/agent 版本要求)。
2026-09-07 云超算整体改造(V39)¶
- 契约变更:提交必带已配置命令模板的求解器;
GET /v1/jobs加 parentId/sweepRoot 筛选; 新增端点 /draft 系列、/{id}/rerun、/{id}/queue-status、/events(SSE)、/clusters/{id}/summary、 /admin/solvers/{id}/command-template、/admin/clusters/{id}/host-key/confirm|reset、/admin/clusters/{id}/accounts。 - 语义变更:派发两阶段幂等 + 重启恢复;UNKNOWN/查询失败升级阈值;STOPPED 记核时(秒级精度); 统计表 core_hours 累加;dashboard 今日核时直查作业表;SGE Eqw 归失败;日志真 tail;job.log 为唯一日志真相; 作业脚本生成真实求解器命令(模板渲染);参数扫描(父容器+子作业);草稿;重跑;排队预估;SSE 实时推送; 集群 SSH 主机密钥 TOFU;集群账号映射(sudo);开放 API 收紧;V39 将升级前在途作业按完成归档。
- 运维:见 ops-manual 第 7 节(派发/账号映射 sudoers/TOFU/工作区保留/升级注意事项)与 deploy-manual 第 9 节(配置项)。
2026-09-07 全局排查修复·批次 1(云订单闭环 + Agent 映射)¶
- 云订单状态拆分:STATUS 常量 0=待开通/1=开通中/2=已开通/3=失败/4=已到期/5=已释放(原 4 同时表示"已到期"和"已释放")。前端 CloudManage/DesktopView/RemoteAppView 三处状态映射同步。
- 到期真闭环(ExpireReminderTask):到期先 STOP 云实例(失败次日重试不误发通知)→ releaseHostForOrder 归还专属主机 → 通知 → 置 4;分布式锁 cloud:expire-remind(1800s,锁缺失降级单实例)。release() 补真实 DELETE 云实例(失败回写 failReason 不阻断主机归还)+ 幂等(5 直接返回);deleteOrder 禁止删 1/2/4 状态订单(须先释放)。
- Agent 多段动作 404 修复:DesktopHostOpsController 补四个显式子映射(account/create、account/password、disk/mount、command),单段映射保留兼容。
- 求解器参数 @PathVariable:SolverController.attributes 缺注解致恒查 null,已修。
- 前端游离死 CSS:JobSubmit/JobList
</style>闭合后的孤立 CSS(Vue 编译器静默丢弃)移入块内;DesktopClientView RDP/VNC 占位改服务式空态。 - 验证:CloudOrderExpireTest 新增 3/3(假 CloudProvider 验证 STOP/主机归还/未到期不动);verify-desktop-lifecycle.mjs 扩到 46 项。
2026-09-07 全局排查修复·批次 2(审计脱敏 + PathGuard 统一 + 幂等 V40 + 前端工程)¶
- 操作审计回填+脱敏(OperLogAspect):operatorId/operatorName 从 SecurityContext 回填;serializeArgs 递归脱敏(password/pwd/credential/secret/token/otp 类键整值 [MASKED]);序列化失败落占位文案不再落原始 JSON。
- video/model 路径校验统一接 PathGuard:删除 contains("/video/")、contains("/model/") 子串放行(可构造 ../ 越界读);resolveStorageFile(rel, 前缀白名单) = 绝对路径 relativize + 前缀白名单(model/、video/、video/thumb/)+ 词法/软链校验,越界一律 404。视频存储迁 storage.root/video/**(上传文件名消毒、转码任务全链路 resolve);模型安装包下载改 FileSystemResource 流式(原整包读内存)。
- 幂等与并发:app/video 收藏 insert 捕 DuplicateKeyException 幂等成功;报名同手机号捕异常回 DUPLICATE_KEY;DesktopService.validateVncPortFree:VNC 登记锁本租户池行 FOR UPDATE + 池内校验 + 占用校验(createHost/updateHost 接上)。(曾补 V40 唯一约束迁移,复盘发现 V6 已有 uk_enlist_record 同列约束,V40 属重复索引,本轮已删。)
- 前端工程:新增 utils/confirm.ts(confirmAction/promptAction,取消不产生 unhandled rejection)改造 21 文件 53 处;8 个列表页搜索提交重置 pageNum;新增 NotFoundView 404 页 + catch-all 路由。
- 收口:删 GET /netdisk/mode(controller+service+StorageService SPI mode());/auth/me 曾被删但被 AuthFlowIntegrationTest 依赖,已恢复;删 seed-demo-user.mjs;LoginView 演示块保留(仅 dev 构建渲染,verify-login-demo-accounts.mjs 依赖)。
- 误报澄清(勿再排查):TenantDesktopController 每端点内联 requireTenantAdmin 已守卫(hardening 60/60 有断言);POST /v1/desktop/vnc-ports/allocate 被 verify 脚本使用;submitDraft 被 verify-jobs.mjs 使用;/auth/me 被 AuthFlowIntegrationTest 使用。
- 文档同步:user-manual/ops-manual 清除计费/商品/试用/核时包/月度核时残留;集群监控位置改为管理后台。
- 验证:后端全量测试 71 用例 0 失败、前端 build 通过、五套回归脚本全绿(lifecycle 46/hardening 60/host-binding 49/jobs 33/netdisk 45)。
2026-09-07 残留清零轮(会话恢复后全项目梳理)¶
- 删 V40 迁移:复盘确认 V6 已有 enlist_record(activity_id, phone) 唯一约束,V40 同列重复建约束属双索引冗余,已删;业务层 DuplicateKeyException 幂等兜底保留(依赖 V6 约束即生效)。
- 摘除 3 个空骨架模块:vela-module-cluster/monitor/report(零源码)从根 pom/vela-boot 依赖移除并删目录;监控/报表真实代码在 vela-module-job。
- 删孤儿端点 9 处(后端完整、前端/脚本/测试零触达):cloud 实例 operate/monitor、enlist /meta、monitor clusters/latest/history/collect、apps 门户写×3、models 门户写×3+batch-import(batch-import 系 tb_mechanism 存量迁移一次性工具,如需可从 git 历史恢复)、AdminModel status、日志批量删×2;连带清理变孤儿的 service 依赖与 import。
- 保留的外部通道(仓库外消费者):isv 产线回调、guac 隧道、ECS monitor 回传。user roles 端点保留(初判孤儿,实际 verify-desktop-hardening/host-binding 两脚本在用;前端缺角色编辑入口列为已知缺口)。
- 试用申请砍净:ApplyView 删"试用入驻"radio;后端 apply() 强制 applyType=1(一律正式);BizAdminView 历史 0 记录仍显示"试用"tag(存量数据正确渲染)。
- 缺陷修复:MyQuotaView 接口失败不再展示演示默认假配额(明示"加载失败");DesktopClientView RDP/VNC 空态文案中性化(不再暴露"部署中"实施状态);HomeView"敬请期待"改"敬请关注"。
- 仓库卫生:删根目录 6 个日志、4 张孤儿截图、死文件 WorkspaceHome.vue;.gitignore 补 *.tsbuildinfo/playwright-report/test-results;server/logs 76M 日志被运行中后端锁定待重启后删;.backup-20260906 已被 git 历史覆盖,待提交后删。
- 文案清理:CloudController/OperLog/TenantUserProvider 计费/商品类过时注释修正;ClusterManage/SolverManage 双 scoped 样式块合并。
- 验证:后端全量测试 BUILD SUCCESS、前端 build + vue-tsc 通过;V1–V39 迁移连续(V40 删除后 39 个)。
- E2E 对齐修复(spec 9-06 版 vs 前端 9-07 演进漂移):悬浮条入口改先点 FAB 展开面板;应用市场热词文案「搜索热词:」→「热门搜索」;详情页删「订购」断言(随商品/计费下线);云应用弹窗改为定位 Mechanical 卡片自己的启动按钮(原点到 Fluent);ClusterManage/CloudManage 表格列宽压至 1440px 无横滚(实测 10 个管理页全部 sw≤cw)。Playwright 14/14 全绿(47.9s)。
2026-09-08 Agent 原生变体 + 全仓库体检修复¶
- 原生变体(Java 版保留为默认):
velasim-agent-go(Go 1.23 仅标准库,linux/amd64 静态二进制 5.5MB)+velasim-host-agent-cs(.NET 10 自包含单文件 win-x64 48MB);HTTP 契约与 Java 版逐字对齐;部署资产 install-agent-go.sh(systemd)/install-host-agent-cs.bat(sc.exe);验收 verify-agent-native.mjs 51/51(直连/经 8081 派发/平台转发/黑名单实测/Java↔Go 语料 diff)。 - 体检修复·高危:LocalJobExecutor 并发排空+树杀(防卡死轮询线程);SshJobExecutor sudo 包整条命令(账号映射失效修复)+ 文件通道改 base64(消除 heredoc 注入);host-agent 双版本全路由令牌鉴权(平台 vela.host-agent.token + X-Host-Agent-Token,与 host-agent 同步升级);Java 集群 agent 并发排空+树杀。
- 体检修复·中危:租户入驻重名拒绝(防跨租户提权);云订单约束(规格白名单 fail-closed/活跃订单上限/tenantId 落库)+ SecurityUtils.getTenantId;主机 IP 校验(禁环回/链路本地/元数据,SSRF 防线);cms/skills 按用户隔离+资讯详情 status 过滤;桌面会话清扫器(僵尸会话回收);host-agent 密码字符集校验;黑名单监控超时防挂死;agent 白名单 basename 对齐(qcmdPath 兼容,Java+Go);JobExecutor.ownsLocalWorkspace 能力声明替代 executor 类型硬编码;DISPATCH_REJECTED 失败分类(前端标签同步);文档依赖方向声明如实化(cloud→desktop 例外已在 pom 声明——审计"未声明依赖"系误报)。
- 体检修复·低危/卫生:zip 解压实际字节计量(防炸弹);completeUpload 0→1 原子闸门;IO 错误信息脱敏(路径只进日志);restoreTrash 单名校验;登录限流锁 TTL;RDP security=any→nla,rdp;ISV 回调体积上限;前端 DOMPurify 富文本净化、useBreakpoint 引用计数修复、分享链接 history 路径修复、ProfileView 图表主题联动、formatSize 去重、死代码清理、unhandledrejection 噪音抑制;Go agent 补 Read/Write/Idle 超时。
- 仓库卫生:log.gz/playwright-report/test-results 移出 git 索引;删 stackdump/cp.txt/空目录/空包目录/module 根二进制;README/architecture/developer-guide 计费与 i18n 表述同步(V36 下线标注+仅中文);progress.md 补本节。
- Agent 交付物形态(2026-09-09):主包默认不带 agent(主流分离交付);
--agents java|native|both可选附带(原生检测提示 Go/.NET 工具链绿色安装);--agents-only独立 agent 交付包;ci.sh 门禁补 Java agent ×2 构建;deploy 根目录脚本分类(7 个直接执行/README+templates 不执行/子目录被引用),github-actions 模板移入 deploy/templates/。 - 目录职责再划分(2026-09-09,用户提出):工程门禁
ci.sh+ GitHub Actions 模板移入deploy/(交付体系自包含,打包前门禁改为调 deploy/ci.sh);devtools/只留开发人员验收/压测/数据工具;新建scratch/(gitignored,Claude 会话一次性工作物约定)。 - CI 门禁 + 产物校验 + 安全扫描(2026-09-09):
devtools/ci.sh一键门禁(--quick 脚本语法/--full 后端 mvn test+前端 vue-tsc+build+Go gofmt/vet/test/build+C# 零警告 build+publish/--package 产物归档 delivery/artifacts/<版本>-<时间戳>+SHA256SUMS+MANIFEST/--security npm audit 门禁+trivy+dependency-check 指引);版本号 git tag 驱动(VELA_VERSION 可覆盖);打包脚本产 SHA256SUMS 完整性清单;GitHub Actions 模板 devtools/github-actions.yml.example;devtools/README 目录说明。全量 --package 实测全绿。 - 打包工具全功能版(2026-09-09,用户多轮方案收敛后实施):
build-offline-package.sh重写——交互三步问答(目标 OS 菜单含支持级别/构建方式自动检测推荐/交付形态)+ 三种构建方式(本机/Docker 容器/已有产物,缺工具链交互询问绿色安装到可配目录、构建完询问保留或删除)+ 环境自适应(本机 OS 匹配原生打包、不匹配自动容器重入)+ bundle 三形态(自解压单文件默认交付物/压缩包/目录,解包位置 --extract-dir/环境变量/默认 /opt/vela-delivery 三层可配);三平台入口封装build-package.bat|.command|.sh(薄封装,docker:cli 引导);产物统一delivery/(gitignore)。 - Docker 形态正式实现(2026-09-09):
deploy/docker/{Dockerfile,docker-compose.yml}完整编排(web/server+FFmpeg/mysql/guacd,guacd 仅 compose 内网)+ 一键deploy/deploy-docker.sh(与 jar 形态同语义:探测预算/离线 docker load/证书三态/冒烟/报告/升级镜像回滚/卸载只删自建镜像与数据卷)+build-offline-package.sh --docker镜像包;早期草案留 devtools/docker-reference 作历史对照。 - 部署方案定稿并实施(与用户多轮收敛):
deploy/deploy.sh重写为唯一交付安装器——完整形态默认(功能组件 guacd/FFmpeg/Samba/NTP 内嵌,删 install-features.sh)、内存探测三档(<3G 拒/3-8G 演示档确认/≥8G 标准)+ 预算模型(--memory-budget)、分配曲线封顶(JVM 8G/MySQL 16G)、三模式交互(一键/--interactive/无人值守)、在线/离线同脚本(--offline + 短超时预检自动fallback)、证书三态(acme/--cert/--self-signed IP SAN)、--enable-tls 后期加域名、--upgrade 备份回滚、--uninstall、纯 bash 部署冒烟、部署报告、证书巡检 cron、MySQL 加固、crontab 查重幂等;新增deploy/build-offline-package.sh(打包机快照 + JDK tarball + CentOS 7 guacd 编译);目录整理 deploy/(交付物)↔ devtools/(开发验收工具);deploy-manual.md 按方案重写。 - 打包入口去 Docker 化 + 无默认值原则(2026-09-09,用户提出:不是每台开发/运维机都有 Docker,且即使有也不该被隐式使用):①入口脚本零依赖——
build-package.sh去掉 Docker-first 引导改为直接执行;build-package.bat重写为探测 WSL(优先)→ Git Bash(次选)→ 均无给安装指引,失败 pause 防双击闪退;修复 bat 编码(UTF-8+LF 在中文 cmd 按 GBK 解析会吃换行导致语法崩坏,转 GBK+CRLF)与核心脚本 set -e 下无 git tag 时git describe退出 128 静默致死(连 --help 都打不出)两个必死 bug。②交互问答逐项显式选择、零默认值([1/5] 目标 OS 无默认回车、[2/5] 构建方式仅展示工具链检测不推荐、[3/5] 交付形态、[4/5] Agent 形态、[5/5] 门禁全显式);CI/无人值守必要参数缺失直接报错清单。③Docker 永不隐式使用:跨 OS 打包容器重入须交互确认(或新增--use-docker显式启用),非交互无此参数即报错;门禁在宿主机执行一次(重入实例经 VELA_GATE_DONE 跳过,且补 VELA_REENTRY 防重入环境不匹配死循环);deploy-manual/deploy-README 同步。 - 打包链路交互实测收敛(2026-09-09,用户双击实测):①bat 宿主探测补第三级兜底——
where bash.exe在双击环境(纯 Windows PATH)不可见(fnm/mSys 条目只在交互终端存在),改为从where git.exe反推 Git 根目录取..\bin\bash.exe,覆盖D:\software\git\Git等自定义安装路径(以干净 Windows PATH 模拟双击实测通过);②ci.sh 全量门禁增加工具链预检(缺 java21/mvn/node/go 时 [CI-NOTE] 明确指引:装工具链或门禁降级,并提示"版本管理器安装的工具仅在交互终端可见");③打包菜单构建方式检测处即时提示缺失项;④选完目标 OS 立即环境适配预警(本机≠目标且无 Docker → 三选一指引 + y/n 是否重选,不再答完五问才撞墙);实测确认物理边界——离线包含目标 OS 的 rpm/deb 快照与按目标编译的 guacd,必须在目标 OS 环境生成,Windows+无 Docker+非 WSL 只能走同版本 Linux 机器/虚拟机/云主机(零 Docker)或装 Docker(届时仍须交互确认)。
2026-09-09 打包交付体系·可降级离线包(两段式 + 部分包 + 部署端逐组件降级)¶
- 背景(用户提出):本地无 Docker 且目标 CentOS 7 时不该被卡死——"把本地不能做的工作改成目标机器联网进行";离线包从"要么全量要么没有"改为"有什么用什么",部署端探测本项目离线包逐组件降级。
- 打包端四路环境自适应:
--stage snapshot(两段式阶段B:在目标 OS 机器只生成依赖快照到 delivery/snapshot-<目标>/,含 CentOS 7 guacd 编译)、--snapshot-dir <目录>(阶段A 注入快照合成,跳过本机环境限制,与 --partial 互斥校验)、--partial(部分包:跳过 rpm/deb 快照与 guacd 编译,JDK/FFmpeg 静态等 OS 无关件照常进包);交互在环境不适应处四选项显式选择(容器重入/两段式/部分包/退出),CI 非交互缺方案给全量指引报错;快照拆分 snapshot_pkgs/snapshot_guacd/snapshot_os_free;包内 README.txt 动态组件清单(各件 含/缺 标注 + 部分包横幅);build-report 记打包方案;修复 menu() 非 tty 无条件报错 bug(全部必要参数显式给出时应放行,CI 无需 --menu-answered)。 - 部署端探测离线包 + 逐组件降级(deploy.sh):resolve_offline 重写——显式 --offline=强离线(缺组件报错点名);自动探测(脚本旁 offline/ → 上级 ../offline 自解压布局 → /opt/offline → $VELA_OFFLINE_DIR)有包即混合模式(包内优先、缺件联网:平台依赖/JDK/guacd/FFmpeg/前端逐件独立判断);--online 强制在线;无包纯在线。自解压壳不再强制传 --offline;acme 签发仅强离线拒绝;deploy_web 补 $OFFLINE_DIR/web 候选。
- CentOS 7 EOL 落地修复:两脚本 fix_centos7_repos——仅当 yum 源不可用时改写官方 repo 指向 vault.centos.org + EPEL archives(epel-release 直连补装,不动自定义内网源),解决"全新 CentOS 7 yum 装不了任何东西"(此前 centos7 容器/机器快照与在线部署实际都是坏的);依赖快照 CentOS 7 改 mariadb-server(base 无 mysql-server);deploy.sh 适配 SVCMYSQL=mariadb/MYSQL_PKG/mysql_server_installed(mysqld|mariadbd|rpm 多路探测)。
- 验证(Windows 零 Docker 环境非 tty 回归):bash -n 双脚本通过;--help 新参数齐全;--stage 宿主不匹配报错(unknown≠centos7);无方案 CI 报三选一指引;--snapshot-dir×--partial 互斥拦截;--partial 全链路出 94M 自解压单文件(exit 0,README 清单正确标注 快照缺/JDK含/guacd缺/FFmpeg含);--snapshot-dir 注入 rpms+guacd 成功且自解压壳不再含 --offline;测试伪造物已清理。部署端交互路径与 CentOS 7 真机路径待目标机实测。
2026-09-09 快照闭包正确性 + 包级校验(补强第 ① 项;第 ② 项 CI 矩阵因依赖 GitHub 明确不做)¶
- 快照闭包修复(此前是 bug:apt 只抓一层 Depends、深层依赖必然漏装;yum --downloadonly 失败被
|| true静默吞掉,抓出 0 个包也不报错):apt 改apt-get -s --reinstall --no-install-recommends --print-uris由 apt 自身解析完整依赖树(--reinstall 保证宿主已装包也入快照,快照与宿主状态无关);rpm 改 dnfdownload --resolve --alldeps(完整闭包含弱依赖)/ CentOS 7repotrack(yum-utils),抓取工具不可用时退回 downloadonly;关键包自检(BASE_PKGS+FEATURE_PKGS 逐包 glob 校验,缺包点名报错不静默)。 - 包级 MANIFEST:打包端快照后生成
offline/MANIFEST.txt(每包 sha256,含两段式注入件);部署端offline_pkg_install装前逐包校验(完好静默、损坏点名 FAILED;旧包无清单自动跳过);顺带修 debian 离线安装顺序 bug(dpkg -i *.deb不处理事务排序,改dpkg --unpack全部 +dpkg --configure -a内部解决依赖顺序)。 - 注入即全量校验:
--snapshot-dir注入后校验 OS 绑定件齐备(平台依赖快照 + CentOS 7 guacd),缺件点名报错并给出重新执行阶段B的命令(JDK/FFmpeg 等 OS 无关件仍由本机补齐下载)。 - 验证(Windows 非 tty):bash -n 通过;sha256sum -c 校验逻辑实测(完好静默/篡改点名);--partial 全链路仍绿(空清单 MANIFEST 正常生成);不完整快照注入 → 点名缺 guacd + 阶段B命令;完整快照注入 → MANIFEST 含
rpms/nginx-*.rpm条目 exit 0。测试伪造物已清理。
2026-09-10 配置分层(补强第 ③ 项;改配置不改脚本)¶
- deploy.conf 站点配置:deploy.sh 自动加载脚本同目录
deploy.conf(或VELA_DEPLOY_CONF指定);优先级 命令行参数 > 环境变量 > deploy.conf > 脚本内默认(conf 内写法VELA_X="${VELA_X:-值}"使已 export 的环境变量自然优先);语法错误部署中止(不允许静默忽略)。新建deploy/deploy.conf.example模板(全注释零覆盖,键名+默认值+用法说明)。 - 硬编码点全量参数化(22 个键):路径(APP_DIR/STORAGE_ROOT)、端口(后端 8080/guacd 4822/MySQL 3306——nginx proxy_pass、vela-env SERVER_PORT、guacd systemd 单元、vela.cnf port、冒烟/升级健康检查/部署报告全链路打通)、内存预算曲线(下限/演示档上限/JVM 比例与封顶/MySQL 比例与封顶)、Nginx(上传体/代理超时)、备份(cron/保留天数/logrotate 份数)、证书(巡检 cron/acme cron/自签年限)。顺带修正:backup.sh 加
-P"$VELA_DB_PORT"(自定义 MySQL 端口时原脚本会连错端口)、nginx/backup/logrotate 模板中写死的 /opt/velasim 改用 $APP_DIR。 - 打包端随包定制:
build-offline-package.sh --deploy-conf <文件>(校验存在性;Docker 形态互斥拒绝)——tar/single 形态放入 deploy.sh 同目录(自解压后自动加载)、dir 形态放 offline/ 根;容器重入时仓库内路径自动映射 /work 透传,仓库外路径警告跳过;包内 README 组件清单标注 conf 含/无。 - 验证(Windows 非 tty):bash -n 双脚本;conf 语义实测(无 env conf 生效 / 有 env env 优先 / 模板零覆盖可加载);不存在的 conf 与 Docker 形态互斥均正确拒绝;--partial+--deploy-conf 全链路出包,自解压载荷实测含 deploy/deploy.conf(内容正确)+ offline/deploy.conf,tail+tar 复验包体完整无损。deploy.sh 的 conf 加载与端口全链路(systemd/nginx/mysql/冒烟)待目标机实测。
2026-09-10 完整性与 SBOM(补强第 ④ 项;零 Docker)¶
- 包内整体校验:bundle 组装时生成
offline/SHA256SUMS.txt(覆盖 jar/安装器/deploy.conf/前端/agent/README/SBOM;rpm/deb 由 MANIFEST 逐包覆盖,此处跳过省时);deploy.sh 在 resolve_offline 探测到包后自动校验(自解压/压缩包布局:SCRIPT_DIR/../offline 含清单即验;目录形态/旧包自动跳过),损坏或被改动 → 点名拒装。修复自引用 bug:重定向先创建空 SHA256SUMS.txt 被 find 列进清单 → 清单哈希自身导致永远 FAILED,排除^offline/SHA256SUMS\.txt$。 - GPG 签名:
--sign-key <gpg密钥ID>(校验 gpg 存在与私钥可用;显式启用无默认)→ 各交付物 + 交付级 SHA256SUMS.txt 生成 .asc 分离签名;公钥线下分发,目标机gpg --verify后运行(运行前验证,符合"先验签再执行"惯例;包内 README 写明工作流)。 - SBOM:write_sbom 生成
offline/SBOM-cyclonedx.json(CycloneDX 1.4 组件级清单:metadata 目标 OS/构建方式/全量或部分 + 组件 jar/前端/JDK/guacd/FFmpeg/快照包逐包/agent/Docker 镜像);后端 Maven 传递依赖 deep SBOM 路径写入说明(cyclonedx-maven-plugin)。 - 验证(Windows 非 tty):bash -n 双脚本;python json.tool 确认 SBOM 合法;载荷提取后模拟部署端校验——完好包静默通过、篡改 jar 点名 FAILED;--sign-key 假密钥正确拒绝(本机 gpg 存在,私钥校验生效)。测试伪造物已清理。部署端 verify_package_integrity 交互与真机路径待目标机实测。
2026-09-10 下载多源兜底(用户实测 JDK 下载卡死 404 → 国内镜像修复)¶
- 问题实测:交互出包时 JDK 从 download.java.net 下载卡死(curl 挂 2 分钟 0 字节)后 404 失败;华为 Adoptium 直连 curl 返回 HTML 镜像浏览页假 200(12KB 错误页被当成功文件入包——双重 bug)。
- fetch_url 多源下载器:
$1=目标 $2=归档类型(gz|xz|any) 其后为候选 URL 依次尝试——.part 临时文件防中断留半成品、--connect-timeout/--retry/-m 1800 防无限挂起、归档有效性校验(tar -tzf/-tJf,HTML 错误页直接判失败换源);green_install 与快照下载(JDK/FFmpeg/guacamole)全部接入。修复local dst="$1" tmp="$dst.part"同语句内自引用在 set -u 下 unbound variable 的 bash 陷阱。 - 镜像矩阵(全部 curl HEAD/GET 实测后收录):JDK Adoptium→清华 TUNA(21.0.12.1,华为假 200 剔除);Maven→华为 apache(清华 403/阿里 404 剔除);Node→华为 nodejs + npmmirror(302 跟随 ✓);Go→阿里 golang(华为 401 剔除);guacamole 源码→清华 apache ✓;epel-release rpm→阿里 epel-archive ✓(deploy.sh 与打包脚本同步)。johnvansickle FFmpeg 静态无国内镜像,超时后 warn 不阻断(部署机联网兜底)。
- 验证:bash -n;部分包全链路真实下载 198M JDK(清华源,tar 完整性 ✓,包 291M/交付目录 842M);多源切换日志实测(官方 404 → 切换清华);已清测试物、保留真实 jdk-21.tar.gz 供后续运行复用。
2026-09-10 下载链路实测第二轮(TLS 吊销/set -e 链/超时粒度)¶
- Windows schannel TLS 吊销检查被墙:johnvansickle 下载报 CRYPT_E_REVOCATION_OFFLINE——fetch_url 增加按运行环境探测(curl --version 含 schannel 时附加
--ssl-revoke-best-effort,Linux curl 不识别该参数故不附加);实测 TLS 错误消除,但 johnvansickle.com/GitHub(BtbN FFmpeg-Builds)从本机完全不可达(连接超时),FFmpeg 静态暂无国内镜像。 - set -e 下 && 链陷阱:ffmpeg 下载失败后
[ -f ] && tar xJf && tar -czf链求值为假被 set -e 杀掉(warn 本应不阻断)——改为 if 块显式容错;deploy.sh 在线 FFmpeg 分支硬编码 dnf 改 $PKG(CentOS 7 无 dnf,兜底路径必坏),RPMFusion el7 归档指引写入报错。 - 单次尝试限时:fetch_url 增加 $3 单次最大秒数(默认 1800);TLS 握手挂起不受 connect-timeout 管,国际不可达站点会拖 30 分钟——FFmpeg 调用传 120s 快速失败。实测全链路 5m36s 完成(此前 600s 超时被中断)。
- 验证:真实部分包产出 291M 自解压单文件(真实 JDK 198M + jar + web),README 正确标注【部分离线包】+ FFmpeg 缺(部署机需联网补装);产物保留供目标机实测。FFmpeg 静态补齐路径:能访问国际网络的机器下载后按 README 手工补放,或后续找国内镜像。
2026-09-10 构建物时间戳归档 + cache 复用 + set -e 嵌套块坑¶
- 每次构建独立目录(用户提出:构建物被覆盖丢历史):产物统一进
delivery/builds/<版本>-<时间戳>/(自解压/压缩包/offline/SHA256SUMS/打包报告,签名与 agent 独立包同步归位),历史构建永不覆盖;既有产物已迁移(291M 包 → builds/0.1.0-20260910-0051/,JDK → cache/)。 - OS 无关件缓存:JDK 21 tarball / FFmpeg 静态下载进
delivery/cache/,快照时拷贝进本次构建目录——跨构建复用,198M 不重复下载(实测第二、三次构建零下载)。 - set -e 嵌套块 && 链坑(bash -x 实测定位):
[ -f ] && cp作为 if 块体/函数体内最后一条语句时,左值失败的状态会冒泡触发 set -e(豁免只保护语句级 && 链)——快照缓存拷贝处中招(此前同类坑已在 ffmpeg 解压处修过一次,本次重构缓存时重犯);全脚本此类模式(DEPLOY_CONF/WEB_DIR 拷贝等)统一改为显式 if 块。 - 验证:exit 0 全链路——builds/0.1.0-20260910-012142/ 含 291M 自解压 + offline(MANIFEST/README/SBOM/jdk/web)+ SHA256SUMS + build-report;历史目录并存不覆盖。
2026-09-10 绿色安装平台感知修复(Windows 打包机 Exec format error)¶
- 根因:green_install 硬编码 linux-x64 构建——用户在 Windows 打包机答 y 装 Node 得到的是 Linux ELF 二进制("cannot execute binary file"),工具链检测永不通过。这也是用户交互跑本机构建在"本机构建..."处无提示失败的疑点(此处另需用户确认当时是否答 n)。
- 平台感知:新增 IS_WINDOWS 探测(uname MINGW/MSYS);JDK/Node/Go 按平台取构建(Windows: 华为 Adoptium win zip / 华为+npmmirror node win zip / 阿里 golang win zip——全部 HEAD 实测收录;Linux 保持原列表);green_install 增加 zip 类型支持(unzip + 内层目录落入目标子目录 jdk/、nodejs/、go/)。
- 历史安装挂接:detect_toolchain 自动挂接 ~/.vela-tools 的 bin/(Linux 布局)与 jdk/、nodejs/(Windows 布局)到 PATH——绿色安装过一次后重跑不再重复询问。
- 预装就位:本机 ~/.vela-tools/nodejs 已装 Windows Node v20.19.0(实测 node/npm 可执行);用户双击环境下 java21+mvn 系统可见、node 由挂接补齐——本机构建全程无询问。
2026-09-10 双击窗口不消失 + 控制台日志落盘(用户提出:成功后窗口直接关、无法回看)¶
- bat 成功也 pause:build-package.bat 尾部改为无论成败都 pause——成功显示"打包完成(退出码 0)"并指向日志与构建报告,失败保留原错误提示;编码纪律保持 GBK+CRLF(tr -d '\r' 重排 + sed 回写 CRLF + iconv 转 GBK 回验)。
- package-last.log:build-offline-package.sh 启动即
exec > >(tee >(sed 剥离 ANSI > delivery/package-last.log)) 2>&1——控制台全程落盘(终端保留颜色、文件内无乱码),双击窗口关闭后随时回看;每次运行覆盖为"最近一次"。 - 验证:失败路径(--stage 宿主不匹配)日志含完整 [PKG-ERR] 且无 ANSI;成功路径 exit 0 日志尾部含 打包完成 + 目标机安装指引。
2026-09-10 控制台可读性收敛 + 构建清单(用户:输出乱、缺最终清单;交互全流程首次跑通)¶
- 交互全链路首次成功(用户实测):本机构建(Node 免询问自动挂接)+ Java agent ×2 + 自解压 338M,bat 成功提示与日志指引生效。
- 构建清单:print_manifest 结束回显(控制台 + 写入 build-report,ANSI 剥离):后端 jar(含来源与体积)/前端 dist/平台依赖快照/JDK/guacd/FFmpeg/Agent/deploy.conf/交付形态/完整性与 SBOM——逐项 ✓/✗ 及未构建原因与兜底方式。修 pipefail 赋值陷阱(
pkgs_n=$(ls...|wc -l)无匹配时 ls 退出 2 经赋值触发 set -e)。 - 控制台只留摘要:npm install / npm run build 输出进本次构建目录(npm-install.log / build-frontend.log),控制台仅"前端构建完成: built in 48.75s"与 chunk 提示;实测整场日志从 200+ 行收敛到 34 行、零 vite 逐文件清单。
2026-09-10 交付物完整性保证(用户提出:构建物必须成功、安装脚本必须进包)¶
- 前端 dist 硬性校验:resolve_artifacts 由"缺失仅告警"改为缺失或缺 index.html 一律拒绝打包(不允许产出页面 404 的包),报错给出构建指引;负向实测两条路径(目录不存在/空目录)均正确拦截。
- 安装器存在性检查补齐:bundle_tar 与 bundle_selfextract 对齐(缺 deploy.sh 报错);agent 安装脚本(install-agent-go.sh / install-host-agent-cs.bat)缺失即报错(主包与 --agents-only 两处)。
- 集群侧运维脚本随包:deploy.sh 部署指引引用的 scripts/cluster/(samba_mount/disk_check/sync_nis_user/vnc_session + README)此前根本未进交付物——现在 jar 形态自动打入 offline/scripts/cluster/,缺失报错。
- 验证:载荷清单实测——deploy/deploy.sh、agents 双 jar、scripts/{agent-go,host-agent,cluster}/ 全套随包;负向路径(无 dist/无 index.html)正确拒绝;MANIFEST 计数 awk 化后不再断行。
2026-09-10 目录重构(built/)+ CentOS 7 真机实测修复轮(华为云 ECS)¶
- 目录重构(用户提议):项目根
built/收纳构建相关资产——打包工具/三平台入口/ci.sh/门禁模板/deploy.conf.example/prebuilt(预构建小件:guacd/FFmpeg 随 git,JDK 太大不进 git 走 cache+网络;拾取优先级 --snapshot-dir > prebuilt > cache > 现场);deploy/只留交付物(deploy.sh/deploy-docker.sh/docker/scripts)。全部路径引用更新(bundle 安装器/集群脚本/agent 脚本/Dockerfile 改 $REPO_ROOT/deploy/,bat 双入口改 built/ 且保持 GBK+CRLF,ci.sh 语法扫描覆盖 deploy+built);本地全链路从 built/ 实测 exit 0。 - 真机实测抓出的 yum 兼容性坑(华为云 CentOS 7.6 ECS):①
yum install --resolve是 dnf 选项,yum 3.4.3 直接命令行报错——原先静默|| true吞掉导致空快照;改为纯--downloadonly(yum install 事务本身就是完整闭包)。②yum install --downloadonly跳过已安装的命名包——补reinstall --downloadonly双通道。③第三方源(docker-ce-stable)不可达拖垮无过滤 makecache——所有 yum 操作只启用所需四源(base/updates/extras/epel),完全不碰自定义源配置;仅当 repo 文件仍是官方 mirror.centos.org 模板才改写(自定义镜像保持不动,消除"已切换"虚假告警)。④os-release 的VERSION="7 (Core)"覆盖脚本版本变量——改为选择性 eval 只取 ID/VERSION_ID。⑤离线装包rpm -Uvh对已装同版本报错——改 yum/dnf localinstall(幂等)。⑥服务器出口网络抖动——构建改 setsid 分离运行 + 短连接轮询,SSH 断连不影响。 - 镜像可达性实测(服务器视角):vault.centos.org 403 不可达;阿里 centos-vault/epel-archive 200;johnvansickle 200(FFmpeg 有望拿全);download.java.net 000;guacamole 源补华为 apache 第三备源。
2026-09-10 CentOS 7 真机部署实测(华为云 ECS 7.6,全天攻坚收口)¶
- 全链路打通:全量包 494M(273 包 rpm 完整闭包 + guacd 编译 + JDK 198M + FFmpeg 40M + 前端 + 校验链)→ 服务器部署 → 后端 UP、登录接口响应正常、前端 200、47/47 Flyway 迁移成功、MariaDB 10.6.28。部署侧全部组件 active。
- 真机抓出并修复的关键 bug:①CRLF 的 deploy.sh 在 Linux 上
set -o pipefail报 invalid option(.gitattributes 全仓库行尾纪律锁定);②MariaDB 5.5 无法运行应用 schema(DATETIME DEFAULT CURRENT_TIMESTAMP)——快照改用 MariaDB 10.6(官方 rhel7-amd64 源,临时 repo 文件不改系统配置),部署端检测 5.5 自动离线升级 +mariadb-upgrade系统表迁移;③V29 种子迁移 H2 方言(DATEADD×53、SYSTEM_RANGE)→ 转 MySQL 语法(DATE_SUB/DATE_ADD、递归 CTE);④V39--(注释缺空格(MySQL 要求--后跟空白)→ 补空格;⑤ExecStart 用 shell 默认值语法${VELA_JAVA_OPTS:--Xms...}(systemd 不支持:-)→ 默认值写 vela-env;⑥JDBC URLcharacterEncoding=utf8mb4(Connector/J 不认)→ UTF-8;⑦生产 fail-closed 密钥(AES/connect-token/agent/host-agent token)deploy.sh 未生成 → 自动生成写 vela-env;⑧systemctl reload nginx偶发挂死 → 全部 systemctl 调用加timeout -k 5;⑨yum 3.4 不支持--resolve(dnf 专属);⑩os-release 的 VERSION 覆盖脚本版本号 → 选择性 eval;⑪install --downloadonly 跳过已装包 → reinstall 双通道 + repotrack 完整闭包。bash 4.2 的 set -e 函数返回边界幽灵:strace 证实脚本自退 1 而非被杀——加 return 0 规避并记录。 - 预构建入库闭环:guacd-centos7.tar.gz(5.8M)+ ffmpeg-static.tar.gz(40M)已回传
built/prebuilt/——以后任意打包机零 CentOS 7 环境可合全量包(FFmpeg 死结永久解除)。 - 服务器处置:部署保留运行(admin/VelaSim@2026 可验收);操作痕迹已清(/root/vela-build、/opt/vela-delivery、/tmp 工作物);旧平台目录与 yum 源配置零改动(华为云预置镜像保持原样);MariaDB 已升 10.6(回退需手工,如需可后续处理)。
2026-09-14 远程 238 处置 + 网盘去桌面耦合 + V50 授权可见性/双通道盘符(全量已上线)¶
- host-agent 401 处置:Windows 主机(192.168.0.121,阿里云 Windows ECS)agent 服务进程启动早于
setx /M VELA_HOST_AGENT_TOKEN生效,进程环境快照回退 dev 默认 token → 平台调用全 401。重启服务即恢复(两边机器级 token 本就一致)。教训:改机器环境变量必须重启服务;探测手段=GET / 带两个 token 看 404/401。 - 网盘回归 platform 模式(纠正 direct 耦合):direct 把网盘根绑到 /home/{账号},无桌面绑定用户没有家目录 → 网盘/云超算联动全断(注册可用是不变式)。回归 platform(根={storage.root}/netdisk/{userId},上传自动建根、列表对缺失根优雅返回空);桌面 O: 同树由「Samba 共享指向网盘根」实现——samba_account.sh/sync_nis_user.sh 增可选 home_dir 参数(平台经同步 op 传入,sudoers 放宽一个参数,已存在账号 usermod -d 重指向);数据已迁回。direct 保留为「集群共享盘一体化」形态。
- 注册即开通集群账号(direct 形态主线):UserCreatedEvent(active 标记,UserService.create/AuthService.register 发布;待审核不触发,审核后管理员重置密码的改密事件收敛开通)→ UserProvisionListener(开关
vela.desktop.samba.user-provision-enabled默认 false)→ provision:{userId} 组 SAMBA_CREATE(host_id NULL)→ 派发器按 netdisk 模式解析家目录(platform/direct 双形态,POSIX 路径显式输出)。 - V50 主机授权可见性 + 双通道盘符:desktop_host 增 visible_scope(tenant=租户内可见/entitled=仅绑定账号用户可见,分配表 desktop_host_account 驱动列表与连接校验 fail-closed——主流 DaaS 授权制)与 drive_channel(smb=SMB 挂载/rdpdr=Guacamole RDP 盘符重定向)。rdpdr 主机:SAMBA_/WIN_DISK_ 待办 SKIPPED、Guacamole 连接参数注入 drive-path=连接用户网盘根(drive-name=PERA 云数据、create-drive-path=true,guacd 以 root 运行可直接读写)。前端编辑对话框加两字段。238 上主仓主机已配 entitled+rdpdr(SMB 客户端故障主机的逃生通道,零主机改动)。
- 测试:UserProvisionLifecycleTest 2/2、HostVisibilityChannelTest 2/2(rdpdr 跳过 + entitled 授权可见)、DesktopMountLifecycleTest 12/12(重试用例 next_retry 置过去 1 秒修微秒级竞态)、LocalSambaOpsExecutorTest 3/3;全量 mvn 绿。
- 运维修复:平台机 11:03 意外重启后 mariadb 未自启致后端循环失败 →
systemctl enable mariadb;平台机已装 pywinrm/smbclient(远程运维通道)。 - 遗留边界(文档化):121 主机 SMB 客户端故障(内核级,net use 全部瞬时 67、零出站包,重启无效——同事机器暂不处置,改走 rdpdr);host-agent 新功能 StoreUserMapping(登录自动 O:,CreateProcessWithLogonW+cmdkey)代码入库、暂未部署(等 SMB 主机场景)。
2026-10-08 云应用「打不开」全链路诊断(层 2 / 112)¶
现象:工作台云应用「记事本」(shell 模式)启动后黑屏无内容,用户等待后关闭。
诊断链路(SSH 直连被挡,全程经平台云终端 WS 网关跳板 112 + sshpass 跳 Windows):
1. launch API / WS 隧道 / 域名反代全部正常(101 握手);RDP 登录成功(RDPDR user logged on)
2. Windows 会话内:shell 模式(initial-program=notepad.exe)下 userinit.exe 与 LogonUI 永久挂起——Windows Server 无 RDS 时 AlternateShell 字段「压制 explorer 但不启动目标程序」(黑屏根因 #1)
3. 换 remoteapp 模式 + initial-program=rdpinit.exe(社区验证的无域 RemoteApp 配方):rdpinit 作为外壳运行成功,但 RAIL 握手死锁——guacamole 流程严格等待服务器先发握手(MS 规范),rdpinit 等待客户端先发 → 20s 超时注销
4. 给 guacamole-server 1.5.5 打补丁(deploy/patches/guacd-rdpinit-proactive-handshake.patch):RDPDR USER_LOGGEDON 后延迟 8s 主动完成握手、拆发 Execute、最多 3 次重试;实测 rdpinit 收到握手(超时行为改变、存活延长)但 notepad 仍不启动——FreeRDP2↔rdpinit 的 Exec 通道不可用(rdpinit 零日志,无法进一步定位)
5. 根因 #2(最终):remoteapp 模式的 RAIL 参数使 guacd 开启 RemoteApplicationMode → FreeRDP2 能力协商声明 RAIL 支持 → Windows Server 2022 自动以 rdpinit 作为会话外壳(与 info 包 AlternateShell 无关)→ 无 RDS 环境下必然 20s 黑屏注销。判别实验:纯桌面连接(无应用参数)explorer 正常、全桌面健康
处置:
- 后端 GuacamoleTunnelSupport 回退(remoteapp 不再自动发 rdpinit),注释更新为实测行为
- deploy.sh 源码构建路径接入补丁(仅 initial-program=rdpinit.exe 时激活,其余连接零影响);补丁保留为实验性能力,将来 RDS 环境或补丁成熟后启用
- 线上「记事本」应用下架(无域/RDS 环境无可用单应用模式)
- 结论:无 RDS/域环境,云应用单窗口形态不可用;云桌面(整桌面)为唯一可用形态。产品定位建议:云应用=整桌面快捷入口,RemoteApp 标注「需 RDS/域」
- 运维教训:guacamole-server make install 会覆盖 deploy.sh 定制的 guacd.service(User=vela → 变 daemon,home 不可写致 FreeRDP 证书写入失败 = 安全协商失败)——deploy.sh 流程在 make install 后重写单元文件,顺序正确;手工重建时须同步恢复