--- belongs_to: - "[[INDEX · 铸渊·协作指令|GitHub ↔ Notion 桥接协议]]" --- # ✍️ 铸渊指令|AI写网文平台·Phase B · 平台首页 + 用户登录注册 + AI伙伴对话框(ZY-WRITING-PLATFORM-2026-0325-001)· 霜砚签发 · 冰朔授权 --- ## 〇、指令总览 本指令要求铸渊在 [guanghulab.com](http://guanghulab.com) 上构建 **「AI写网文」平台首期功能**,实现三大核心: 1. **平台首页(Landing Page)** — 光湖码字平台入口,对话式设计,不是传统菜单式 2. **用户注册/登录系统** — 手机号+验证码,三种角色(作者/编辑/运营),JWT 鉴权 3. **AI伙伴对话框** — 登录后分配专属AI伙伴,WebSocket实时对话,人格化交互 ### 核心设计理念 --- ## 一、技术选型(锁定) | **层级** | **技术** | **版本** | **用途** | | --- | --- | --- | --- | | 前端框架 | React 18 + TypeScript | 18.2+ | UI 组件化 | | 构建工具 | Vite | 5.0+ | 快速构建 | | 样式框架 | Tailwind CSS | 3.3+ | 响应式 + 快速开发 | | UI 组件库 | shadcn/ui + Radix UI | latest | 现代无障碍组件 | | 实时通信 | [Socket.io](http://Socket.io) | 4.x | AI伙伴实时对话 | | 后端框架 | Node.js + Express | 20 LTS + 4.18 | API 服务 | | 身份认证 | JWT + Passport.js | latest | Token 鉴权 | | AI 接入 | OpenAI SDK + Anthropic SDK | latest | GPT-4 / Claude | | 数据库 | Notion API(主)+ Redis(缓存) | latest | 数据存储 + 会话缓存 | | 部署 | 阿里云 ECS(8.155.62.235) | - | 正式站 [guanghulab.com](http://guanghulab.com) | --- ## 二、仓库路径规划 在主仓库 `qinfendebingshuo/guanghulab` 下新建以下目录: ``` guanghulab/ └── writing-platform/ ← AI写网文平台根目录 ├── frontend/ ← 前端(React + Vite) │ ├── src/ │ │ ├── pages/ │ │ │ ├── LandingPage.tsx ← 平台首页 │ │ │ ├── LoginPage.tsx ← 登录页 │ │ │ ├── RegisterPage.tsx ← 注册页 │ │ │ └── DashboardPage.tsx ← 登录后主界面(AI伙伴) │ │ ├── components/ │ │ │ ├── AICompanion.tsx ← AI伙伴头像 + 对话框组件 │ │ │ ├── ChatBubble.tsx ← 聊天气泡 │ │ │ ├── RoleSelector.tsx ← 角色选择器(作者/编辑/运营) │ │ │ ├── PhoneLogin.tsx ← 手机号登录组件 │ │ │ └── Navbar.tsx ← 导航栏 │ │ ├── hooks/ │ │ │ ├── useAuth.ts ← 认证状态管理 │ │ │ └── useSocket.ts ← WebSocket 连接 │ │ ├── services/ │ │ │ ├── api.ts ← API 调用封装 │ │ │ └── socket.ts ← Socket.io 客户端 │ │ ├── stores/ │ │ │ └── authStore.ts ← Zustand 状态管理 │ │ ├── App.tsx │ │ └── main.tsx │ ├── public/ │ │ └── assets/ ← 静态资源(AI伙伴头像等) │ ├── index.html │ ├── vite.config.ts │ ├── tailwind.config.ts │ ├── tsconfig.json │ └── package.json │ ├── backend/ ← 后端(Express) │ ├── src/ │ │ ├── routes/ │ │ │ ├── auth.ts ← 注册/登录/验证码 │ │ │ ├── user.ts ← 用户信息 │ │ │ └── ai.ts ← AI对话代理 │ │ ├── middleware/ │ │ │ ├── authMiddleware.ts ← JWT 验证中间件 │ │ │ └── rateLimiter.ts ← 限流 │ │ ├── services/ │ │ │ ├── smsService.ts ← 短信验证码(阿里云SMS) │ │ │ ├── aiService.ts ← AI模型调用封装 │ │ │ ├── notionService.ts ← Notion API 封装 │ │ │ └── socketService.ts ← WebSocket 服务 │ │ ├── models/ │ │ │ └── userModel.ts ← 用户数据模型 │ │ └── server.ts ← 入口 │ ├── tsconfig.json │ └── package.json │ └── README.md ← 模块说明 ``` --- ## 三、Phase 0 · 平台首页(Landing Page) ### 3.1 设计要求 ### 3.2 页面结构 ``` ┌─────────────────────────────────────────────────────────┐ │ 🌟 光湖码字 · AI创作伙伴平台 [登录] [注册] │ ├─────────────────────────────────────────────────────────┤ │ │ │ 🤖 │ │ AI伙伴头像(动态) │ │ │ │ "你好!我是你的AI创作伙伴。 │ │ 无论你是作者、编辑还是运营, │ │ 我都能陪你一起工作。" │ │ │ │ [我是作者] [我是编辑] [我是运营] │ │ │ ├─────────────────────────────────────────────────────────┤ │ │ │ ✨ 三大核心能力 │ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ 🖊️ AI码字 │ │ 📊 透明追踪│ │ 🤝 跨平台 │ │ │ │ AI陪你写 │ │ 全程留痕 │ │ 自由合作 │ │ │ │ 不代替你写 │ │ 创意归你 │ │ 信誉说话 │ │ │ └──────────┘ └──────────┘ └──────────┘ │ │ │ ├─────────────────────────────────────────────────────────┤ │ │ │ 📈 平台数据(实时) │ │ 注册作者: XXX | 今日新作: XXX | AI使用透明度: 100% │ │ │ ├─────────────────────────────────────────────────────────┤ │ © 2026 光湖纪元 · 国作登字-2026-A-00037559 │ └─────────────────────────────────────────────────────────┘ ``` ### 3.3 技术实现要点 - 响应式设计(移动端优先) - AI伙伴头像:使用 CSS 动画实现呼吸效果(发光 + 微浮动) - 欢迎语:打字机效果逐字显示 - 角色选择按钮:点击后跳转到注册页,自动填入角色 - 底部平台数据:从 Notion API 读取真实数据(通过后端代理) - 路由:`guanghulab.com/writing/` 为入口 --- ## 四、Phase 1 · 用户注册/登录系统 ### 4.1 注册流程 ``` 用户点击 [注册] ↓ 选择角色:[作者] / [编辑] / [运营] ↓ 填写信息: - 手机号(必填) - 短信验证码(必填) - 笔名/昵称(必填) - 真实姓名(选填,编辑/运营必填) ↓ 验证通过 → 创建账号 → 分配专属AI伙伴 ↓ 跳转到主界面(Dashboard) ``` ### 4.2 登录流程 ``` 用户点击 [登录] ↓ 输入手机号 + 短信验证码 ↓ 验证通过 → 返回 JWT Token ↓ 跳转到主界面(Dashboard) ``` ### 4.3 API 设计 ```jsx // 发送验证码 POST /api/writing/auth/send-code Body: { phone: "13800138000" } Response: { success: true, message: "验证码已发送" } // 注册 POST /api/writing/auth/register Body: { phone: "13800138000", code: "123456", nickname: "小红", realName: "张小红", // 选填 role: "author" // author / editor / operator } Response: { success: true, token: "eyJhbGciOiJI...", user: { id: "user_001", nickname: "小红", role: "author", aiCompanion: { name: "笔灵", avatar: "/assets/ai-companion-author.png" } } } // 登录 POST /api/writing/auth/login Body: { phone: "13800138000", code: "123456" } Response: { success: true, token: "...", user: {...} } // 获取当前用户 GET /api/writing/user/me Headers: { Authorization: "Bearer " } Response: { user: {...} } ``` ### 4.4 数据存储(Notion 数据库) 在 Notion 中新建 **「AI写网文·用户表」** 数据库: | **字段名** | **类型** | **说明** | | --- | --- | --- | | 用户ID | title | 唯一标识(系统生成) | | 手机号 | text | 登录凭证(加密存储) | | 笔名 | text | 用户昵称 | | 真实姓名 | text | 可选 | | 角色 | select | author / editor / operator | | AI伙伴名称 | text | 系统分配的AI伙伴名字 | | 信誉分 | number | 初始 60 分 | | 注册时间 | date | 注册时间 | | 最后登录 | date | 最后登录时间 | | 状态 | select | active / suspended / deleted | ### 4.5 AI伙伴分配规则 | **角色** | **AI伙伴名** | **人设** | **System Prompt 核心** | | --- | --- | --- | --- | | 作者 | 笔灵 | 温暖的创作伙伴,擅长灵感激发、扩写、节奏把控 | 你是作者的AI创作伙伴,名叫笔灵。帮助作者提高效率、激发灵感。 | | 编辑 | 慧眼 | 专业的审稿助手,擅长筛选、评估、数据分析 | 你是编辑的AI审稿助手,名叫慧眼。帮助编辑高效筛选和评估稿件。 | | 运营 | 星图 | 敏锐的数据分析师,擅长趋势洞察、策略建议 | 你是运营的AI数据助手,名叫星图。帮助运营洞察数据趋势、制定策略。 | --- ## 五、Phase 2 · AI伙伴对话框 ### 5.1 界面设计 登录后进入 Dashboard,核心界面如下: ``` ┌─────────────────────────────────────────────────────────┐ │ 🌟 光湖码字 小红(作者) [设置] [退出] │ ├─────────────────────────────────────────────────────────┤ │ │ │ 🤖 笔灵 │ │ (呼吸发光动画) │ │ │ │ ┌─────────────────────────────────────────────────┐ │ │ │ │ │ │ │ 笔灵:早上好,小红!你已经连续写作3天了! │ │ │ │ 今天想继续写《霸总的小娇妻》吗? │ │ │ │ │ │ │ │ 小红:是的,帮我打开第8章 │ │ │ │ │ │ │ │ 笔灵:好的!第8章已打开,上次写到2567字。 │ │ │ │ 今天的目标是写完3000字吗? │ │ │ │ │ │ │ └─────────────────────────────────────────────────┘ │ │ │ │ ┌─────────────────────────────────────────┐ [发送] │ │ │ 和笔灵说点什么... │ │ │ └─────────────────────────────────────────┘ │ │ │ │ ───────────────────────────────────────────── │ │ 快捷操作: │ │ [📝 开始写作] [📊 查看数据] [📢 看定制书需求] [💬 讨论区]│ │ │ └─────────────────────────────────────────────────────────┘ ``` ### 5.2 WebSocket 对话系统 **前端([Socket.io](http://Socket.io) Client)** ```tsx // hooks/useSocket.ts import { io, Socket } from 'socket.io-client'; import { useEffect, useState } from 'react'; export function useSocket(token: string) { const [socket, setSocket] = useState(null); const [messages, setMessages] = useState([]); useEffect(() => { const newSocket = io('/writing-ai', { auth: { token }, transports: ['websocket'] }); newSocket.on('ai_response', (data: { message: string; suggestions?: string[] }) => { setMessages(prev => [...prev, { role: 'assistant', content: data.message, timestamp: Date.now() }]); }); setSocket(newSocket); return () => { newSocket.close(); }; }, [token]); const sendMessage = (message: string) => { if (!socket) return; setMessages(prev => [...prev, { role: 'user', content: message, timestamp: Date.now() }]); socket.emit('user_message', { message }); }; return { messages, sendMessage }; } ``` **后端([Socket.io](http://Socket.io) Server + AI 代理)** ```tsx // services/socketService.ts import { Server } from 'socket.io'; import { verifyToken } from '../middleware/authMiddleware'; import { callAI } from './aiService'; import { saveConversation } from './notionService'; export function setupSocketService(httpServer: any) { const io = new Server(httpServer, { path: '/writing-ai', cors: { origin: process.env.FRONTEND_URL } }); // JWT 鉴权 io.use((socket, next) => { const token = socket.handshake.auth.token; try { const user = verifyToken(token); socket.data.user = user; next(); } catch (err) { next(new Error('认证失败')); } }); io.on('connection', (socket) => { const user = socket.data.user; console.log(`[AI伙伴] ${user.aiCompanion.name} 已连接 · 用户: ${user.nickname}`); // 发送欢迎消息 socket.emit('ai_response', { message: getWelcomeMessage(user) }); socket.on('user_message', async (data: { message: string }) => { try { // 1. 构建 system prompt(注入角色 + AI伙伴人设) const systemPrompt = buildSystemPrompt(user); // 2. 调用 AI const aiResponse = await callAI({ systemPrompt, userMessage: data.message, userId: user.id }); // 3. 保存对话到 Notion await saveConversation({ userId: user.id, userMessage: data.message, aiResponse: aiResponse, timestamp: new Date().toISOString() }); // 4. 返回 AI 响应 socket.emit('ai_response', { message: aiResponse }); } catch (error) { socket.emit('ai_response', { message: '抱歉,我遇到了一些问题,请稍后再试。' }); } }); }); } function getWelcomeMessage(user: any): string { const name = user.aiCompanion.name; const nick = user.nickname; const role = user.role; if (role === 'author') { return `早上好,${nick}!我是${name},你的AI创作伙伴。\n\n今天想做什么?写作、看数据、还是找合作机会?`; } else if (role === 'editor') { return `早上好,${nick}!我是${name},你的AI审稿助手。\n\n今天有新投稿等你审核,要看看吗?`; } else { return `早上好,${nick}!我是${name},你的AI数据助手。\n\n今天的数据已更新,要看看趋势分析吗?`; } } function buildSystemPrompt(user: any): string { const companionPrompts: Record = { author: `你是用户的AI创作伙伴,名字叫「笔灵」。 用户信息:昵称=${user.nickname},角色=作者。 你的职责: 1. 帮助用户创作(提供灵感、扩写、优化文笔) 2. 管理写作项目(打开文档、查看进度) 3. 提醒和建议(写作时间、字数目标、市场趋势) 4. 记住用户的写作风格和习惯 语气:温暖、鼓励、专业。像一个懂你的创作搭档。`, editor: `你是用户的AI审稿助手,名字叫「慧眼」。 用户信息:昵称=${user.nickname},角色=编辑。 你的职责: 1. 帮助筛选和评估投稿 2. 分析AI使用报告 3. 提供审稿建议 4. 管理审核工作流 语气:专业、精准、高效。`, operator: `你是用户的AI数据助手,名字叫「星图」。 用户信息:昵称=${user.nickname},角色=运营。 你的职责: 1. 分析平台数据趋势 2. 提供运营策略建议 3. 管理跨平台合作 4. 生成数据报告 语气:敏锐、有洞察力、数据驱动。` }; return companionPrompts[user.role] || companionPrompts.author; } ``` ### 5.3 AI 模型调用封装 ```tsx // services/aiService.ts import OpenAI from 'openai'; const openai = new OpenAI({ apiKey: process.env.LLM_API_KEY, baseURL: process.env.LLM_BASE_URL // 使用仓库已配置的 LLM 端点 }); // 每个用户的对话历史缓存(Redis) const conversationCache = new Map(); export async function callAI(params: { systemPrompt: string; userMessage: string; userId: string; }): Promise { const { systemPrompt, userMessage, userId } = params; // 获取最近 10 轮对话历史 const history = conversationCache.get(userId) || []; const messages = [ { role: 'system' as const, content: systemPrompt }, ...history.slice(-20), // 最近10轮 = 20条消息 { role: 'user' as const, content: userMessage } ]; const completion = await openai.chat.completions.create({ model: 'gpt-4', messages, temperature: 0.7, max_tokens: 800 }); const aiResponse = completion.choices[0].message.content || '...'; // 更新对话缓存 const updatedHistory = [ ...history, { role: 'user', content: userMessage }, { role: 'assistant', content: aiResponse } ].slice(-20); // 保留最近10轮 conversationCache.set(userId, updatedHistory); return aiResponse; } ``` --- ## 六、Nginx 路由配置 在现有 Nginx 配置中增加 `writing-platform` 路由: ``` # /etc/nginx/conf.d/hololake.conf 新增 # AI写网文平台前端 location /writing/ { alias /var/www/guanghulab/writing-platform/frontend/dist/; try_files $uri $uri/ /writing/index.html; } # AI写网文平台后端 API location /api/writing/ { proxy_pass http://127.0.0.1:3100/api/writing/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } # WebSocket(AI伙伴对话) location /writing-ai/ { proxy_pass http://127.0.0.1:3100/writing-ai/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } ``` 后端服务端口:**3100**(写网文平台独立端口,不与现有服务冲突) --- ## 七、部署流程 ### 7.1 预览站(先部署验证) ```bash # 1. 构建前端 cd writing-platform/frontend npm install npm run build # 2. 构建后端 cd ../backend npm install npm run build # 3. 部署到 GitHub Pages 预览 # 前端 dist 目录推到 docs/writing/ 下 ``` ### 7.2 正式站 ```bash # CD 自动部署(deploy-to-server.yml 扩展) # 1. SSH 到服务器 # 2. git pull # 3. cd writing-platform/frontend && npm install && npm run build # 4. cd ../backend && npm install && npm run build # 5. pm2 restart writing-platform-backend (或新启动) # 6. nginx -s reload ``` --- ## 八、环境变量 以下环境变量需要在服务器和 GitHub Secrets 中配置: | **变量名** | **用途** | **来源** | | --- | --- | --- | | `LLM_API_KEY` | AI 模型 API Key | ✅ 已有 | | `LLM_BASE_URL` | AI 模型端点 | ✅ 已有 | | `NOTION_TOKEN` | Notion API Token | ✅ 已有 | | `JWT_SECRET` | JWT 签名密钥 | ⭕ 需新增(铸渊自动生成随机字符串) | | `SMS_ACCESS_KEY` | 阿里云短信 Key | ⏳ 需冰朔配置 | | `SMS_ACCESS_SECRET` | 阿里云短信 Secret | ⏳ 需冰朔配置 | | `WRITING_DB_ID` | Notion 用户表 Database ID | ⭕ 铸渊创建后填入 | | `REDIS_URL` | Redis 连接地址 | ⭕ 需配置(可先用内存缓存降级) | --- ## 九、人类侧操作(冰朔待办) --- ## 十、验收标准 | **验收项** | **标准** | | --- | --- | | 首页可访问 | `guanghulab.com/writing/` 打开显示完整首页 | | AI伙伴头像动画 | 中央头像有呼吸发光效果 | | 欢迎语显示 | 打字机效果逐字显示 | | 角色选择 | 三个按钮可点击,跳转到注册 | | 注册功能 | 填写信息 → 创建账号 → 分配AI伙伴 → 跳转Dashboard | | 登录功能 | 手机号+验证码 → JWT Token → 跳转Dashboard | | AI伙伴对话 | 登录后可与AI伙伴实时对话,响应流畅 | | 角色区分 | 不同角色登录后AI伙伴名称和行为不同 | | 移动端适配 | 手机浏览器正常显示和操作 | | 数据持久化 | 用户数据写入 Notion 数据库,对话记录可追溯 | --- ## 十一、执行时序 ``` Phase 0: 搭建项目骨架 + 前端首页(预计 2h) ↓ Phase 1: 后端注册/登录 API + Notion 用户表(预计 2h) ↓ Phase 2: AI伙伴对话系统(WebSocket + AI调用)(预计 3h) ↓ Phase 3: 前后端联调 + Nginx 路由配置(预计 1h) ↓ Phase 4: 部署到预览站 → 测试 ↓ → 人类验收 → 正式站上线 ``` --- ## 十二、后续扩展预留 本期完成后,后续 Phase 可继续扩展(不在本指令范围内): - **Phase C**:码字台 · AI辅助写作编辑器 + 全程留痕 + AI使用报告 - **Phase D**:审核系统 · AI初筛 + 人工复审 + 数字签名 - **Phase E**:信誉系统 · 四维动态评分 + 信誉曲线 - **Phase F**:模块市场 · Prompt 打包 + 分润 - **Phase G**:跨平台协作 · 定制书招募 + 自动匹配 ---