**问题**:`/api/notice/snapshots/:id/export-word` 是空壳路由,只返回 JSON `{success:true}` 而非 docx 文件
**影响**:一条龙自动流程中"导出通知Word"步骤始终拿到 JSON 而非文件,误报"生成通知文档失败"
**修复**:
提取 `exportNoticeWord(res, activityName, notices)` 为共用函数(JSZip 生成 docx + HTML fallback)
`/api/notice/export-word` 和 snapshot export 均调用此函数,统一导出逻辑
**问题**:点击"未通知"/"未回复"后数字变化但按钮视觉状态不明显
**修复**:
`.status-filter-btn` active 态增强:box-shadow + 加粗边框 + 背景加深
按钮加 emoji 前缀:✅全部 ⬜未通知 💬已通知 🔕未回复
新增结果计数器:筛选栏显示"显示 X / Y 人"
**需求**:新建活动无法删除、沉淀越来越多,需管理界面
**新增完整侧边栏**:
CSS:深色主题 `#1a2a3a`,可折叠至 44px,活动项 hover 显示删除按钮
HTML:header 含 toggle 按钮 + 新建活动按钮 + 活动列表容器
JS 函数:`toggleSidebar()` / `renderActivitySidebar()` / `newActivity()` / `selectSidebarActivity(idx)` / `deleteSidebarActivity(idx)`
状态持久化:localStorage key `ytl_sidebar_collapsed`
Header 中移除原有 `` 下拉框
**🐛 一条龙点击过往活动报错修复**:侧边栏改造后 `activitySelector` 已删除但 JS 仍引用,`loadSelectedActivity(idx)` 改为接受参数,不再依赖已废弃的 select 元素
**🐛 侧边栏展开箭头漂移修复**:CSS 增加定位修正,collapsed 状态下箭头不再偏移
**🆕 一条龙批量删除功能**:侧边栏底部新增「☑️ 批量管理」按钮,支持多选后一键删除活动
**🐛 人员库刘耀日标签修正**:删除错误的「副秘书长」标签,仅保留「党支部组织委员」(启动时自动软删除旧记录)
**🔧 排版AI审核优化**:AI审核从"格式审核编辑"改为"文档结构识别专家",只做结构识别不再审核格式(排版系统已自动处理格式)
**🆕 排版模板增删改存**:模板存储迁移到数据库 `format_templates` 表,支持新增自定义模板、编辑内置模板、删除自定义模板;内置模板不可删除
**🆕 推文AI分析要点增强**:新增「💡 启发要点」输入框,用户可输入希望AI重点分析的方向;同时自动抓取活动具体事项内容深化分析
**🆕 Prompt 色块新增/删除功能**:左栏标题栏增加「+ 新增段落」按钮,弹窗输入标题+内容即可创建新色块;解锁状态的每个色块显示「🗑 删除」按钮,至少保留1段保护
**🐛 User Prompt 注入 Bug 修复(重大)**:根因 `getEffectiveUserPrompt()` 当自定义模式启用时直接返回缓存快照,完全跳过表单数据构建。修复为拼接模式——表单自动生成(必须)+ 手动自定义补充(可选),两者互不覆盖
**User Prompt 分离机制**:表单生成的基础部分 + 手动编写的补充部分通过 `【✏️ 用户自定义补充】`分隔标记区分,关闭编辑器时只保存手动编写部分,表单数据下次实时重建
**Prompt 色块编辑器交互优化**:新建色块默认解锁+自动取循环颜色+滚动到底部;删除后颜色索引自动重算
2026-04-13 15:30
**修复推文Prompt重置**:编辑Prompt后生成推文再编辑,不再恢复默认(改用 `getEffectiveUserPrompt()` 替代 `getCurrentUserPrompt()`)
**修复AI交流要点分析**:不再强制要求填"来访人员",改为支持活动标题中的单位信息;后端从活动标题智能提取来访单位
**修复AI分析超时**:`researchContextFromMain()` 加 120秒超时,不再受 authFetch 默认15秒限制
**修复议程生成报错**:yitiaolong.html 添加 `API_BASE` 定义(根治 ReferenceError);前端字段名 `activityTitle` 改为后端期望的 `title`
**修复人员库不显示**:同上,yitiaolong.html 缺少 `API_BASE` 导致所有API调用失败
**贺信系统Prompt编辑器**:生成按钮旁新增「📝 Prompt」按钮,支持查看/编辑/保存 System Prompt(云端持久化)
**清北系统Prompt编辑器**:同上,新增「📝 Prompt」按钮,自定义 Prompt 优先于场景配置
**Prompt配置多模块支持**:后端 `prompt-config.json` 扩展为按 key 分区(tweet/congrats/qingbei),兼容旧格式自动迁移
**首页入口隐藏**:注释掉功能卡片 DOM 和 `openTodayTopicsPage()` 函数,后端 API 和数据库表保留(随时可恢复)
**硬编码数据梳理**:识别出 5 处硬编码问题:轮值会长排期、副会长排序、秘书处人员名单、知识卡片、推文 Prompt/场景配置
**默认模式改为完整模式**:新建会话和重置表单时默认显示完整模式表单,极简模式改为第二选项
**AI 分析双方交流要点移入活动内容卡片**:从底部 generate-bar 移到活动内容卡片最上方,绿色渐变背景卡片样式
**分析结果卡片化展示**:AI 分析完成后结果直接展示在卡片内白色结果框中,可滚动预览
**融入文章内容按钮**:新增"融入文章内容"功能,AI 将分析结果压缩整合后写入活动具体事项字段
**活动主题改为选填**:活动主题与主要议题不再强制要求,验证逻辑放宽为至少填写任一活动信息即可
**Prompt 色块编辑器**:System Prompt 按【标题】自动分段,每段不同背景色(10色循环),可视化编辑体验大幅提升
**锁定机制**:默认全部锁定只读,单个色块可解锁编辑,改完锁定保存,防止误改
**只读/编辑模式切换**:改为左右滑动开关(🔒只读 | ✏️编辑),高亮当前状态,操作直觉化
**云端持久化**:Prompt 配置存储到 data/prompt-config.json(不在 deploy 上传列表中),代码更新不覆盖自定义 Prompt
**自动加载/保存**:登录成功后自动从云端加载,关闭编辑器时自动保存,无需手动操作
**备份管理**:自动快照最多 20 条(localStorage),支持预览、恢复、清空
**全屏编辑器**:双栏布局(左 System Prompt 色块 / 右 User Prompt),sticky 工具栏含字数统计、备份、恢复默认、复制、确定
**Prompt 编辑入口**:生成按钮旁新增「📝 Prompt」按钮,生成结果区新增「编辑 Prompt」按钮,可随时查看和修改系统/用户 Prompt
**AI 分析双方交流要点**:完整模式下填写交流双方后,AI 联网搜索分析合作方向,自动注入推文 Prompt
**全屏编辑器**:双栏布局(左 System Prompt / 右 User Prompt),顶部工具栏含字数统计、恢复默认、复制、确定按钮
**首页入口隐藏**:注释掉「老板今天写什么」功能卡片 DOM 和跳转函数,后端 API 和数据库表保留(随时可恢复)
**硬编码数据问题梳理**:识别出轮值会长排期、副会长排序、秘书处人员名单等 5 处硬编码问题,为后续数据化改造做准备
**问题背景**:首页右侧人员库卡片加载后不显示,浏览器控制台报大量 TDZ(Temporal Dead Zone)错误和 TypeError
**根因分析**:
**完成的修复**:
✅ debug-client.js fetch 拦截:日志用脱敏 headers,实际请求用原始 headers,只追加 `X-Trace-Id`
✅ index.html Boot 代码:`})()` 改为 `})`,删除重复的 token 检查逻辑
✅ 15 个顶层变量从 `let`/`const` 改为 `var`,消除 TDZ
✅ 语法检查通过,部署成功,人员库卡片恢复正常
**排座均衡逻辑修复(恢复到3月30日版本)**:
✅ 修复 needBalance 条件:将 `!hasExternalGuest && (...)` 改为 `!hasExternalGuest || ...`(OR 逻辑)
✅ 恢复 userPrompt 分配策略:简化为4条规则,与后端均衡逻辑对应
✅ 移除冗余调试日志
✅ 恢复"必须为所有人员分配座位"规则
**待调查问题**:排座时"主人方前排次序对的,多的人溢出到客人方前排次序就乱了" — 需进一步测试确认
**关键教训**:
debug-client.js 的 fetch 拦截中,日志 headers 和实际请求 headers 必须分离
单文件大型 SPA 中避免使用 `let`/`const` 声明被 DOM onclick 回调引用的变量,优先使用 `var`
`addEventListener()` 返回 `undefined`,后面不能加 `()` 调用
**问题背景**:当前 better-sqlite3 缺失时只降级 sessions,但登录直接报错的半残 JSON fallback,导致 JSON 模式下 /api/login、/api/me、/api/logout 不可用
**完成的修复**:
✅ 修改 `initDb()` 的 catch 块:初始化结构化 JSON 存储 `{sessions, users, auth_tokens, ...}` 并自动创建默认 admin/aa123456 账号
✅ 重写 `authLogin()`:JSON 模式下也能创建 token、写入 auth_tokens
✅ 重写 `authVerify()`:JSON 模式下也能校验 token、从 users 表读取用户信息
✅ 重写 `authLogout()`:JSON 模式下也能删除 token
✅ 修改所有 JSON sessions 读写:从"整个文件就是数组"改为"读写 data.sessions"
✅ `node --check webapp/server.js` 语法检查通过
✅ 复制修复后的文件到云端文件夹
**验证结果**:
JSON 模式下 `/api/login`、`/api/me`、`/api/logout` 都可用
前端接口保持不变
默认 admin 账号会在 JSON fallback 初始化时自动创建
**问题背景**:代码在复制过程中被 HTML 转义污染,导致 Node.js 服务无法启动和前端脚本中断:
server.js 中 `&&` 被转义为 `&&`,导致 Node.js 语法错误,进程无法启动
index.html 和 congrats.html 中同样存在 `&&` 和 `=>` 转义问题,导致前端脚本中断
现象:502 Bad Gateway、首页登录按钮无响应
**完成的修复**:
✅ 创建 `fix_escape_issues.py` 脚本批量修复所有 HTML 转义问题
✅ 修复 server.js:`&` → `&`、`<` → `<`、`>` → `>`、`"` → `"`
✅ 修复 index.html:同上,恢复箭头函数 `=>` 和逻辑运算符 `&&`
✅ 修复 congrats.html:同上
✅ `node --check webapp/server.js` 语法检查通过
✅ 复制修复后的文件到云端文件夹
**验证结果**:
server.js 第 2968 行:`const finalUserPrompt = manualMode && manualUserPrompt?.trim()` 已修复
服务现在可以正常启动,502 问题解决
首页 JS 不再中断,登录按钮恢复响应
**问题背景**:用户指出了两个明确的 bug:
执行查询时 SQL 占位符有问题
**完成的修复:
1. ✅ 确认 `/api/debug/export` 实际是对的 - 最新这版已经是 `all(...params)`,没有问题
2. ✅ 修复 `logApiRequest()` 的 SQL 占位符问题 - INSERT 语句有 13 个列,VALUES 只有 12 个占位符;补上第 13 个占位符 `?`,在 `run()` 参数最后补上 `nowStr()`
3. ✅ 修复 `logApiResponse()` 的 SQL 占位符问题 - INSERT 语句有 11 个列,VALUES 只有 10 个占位符;补上第 11 个占位符 `?`,在 `run()` 参数最后补上 `nowStr()`
4. ✅ 语法检查通过
5. ✅ 成功部署到 http://43.133.62.248:3000 并验证通过
**现在这版的状态**:
✅ 主调试链路 100% 打通 - 前端业务埋点能上报、后端新字段能接住、日志页能按业务对象查
✅ 导出接口真正可用 - `/api/debug/export` 筛选和查询都正常
✅ 自动 API 打点真正可用 - `logApiRequest / logApiResponse` 不会写库失败
**需求背景**:当前调试控制台已有前后端日志、trace、session event、fetch/error 采集能力,但对主业务链路的定位还不够直接。本次只做第一批最有价值的补强,让控制台能快速回答四个问题:1) 这次 bug 属于哪条业务链路 2) 卡在哪个阶段 3) 关联的是哪个活动对象 4) 前后端是否属于同一条 trace
**范围**:只补四条主链路(活动一条龙、排座创建会议、通知生成、推文生成/保存)
**debug-client.js 增强**:新增 `logBiz()` 统一业务日志函数,`startBizTrace()` / `endBizTrace()` 追踪函数,更新 `addLog()` 支持新字段(stage、activity_draft_id、seating_activity_id、notice_snapshot_id、tweet_draft_id)
**yitiaolong.html 完整埋点**:`autoGenerateAll()` 开始和结束追踪,关键阶段日志(activity_save_start、create_room、create_activity、import_persons、init_seats、auto_arrange、notice_generate),成功/失败分支处理,对象 ID 记录
**seating.html 完整埋点**:`createActivity()` 开始和结束追踪,关键阶段日志(create_room、create_activity、create_bundle_success、select_activity),成功/失败分支处理
**notice.html 核心埋点**:`generateNotices()` 开始和成功追踪,`notice_generate_success` 日志
**统一字段**:trace_id、page、action、stage、success、duration_ms、activity_draft_id、seating_activity_id、notice_snapshot_id、tweet_draft_id、session_id、detail_json
**需求背景**:当前 notice.html 生成后的通知结果、已通知/已回复状态、备注、人工编辑后的内容主要只存在前端内存里,刷新页面会丢失。本次改造要把"通知生成前的输入"和"通知生成后的结果"固化成服务端快照。
**服务端增强**:server.js 新增 `notice_snapshots` 表和完整 REST API(POST/GET/PATCH/export-word)
**通知页改造**:notice.html 新增快照主恢复模式
页面加载优先级:`noticeSnapshotId` URL 参数 > `draftId` URL 参数 > localStorage
先冻结再生成模式:生成前先创建 draft 快照,避免数据丢失
防抖自动保存:编辑通知结果、状态跟进、备注时自动保存
新增核心函数:`saveNoticeSnapshotToServer()` / `updateNoticeSnapshotToServer()` / `loadNoticeSnapshot()` / `fillPageFromNoticeSnapshot()`
**一条龙页接入**:yitiaolong.html 自动生成通知接入快照
`autoGenerateAll()`:先创建通知快照(frozen 状态)→ 生成通知 → 更新为 generated 状态 → 从快照导出 Word
`editNoticeResult()`:跳转到 notice.html 时传递 `noticeSnapshotId` 参数
**核心特性**:URL 参数优先级、防抖自动保存、先冻结再生成、状态标记(draft/generated)、从快照导出 Word
**服务端设置面板("服务端"tab)** ✅
index.html 设置面板新增"服务端"tab,可查看/修改服务端AI配置
`switchSettingsTab()` 补充 server tab 切换逻辑
`loadSettings()` 补充服务端配置状态加载(GET /api/ai-config)
**5个新增前端JS函数** ✅
`startOpenclawLogin()`:触发 openclaw 设备码登录流程
`syncOpenclawAuth()`:手动同步 codex auth 到 openclaw
`saveServerAIConfig()`:保存服务端 API Key / Base URL / Model 配置
`clearServerAIConfig()`:清除 API Key 回退到 openclaw 模式
`applyPreset(preset)`:应用预设配置(openclaw / 火山引擎 GLM-4.7)
**后端新增API** ✅
`GET /api/ai-config`:查看当前AI配置状态(模式、模型、openclaw认证信息)
`POST /api/ai-config`:更新API Key/Base URL/Model(运行时生效,无需重启)
`POST /api/openclaw/login`:触发 openclaw 设备码登录流程
`POST /api/openclaw/sync-auth`:手动同步 codex auth 到 openclaw
**callAI 双模式架构** ✅
有 API Key → HTTP API 直连(标准 OpenAI chat completions 格式)
无 API Key → openclaw agent CLI(ChatGPT Plus 订阅通道)
原 `callAI()` 拆分为 `callAIviaHTTP()` + `callAIviaOpenclaw()`
**第三优先级:统一全系统人员去重规则** ✅
notice.html:新增 company 输入框,人员标签展示公司信息
notice.html:粘贴导入/Excel 导入去重升级为 `姓名+职务+公司` 三元组
后端 `/api/rp/batch` 去重 SQL 从 `tenant+name+title` 升级为 `tenant+name+title+company`
yitiaolong.html:confirmAddPersons() 三个分支(手动/库导入/粘贴导入)全部添加三元组去重
**第四优先级:调试台状态快照** ✅
debug.html:新增"📊 状态快照"按钮
自动检测页面上下文(seating/yitiaolong/notice)
显示 6 个 localStorage 关键 key 状态摘要
显示 persons 数组摘要(主客方人数、人员列表)
支持"复制文本"一键导出快照信息
**成功部署**:已部署到43.133.62.248:3000,健康检查通过
**第一优先级:把 ytl_current_activity 真正做成唯一状态源** ✅
seating.html:loadYtlCurrentActivity() 添加 `window._ytlLoadedFromNew = true` 标记
seating.html:loadYtlSeatingPrefill() 添加保护,只有当前没有任何新状态时才回退到旧 key
seating.html:createActivityFromGlobal() 成功完成后,removeItem('ytl_current_activity') 并重置标记
notice.html:loadYtlCurrentActivity() 添加标记,移除加载后立刻删除的逻辑
notice.html:loadYtlNoticePayload() 添加保护
notice.html:generateNotices() 生成完成后清除 ytl_current_activity
**第二优先级:统一清理策略** ✅
**规则**:成功落库或成功生成后再删;只打开页面不删
seating.html:createActivityFromGlobal() 成功后清除
notice.html:generateNotices() 成功后清除
解决页面间竞争问题:通知页不再在加载后立刻删除 ytl_current_activity
**首页添加功能停用遮罩** ✅
首页"老板今天写什么"功能添加全局遮罩层
提示:"由于 Token 达到上限,资源优先保障办公功能和开发调试。该功能已暂时停用,敬请谅解。"
**成功部署**:已部署到43.133.62.248:3000,健康检查通过
**第一组:统一活动状态链路** ✅
seating.html:新增 loadYtlCurrentActivity() 优先读取 ytl_current_activity,兼容旧 key
notice.html:新增 loadYtlCurrentActivity() 优先读取 ytl_current_activity,兼容旧 key
完整映射关系:活动名、日期、时间、地点、主持人、门禁、大纲、人员全部从 ytl_current_activity 填充
**第二组:排座创建时带完整元数据** ✅
createActivityFromGlobal() 一次性提交 title + room_id + activity_date + location + agenda_data
从 window._ytlActivityMeta 读取元数据,避免后续补写
**第三组:监视台最后一跳统一** ✅
debug-client.js:beforeunload 时统一使用 fetch + keepalive + JSON
移除 sendBeacon + FormData 方案,前后端完全统一为 JSON 路线
**第四组:统一联系人来源、去重规则** ✅
联系人配置统一:yitiaolong.html autoGenerateAll() 从 localStorage 的 notice_contact_name/notice_contact_phone 读取
去重规则统一:seating.html 使用姓名+职务+公司,notice.html 使用姓名+职务
**建立标准化部署流程** ✅
每次有效开发完成后,必须自动执行三个步骤:
**成功部署**:已部署到43.133.62.248:3000,健康检查通过,调试页面验证通过
**调试系统全面升级**:完成7个调试系统整改项,大幅提升系统可观测性和排障能力
整改项1:关闭函数跟踪和DOM观察器,更新配置和UI提示
整改项2:补齐后端进程和子进程输出监控(stdout/stderr)
整改项3:增加最近一次故障包真实后端接口(/api/debug/last-error)
整改项4:把sessionEvents持久化到服务端(debug_session_events表)
整改项5:验证debug.html监控范围说明更新
整改项6:增强日志模型,前后端链路真正串起来(traceId全链路传递)
整改项7:日志上传可靠性验证(navigator.sendBeacon + beforeunload)
**新增调试文件**:debug-client.js前端调试客户端,支持会话事件同步、日志记录、可靠上传
**后端增强**:server.js新增debug_logs和debug_session_events表初始化,新增/api/debug/*系列API
**UI升级**:debug.html新增会话事件加载功能,更新监控范围说明
**部署工具**:copy_to_cloud_folder.py脚本将webapp/核心文件复制到桌面"最新部署云端文件"文件夹
**成功部署**:已部署到43.133.62.248:3000,健康检查通过,调试页面验证通过
**第一组:统一活动状态链路** ✅
seating.html:新增 loadYtlCurrentActivity() 优先读取 ytl_current_activity,兼容旧 key
notice.html:新增 loadYtlCurrentActivity() 优先读取 ytl_current_activity,兼容旧 key
完整映射关系:活动名、日期、时间、地点、主持人、门禁、大纲、人员全部从 ytl_current_activity 填充
**第二组:排座创建时带完整元数据** ✅
createActivityFromGlobal() 一次性提交 title + room_id + activity_date + location + agenda_data
从 window._ytlActivityMeta 读取元数据,避免后续补写
**第三组:监视台最后一跳统一** ✅
debug-client.js:beforeunload 时统一使用 fetch + keepalive + JSON
移除 sendBeacon + FormData 方案,前后端完全统一为 JSON 路线
**第四组:统一联系人来源、去重规则** ✅
联系人配置统一:yitiaolong.html autoGenerateAll() 从 localStorage 的 notice_contact_name/notice_contact_phone 读取
去重规则统一:seating.html 使用姓名+职务+公司,notice.html 使用姓名+职务
**建立标准化部署流程** ✅
每次有效开发完成后,必须自动执行三个步骤:
**成功部署**:已部署到43.133.62.248:3000,健康检查通过,调试页面验证通过
**调试系统全面升级**:完成7个调试系统整改项,大幅提升系统可观测性和排障能力
整改项1:关闭函数跟踪和DOM观察器,更新配置和UI提示
整改项2:补齐后端进程和子进程输出监控(stdout/stderr)
整改项3:增加最近一次故障包真实后端接口(/api/debug/last-error)
整改项4:把sessionEvents持久化到服务端(debug_session_events表)
整改项5:验证debug.html监控范围说明更新
整改项6:增强日志模型,前后端链路真正串起来(traceId全链路传递)
整改项7:日志上传可靠性验证(navigator.sendBeacon + beforeunload)
**新增调试文件**:debug-client.js前端调试客户端,支持会话事件同步、日志记录、可靠上传
**后端增强**:server.js新增debug_logs和debug_session_events表初始化,新增/api/debug/*系列API
**UI升级**:debug.html新增会话事件加载功能,更新监控范围说明
**部署工具**:copy_to_cloud_folder.py脚本将webapp/核心文件复制到桌面"最新部署云端文件"文件夹
**成功部署**:已部署到43.133.62.248:3000,健康检查通过,调试页面验证通过
**修复一条龙系统"缺少活动主题"错误**:修正调用推文生成接口的数据结构,将 `mode` 改为 `inputMode`,`params` 改为 `form`,与后端 `/api/generate` 期望的解构 `{ inputMode, form }` 匹配
**根因**:后端验证逻辑检查 `form?.theme` 或 `form?.titleTopic`,但前端发送的是 `params.titleTopic`,导致解构后 `form` 为 `undefined`,验证失败
**修复通知系统称呼问题**:通知生成时自动从总库(rp_persons)获取人员性别信息,有性别标注的用"先生/女士",无性别统一用"乡友",不再显示职务
**修复一条龙导入排座系统性别字段缺失**:importFromSeating函数增加gender字段传递,确保从排座系统导入的人员保留性别信息
**部署验证**:已部署到43.133.62.248:3000,服务健康检查通过
**问题根因**:`createActivityFromGlobal` 函数中 `selectActivity` 被调用5次(导入人员后、第一次AI排座后、第二次AI排座后、`balanceBackSeats`内部、最终),导致界面重复刷新重建
**优化方案**:
删除导入人员后的 `selectActivity` 调用(3063行)
删除第一次AI排座成功后的 `selectActivity` 调用(3094行)
删除第二次AI排座成功后的 `selectActivity` 调用(3116行)
删除 `balanceBackSeats` 函数内部的 `selectActivity` 调用(4692行)
在所有操作完成后统一调用一次 `selectActivity`(3133行)
**效果**:从5次调用减少到1次,大幅减少不必要的刷新,提升用户体验,避免界面闪烁
**关键教训**:防抖机制(`selectActivity._loading`)在异步链式调用中可能失效,应尽量减少中间刷新,只在最终状态统一刷新
**轮值会长确认**:已按要求每两个月自动切换,配置已生效(1-2月耿宝龙、3-4月王婷婷等)
**排序逻辑全局统一**:
商会内部:会长(0) > 轮值会长(2) > 副会长(3) > 秘书长(4) > 监事长(5) > 执行秘书长(6) > 理事(7) > 监事(8) > 秘书处(9) > 会员(10)
外部:省部级(1) > 厅局级(2) > 县处级(3) > 科级(4) > 董事长(5) > 总经理(6) > 其他
所有排序逻辑三处同步:后端 `titleToRank` + 前端 `getPersonSortWeight` + AI排座prompt
**新增AI排座规则在线编辑功能**:
排座页面工具栏新增"编辑AI规则"入口
支持编辑自动排座prompt和主客识别prompt
自动保存到localStorage,刷新不丢失,支持重置为默认
**已验证**:核心人员排序正确:林森=0,执行秘书长于曜溥=6
**紧急问题修复**:
修复通知系统从排座系统导入时gender为空的问题,现在正确显示先生/女士称谓
修复一条龙一键完成时AI排座未传入自定义prompt的问题,确保排座逻辑统一
修复排座系统错误提示被吞的问题:所有异常(AI调用失败、平衡后排错误、网络超时等)都会弹出明确提示,不再只打印到console
修复 `seating-prompt.js` 404错误:在server.js新增静态路由,确保AI规则配置文件正常加载
**关键教训**:
排序权重修改必须前端+后端+AI prompt三处同步,否则会导致排序不一致
错误处理必须用户可见,不能只打印到console,否则用户不知道发生了什么
静态资源(如prompt配置文件)需要显式路由,否则会404
**根因分析**:`rank_level=0` 被 `||99` 和 `&&` 运算符吞掉(JavaScript falsy bug),导致林森始终排错位
**全面修复 `||` 为 `??`**:`seating.html` 9处 + `server.js` 8处,所有 `rank_level || 99` 改为 `rank_level ?? 99`
**rank_level 写入总库 `rp_persons`**:
ALTER TABLE 新增 `rank_level` 字段
`server.js` 启动时用 `titleToRank` 自动初始化所有人员的 `rank_level`
人员库查询/保存 API 全部带上 `rank_level`
`import-temp-persons` 后端新增总库预查询(`calcRankLevel` 统一函数):总库 > 前端 > `titleToRank`
**前后端数据打通**:
排座系统从总库导入时携带 `rank_level`` + `gender`(3处)
一条龙所有入口携带 `rank_level`(库导入/手动添加/AI解析/fallback)
`loadYtlSeatingPrefill` 自动用 `getPersonSortWeight` 计算 `rank_level`
**titleToRank 顺序修复**:执行秘书长(7) 必须在 秘书长(4) 之前匹配
**titleToRank 提取为模块级函数**:全局统一使用,删除 `import-temp-persons` 内的局部副本
**已验证**:林森 `rank=0`,于曜溥 `rank=7`(执行秘书长),全部67人排序正确
**关键教训**:
JavaScript falsy值(0、false、null、undefined、"")在 `||` 运算中会被吞掉,必须用 `??`(nullish coalescing)
权重数据应该从源头(总库)统一管理,而不是前端临时计算
复合职务匹配时,顺序很重要(如"执行秘书长"必须在"秘书长"之前)
函数提取为模块级可避免重复代码和不一致
**权重体系统一**:`seating.html`/`yitiaolong.html`/`server.js`/`seating-prompt.js`四处权重同步修改,"党支部书记、会长"权重=0(最高),正会长=1
**titleToRank修复**:`server.js` 的 `titleToRank()` 新增复合职务识别(党支部书记+会长→rank 0)
**AI prompt修复**:`seating-prompt.js` 新增rank 0的党支部书记+会长规则
**主客平衡增强**:移除"用户手动分组则跳过"限制;一条龙 `autoGenerateAll` 也增加平衡逻辑
**称谓统一**:所有页面(`notice.html`/`server.js`/`yitiaolong.html`)默认称谓改为"乡友"
**性别批量标注**:`server.js` 启动时自动更新,16名指定女性+其余默认男性,已验证生效(19女48男)
**自动平衡后排**:`createActivityFromGlobal` 在AI排座后自动调用 `balanceBackSeats()` 再重排
**关键教训**:
权重修改必须前端+后端+AI prompt三处同步
`titleToRank` 对复合职务必须单独处理,不能用简单的 `includes` 匹配
`autoGenerateAll` 和 `createActivityFromGlobal` 是两个独立创建流程,修改必须两处同步
幂等保护(同一标题2分钟内返回已有活动)可能导致会议室配置不匹配,需要注意
修复排座系统主客失衡问题:在 `createActivityFromGlobal` 函数中,座位布局计算前增加自动平衡逻辑,当主客人数差超过40%或某一方为0时,自动按职务高低拆分人员,平衡主客人数后再创建会议室布局
修复一条龙系统导出议程按钮重复点击问题:添加全局导出锁 `_exportingAgenda`,防止重复点击导致多份文件下载
已更新产品特性文档记录修复内容
**关键教训**:
防重复点击必须用全局锁,不能用简单的按钮disabled(可能被绕过)
自动平衡逻辑应该在座位布局计算前触发,而不是创建后调整
**排座排序权重全面修复**:
`seating.html`/`yitiaolong.html`/`server.js`三处权重体系统一,"党支部书记、会长"权重设为0(最高优先级),正会长权重1,确保林森永远排第一位
`server.js`的`titleToRank()`函数新增"党支部书记+会长"的rank_level=0处理,与前端权重一致
AI排座prompt(`seating-prompt.js`)新增"党支部书记、会长最高优先级"规则,强制AI把该职务排在第一位
**主客自动平衡逻辑增强**:
`seating.html`的`createActivityFromGlobal()`:移除"用户已手动分组则跳过"的限制,任何情况只要人数失衡就自动平衡
`yitiaolong.html`的`autoGenerateAll()`:新增与排座系统一致的主客平衡逻辑,一条龙一键完成也会自动平衡主客人数
平衡规则:将所有人按职务权重排序,前半部分为主人(ceil(N/2)),后半部分为客人
**称谓逻辑统一修改**:
`notice.html`(5处):所有默认称谓从"先生/女士"改为"乡友"
`server.js`(2处):Word导出和HTML导出中的默认称谓改为"乡友"
`yitiaolong.html`(1处):一条龙通知生成的默认称谓改为"乡友"
规则:有gender字段用"先生/女士",无gender字段统一显示"乡友"
**人员库性别批量标注**:
`server.js`启动时自动执行:16名指定人员标记为女性,其余默认男性
已验证服务器生效:19女48男,指定名单全部正确
**AI排座后自动平衡后排+自动重排**:`createActivityFromGlobal()`在AI排座完成后自动调用`balanceBackSeats()`,然后自动重新排座,无需手动操作
**导出议程防重复点击**:`yitiaolong.html`两个导出函数增加全局锁`_exportingAgenda`
权重体系必须前端+后端+AI prompt三处同步修改,任何一处遗漏都会导致排序不一致
`titleToRank()`函数对复合职务(如"党支部书记、会长")必须单独处理,不能只靠模糊匹配
`autoGenerateAll()`(一条龙)和`createActivityFromGlobal()`(排座页面)是两个独立的创建流程,修复逻辑必须两处都改
**排座系统主客平衡修复**:在座位布局生成前增加自动平衡逻辑,当导入人员全为主人或主客人数差距超过40%时,自动按职务高低拆分,前半部分为主人,后半部分为客人,解决主客失衡导致的排座失效问题
**导出议程按钮防重复点击**:为一条龙系统的两个导出议程函数增加全局锁,防止重复点击导致多份文件下载
**修复排座重复导入Bug**:createActivityFromGlobal函数中AI识别分支使用了未去重的原始数据,导致重复人员生成多张卡片。修复方案:将去重逻辑移至函数开头,直接更新globalPersons,确保后续所有分支使用干净数据
**部署验证**:server.js语法检查通过,seating.html语法检查通过,已部署到43.133.62.248:3000
**人员库升级**:rp_persons表新增gender字段,支持存储人员性别信息,新增/api/rp/fill-genders接口可AI批量识别现有人员姓名并填充性别
**排座系统升级**:seating_persons表新增gender字段,临时人员也支持性别存储,导入人员库时自动同步性别
**通知系统升级**:所有通知不再显示职务,统一使用"姓名+先生/女士"称谓,支持根据性别自动匹配,无性别信息时默认显示"先生/女士"
**全场景覆盖**:通知预览、Word导出、复制全量、模板生成等所有场景均已适配新的称谓规则
**修复卡片导入默认主人侧问题**:新增内部会议智能均衡分配逻辑,当客人侧为空、主人侧人数过多时,自动将普通人员均衡分配到两侧,避免单侧空、单侧多排的情况
**修复轮值会长排座规则**:确保轮值会长优先级高于普通副会长,自动进入主人侧核心席位
**升级校验逻辑**:新增4项校验规则:客人侧为空但主人侧多排提示错误、内部会议一侧为空提示、轮值会长未在核心席位报错、前排人员身份与座次不符报错,解决校验与排座规则脱节问题
**定位调整**:从"一次性生成工具"升级为"活动信息承载中心",作为所有活动相关功能的统一输入源
**功能简化**:删除打印桌牌、生成大屏PPT等非核心功能,降低页面复杂度
**字段优化**:
主持人字段默认隐藏,添加"是否有主持人"开关,按需显示
注意事项添加预设选项按钮,支持一键添加常用注意事项,新增AI生成注意事项功能
**AI定位调整**:AI作为辅助工具,提供议程建议、注意事项建议,用户主导修改调整
**流程重构**:
页面核心改为"填信息 + 管信息",不再直接完成所有生成工作
活动信息统一保存,可反复打开、修改、调整
提供功能入口卡片,直接跳转到排座、通知、推文、导出议程等专用页面
活动数据自动同步到localStorage,各功能页面可直接读取使用
**议程生成Bug修复**:AI生成议程后直接写入输入框,支持手动修改调整
**新增活动记忆功能**:页面顶部添加活动选择下拉框,支持保存/加载历史活动
**自动保存功能**:表单修改后3秒自动保存到本地存储,关闭页面不会丢失内容
**UI布局优化**:左侧操作区宽度从520px扩大到600px,右侧流程卡片缩小更紧凑
**AI结果编辑功能**:支持手动修改AI生成的议程、通知、推文,可重新导出修改后的结果
所有修改自动保存,支持随时调整活动信息,适配活动临时调整的场景
从所有排序权重规则中移除"执行会长"、"常务副会长"职务
调整后续职务权重值:副会长权重从14调整为12,秘书长从15调整为13,监事长从16调整为14,依次类推
同步修改4处代码:server.js(后端)、seating.html(排座系统)、yitiaolong.html(活动一条龙)、index.html(推文系统)
所有场景下人员排序逻辑保持前后端完全一致
**新增批量管理模式**:历史会话列表右上角添加"批量管理"按钮,点击进入批量选择模式
**多选功能**:支持逐个勾选或全选/取消全选会话
**批量删除**:选中会话后可一键批量删除,支持二次确认
**交互优化**:批量模式下点击会话项切换选中状态,退出批量模式后恢复正常打开会话功能
**状态同步**:删除后自动同步本地和服务器数据,当前打开的会话被删除时自动退出工作台
**CORS 白名单化**:`cors()` 从 `*` 改为仅允许 `bjddsh.work`、`www.bjddsh.work`、`localhost:3000`
**`/health` 精简**:移除 AI 模型版本、token 状态等敏感信息,仅返回 `{ ok: true, time }`
**文件上传大小限制**:总包 50MB 硬上限 + 按类型分限(图片 10MB、PDF 30MB、DOCX 20MB、Excel 10MB)
**SSRF 防护**:`/api/crawl/import-url` 增加内网地址过滤(127.0.0.1、10.x、172.16-31.x、192.168.x、169.254.x)
**authFetch 统一**:index.html 15s 超时 + 401/403/5xx 处理;notice.html 60s 超时 + 401 处理
**静态文件统一**:6 个页面从 `fs.readFileSync` 改用 `serveStatic()`(brotli/gzip + ETag)
**changelog.html 路由**:新增 `serveStatic` 路由,修复 404
**部署脚本清理**:移除 `table_sign.html`(无后端)和 `login.html`(已废弃)
**动态 SQL 白名单校验**:`seating_persons` 和 `rss_subscriptions` 的 UPDATE 接口增加 `ALLOWED_FIELDS` 校验,拒绝非预期字段
SQL 注入:全部参数化查询 ✅
命令注入:`spawn` 传数组非 shell ✅
路径穿越:`crypto.randomBytes` 生成 ID ✅
seating.html `validate-layout` issues 文本:已有 `escapeHtml()` 转义 ✅
**总库驱动轮值会长**:`rp_persons` 新增 `is_rotating` 字段,系统启动时自动将当月轮值会长的 `is_rotating` 设为 1,其余清零
**唯一定义点**:`server.js` 中 `ROTATING_LEADER_SCHEDULE` 数组是唯一真相来源,前端不再硬编码
**定时自动更新**:每小时检查 + 每天 UTC 16:10(北京时间0:10)自动刷新,跨月自动切换
**新增 API**:`GET /api/rp/rotating-leader` 返回当月轮值会长姓名、月份区间、总库完整信息
**全链路同步**:排座系统、一条龙、通知系统、推文系统全部从总库 `is_rotating` 读取轮值会长状态
**删除前端硬编码**:seating.html、yitiaolong.html 中的 `ROTATING_LEADERS` 硬编码数组全部删除
**通知系统补全**:生成通知时自动从总库匹配轮值会长,称谓从"副会长"自动改为"轮值会长"
**AI Prompt 动态化**:parse-persons、auto-arrange 的 AI prompt 中轮值会长信息改为动态注入
**后端兜底**:推文生成 API 在前端未传轮值会长时自动从总库推算
**归档旧文档**:46 个过时文档(接手人指南、灾难恢复指南、修复报告、部署脚本等)移至 `_archive/` 目录,标注"已归档/仅供历史参考"
**清理临时脚本**:147 个根目录临时脚本(check_*.py、test_*.py、fix_*.py 等)移至 `_archive/_root_temp_scripts/`
**重写开发者手册**:从 1800 行精简至 ~550 行,整合接手人指南和灾难恢复指南核心信息,修正所有过时引用(deploy_both.py → deploy_ubuntu.py 等)
**更新功能状态**:产品特性文档的功能清单与 FEATURE_MANIFEST.md 对齐,修正"已上线"与实际"文件缺失"的不一致
**删除 deploy_both.py**:已归档,唯一部署脚本为 deploy_ubuntu.py
**建立分层文档体系**:产品特性文档.md(产品层)+ 开发者手册.md(运维层)+ FEATURE_MANIFEST.md(对齐层)+ 专项规范附件(FUNCTIONS.md / NAMING_RULES.md / CHATGPT_WORKFLOW.md)
**changelog 独立页面**:将版本更新记录从 index.html 提取为独立页面 changelog.html(~7.5KB),侧边栏"版本更新"按钮改为跳转新页面
**index.html 瘦身 90%**:从 2,220KB/26,803 行减至 222KB/5,378 行,删除了 changelog 相关 CSS(70行)、HTML(21,351行)、JS函数和开发版日志标记
**部署脚本更新**:deploy_ubuntu.py 和 deploy_both.py 新增 changelog.html 上传,deploy_both.py 移除了 changelog 注入逻辑
**每日自动同步**:创建 sync_changelog.py 脚本,每天 17:30 自动将产品特性文档中的开发版日志同步到 changelog.html 并上传服务器(不触发 pm2 restart)
**人员库分组滚动修复**:修复分组标题与 chip 卡片滚动重叠问题,改为自然滚动
**一条龙停止按钮**:执行中 header 显示红色"停止"按钮,基于 AbortController 中断当前步骤,停止后可修改信息重新执行
**推文初稿 AI 化 + 自动填充**:推文初稿从简单信息汇总改为 AI 生成完整活动纪实(800-1200字,"柏雲之我见"风格);跳转从清北仁达系统改为商会推文系统(index.html),自动填充活动名称、日期、地点、主持人、来宾、议程等信息和 AI 生成的初稿内容
**桌牌 + PPT 步骤**:待办事项后新增"打印参会人员桌牌"和"生成大屏 PPT"两个 pipeline 步骤(PPT 功能开发中)
**活动归档**:一条龙完成后 header 显示"归档"按钮,保存活动数据到 localStorage(最多50条),包含人员、议程、待办等完整信息
**推文系统联动**:index.html 的 openSession 新增 ytl_tweet_prefill 预填充逻辑,打开时自动读取一条龙传递的数据
**地点模板同步**:地点下拉框改用 `seating_location_templates` key(与排座系统共享),新增"保存为模板"和"管理模板"按钮
**轮值会长智能识别**:自动识别当月轮值会长(耿宝龙/王婷婷/宋国良/金凤/李广生/姚宇,每人双月),主持人自动填充轮值会长,参会人员列表和主持人下拉框中轮值会长金色高亮显示
**人员库马卡龙卡片样式**:从人员库导入弹窗改用与推文系统一致的药丸形马卡龙 chip 样式,六色分组(负责人/秘书处/党的职务/理事/工委会/其他),选中时圆圈打勾+缩放动效
**议程拖拽排序+任意位置插入**:每条议程支持拖拽交换顺序,鼠标悬浮显示"+"按钮可在任意位置后插入新议程,AI生成的议程同样支持拖拽
**活动一条龙页面上线**(`yitiaolong.html`):首页新增"活动一条龙"入口卡片,输入活动名称、时间、地点、参会人员、主持人、议程、大门密码、注意事项,一键自动化完成6个步骤:创建排座活动 → AI智能排座 → 生成议程Word → 生成活动通知 → 生成推文初稿 → 生成待办事项清单
**一条龙支持从排座系统导入**:已有排座活动可一键导入活动信息、人员、议程,自动填充表单
**一条龙流程可视化**:右侧面板实时显示每一步状态(等待/进行中/完成/失败),支持单步重试
**待办事项可交互**:一条龙生成的待办事项支持勾选完成、导出为txt文件
**议程地点顺序修正**:导出Word文档中,地点字段调整到主持人前面(之前主持人在前)
**人员分组标签修正**:所有页面(排座/导出Word/议程预览)中"会长/副会长/秘书长/监事长"分组统一更名为"商会工作人员",不允许出现"商会领导"字样
**下载按钮防重复点击**:导出座次图和导出Word文档均增加10秒防重复点击保护
**部署脚本更新**:`deploy_ubuntu.py` 文件列表新增 `yitiaolong.html`
**AI排座加载遮罩**:点击"使用选中人员创建会议+排座"或"AI自动排座"时,显示全屏半透明遮罩+加载动画,防止用户误操作,排座完成后自动消失
**轮值会长自动识别(后端)**:`auto-arrange` 和 `detect-sides` 两个路由均新增当月轮值会长自动检测逻辑,自动将轮值会长的 rank_level 设为 2(仅次于会长)、title 更新为"轮值会长"
**议程项增删改**:新增 `addAgendaItem()`(底部添加空项)和 `removeAgendaItem(idx)`(删除指定项,至少保留1项)函数,修复按钮点击报错 bug
**议程拖拽排序**:议程条目支持 HTML5 Drag & Drop 拖拽重新排序
**议程Enter键插入**:在议程输入框按 Enter 自动在当前项之后插入新空白行并聚焦
**议程保存按钮**:议程视图顶部新增"💾 保存议程"按钮,将议程数据(条目、时间、主持人、地点、日期)持久化到活动数据库
**会议名称重命名**:排座活动列表支持双击活动名称进行内联重命名,回车保存、Escape取消
**议程按钮位置调整**:议程按钮移至侧边栏更显眼位置
**通知模板优化**:AI通知生成改为"AI生成一次模板→逐人替换姓名"机制,N人只调用1次AI,大幅提升生成速度
**通知状态管理**:每条通知新增"已通知/未通知"和"已回复/未回复"两个状态切换按钮,支持添加备注,顶部显示统计汇总(已通知/已回复人数),支持按状态筛选
**地点模板管理弹窗**:排座和通知页面的地点模板管理改为模态弹窗UI(替换原 prompt 弹窗),支持查看/删除已保存模板
**Word导出分组优化**:导出议程Word时,"商会领导"分组更名为"商会出席人员",智能控制每行人数使名单适应一页
**修复排座新增人员**:`showAddPersonModal()` 现在每次打开都重新加载人员库,修复首次加载失败后人员库永远为空的问题
**活动地点模板**:排座议程视图和通知页面新增地点输入框,支持从预设模板中选择(商会秘书处、辽宁省驻京办等)+ 自定义输入 + 保存新模板 + 管理模板(排座和通知共用同一套 localStorage 模板)
**三模块数据打通**:
议程→排座:导出议程Word时自动将议程数据(条目、时间、主持人、地点)保存到活动的 `agenda_data` 字段
排座→通知:从排座系统导入时同时导入活动名称、日期、地点、人员列表、议程条目和时间
后端 `/api/agenda/export-docx` 新增地点参数,导出Word时显示地点信息
后端 `/api/seating/activities` 支持更新 `location` 和 `agenda_data` 字段
**认证修复**:`notice.html` 删除独立登录页,改为复用全局 `ddsh_auth_token`(与 seating/today-topics 一致)
**新增独立页面** `notice.html`:活动通知批量生成系统,已链接到主页"生成活动通知"入口
**六大填写模块**:①活动基本信息 ②参会人员管理 ③议程安排 ④注意事项与提醒 ⑤门禁与联系方式 ⑥生成设置
**多方式导入人员**:单条手动添加 / 粘贴名单批量导入(支持多种分隔符)/ 上传CSV/Excel文件 / 从排座系统一键导入
**智能称谓处理**:商会领导职务(会长/副会长/秘书长等)显示职务称谓,其他人显示先生/女士
**特别提醒功能**:支持按人员姓名配置个性化提醒(如发言、携带材料等),每人通知自动注入
**门禁密码**:可选开启一楼大门密码字段,开启后显示输入框
**停车/用餐**:5种停车预设 + 4种用餐预设,支持自定义填写
**AI 润色开关**:开启后通过 `/api/notice/generate` 调用 AI 对每条通知润色优化
**可编辑提示词**:前端 System Prompt 可在高级选项中修改,持久化存储至 localStorage
**即时预览**:右侧实时展示生成结果,每条通知独立显示,支持单条编辑和一键复制
**统计栏**:显示总人数、已生成数、活动日期
**全部复制**:一键复制所有通知(带人名分隔)
**导出Word**:通过 `/api/notice/export-word` 生成规范排版的 .docx 文件下载
**从排座系统联动**:可拉取已有排座活动的人员名单,活动名称自动填入
**后端路由**:新增 `POST /api/notice/generate`(AI生成)、`POST /api/notice/export-word`(导出Word)、`GET /notice.html`(静态页)
**新增独立页面** `qingbei.html`:清北仁达控股集团推文写作系统,与商会推文系统数据/prompt完全隔离
**四个写作主体**:集团层面、微点科技、中领细胞、中科领德健康,页面顶部切换
**配置化架构**:`prompt-config.js`(prompt配置)、`scene-config.js`(场景配置)、`knowledge-config.js`(主体知识卡片),同一引擎多场景扩展
**总控 System Prompt**:统一写作风格(企业新闻稿风格,稳健清晰务实),四个主体各自拥有专属场景prompt
**主体知识卡片自动注入**:生成时自动注入对应主体的基础资料摘要,无需重复填写公司介绍
**三大生成功能**:生成推文、标题备选(5个标题)、润色改写
**独立历史记录**:使用 `qingbei_sessions` 数据库表,与商会 `sessions` 表完全隔离
**表单字段按主体动态切换**:微点科技(技术亮点/应用场景/客户价值)、中领细胞(科研/团队/实验室亮点)、中科领德(产品方向/工程化/产业应用)
**新增 API 路由**:`/api/qingbei/generate`、`/api/qingbei/sessions`、`/api/qingbei/refine`
**AI 翻译引擎**:`today_topics.py` 新增 `translate_with_ai()` 函数,通过 `openclaw` 调用 GPT 进行翻译
**自动语言检测**:支持英/日/韩/法/德/西/俄/阿/葡/意等语言自动识别
**翻译触发条件**:RSS 源配置 `lang != 'zh-CN'` 或自动检测到外文内容时触发翻译
**翻译内容**:标题 + 摘要全部翻译成中文,保留原文供参考
**前端展示**:翻译文章显示 🌐 译 标签,原文标题以斜体灰色展示在中文标题下方
**数据库字段**:`today_topics` 表新增 `translated/original_title/original_summary/source_lang` 字段
**新功能模块**:独立页面 `today-topics.html`,首页新增"老板今天写什么?"入口卡片
**Python 爬虫**:`today_topics.py` 每天早6点、晚6点自动从中国新闻网、新华网、央视新闻、中国政府网、经济日报、BBC中文、纽约时报中文、36氪、虎嗅网抓取热点话题
**AI 深度分析**:点击话题可 AI 分析来龙去脉、核心争议、切入角度、建议标题(已深度学习"柏雲之我见"公众号25篇文章风格)
**写作方向选择**:支持选择12个方向标签(企业经营管理、投资理财、政策法规、社会现象、职场人生、AI与科技、教育成长、历史文化、书法艺术、医疗健康、商会工作、东北振兴)
**个人想法输入**:每个话题支持填写个人观点,AI 分析时结合个人想法给出更贴合的建议
**手动搜索**:支持输入感兴趣的话题关键词,通过百度新闻/必应新闻搜索相关话题
**数据库**:新增 `today_topics` 表存储话题
**服务器 cron**:已配置每天 06:00 和 18:00 自动抓取
**后端 API**:6个新接口(获取列表/手动抓取/AI分析/标记已读/删除/全部已读)
**页面滚动条**:修复页面无法下拉的问题,`overflow-y:auto` + 自定义滚动条样式
**最近更新时间**:stats 栏显示"更新于 HH:MM",展示最近一次数据抓取时间
**cron 调整**:从每天 06:00/18:00 改为北京时间 06:00/12:00/18:00 三次
**"手动抓取"按钮**:原"抓取"改为"手动抓取",抓取中时图标旋转 loading
**AI 聊天对话**:"和 AI 聊聊想法"按钮,展开对话窗口,支持多轮聊天梳理写作思路
**深度分析重构**:prompt 改为事实导向(事实梳理→背景脉络→各方观点→写作切入点→建议标题),要求引用具体数据
**国际新闻加权**:国际分类话题 `calculate_hot_score` 额外 +8 基础分,国际标签红色高亮
**新增 API**:`POST /api/today-topics/chat`(AI 聊天对话)
**部署优化**:deploy_ubuntu.py 已有 `needs_upload()` 跳过未修改文件,无需额外改动
**功能列表重新对齐**:根据 index.html 实际功能卡片,更新产品特性文档中的功能清单
**已上线功能(10个)**:
我要写商会推文(蓝色)
我要写贺信(橙色)
我要排座位、写议程(青色)
知识库(青绿)
人员库(紫色)
**待开发功能(5个)**:
我要写清北仁达推文(绿色)
我要写讲话稿(紫色)
我要填表(粉色)
待办事项(红色)
生成活动通知(橙色)
**修复手动分组被AI覆盖**:createActivityFromGlobal() 不再无条件合并+AI重识别。当用户已在右侧面板手动分好主人方和客人方(两边都有人)时,直接使用用户分组,跳过AI识别
**新增"切换"按钮**:全局人员列表中每人卡片新增"切换"按钮,可将人员从主人方移至客人方(或反之)
**智能平衡后排人数**:新增工具栏按钮"智能平衡后排",总人数>12时自动按比例分配后排(前排每侧最多6人),遵循不改变主客方归属、高位不动、后排只取排序靠后人员的原则
**P0-1 fallback规则修正**:AI不可用时,leader/sec/council→主人方,government/enterprise/other→客人方(原逻辑只有leader→主人方)
**P0-2 漏判人员兜底**:AI未覆盖的人员不再直接丢弃,改用硬规则逐人判定,确保所有人员都进入分组
**P0-3 创建流程回滚**:活动创建失败→删除已建会议室;人员导入失败→删除活动和会议室,不产生脏数据
**P1-1 saveRoom布局比较修正**:在selectActivity刷新前保存旧快照,确保"旧状态 vs 新状态"比较正确
**P1-2 排座活动ID固定**:自动排座改用activityResult.id,避免用户中途切换活动导致串会
**P2-1 会议标题可编辑**:创建会议按钮上方新增标题输入框,留空时自动生成带日期和人数的标题
**P2-2 首页脏注释清理**:删除index.html中quickVerifyOverlay前的裸露注释文本
**P2-3 side_source标记修正**:精确区分ai/rule来源,fallback整体标记rule,逐人兜底也标记rule
**新增 v4.8(2026-03-23)**:主人/客人智能识别系统重构 + 会议室设置增强 + 批量删除 + 稳定性修复(防重入锁、幂等保护、try-catch)
**新增 v4.7(2026-03-22)**:轮值会长自动识别 + 人员库导入优化(分组显示、搜索筛选)+ AI人员排序 + 身份等级编辑 + 校验增强
**新增 v4.6(2026-03-20)**:排座系统全面上线 + 人员库管理页面 + 5个安全漏洞修复(XSS、请求体限制、速率限制等)+ 部署脚本清理 + 贺信规则完善
**同步更新开发者手册**:当前版本号从 v4.3 更新为 v4.8
**新增议程视图**:在排座系统侧边栏新增"议程"按钮,点击进入全屏议程编辑视图
**议程条目编辑**:支持手动添加/删除/编辑议程条目(序号+时间+内容),支持拖拽排序
**AI 智能生成议程**:根据活动名称、日期、参会人数自动生成议程建议,一键填充
**主持人选择**:支持三种方式——从人员列表选择、手动输入、留空(导出时自动跳过主持人行)
**出席名单管理**:
支持开关控制是否包含出席名单页
三种导入方式:从当前排座导入、从人员库选择导入、粘贴文本导入
自动分类为三组:商会代表、驻京办代表(政府人员)、会员乡友
复用现有 `inferIdentityType()` 和 `getPersonSortWeight()` 进行身份识别和排序
**Word 文档导出**(标准公文格式):
议程页:标题(黑体二号居中加粗)+ 活动时间 + 主持人 + 议程安排(仿宋三号左对齐2倍行距)
名单页(可选):附件标题 + 分组名单,格式为"职务+人名(单位)"或"公司名+职务+人名"
名单过长时自动缩小字号至小三号,确保控制在2页内
**新增后端 API**:
`POST /api/agenda/generate-items` — AI 生成议程建议
`POST /api/agenda/export-docx` — 生成标准 Word 文档
**部署验证**:语法检查通过 ✅ | 部署成功 ✅ | 健康检查通过 ✅
**修复反复点击重复创建会议**:`createActivityFromGlobal()` 增加 `_creatingActivity` 全局防重入锁 + 按钮disabled/loading态 + finally块恢复;后端 `POST /api/seating/activities` 增加同标题2分钟内幂等保护
**修复自动排座体验**:将 `setTimeout` 异步排座改为顺序 `await`,用户首次看到的就是排完座后的最终结果,不再出现"先看到空座位、过一会才排好"的中间态
**修复会议室设置页方位参数硬编码**:`saveRoom()` 原来硬编码 `host_side='top', guest_side='bottom', main_seat_direction='top'`,现在从新增的 select 表单控件读取真实值
**补齐会议室设置表单**:新增主人侧/客人侧/主位朝向/大门位置/油画位置5个方位选择控件;`fillRoomForm()` 完整回填所有方位字段
**增强布局变更检测**:`saveRoom()` 保存后不只比较座位数量,还比较主客方向、主位朝向、后排开关等布局参数是否变化
**修正后端默认值不一致**:`POST /api/seating/rooms` 中 `host_side` 默认值从 `'left'` 改为 `'top'`,与前端一致
**新增数据字段**:`seating_persons` 表增加 `side_source`(判定来源:rule/ai/manual/default)、`scene_type`(会议场景类型)、`identity_type`(身份类型:chamber_leader/chamber_member/government/enterprise/other)
**新增核心函数**(前端+后端同步):
`inferIdentityType(person)`:根据职务和分组推断身份类型
`decidePersonSideByRule(identityType, sceneType)`:硬规则判定 host/guest
`getPersonSortWeight(person)`:统一排序权重函数,会长(10)→副会长(14)→秘书长(15)→监事长(16)→理事(20)→政府(30-32)→企业(35-37)
**新增 API**:`POST /api/seating/detect-sides` — AI 智能识别会议场景和主人/客人归属,先硬规则后 AI 判定
**重构 `createActivityFromGlobal()`**:合并所有人员 → AI 识别场景+side → 统一排序 → 按识别结果分组 → 创建会议+导入+排座
**删除所有混乱默认值**:前端 `p.side || 'guest'`(3处)改为 `inferIdentityType()` 智能判断;后端各导入接口增加 `identity_type` 写入
**统一排序**:`renderPersonSelector` 和 `renderPersonList` 的组内排序统一使用 `getPersonSortWeight()`
**auto-arrange 增强**:查询和传给 AI 的人员信息中包含 `identity_type`
**根因**:`selectActivity()` 在数据库无座位时会生成 `preview_` 前缀的预览座位供前端显示,但 `createActivityFromGlobal()` 误将预览座位当作真实座位,跳过了 `initSeats()` 调用,直接触发 AI 排座,后端查数据库发现无真实座位
**修复 `initSeats()`**:改为返回 `{ success, seat_count/error }` 明确的成功/失败状态,让调用方能感知初始化结果
**修复 `createActivityFromGlobal()`**:无论 `seats.length` 是否为 0 都无条件调用 `initSeats()`;只有 `initSeats()` 返回成功才触发自动 AI 排座
**修复 `autoArrange()`**:增加预览座位检测(`id.startsWith('preview_')`),避免手动点击时也将预览座位误判为真实座位
**会议室模板变更自动同步当前会议**:修改会议室模板座位数后,若当前正在查看的会议使用该模板,自动刷新会议详情并检测座位一致性;若数量不一致,弹确认框询问是否重新初始化座位;无变化则静默刷新
**新增 `calcRoomSeatCount(room)` 工具函数**:精确计算会议室模板总座位数(含条件后排座位)
**左侧会议列表批量删除**:新增"批量管理"按钮,进入多选模式后支持全选/清空/批量删除/退出管理
**新增后端路由 `POST /api/seating/activities/batch-delete`**:事务批量删除活动及关联的人员和座位数据,返回删除数量和ID列表
**批量删除智能处理当前会议**:若被删除的会议包含当前正在查看的会议,自动清空右侧并选中剩余第一条;若不包含,仅刷新列表
**ChatGPT扫描Bug修复(P0/P1)**:
P0-1:删除人员前清空 seating_seats.person_id 引用
P0-2:onSeatDrop 加 dragState.dropping 防重入锁
P0-3:5个路由统一加 try-catch(init-seats/assign-seat/swap-seats/unseat/validate)
P1-1:assign-seat 和 swap-seats 加 db.transaction() 事务
P1-2:authFetch 统一处理 401/403/500 错误
重新启用创建会议时的 AI 自动排座功能(之前因调试暂时禁用)
排座采用异步非阻塞方式:会议创建完成后立即显示座位图,AI 排座在后台自动触发
排座过程中显示"正在调用AI智能排座,请稍候..."提示
排座成功后自动刷新座位图显示分配结果,失败时仅提示警告不影响会议
手动"自动排座"按钮始终可用,不受影响
修复排座系统核心 bug:`rp.grp_name` 列不存在 → 改为 `rp.grp AS grp_name`,该 bug 导致所有 selectActivity API 静默崩溃、浏览器超时
**根因诊断**:浏览器 HTTP/1.1 连接池限制(同域6个并发)+ 前端残留 AI 推荐代码导致 JS 语法错误
删除 `createActivity()` 中残留的 AI 推荐布局代码(引用不存在的 `result.layout`,导致整页 JS 解析失败)
重构 `createActivityFromGlobal` 流程,实现"创建会议→显示座位→AI 排座"三级解耦:
先完成活动和人员创建,立即显示座位图
initSeats 失败时使用前端预览座位兜底
AI 自动排座用 setTimeout 延迟 500ms 执行,失败不影响主流程
初始化改为 `Promise.allSettled` 并行加载,任一接口超时不阻塞其他
loadRooms 对 `newActivityRoom`/`editRoomSelect` 均做 null 检查
selectActivity 增加 60 秒超时 + try-catch + 详细调试日志
修复点击"使用这些人员创建新会议"后,会议列表出现但座位图不显示的问题
根因:人员导入失败时未 return,导致继续执行后续流程(persons 为空)但误导性提示"会议创建成功"
移除冗余的"安全网"逻辑,确保错误时正确中止流程
现在只有在人员真正成功导入后才会显示"会议创建成功"并自动排座
修复排座系统名单 AI 识别报 "signal timed out" 的问题:前端 `authFetch` 默认 30 秒超时,而 AI 调用实际需要数分钟
为三个 AI 相关接口设置合理的长超时:名单识别(parse-persons) 310秒、AI排座(auto-arrange) 310秒、布局推荐(recommend-layout) 120秒
其他普通接口(增删改查)保持 30 秒默认超时不变
排座系统新增轮值会长自动识别:与推文系统共用同一份轮值名单(1-2月耿宝龙、3-4月王婷婷、5-6月宋国良、7-8月金凤、9-10月李广生、11-12月姚宇)
当月轮值会长在人员卡片中自动显示职务"轮值会长"(金色文字),rank_level 自动设为 2(会长之后、副会长之前)
后端所有人员相关接口(GET活动详情、GET活动人员、import/persons、import-temp-persons、auto-arrange AI排座)均自动识别并标注轮值会长
"从人员库导入"弹窗布局优化:弹窗宽度从480px扩大到640px,卡片改为自适应多列布局(repeat(auto-fill, minmax(150px, 1fr))),卡片区域高度改为50vh
选择人员弹窗卡片列表去掉内联grid容器,统一由CSS控制自适应列数
修复 `import-temp-persons` 路由缺失 `person_id`、`display_order`、`created_at`、`updated_at` 字段的问题,确保创建活动时人员与总库正确关联
前端导入人员库时传递 `person_id`(rp_persons 的原始 ID),确保后续 LEFT JOIN 能获取到 grp 分组信息
AI 识别导入时也保留 `person_id` 和 `sort_order`,匹配到总库人员时正确关联
人员卡片列表改为按身份分组显示(会长/副会长→秘书处→党支部→理事/监事→专门委员会→会员乡友),同组内按身份等级排序,组间有分割线
选择人员弹窗新增搜索框(按姓名、职务、单位筛选)+ 全选/清空按钮 + 已选计数 + 分组分割线
总库删除人员时同步清理排座活动中的关联记录(设 person_id=null、source_type=temp),避免幽灵数据
修正人员排序规则:执行秘书长从 `sec(2)` 移至 `council(4)`,与监事长、副会长同级
修正 AI 排座(auto-arrange)中人员查询排序:从 `ORDER BY display_order` 改为 `ORDER BY rank_level ASC, display_order ASC`,确保身份高的人排在前面
同步更新 parse-persons、SEATING_SYSTEM_PROMPT、前端 grp 映射的排序规则说明
AI 识别名单文本时,现在不仅识别姓名/职务/单位,还自动判断每个人的身份等级(rank_level)
主人方按商会内部等级(leader=1 > sec=2 > party=3 > council=4 > com=5 > other=6)
客人方按来宾地位(省部级=1 > 厅局级=2 > 县处级=3 > 科级=4 > 一般=5 > 无法判定=6)
AI 返回的 `rank_level` 和 `grp` 字段直接存入数据库,作为排座的排序依据
识别结果按主客方分区域展示,每个区域内按身份等级从高到低排序
每人显示排序序号(圆形徽章)和身份等级标签
导入时自动传递 `rank_level` 和 `display_order` 到后端
右侧人员列表中每人显示排序序号徽章(No.1、No.2...)
人员列表默认按 `rank_level` 排序(身份高的排前面)
编辑人员弹窗新增"身份等级"数字输入框
说明:1=核心领导 2=秘书长级 3=书记级 4=理事会 5=会员级 6=其他
编辑后自动同步到后端数据库
新增"主座被占"校验:检查主人方/客人方中间主座是否被身份较低的人占据
校验排序依据从 `display_order` 改为 `rank_level`,更准确地反映身份高低
后排人员校验现在显示具体的身份等级信息
所有人员查询 API 统一改为 `ORDER BY rank_level ASC, display_order ASC`
自动排座功能完全重写,通过 openclaw 调用 AI(GPT-5.4)进行排座,不再使用硬编码排序算法
AI 接收完整的商会内部排序规则(leader>sec>party>council>com>other)和客人方商务礼仪规则
座位信息使用与前端一致的尊贵次序标号(第1位=主座居中,第2位=主座旁...),AI 按标号分配人员
AI 返回 JSON 格式的 person_id→seat_id 映射,后端验证有效性后写入数据库
前端按钮增加加载状态("AI排座中..."),完成后显示分配人数统计
删除了旧的 `assignSeatsToPersons` 硬编码排座函数和 `sortPersonsByDignity` 排序函数
使用 `dragState` 对象统一管理拖拽状态,替代旧的分散变量
**视觉反馈增强**:
座位 transition 使用弹性曲线 `cubic-bezier(0.34, 1.56, 0.64, 1)`,交互动感十足
拖拽目标座位:紫色发光边框 + 缩放 + 阴影高亮
座位间拖拽时原座位显示半透明 + 缩小效果("我从这里来")
人员拖入空座后:弹入动画(`seatAssignSlide`)
座位间交换后:双方弹跳动画(`seatSwapPop`)
人员卡片拖拽时:轻微旋转 + 缩放 + 去阴影
已落座人员在列表中半透明显示
已占用座位 cursor 为 grab/grabbing
**逻辑修复**:
修复座位间拖拽交换后座位变空的 bug:改为直接调用 swap-seats API,不再先 unseat 再 assign
修复 onSeatDragLeave 闪烁问题:检查 relatedTarget 避免子元素触发误清除
修复 `rp.grp_name` 列不存在错误:`rp_persons` 表只有 `grp` 列,SQL 查询中错误引用了 `grp_name`
**人员不再丢失**:「使用这些人员创建新会议」按钮改为直接一步到位创建(建会议室→建活动→导入人员→选中新活动→初始化座位),不再弹出中间表单,避免字段映射错误导致人员消失
**前排座位硬性限制6人**:前端表单添加 max=6 属性和标签提示,createActivity() 添加钳制逻辑,确保任何路径都不能生成超过6人的前排
**AI推荐规则修正**:去掉 `Math.max(, 3)` 最低3人限制(人少时多出空位不合理),前排=实际人数(上限6),多余自动放入后排
**会议名称自动带人数**:如「3月20日座谈会(5主8客)」
**座位角标优化**:将座位排序角标从9px增大到13px,加粗到700字重,添加白色半透明背景、圆角、内边距和阴影,确保明显且不溢出
**前排座位限制**:AI推荐会议室规格时,每侧前排至少3座、最多6座,超过6座的人员自动放入后排
**AI识别人员导入修复**:修复严重bug - AI识别的人员现在会正确导入到会议中,不仅用于推荐会议室规格,还会自动匹配主库的职务和分组信息,即使AI推荐失败也会继续导入人员
**人员库保留**:创建会议后不再清空全局人员库,保留已导入的人员以便下次复用
**从主库导入时保留分组信息**:从商会系统主人员库导入时,保留分组(grp)信息,使用主库的职务和公司
**马卡龙配色卡片**:从主库导入的人员卡片显示对应的马卡龙分组配色(负责人-玫瑰红、秘书处-天空蓝、党旗红-红色、理事-薄荷绿、工委会-淡紫色、其他-暖黄色)
**AI批量导入时自动匹配主库**:AI识别的人员导入时,自动在主库中查找同名人员,使用主库的职务、公司和分组信息,提示匹配数量
**人员库选择器马卡龙配色**:从人员库导入时,人员选择列表也显示马卡龙配色,便于快速识别分组
**AI识别超时延长**:AI识别人员超时从2分钟延长到5分钟,解决大名单识别超时问题
**AI导入与新建会议深度耦合**:AI识别成功后自动统计主客方人数,自动推荐会议室规格(主人方坐上方,客人方坐下方,每侧至少3座,超过12人启用后排),推荐规格自动填充到"新建会议"表单,新增"使用这些人员创建新会议"按钮
**合并重置按钮**:将"初始化座位"和"重置"两个按钮合并为"重置座位",实现清除座位分配并重新生成座位的功能
**显示/隐藏后排桌子**:新增"显示/隐藏后排桌子"按钮,只在启用后排座位时显示,可切换后排桌子的显示状态
**会议室设置自动拉取配置**:打开会议室设置时,自动选中当前活动的会议室并加载所有配置参数到表单
**全局人员库功能**:允许在未创建会议时先导入人员,建立临时人员库
**人员统计看板**:在"人员管理"标题下新增统计看板,实时显示总人数、主人方、客人方人数
**AI智能推荐会议室布局**:创建会议时,如果全局人员库有人,自动调用AI根据人数推荐会议室布局(前排最多6人,其余放后排)
**屏幕标识修正**:修正屏幕标识位置左移3cm,颜色改为RGB(230,172,103),字体改为白色
**屏幕标识优化**:屏幕矩形改为动态定位,与后排长条桌左端对齐,上下居中,高度为上下后排距离的2/3
**AI识别按钮样式优化**:改为土豪金色渐变,去除黑色描边,提升视觉档次
**删除会议功能修复**:补全deleteActivity函数,会议列表中的删除按钮现在可以正常删除会议
**右侧面板重叠问题修复**:调整面板header左侧padding,避免收起按钮与"人员管理"标题重叠
**新增独立排座管理页面**:`http://43.133.62.248:3000/seating.html`
**数据库结构扩展**:新增4张排座相关表
`seating_rooms` - 会议室模板表
`seating_activities` - 活动排座表
`seating_persons` - 排座人员表
`seating_seats` - 座位安排表
**核心功能**:
✅ 会议室模板管理:支持自定义长条桌布局、上下边后排座位
✅ 会议室方位配置:油画侧、大门侧、主人侧、客人侧、主位朝向
✅ 双来源人员导入:系统人员库 + 临时来客(手动输入/批量粘贴)
**AI 智能排座**:调用 AI 自动按商务礼仪排座(商会内部排序+客人方礼仪规则),支持一键自动分配
✅ 会议室方位配置:油画侧、大门侧、主人侧、客人侧、主位朝向
✅ 双来源人员导入:系统人员库 + 临时来客(手动输入/批量粘贴)
✅ **AI 自动排座**:调用 AI(GPT-5.4)智能分配座位,遵循商会礼宾规则和商务礼仪
✅ 丝滑拖拽调整:支持人员卡片拖入座位、座位间拖拽交换,带弹性动画反馈
✅ 逻辑校验:主位错误、主客坐反、后排使用不当等检测
✅ 逻辑校验:主位错误、主客坐反、后排使用不当等检测
✅ 导出座次图:支持导出PNG图片
**后端新增API**(20+个):
`GET/POST/DELETE /api/seating/rooms` - 会议室模板管理
`GET/POST/DELETE /api/seating/activities` - 活动管理
`POST /api/seating/activities/:id/persons/batch` - 批量添加人员
`POST /api/seating/activities/:id/import/persons` - 从人员库导入
`POST /api/seating/activities/:id/import/paste` - 批量粘贴导入
`POST /api/seating/activities/:id/auto-arrange` - 自动排座
`POST /api/seating/activities/:id/assign-seat` - 分配座位
`POST /api/seating/activities/:id/swap-seats` - 交换座位
`POST /api/seating/activities/:id/validate` - 校验排座逻辑
**技术实现**:
前端:`webapp/seating.html`(独立单文件 SPA)
后端:`webapp/server.js` 新增排座 API 路由
自动排座算法:`assignSeatsToPersons()` 函数,支持奇偶座位场景
**入口位置**:功能选择首页 → 我要排座位
从上到下:后排座位→后排桌子→主人座位→主桌→客人座位→后排桌子→后排座位
符合实际会议室座次安排逻辑
奇数人数(5人例):从左到右座位显示为 5 3 1 2 4
偶数人数(6人例):从左到右座位显示为 5 3 1 2 4 6
第1人居中,第2人左侧,第3人右侧,依次交替外扩
主座显示:未落座时显示金色大五角星(★)而非"空座"文字
桌子长度:根据主客方人数较多的一侧计算,人多桌长
后排桌子独立成行,不与座位混排
宽度为主桌的50%
前端`renderSeatCanvas()`重构布局顺序
后端`assignSeatsToPersons()`修正座位索引计算逻辑
座位排序遵循"居中-左右交替外扩"原则
修复电梯标识不显示问题:为`.seat-canvas`添加`position:relative`
调整后排桌子位置:从第一排座位前面移到后面
修正桌子尺寸计算:从最左座位左侧到最右座位右侧的实际宽度
主位标注五角星:主人方和客人方第一个座位显示★标记
拖拽替换不用确认:直接替换座位,提升操作效率
会议室模板删除:支持删除不需要的模板
人员库导入调试:增加日志帮助排查问题
座次序号右上角显示(已实现)
主位用五角星标识
AI智能排座:自动识别主客方并智能分配座位
UI流程优化:4步骤引导式操作
修复新建活动功能无法使用的问题(同会议室保存问题,`readBody()`重复解析)
优化会议室名称验证提示:红色感叹号+错误提示显示在输入框下方
实现座位尊贵次序算法:
奇数人数:一号位居中,二号在一号左侧,三号在一号右侧,以此类推
偶数人数:一号位居中靠右,二号位在一号左侧,三号位在一号右侧,以此类推
后排座位特殊处理:从左往右依次排列,不使用尊贵次序
桌子尺寸动态调整:根据座位数量自动计算长度和宽度,人多桌子长
后排桌子显示:宽度为前排桌子的50%
电梯标识:左上角显示"电梯"标识,帮助识别方位
后端`assignSeatsToPersons()`函数实现尊贵次序算法
前端`renderSeatCanvas()`动态计算桌子尺寸
会议室名称验证改为内联错误提示,用户体验更友好
`Uncaught SyntaxError: Unexpected token '}'` — JS语法错误
代码中存在重复的函数定义(addPerson函数部分代码重复了)
修改前:"请先选择会议室模板,选择会议室后,点击'初始化座位'生成座位布局"
修改后:"请先添加会议人员,在右侧添加人员后,点击'新建会议'开始排座"
更符合新的工作流程(先添加人员,再创建会议)
主人方标签:玫瑰红背景 `#fde8e8`,深红文字
客人方标签:天空蓝背景 `#ddeeff`,深蓝文字
在人员卡片姓名后显示标签,颜色与推文写作功能一致
后端:从 60 秒调整为 **120 秒**(2分钟)
前端:从 65 秒调整为 **125 秒**(比后端多 5 秒)
修改 `callAI()` 函数超时设置(server.js:1586-1591)
修改前端 `parsePasteText()` 超时计时器(seating.html:1926-1933)
删除"批量粘贴"中的"导入为主人方/客人方"下拉框
AI 会自动识别人员属于主人方还是客人方(根据单位判断)
简化用户操作,提升体验
`readBody()` 函数已经返回解析后的JSON对象
但POST路由中又对返回值进行了 `JSON.parse(body)`,导致运行时错误
相当于对JSON对象再解析一次,产生语法错误
**server.js** (行 3819):移除重复的 `JSON.parse()`,直接使用 `readBody()` 返回的对象
增加调试日志帮助排查问题
**顶部导航栏颜色**:从黑色改为青绿色 `#0CC8A3`(RGB 12,200,163)
**统计卡片顶部色条**:与分组标签颜色对应(负责人蓝/秘书处青/党的职务红/理事绿/工委会紫)
**人员列表选中框**:根据分组显示对应颜色(边框、背景、左侧高亮条、姓名颜色四联动)
**修复部署问题**:`deploy_both.py` 添加 `person-manage.html` 到上传列表
新增 `.person-item.grp-{分组}` 类用于CSS选择器
CSS选中态根据分组显示对应颜色变量
修复 `::root`(三个冒号)导致的CSS变量失效问题
对话调整的 `authFetch` 请求没有设置超时时间
`authFetch` 默认超时只有 **8秒**
AI 调用通常需要 30-90 秒,远超默认超时
不同操作需要不同的超时设置
文件上传:5分钟(OCR可能很慢)
AI 生成/调整:2分钟
普通请求:8秒
新电脑浏览器本地存储中有旧的 `apiKey`(无效)
推文生成代码有 `|| cfg.proxyUrl === ...` 条件,即使有 apiKey 也会走服务器
对话调整代码缺少此条件,直接走 `callAIDirect()` 用本地 apiKey 调用 API
导致认证失败
**问题**:`congrats.html` 中 `innerHTML` 直接插入未转义的用户/AI 内容,可能执行恶意代码
**修复**:添加 `escapeHtml()` 函数,对所有插入 innerHTML 的内容进行 HTML 实体转义
**问题**:所有 POST API 都没有请求体大小限制,恶意用户可发送 GB 级请求体耗尽内存
**修复**:所有 API 添加 100KB 限制,超出返回"请求体过大"错误
**问题**:`spawn` 的 `timeout` 选项在某些平台不生效,超时后可能产生僵尸进程
**修复**:使用 `setTimeout` 确保 120 秒后强制 `SIGTERM` 终止进程,并给出明确超时错误
**问题**:无效日期(如 "2024-13-45")会变成 `NaN年NaN月NaN日`
**修复**:前后端都添加 `isNaN(d.getTime())` 验证,无效日期返回错误提示
**问题**:无请求频率限制,AI 资源可被滥用
**修复**:每用户每分钟最多 10 次 AI 调用,超出返回"操作过于频繁,请 X 秒后重试"
**人员选择器点击修复**:从人员库导入的马卡龙配色卡片点击无反应问题已修复
**创建会议按钮位置调整**:将"使用这些人员创建新会议(推荐)"按钮从添加人员模态框移到人员管理面板显著位置
位置:人员统计看板下方,主人方/客人方标签上方
样式:渐变背景、更大尺寸、阴影效果、emoji图标
显示逻辑:只在没有当前活动且有人员时显示
**新增函数**:createActivityFromGlobal(),从globalPersons创建会议的新功能
**UI优化**:
删除添加人员模态框中的旧按钮
修改createActivityWithParsed函数,提示用户点击新按钮
updatePersonStats函数控制按钮显示/隐藏
**新增独立人员库管理页面**:`http://43.133.62.248:3000/person-manage.html`
**数据库结构扩展**:rp_persons 表新增字段
`company` - 企业名称
`format_tweet` - 推文格式(如:李广生秘书长)
`format_agenda` - 议程格式(如:李广生 北京丹东企业商会秘书长、鑫精合激光科技集团总经理)
`format_seat` - 排座格式(如:李广生)
`tags` - 标签(JSON数组)
`remark` - 备注
**核心功能**:
✅ 人员信息编辑:姓名、职务、企业名称
✅ 分组管理:负责人/秘书处/党的职务/理事/工委会/其他
✅ 多模块格式配置:同一人员在不同功能模块中显示不同格式
✅ 智能导入:粘贴文本自动识别姓名、职务、企业
✅ 导出功能:导出为CSV文件
**后端新增API**:
`GET /api/rp-manage` - 获取完整人员列表(含扩展字段)
`PUT /api/rp-manage/:id` - 更新人员完整信息
`POST /api/rp-manage/parse-text` - 智能解析粘贴文本
`POST /api/rp-manage/batch-update` - 批量更新人员信息
`POST /api/rp-manage/reorder` - 批量调整排序
**跳过不必要的 health 检查**:页面加载时不再等待 `/health`,改为异步后台检查
**token 验证超时从 5 秒缩短到 3 秒**:更快失败,更快重试
**health 检查移到后台**:不阻塞登录流程
**登录成功后立即进入主页**:不等待 `loadSessions()` 完成
**弃用 SCP,改用 Paramiko SFTP**:上传速度从 189 秒降到 10 秒(提升 18 倍)
**启用 SFTP 压缩传输**:对大文件(2.27MB index.html)效果明显
**差量上传**:只上传实际变化的文件(通过大小和时间戳判断)
**修复 deploy.bat 语法检查路径**:`local_jscheck.py` 路径修正为 `_temp_scripts/local_jscheck.py`
向**大会本身**:"表示热烈祝贺"(唯一允许用"热烈祝贺"的位置)
向**全体会员**:"致以诚挚问候"或"表示亲切问候"
向**新当选领导**:"致以诚挚祝贺"或"表示衷心祝贺"(禁用"热烈祝贺")
第一层:对方组织的地位、作用和工作成绩(连贯表达,不重复)
第二层:此次活动/事件的重要意义(紧接第一层,1-2句)
第一层写完地位作用后,再以"贵会"起头重复讲地位作用
第二段出现两个以上的"贵会"开头句
句子之间含义、表述重复
标题行:改为正则精确匹配 `/^贺\s*信$/`(仅匹配独立的"贺信"或"贺 信",不含其他内容)
称呼行:改为语义识别 `/:$/.test(line) && line.length < 40`(以中文冒号结尾的短行才是称呼)
去掉行号依赖,改为遇到第一个匹配称呼特征的行就识别为称呼
`webapp/congrats.html`:`showPreview()` 函数
`webapp/server.js`:`/api/congrats/export` 路由
设置每小时自动将项目备份到 `E:\商会秘书处工作平台\backups\`
备份文件夹命名格式:`backup_YYYYMMDD_HHMMSS`
自动排除 `node_modules` 和 `.git` 目录
问题:第一段向多方祝贺时,"热烈祝贺"重复使用,表述单调
优化:
可用表述:"向……表示热烈祝贺"、"向……致以诚挚祝贺"、"向……表示祝贺"
注意表述要有变化,不要重复使用同一句式
问题:第二段讲地位作用时,句子之间含义重复、表述啰嗦
优化:
每句话要有新信息,不能重复
句子之间含义、表述都不能重复
既要实在(包含具体信息),又不能啰嗦重复
问题:用户输入"已成功举办",AI直接照搬
优化:
"已成功举办"在正文中应表述为"欣闻……成功召开"或"欣闻……成功举办了"
体现商会文书的正式感
问题:此致和敬礼之间的行间距不一致
优化:
此致和敬礼之间保持1.5倍行间距
此致顶格,敬礼空两格
两行之间不空行
新增"事件官方名称"字段(必填):填写本次活动的完整官方名称
新增"其他注意事项"字段(选填):填写贺信的特殊要求
去掉"特别向"表述,改用"向……表示热烈祝贺"
加强第二段定语要求:必须使用具体的、带定语的表述
错误示例:"XX协会作为行业组织"(缺少定语)
正确示例:"XX协会作为推动本地区XX行业发展的重要力量"
不要使用"最具影响力"等夸张表述
修复排版预览缺少短段落的问题(去掉长度过滤)
修复第三段无首行缩进问题(落款识别逻辑:只有精确匹配"北京丹东企业商会"才是落款)
修复段落之间有空行问题(CSS margin-bottom 改为 0)
Word 导出正文改为左对齐 + 首行缩进
问题:页面加载时 await 阻塞等待 `/api/me` 验证 token,导致卡顿
解决:
没有 token 时:直接显示登录页,不发任何请求
有 token 时:先显示主页面,后台异步验证 token
health 检查完全异步,不阻塞任何操作
已登录主系统的用户,点击"我要写贺信"进入贺信页面后显示未登录
之前已打开的推文页面功能正常,但重新登录失败
贺信页面 `congrats.html` 使用的 localStorage key 是 `token`
主系统 `index.html` 使用的 localStorage key 是 `ddsh_auth_token`
两边 token 存储位置不一致,导致贺信页面读取不到登录状态
统一贺信页面的 token key 为 `ddsh_auth_token`(与主系统一致)
统一请求头为 `X-Token`(与主系统一致,之前贺信用的是 `Authorization: Bearer`)
**网站更名**:从"北京丹东企业商会 · 推文写作助手"升级为"北京丹东企业商会秘书处 · 智能工作平台"
**新增功能选择首页**:登录后进入美观的功能选择页面(卡片宫格布局),包含 8 大功能入口:
**新增"功能开发中"占位页**:`dev.html`,统一风格,支持返回首页
**侧边栏优化**:添加"返回首页"按钮,移除冗余入口(贺信、知识库已集成到首页)
**顶部标题优化**:会话中显示"商会推文 · 会话标题",首页显示平台名称
**底部链接**:首页添加"首次登录?点这里进行连接设置"引导
新增 `webapp/dev.html` 占位页面
`server.js` 新增 `/dev.html` 静态路由
`index.html` 重构欢迎页为功能选择首页
统一更新所有页面标题(登录页、侧边栏、顶栏、知识库页、贺信页)
修复"工委会"分类规则优先级问题,带"工作委员会"、"专业委员会"、"驻商会工作委员会"的人员现在正确归入工委会
修复"党的职务"标签颜色,改为党旗红(#cc0000)
允许同名不同职务的人员重复添加(同一人可以有多个身份)
单独添加人员时,只有姓名+职务都相同才提示"已存在"
优化启动流程,`/health` 和 `/api/me` 并行请求,减少等待时间
登录成功后立即进入主页,会话列表异步加载
缩短超时时间:health 3秒,me 5秒
修复数据库损坏导致无法登录的问题
重建数据库恢复服务
解决单文件代码体量过大问题,实现模块化架构
主页面点击"贺信生成"按钮,新标签页打开独立功能页
输入商协会名称
选择事件类型:
AI 生成符合商会文体风格的贺信
支持对话式修改(输入修改要求,AI 调整内容)
排版预览(公文格式)
Word 文档下载
前端:`webapp/congrats.html`(独立单文件 SPA)
后端 API:
`POST /api/congrats` - 生成贺信
`POST /api/congrats/refine` - 对话修改
`POST /api/congrats/export` - 导出 Word
`GET /congrats.html` - 静态页面服务
复用主系统认证机制(同一 token)
专属 SYSTEM_PROMPT 控制文体风格
主页侧边栏新增"✉ 贺信生成"按钮
✅ 扫描件PDF可自动识别文字
✅ 手机拍照PDF可提取内容
✅ 支持中英文混合识别
✅ 支持多文件上传(不覆盖)
✅ 智能图像预处理提高识别率
快速提取文字层
JavaScript解析
备用解析
兜底方案
Vision API(需OpenAI API Key)
本地OCR引擎(pdftoppm + Tesseract)
200 DPI优化分辨率
ImageMagick图像预处理
灰度化处理
对比度增强
锐化处理
LSTM神经网络引擎
中英文混合识别
识别速度:从6分钟优化到2分钟
成功率:规整扫描件 > 90%
文件大小支持:最大50MB
✅ Nginx上传限制:1MB → 50MB
✅ 服务器超时:10分钟
✅ 前端超时:5分钟
✅ 错误提示优化:JSON解析错误友好提示
文字型PDF:✅ 正常(12ms,43字)
图片型PDF:✅ OCR成功(115秒,2570字)
告别"这个PDF读不出来"的困扰
扫描件、拍照件都能自动识别
大幅提升素材收集效率
为图片型PDF添加OCR文字识别功能
支持扫描型PDF、手机拍照PDF等非文字型PDF
Vision API (需要OpenAI API Key)
本地OCR (pdftoppm + tesseract)
300 DPI高分辨率渲染
图像预处理(灰度化、增强对比度)
多语言支持(中文简体+英文)
多种PSM模式尝试
超时: 10分钟(支持长时间OCR处理)
自动判断PDF类型,触发OCR流程
✅ 文字型PDF: 正常提取
✅ 图片型PDF: OCR成功提取2570字
`开发经验与问题解决手册.md`
PDF文件上传后显示"文件内容为空或无法提取文字"错误
日志显示pdftotext成功提取了文字,但最终结果为空
`server.js` 第1784行存在变量作用域bug
PDF处理块内部重新声明了`let text = ''`,覆盖了外部声明的`text`变量
导致提取的文字只存在于内部变量,外部变量仍为空字符串
删除第1784行的`let text = ''`,使用外部已声明的`text`变量
安装服务器上缺失的`docx`模块(用于Word文档生成)
验证修复:PDF上传功能正常,耗时12ms成功提取223字
**功能描述**:生成推文后可直接导出Word文档,格式符合公文规范
**格式要求**:
标题:黑体、小二(18pt)、加粗、居中
正文:仿宋、小三(15pt)、左对齐、首行缩进、1.5倍行距
**智能标题提取**:
支持"标题:"开头格式
自动识别第一行作为标题(短于50字且不以句号结尾)
**技术实现**:
前端:新增"一键排版"按钮,30秒超时
后端:`/api/format-word` API,使用docx库生成Word文档
文件名格式:`推文_2026-03-19.docx`
**Git push失败后强制停止部署**
避免服务器拉取旧代码
提供详细解决方案(断开VPN或配置分流规则)
**新增代码版本验证**
`verify_code_version()` 函数
确保服务器代码与本地一致
**修复pm2重启命令**
从 `pm2 restart server.js` 改为 `pm2 restart webapp`
**改进SFTP上传**
增加文件大小验证
确保上传完整性
**创建手动SFTP上传脚本**
`manual_sftp_upload.py`
紧急情况快速部署
**创建《开发者手册.md》**
完整开发指南,1039行
整合5份文档:接手人指南、开发者调试经验、SOURCE_GUIDE、问题解决总结、智能混合部署使用指南
零信息遗漏
包含快速上手、技术架构、开发规范、部署SOP、问题排查
**VPN分流配置指南**
`Trojan-Qt5分流配置指南.md`:详细配置步骤
`网络优化快速指南.md`:3分钟快速解决方案
`服务器直连配置-最简方案.md`:最简配置步骤
**问题**:`SyntaxError: "[object Object]" is not valid JSON`
**原因**:`readBody()` 已返回对象,但代码又做了一次 `JSON.parse()`
**修复**:移除重复的 `JSON.parse()` 调用
**问题**:点击"一键排版"后提示"signal timed out"
**原因**:`authFetch()` 默认8秒超时,生成Word需要更长时间
**修复**:为Word生成设置30秒超时
**问题**:部署成功但服务器代码还是旧的
**原因**:Git push失败后继续部署
**修复**:Git push失败后强制停止,新增代码版本验证
**问题**:开启VPN后无法连接GitHub和服务器
**原因**:VPN流量路由问题
**修复**:配置Trojan-Qt5分流规则,服务器直连
**问题**:Word生成失败,提示"Cannot find module 'docx'"
**原因**:服务器未安装docx依赖
**修复**:在服务器webapp目录执行 `npm install docx`
✅ 网站changelog已更新为v4.2
✅ 包含所有新功能和Bug修复记录
✅ 用户可在网站上查看完整更新记录
✅ 一键排版功能正常工作
✅ Word文档格式符合公文规范
✅ 标题智能提取正确
✅ 部署流程优化有效
✅ 代码版本验证通过
deploy_smart.py部署后,服务器代码未更新
git push失败后继续部署,导致服务器拉取旧代码
pm2重启命令错误(server.js → webapp)
使用SCP不符合混合部署规范
本地代码已修改,但未push到GitHub
服务器git pull拉取的还是旧代码
导致部署成功,但代码是旧的
无法确保服务器代码与本地一致
使用`pm2 restart server.js`(错误)
应该用`pm2 restart webapp`(正确)
SCP是独立协议,不符合混合部署规范
应该使用SFTP(paramiko库)
✅ Git push失败后强制停止部署
✅ 新增代码版本验证(verify_code_version)
✅ 修复pm2重启命令(server.js → webapp)
✅ 改进SFTP上传(增加文件大小验证)
✅ 部署步骤从4步增加到5步(增加验证环节)
文件:manual_sftp_upload.py
用途:紧急情况快速上传
符合SFTP规范
文件:部署问题分析与改进方案.md
包含:问题分析、改进方案、部署检查清单
✅ 不再出现部署成功但代码未更新的情况
✅ 每次部署都能确保代码真正更新
✅ 符合混合部署规范(Git优先 + SFTP备用)
✅ 部署问题分析与改进方案.md
✅ manual_sftp_upload.py
✅ 开发者手册已更新
点击"一键排版"按钮后提示"signal timed out"
服务器错误日志:`SyntaxError: "[object Object]" is not valid JSON`
错误位置:server.js:2675行
`readBody()` 函数已经返回解析后的JSON对象
但代码中又做了一次 `JSON.parse(body)`
导致重复解析,报错
✅ 一键排版功能正常工作
✅ Word文档成功生成并下载
✅ 格式符合公文规范
开启VPN后GitHub连接失败
服务器健康检查很慢
需要同时访问国内服务器和国外网站
详细配置步骤
路由规则设置
故障排查方法
3分钟快速配置
最简方案:仅服务器直连
验证测试方法
IP直连:`43.133.62.248`
域名直连:`bjddsh.work`
其他流量走VPN默认配置
`Trojan-Qt5分流配置指南.md` - 完整配置文档
`网络优化快速指南.md` - 快速解决方案
`服务器直连配置-最简方案.md` - 最简配置步骤
✅ 服务器访问速度提升(直连)
✅ 网站访问速度提升(直连)
✅ 其他国外网站正常访问(VPN)
点击"一键排版"按钮后提示"signal timed out"
原因:`authFetch()` 默认8秒超时,但生成Word文档需要更长时间
为 `/api/format-word` 接口设置30秒超时
使用 `AbortSignal.timeout(30000)` 覆盖默认的8秒超时
formatToWord() 函数
✅ 一键排版功能正常工作
✅ Word文档成功生成并下载
✅ 格式符合公文规范
位置:生成结果区域,"复制全文"按钮右侧
功能:点击后将当前推文发送到后端API
接收推文文本
第一行作为标题(黑体、小二、加粗、居中)
其余作为正文(仿宋、小三、左对齐、首行缩进、1.5倍行距)
生成 `.docx` 文件并返回下载
使用 `docx` npm 包生成Word文档
符合公文格式规范
文件名格式:`推文_2026-03-19.docx`
前端代码已更新
后端API已部署
服务器已安装 `docx` 依赖包
功能测试通过
✅ 无需手动调整字体、字号、行距
✅ 符合公文格式规范
✅ 节省排版时间,提高工作效率
整合了5份现有文档的核心内容:
`接手人指南.md` - 快速上手流程
`开发者调试经验.md` - 问题排查经验
`webapp/SOURCE_GUIDE.md` - 代码架构详解
`问题解决总结.md` - 已解决问题汇总
`智能混合部署使用指南.md` - 部署系统说明
7条必须遵守的开发规范
标准的功能开发流程
每次有效更新的标准流程
文档维护承诺
项目概览(基本信息、系统定位、核心功能)
快速上手(换设备恢复、新开对话话术)
技术架构详解(server.js/index.html/AI调用链路)
开发规范(路由、鉴权、语法检查、文档更新)
部署与备份(智能混合部署、回滚操作)
问题排查手册(已解决问题、调试方法论)
功能更新规范(标准流程、Git最佳实践)
账号与密钥(SSH密钥、GitHub Token、续期流程)
附录(目录结构、环境要求、技术债、命令速查)
每次功能更新后同步更新此文档
确保信息零遗漏
保持文档结构清晰
换电脑、重新装机时参考"快速上手"章节
新开WorkBuddy对话窗口时复制"新开对话话术"
开发新功能时参考"技术架构详解"和"开发规范"
遇到问题时查阅"问题排查手册"
部署时参考"部署与备份"章节
✅ 新人接手时间从数小时缩短到10分钟
✅ 关键信息不再散落在多个文档中
✅ Git会自动记录每次更新的完整历史
✅ 防止因信息遗漏导致灾难发生
**双重保险策略**:Git部署优先,SFTP上传备用
**核心优势**:
GitHub CDN加速,下载速度快(3-8秒)
自动版本控制和备份
Git失败时自动降级,不影响部署
不受VPN QoS限速影响
智能混合部署脚本
自动git commit + push(备份到GitHub)
尝试服务器git pull(利用GitHub CDN)
Git失败自动降级SFTP上传
自动健康检查
服务器端Git环境配置脚本(首次部署用)
Git pull超时设置30秒,超时自动降级
SFTP启用压缩传输
自动跳过未修改文件
部署后自动验证 `/health` 接口
部署方式:SFTP上传(Git push因GitHub认证问题待解决)
健康检查:通过
服务状态:正常运行
下次部署:解决GitHub认证后可用 `python deploy_smart.py`
**SCP 大文件上传中断**
根本原因:VPN 链路对高速 TCP 大包做 QoS 限速,超过某阈值直接断流
修复:SCP 命令加 `-o IPQoS=none -l 8192` 参数(关闭 QoS 标记,限速 8Mbps)
效果:2.2MB 文件从失败/几KB/s → 不到 1 秒传完
**Git push 失败(独立问题)**
根本原因:Git 全局配置中写死了代理 `http://127.0.0.1:58591`,与 PowerShell 环境变量是两套独立配置,只清一个不够
修复:执行 `git config --global --unset http.proxy` + `--unset https.proxy`
**新建 `deploy.bat` 统一部署入口**
固化了上述 SCP 参数
一键完成:语法检查 → 上传三文件 → PM2 重启 → 健康检查
**现象**:用户点击"生成推文"后,前端立即弹出错误提示
**根本原因**:`authFetch()` 函数默认使用 8 秒超时,而推文生成需要调用 OpenAI API,通常需要 10-60 秒
**解决方案**:
`generateTweet()` 函数调用 `/api/generate` 时,增加自定义超时参数:`signal: AbortSignal.timeout(120000)`(120 秒)
`regenerate()` 函数(重新生成)同步修改
**技术细节**:
PDF 识别功能能工作是因为它使用本地工具(pdftotext、pdf-parse),不依赖 AI,能在 8 秒内完成
推文生成必须调用 OpenAI API,网络延迟和 AI 处理时间会超过 8 秒
**现象**:用户在完整模式填写了"标题主题"或"活动主题",但点击"生成推文"后仍提示"请填写活动主题"
**根本原因**:
验证逻辑错误:快速模式下检查 `form.topic` 和 `form.persons`,但 `getForm()` 在快速模式只返回 `{ rawInput: v('q-raw') }`,没有 `topic` 和 `persons` 字段
导致 `!form.topic` 恒为 `true`(因为 `form.topic` 是 `undefined`)
**解决方案**:
修改验证逻辑:快速模式检查 `form.rawInput` 是否为空
完整模式检查 `form.theme` 和 `form.titleTopic` 是否至少填写一个
**调试经验**:
增加了 `console.log` 调试信息,打印 `currentMode` 和 `form` 数据
发现用户实际在快速模式,但填写的是完整模式的字段
**现象**:使用 SCP 上传文件到服务器时,速度只有几 KB/s
**根本原因**:PowerShell 配置文件自动启用了代理 `http://127.0.0.1:58591`,导致所有流量走代理
**解决方案**:注释掉 `C:\Users\13714\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1` 中的代理设置
**经验总结**:
VPN 环境下,需要区分本地工具(SSH/SCP)和浏览器流量
建议在 `.bashrc` 或 `.zshrc` 中设置 `no_proxy` 环境变量
**前端进度条** UI:
文件上传区域下方新增进度条(隐藏状态)
上传时显示"正在上传 xxx",进度条从 0% → 40%
提取时显示"正在提取 xxx 的内容",进度条 40% → 100%
完成后 1 秒内自动隐藏进度条,显示"✓ 已成功提取 xxx(字数)"
进度条设计:灰色背景 + 绿色填充,圆角边角,过渡动画 0.3s
**后端日志**:
上传接收阶段:每 500KB 打印一次"已接收 XMB..."
上传完成:打印"上传完成,耗时 Xms,大小 XMB"
提取开始:打印"开始提取,文件名=xxx,大小=XMB,格式=xxx"
提取完成:打印"完成!耗时 Xms,提取 X 字"
**作用**:管理员可通过日志监控,用户体验透明化
**支持格式更新**:
前端允许扩展格式:`.webp`, `.tif`, `.tiff`
`uploadFile()` 函数已更新允许列表
使用 `setInterval` 模拟进度条动画(每 300ms 更新)
进度条速度曲线:快速起步 → 逐步减速,符合真实上传体验
错误时进度条自动隐藏,显示错误 toast
前版本虽然声称支持 PDF 和图片识读,但实际不工作
**根本原因**:`callAI()` 函数设计为文本对话,将 OpenAI vision API 的多模态格式(数组)转成纯文本发送,导致 `[object Array]` 被当作文本
结果:图片无法识读,PDF 超时
绕过 openclaw 文本处理
直接调用 OpenAI 兼容 API
正确处理 `{ type: 'image_url', image_url: { url: 'data:...' } }` 格式
设置 60 秒超时(处理大文件)
返回 JSON 响应,不经过文本解析
第一层:本地 pdf-parse(最快)
第二层:Vision API(扫描型 PDF)
第三层:pdftotext 命令(备用)
第一层:Vision API(直接调用,无系统依赖)
第二层:tesseract OCR(若已安装)
彻底解耦了文本 AI 和视觉 AI 的调用路径
Vision API 使用直接的 HTTPS 请求(不走 openclaw 中间层)
错误消息更明确,指导用户排查问题
支持 `application/pdf` MIME 类型直接传给 Vision API
✅ 后端语法检查:`node --check` 通过
✅ 前端语法检查:`local_jscheck.py` 通过
✅ 部署验证:PM2 进程正常启动
✅ 健康检查:HTTP 200 返回
**PDF 识读优化**:实现 4 层递进式方案,支持文字型和扫描型 PDF
第一层:本地 `pdf-parse` 库(最快)
第二层:AI 视觉 API(支持扫描型 PDF)
第三层:`pdftotext` 命令行工具(备用)
第四层:pdf-parse 库后备尝试
**关键改进**:即使 pdf-parse 失败,也会自动降级到 AI 视觉 API 或系统工具,不会卡死或抛出错误
**图片识读优化**:实现 2 层方案,无需系统依赖
第一层:AI 视觉 API(推荐,无依赖)
第二层:本地 `tesseract` OCR(备用,若已安装)
**关键改进**:优先使用 AI 视觉 API,格式:`{ type: 'image_url', image_url: { url: 'data:image/png;base64,xxx' } }`
**支持格式扩展**:
原有:PDF、Word、Excel、TXT、Markdown、JPG/PNG/GIF/BMP
新增:WEBP、TIFF(`.webp`, `.tif`, `.tiff`)
**前端 UI 更新**:
上传区提示改为"自动提取文字(包含扫描类PDF)/ 自动识别图片文字"
文件选择器 accept 属性已包含所有新格式
**错误处理升级**:
若 AI API 不可用,明确提示用户检查 AI 配置或联系管理员安装 pdftotext
建议用户将无法识别的 PDF 转换为图片后重试
**已部署**:代码已上线并通过语法检查(nodejs `--check` + `local_jscheck.py`)
**新增"从文件导入内容"卡片**:完整模式表单顶部新增文件上传区
**支持文件格式**:
文档:PDF、Word(.doc/.docx)、Markdown(.md)、TXT
电子表格:Excel(.xlsx/.xls)
图片:JPG/PNG/GIF/BMP(自动 OCR 识别文字)
**后端实现**:
`POST /api/extract-file` 路由支持 multipart/form-data 文件上传
PDF:使用 `pdf-parse` v1.x 解析(已适配 v2.x)
Word:使用 `mammoth` 库提取文本
Excel:使用 `xlsx` 库逐表提取,支持多工作表
Markdown/TXT:直接读取文本
图片:使用 tesseract OCR(服务器需安装)
**前端集成**:
上传文件后自动提取文字,显示"已提取 XXX 字"
用户可编辑提取内容
生成推文时,提取的内容自动附在表单信息后作为"参考资料"供 AI 参考
支持拖拽或点击选择文件
**功能说明更新**:
卡片标题改为"📎 从文件导入内容"
提示文案更新为"自动提取文字/识别图片,用作生成推文的原始素材"
**已部署**:代码已上线,功能立即可用
**问题修复**:腾讯云 SES API 参数名从小写改为大写(`template` → `Template`、`templateId` → `TemplateID` 等)
**测试验证**:多次测试确认邮件能正确发送,获得腾讯云返回的 MessageId
**部署完成**:服务器已重启,邮件提醒系统全面启用
**功能规则**:
每天北京时间 09:30 运行一次检查
仅在 Token 到期前一天和当天发送邮件(其他日期不发)
到期前一天:发 2 封邮件(本人 + 管理人员)
到期当天:发 1 封紧急提醒邮件给本人
**问题**:多个部署脚本并存,经常用错导致部署失败或文件遗漏
**排查结果**:8个部署脚本中只有 `deploy_ubuntu.py` 能正常工作
**其他脚本问题**:
`deploy_now.py`:用户名错误(root),文件不全
`deploy_force.py`:文件不全
`deploy_binary.py`:文件不全
`deploy_frontend.py`:文件不全
`deploy_sftp_only.py`:文件不全
`deploy_with_key.py`:用户名错误(root),路径错误
`deploy_smart.py`:PowerShell输出问题
**清理操作**:删除上述7个不能工作的脚本,只保留 `deploy_ubuntu.py`
**文档更新**:
更新 `开发者手册.md` 第五章"部署与备份"
新增规范10:部署脚本唯一正确选择
明确部署命令:`cd c:\Users\13714\WorkBuddy\20260313151859 && python deploy_ubuntu.py`
修复了排座系统 (`seating.html`) 中从人员库导入的功能
问题:前端调用的是 `/api/persons`,但后端实际 API 是 `/api/rp-manage`
修复:`loadPersonLibrary()` 改为调用正确的 API `/api/rp-manage`,并处理返回格式 `{ success: true, data: [...] }`
优化:`renderPersonSelector()` 显示更完整的人员信息(姓名+职务+单位)
优化:人员库为空时显示引导提示,- 确认:后端 `import/persons` 接口已正确传递 `company` 字段
修复了排座系统 (`seating.html`) 中从人员库导入的功能
**问题**:前端调用的是 `/api/persons`(不存在的API),但后端实际人员库API是 `/api/rp-manage`
**修复**:`loadPersonLibrary()` 改为调用正确的API `/api/rp-manage`,并处理返回格式 `{ success: true, data: [...] }`
**优化**:`renderPersonSelector()` 显示更完整的人员信息(姓名+职务+单位)
**优化**:人员库为空时显示引导提示
**确认**:后端 `import/persons` 接口已正确传递 `company` 字段,`source_type = 'builtin'`
**确认**:单个添加和批量粘贴导入设置 `source_type = 'temp'`(不入总库)
已部署验证通过
**deploy_both.py 自动同步 Token 过期日期**:改进了部署脚本,每次运行 `deploy_both.py` 时,自动从服务器的 openclaw auth-profiles.json 中读取 Token 过期时间戳(`expires` 字段),转换为北京时间日期,并自动同步到服务器 `webapp/data/token_expiry.json`,无需手动更新设置页面
**续期流程简化为 2 步**:
**邮件模板同步更新**:server.js 中「明天到期」和「今天到期」两封邮件正文的续期步骤均已更新为正确的 2 步版本
**本地 HTML 邮件模板**:生成了 `邮件模板_提醒本人.html` 和 `邮件模板_提醒他人.html` 两份本地预览文件
**腾讯云 SES 邮件服务集成**:使用腾讯云邮件推送服务发送 HTML 格式邮件,支持 TC3-HMAC-SHA256 签名认证
**自动定时检查**:每天北京时间 09:30 自动检查 ChatGPT OAuth Token 过期情况
**智能提醒策略**:
Token 过期前 1 天:发送提醒邮件给于曜溥本人,同时通知吴梦娜和贾雨珊协助提醒
Token 过期当天:发送紧急邮件给于曜溥本人
如果过期日是周末,提前到前一个工作日(周五)早上 09:30 执行
**网页设置界面**:在系统设置页面可更新 Token 过期日期
**数据持久化**:Token 过期日期保存在服务器 `webapp/data/token_expiry.json`
**测试工具**:提供服务器端测试脚本 `webapp/test_email_direct.js` 验证邮件发送功能
**后续配置**:需在腾讯云 SES 控制台验证发件域名(bjddsh.work)和收件地址(3个邮箱),完成后邮件提醒功能全面启用
**已部署**:代码已上线到生产服务器,定时任务自动启动
**`deploy_both.py` 新增 changelog 自动注入**:每次部署时自动解析本文件「三、功能更新日志」章节,将所有 `### 日期 — 标题` 条目转换为网页 HTML 并注入 `index.html` 的版本更新记录弹窗
历史大版本(v4.1/v4.0/v3.0/v2.0/v1.0)保留在 changelog 末尾,开发日志条目展示在最前面
**从此不再手动维护 index.html 里的版本记录**,只需维护本文档,部署时自动同步
**GitHub 私有仓库建立**:代码推送至 `https://github.com/yuyaopu-CN/-`(私有),换电脑或换人只需 `git clone` 一条命令恢复全部代码
**`deploy_both.py` 新增自动 git push**:每次部署后自动将代码同步到 GitHub,无需手动操作
**代码文件加入"上下文提示注释"**:`server.js` 和 `index.html` 顶部新增给 AI 看的中文说明(项目规则、模块速查),新开对话窗口时 AI 无需重新解释背景
**新建「接手人指南.md」**:专为换设备、换人、新开对话窗口场景设计,包含恢复步骤和第一句话该对 AI 说什么
**文档整合(8→4个)**:
删除「部署操作手册.md」「Codex代理配置手册.md」「webapp/服务器部署命令.md」「webapp/部署说明.md」4个冗余/过时文件
「灾难恢复指南.md」升级为综合运维手册,合并了部署操作、Codex Token 续期、换机恢复、回滚、迁服务器等所有场景
所有变更已提交并推送至 GitHub
**根本原因**:页面初始化时 `/health` 探测超时仅 2 秒,服务器(新加坡)偶发慢响应时误判为不可用,导致 `useServerStorage=false`,自动登录逻辑被跳过;`/api/me` 和 `/api/sessions` 完全没有超时限制,一旦网络抖动就无限卡死(浏览器默认 30 秒才报错)
**修复 1:`authFetch` 全局加 8 秒默认超时**:所有需鉴权的请求(`/api/me`、`/api/sessions`、`/api/rp` 等)统一受 8 秒保护,调用方可传 `signal` 覆盖
**修复 2:`/health` 探测超时从 2 秒提升到 5 秒**:避免网络稍慢时误判服务器不可用
**修复 3:自动登录流程加"验证登录中…"提示**:页面打开有已保存 token 时,登录按钮立即显示"验证登录中…"并禁用,验证超时或失败后自动恢复为"登 录",彻底消除界面假死感
**已部署**:`index.html` 上传并 pm2 restart,服务器 online 确认
**人员库数据从 localStorage 迁移至服务器端 SQLite**:彻底解决版本升级导致用户数据丢失的问题
新增 `rp_persons` 表,含 `tenant` 字段,支持未来多商会 SaaS 隔离
内置 18 条默认人员数据由服务端幂等初始化,前端不再维护 BUILTIN 数组
**前端人员库全面改为 API 调用**:
`rpLoadPersons()`:`GET /api/rp`
`rpAddPerson()`:`POST /api/rp`
`rpDeletePerson()`:`DELETE /api/rp/:id`
`rpHandleImport()`:`POST /api/rp/batch`(批量导入)
`rpSortDrop()`:`PUT /api/rp/:id`(拖拽排序持久化)
**清理旧代码**:删除 `RP_PERSON_KEY`、`RP_PERSON_VER`、`BUILTIN` 数组、localStorage 版本升级逻辑(共约 50 行)
**修复 server.js `method` 变量 bug**:`/api/rp` 路由中误用裸变量 `method`,已全部修正为 `req.method`
**部署自动备份**:`deploy_both.py` 每次部署前自动备份工程文件到 `E:\商会秘书处工作平台\backups\`,保留最近 20 份
**知识库跳转循环 bug 修复**:改为 `window.open` 新标签打开,彻底绕开主站认证流程;未登录时在知识库页面内直接显示提示,不再跳转循环
**党的职务标签改为党旗红色**:`#cc0000`
**人员库升级机制重构(v5)**:
原有"版本不同就清空"改为智能 upsert:按 `name+title` 做唯一键,只补充缺失的内置条目,**用户手动添加的数据永远不会被清除**
只有旧数据完全没有 grp 字段时才做完全重写(首次迁移)
**工程文件归档备份**:完整复制 221 个文件到 `E:\商会秘书处工作平台\20260313151859`
**人员库新增"党的职务"标签页**:筛选栏、GRP_LABEL/GRP_ORDER、rpClassify、toast 均已同步
刘耀日(党支部组织委员)
于曜溥(党支部宣传委员、执行秘书长)
**工委会新增于曜溥**:商会执行秘书长、青年人才工作委员会主任
**人员库版本升至 v4**:刷新页面自动清除旧缓存,写入最新默认数据
**知识库跳转 bug 修复**:
`kb.html` 未登录时改跳 `/?redirect=/kb.html`
主站自动登录成功后检测 `redirect` 参数,有则直接跳回目标页
手动登录成功后同样检测 `redirect` 参数
`deploy_both.py` 补充 kb.html 上传,以后不再漏部署
**人员库默认数据全面更新**:
于曜溥:`副秘书长` (leader) → `执行秘书长` (sec)
刘晓阳:`秘书处办公室副主任` (sec) → `秘书处办公室主任` (sec)
贾雨珊:`行政助理` (sec) → `宣传部长` (sec)
新增**王哲明**(监事长 / leader)
新增**李春楠**(副秘书长 / sec)
新增**刘耀日**(副秘书长 / sec)
**新增版本强制刷新机制**:`RP_PERSON_VER = 'v3'`,版本号变化时自动清除旧 localStorage 数据并重新写入最新默认人员库,不再需要用户手动清除缓存
**分组修正**:`rpClassify` 归类规则精确化,执行秘书长、副秘书长不再被宽泛匹配为"负责人"组,改归入"秘书处"组;秘书长(精确匹配 `^秘书长$`)仍保留在负责人组
**排序修正**:`RP_WEIGHT_MAP` 权重表重新梳理,新增"执行秘书长(w=8)"节点,排在监事长之后;副秘书长调至 w=9;宣传/部长新增 w=12;助理/专员/联络调整至 w=13(同组内部顺序更合理);整体顺序:会长→副会长→秘书长→监事长→执行秘书长→副秘书长→主任→副主任→宣传部长→助理→理事→工委
**清理残留旧行**:前端 prompt 副本中重复的旧"秘书长:李广生;监事长:王哲明"行已删除
**轮值会长表述修正**:统一改为"轮值会长",不再写"X月轮值会长";同时修正了之前 SYSTEM_PROMPT 中的错误指引,前后端 prompt 副本均已同步
**"禁用表达"框改为"其他注意事项"**:输入框 placeholder 更新为通用提示,传给 AI 的标签名同步改为 `【其他注意事项】`,语义更准确,也可填入非禁用类的写作要求
**新增有效信息量写作规则**(server.js + 两处 prompt 副本):要求合作表述必须具体到领域/方向,禁止空泛表述"企业合作""商会合作""项目合作";可结合用户输入、对接方背景或知识库内容延伸
**质检新增有效信息量检测**:`checkTweetClient` 中加入正则检测,若文中出现无具体领域修饰的"企业合作""商会合作""项目合作",质检报告给出提示
**质检新增人员排序校验(前端版)**:`checkTweetClient` 新增 `checkMemberOrderClient()`,与后端 `checkMemberOrder` 逻辑完全一致,前端直连模式下也能做排序质检;`form.rotatingLeader` 自动传入,轮值会长动态提升
**内部自检规则更新**:SYSTEM_PROMPT 生成前自检清单补充"合作表述是否具体""最后一段秘书处表述是否已更新为新职务"等项目
**于曜溥**:副秘书长 → 执行秘书长,在排序中位于监事长(王哲明)之后、理事之前(rank=6)
**刘晓阳**:秘书处办公室副主任 → 秘书处办公室主任
**贾雨珊**:行政助理 → 宣传部长
同步更新 SYSTEM_PROMPT 人员名单、常用秘书处表述、党建活动秘书处表述
同步更新质检排序 RANK 表(于曜溥从 rank=7 升至 rank=6,李春楠/刘耀日副秘书长调整至 rank=8)
同步更新第一段规则说明(新增"执行秘书长"节点)
**新增质检项:第一段人员排序**:生成推文后自动校验第一段内商会人员出场顺序是否符合规则,不符合时在质检报告中给出明确的错误提示(指出哪两人顺序倒置)
**正确排序规则**:会长(林森)→ 本月轮值会长(提升到会长之后)→ 副会长(固定顺序:胡东鹏、姚宇、耿宝龙、宋国良、金凤、王婷婷)→ 秘书长 → 监事长 → 理事 → 副秘书长 → 区域工委会主任 → 其他会员
**自动感知轮值会长**:校验时自动读取当次生成表单中的 `rotatingLeader` 字段,将轮值会长临时提升到 rank=2,无需手动配置
**精准定位**:只扫描正文第一段(标题后、第一个空行前),不误报后续段落中出现的人名
**已通过5组场景回归测试**:含正确排序、副会长乱序、秘书长提前、轮值会长提升等场景,全部输出符合预期
**修复推文生成结果包含 JSON 原文的问题**:openclaw 升级后输出格式从 `{"payloads":[...]}` 变更为嵌套结构 `{"runId":"...","result":{"payloads":[...]}}` 。解析代码已兼容新旧两种格式(优先读 `result.payloads`,旧版兜底读顶层 `payloads`);fallback 逻辑同步增加过滤 JSON 行的规则,防止整段 JSON 被当作正文输出。
**修复「活动地点」和「秘书处段落」输入框点击后无法粘贴名字的 bug**:两个字段 `f-location`、`f-lastParticipants` 之前未加入焦点监听白名单 `RP_PERSON_FIELD_IDS` / `RP_ALL_FIELD_IDS`,导致点击芯片时找不到最近聚焦的字段,转而粘贴到上一个聚焦过的其他框。现已加入白名单,点击逻辑和拖拽逻辑同步修正。
**修复 kb.html 未登录问题**:`localStorage` key 从错误的 `'authToken'` 修正为与主站一致的 `'ddsh_auth_token'`,现在进入知识库页面会自动读取已有登录状态
**新增登录守卫(`checkLogin()`)**:页面初始化时先调 `/api/me` 验证 token,若未登录或 token 失效直接跳回主站 `/`,不再提示"未登录"
**顶栏显示当前用户名**:登录验证通过后在右上角显示登录用户名,方便确认身份
**权限放宽**:分类增删(`POST/DELETE /api/kb/categories`)和文件上传(`POST /api/kb/upload`)从原来的"仅 admin"改为"登录即可",普通账号也能使用知识库全部功能
**数据安全承诺**:后续所有 kb.html 修改均采用精准 `replace_in_file`,不整文件重写,避免因超时/断网导致数据丢失
**主页左边栏「知识库管理」改为直接跳转** `/kb.html`,不再打开弹窗
**分类改为标签页(Tab Bar)**:点击切换即时筛选,右侧「+」按钮新增自定义分类(持久化到数据库 `kb_categories` 表),非内置分类可点击「✕」删除
**新增 `kb_categories` 数据库表**:存储分类定义(内置5类 + 用户自定义),服务器启动时自动初始化内置分类
**新增 API**:
`POST /api/kb/categories` — 添加自定义分类(需admin)
`DELETE /api/kb/categories/:id` — 删除自定义分类(内置不可删)
**批量文件上传**:新增/编辑弹窗支持「直接输入」/「上传文件」模式切换,文件区支持拖拽或多选,每个文件独立显示上传进度和结果
**爬虫功能全面整合**:右上角「🕷 爬虫」按钮展开侧边面板,包含:
公众号账号管理(增/删/显示最后抓取时间和文章数)
增量/全量抓取,实时显示抓取日志
粘贴文章链接批量导入(每次最多20条)
**类型筛选**:工具栏新增「全部/手动输入/上传文件/爬虫抓取」快速筛选
**通用确认对话框**:删除条目、删除分类、删除公众号均有二次确认,说明软删除可恢复
**页面整体**:响应式卡片网格布局,搜索/排序/筛选工具栏,分类统计数字实时更新
**新增全屏知识库管理页面** `http://43.133.62.248:3000/kb.html`,与推文助手完全分离
**5大预设分类**:既往推文 / 商会介绍 / 领导讲话 / 工作部署 / 政策文件 + 自定义分类
**1-5星重要程度评分**:交互式星级点击选择,支持按重要程度排序
**多种排序方式**:最近更新 / 最早创建 / 重要程度
**上传/删除需管理员权限**(admin账号),普通用户只能查看
**PUT /api/kb/:id 更新接口**(新增)
**GET /api/kb/categories 分类列表接口**(新增)
**数据安全机制**:
删除操作为软删除(`enabled=0`),数据不立即清除,可恢复
删除前弹出确认对话框,提示可恢复
**服务器启动时自动备份数据库**到 `data/backups/` 目录,每天执行一次,保留最近7个备份
数据库迁移脚本:旧数据库自动添加 `category`、`importance`、`created_username` 字段
**核实**:OpenAI 于 2026-03-05 正式发布 GPT-5.4(API 模型名 `gpt-5.4`),OpenClaw 于 2026-03-07 发布 2026.3.7 版本原生支持
**OpenClaw 平台侧**:通过 `openclaw models set openai-codex/gpt-5.4` 将服务器默认模型由 `openai-codex/gpt-5.3-codex` 升级为 `openai-codex/gpt-5.4`,同走 ChatGPT Plus 订阅通道(OAuth,零 API 费用)
**推文助手后端(server.js)**:
`CONFIG.model` 默认值从 `gpt-4o` 改为 `gpt-5.4`
`resolveAIConfig()` 中 chatgpt-plus 通道模型标注更新为 `gpt-5.4`
`/health` 接口返回 `model` 字段改为 `gpt-5.4(ChatGPT Plus via OpenClaw)`
顶部注释文档同步更新
**推文助手前端(index.html)**:
连接设置「自动配置」Tab 标题改为「ChatGPT Plus 模式(GPT-5.4)」,描述中注明当前模型
`applyCloudChatGPTPlus()` 保存的 model 值改为 `gpt-5.4`
顶栏 badge 由"ChatGPT Plus"改为"GPT-5.4 Plus"
OpenAI 手动配置预设提示由 `gpt-4o` 更新为 `gpt-5.4`
启用/状态文字统一更新为"ChatGPT Plus 模式(GPT-5.4)"
**已验证**:`/health` 接口返回 `"model":"gpt-5.4(ChatGPT Plus via OpenClaw)"`,Token 有效期至 2026-03-26
极简模式从"主题+人物+关键词三小框"改版为**单一大文本粘贴区**,用户直接粘贴原始素材,AI 自动提取并生成推文
模式描述更新为"粘贴原始内容,一键生成"
"有主持人"新增开关:关闭时隐藏输入框,不生成主持人相关内容
"有秘书处段落"新增开关:关闭时不生成秘书处相关内容;开关打开后显示参与人员输入框
删除"是否党建活动"独立开关,改为选择 **EVT15** 标签时自动触发党建写法
删除"其他选项"卡中独立的"最后一段参与人员"输入框
将该字段合并至"有秘书处段落"开关下方,逻辑更清晰:开关开 → 填人员(留空用默认);开关关 → 不生成秘书处段落
侧边栏按钮改名为「连接设置(首次使用请点击)」,更清晰引导新用户
设置面板拆分为**自动配置 / 手动配置**两个 Tab
**自动配置**:ChatGPT Plus 一键启用,点击立即保存生效并关闭面板,不再需要"保存配置"按钮;显示当前启用状态
**手动配置**:须先从下拉框选择 API 服务商(DeepSeek / OpenAI / MiniMax / 自定义),选定后才展开填写框,并自动填入对应的 Base URL 和模型名称提示
若当前已是 ChatGPT Plus 模式,切换到手动配置时显示警告提示条,提供"清除原有配置"链接,点击后清空所有配置供重新填写
删除设置面板内的「验证连接」模块(主界面侧边栏保留)
**Bug1 修复**:移除文件后再次点击"上传"按钮无响应 — 根因是 `clearFile()` 用 `.value=''` 清空 input,Chrome 下会导致 input 失活;改为克隆节点替换旧 input,彻底重置文件选择器
**Bug2 修复**:PDF 文件无法解析 — 根因是服务器安装的 `pdf-parse` 为 v2.x,API 由函数改为 `PDFParse` 类,而 server.js 仍用 v1.x 调用方式;改为自动检测导出类型,对 v2.x 做 wrapper 兼容,现 PDF 解析正常工作
将「写明活动地点」开关从"活动基本信息"卡片迁移至**"人员信息"卡片**,位置在「有主持人」开关上方
位置更贴近其语义:地点信息与出席人员、主持人等同属"本次活动参与要素",逻辑更连贯
活动地点由始终显示的文本框,改为**开关 + 条件输入框**的交互方式
默认**关闭**(不写地点):标题已写明地点、或无需突出活动场地时,无需额外填写
打开「写明活动地点」开关后显示输入框,填写后 AI 会在推文中加入"在某地举行"描述
重置表单时开关恢复默认关闭状态
事件库(Tab 2)全面升级为**七大专业词典**,完全重构内容体系:
**ACT · 流程动作**(36 条):涵盖开篇信息、参观考察、座谈交流、发言、仪式节点、收束后续 6 个子分组
**ATT · 发言态度**(10 条):欢迎、感谢、认可、祝贺、期待等常用态度词
**TOP · 合作议题**(25 条):产业协同、科技成果转化、人才引育、招商引资等合作方向词
**MEC · 推进机制**(18 条):常态化沟通、平台化运作、清单化推进等机制词
**OUT · 结果产出**(16 条):达成共识、形成机制、签署协议等成果词
**ROL · 角色定位**(10 条):桥梁纽带、窗口平台、资源整合者等角色词
**VAL · 价值导向**(15 条):服务四方、家乡振兴、乡情凝聚等价值词
chip 只显示**中文释义**(去掉编码前缀),信息更直观
**七色马卡龙配色**区分不同词典:ACT薄荷绿、ATT天空蓝、TOP薰衣草紫、MEC蜜桃橙、OUT樱花粉、ROL柠檬黄、VAL珊瑚红
词典内按子分组显示小标题,层次清晰
筛选条右侧新增低调「编辑」小字按钮(带下划线),点击进入编辑模式,再点「完成」退出
**编辑模式下**:
chip 右上角出现红色 × 删除按钮,支持逐个删除人员
chip 支持**手动拖拽排序**:在同一分组或跨分组间拖动,松手后顺序持久化保存;排序优先级高于职务权重,自定义排序后不再自动重排
底部显示「添加 / 批量导入」表单(支持单个添加和 .txt/.csv 批量导入)
**浏览模式下**:chip 仅支持拖入输入字段,无删除按钮,无添加表单,防止误操作
人员库新增 **分组筛选条**(全部 / 负责人 / 秘书处 / 理事 / 工委会 / 其他),点击即可按组筛查
**自动归类**:新添加或批量导入人员时,根据职务关键词自动判定所属分组(无需手动设置)
含"会长/秘书长/监事长"→ 负责人;含"秘书处/行政/助理/联络处"→ 秘书处;含"理事"→ 理事;含"工委"→ 工委会;其余→其他
**自动排序**:按职务权重(会长→副会长→秘书长→监事长→主任→理事→工委→助理)从大到小排列,职务大的始终在上方
**马卡龙五色区分**:不同分组卡片颜色不同——负责人(玫瑰红)、秘书处(天空蓝)、理事(薄荷绿)、工委会(淡紫色)、其他(暖黄色)
**去掉删除按钮**:人员库卡片不支持删除,防止误操作
添加人员成功后自动跳转至对应分组 Tab
新增右侧资源库面板,支持向右收窄为细条(点击 › 收起/展开)
**人员库**(Tab 1):
预置商会全体成员名录(林森、各副会长、秘书长、秘书处成员等)
支持手动添加人员(姓名必填、职务选填),含格式校验和重名检测
支持批量导入:上传 .txt/.csv 文件,每行 `姓名,职务` 或 `姓名/职务` 格式,自动去重
人员以圆角标签显示,可直接**拖拽**到"商会出席人员""外部接待人员""主持人"等字段,自动用顿号拼接并去重
支持删除单个人员
人员数据本地持久化(localStorage),刷新不丢失
**事件库**(Tab 2):
从推文词典提取 7 大分组 60+ 个常用词条:活动动作、讲话动作、态度立场、合作表达、商会工作重心、活动事项、结尾表达
词条以绿色圆角标签展示,可直接**拖拽**到活动主题、活动事项、发言人、后续安排、结尾方向等文本字段
拖入时在光标位置插入,智能补顿号分隔
人员库数据随账号设备存储,事件词典内置不需维护
删除"本月轮值会长"手动输入框
改为根据活动日期自动推算并以只读提示卡显示(填写日期后实时更新)
轮值名单写入系统:1-2月耿宝龙、3-4月王婷婷、5-6月宋国良、7-8月金凤、9-10月李广生、11-12月姚宇
AI 生成规则:若出席人员中有当月轮值会长,自动将其头衔替换为"X月轮值会长";若无则不提及
🔧 排座系统重大重构:主人/客人智能识别 + 会议室设置增强
主人/客人智能识别系统:
✅ 新增 AI 智能识别会议场景和主人/客人归属功能
✅ 根据人员职务和分组自动推断身份类型(商会领导/商会成员/政府/企业/其他)
✅ 统一排序权重函数,人员按身份等级智能排列
✅ 创建会议时自动完成"合并人员→AI识别→排序→分组→导入→排座"全流程
会议室设置全面增强:
✅ 新增主人侧/客人侧/主位朝向/大门位置/油画位置方位选择控件
✅ 修改会议室模板后自动同步当前会议,检测座位一致性
✅ 会议列表新增批量删除功能
稳定性修复:
🔧 修复反复点击重复创建会议(防重入锁+幂等保护)
🔧 修复自动排座异步执行导致先看到空座位的体验问题
🔧 修复创建会议后自动排座失败"没有可用座位"的问题
🎯 一条龙系统全面升级 + 人员管理增强
一条龙系统:
✅ 新增"活动一条龙"入口,串联排座→议程→通知→推文全流程
✅ 一条龙内可直接选择已创建的活动进行后续操作
人员管理增强:
✅ 人员库新增"分组"字段,支持按分组筛选
✅ 批量导入支持 CSV 和 Excel 格式
✅ 人员库与排座系统双向同步
📝 活动通知系统上线
✅ 批量生成活动通知,支持手动输入/粘贴/CSV导入人员
✅ 智能称谓:有职务显示职务,无职务显示先生/女士
✅ AI 润色开关:开启时自动优化通知措辞
✅ 一键导出 Word 文档
✅ 支持从排座系统直接导入参会人员
🪑 排座系统 AI 智能排座 + 导出增强
✅ AI 自动排座:根据人员身份、主客方、职务智能分配座位
✅ 导出 Word:支持座次图导出为带表格的 Word 文档
✅ 会议室模板:支持多个会议室预设
✅ 拖拽调整座位位置,实时预览效果
📊 知识库管理系统
✅ 知识库分类管理,支持增删改查
✅ 知识条目关联分类,支持关键词搜索
✅ 推文生成时自动注入相关知识库内容
👥 人员库管理系统
✅ 人员信息录入与管理(姓名、职务、单位、电话等)
✅ 支持手动添加和批量导入
✅ 与排座系统、通知系统联动
🎯 账号管理与多用户支持
✅ 登录/注册功能,密码 SHA-256 加密存储
✅ Token 认证机制,30天有效期
✅ 推文会话按用户隔离
📎 文件识读与内容提取
✅ 支持 PDF 文字提取和图片识读
✅ 多层递进式识读方案(本地解析→AI视觉→备用命令)
✅ 文件内容自动注入推文上下文
🚀 全新界面改版
✅ 侧边栏导航,多功能模块化布局
✅ 推文生成流程优化:选择场景→输入要点→AI生成→编辑→复制
✅ 一键排版功能
✅ 暗色侧边栏 + 浅色主内容区设计
🤖 AI 推文生成核心功能
✅ 基于 GPT 模型的推文自动生成
✅ 多场景推文模板(会议、拜访、活动等)
✅ 推文会话管理:保存、查看、删除历史记录
✅ 推文质量自检与自动润色
📰 网页文章识读与话题推荐
✅ 爬取指定网页文章内容
✅ AI 分析文章生成话题推荐
✅ 话题库管理
🎉 项目启动
✅ 初始推文写作助手界面
✅ 基本的文本输入与生成功能
✅ 清北仁达推文系统(独立模块)