邮箱验证码重置密码(吊销 session);后台可配 SMTP 并发送测试信。 Co-authored-by: Cursor <cursoragent@cursor.com>
3.5 KiB
08 · Gitea 式 SSR 架构(开发约定)
读者:在本仓库
rebuild/gitea-ssr分支上开发的 AI / 开发者
前置:README.md
对照上游:go-gitea/gitea
目标栈(已确认)
| 层 | 选择 |
|---|---|
| 公开页渲染 | Go html/template 真 SSR |
| 浏览器写操作 | routers/web HTML 表单 POST + CSRF + PRG |
JSON /api |
仅机器客户端(OIDC 等);不服务已迁页面 UI |
| 渐进增强 | web_src/ → public/assets/ → /ssr-assets/ |
| 发布 | 单二进制 + go:embed |
| 业务语义 | 01–07;冲突时改代码并回写规格 |
| 不做 | React SPA、爬虫/用户双轨 HTML、为旧 SPA 保留死代码 |
分支
| 分支 | 用途 |
|---|---|
main |
React SPA 对照(git checkout / worktree) |
rebuild/gitea-ssr |
唯一重建分支 |
目录
routers/
setup.go
install/ # INSTALL_LOCK 未置位时的安装向导
web/ # HTML + 表单
api/ # 精简机器接口(health / OIDC / robots / sitemap / media)
modules/
webctx/ # Doer / CSRF / Flash / HTML / Redirect
auth/
webrender/
seo/
templates/
install.tmpl
post-install.tmpl
base/ home/ post/ shared/ status/ auth/ admin/ profile/ user/ favorites/ messages/
services/
web_src/ → public/assets/
已删除: frontend/、embed_static/、ServePublicSPA、爬虫双轨 HTML、首注册变管理员 bootstrap、app.ini、浏览器 JWT Cookie 登录。
配置: 引导 = CLI/Env(含 DB_*);运行时 = forum_settings 热更;.jwt_secret = App HMAC;OIDC PEM 启用时进 settings。详见 07-config-ops.md。
会话: Cookie jiang13_session → 表 sessions;可吊销。
数据库: GORM 方言 sqlite(默认)| postgres | mysql;连库失败不回落。
后置: Gitea 仓库同步(不启后台任务)。
安装
- 锁文件:
data/install.lock - 未安装:除
/install、/ssr-assets/*、/health外一律重定向到安装向导 - 管理员仅由安装向导创建;已有用户数据启动时会自动补写锁
- 向导不选库:库由启动 Env 决定
渲染与交互原则
- 已迁路径「查看源代码」须含内容 DOM。
- UI 读写不依赖
/api灌首屏或写操作(/compose/upload为同站表单辅助 JSON,带 CSRF)。 - 模板默认转义;
safeHTML仅用于消毒 + 门控后正文/评论 HTML。 - 未迁路径用
status/pending.tmpl或 404,不维护 SPA 占位语义。 - 会话 Cookie:
jiang13_session;SameSite=Lax;HTTPS 下Secure。
已迁路径(摘要)
公开写:/install、/login、/logout、/register、/forgot-password(发码/重置)、/compose(含门控插入)、/post/:id/edit、帖详情评论/赞/藏、积分解锁 POST /post/:id/unlock。
个人闭环:/profile(昵称/签名/密码/头像、积分钱包/签到/抽奖)、/user/:id、/favorites。
POST /profile/checkin、POST /profile/lottery(CSRF + PRG)。
私信:/messages、/messages/with/:peerId(系统 peer=0 只读;打开会话标已读)。
友链:/links(列表、登录申请/取消、Logo 上传);Admin /admin/friend-links(品牌增删、审核、入口开关)。
Admin:/admin/dashboard、/admin/boards、/admin/moderation、/admin/settings(品牌/限流/敏感词/SMTP)、/admin/friend-links。