# 56 Admin:修复拖选密码时弹窗意外关闭 - 类型:缺陷 - 父级大工单:#14 - 所属 MVP / 版本:#15 Admin 四模块可用闭环 - 状态:已完成 - 日期:2026-08-09 - Gitea 工单:http://ilaer.eicp.net:8418/chengma/cmautobuy/issues/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` 完成等价指针事件验证。 ## 相关提交 - `ff75b27` fix: 防止拖选内容误关闭弹窗 (#56)