2.8 KiB
2.8 KiB
56 Admin:修复拖选密码时弹窗意外关闭
- 类型:缺陷
- 父级大工单:#14
- 所属 MVP / 版本:#15 Admin 四模块可用闭环
- 状态:已完成
- 日期:2026-08-09
- Gitea 工单:#56
背景与目标
用户在密码输入框内按住鼠标拖选内容,移到弹窗外的灰色遮罩后松开时,浏览器会把
合成的 click 目标设为遮罩。原公共逻辑只判断最终目标,因而误关弹窗并丢失输入。
目标是区分“真正点击遮罩”和“从弹窗内容拖到遮罩”:前者继续关闭,后者保留弹窗 和输入内容。
最终方案
- 公共弹窗在
pointerdown时记录手势是否从遮罩本身开始。 - 最终
click只有同时满足“目标是遮罩”和“手势从遮罩开始”才关闭。 pointercancel清理记录,避免取消的手势影响下一次操作。- 带
data-modal-close的关闭/取消按钮仍直接关闭,Esc 行为不变。 - 该修复位于公共逻辑,对新增用户、重置密码以及其他公共弹窗统一生效。
- 增加静态回归守卫,并使用项目实际
app.js在 Chrome 中验证真实指针事件。
实际实现与建单方案一致,没有修改密码规则、表单提交、数据库或服务端接口。
改了哪些
admin/static/js/app.js:增加遮罩手势起点判断和取消状态清理。admin/main_test.go:增加公共弹窗拖选防误关闭的静态回归守卫。docs/admin/05-ui-specification.md:记录公共弹窗遮罩关闭的手势边界。
验收结果
| 验收标准 | 结果 |
|---|---|
| 从密码框拖到遮罩松开时弹窗保持打开 | 通过 |
| 拖选后输入内容保持不变 | 通过 |
| 直接点击遮罩仍关闭弹窗 | 通过 |
| 关闭按钮和取消按钮仍关闭弹窗 | 通过 |
| Esc 仍关闭弹窗 | 通过 |
| 公共弹窗统一使用修复后的逻辑 | 通过 |
| 不改变表单和服务端行为 | 通过 |
| Go 静态检查和全量测试通过 | 通过 |
| Go 1.23.0 构建和无缓存测试通过 | 通过 |
测试
- Chrome 真实指针事件:输入框内按下并拖到遮罩松开,弹窗和密码值保留; 遮罩直点、取消、叉号、Esc 分别验证仍能关闭。
- 执行的命令:
cd admin; gofmt -w main_test.go; go vet ./...; go test ./... - 执行的命令:
$env:GOTOOLCHAIN="go1.23.0"; go build ./...; go test ./... -count=1; Remove-Item Env:GOTOOLCHAIN - 结果:
go version go1.23.0 windows/amd64;浏览器回归、构建和所有测试通过。 - 没验证到的部分:未在用户当前浏览器和实际业务数据环境中人工操作;Chrome
已使用项目实际
app.js完成等价指针事件验证。
相关提交
ff75b27fix: 防止拖选内容误关闭弹窗 (#56)