fix: 完成 Gitea 目录改组收尾(import、构建与 LICENSE)
同步包路径与路由,去掉 SPA 构建步骤,对齐 Gitea 式 LICENSE,并更新规格/规则与占位 SSR。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
> **读者**:实现与验收
|
||||
> **前置**:[01-product.md](01-product.md)
|
||||
> **交叉**:[05-business-rules.md](05-business-rules.md)、[06-pages-ux.md](06-pages-ux.md)
|
||||
> **源码对照**:[`frontend/src/App.tsx`](../../frontend/src/App.tsx)、[`router/router.go`](../../router/router.go)、[`README.md`](../../README.md)
|
||||
> **源码对照**:[`frontend/src/App.tsx`]((仅 main)frontend/src/App.tsx)、[`router/router.go`](../../routers/setup.go)、[`README.md`](../../README.md)
|
||||
|
||||
用复选框做验收;重构完成时应全部可勾选(或书面声明砍掉的功能)。
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
> **读者**:实现数据库与领域层的 AI
|
||||
> **前置**:[01-product.md](01-product.md)
|
||||
> **后续**:[04-api.md](04-api.md)、[05-business-rules.md](05-business-rules.md)
|
||||
> **源码**:[`model/models.go`](../../model/models.go)、[`model/oauth.go`](../../model/oauth.go)、[`model/gitea.go`](../../model/gitea.go)、[`model/level.go`](../../model/level.go)、[`model/db.go`](../../model/db.go)、[`model/user_view.go`](../../model/user_view.go)、[`service/settings.go`](../../service/settings.go)
|
||||
> **源码**:[`model/models.go`](../../models/models.go)、[`model/oauth.go`](../../models/oauth.go)、[`model/gitea.go`](../../models/gitea.go)、[`model/level.go`](../../models/level.go)、[`model/db.go`](../../models/db.go)、[`model/user_view.go`](../../models/user_view.go)、[`service/settings.go`](../../services/settings.go)
|
||||
|
||||
当前无独立 SQL migration;表由 GORM `AutoMigrate` 创建。新站可用正式 migration,但**字段语义应对齐**。
|
||||
|
||||
@@ -72,7 +72,7 @@ erDiagram
|
||||
|
||||
**非落库展示字段**:`level`(由 Exp 推导)、`badges`(附加)。
|
||||
|
||||
视图结构:`UserPublic` / `UserSelf` / `UserAdmin`(见 [`model/user_view.go`](../../model/user_view.go))。
|
||||
视图结构:`UserPublic` / `UserSelf` / `UserAdmin`(见 [`model/user_view.go`](../../models/user_view.go))。
|
||||
|
||||
### 2.2 boards
|
||||
|
||||
@@ -278,7 +278,7 @@ Metric:`tenure_days` | `likes_received` | `creator_income`
|
||||
|
||||
## 4. 等级(Exp → Level)
|
||||
|
||||
源:[`model/level.go`](../../model/level.go)
|
||||
源:[`model/level.go`](../../models/level.go)
|
||||
|
||||
| Level | 最低 Exp |
|
||||
|-------|----------|
|
||||
@@ -299,7 +299,7 @@ Metric:`tenure_days` | `likes_received` | `creator_income`
|
||||
|
||||
## 5. 内置自动徽章(seed)
|
||||
|
||||
源:[`model/db.go`](../../model/db.go) `seedDefaultBadges`
|
||||
源:[`model/db.go`](../../models/db.go) `seedDefaultBadges`
|
||||
|
||||
| code | 名称 | metric | threshold |
|
||||
|------|------|--------|-----------|
|
||||
@@ -317,7 +317,7 @@ Metric:`tenure_days` | `likes_received` | `creator_income`
|
||||
|
||||
## 6. forum_settings 键与默认值
|
||||
|
||||
源:[`service/settings.go`](../../service/settings.go)、[`service/permalink.go`](../../service/permalink.go)
|
||||
源:[`service/settings.go`](../../services/settings.go)、[`service/permalink.go`](../../services/permalink.go)
|
||||
|
||||
### 6.1 论坛限制
|
||||
|
||||
@@ -429,7 +429,7 @@ Metric:`tenure_days` | `likes_received` | `creator_income`
|
||||
|
||||
## 7. 升级兼容补丁(现网 InitDB)
|
||||
|
||||
[`model/db.go`](../../model/db.go) 在 AutoMigrate 后:
|
||||
[`model/db.go`](../../models/db.go) 在 AutoMigrate 后:
|
||||
|
||||
- 空 `status` 的帖/评 → `published`
|
||||
- 空 `post_type` → `normal`
|
||||
@@ -449,4 +449,4 @@ Metric:`tenure_days` | `likes_received` | `creator_income`
|
||||
<points-only data-cost="10">...</points-only>
|
||||
```
|
||||
|
||||
积分解锁 `block_key` = `sha256(innerHTML)[:16]`(hex),见 [`service/unlock.go`](../../service/unlock.go)。
|
||||
积分解锁 `block_key` = `sha256(innerHTML)[:16]`(hex),见 [`service/unlock.go`](../../services/unlock.go)。
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
> **读者**:实现后端 / BFF / 前端数据层的 AI
|
||||
> **前置**:[03-data-model.md](03-data-model.md)
|
||||
> **源码**:[`router/router.go`](../../router/router.go)、[`frontend/src/api/client.ts`](../../frontend/src/api/client.ts)、[`frontend/src/api/types.ts`](../../frontend/src/api/types.ts)、[`middleware/auth.go`](../../middleware/auth.go)
|
||||
> **源码**:[`router/router.go`](../../routers/setup.go)、[`frontend/src/api/client.ts`]((仅 main)frontend/src/api/client.ts)、[`frontend/src/api/types.ts`]((仅 main)frontend/src/api/types.ts)、[`middleware/auth.go`](../../modules/auth/auth.go)
|
||||
|
||||
不要求 OpenAPI YAML;以下表格 + JSON 形状即为合约。新站可加 `/v1` 前缀,但**字段名建议保持**以便对照迁移。
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
| GET/POST | `/oauth/userinfo` | Bearer | 用户信息 |
|
||||
| GET/POST | `/oauth/logout` | 视实现 | 登出 |
|
||||
|
||||
细节以 [`service/oidc.go`](../../service/oidc.go) / [`handler/oidc.go`](../../handler/oidc.go) 为准。
|
||||
细节以 [`service/oidc.go`](../../services/oidc.go) / [`handler/oidc.go`](../../routers/api/oidc.go) 为准。
|
||||
|
||||
---
|
||||
|
||||
@@ -356,7 +356,7 @@
|
||||
|
||||
## 7. 核心类型速查(与前端对齐)
|
||||
|
||||
详见 [`frontend/src/api/types.ts`](../../frontend/src/api/types.ts)。实现时至少对齐:
|
||||
详见 [`frontend/src/api/types.ts`]((仅 main)frontend/src/api/types.ts)。实现时至少对齐:
|
||||
|
||||
- `User` / `UserPublic` / `UserActivityStats`
|
||||
- `Board` / `PostItem` / `PostDetailResponse` / `Comment`
|
||||
@@ -373,4 +373,4 @@
|
||||
|
||||
中间件对未登录 / 过期 / 禁言返回 JSON error(并可能清 cookie)。前端统一 `throw new Error(data.error)`。新站应保持可区分的错误文案或错误码,避免前端无法提示。
|
||||
|
||||
源:[`middleware/auth.go`](../../middleware/auth.go)。
|
||||
源:[`middleware/auth.go`](../../modules/auth/auth.go)。
|
||||
|
||||
@@ -2,13 +2,13 @@
|
||||
|
||||
> **读者**:实现领域逻辑的 AI(最易「看起来像但算错」)
|
||||
> **前置**:[03-data-model.md](03-data-model.md)、[04-api.md](04-api.md)
|
||||
> **源码**:[`service/`](../../service/)、[`model/models.go`](../../model/models.go)
|
||||
> **源码**:[`service/`](../../services/)、[`model/models.go`](../../models/models.go)
|
||||
|
||||
---
|
||||
|
||||
## 1. 注册与引导
|
||||
|
||||
源:[`handler/handlers.go`](../../handler/handlers.go) `APIRegisterConfig`、[`service/auth.go`](../../service/auth.go)
|
||||
源:[`handler/handlers.go`](../../routers/api/handlers.go) `APIRegisterConfig`、[`service/auth.go`](../../services/auth.go)
|
||||
|
||||
| 规则 | 细节 |
|
||||
|------|------|
|
||||
@@ -41,7 +41,7 @@ stateDiagram-v2
|
||||
| 待审提醒 | 通知管理员(kind=`moderation`) |
|
||||
| 游客评论 | 通常直接或按实现进入审核;勿假设与登录用户完全相同 |
|
||||
|
||||
源:[`service/post.go`](../../service/post.go) `CanViewPost`、[`service/comment.go`](../../service/comment.go)。
|
||||
源:[`service/post.go`](../../services/post.go) `CanViewPost`、[`service/comment.go`](../../services/comment.go)。
|
||||
|
||||
---
|
||||
|
||||
@@ -68,7 +68,7 @@ stateDiagram-v2
|
||||
| 评论成功 | +2 |
|
||||
| 帖子被点赞 | +1(作者) |
|
||||
|
||||
源:[`service/post.go`](../../service/post.go)、[`service/comment.go`](../../service/comment.go)、[`service/badge.go`](../../service/badge.go) `AddExp`。
|
||||
源:[`service/post.go`](../../services/post.go)、[`service/comment.go`](../../services/comment.go)、[`service/badge.go`](../../services/badge.go) `AddExp`。
|
||||
|
||||
等级门槛见 [03-data-model.md](03-data-model.md) §4。管理员设 level 时应同步 Exp 到门槛值。
|
||||
|
||||
@@ -76,7 +76,7 @@ stateDiagram-v2
|
||||
|
||||
## 5. 内容门控(红action)
|
||||
|
||||
源:[`service/content.go`](../../service/content.go)、[`handler/api.go`](../../handler/api.go) `APIPostDetail`、[`service/unlock.go`](../../service/unlock.go)
|
||||
源:[`service/content.go`](../../services/content.go)、[`handler/api.go`](../../routers/api/api.go) `APIPostDetail`、[`service/unlock.go`](../../services/unlock.go)
|
||||
|
||||
### 5.1 出口顺序(详情)
|
||||
|
||||
@@ -148,7 +148,7 @@ stateDiagram-v2
|
||||
|
||||
## 7. 签到与每日抽奖
|
||||
|
||||
源:[`service/points.go`](../../service/points.go)
|
||||
源:[`service/points.go`](../../services/points.go)
|
||||
|
||||
### 签到
|
||||
|
||||
@@ -225,4 +225,4 @@ stateDiagram-v2
|
||||
| `board_pinned` | **不**抬升 | 抬升 |
|
||||
| `featured` | 标记展示,不一定改变排序 | 同左 |
|
||||
|
||||
具体 SQL/排序实现见 [`service/post.go`](../../service/post.go) ListItems。
|
||||
具体 SQL/排序实现见 [`service/post.go`](../../services/post.go) ListItems。
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
> **读者**:实现前台 / 后台 UI 的 AI
|
||||
> **前置**:[02-features.md](02-features.md)
|
||||
> **源码**:[`frontend/src/App.tsx`](../../frontend/src/App.tsx)、[`frontend/src/pages/`](../../frontend/src/pages/)、[`frontend/src/components/`](../../frontend/src/components/)、[`frontend/src/layouts/`](../../frontend/src/layouts/)
|
||||
> **源码**:[`frontend/src/App.tsx`]((仅 main)frontend/src/App.tsx)、[`frontend/src/pages/`]((仅 main)frontend/src/pages/)、[`frontend/src/components/`]((仅 main)frontend/src/components/)、[`frontend/src/layouts/`]((仅 main)frontend/src/layouts/)
|
||||
|
||||
视觉可重设;**信息架构与关键操作流应对齐**。新站建议 SSR 直出同等信息,而不是先空壳再 fetch。
|
||||
|
||||
@@ -119,7 +119,7 @@
|
||||
|
||||
### 3.2 编辑器能力(应对齐)
|
||||
|
||||
源:[`ArticleEditor.tsx`](../../frontend/src/components/ArticleEditor.tsx) 与 `editor/` 扩展
|
||||
源:[`ArticleEditor.tsx`]((仅 main)frontend/src/components/ArticleEditor.tsx) 与 `editor/` 扩展
|
||||
|
||||
- 标题 h2–h6(无 h1,避免与帖标题冲突)
|
||||
- 粗体/斜体/删除线等基础标记
|
||||
@@ -129,7 +129,7 @@
|
||||
- 图片上传 + 图片组布局 + 浮动/清除浮动
|
||||
- 表情 / 贴纸选择器(多套:bilibili/douyin/tieba/weibo 等静态资源)
|
||||
- **登录可见** / **回复可见** / **积分可见**(价格 1–9999)节点
|
||||
- 富文本 ↔ Markdown 双模(门控块有 markdown 约定,见 [`utils/markdownContent.ts`](../../frontend/src/utils/markdownContent.ts))
|
||||
- 富文本 ↔ Markdown 双模(门控块有 markdown 约定,见 [`utils/markdownContent.ts`]((仅 main)frontend/src/utils/markdownContent.ts))
|
||||
- Tab 缩进
|
||||
|
||||
未保存离开:`UnsavedChangesDialog`。
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
> **读者**:部署与运维、以及实现配置层的 AI
|
||||
> **前置**:[README.md](README.md)
|
||||
> **源码**:[`app.ini.example`](../../app.ini.example)、[`config/`](../../config/)、[`README.md`](../../README.md)、[`handler/seo.go`](../../handler/seo.go)、[`handler/seo_bot.go`](../../handler/seo_bot.go)、[`embed_static/`](../../embed_static/)
|
||||
> **源码**:[`app.ini.example`](../../app.ini.example)、[`config/`](../../config/)、[`README.md`](../../README.md)、[`handler/seo.go`](../../routers/api/seo.go)、[`handler/seo_bot.go`](../../routers/api/seo_bot.go)、[`embed_static/`]((仅 main 分支)embed_static/)
|
||||
|
||||
运维形态可改;下列描述**现网**行为,便于迁移数据与对齐环境变量语义。
|
||||
|
||||
@@ -91,8 +91,8 @@ data/
|
||||
|
||||
| 机制 | 说明 |
|
||||
|------|------|
|
||||
| SPA 壳注入 | [`embed_static`](../../embed_static/) 注入 title / branding JSON,**无帖文 DOM** |
|
||||
| 爬虫 HTML | User-Agent 命中时 [`seo_bot.go`](../../handler/seo_bot.go) 返回简易 HTML |
|
||||
| SPA 壳注入 | `embed_static`(仅 `main` 分支) 注入 title / branding JSON,**无帖文 DOM** |
|
||||
| 爬虫 HTML | User-Agent 命中时 [`seo_bot.go`](../../routers/api/seo_bot.go) 返回简易 HTML |
|
||||
| robots.txt / sitemap.xml | 动态生成 |
|
||||
|
||||
重构验收:用普通浏览器「查看网页源代码」应能看到帖文正文,而不仅是空 div + script。
|
||||
@@ -110,7 +110,7 @@ data/
|
||||
- `/board/2.html`
|
||||
- `/page/about.html`
|
||||
|
||||
路由应同时接受无后缀与有后缀形式。解析逻辑见 [`service/permalink.go`](../../service/permalink.go)。
|
||||
路由应同时接受无后缀与有后缀形式。解析逻辑见 [`service/permalink.go`](../../services/permalink.go)。
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -35,19 +35,29 @@ git worktree add ../jiang13-spa main
|
||||
|
||||
---
|
||||
|
||||
## 目录职责(演进中)
|
||||
## 目录职责(本分支已落地)
|
||||
|
||||
```text
|
||||
routers/web/ # 返回 HTML 的页面路由
|
||||
templates/ # Go 模板源文件(嵌入)
|
||||
web_src/ # CSS/JS 源码
|
||||
public/assets/ # web_src 构建产物(嵌入,URL 前缀 `/ssr-assets/`)
|
||||
modules/ # 横切(模板渲染等)
|
||||
docs/rebuild-spec/ # 产品规格
|
||||
.cursor/rules/ # AI 开发规则
|
||||
cmd/jiang13/ # 入口
|
||||
config/ # 配置
|
||||
models/ # GORM 模型(原 model/)
|
||||
services/ # 业务逻辑(原 service/)
|
||||
routers/
|
||||
setup.go # 路由总装(原 router/)
|
||||
web/ # HTML SSR
|
||||
api/ # JSON API(原 handler/)
|
||||
modules/
|
||||
auth/ # JWT / 限流等(原 middleware/)
|
||||
webrender/ # 模板渲染
|
||||
seo/ # PageMeta 等
|
||||
templates/ # Go 模板(embed)
|
||||
web_src/ # CSS/JS 源码
|
||||
public/assets/ # 构建产物(URL 前缀 `/ssr-assets/`)
|
||||
docs/rebuild-spec/ # 产品规格
|
||||
.cursor/rules/ # AI 开发规则
|
||||
```
|
||||
|
||||
现有 `model/`、`service/`、`handler/`(JSON API)可先复用,公开页出口改为模板。
|
||||
**已删除(勿恢复):** `frontend/`、`embed_static/`。SPA 对照仅看 `main`。
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -61,9 +61,9 @@ flowchart LR
|
||||
|
||||
| 痛点 | 现状 | 对用户的影响 |
|
||||
|------|------|----------------|
|
||||
| 非真 SSR | 生产入口 [`embed_static`](../../embed_static/) 只注入 title / branding / Open Graph,**不渲染帖文 DOM** | 刷新先出壳再灌数据,体验不如 SSR |
|
||||
| 爬虫双轨 | [`handler/seo_bot.go`](../../handler/seo_bot.go) 对爬虫返回独立 HTML | 用户与爬虫看到的不是同一套渲染路径 |
|
||||
| 无正式 migration | Schema 靠 GORM `AutoMigrate`([`model/db.go`](../../model/db.go)) | 升级靠「加字段」,难做破坏性迁移与审计 |
|
||||
| 非真 SSR | 生产入口(`main` 的 `embed_static`)只注入 title / branding / Open Graph,**不渲染帖文 DOM** | 刷新先出壳再灌数据,体验不如 SSR |
|
||||
| 爬虫双轨 | [`routers/api/seo_bot.go`](../../routers/api/seo_bot.go) 对爬虫返回独立 HTML | 用户与爬虫看到的不是同一套渲染路径 |
|
||||
| 无正式 migration | Schema 靠 GORM `AutoMigrate`([`models/db.go`](../../models/db.go)) | 升级靠「加字段」,难做破坏性迁移与审计 |
|
||||
| Cookie JWT | 无 session 表,密钥在 `data/.jwt_secret` | 可保留语义,实现可换成更好的会话方案 |
|
||||
|
||||
**新站目标**:用户首屏即可看到帖文 / 列表的服务端渲染(SSR)HTML;SEO meta 与正文同源。技术选型自定(Next.js / Nuxt / Remix / 其它均可)。
|
||||
@@ -113,13 +113,13 @@ flowchart LR
|
||||
|
||||
| 主题 | 路径 |
|
||||
|------|------|
|
||||
| 路由总表 | [`router/router.go`](../../router/router.go) |
|
||||
| GORM 模型 | [`model/models.go`](../../model/models.go) |
|
||||
| AutoMigrate | [`model/db.go`](../../model/db.go) |
|
||||
| 论坛设置键 | [`service/settings.go`](../../service/settings.go) |
|
||||
| 前端 API 客户端 | [`frontend/src/api/client.ts`](../../frontend/src/api/client.ts) |
|
||||
| 前端类型 | [`frontend/src/api/types.ts`](../../frontend/src/api/types.ts) |
|
||||
| 页面路由 | [`frontend/src/App.tsx`](../../frontend/src/App.tsx) |
|
||||
| 路由总装 | [`routers/setup.go`](../../routers/setup.go) |
|
||||
| GORM 模型 | [`models/models.go`](../../models/models.go) |
|
||||
| AutoMigrate | [`models/db.go`](../../models/db.go) |
|
||||
| 论坛设置键 | [`services/settings.go`](../../services/settings.go) |
|
||||
| SSR 页面路由 | [`routers/web/`](../../routers/web/) |
|
||||
| JSON API | [`routers/api/`](../../routers/api/) |
|
||||
| 前端 API / 页面(对照) | 仅 `main`:`frontend/src/api/`、`frontend/src/App.tsx` |
|
||||
| 产品介绍 | [`docs/introduction.md`](../introduction.md)、[`README.md`](../../README.md) |
|
||||
|
||||
---
|
||||
|
||||
Reference in New Issue
Block a user