# 技术支持与论坛 — 规划设计及实施方案

## 一、概述

### 1.1 目标

基于 [ICT 服务平台](ICT服务平台概要.md) 统一认证底座（OpenLDAP + Keycloak）和互联网应用服务器基础设施，构建**面向客户、经销商与合作伙伴的互动社区论坛平台**，覆盖技术支持、产品反馈、用户建议、营销互动的完整场景。论坛与 [文档生产及输出管理](文档生产及输出管理.md) 系统深度协同，共同构成企业对外知识服务与客户运营体系。

### 1.2 核心设计原则

- **全栈开源**：论坛引擎（Discourse）、LLM 推理（Ollama + Qwen2.5）、RAG 编排（LangChain）、向量检索（pgvector）、文本嵌入（bge-large-zh）全部采用开源方案，零 API 费用
- **认证复用**：登录用户接入 Keycloak SSO 免密码秘钥登录；游客免登录可浏览公开栏目
- **AI 驱动**：基于开源大模型本地部署，帖子自动分类、智能回复草稿生成、内容合规检测，人工审核后发布，数据全程不出企业服务器
- **主题订阅**：用户自主选择关注的主题，信息流仅展示已关注内容，类似微信群的「入群 / 退群」机制
- **积分激励**：通过积分奖励体系拉动社区活跃度与用户留存
- **管控有序**：分级审核机制，管理员可对不雅或不相关主题实施警告、冻结、关停

### 1.3 用户角色

论坛在 ICT 平台已有角色（游客 / 访客 / 读者 / 管理员）基础上定义论坛专属角色：

| 角色 | 说明 | 典型场景 |
|------|------|---------|
| 游客 (Guest) | 免登录浏览公开栏目，不可发帖 | 搜索引擎入口、链接分享打开阅读 |
| 普通用户 (Member) | 注册并登录后参与论坛互动 | 发帖、跟帖、点赞、关注主题、积累积分 |
| 经销商 (Dealer) | 经过企业认证的经销商账号 | 创建专属主题、发布产品服务信息、管理自有主题 |
| 版主 (Moderator) | 被管理员任命管理特定栏目或主题 | 置顶、移帖、警告、关闭话题 |
| 客服 (Support) | 企业客服团队成员 | 审核 AI 回复草稿、人工解答、处理投诉 |
| 管理员 (Admin) | 论坛系统管理员 | 栏目管理、主题审批、用户封禁、积分规则配置 |

### 1.4 论坛层级结构

论坛内容采用四级层级组织，对应企业网站上的导航结构：

```
栏目 (Category) ─── 网站顶部导航，如"技术支持""吐槽""建议"
  └─ 主题 (Theme) ─── 类似微信群的持续讨论空间，如"智能笔连接问题"
       └─ 话题帖 (Topic) ─── 某个具体问题或讨论，如"BLE 连接超时怎么办"
            └─ 跟帖 (Reply) ─── 对话题帖的回复，支持多级引用
```

- **栏目**是企业预设的固定分类，对应网站的一级导航栏目
- **主题**是栏目下的持续讨论空间，用户可关注或取消关注，类似加入或退出微信群
- **话题帖**是主题内的具体讨论，每个话题帖有独立 URL 可链接分享
- **跟帖**是话题帖内的交互回复，支持引用、@提及、Markdown 格式

---

## 二、系统架构

### 2.1 整体架构图

```plantuml
@startuml
skinparam componentStyle rectangle
title 技术支持与论坛 - 系统架构

actor "游客" as Guest
actor "用户/经销商" as User
actor "客服/管理员" as Admin

node "互联网应用服务器\n(腾讯云/阿里云)" as AppServer {
  component "Discourse\n论坛引擎" as Forum
  component "ForumAI\nAI 回复服务" as AI
  component "Keycloak\nSSO 认证" as KC
  component "MsgHub\n消息中心" as MsgHub
  component "Umami\n统计分析" as Analytics
  component "Nginx + SSL" as Nginx
  database "Redis\n缓存/会话" as Redis
}

node "私有云 [数据后端]" as PCloud {
  database "PostgreSQL\nAI草稿/积分/审核" as DB
  database "OpenLDAP\n用户目录" as LDAP
}

node "LLM 推理节点\n(Ollama + Qwen2.5)" as LLM

Guest -down-> Nginx : HTTPS 浏览
User -down-> Nginx : HTTPS 互动
Admin -down-> Nginx : 管理后台

Nginx -down-> Forum : 论坛请求
Nginx -down-> KC : 认证
Forum -right-> AI : Webhook\n新帖事件
AI -right-> LLM : 生成回复草稿
AI -down-> DB : 草稿/审核队列
AI -left-> Forum : API 发布回复
Forum -down-> MsgHub : 论坛通知
Forum -down-> Analytics : 访问埋点
Forum -down-> Redis : 会话/缓存
KC -down-> LDAP : 用户认证
MsgHub -down-> DB : 消息存储
@enduml
```

### 2.2 核心组件清单

| 组件 | 开源方案 | 用途 | 许可证 |
|------|---------|------|--------|
| 论坛引擎 | **Discourse** | 帖子发布、主题管理、搜索、信任等级 | GPL v2 |
| AI 回复服务 | **ForumAI**（Node.js + LangChain） | 帖子分析、回复草稿生成、FAQ 匹配、RAG 检索 | MIT (LangChain) |
| LLM 本地推理 | **Ollama** + **Qwen2.5** | 中文理解、回复生成、情感分析，全部本地部署 | MIT / Apache 2.0 |
| 文本嵌入 | **bge-large-zh-v1.5**（BAAI） | 中文 Embedding，FAQ 语义匹配 | MIT |
| 向量存储 | **pgvector**（PostgreSQL 扩展） | FAQ 向量索引与余弦相似度检索 | PostgreSQL |
| 认证中心 | **Keycloak**（已有） | OIDC SSO 统一登录 | Apache 2.0 |
| 消息推送 | **MsgHub**（已有） | 论坛事件实时通知 | — |
| 统计分析 | **Umami**（已有） | 论坛页面访问与互动数据 | MIT |
| 缓存 | **Redis**（已有） | 会话管理、积分缓存、限流 | BSD |
| 数据存储 | **PostgreSQL**（已有） | ForumAI 草稿、积分记录、审核日志 | PostgreSQL |
| 反向代理 | **Nginx**（已有） | SSL 终止、路由分发 | BSD |

> **全栈开源**：上述所有组件均为开源方案，LLM 推理通过 Ollama 本地部署 Qwen2.5 模型，无需依赖任何付费 API，数据全程不出企业服务器。Discourse Docker 镜像内含独立的 PostgreSQL 和 Redis，ForumAI 使用平台共享的 PostgreSQL + pgvector 存储 AI 草稿、积分和向量数据。

---

## 三、论坛栏目与主题体系

### 3.1 预设栏目

企业网站上的论坛以栏目形式呈现，每个栏目是一个独立的一级导航入口：

| 栏目 | URL 标识 | 访问级别 | 说明 |
|------|---------|---------|------|
| **技术支持** | `technical-support` | public | 产品使用问题、故障排查、技术咨询，AI 优先回复 |
| **产品反馈** | `product-feedback` | public | 用户吐槽、使用体验、Bug 报告 |
| **建议与需求** | `suggestions` | public | 功能建议、需求提案，支持投票表决 |
| **公告** | `announcements` | public | 企业官方公告、版本发布、活动通知（仅管理员可发帖） |
| **经销商专区** | `dealer-zone` | login | 经销商专属讨论，需认证后可见 |
| **自由讨论** | `general` | login | 注册用户自由交流 |

### 3.2 主题定义与管理

每个栏目下包含多个**主题（Theme）**，主题是围绕特定产品、功能或客户群体的持续讨论空间：

| 属性 | 说明 | 示例 |
|------|------|------|
| 名称 | 主题的显示名称 | "Qink 智能笔使用交流" |
| 标识 | URL 友好的英文标识 | `qink-smart-pen` |
| 所属栏目 | 挂载在哪个栏目下 | 技术支持 |
| 创建者 | 企业预设 / 用户申请 / 经销商自建 | admin / dealer-001 |
| 描述 | 主题简介，显示在主题列表 | "关于 Qink 智能笔的连接、使用、固件问题" |
| 图标 | 主题头像或 Logo | 产品图片 |
| 状态 | 正常 / 警告中 / 已停止 / 已归档 | 正常 |
| 关注人数 | 当前关注该主题的用户数 | 1,234 |

**预设主题示例**：

| 栏目 | 主题 | 说明 |
|------|------|------|
| 技术支持 | 智能笔连接问题 | BLE 配对、固件升级、连接不稳定 |
| 技术支持 | 大屏显示与同步 | 笔迹同步延迟、画面适配、多设备场景 |
| 技术支持 | 手写识别与 OCR | 识别准确率、语言支持、特殊字符 |
| 产品反馈 | Qink 使用体验 | Qink 系列产品的综合体验反馈 |
| 产品反馈 | iTone 音质讨论 | iTone 系列音频产品体验 |
| 建议与需求 | 功能投票箱 | 用户对新功能的提案与投票 |

### 3.3 用户与经销商自建主题

普通用户和经销商可申请创建自己的主题，系统提供完整支撑：

#### 创建流程

```
用户/经销商提交"创建主题"申请
  │
  ├─ 填写：主题名称、所属栏目、描述、创建理由
  │
  ├─ 系统自动检查：
  │    ├─ 名称是否与已有主题重复
  │    ├─ 内容是否包含违禁词
  │    └─ 用户信任等级是否满足要求
  │
  ├─ 经销商账号 → 自动通过（免审核）
  │
  └─ 普通用户 → 进入管理员审核队列
       ├─ 审核通过 → 主题创建，申请者自动成为该主题版主
       └─ 审核拒绝 → 通知申请者并说明原因
```

#### 自建主题权限

| 角色 | 创建主题 | 免审核 | 管理自有主题 | 删除自有主题 |
|------|---------|--------|------------|------------|
| 普通用户（等级 3+） | 可申请 | 否 | 可（版主权限） | 需管理员确认 |
| 经销商 | 可直接创建 | 是 | 可（版主权限） | 可 |
| 管理员 | 可直接创建 | 是 | 全部主题 | 可 |

### 3.4 主题关注与信息流

用户通过**关注（Follow）机制**管理自己可见的内容，类似微信群的加入与退出：

| 操作 | 效果 |
|------|------|
| 关注主题 | 该主题下的新话题帖出现在用户信息流中；新帖通知推送到消息中心 |
| 取消关注 | 该主题内容从信息流消失；停止该主题的消息推送 |
| 未关注 | 用户不会看到该主题下的任何内容（栏目页仍可看到主题列表） |

**信息流规则**：

- 论坛首页（个人信息流）仅展示**已关注主题**下的话题帖，按最新回复时间倒序排列
- 栏目页展示该栏目下**所有主题列表**（含未关注的），用户可浏览并决定是否关注
- 新注册用户自动关注企业预设的「推荐主题」（如技术支持 / 公告），后续可自行调整
- 每个主题卡片显示：主题名称、描述、关注人数、最新活跃时间、「关注 / 已关注」按钮

---

## 四、帖子交互与链接分享

### 4.1 帖子发布与跟帖

#### 发布话题帖

登录用户在已关注的主题内可发布话题帖：

| 字段 | 说明 |
|------|------|
| 标题 | 话题帖标题，简洁描述问题或主题 |
| 正文 | 支持 Markdown 格式，可嵌入图片、代码块、表格 |
| 标签 | 可选，便于检索分类（如 `BLE` `固件` `Android`） |
| 附件 | 支持上传图片、日志文件（大小 / 类型受限） |

#### 跟帖（回复）

- 对话题帖的回复支持 Markdown 格式
- 支持**引用回复**（引用某条跟帖后回复）
- 支持 **@提及** 其他用户，触发专属通知
- 支持**点赞**，高赞回复自动置顶或标记为「有帮助」
- 帖子作者可将某条回复标记为**最佳回答**（技术支持栏目尤为重要）

### 4.2 链接分享体系

每个论坛页面均有独立的、可分享的 URL：

| 页面 | URL 格式 | 示例 |
|------|---------|------|
| 论坛首页 | `https://forum.writech.cn/` | — |
| 栏目页 | `https://forum.writech.cn/c/{栏目标识}` | `forum.writech.cn/c/technical-support` |
| 主题页 | `https://forum.writech.cn/c/{栏目}/{主题}` | `forum.writech.cn/c/technical-support/qink-smart-pen` |
| 话题帖 | `https://forum.writech.cn/t/{标题slug}/{帖子ID}` | `forum.writech.cn/t/ble-timeout/456` |
| 特定跟帖 | `https://forum.writech.cn/t/{slug}/{ID}/{跟帖序号}` | `forum.writech.cn/t/ble-timeout/456/3` |

**分享能力**：

- 每个话题帖页面提供**分享按钮**，支持复制链接、生成二维码
- 分享链接携带渠道追踪参数（复用 PromoAPI 的 `ch` / `cmp` 参数体系）
- 链接在微信、浏览器等平台打开时展示完整的帖子内容
- 游客通过分享链接可直接阅读公开栏目下的帖子，无需登录

### 4.3 SEO 与社交分享优化

- Discourse 原生支持 SSR（服务端渲染），搜索引擎可抓取论坛内容
- 每个话题帖生成 Open Graph 元标签，分享到微信 / 微博时展示标题 + 摘要 + 缩略图
- 技术支持类帖子沉淀为**搜索引擎可索引的知识库**，持续引流

---

## 五、AI 辅助回复系统（ForumAI）

### 5.1 设计理念

ForumAI 是论坛的 AI 后端服务，核心目标是**降低客服团队工作量**，同时保证回复质量：

- **AI 先行**：每条新帖自动生成回复草稿，客服只需审核确认或微调
- **人工兜底**：AI 无法处理的复杂问题自动转交人工，确保每条帖子都有回应
- **知识积累**：FAQ 库随帖子积累不断丰富，AI 回复准确率持续提升
- **透明标记**：AI 回复标记「AI 助手」标签，用户知晓回复来源

### 5.2 工作流程

```plantuml
@startuml
skinparam componentStyle rectangle
title ForumAI 工作流程

start
:用户发布话题帖或跟帖;
:Discourse Webhook 推送到 ForumAI;

:ForumAI 分析帖子内容;
note right
  意图识别: 提问 / 反馈 / 建议 / 投诉
  情感分析: 正面 / 中性 / 负面
  关键词提取: 产品 / 功能 / 问题
end note

if (匹配 FAQ 知识库 ?) then (是)
  :生成标准回复草稿;
  note right: 附上 FAQ 文档链接
else (否)
  :调用 LLM 生成回复草稿;
  note right
    Ollama + Qwen2.5 (本地部署)
    LangChain RAG: 产品知识 + 帖子上下文
  end note
endif

:草稿存入审核队列;

if (AI 置信度高且为常见问题 ?) then (是)
  :自动发布回复;
  note right: 标注 "AI 助手" 标签
else (否)
  :推送到客服审核队列;
  :客服查看/编辑草稿;
  :客服确认发布;
endif

:回复发布到论坛;
:MsgHub 通知帖子作者;
stop
@enduml
```

### 5.3 AI 能力矩阵

| 能力 | 说明 | 实现方式 |
|------|------|---------|
| 意图识别 | 判断帖子是提问、反馈、建议还是投诉 | LLM 分类 + 规则引擎 |
| 情感分析 | 检测用户情绪（正面 / 中性 / 负面 / 愤怒） | LLM 情感评分 |
| FAQ 匹配 | 将帖子与已有 FAQ 知识库进行语义匹配 | bge-large-zh Embedding + pgvector 余弦相似度检索 |
| 回复生成 | 基于产品知识库和帖子上下文生成回复草稿 | LangChain RAG（Ollama + Qwen2.5 + pgvector） |
| 内容审核 | 检测帖子是否含不良内容、广告、违禁词 | Qwen2.5 审核 + 关键词过滤 |
| 智能分类 | 自动为帖子打标签、分配到合适的主题 | LLM 分类 |
| 优先级评估 | 根据情感和紧急程度评估帖子优先级 | 规则引擎 + LLM |

### 5.4 人工辅佐审核机制

客服团队通过**审核后台**管理 AI 生成的回复草稿：

```
┌──────────────────────────────────────────────────┐
│  ForumAI 审核后台                          客服  │
├──────────────────────────────────────────────────┤
│  待审核 (12)  │  已发布 (89)  │  已驳回 (3)     │
├──────────────────────────────────────────────────┤
│  🔴 [紧急] BLE 连接频繁断开              3分钟前  │
│     AI 草稿：建议重新配对，详见固件升级指南...     │
│     置信度：87%  │  意图：提问  │  情感：负面     │
│     [✅ 发布] [✏️ 编辑后发布] [❌ 驳回] [👤 转人工] │
├──────────────────────────────────────────────────┤
│  🟡 [一般] Qink 能否支持 Windows 手写输入   1小时前 │
│     AI 草稿：目前 Qink 主要支持 Android/iOS...   │
│     置信度：72%  │  意图：提问  │  情感：中性     │
│     [✅ 发布] [✏️ 编辑后发布] [❌ 驳回] [👤 转人工] │
└──────────────────────────────────────────────────┘
```

**审核流程规则**：

| 场景 | 处理方式 |
|------|---------|
| AI 置信度 > 90% 且为 FAQ 匹配 | 自动发布，标记「AI 助手」 |
| AI 置信度 70-90% | 进入客服审核队列，客服确认或修改后发布 |
| AI 置信度 < 70% | 标记「需人工回复」，客服从头撰写 |
| 情感为「愤怒」或「投诉」 | 无论置信度均进入人工处理，标记高优先级 |

### 5.5 技术实现

```
ForumAI (Node.js 服务，端口 3005)
  ├─ Express.js            — HTTP 接收 Discourse Webhook (MIT)
  ├─ @discourseconnect     — Discourse REST API 客户端
  ├─ LangChain.js          — RAG 编排：串联 LLM + 向量检索 + Prompt (MIT)
  ├─ Ollama Client         — 调用本地 Ollama 推理 Qwen2.5（HTTP localhost:11434）
  ├─ pg + pgvector         — 草稿/审核写入 PostgreSQL，FAQ Embedding 向量检索
  ├─ ioredis               — 限流、FAQ 缓存 (MIT)
  └─ MsgHub Client         — 审核通知推送
```

**FAQ 知识库管理**：

- FAQ 条目以 Markdown 存储于 Git 仓库，通过 DocForge 同步更新
- 每条 FAQ 通过 **bge-large-zh-v1.5**（BAAI 开源，MIT）生成 1024 维 Embedding 向量，存入 PostgreSQL（**pgvector** 扩展）
- 新帖到达时，ForumAI 通过 **LangChain RAG** 流程计算帖子 Embedding 并与 FAQ 库做余弦相似度检索
- 匹配度 > 0.85 视为 FAQ 命中，直接引用对应回复模板
- LLM 推理全部通过 **Ollama**（MIT）本地运行 **Qwen2.5**（Apache 2.0）模型，无需外部 API 依赖

---

## 六、积分奖励体系

### 6.1 积分获取规则

通过积分奖励拉动论坛活跃度，积分规则涵盖日常互动和内容贡献：

| 行为 | 积分 | 频次限制 | 说明 |
|------|------|---------|------|
| 每日首次登录 | +5 | 每日 1 次 | 连续签到额外奖励 |
| 发布话题帖 | +10 | 每日 5 帖 | 鼓励提问和分享 |
| 发表跟帖 | +3 | 每日 20 条 | 鼓励参与讨论 |
| 被点赞（每个赞） | +2 | 无限制 | 鼓励高质量回复 |
| 回复被标记为「最佳回答」 | +50 | 无限制 | 重奖有价值的回答 |
| 关注新主题 | +1 | 每日 3 次 | 鼓励探索更多主题 |
| 邀请新用户注册 | +30 | 每月 10 次 | 拉新奖励 |
| 连续签到 7 天 | +20 | 每周 1 次 | 额外奖励 |
| 连续签到 30 天 | +100 | 每月 1 次 | 月度奖励 |
| 举报违规内容（查实后） | +10 | 无限制 | 鼓励社区自治 |

### 6.2 用户等级体系

积分累计决定用户等级，不同等级解锁不同特权：

| 等级 | 名称 | 累计积分 | 特权 |
|------|------|---------|------|
| Lv.0 | 新手 | 0 | 浏览、跟帖（需审核） |
| Lv.1 | 活跃用户 | 50+ | 跟帖免审核、点赞 |
| Lv.2 | 贡献者 | 200+ | 发帖免审核、上传附件 |
| Lv.3 | 达人 | 500+ | 申请创建主题、编辑自己的帖子标签 |
| Lv.4 | 专家 | 2000+ | 编辑他人帖子标签、参与社区管理投票 |
| Lv.5 | 社区大使 | 5000+ | 自建主题免审核、推荐至首页热门 |

### 6.3 积分兑换

积分可用于兑换企业提供的奖励：

| 兑换项目 | 所需积分 | 说明 |
|---------|---------|------|
| 品牌周边（贴纸、明信片） | 100 | 邮寄至用户地址 |
| 产品优惠券（满减 / 折扣） | 300 | 在官网或经销商处使用 |
| 新品试用资格 | 500 | 优先体验未发布产品 |
| 专属客服通道 | 1000 | 一对一技术支持 |
| 年度社区贡献者荣誉 | — | 年底评选，非积分兑换 |

### 6.4 营销活动积分

管理员可配置**限时积分活动**以拉动特定时段的社区活跃度：

| 活动类型 | 示例 | 积分规则 |
|---------|------|---------|
| 签到翻倍周 | 每年特定周 | 所有签到积分 x2 |
| 话题悬赏 | "分享你的智能笔使用场景" | 参与发帖 +30，最佳帖 +200 |
| 邀新冲刺 | 月度邀新活动 | 邀请积分 x3，邀新排行额外奖励 |
| 节日专题 | 教师节、开学季 | 特定话题帖积分加成 |

积分核心逻辑基于 Discourse 开源插件 **discourse-gamification**（MIT）实现用户等级和徽章展示，ForumAI 负责自定义积分规则计算和营销活动积分加成。活动规则通过管理后台配置，ForumAI 自动识别活动期间的帖子并按活动规则计算积分。

---

## 七、内容审核与管控

### 7.1 三级审核机制

论坛内容审核采用 AI 自动审核 + 版主审核 + 管理员终审的三级机制：

| 审核级别 | 执行者 | 处理内容 | 响应时间 |
|---------|--------|---------|---------|
| **一级：AI 自动审核** | ForumAI | 新帖/跟帖自动扫描：违禁词、广告、不良内容、灌水 | 即时（< 3 秒） |
| **二级：版主审核** | 版主 | AI 标记为可疑的内容、用户举报的内容 | < 30 分钟 |
| **三级：管理员终审** | 管理员 | 主题创建审批、用户封禁、重大争议裁决 | < 24 小时 |

### 7.2 管理员操作工具

管理员和版主可对帖子和主题执行以下操作：

| 操作 | 适用对象 | 说明 |
|------|---------|------|
| **置顶** | 话题帖 | 在主题内或栏目内置顶显示 |
| **锁定** | 话题帖 | 禁止新跟帖，保留可阅读 |
| **移动** | 话题帖 | 将帖子移至更合适的主题或栏目 |
| **合并** | 话题帖 | 将重复的帖子合并为一个 |
| **隐藏** | 帖子/跟帖 | 从公开视图隐藏，仅管理员可见 |
| **删除** | 帖子/跟帖 | 永久删除内容（需三级管理员确认） |
| **警告** | 用户 | 向用户发送违规警告通知，记录在案 |
| **禁言** | 用户 | 暂时禁止用户发帖和跟帖（可设期限） |
| **封禁** | 用户 | 永久禁止用户访问论坛 |

### 7.3 AI 自动审核

ForumAI 对每条新发布的帖子和跟帖执行自动审核：

| 检测项 | 检测方式 | 处理动作 |
|--------|---------|---------|
| 违禁词 | 关键词词典匹配 | 拦截，进入版主审核队列 |
| 广告推销 | LLM 分类 + URL 检测 | 拦截，标记为疑似广告 |
| 人身攻击 / 不雅内容 | LLM 毒性检测 | 拦截，自动隐藏 + 通知版主 |
| 灌水 / 重复发帖 | 频率检测 + 内容相似度 | 限流，超过阈值自动拦截 |
| 敏感信息 | 正则匹配（手机号、身份证等） | 自动打码，提醒用户修改 |

### 7.4 主题状态管理

主题具有完整的生命周期，管理员可根据主题表现进行状态管控：

```plantuml
@startuml
skinparam componentStyle rectangle
title 主题状态管理

state "申请中" as Pending
state "正常" as Active
state "警告中" as Warning
state "已停止" as Stopped
state "已归档" as Archived
state "已拒绝" as Rejected

[*] --> Pending : 用户/经销商提交申请
[*] --> Active : 管理员直接创建

Pending --> Active : 管理员审核通过
Pending --> Rejected : 管理员拒绝

Active --> Warning : 管理员发出警告\n(内容不当/偏离主题)
Warning --> Active : 整改通过
Warning --> Stopped : 未整改或再次违规

Active --> Stopped : 严重违规直接停止
Stopped --> Active : 管理员解除停止

Active --> Archived : 长期不活跃\n或管理员手动归档
Archived --> Active : 管理员重新激活
@enduml
```

**各状态说明**：

| 状态 | 对用户的表现 | 可执行操作 |
|------|------------|----------|
| 申请中 | 仅申请者可见，显示"审核中" | 等待管理员审批 |
| 正常 | 正常显示和互动 | 发帖、跟帖、关注 |
| 警告中 | 主题顶部显示黄色警告条，提示整改内容 | 可继续互动，但新帖需审核 |
| 已停止 | 主题页显示"该主题已被管理员停止"，禁止新帖 | 仅可阅读历史内容 |
| 已归档 | 主题页显示"已归档"，禁止新帖 | 仅可阅读历史内容 |
| 已拒绝 | 仅申请者收到拒绝通知 | 可修改后重新申请 |

---

## 八、权限与访问控制

### 8.1 论坛访问级别

论坛栏目的访问控制复用文档系统的权限模型：

| 级别 | 标识 | 说明 |
|------|------|------|
| **公开** | `public` | 游客可浏览帖子内容，登录后方可发帖和跟帖 |
| **需登录** | `login` | 仅登录用户可浏览和互动（如经销商专区） |
| **受限** | `restricted` | 仅特定用户组可访问（如内部测试反馈栏目） |

### 8.2 论坛权限矩阵

| 操作 | 游客 | 普通用户 | 经销商 | 版主 | 客服 | 管理员 |
|------|------|---------|--------|------|------|--------|
| 浏览公开栏目 | 可 | 可 | 可 | 可 | 可 | 可 |
| 浏览 login 栏目 | 否 | 可 | 可 | 可 | 可 | 可 |
| 发布话题帖 | 否 | 可 | 可 | 可 | 可 | 可 |
| 发表跟帖 | 否 | 可 | 可 | 可 | 可 | 可 |
| 点赞 | 否 | 可 | 可 | 可 | 可 | 可 |
| 关注主题 | 否 | 可 | 可 | 可 | 可 | 可 |
| 创建主题 | 否 | Lv.3+ 申请 | 直接创建 | 否 | 否 | 直接创建 |
| 标记最佳回答 | 否 | 仅自己帖子 | 仅自己帖子 | 可 | 可 | 可 |
| 审核帖子 | 否 | 否 | 否 | 所辖主题 | 所有 | 所有 |
| 管理主题状态 | 否 | 否 | 自有主题 | 所辖主题 | 否 | 所有 |
| 封禁用户 | 否 | 否 | 否 | 否 | 否 | 可 |
| AI 审核后台 | 否 | 否 | 否 | 否 | 可 | 可 |

### 8.3 与认证底座的关系

| 层次 | 组件 | 职责 |
|------|------|------|
| 身份源 | OpenLDAP（私有云） | 用户账户、组织架构、角色 |
| 认证中心 | Keycloak（互联网服务器） | SSO 登录，签发 OIDC Token |
| 论坛认证 | Discourse SSO 对接 | 通过 Keycloak OIDC 实现单点登录 |
| 角色映射 | ForumAI 配置 | Keycloak 角色组映射到论坛角色（Member / Dealer / Support / Admin） |
| 匿名访问 | Discourse 公开分类 | 游客无需登录即可浏览 public 级别栏目 |

---

## 九、消息通知与 MsgHub 集成

### 9.1 论坛事件接入 MsgHub

论坛产生的事件通过 Discourse Webhook 接入 MsgHub 消息中心，与文档系统的消息统一展示：

```
Discourse 论坛事件
  │
  ├─ Webhook → ForumAI → MsgHub
  │
  └─ MsgHub 统一推送到用户消息中心
       ├─ WebSocket 实时推送（在线用户）
       └─ 未读消息存储（离线用户）
```

### 9.2 论坛消息类型

| 消息类型 | 触发条件 | 消息内容 |
|---------|---------|---------|
| 新回复 | 关注的话题帖收到新跟帖 | "{用户}回复了你关注的《{帖子标题}》" |
| @提及 | 帖子或跟帖中 @了你 | "{用户}在《{帖子标题}》中提到了你" |
| 最佳回答 | 你的回复被标记为最佳回答 | "你在《{帖子标题}》中的回复被选为最佳回答 (+50积分)" |
| AI 回复已发布 | 客服确认发布了 AI 回复 | "你的帖子《{标题}》已收到官方回复" |
| 主题动态 | 关注的主题有新话题帖 | "【{主题名}】有新话题：{帖子标题}" |
| 主题审批 | 你申请的主题被审批 | "你申请的主题「{名称}」已通过审核" |
| 警告通知 | 管理员对你发出警告 | "你的帖子《{标题}》收到管理员警告" |
| 积分变动 | 积分增加或兑换 | "恭喜获得 50 积分（最佳回答奖励）" |
| 等级提升 | 用户等级提升 | "恭喜升级为 Lv.3 达人！解锁「创建主题」特权" |

### 9.3 通知策略

| 策略 | 说明 |
|------|------|
| 即时推送 | @提及、最佳回答、警告通知、等级提升 |
| 聚合推送 | 新回复、主题动态（同一主题 5 分钟内聚合为一条） |
| 静默 | 用户可设置单个主题为「免打扰」，仅 @提及 时通知 |
| 摘要邮件 | 每日 / 每周发送论坛摘要邮件到用户邮箱（可选开启） |

---

## 十、部署方案

### 10.1 服务部署清单

论坛相关服务在已有 ICT 平台基础上新增以下组件：

| 服务 | 部署方式 | 运行位置 | 端口 | 说明 |
|------|---------|---------|------|------|
| **Discourse 论坛引擎** | Docker (官方镜像) | 互联网应用服务器 | 4000 | 含内置 PostgreSQL + Redis + Sidekiq |
| **Ollama LLM 推理** | Docker (GPU 可选) | 互联网应用服务器 | 11434 | 本地运行 Qwen2.5 开源大模型 |
| **ForumAI 服务** | Docker (Node.js) | 互联网应用服务器 | 3005 | LangChain RAG + 积分 + 审核 |
| PostgreSQL（已有） | 原生安装 | 私有云 | 5432 | ForumAI 草稿/积分/审核日志 |
| Redis（已有） | Docker | 互联网应用服务器 | 6379 | ForumAI 限流/缓存 |
| MsgHub（已有） | Docker | 互联网应用服务器 | 3003 | 论坛消息通知 |
| Keycloak（已有） | Docker | 互联网应用服务器 | 8443 | SSO 认证 |
| Nginx（已有） | 原生 | 互联网应用服务器 | 443 | 反向代理 |

### 10.2 Nginx 路由规则

在现有 Nginx 配置中新增论坛相关路由：

```nginx
# Discourse 论坛（独立子域名）
server {
    listen 443 ssl http2;
    server_name forum.writech.cn;

    ssl_certificate     /etc/ssl/certs/writech_cn.pem;
    ssl_certificate_key /etc/ssl/private/writech_cn.key;

    # 论坛所有请求代理到 Discourse
    location / {
        proxy_pass http://127.0.0.1:4000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
    }

    # WebSocket 支持（Discourse MessageBus）
    location /message-bus/ {
        proxy_pass http://127.0.0.1:4000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

# ForumAI 服务（内部调用 + Discourse Webhook）
# 在主站 server 块中添加：
location /api/forum-ai/ {
    proxy_pass http://127.0.0.1:3005;
}
```

### 10.3 DNS 配置

在腾讯云 DNSPod 中新增 `forum.writech.cn` 子域名记录：

| 记录 | 类型 | 指向 | DNS 平台 | 用途 |
|------|------|------|---------|------|
| forum.writech.cn | A | 腾讯云广州服务器 | 腾讯云 DNSPod | 论坛子域名 |

> 通配符 SSL 证书（`*.writech.cn`）已覆盖 `forum.writech.cn`，无需额外证书。

---

## 十一、实施路线图

| 阶段 | 任务 | 预计周期 |
|------|------|--------|
| **第一阶段：基础** | Discourse Docker 部署、Keycloak SSO 对接 | 第 1-2 周 |
| **第一阶段** | 预设栏目和主题创建、Nginx 路由配置 | 第 2 周 |
| **第一阶段** | 基础 UI 定制（品牌配色、Logo、导航栏集成） | 第 2-3 周 |
| **第二阶段：互动** | 主题关注与信息流功能开发 | 第 4 周 |
| **第二阶段** | 用户/经销商自建主题审批流程开发 | 第 4-5 周 |
| **第二阶段** | MsgHub 集成（论坛事件 Webhook → 消息中心） | 第 5 周 |
| **第三阶段：智能** | Ollama + Qwen2.5 本地部署、bge-large-zh 嵌入模型部署 | 第 6 周 |
| **第三阶段** | ForumAI 服务开发（Webhook + LangChain RAG 编排 + pgvector） | 第 6-7 周 |
| **第三阶段** | FAQ 知识库构建与向量检索集成 | 第 7-8 周 |
| **第三阶段** | AI 审核后台开发（客服审核队列 + 草稿管理） | 第 8-9 周 |
| **第四阶段：运营** | 积分奖励体系开发（积分规则 + 等级 + 兑换） | 第 10-11 周 |
| **第四阶段** | 内容审核与管控工具（AI 审核 + 管理员操作） | 第 11 周 |
| **第四阶段** | 营销活动积分模块 + 运营看板 | 第 12 周 |
| **第五阶段：优化** | SEO 优化、Open Graph 社交分享、链接分享体系完善 | 第 13 周 |
| **第五阶段** | 全链路测试、性能调优、上线 | 第 13-14 周 |
