更新
This commit is contained in:
@@ -13,6 +13,189 @@
|
||||
|
||||
## 一、已完成事项
|
||||
|
||||
### 44. uniapp 启动缺失 sourcemap 修复
|
||||
|
||||
- 状态:已完成 - 时间:2026-06-11
|
||||
|
||||
完成内容:
|
||||
- 排查 H5 启动时报 `Failed to load source map ... index.js.map`,确认根因是 `vk-uview-ui` 内置 `async-validator.js` 尾部保留了 `//# sourceMappingURL=index.js.map`,但同目录没有对应 map 文件。
|
||||
- 移除该第三方 vendored 文件的无效 sourcemap 注释,避免 Vite 启动或构建时继续读取不存在的 `index.js.map`。
|
||||
|
||||
涉及模块:
|
||||
- `uniapp/src/uni_modules/vk-uview-ui/libs/util/async-validator.js`
|
||||
|
||||
验证记录:
|
||||
- 已执行 `npm run build:h5`,H5 构建通过,日志中不再出现 `index.js.map` 缺失报错。
|
||||
|
||||
### 43. 项目 AI 统一切换 OpenAI Responses 配置
|
||||
|
||||
- 状态:已完成 - 时间:2026-06-11
|
||||
|
||||
完成内容:
|
||||
- 后端生成类 AI 统一改为通过 `DeepSeekClient::defaultModelOptions()` 读取项目 OpenAI 配置,默认模型 `gpt-5.5`、Base URL `https://lingsuan.top`、协议 `responses`。
|
||||
- `DeepSeekClient` 支持从 `server/.env` 的 `OPENAI_API_KEY / OPENAI_BASE_URL / OPENAI_MODEL / OPENAI_WIRE_API` 以及 `la_ai_config.openai_%` 读取配置,并默认关闭 Responses 存储。
|
||||
- 帖子图片识别、彩票/赛事/资讯 RAG 分析和 AI 助手统一复用 OpenAI Responses 配置;AI 助手不再优先走 `qwen_%` 配置。
|
||||
- 已向测试库 `la_ai_config` 写入 `openai_api_key`、`openai_base_url`、`openai_model`、`openai_wire_api`、`openai_provider_label`、`openai_reasoning_effort`、`openai_disable_response_storage` 配置项。
|
||||
- 新增幂等 SQL `docs/sql/insert_openai_ai_config.sql`,用于初始化非密钥 OpenAI 配置;API Key 建议继续通过 `.env` 或后台配置维护。
|
||||
|
||||
涉及模块:
|
||||
- `server/app/common/service/ai/DeepSeekClient.php`
|
||||
- `server/app/common/service/ai/AiService.php`
|
||||
- `server/app/common/service/ai/KbRagService.php`
|
||||
- `server/app/common/service/ai/AiAssistantService.php`
|
||||
- `docs/sql/insert_openai_ai_config.sql`
|
||||
- `la_ai_config`
|
||||
|
||||
验证记录:
|
||||
- 已执行 PHP 语法检查,相关 AI 服务文件均通过。
|
||||
- 已查询测试库 `la_ai_config`,确认 `openai_%` 配置已写入且密钥只做脱敏检查。
|
||||
|
||||
### 42. 私聊语音输入与 Docker Whisper 转文字
|
||||
|
||||
- 状态:已完成 - 时间:2026-06-11
|
||||
|
||||
完成内容:
|
||||
- 私聊聊天室底部新增语音输入入口,App 端点击麦克风后可按住录音、松开发起识别;识别结果只填入文字输入框,由用户确认后再发送为普通文字消息。
|
||||
- H5 端保留麦克风入口并降级提示“请在App中使用语音输入”,不尝试调用浏览器录音能力。
|
||||
- 新增前台登录接口 `/api/chat/voiceToText`,接收单个音频文件并转发到本地 Docker Whisper ASR 服务,返回 `text` 与 `duration_ms`;支持开关、超时、Token、大小限制等 `whisper_asr_%` 配置。
|
||||
- 新增 Docker Whisper ASR 服务目录,基于 FastAPI + `faster-whisper` 提供 `/health` 与 `/v1/transcribe`,默认仅绑定 `127.0.0.1:8791`,模型缓存使用 Docker volume。
|
||||
- 关系文案统一优化为“对方还未添加你为好友”,并同步前端兜底展示。
|
||||
- App 打包配置补充 Android 麦克风权限与 iOS 麦克风用途说明。
|
||||
- 私聊聊天室底部输入栏补充对齐优化,麦克风、图片、输入框和发送按钮统一按同一中线排布,避免固定底栏控件高低错位。
|
||||
- 私聊聊天室输入框改为固定高度,长文本在输入框内部滚动,避免内容继续撑开底部固定输入区。
|
||||
|
||||
涉及模块:
|
||||
- `server/app/api/controller/ChatController.php`
|
||||
- `server/app/common/service/chat/WhisperAsrService.php`
|
||||
- `server/app/common/service/chat/PrivateChatService.php`
|
||||
- `server/app/adminapi/lists/ai/KbConfigLists.php`
|
||||
- `server/extend/whisper-asr`
|
||||
- `uniapp/src/api/chat.ts`
|
||||
- `uniapp/src/pages/private_chat/room.vue`
|
||||
- `uniapp/src/pages/private_chat/list.vue`
|
||||
- `uniapp/src/manifest.json`
|
||||
- `docs/sql/insert_whisper_asr_config.sql`
|
||||
- `qa/backend/test_whisper_asr_service.php`
|
||||
|
||||
验证记录:
|
||||
- 已执行 `php -l server/app/api/controller/ChatController.php`,语法检查通过。
|
||||
- 已执行 `php -l server/app/common/service/chat/PrivateChatService.php`,语法检查通过。
|
||||
- 已执行 `php -l server/app/common/service/chat/WhisperAsrService.php`,语法检查通过。
|
||||
- 已执行 `php -l server/app/adminapi/lists/ai/KbConfigLists.php`,语法检查通过。
|
||||
- 已执行 `php -l qa/backend/test_whisper_asr_service.php`,语法检查通过。
|
||||
- 已执行 `php qa/backend/test_whisper_asr_service.php`,回归测试通过。
|
||||
- 已执行 `C:\Python311\python.exe -m py_compile server/extend/whisper-asr/main.py`,Python 语法检查通过。
|
||||
- 已在 `server/.env` 指向的 `sbnews` 库重复执行 `docs/sql/insert_whisper_asr_config.sql`,确认 `whisper_asr_%` 5 个配置项均已写入且 SQL 可重复执行。
|
||||
- 已执行 `npm run build:h5`,H5 构建通过并复制到 `server/public/mobile`。
|
||||
- 当前本机未安装 Docker CLI,`docker --version` 与 `docker compose config` 无法执行;需在服务器 Docker 环境执行 `server/extend/whisper-asr` 下的 `docker compose up -d --build` 后再验证 `/health` 与 `/v1/transcribe`。
|
||||
|
||||
### 41. Docker 化爬虫调度与任务日志管理
|
||||
|
||||
- 状态:已完成 - 时间:2026-06-11
|
||||
|
||||
完成内容:
|
||||
- 新增懂球帝爬虫 Docker 运行方案,`docker/docker-compose.crawler.yml` 构建并启动独立 `sport-era-crawler` 容器,容器内通过 cron 调度 Python crawler。
|
||||
- 新增 `server/public/dongqiudi-crawler/config/crawler_tasks.yaml`,迁移当前启用的 crawler 任务清单,包括赛程、实时详情、比赛收尾、资讯、文章补全、彩票开奖、世界杯和错误报告等动作。
|
||||
- 新增 `scripts/docker_task_runner.py`,负责动作级文件锁、执行超时、子进程输出采集、运行中/成功/失败/跳过状态写入 `la_crawler_task_log`。
|
||||
- `src/core/config.py` 支持 `DQD_DB_*`、`DQD_REDIS_*`、`DQD_LOG_*` 环境变量覆盖,Docker 镜像不需要写死数据库和 Redis 密钥。
|
||||
- 新增管理端只读菜单“爬虫任务日志”,接口为 `/adminapi/crawler.taskLog/lists` 与 `/adminapi/crawler.taskLog/detail`,支持按任务、动作、状态、来源筛选并查看输出详情。
|
||||
- 旧 PHP `crontab` 与手动执行入口对 `crawler`、`truth_social`、`fifa_worldcup_news` 这类 Python crawler 命令不再启动本机 Python,统一提示已迁移到 Docker 容器调度,避免 Docker 与 PHP 双跑。
|
||||
- 新增幂等 SQL `docs/sql/create_crawler_task_log.sql`:创建 `la_crawler_task_log`、注册菜单权限,并在 Docker 验证上线后停用旧 `la_dev_crontab` 中的 Python crawler 任务。
|
||||
|
||||
涉及模块:
|
||||
- `server/public/dongqiudi-crawler`
|
||||
- `server/app/adminapi/controller/crawler/TaskLogController.php`
|
||||
- `server/app/adminapi/lists/crawler/TaskLogLists.php`
|
||||
- `server/app/common/model/CrawlerTaskLog.php`
|
||||
- `admin/src/views/crawler/task_log/index.vue`
|
||||
- `docs/sql/create_crawler_task_log.sql`
|
||||
|
||||
验证记录:
|
||||
- 已新增 Python 单元测试覆盖配置环境变量覆盖、cron 渲染、成功/失败/超时/重复任务跳过。
|
||||
- 已在测试服执行 `docs/sql/create_crawler_task_log.sql`,确认 `la_crawler_task_log`、菜单权限写入成功,并将旧 `la_dev_crontab` 中 active Python crawler 任务停用。
|
||||
- 已在测试服安装 Docker Compose v2,并通过单服务 `crawler` 启动 `sport-era-crawler`;容器只运行 Python crawler 与 cron,MySQL、Redis、Nginx 均继续使用宿主机服务。
|
||||
- 已确认 `DQD_DB_HOST/DQD_REDIS_HOST` 指向 `host.docker.internal`,容器内 `scrapling`、`browserforge` 依赖可正常导入。
|
||||
- 已确认 `nba_match`、`live_detail`、`match_finish`、`article_content_fetch` 等任务持续写入 `la_crawler_task_log` 成功日志,旧 `la_dev_crontab_log` 不再新增 Python crawler 日志。
|
||||
- 已复测 `/api/match/detail?id=3567442`,返回纽约尼克斯 107-106 圣安东尼奥马刺,状态为已结束。
|
||||
|
||||
### 40. 后端部署脚本目录权限兼容修复
|
||||
|
||||
- 状态:已完成 - 时间:2026-06-11
|
||||
|
||||
完成内容:
|
||||
- 排查 `scripts/deploy-server.ps1` 全量部署测试服时报 `tar: Cannot change mode ... Operation not permitted`,确认 SSH 用户 `ubuntu` 仅通过 `www` 组拥有目标目录写权限,并不是目录 owner,GNU tar 覆盖解包目录项时会尝试 `chmod` 已有目录导致失败。
|
||||
- 远端安装 payload 改为优先使用 `rsync -r --links --no-perms --no-owner --no-group`,不保留 owner/group/perms;远端无 rsync 时回退为 `find + mkdir/cp/ln` 逐文件复制,避免对已有目录执行 chmod。
|
||||
- 修复通过 `ssh bash -s` 下发远端 Bash 文本时可能写入 UTF-8 BOM 的问题,改为用 `UTF8 No BOM` 字节流写入 stdin,避免 `set -euo pipefail` 失效导致部署“假成功”。
|
||||
- 保留当前全量部署包含整个 `public` 目录的变更,解决包含更多已有目录后触发的部署失败。
|
||||
|
||||
涉及模块:
|
||||
- `scripts/deploy-server.ps1`
|
||||
|
||||
### 39. AI 分析 Responses 非 JSON 返回防护
|
||||
|
||||
- 状态:已完成 - 时间:2026-06-11
|
||||
|
||||
完成内容:
|
||||
- 修复 `/api/community/aiAnalysis` 在 GPT 中转 Responses API 返回空响应、HTML 或其他非 JSON 内容时,`DeepSeekClient::extractResponsesContent()` 因收到 `null` 触发 TypeError,导致前台显示“AI分析异常”的问题。
|
||||
- `DeepSeekClient` 现在会先校验 `json_decode()` 结果是否为数组;非数组响应统一返回 `OpenAI(GPT中转) 返回异常: 响应不是有效JSON/响应JSON结构异常`,不再抛出 PHP fatal。
|
||||
- `extractResponsesContent()` 增加 `null` 兜底,避免后续调用方再次把异常响应升级成类型错误。
|
||||
- 新增 QA 回归脚本,覆盖 Responses 返回体解析遇到 `null` 的场景。
|
||||
|
||||
涉及模块:
|
||||
- `server/app/common/service/ai/DeepSeekClient.php`
|
||||
- `qa/backend/test_deepseek_client_invalid_response.php`
|
||||
|
||||
验证记录:
|
||||
- 已执行 `php -l server/app/common/service/ai/DeepSeekClient.php`,语法检查通过。
|
||||
- 已执行 `php -l qa/backend/test_deepseek_client_invalid_response.php`,语法检查通过。
|
||||
- 已执行 `php qa/backend/test_deepseek_client_invalid_response.php`,回归测试通过。
|
||||
- 使用测试账号请求测试服 `/api/community/aiAnalysis?post_id=5374&force=1` 时,测试服仍返回旧版 `extractResponsesContent(array $data)` 堆栈,说明测试服运行文件尚未同步或 OPcache 尚未刷新;待服务器同步最新 `DeepSeekClient.php` 后需复测。
|
||||
|
||||
### 38. NBA 实时比分爬虫与定时任务恢复
|
||||
|
||||
- 状态:已完成 - 时间:2026-06-11
|
||||
|
||||
完成内容:
|
||||
- 排查 `/pages/match_detail/match_detail?id=3567442` NBA 比赛比分不更新,确认前端详情页直接读取 `/api/match/detail` 的 `la_match` 数据,根因在测试服爬虫定时任务未持续写入实时比分。
|
||||
- 修复懂球帝爬虫运行保护:`main.py` 新增动作级超时配置、跨进程动作锁、`writer.connect()` 连接超时、执行超时失败落日志,并将告警管理改为懒加载,避免导入阶段异常导致日志长期停留 `status=0`。
|
||||
- 修复 ThinkPHP 定时调度保护:`Crontab` 启动 crawler 前会按动作超时标记陈旧运行日志,并跳过超时时间内的重复 crawler 启动,避免 `nba_match` / `live_detail` / `match_finish` 堆积。
|
||||
- 补齐 `crawler` 命令白名单,允许 `match_finish` 与 `live_detail` 通过统一 `php think crontab` 调度入口执行。
|
||||
- 测试服重建并切换 `public/dongqiudi-crawler/venv`,旧环境备份为 `venv.bak-20260611041713`,修复 `aiohttp.http_writer.HttpVersion` 与 `pip._vendor.rich.protocol.is_renderable` 导入异常。
|
||||
- 已修复目标比赛 `id=3567442 / match_id=54467991` 数据,接口返回纽约尼克斯 107-106 圣安东尼奥马刺,状态为已结束。
|
||||
|
||||
涉及模块:
|
||||
- `server/public/dongqiudi-crawler/main.py`
|
||||
- `server/public/dongqiudi-crawler/tests/test_runtime_guard.py`
|
||||
- `server/app/common/command/Crontab.php`
|
||||
- `server/app/common/command/CrawlerCommand.php`
|
||||
- `la_match`
|
||||
- `la_dev_crontab_log`
|
||||
|
||||
验证记录:
|
||||
- 本地已覆盖爬虫动作锁与超时配置单元测试。
|
||||
- 测试服 `main.py test`、`main.py nba_match`、`main.py live_detail` 均可正常完成。
|
||||
- 测试服最近 `match_finish`、`nba_match`、`live_detail` 定时日志已恢复成功状态,相关任务当前无 `status=0` 遗留运行日志。
|
||||
- `/api/match/detail?id=3567442` 已返回 `status=2`、`home_score=107`、`away_score=106`。
|
||||
|
||||
### 37. 社区列表取消请求误报修复
|
||||
|
||||
- 状态:已完成 - 时间:2026-06-11
|
||||
|
||||
完成内容:
|
||||
- 复测测试服 `/api/community/postLists?page_no=1&page_size=15`,接口当前返回 `code=1`、本页 15 条、总数 5058,不是后端空响应。
|
||||
- 排查社区列表页首屏生命周期与请求取消器交互:页面初始 `needRefresh=true` 时可能触发重复 `/community/postLists`,前一个请求被 `abort` 后网络面板显示无响应,页面 catch 又统一提示“加载失败,请重试”。
|
||||
- `/packages_community/pages/index` 与 `/pages/empty` 初始刷新标记改为 `false`,首屏仅由 `onMounted` 拉取;新增请求序号保护,旧请求返回或取消时不覆盖最新列表状态。
|
||||
- 两个页面对 `request:fail abort` 不再展示加载失败 toast,避免用户把主动取消的旧请求误判为接口失败。
|
||||
- 同步补齐 `/packages_community/pages/index` 模板引用的分享弹窗状态与 `handleShare`,避免运行期未定义变量告警。
|
||||
|
||||
涉及模块:
|
||||
- `uniapp/src/packages_community/pages/index.vue`
|
||||
- `uniapp/src/pages/empty/empty.vue`
|
||||
|
||||
验证记录:
|
||||
- 已执行 `npm run build:h5`,H5 构建通过并复制到 `server/public/mobile`。
|
||||
- 已复测测试服 `/api/community/postLists?page_no=1&page_size=15` 返回 `code=1`、`lists=15`、`count=5058`。
|
||||
|
||||
### 36. 用户主页底部间隔优化
|
||||
|
||||
- 状态:已完成 - 时间:2026-06-11
|
||||
@@ -33,7 +216,7 @@
|
||||
- “好友”复用社区关注关系 `la_community_follow`,帖子作者区、他人主页、我的关注/粉丝列表均新增“加好友/已好友”和“私聊”入口,不新增好友申请/同意流程。
|
||||
- 新增前台私聊接口 `/api/chat/sessions`、`/api/chat/open`、`/api/chat/messages`、`/api/chat/send`,登录后可查看会话、打开会话、轮询消息和发送文字/图片消息。
|
||||
- 新增私聊数据表初始化 SQL:`docs/sql/create_private_chat_tables.sql`,包含 `la_private_chat_session` 与 `la_private_chat_message`,SQL 使用 `CREATE TABLE IF NOT EXISTS` 保持幂等。
|
||||
- 私聊会话和消息返回关系状态 `is_followed_by_me`、`is_following_me`、`is_mutual`、`relationship_text`;未互关时聊天页顶部和首屏提示展示“不是好友”。
|
||||
- 私聊会话和消息返回关系状态 `is_followed_by_me`、`is_following_me`、`is_mutual`、`relationship_text`;未互关时聊天页顶部和首屏提示展示“对方还未添加你为好友”。
|
||||
- uni-app 新增 `src/api/chat.ts`、`/pages/private_chat/list` 会话列表、`/pages/private_chat/room` 聊天室,聊天室每 3 秒通过 `after_id` 轮询新消息,页面隐藏/卸载时停止轮询。
|
||||
- 个人中心新增“私聊消息”入口,并展示 `chat_unread_count` 未读数;`/api/community/userStats` 同步返回私聊未读总数。
|
||||
|
||||
@@ -56,6 +239,7 @@
|
||||
验证记录:
|
||||
- 已执行新增/修改 PHP 文件 `php -l`,语法检查通过。
|
||||
- 已执行 `uniapp` 的 `npm run build:h5`,H5 构建通过并复制到 `server/public/mobile`。
|
||||
- 已在 `server/.env` 指向的 `sbnews` 库重复执行 `docs/sql/create_private_chat_tables.sql`,确认 `la_private_chat_session`、`la_private_chat_message` 均已存在且 SQL 可重复执行。
|
||||
- `qa/backend/test_private_chat_api.py` 已确认可由 `C:\Python311\python.exe` 启动;当前环境缺少 `PRIVATE_CHAT_TOKEN_A`、`PRIVATE_CHAT_TOKEN_B`、`PRIVATE_CHAT_TARGET_USER_ID`,未进入真实接口请求阶段。
|
||||
|
||||
### 34. AI 助手等待回复读秒
|
||||
|
||||
Reference in New Issue
Block a user