Skip to content

小程序端项目说明书

项目根目录:w:\AI-Pet-Project\xhs-miniapp-saas 小程序代码目录:miniapp/ 品牌名:智米口袋 / 智米军师(首页 Chat 页标题为「智米军师」) 支持平台:微信小程序(mp-weixin)、小红书小程序(mp-xhs),基于 uni-app 一套代码多端编译


1. 项目概述

小程序端是商家(租户)使用的内容创作工具,提供四大 Tab 功能:

Tab页面功能
智米军师pages/chat/indexAI 聊天助手(WebSocket 实时对话、图片/视频上传、AI 记忆)
生成文章pages/article-generate/index四步文章生成向导(方向→主题→生成→预览)
封面神器pages/cover-tool/index封面 AI 生成(多图分析→风格→生成封面)
个人中心pages/profile/index个人信息、公司资料、修改密码、退出登录

另有两个分包页面:subpkg-extra/pages/article-detail/index(文章详情)、subpkg-extra/pages/login/index(登录/注册)。

数据与安全:

  • 与 Web 端、后台管理端共享同一后端 API(FastAPI)与数据库(PostgreSQL),通过 RLS 行级隔离 保证数据按商家(merchant)隔离。
  • 所有请求携带 JWT(Authorization: Bearer)+ HMAC-SHA256 请求签名X-Timestamp/X-Nonce/X-Signature/X-Body-SHA256),防篡改、防重放(详见第 7 节)。
  • 小程序端沿用单 access token(TTL 长,不升级双 token);Web 端才使用双 token 体系。

2. 技术栈

层次技术说明
跨端框架uni-app(Vue 3 + Vite)@dcloudio/uni-app alpha 版本,一套代码编译到微信/小红书
状态管理Pinia ^2.1stores/auth.ts 登录态
语言TypeScript 5 + <script setup>
样式SCSS(uni.scss)+ 全局 App.vue 样式智米口袋浅色多色调风格
构建Vite 5 + @dcloudio/vite-plugin-unibuild:mp-weixin / build:mp-xhs
请求自封装 uni.requestapi/request.ts签名 + token + 统一错误提示
后端FastAPI /api/*与 Web/Admin 共享

3. 整体架构图

mermaid
graph TB
    subgraph 小程序[uni-app 小程序(微信/小红书)]
        UI["四大 Tab 页面<br/>Chat / 生成文章 / 封面神器 / 个人中心"]
        WIZARD["useArticleWizard 生成向导"]
        CHAT_COMP["useChat + WebSocket"]
        COVER_COMP["cover-tool 封面流程"]
        API["api/* 接口封装"]
        REQ["request.ts<br/>token + HMAC 签名"]
    end

    subgraph 后端[FastAPI :8000]
        SEC["verify_request_signature<br/>HMAC + nonce 防重放"]
        AUTH["/api/auth/* 注册/登录/改密"]
        ARTICLE["/api/article/* 生成/CRUD/adjust/check"]
        TASK["/api/task/* 状态/结果/取消"]
        UPLOAD["/api/upload/* 素材AI分析"]
        COVER["/api/cover/* 封面项目/图片/风格/生成"]
        CHAT_REST["/api/chat/* REST(ws-ticket/历史/引导/上传)"]
        WS["/api/chat/ws WebSocket"]
        DBSESS["DbSession (RLS: app.current_merchant_id)"]
    end

    subgraph 数据[PostgreSQL 16 + pgvector]
        DB_TABLES["merchants/articles/tasks/images<br/>merchant_knowledge_chunks<br/>cover_projects/cover_images/cover_styles/cover_covers<br/>chat_conversations/chat_messages/chat_memory_docs<br/>platform_rules/global_knowledge_docs"]
    end

    UI --> WIZARD
    UI --> CHAT_COMP
    UI --> COVER_COMP
    WIZARD --> API
    CHAT_COMP --> API
    CHAT_COMP -->|"wss://"| WS
    COVER_COMP --> API
    API --> REQ
    REQ --> SEC
    SEC --> AUTH
    SEC --> ARTICLE
    SEC --> TASK
    SEC --> UPLOAD
    SEC --> COVER
    SEC --> CHAT_REST
    WS --> DBSESS
    AUTH --> DBSESS
    ARTICLE --> DBSESS
    TASK --> DBSESS
    UPLOAD --> DBSESS
    COVER --> DBSESS
    CHAT_REST --> DBSESS
    DBSESS --> DB_TABLES

4. 目录结构总览

miniapp/
├── env.d.ts                      # 环境变量类型声明
├── index.html                    # uni-app 的 H5 兜底入口(实际以小程序为主)
├── package.json / package-lock.json
├── project.config.json           # 微信开发者工具项目配置
├── tsconfig.json
├── vite.config.ts                # uni 插件配置
├── scripts/
│   └── strip-dcloud-preload.js   # 构建后清理 dcloud 预加载脚本(小程序兼容)
└── src/
    ├── main.ts                   # uni-app 入口(createSSRApp)
    ├── App.vue                   # 全局生命周期 onLaunch + 全局样式
    ├── manifest.json             # 应用配置(appid、权限、接口域名)
    ├── pages.json                # 页面路由 + tabBar + 分包 + 预加载
    ├── uni.scss                  # 全局 SCSS 变量
    ├── api/
    │   ├── request.ts            # 统一请求封装(签名+token+错误处理)
    │   ├── token.ts              # token 存取(记住我)
    │   ├── auth.ts               # 登录/注册/改密
    │   ├── article.ts            # 文章生成/CRUD/adjust/check
    │   ├── task.ts               # 任务状态/结果/取消
    │   ├── upload.ts             # 素材上传分析
    │   ├── cover.ts              # 封面项目全部接口
    │   └── chat.ts               # 聊天 REST + WS URL
    ├── components/
    │   ├── CustomTabBar.vue      # 自定义 TabBar
    │   ├── ProgressTracker.vue   # 步骤进度条组件
    │   └── generate/
    │       ├── StepInput.vue     # 生成第一步:方向输入
    │       ├── StepTheme.vue     # 第二步:主题选择
    │       ├── StepProgress.vue  # 第三步:生成进度
    │       └── StepPreview.vue   # 第四步:预览/编辑/微调
    ├── composables/
    │   ├── useArticleWizard.ts   # 文章生成向导状态机
    │   ├── useChat.ts            # 聊天组合式函数
    │   ├── useGenerateProgress.ts# 生成阶段进度映射
    │   ├── useKeyboardDock.ts    # 键盘弹起吸附(聊天输入)
    │   └── useTaskPolling.ts     # 任务轮询
    ├── pages/
    │   ├── chat/index.vue        # 智米军师(Tab 1)
    │   ├── article-generate/index.vue  # 生成文章(Tab 2)
    │   ├── article-list/index.vue      # 历史记录(Tab 3 上级页)
    │   ├── profile/index.vue     # 个人中心(Tab 4)
    │   └── cover-tool/index.vue  # 封面神器(Tab 3)
    ├── security/
    │   └── signature.ts          # 纯 JS 实现 HMAC-SHA256 签名
    ├── stores/
    │   └── auth.ts               # Pinia 登录态
    ├── subpkg-extra/
    │   └── pages/
    │       ├── article-detail/index.vue  # 文章详情(分包)
    │       └── login/index.vue           # 登录/注册(分包)
    ├── types/
    │   └── api.ts                # 全量接口 TS 类型
    └── utils/
        ├── authGuard.ts          # 登录守卫(未登录跳登录页)
        ├── safeArea.ts           # 安全区适配(底部内边距)
        ├── stage-progress.ts     # 阶段-进度映射常量
        └── wordCount.ts          # 字数统计(与后端口径一致)

说明:pages/article-list/index 是历史记录页,它在 pages.json 中虽非 Tab 页,但承载了「历史记录」入口(Tab 3「封面神器」与「历史记录」入口并存,见 CustomTabBar)。


5. 文件详解

5.1 工程配置

文件作用关联影响
src/pages.json页面路由注册:5 个主页面(chat/article-generate/article-list/profile/cover-tool)+ 分包 2 页(article-detail/login);tabBarcustom: true(自定义 TabBar);preloadRule 预加载 extra 分包;各页导航栏标题(智米军师/生成文章/历史记录/个人中心/封面神器)全部页面、CustomTabBar.vue新增页面必须在此注册;tabBar 配置影响自定义 TabBar 渲染
src/manifest.json应用级配置:appid、微信/小红书平台配置、接口域名白名单(mp-weixinmp-weixin 域)、uni-app 编译配置平台审核接口域名必须与后端线上域名(api.jvguang.com)一致,否则小程序请求被拦截
src/main.tscreateSSRApp(App) 创建 uni-app 实例App.vue应用入口
src/App.vueonLaunchpurgeTokenIfNotRemembered()(未勾选记住我则清 token 强制重登)+ 加载 token;全局样式(浅色多色调、按钮按压反馈、输入框聚焦态)stores/auth.tsapi/token.ts全局启动逻辑与全局样式
src/uni.scss全局 SCSS 变量(颜色/间距等)各页面主题变量
vite.config.tsuni 插件接入 + 环境变量全部构建配置
project.config.json微信开发者工具配置(appid、编译设置)微信平台开发者工具导入用
scripts/strip-dcloud-preload.js构建后删除 dcloud 预加载脚本(避免影响小程序原生运行)package.json postbuild构建产物修复

5.2 API 层

文件作用关联后端影响
api/request.ts统一请求:自动注入 Authorization、HMAC 签名头、Content-Type;默认 60s 超时、AI 接口 180s(AI_TIMEOUT);401 清 token 提示重登;按 statusCode 解析 detail 错误并 toast后端全部接口请求基础;改动影响所有页面请求
api/token.tstoken 读写封装:getToken/setStoredToken/clearStoredToken + 「记住我」偏好(勾选存 storage,否则每次启动清除)App.vuestores/auth.tsrequest.ts登录态生命周期
api/auth.tslogin / register / changePasswordPOST /api/auth/login/register/password登录注册改密
api/article.tssuggestKeywords / generateThemes / generateArticle / getArticleList / getArticle / updateArticle / deleteArticle / adjustArticle / checkArticle/api/article/suggest-keywords/themes/generate/list/{id}/{id}/adjust/{id}/check文章生成与 CRUD
api/task.tsgetTaskStatus / getTaskResult / cancelTask/api/task/{id}/status/result/cancel生成任务轮询与取消
api/upload.tsuploadAnalyze(单文件上传分析,uni.uploadFile)、uploadImagesAnalyze(多图 base64 JSON POST,因小程序不支持多文件上传)/api/upload/analyze/api/upload/analyze-images素材 AI 分析(视频/图片/文本)
api/cover.ts封面项目全部接口:createCoverProject / listCoverProjects / getCoverProject / updateCoverProject / deleteCoverProject / uploadCoverImage / deleteCoverImage / analyzeCoverProject / regenerateCoverStyles / generateCovers / selectCover/api/cover/projects*封面神器全流程
api/chat.tsgetWsTicket / listMessages / getSuggestedQuestions / buildWsUrl / uploadChatMedia/api/chat/ws-ticket/messages/suggested-questions/upload聊天 REST + WS 连接

5.3 安全签名

文件作用关联影响
security/signature.ts纯 JS 手写实现 SHA-256 / HMAC-SHA256(小程序无 WebCrypto,无法用 Web 端的 crypto.subtle):stableStringify 稳定序列化 body → sha256HexhmacSha256Hex(token, canonical),canonical 为 timestamp\nnonce\nMETHOD\npath?query\nbodyHash;返回 X-Timestamp/X-Nonce/X-Signature/X-Body-SHA256api/request.ts、后端 security/request_signing.py与后端验签算法必须完全一致,改动任何一端都会导致 401「请求签名无效」

5.4 状态与工具

文件作用关联影响
stores/auth.tsPinia store:token/userlogin/logout/setToken/setUser/checkAuthlogout 清 token 与用户信息全部页面、api/auth.ts登录态唯一来源
utils/authGuard.tsrequireLogin():无 token 时 uni.navigateTo 跳登录页各页面 onShow/onLoad页面访问控制
utils/safeArea.tssafeBottomPadding 安全区适配(底部按钮不被系统手势遮挡)各页面底部按钮真机适配
utils/stage-progress.ts任务 stage(rag_search/generating/checking/formatting)→ 进度百分比映射useGenerateProgress.ts生成进度展示
utils/wordCount.ts前端字数统计(与后端 visible_char_count 口径一致:剥离不可见字符与 [图N] 标记)article-generatearticle-detail字数一致性

5.5 组合式函数(composables)

文件作用关联影响
useArticleWizard.ts文章生成向导状态机:WizardView(input/theme/progress/preview)、账号类型(企业号/素人号/探店号)、关键词上限 8、标题上限 20 字;管理 step 数据流转(方向→关键词→角度→主题→生成参数)article-generate/index.vuecomponents/generate/*向导核心逻辑;改动影响生成流程状态
useGenerateProgress.ts将任务 stage + 时间预估转换为进度条文案/百分比useTaskPolling.ts进度展示
useTaskPolling.ts轮询任务状态(间隔 ~2-3s),到 done 拉取结果文章、failed 报错、cancelled 停止;支持手动 start/stoparticle-generate/index.vue生成任务完成闭环
useChat.ts聊天组合式函数:WS 连接生命周期(ticket → uni.connectSocket → 心跳/重连)、消息收发、流式回显、媒体上传、AI 记忆相关;管理消息列表与连接状态chat/index.vueapi/chat.ts聊天核心逻辑
useKeyboardDock.ts聊天输入框键盘弹起时自动吸附底部(监听键盘高度)chat/index.vue输入体验

5.6 组件

文件作用关联影响
components/CustomTabBar.vue自定义 TabBar(因 tabBar.custom: true):智米军师/生成文章/封面神器/个人中心 4 项 + 历史记录入口,高亮当前页pages.json、各 Tab 页底部导航;新增 Tab 需同步修改 pages.json 与本组件
components/ProgressTracker.vue步骤进度条(用于生成向导/封面流程)article-generatecover-tool视觉组件
components/generate/StepInput.vue第一步:内容方向输入(文本框 + 上传素材分析 + 账号类型选择 + 关键词推荐)api/upload.tsapi/article.ts(suggestKeywords)输入阶段
components/generate/StepTheme.vue第二步:展示 AI 生成的 6 个主题/角度选项,选中后进入生成api/article.ts(generateThemes)主题选择
components/generate/StepProgress.vue第三步:任务进度展示(阶段文案+百分比),支持取消useTaskPolling.tsapi/task.ts(cancelTask)生成中
components/generate/StepPreview.vue第四步:预览生成文章(标题/正文/标签/图片占位),可编辑、合规自检(check)、AI 微调(adjust)、保存api/article.ts(updateArticle/adjustArticle/checkArticle)结果编辑

5.7 页面详解

pages/chat/index.vue — 智米军师(AI 聊天)

  • 功能:完整聊天 UI——欢迎卡片 + 引导问题(getSuggestedQuestions)、历史消息(游标分页 listMessages)、WS 实时收发(getWsTicketconnectSocketwss://.../api/chat/ws?ticket=)、流式打字回显、图片/视频上传(uploadChatMedia,HMAC 签名 URL 直接 <img> 显示)、AI 记忆回放、连接状态标签、键盘 Dock。
  • 关联useChat.tsuseKeyboardDock.tsapi/chat.tsCustomTabBar.vue
  • 影响:聊天是商家与平台 AI 交互的主入口;后端 chat_ws.py 断开时触发 _trigger_memory_analysis 自动生成记忆。

pages/article-generate/index.vue — 生成文章

  • 功能:四步向导容器:① 方向输入(可上传素材分析结果自动填充方向)② 主题选择 ③ 生成进度 ④ 预览编辑;调用 generateArticle 创建任务后 useTaskPolling 轮询,完成后进入预览。
  • 关联useArticleWizard.tsuseGenerateProgress.tsuseTaskPolling.tscomponents/generate/*api/article.tsapi/upload.tsapi/task.ts
  • 影响:文章的 source_client 由后端按请求头 X-Client-Type 决定(小程序发请求时不带该头,默认 mp_weixin;如需标记小红书来源可在请求头补充 X-Client-Type: mp_xhs)。

pages/article-list/index.vue — 历史记录

  • 功能:分页拉取当前商家的文章列表(getArticleList),展示标题/主题/字数/时间,点击进入详情;未登录跳登录。
  • 关联api/article.tsauthGuard.tsCustomTabBar.vue

pages/profile/index.vue — 个人中心

  • 功能:用户信息展示(getMe 数据来自 store)、公司资料维护(merchant profile 接口)、修改密码(changePassword,旧密码+新密码 8-64 位)、退出登录(清 token)。
  • 关联stores/auth.tsapi/auth.tsapi/merchant 相关(如存在)。

pages/cover-tool/index.vue — 封面神器

  • 功能:封面项目列表 + 创建项目(标题/文案/平台 xiaohongshu|douyin|video_account)→ 上传素材图(最多 9 张)→ analyzeCoverProject AI 分析生成 4 个风格 → generateCovers 按风格生成封面(后台异步,前端轮询 getCoverProject 至 COMPLETED)→ 选定封面(每项目一张)→ 下载。
  • 关联api/cover.tsapi/upload.tsauthGuard.tssafeArea.ts
  • 影响:封面生成在后端为后台任务(3-6 分钟),依赖「封面 AI 配置」(admin 模型配置页)的 cover_image 服务与即梦(Jimeng)凭据。

subpkg-extra/pages/article-detail/index.vue — 文章详情(分包)

  • 功能:单篇文章详情展示与编辑(标题/正文/标签),保存调 updateArticle
  • 关联api/article.ts

subpkg-extra/pages/login/index.vue — 登录/注册(分包)

  • 功能:手机号+密码登录 / 注册(手机号 ^1[3-9]\d{9}$、密码 8-64 位、确认密码),「记住我」开关;成功后写入 token 并返回来源页。
  • 关联api/auth.tsstores/auth.tsapi/token.ts
  • 影响:注册/登录规则必须与后端 models/auth.py 一致(后端是最终校验)。

5.8 类型

文件作用影响
src/types/api.ts全部接口类型定义(Article、CoverProject、ChatMessage、Task、UserInfo、UploadAnalyzeResponse、常量 DIRECTION_MAX_LENGTHMAX_UPLOAD_IMAGE_COUNT 等)与后端 schema 对齐,改动需同步

6. 后端关联接口总表(小程序使用)

模块方法路径用途关联服务
认证POST/api/auth/register注册auth_service.register_with_phone
认证POST/api/auth/login登录auth_service.login_with_password
认证GET/api/auth/me获取用户信息auth_service.get_merchant_by_id
认证POST/api/auth/password修改密码auth_service.change_password
商家GET/PUT/api/merchant/profile公司资料merchant_service
商家POST/DELETE/api/merchant/knowledge知识片段merchant_service
文章POST/api/article/suggest-keywords关键词推荐(同步)article_service.suggest_keywords
文章POST/api/article/expand角度扩展(同步)article_service.expand_keywords
文章POST/api/article/themes主题生成(同步)article_service.generate_themes
文章POST/api/article/generate创建生成任务(异步)article_service.generate_article(LangGraph 流水线)
文章GET/api/article/list文章列表article_service.list_articles
文章GET/PUT/DELETE/api/article/{id}文章 CRUD(PUT 带 If-Match 乐观锁)article_service
文章POST/api/article/{id}/adjustAI 微调article_adjust_service.micro_adjust + compliance_check
文章POST/api/article/{id}/check合规自检compliance_check.run_compliance_review
任务GET/api/task/{id}/status任务状态task_service.get_task
任务GET/api/task/{id}/result任务结果task_service + article_service.get_article
任务POST/api/task/{id}/cancel取消任务task_service.cancel_task
上传POST/api/upload/analyze素材 AI 分析(视频/图/文本)upload_service
上传POST/api/upload/analyze-images多图 base64 分析upload_service.analyze_multiple_images
封面POST/GET/api/cover/projects项目创建/列表cover_service
封面GET/PATCH/DELETE/api/cover/projects/{id}项目详情/更新/删除cover_service
封面POST/api/cover/projects/{id}/images上传素材图cover_service.upload_image
封面POST/api/cover/projects/{id}/analyzeAI 分析+风格生成cover_service.analyze_images
封面POST/api/cover/projects/{id}/styles重新生成风格cover_service.generate_styles
封面POST/api/cover/projects/{id}/covers生成封面(异步)cover_service + 即梦/Ark
封面PATCH/api/cover/projects/{id}/covers/{coverId}选定封面cover_service.select_cover
聊天POST/api/chat/ws-ticket获取 WS 一次性票据(30s)chat_ws.create_ticket
聊天WS/api/chat/ws?ticket=实时聊天chat_ws.handle_connection
聊天GET/api/chat/messages历史消息(游标分页)chat_service.get_messages
聊天GET/api/chat/suggested-questions引导问题chat_service.get_suggested_questions
聊天POST/api/chat/upload聊天媒体上传chat_storage + sign_upload_url
聊天GET/api/chat/uploads/{path}媒体静态服务(签名 URL)chat_storage + verify_upload_signature
规则GET/api/rule/list/api/rule/search平台规则展示/检索rule.py 路由

所有接口(除登录/注册外)都经过 CurrentSecureUser(JWT + 请求签名校验)与 DbSession(RLS 注入)。


7. 安全机制(小程序端)

  1. JWT 认证:登录后获得 access token,存放于本地存储(api/token.ts),请求头 Authorization: Bearer
  2. HMAC-SHA256 请求签名security/signature.ts):
    • 签名输入:timestamp\nnonce\nMETHOD\npath?query\nbodyHash,密钥为 access token 本身;
    • 后端 security/request_signing.py::verify_request_signature 用同一算法校验,并做 nonce 防重放(TTL REQUEST_SIGNATURE_TTL_SECONDS=300,重复 nonce 返回 409)与时间窗校验(±5 分钟);
    • Web 端用 WebCrypto 实现同一算法(web/src/api/signature.ts),两侧必须保持一致。
  3. RLS 租户隔离:数据库会话由 deps.get_db_session 注入 app.current_merchant_id(取 JWT sub),PostgreSQL RLS 策略保证任何查询/写入都限定在当前商家;聊天媒体 URL 使用 HMAC 签名(10 分钟过期),防止越权访问他人文件。
  4. 登录防爆破:后端 auth.py 对登录/注册做多维度限流(IP/手机号/UA 指纹维度)。

8. 关键业务流程

8.1 登录/注册

login 页 → 勾选《用户服务协议》《隐私政策》(默认未勾选,未勾选时登录/注册按钮置灰)
→ 手机号+密码 → POST /api/auth/login(带限流) → 后端 bcrypt 校验
→ 返回 access_token → stores/auth.setToken → 返回来源页(authGuard 记录 redirect)

注册需填昵称、行业;后端创建 merchants 行(密码 bcrypt 加密)。 协议/隐私为本地分包页面(agreementprivacy),个人中心可随时查看;隐私政策直接跳本地页面,不走 wx.openPrivacyContract(避免依赖后台隐私保护指引配置导致空白)。

8.2 文章生成(四步向导)

StepInput:方向文本/上传素材分析(AI 生成方向) → 选账号类型 → suggestKeywords(关键词)
StepTheme:generateThemes(方向+关键词+角度+商家知识库) → 6 主题选 1
StepProgress:generateArticle → 得 task_id → useTaskPolling 轮询 status/result
    · 后端流水线:rag_search → agent_generate → format_assemble(LangGraph)
    · 完成:_save_article 落库(source_client 按 X-Client-Type 头,小程序默认 mp_weixin)+ set_task_done
StepPreview:预览 → check(合规自检) → adjust(AI 微调) → updateArticle 保存(If-Match 乐观锁)

8.3 聊天(WebSocket)

进入 chat 页 → POST /api/chat/ws-ticket 拿一次性票据(30s) → buildWsUrl → uni.connectSocket
→ 后端 consume_ticket 校验 IP+票据 → handle_connection
→ 发消息 {type:"dm", content/mediaUrl/mediaType}
→ 后端 _save_and_echo 落库回显 + _trigger_ai_reply(流式返回,自动回复开关开启时)
→ 引导问题/欢迎语:generate_welcome;断开时 _trigger_memory_analysis 生成记忆
→ 客服接管时收到 sender_role=admin 消息实时展示

8.4 封面神器

创建项目(标题/文案/平台) → 上传素材(≤9张, 每张≤20MB) → analyze(多图AI分析→4风格)
→ 选风格 → generateCovers(后台异步, 即梦生成 3-6 分钟) → 轮询目标 style 的 covers → COMPLETED → 选定/下载

即梦出图尺寸为 64 倍数标准映射(3:4 → 896×1152);生成任务后台串行执行(并发锁),规避算法 50501 与单账号 429 限制。


9. 构建与发布

bash
cd miniapp
npm install
npm run build:mp-weixin     # 构建微信小程序(构建后自动 strip-dcloud-preload)
npm run build:mp-xhs        # 构建小红书小程序

产物目录:dist/dev/mp-weixin(微信)、dist/dev/mp-xhs(小红书),用对应开发者工具导入。

发布前检查:

  • manifest.json 中接口域名白名单包含 https://api.jvguang.com(微信后台需同步配置 request/socket 合法域名)。
  • 生产环境 VITE_API_BASE 指向线上 API 域名;本地联调指向 dev 后端。
  • 后端 .envCORS_ORIGINS 对小程序无影响(小程序请求无 Origin 预检),但 LLM 相关配置决定生成质量。

10. 影响分析汇总

变更点影响范围风险
修改 security/signature.ts 算法全部接口签名失效(401)
修改 request.ts 超时/错误处理全局请求行为
修改 useArticleWizard 步骤结构生成向导全流程
修改 pages.json tabBar/路由页面入口与自定义 TabBar
修改后端文章流水线(rag/generate/format)小程序+Web 生成结果
修改后端聊天(chat_ai/chat_ws)小程序+Web+Admin 会话
修改后端封面 AI 配置小程序+Web 封面生成
修改 models/auth.py 注册/登录规则小程序+Web+Admin 三端登录

11. 常见问题

  1. 请求报 401「缺少请求签名」:token 为空(未登录)或签名头缺失;确认 request.tsgetToken() 有值时才注入签名。
  2. 请求报 401「请求签名无效」:小程序 signature.ts 与后端验签算法不一致(常见于改 URL 拼接或 stableStringify);注意签名必须用 path?query(不含域名)。
  3. AI 响应超时:前端 60s 默认超时对 LLM 偏短,AI 类接口用 AI_TIMEOUT=180000;后端 LLM 超时 30s+重试。
  4. 登录后仍跳登录页App.vuepurgeTokenIfNotRemembered 会在未勾选「记住我」时清 token——每次冷启动都需重新登录属预期行为。

基于 VitePress 构建 · 由 GitHub Actions 自动部署