AGENTS.md
30d8238
models.AgentDevice
AgentVersion
models/schema.go:35
web/src/router/index.js
constantRoutes
sys_menu
uploadfile
server/app/goauto/access/purchaser.go
casbin_rule
发版是极低频操作(一次发布点一次);更新的对象正是设备,与设备管理同域;且不新增菜单即可完全避开 sys_menu 记录、角色绑定与前端路由改造,不与尚未实施的 #137 / #138 产生耦合。
若日后抽屉内容过于拥挤,再拆为设备模块下的子页面,届时 #137 / #138 已完成,新增菜单成本更低。
沿用与 #127 相同的做法:用单例设置指向当前发布版本,而非在版本表上加 is_current 标记。单例天然保证「有且只有一个当前版本」,且回滚即把指针指回旧版本,无需删除记录。
is_current
version_code / version_name 一律从上传的 APK 中解析获得,不接受人工填写——人工填写必然出现与实际不符的情况,而版本比较依赖 version_code 的准确性。
version_code
version_name
agent_app_release
file_path
sha256
size_bytes
notes
created_by
created_at
agent_app_release_setting
OnDelete:RESTRICT
versionCode
versionName
web/src/utils/request.js
GET /api/agent/v1/app/latest
sizeBytes
access/purchaser.go
Purchaser: false
go test ./app/goauto/...
AndroidManifest.xml
Architecture-and-Code-Map
Android-Agent-API-Contract
Deployment-and-Operations
sync
sync --check
待实施(数据库迁移需实施前再次人工确认;界面需先取得设计证据)。
GoAuto #143 + #144 v1
image/svg+xml
设计确认后仍须用户单独明确授权 #143 的追加数据库迁移,才能进入生产实施。
用户于 2026-08-29 明确确认 #143 + #144 v1 标注稿,并授权 #143 按工单方案实施追加数据库迁移。现按设备页管理员抽屉方案实施;APK 下载保持鉴权,不新增菜单或心跳字段。
#143 + #144 v1
已按已确认的 #143+#144 v1 实施并推送,现转待验收。
实现:
提交:f0f5f5b;共享文档:1ec895b。 验证:相关 Go 单测及全量 Server 测试/build 通过;使用本仓库实际 debug APK 验证解析得到 versionCode 41、versionName 0.9.28;设备管理页定向 lint 和 Web 生产构建通过。 Wiki:API Contract 811176b77b923111b5ee972b421716ea224a3a96;Architecture d94641e4574e064395edb9da4b52b1a268925923;Local Dev 88cbef39a8744753021b82f2c97879db29e320d4。
边界:未执行数据库迁移、未上传 APK、未设置当前发布;这些属于迁移/发布动作,等待单独授权。
No dependencies set.
The note is not visible to the blocked user.
所属与来源
AGENTS.md「Gitea 交互与工单最小读取」记录回退原因。当前事实(提交
30d8238复核)models.AgentDevice已记录AgentVersion(models/schema.go:35),可用于展示各设备当前版本。web/src/router/index.js的constantRoutes;#137 / #138 尚未实施,sys_menu中没有 GoAuto 记录。uploadfile静态目录可承载文件。server/app/goauto/access/purchaser.go,由迁移写入casbin_rule并全量重建。目标
非目标
关键设计决定
一、不新增菜单,入口做在设备页内
发版是极低频操作(一次发布点一次);更新的对象正是设备,与设备管理同域;且不新增菜单即可完全避开
sys_menu记录、角色绑定与前端路由改造,不与尚未实施的 #137 / #138 产生耦合。若日后抽屉内容过于拥挤,再拆为设备模块下的子页面,届时 #137 / #138 已完成,新增菜单成本更低。
二、单例指针表达「当前版本」
沿用与 #127 相同的做法:用单例设置指向当前发布版本,而非在版本表上加
is_current标记。单例天然保证「有且只有一个当前版本」,且回滚即把指针指回旧版本,无需删除记录。三、版本号由服务端解析
version_code/version_name一律从上传的 APK 中解析获得,不接受人工填写——人工填写必然出现与实际不符的情况,而版本比较依赖version_code的准确性。实施方案
数据模型
agent_app_release:version_code(整数,比较用)、version_name(显示用)file_path(复用uploadfile目录)、sha256、size_bytesnotes(更新说明,可空)created_by、created_atversion_code唯一,避免重复上传同一版本产生歧义agent_app_release_setting单例表,指向当前发布版本;外键OnDelete:RESTRICT。服务端
versionCode/versionName,计算 SHA-256,落盘并入库。web/src/utils/request.js中被 #139 修复前的写法,前端上传须以 FormData 提交且不手写 Content-Type(见 #139)。GET /api/agent/v1/app/latest:走设备 token 鉴权,返回versionCode、versionName、下载地址、sha256、sizeBytes、notes。无发布版本时返回明确的空结果,不报错。权限
access/purchaser.go登记:Purchaser: false(管理员专属);Purchaser: false(采购员无需查看发版记录)。Admin 界面
安全边界
验收标准
versionCode/versionName并计算 SHA-256。version_code的重复包被拒绝。验证方式
go test ./app/goauto/...依赖、并行与风险
AndroidManifest.xml。缓解:实施时选定方案并在工单说明;解析失败必须明确报错,不得回退为人工填写版本号。文档影响
Architecture-and-Code-Map:版本发布模型与文件存放位置。Android-Agent-API-Contract:新增 Agent 版本查询接口。Deployment-and-Operations(若已存在):发版操作步骤与回滚方式。sync与一轮sync --check,把页面与 revision 写回本工单。状态
待实施(数据库迁移需实施前再次人工确认;界面需先取得设计证据)。
#143 + #144 v1 标注稿待确认(2026-08-29)
GoAuto #143 + #144 v1image/svg+xml)覆盖范围
设计确认后仍须用户单独明确授权 #143 的追加数据库迁移,才能进入生产实施。
用户于 2026-08-29 明确确认
#143 + #144 v1标注稿,并授权 #143 按工单方案实施追加数据库迁移。现按设备页管理员抽屉方案实施;APK 下载保持鉴权,不新增菜单或心跳字段。已按已确认的 #143+#144 v1 实施并推送,现转待验收。
实现:
提交:f0f5f5b;共享文档:1ec895b。
验证:相关 Go 单测及全量 Server 测试/build 通过;使用本仓库实际 debug APK 验证解析得到 versionCode 41、versionName 0.9.28;设备管理页定向 lint 和 Web 生产构建通过。
Wiki:API Contract 811176b77b923111b5ee972b421716ea224a3a96;Architecture d94641e4574e064395edb9da4b52b1a268925923;Local Dev 88cbef39a8744753021b82f2c97879db29e320d4。
边界:未执行数据库迁移、未上传 APK、未设置当前发布;这些属于迁移/发布动作,等待单独授权。