Commit Graph

36 Commits

Author SHA1 Message Date
weicw-dshsa a66dee49e1 fix(manuscript): 稿件类型收敛到上游 doc_type 枚举
与 admin 同一处病根:picker 把界面标签直接当 doc_type 下发,
而「公众号推文」「宣传稿」「发言稿」「短视频脚本」上游一个都不认,
选中就是一次必失败的提交。

- 选项收敛为 新闻稿 / 活动总结 / 微信推文 / 通知公告(外加「自由创作」)
- picker 拆成 label / value 两份:界面仍显示「公众号推文」,下发「微信推文」
- 快捷模板「发言稿提纲」换成「通知公告」,补对应示例内容
2026-10-23 14:22:34 +08:00
weicw-dshsa d99f4406fe fix(ai): 生成收尾不再只依赖 __END__,并清掉 WS 死代码
与后台两页保持一致:

- handleGenerate 收尾改 finally:loading 一定复位,不会再出现生成完按钮永久
  不可点(issue 20);提示按「失败 / 无正文 / 成功」区分
- 删掉已不会调用的 WebSocket 栈:connectWebSocket / disconnectWebSocket /
  refreshUser / socketTask / socketConnectPromise / socketHeartbeatStop /
  wsConnected / activeConversationId / activeMessageId,以及 attachHeartbeat、
  buildWebSocketUrl、getCurrentUser 与未使用的 manuscriptGen 导入
2026-10-23 12:57:12 +08:00
weicw-dshsa f010fcd8ef refactor(ai): 小程序稿件与大纲页文案去掉接口术语与多余提示
与后台两页保持一致,页面不再暴露实现细节:

- 删除「提交说明」整块(含 `files`/`inputs`、接口路径、WebSocket 说明)
- 稿件页删除「接口摘要」区、模式说明 tip 与 `files` 字段说明,
  parseResult 不再产出 summary
- 大纲页删除 resultSummary 与 buildSummary,加载态压成一行
- 空态与占位提示统一改为一句人话
2026-10-23 12:23:36 +08:00
weicw-dshsa 3309818160 feat(manuscripts): 正文按后端 contentFormat 渲染
- content-format 增加 normalizeFormat;toPlainText / getRenderPayload 支持显式格式
- 列表行与阅读抽屉透传 contentFormat,字段缺失时仍回退到按内容猜
2026-10-22 14:37:47 +08:00
weicw-dshsa 63295e98c5 fix(manuscripts): 我的稿件正文改用阅读抽屉渲染富文本
列表把 cms_manuscript.content 当纯文本输出,后台 wangEditor 存的 HTML
(<p>、<img>)和早期 AI 草稿的 markdown(##、**)都会原样露出来。

- 列表只留元数据:标题、首行摘要、状态、更新时间、字数;点一行从底部升起阅读抽屉
- 新增 components/manuscript-reader:mp-html 渲染正文(HTML / markdown / 纯文本按内容判定),
  支持长按选择、点击图片预览、复制标题、复制正文,有封面时展示封面
- 新增 utils/content-format:格式判定、纯文本化、渲染参数准备
- 搜索改为匹配标题 + 纯文本正文,不再直接匹配带标签的原始 content
- 正文每篇只解析一次(加载列表时),摘要、字数、搜索复用同一份纯文本
- 顺带修掉 hero 统计标签在浅色玻璃卡上不可见的问题
2026-10-22 12:55:53 +08:00
weicw-dshsa d449abe966 feat(ai): 小程序 AI 链路改走 HTTP 流式,WS 细节收敛到 utils/chat-socket
与 web 端同因:生成期间普通 POST 零字节,会被 60s 空闲超时掐成 504。

- 新增 utils/chat-socket.js:地址统一拼 /api/chat/{userId}(网关只放行 /api),
  attachHeartbeat 每 25s 发 ping;三个页面不再各抄一份
- chat-service 新增 streamAiRequest:H5 走 fetch + ReadableStream,小程序走
  enableChunked + onChunkReceived,并手写 UTF-8 分块解码,避免中文被切半
- 写作 / 图片 / 大纲 / 稿件改走 /stream,结构化结果从末帧 {type:'final'} 取;
  流断但有正文时保留已生成部分,不整块覆盖成错误文案
- 对话仍先试 WebSocket,连不上回退 /ai/chat/message/stream,帧处理复用
  handleSocketMessage
2026-10-21 19:18:13 +08:00
weicw-dshsa 5ce66be025 feat(ai): 创意助手各页下线参考素材上传,图片模式改传 mode(issue 19)
- 聊天页「图片」模式与独立创意助手页都删掉上传入口、上传状态与相关样式;
  上游出图工具只做文生图,开始节点的 file-list 变量没有任何节点消费(issue 16)。
- 图片模式请求体改为 { user_content, mode: 'image' },由后端包装意图声明;
  独立页不传 mode(通用入口,视频/脚本/图片靠用户文字说明)。
2026-10-21 15:43:02 +08:00
weicw-dshsa eaeba6120a feat(ai): 写作模式加「写作参数」面板,可选填活动信息
选了文体(走「内容创作与宣传助手」)后,输入框上方出现可折叠的写作参数面板:
活动类型 chip(含「不限」)、活动主题/时间/地点/参与人员四格,字数并入同一块。
自由创作(走「AI 创意助手」)时整块不出现。

- 面板 body 限高 340rpx 并在内部滚动:不限高会把底部输入框顶到 tabbar 后面。
- 只填参数、不写正文也能发送,气泡上用生成摘要占位。
- 活动类型默认空串(= 不限),不替用户猜类型。
2026-10-21 13:31:45 +08:00
weicw-dshsa a7a143bb26 feat(ai): 写作模式拆成自由创作与模板两条路(issue 18)
自由创作不再解析自然语言:原话整段作为 userContent 下发,docType 留空,由后端转
「AI 创意助手」。选了文体才提交 docType 等结构化条件,走「内容创作与宣传助手」。

- writing-params.js 删掉 parseWritingRequest 与关键字表,只留选项常量;`auto`
  改语义为「自由创作」。
- 字数选择器只在选中文体后显示;未选文体时不下发 number。
- 撤掉图片比例选择器:上游创意助手开始节点没有比例变量,只能拼进 user_content,
  那等于替上游写 prompt。要恢复需先在上游加变量。
- 稿件页同步:默认「自由创作」,选了模板才展开标题、活动类型、时间地点等可选项。
2026-10-21 12:39:48 +08:00
weicw-dshsa cf20f06cba chore(config): 生产环境 API 域名切到 twai-api.gxmu.edu.cn 2026-10-21 12:39:38 +08:00
weicw-dshsa 1d16e94c4e feat(cli): WSL 开发走 Windows 盘产物出口
- package.json 增 dev:mp-weixin:win / build:mp-weixin:win:用 UNI_OUTPUT_DIR 把产物写到
  ${WIN_OUT_DIR:-/mnt/d/tuanwei-dev}/<dev|build>/mp-weixin,供 WSL 编译 + Windows 侧开发者工具导入
- README 补「在 WSL 里开发」一节:分工、产物目录对照、WIN_OUT_DIR 覆盖与实测边界
- 人工冒烟回执:编译后导入微信开发者工具验证通过
2026-10-15 17:44:48 +08:00
weicw-dshsa 79420e28f6 merge: tuanwei-uniapp 切换到命令行构建(uni-app CLI 工程)
- 集成分支 feat/cli-migration 整体并入 master;此后 HBuilderX 不再是本仓库的构建方式
- 7 张票全部 resolved(.scratch/uniapp-cli/);产物 app.json / 分包 / tabBar / appid 与迁移前逐项一致,业务代码零改动
- 产物:pnpm build:mp-weixin → dist/build/mp-weixin,用微信开发者工具导入该目录
- 回滚:git revert -m 1 <本合并提交>;口径与取舍见 docs/adr/0009-uniapp-built-by-cli-not-hbuilderx.md
- 未做:微信开发者工具人工冒烟(清单见 .scratch/uniapp-cli/issues/03-artifact-parity-and-smoke-checklist.md)
2026-10-15 16:45:56 +08:00
weicw-dshsa c873cb4c8e merge(ticket-07): code-review 修复(@vue/runtime-core 钉版、README/ADR 措辞收敛) 2026-10-15 15:49:33 +08:00
weicw-dshsa 94a6f3064e docs(cli): 收敛 README 中 pnpm 策略措辞 2026-10-15 15:47:27 +08:00
weicw-dshsa 02e0189c6d build(cli): @vue/runtime-core 钉到精确 3.4.21 2026-10-15 15:46:08 +08:00
weicw-dshsa 4208f9acef merge(ticket-06): vue 钉到精确 3.4.21 2026-10-15 15:27:50 +08:00
weicw-dshsa 7fd4f287ab merge(ticket-04): 收尾文档(README) 2026-10-15 15:26:36 +08:00
ticket-06 137eb098e7 Merge branch 'feat/cli-migration' into ticket-06-pin-vue 2026-10-15 15:25:24 +08:00
weicw-dshsa d344cde2e1 Merge branch 'feat/cli-migration' into ticket-04-wrapup 2026-10-15 15:24:56 +08:00
ticket-04 d8f42e4da0 docs(cli): 补 README:CLI 构建步骤、产物路径与微信开发者工具导入层 2026-10-15 15:24:52 +08:00
weicw-dshsa 66fe42ad37 merge(ticket-05): 删除残留的空壳目录 uni_modules/uv-ui 2026-10-15 15:24:41 +08:00
ticket-06 a71e8a3a66 build(cli): vue 钉到精确 3.4.21
package.json 的 vue 由 ^3.4.21 收敛为精确 3.4.21,消除 @vue/server-renderer@3.4.21
想要 vue@3.4.21 的 unmet peer(此前 ^3.4.21 解析到 3.5.44)。
pnpm-lock.yaml 同步更新:仅 vue 家族版本变化,@dcloudio/* 版本集完全未变。
2026-10-15 15:24:01 +08:00
weicw-dshsa e6db59a925 chore(cli): 删除残留的空壳目录 uni_modules/uv-ui 2026-10-15 15:23:33 +08:00
weicw-dshsa 73ce89c87d merge(ticket-02): CLI 骨架、目录搬迁与首次命令行构建 2026-10-15 15:20:11 +08:00
ticket-02 agent 81a093120c build(cli): 迁移到 uni-app 官方 Vite CLI 骨架(src/ 布局)
按地图口径把 HBuilderX 工程改成官方 #vite(JS 版)CLI 工程:

- 业务代码 git mv 进 src/(176 个 rename,逐文件字节比对零内容改动):
  App.vue / main.js / manifest.json / pages.json / uni.scss /
  pages/ / packageMine/ / components/ / utils/ / static/ /
  uni_modules/ / uni.promisify.adaptor.js
- 新增官方骨架:package.json(@dcloudio/* 同版本 pin
  3.0.0-5020620260917001,vite 精确 5.2.8,vue ^3.4.21;只留 h5 与
  mp-weixin 脚本)、vite.config.js、shims-uni.d.ts;补 sass devDependency
  以支持既有 lang="scss"
- index.html 沿用本仓文件,入口改为 /src/main.js
- manifest.json 删除 app-plus / quickapp / mp-alipay / mp-baidu /
  mp-toutiao 五个死平台段,只留 mp-weixin
- .gitignore 加 dist/
- pnpm-workspace.yaml 新增 allowBuilds 白名单:pnpm 12 起
  onlyBuiltDependencies 已被移除,且 strictDepBuilds 默认 true 会把
  「未复核构建脚本」判成非零退出。白名单只列传递依赖
  esbuild / @parcel/watcher / core-js / core-js-pure。
  未使用 shamefully-hoist 或 node-linker=hoisted。

验收:pnpm build:mp-weixin 退出码 0,产物 app.json 的
pages / subPackages / tabBar / window 与改造前基线逐项一致;
project.config.json 落产物且 appid = wxf7ee9cd5801bf7a6。
2026-10-15 15:17:32 +08:00
weicw-dshsa 3a0c099704 style(ai): 助手页参数面板改为「每组选项各占一行」横向滑动
上一版把文体+字数、参考素材+比例各塞进同一个 scroll-view,靠后那组会被
滑出屏幕外;且在 375px 小屏上文体/字数仍会换行堆叠成 3 行,把消息区挤掉
小半屏。改为**每组选项各自一个 scroll-x 行**:

- 写作:文体一行、字数一行
- 图片:参考素材一行(「添加附件」放最左,保证不被滑出屏幕)、比例一行
- 删掉不再需要的竖分隔线 .option-sep
- 同步收紧 mode-tags 间距(16rpx → 12rpx)

实测(375×667 复刻页,见 probe/layout-preview.html):

| | 参数区 | composer 总高 | 占屏 |
| --- | --- | --- | --- |
| 写作 改版前 | 118.2px(3 行) | 185.4px | 28% |
| 写作 改版后 | 86.6px(2 行) | 153.8px | 23% |
| 图片 改版前 | 149.8px | 217.0px | 33% |
| 图片 改版后 | 120.6px | 187.8px | 28% |

横向轨道实测:文体 356px / 字数 381px 超出 331px 可用宽 → 确实滚动而非换行;
参考素材 163px、比例 242px 均在 331px 内,无需滑动即可看全。

验证:verify-uniapp-assistant-template.js 新增 4 项布局断言(每组恰好独占一个
option-scroll、无混行、chip/label 有 flex-shrink:0、旧版布局无残留),全绿;
判别力经 5 处变异测试证伪(删整行 / 去 flex-shrink / 加回分隔线 /
混入别组选项 / 退回换行堆叠)。

Refs: .scratch/ai-assistant/issues/15-uniapp-assistant-modes-align-web.md
2026-10-13 20:32:20 +08:00
weicw-dshsa 244f0c24d8 feat(ai): 问答助手页入口对齐 web,改为「聊天/写作/图片」(issue 15)
模式标签由「聊天/稿件/创意/策划」改为「聊天/写作/图片」,去掉策划链路;
写作与图片两个入口补上 web 端已有的表单与附件能力。

- 新增 pages/assistant/writing-params.js:web 端 writing-params.ts 的等价移植
  (零依赖纯函数)。写作模式加「文体/字数」面板,入参优先级改为
  「界面显式选择 > 键值入参 > 自然语言推断 > 默认值」——过去没有表单,
  只按「键:值」解析,解析不到就一律回落 doc_type=新闻稿 / Number=800,
  而上游提示词把这两项当主控指令,会直接压掉用户原话里的诉求(issue 13)
- 图片模式加「图片比例 + 参考素材」:附件组装成 user_files(上限 5,
  类型 image/video/audio/document),比例作为文本追加进 user_content
- chat-service 新增 uploadAiFile(file, app);上传必须带 app='creativeAssistant'
  —— Dify 的 /files/upload 按应用鉴权,不传 app 的附件必然报
  Invalid upload file(issue 14)
- 删除 buildOutlinePayload / formatOutlineResult 与 activityOutlineGen import;
  顺带清掉本次改动块内的死代码(未使用的 getCurrentUser、pickDisplayableText)

顺带修掉同源缺陷:pages/creative-assistant 的 uploadAiFile(file) 也没传应用凭证,
该页附件同样是坏的(issue 14 记的 gxmu/creativeAssistant 表单页那个缺陷)。

验证:移植等价性用例 8/8 —— 同一张用例表同时喂给小程序与 web 两端实现逐字段比对
JSON,另加 4 条常量/边界断言(防「两边一起错」);模板↔脚本静态一致性检查
(模板绑定名、this.X() 调用点、已删标识符残留)全绿,判别力经 5 处变异测试证伪;
5 个改动文件 node --check 通过,style 块花括号配平。
本机无 HBuilderX CLI 与 package.json,真机/微信开发者工具未跑。

本文件同时带有此前未提交的 issue 01 跟进改动(resolveFailedCreativeText:
创意失败态采用后端按原因映射的文案,但仍过 isDisplayableAnswer 兜底),
同一文件无法拆分。

Refs: .scratch/ai-assistant/issues/15-uniapp-assistant-modes-align-web.md
2026-10-13 20:17:58 +08:00
weicw-dshsa f4d0e4d4e5 fix(ai): 问答助手页大纲资金默认值不再填「待定」(issue 09)
上游 event_funding 是 number 类型,发「待定」这类不可解析的中文会让整个
工作流 failed(event_funding in input form must be a valid number)。
用户在自然语言里没提钱时,语义是「未提及」而非「待定」,故默认值改为空串;
后端也会把任何抽不出数值的原文降级为空串。
2026-10-13 00:37:24 +08:00
weicw-dshsa ffd10ee242 fix(tygl): 学院选项补上 organizationName/organizationId 映射
上一次修复(7245008)只把 listColleges() 的接口从 /gxmu/college 换成了
/system/organization?parentId=24,配套的 normalizeCollegeOptions 仍读
gxmu_college 时代的键名 collegeName/collegeId——这两个键在新接口里都不存在,
每项映射成 {label:'', value:''},随即被末尾的 .filter(item => item.label && item.value !== '')
整列表滤空,学院下拉没有任何可选值。

- normalizeCollegeOptions 的 label/rawLabel 补 organizationName,value 补 organizationId
  (保留旧键,兼容本地草稿缓存)
- 该映射此前无人核对:openCollegePicker 无条件弹面板,空选项表现为「没有匹配的选项」,
  静默吞掉了字段不匹配,不像原来的「只有 2 个选项」那样显眼

实测(本机 API):/system/organization?parentId=24 返回 103 条,修复前映射后 0 条,
修复后 103 条;护理学院(id=54) 仍能带出 69 个班级。班级映射未受影响。
2026-10-12 19:11:22 +08:00
weicw-dshsa 024d3dd122 fix(ai): 兜底收敛公共模块,失败态不再 stringify 整包(issue 03)
「拿不到字段就 stringify 整包」的兜底此前在 3 个页面各写一份,
其中 activity-outline:332 显式把 payload.raw 当兜底内容源,是最严重的一例。

- 新增 utils/ai-result.js:getPayloadStatus / isFailedPayload /
  isDisplayableAnswer / pickDisplayable / resolveDisplayText /
  logRawPayload 统一一处;解析不出内容给可读文案,原始报文只进
  console.error 不进 UI;UUID 与无空格长 token 不算可展示内容
- manuscript parseResult:失败态短路、pickDisplayable 挡标识符、
  summary 不再回显内部字段名
- activity-outline parseOutline:删掉 payload.raw 显式兜底,失败态短路
- assistant 页删除自带副本,改为 import 公共模块
- 流式收尾:appendAssistantChunk / appendOutlineChunk 支持 reset——
  后端判定失败时丢弃已累积的半截内容;新增 streamFailed 跟踪,
  失败后不再 toast「内容生成完成」/「活动策划大纲生成完成」
- 删除死代码:两页 stringifyUnknown、大纲页 pickNonEmptyString

验证:verify-other-links.js 27/27(修复前代码跑同脚本 13 失败,判别力已证伪);
verify-frontend-fallback.js 17/17 回归通过。

Refs: .scratch/ai-assistant/issues/03-other-links-raw-payload-fallback.md
2026-09-24 04:22:41 +08:00
weicw-dshsa 6bbbd386c8 fix(ai): 补齐失败态判定的三处遗漏(评审跟进)
对抗式评审发现上一版仍有三处同类缺口,一并修掉:

- formatCreativeResult 不再回落 payload.answer:失败报文里 answer 是
  workflow_run_id(UUID),而 status 缺失时(message_end 事件、后端流式兜底
  分支)失败短路不生效,裸 UUID 会进气泡
- 新增 isDisplayableAnswer / pickDisplayable:把 UUID 与无空格长 token
  这类内部标识符挡在展示之外,formatOutlineResult 与 formatManuscriptResult
  复用;大纳/稿件也一并加失败态短路,避免 03 落地后端后渲染成
  「标题 + 失败文案」
- creative-assistant 的 workflowFailed 补 data.status 回退,与 assistant 页
  及后端 workflowStatus(两处都看)对齐,避免退回误导性的「待执行」空态

验证:verify-frontend-fallback.js 17/17;verify-frontend-e2e.js 以后端真实产出
为输入跑通,渲染结果无内部标识符与原始 JSON。

Refs: .scratch/ai-assistant/issues/01-creative-assistant-raw-json-bubble.md
2026-09-24 03:51:53 +08:00
weicw-dshsa 4e022b4cca fix(ai): 失败态给出可读文案,不再 stringify 整包兜底
后端判定工作流失败后不再下发 outputs / raw,前端需据此给出可读提示,
而不是把整包对象 JSON.stringify 进气泡(含 workflow_id / req_id 等内部标识符)。

- assistant/index.vue:新增 getPayloadStatus / isFailedPayload / buildFallbackText;
  formatCreativeResult 与 formatOutlineResult 失败态短路为固定文案;
  formatManuscriptResult、formatOutlineResult、formatCreativeResult 的整包
  stringifyUnknown 兜底一律改为可读兜底文案
- 失败文案不取自 payload.answer:失败报文里它是 workflow_run_id(UUID),
  原样展示等于把内部标识符贴给用户
- creative-assistant/index.vue:新增 workflowFailed,状态标签显示「执行失败」,
  结果区给出失败文案,不再停在误导性的「待执行」空态

Refs: .scratch/ai-assistant/issues/01-creative-assistant-raw-json-bubble.md
2026-09-24 03:44:12 +08:00
weicw-dshsa 4dca69a807 修改端口号 2026-09-22 20:35:14 +08:00
weicw-dshsa 7175fb3070 小程序登录页新增统一身份认证入口
登录方式由两种扩为三种(密码 / 微信授权 / 统一身份认证),
新增 loginByGxmuSso 与 fetchGxmuSsoAvailable 两个接口封装。
2026-09-18 23:31:05 +08:00
weicw-dshsa 7245008497 团员档案:学院改从组织树取,班级改为选填
学院级联修复:
- 原先 listColleges() 取 /gxmu/college,读的是已废弃的 gxmu_college 表,
  其 id 域(1、4)与班级的 collegeId(sys_organization.organization_id,53~79)
  不重合,导致学院只列出 2 个选项、选完选不出真实班级
- 改为取组织树中「广西医科大学」(parentId=24) 的直接子节点;
  loadClassOptions 传的本来就是 organizationId,正好对齐

班级改选填:
- 研究生在开放平台体系中本就没有班级(1584 个班级里一个研究生班都没有),
  强制必填会把 15538 名研究生挡在团员档案之外
- 去掉 classId 的 required 与「有学院就必须有班级」的强校验,学院仍保持必填
2026-09-15 15:55:00 +08:00
b2894lxlx 2dcae4165b 260720 2026-07-20 11:56:02 +08:00