From 2cbb98f09cb67bf1c77ffe44cbd48117ebdd6f3b Mon Sep 17 00:00:00 2001 From: chengma Date: Sun, 9 Aug 2026 16:32:12 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E5=BD=92=E6=A1=A3=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?#56?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/task/56-修复拖选密码时弹窗意外关闭.md | 61 ++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 docs/task/56-修复拖选密码时弹窗意外关闭.md diff --git a/docs/task/56-修复拖选密码时弹窗意外关闭.md b/docs/task/56-修复拖选密码时弹窗意外关闭.md new file mode 100644 index 0000000..20ecaa3 --- /dev/null +++ b/docs/task/56-修复拖选密码时弹窗意外关闭.md @@ -0,0 +1,61 @@ +# 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)