fix deactivate
This commit is contained in:
@@ -250,3 +250,36 @@ GOSUMDB=off GOFLAGS=-mod=mod` 就秒级完成。**
|
||||
### ⚠️ 新踩到的 gofmt 陷阱
|
||||
在**文档注释**里写 `''` 会被 gofmt 重排成 `”`(Go 1.19+ 的 doc comment 规范化:`` `` ``→`“`、`''`→`”`),
|
||||
导致 `gofmt -l` 反复报未格式化。**注释里避免使用 `''`**(改写为「空字符串」等文字)。
|
||||
|
||||
---
|
||||
|
||||
## 账号停用体验修复:独立成功页(/deactivated)
|
||||
|
||||
### 问题
|
||||
停用账号后 `DeactivateProfileAction` 把用户重定向到 `/login`,只在登录页顶部弹一条 flash。
|
||||
用户会觉得「被丢回登录页」,下意识以为操作没生效。
|
||||
|
||||
诊断结论:flash **确实渲染**(Flush 清 session 数据但保留 session,flash 能带到下一页),
|
||||
真正的体验错配是「停用后落点仍是登录页」——而账号已删/停,用户根本不可能再登录。
|
||||
|
||||
### 方案(用户选「独立成功页(推荐)」)
|
||||
1. `route/user/profile.go`
|
||||
- 新增公开 handler `DeactivatedProfile`:`ctx.SetTitle(i18n.T(ctx.Lang(), "deactivated.title"))` + `ctx.Success("user/deactivated")`。
|
||||
- `DeactivateProfileAction` 末尾 `ctx.Redirect("/login")` → `ctx.Redirect("/deactivated")`,**并移除原来的 `SetSuccessFlash`**(页面自身即提示)。
|
||||
- 顺手修正 `UpdateProfile` 里一处陈旧注释(原写「顺序与 DeactivateProfileAction 保持一致…随后跳登录页」,停用路径已不再如此)。
|
||||
2. `internal/route/route.go`:在公开区(`/explore` 旁)加 `f.Get("/deactivated", user.DeactivatedProfile)`。
|
||||
**必须是公开路由**:停用后会话已 Flush、`reqUserSignIn` 会把人弹回登录页,正是要避免的现象。
|
||||
3. 新建 `templates/user/deactivated.html`:复用 `question/success.html` 的范式(大 ✓ 图标 + 卡片 + 单按钮返回首页)。
|
||||
`templates/embed.go` 是整目录 `//go:embed ... user ...`,新模板**自动被嵌入**,无需改 embed 指令。
|
||||
4. i18n:四份字典都加 `deactivated.title` / `deactivated.desc` / `deactivated.backHome`
|
||||
(`TestDictionaryComplete` 要求 zh_cn/zh_tw/en/ja **键集合完全一致**,漏一份必挂)。
|
||||
同时**删除已无引用的 `admin.flash.deactivated`**(4 份字典同步删;删它不影响对齐组,因为该组最长键是 `admin.flash.blockWordsTooMany`)。
|
||||
|
||||
### 验证
|
||||
- `go build ./...` / `go vet ./...` EXIT=0;`go test ./...`(含本地 PG)**全绿**,
|
||||
其中 `internal/i18n`(键一致性)、`internal/route`、`templates`、`internal/template`(模板解析)均 ok → 新模板可被解析、键齐备。
|
||||
- gofmt 无 diff;行尾未变(4 份 dict + route.go 保持 CRLF,`route/user/profile.go` 实为 **LF**)。
|
||||
|
||||
### 备注
|
||||
- `route/user/profile.go` 的行尾是 **LF**(与「route/** 皆 CRLF」的旧印象不符,按文件单独确认即可)。
|
||||
|
||||
|
||||
@@ -44,8 +44,9 @@
|
||||
⚠️ `go env -w` 在本沙箱**会失败**(`cannot find go env config: %AppData% is not defined`,Git Bash 无该变量),
|
||||
无法持久化,只能每条命令 export。GROUP1(security/censor、conf、form、template、shared、captcha)已验证 EXIT=0(~10s)。
|
||||
- **行尾:仓库是「混合行尾」,不是统一 CRLF**(`core.autocrlf=true`,提交 blob 为 LF,Git 自动归一,**不污染 diff**)。
|
||||
实测:`internal/db/*`、`internal/mail/mail.go` 是 **LF**;`route/**`、`internal/route/route.go`、
|
||||
`internal/db/users.go` 是 **CRLF**。→ 编辑时**保持各文件原行尾**,不要整体转换。
|
||||
实测:`internal/db/*`、`internal/mail/mail.go`、`route/user/profile.go` 是 **LF**;
|
||||
而 `internal/route/route.go`、`internal/db/users.go`、`internal/i18n/dict_*.go` 是 **CRLF**。
|
||||
→ **不要按「route/** 皆 CRLF」这类规律推断**,编辑前逐个文件用 Python 数 `b'\r\n'` 确认。
|
||||
`gofmt -l` 会把 CRLF 文件**误报**为未格式化(false positive)。
|
||||
✅ 改注释/字段后统一用 `dev/gofmt_keep_crlf.py <files>`(原 Temp 版被清,已重建到 `dev/`):跑 gofmt 后按原文件行尾还原,
|
||||
既应用格式化又保留工作区 CRLF、避免 gofmt -l 噪声。(`grep -c $'\r'` 在 Git Bash 不可靠,查行尾用 Python 数 `b'\r\n'`。)
|
||||
@@ -122,6 +123,17 @@
|
||||
- ⚠️ `gofmt` 是 **Windows 原生程序,看不到 MSYS 的 `/tmp` 路径**(报 `GetFileAttributesEx ... cannot find`)。
|
||||
临时比对文件要放到 Windows 可见路径(如 `C:/Users/<user>/AppData/Local/Temp/...`)。
|
||||
|
||||
## 会话失效后的落点(闪信 vs 独立页)
|
||||
|
||||
- **终止性操作(账号停用/注销)用「独立公开成功页」,不要落登录页**。
|
||||
既有实现 `/deactivated`(`user.DeactivatedProfile` → `templates/user/deactivated.html`):
|
||||
停用后 `Session.Flush()` 会清空会话,若落 `/login`,用户第一直觉是「没生效」。
|
||||
→ 该路由必须注册在**公开区**(`reqUserSignIn` 之外),否则会被弹回登录页,正好复现要避免的现象。
|
||||
- **继续可登录的操作(如改密码后强制重登)才用闪信 + `/login`**:顺序 **先 `Session.Flush()` 再 `SetSuccessFlash()`**——
|
||||
Flush 只清 session 数据、保留同一个 session,故 flash 仍能带到下一跳渲染。
|
||||
- i18n 键名区分:`deactivate.*` = 停用**表单页**;`deactivated.*` = 停用**成功页**(仅 title/desc/backHome)。
|
||||
- `templates/embed.go` 用整目录 `//go:embed ... user ...`,**新增模板文件自动嵌入**,无需改 embed 指令。
|
||||
|
||||
## 仓库状态
|
||||
- **git 仓库已损坏**(`.git/refs` 缺失、index 截断、对象库近乎空),用户明确要求「不要动 git」。
|
||||
备份/回滚一律用 tar.gz(排除 `.git`、`.workbuddy`),放在项目同级目录:
|
||||
|
||||
Reference in New Issue
Block a user