出问题的页面 URL
https://www.synnovator.com/hackathon/opc-2026-shuzhi-w1
你用什么账号操作的?
testtest
复现步骤(一步一行)
1.进入活动页(任意可以报名或者提交的活动)
2.选择repo提交
3.下拉框中显示其他repo
期望看到 / 期望发生的事
repo 选择器应只显示当前用户可合法用于本次参赛/提交的仓库。
应该包含:
当前用户本人名下的仓库
当前用户所属组织、且当前用户有权限代表该组织参赛的仓库
不应该包含:
与当前用户无关的个人仓库
当前用户无权代表提交的其他仓库
如果某次报名已经绑定 repo,则提交阶段应进一步收敛为:
只显示该已绑定 repo
或只显示与该 registration 对应组织/个人身份一致的 repo
实际看到 / 实际发生的事
当前网页端 repo 下拉框存在两个相反方向的问题:
-
会出现不应出现的 repo
用户在下拉框里可以看到别人的 repo,这些 repo 不应作为当前用户的比赛提交候选。
-
不会显示自己组织的 repo
用户已经加入自己的组织,也希望用组织 repo 参赛,但下拉框里看不到该组织 repo。
这使得组织参赛路径在网页端实际不可用或非常混乱。
截图
No response
出现频率
每次都能复现
你在哪个环境测的?
线上 https://www.synnovator.com
浏览器 + 版本(可选)
No response
其他补充(可选)
- 页面模板只是渲染 UserRepos
repo 下拉框来自:
submit.tmpl (line 25)
view.tmpl (line 92)
模板本身没有复杂逻辑,只是把后端传入的 UserRepos 渲染出来。
- 后端当前查询条件偏向“当前用户个人 repo”
报名页和提交页加载 repo 列表时,使用了类似逻辑:
hackathon.go (line 277)
hackathon.go (line 482)
核心条件包括:
Actor = ctx.Doer
OwnerID = ctx.Doer.ID
Private = true
Collaborate = false
从页面意图看,这段逻辑更像是在取:
“当前用户自己的 repo”
但这就解释了为什么:
组织 repo 不会显示
因为组织 repo 的 owner_id 不是当前用户,而是组织
- 底层 SearchRepositoryCondition 又让语义变得不稳定
底层条件构造在:
repo_list.go (line 326)
这里 OwnerID、Actor、Private、Collaborate 的组合语义比较复杂,不完全等同于“只查 owner_id = 当前用户”。
所以当前实现可能同时造成两种问题:
一方面组织 repo 被排除在外
另一方面某些“当前用户可见/可访问”的仓库又被意外混入
也就是:
候选集既不完整,也不干净。
可能的根因
根因 1:页面使用了错误的仓库集合定义
比赛报名/提交页真正需要的是:
“当前用户可代表参赛主体提交的仓库集合”
而不是:
当前用户自己拥有的仓库集合
或当前用户一般可访问的仓库集合
根因 2:个人参赛和组织参赛没有拆开建模
当前页面 repo 下拉框没有清楚区分:
个人报名
组织报名
因此在组织场景下,候选 repo 的逻辑失真:
个人 repo 规则不适合组织参赛
通用 repo 搜索也不适合直接拿来当比赛候选集
建议修复方向
建议把 hackathon 报名/提交页的 repo 候选集改成显式按参赛身份构造:
报名阶段
如果用户以个人身份参赛:
只显示当前用户个人 repo
如果用户以组织身份参赛:
显示当前用户所属、且允许其代表参赛的组织 repo
提交阶段
如果 registration 已经绑定 repo:
只显示该 repo
或只允许在同一参赛身份范围内选择 repo
不建议
不要直接把通用 SearchRepository 结果作为比赛候选集直接渲染。
建议增加测试用例
用户只参加个人赛时,只能看到自己的个人 repo
用户加入组织后,可以看到自己组织的 repo
用户不会看到无关用户的个人 repo
用户组织报名后,提交页 repo 候选集与组织身份一致
已绑定 repo 的 registration,在提交阶段只显示或锁定该 repo
影响
这个问题直接影响:
组织参赛是否能顺畅进行
用户是否能正确理解平台权限和提交流程
比赛提交物归属是否准确
页面是否会误导用户选择错误 repo
从体验上看,当前状态会让用户产生两个困惑:
为什么我能看到别人的 repo?
为什么我自己的组织 repo 反而选不到?
出问题的页面 URL
https://www.synnovator.com/hackathon/opc-2026-shuzhi-w1
你用什么账号操作的?
testtest
复现步骤(一步一行)
1.进入活动页(任意可以报名或者提交的活动)
2.选择repo提交
3.下拉框中显示其他repo
期望看到 / 期望发生的事
repo 选择器应只显示当前用户可合法用于本次参赛/提交的仓库。
应该包含:
当前用户本人名下的仓库
当前用户所属组织、且当前用户有权限代表该组织参赛的仓库
不应该包含:
与当前用户无关的个人仓库
当前用户无权代表提交的其他仓库
如果某次报名已经绑定 repo,则提交阶段应进一步收敛为:
只显示该已绑定 repo
或只显示与该 registration 对应组织/个人身份一致的 repo
实际看到 / 实际发生的事
当前网页端 repo 下拉框存在两个相反方向的问题:
会出现不应出现的 repo
用户在下拉框里可以看到别人的 repo,这些 repo 不应作为当前用户的比赛提交候选。
不会显示自己组织的 repo
用户已经加入自己的组织,也希望用组织 repo 参赛,但下拉框里看不到该组织 repo。
这使得组织参赛路径在网页端实际不可用或非常混乱。
截图
No response
出现频率
每次都能复现
你在哪个环境测的?
线上 https://www.synnovator.com
浏览器 + 版本(可选)
No response
其他补充(可选)
repo 下拉框来自:
submit.tmpl (line 25)
view.tmpl (line 92)
模板本身没有复杂逻辑,只是把后端传入的 UserRepos 渲染出来。
报名页和提交页加载 repo 列表时,使用了类似逻辑:
hackathon.go (line 277)
hackathon.go (line 482)
核心条件包括:
Actor = ctx.Doer
OwnerID = ctx.Doer.ID
Private = true
Collaborate = false
从页面意图看,这段逻辑更像是在取:
“当前用户自己的 repo”
但这就解释了为什么:
组织 repo 不会显示
因为组织 repo 的 owner_id 不是当前用户,而是组织
底层条件构造在:
repo_list.go (line 326)
这里 OwnerID、Actor、Private、Collaborate 的组合语义比较复杂,不完全等同于“只查 owner_id = 当前用户”。
所以当前实现可能同时造成两种问题:
一方面组织 repo 被排除在外
另一方面某些“当前用户可见/可访问”的仓库又被意外混入
也就是:
候选集既不完整,也不干净。
可能的根因
根因 1:页面使用了错误的仓库集合定义
比赛报名/提交页真正需要的是:
“当前用户可代表参赛主体提交的仓库集合”
而不是:
当前用户自己拥有的仓库集合
或当前用户一般可访问的仓库集合
根因 2:个人参赛和组织参赛没有拆开建模
当前页面 repo 下拉框没有清楚区分:
个人报名
组织报名
因此在组织场景下,候选 repo 的逻辑失真:
个人 repo 规则不适合组织参赛
通用 repo 搜索也不适合直接拿来当比赛候选集
建议修复方向
建议把 hackathon 报名/提交页的 repo 候选集改成显式按参赛身份构造:
报名阶段
如果用户以个人身份参赛:
只显示当前用户个人 repo
如果用户以组织身份参赛:
显示当前用户所属、且允许其代表参赛的组织 repo
提交阶段
如果 registration 已经绑定 repo:
只显示该 repo
或只允许在同一参赛身份范围内选择 repo
不建议
不要直接把通用 SearchRepository 结果作为比赛候选集直接渲染。
建议增加测试用例
用户只参加个人赛时,只能看到自己的个人 repo
用户加入组织后,可以看到自己组织的 repo
用户不会看到无关用户的个人 repo
用户组织报名后,提交页 repo 候选集与组织身份一致
已绑定 repo 的 registration,在提交阶段只显示或锁定该 repo
影响
这个问题直接影响:
组织参赛是否能顺畅进行
用户是否能正确理解平台权限和提交流程
比赛提交物归属是否准确
页面是否会误导用户选择错误 repo
从体验上看,当前状态会让用户产生两个困惑:
为什么我能看到别人的 repo?
为什么我自己的组织 repo 反而选不到?