From 64f09e2e530a7cb57cd2391ae6b8f56aa5cd0622 Mon Sep 17 00:00:00 2001 From: hajimi Date: Thu, 28 May 2026 18:28:09 +0000 Subject: [PATCH] =?UTF-8?q?2026=E5=B9=B45=E6=9C=8829=E6=97=A5=2002:28?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + .mcp.json | 8 + _tmp_worldcup_seed.sql | 43 ++ _tmp_worldcup_seed2.sql | 29 ++ docs/sql/fix_49baodian_image_host.sql | 27 ++ docs/sql/fix_49baodian_split_tags.sql | 55 +++ ...ert_crontab_worldcup_article_translate.sql | 7 + docs/sql/seed_worldcup_community_posts.sql | 43 ++ server | 2 +- uniapp | 2 +- 业务进度管理.md | 436 +++++++----------- 设计稿映射.md | 1 + 12 files changed, 375 insertions(+), 279 deletions(-) create mode 100644 .mcp.json create mode 100644 _tmp_worldcup_seed.sql create mode 100644 _tmp_worldcup_seed2.sql create mode 100644 docs/sql/fix_49baodian_image_host.sql create mode 100644 docs/sql/fix_49baodian_split_tags.sql create mode 100644 docs/sql/insert_crontab_worldcup_article_translate.sql create mode 100644 docs/sql/seed_worldcup_community_posts.sql diff --git a/.gitignore b/.gitignore index 7b867a5..953cfe0 100644 --- a/.gitignore +++ b/.gitignore @@ -24,5 +24,6 @@ bin-release/ /python/workspace/ /release-*.zip /tmp_* +/.code-graph/ **/.hbuilderx/ **/unpackage/ diff --git a/.mcp.json b/.mcp.json new file mode 100644 index 0000000..6582c62 --- /dev/null +++ b/.mcp.json @@ -0,0 +1,8 @@ +{ + "mcpServers": { + "codebase-memory": { + "command": "codebase-memory-mcp", + "args": [] + } + } +} diff --git a/_tmp_worldcup_seed.sql b/_tmp_worldcup_seed.sql new file mode 100644 index 0000000..2261a3a --- /dev/null +++ b/_tmp_worldcup_seed.sql @@ -0,0 +1,43 @@ +INSERT INTO `la_community_tag` (`name`, `icon`, `sort`, `post_count`, `is_hot`, `status`, `create_time`) +SELECT '世界杯', '', 90, 0, 1, 1, UNIX_TIMESTAMP() +WHERE NOT EXISTS ( + SELECT 1 FROM `la_community_tag` WHERE `name` = '世界杯' +); + +INSERT INTO `la_community_post` (`user_id`, `content`, `images`, `post_type`, `match_id`, `is_paid`, `price_points`, `free_content_len`, `status`, `create_time`, `update_time`) +SELECT 1, '世界杯开赛氛围越来越浓了,大家觉得本届最大的黑马会是谁?', '[]', 0, 0, 0, 0, 100, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP() +WHERE NOT EXISTS ( + SELECT 1 FROM `la_community_post` WHERE `content` = '世界杯开赛氛围越来越浓了,大家觉得本届最大的黑马会是谁?' +); + +INSERT INTO `la_community_post` (`user_id`, `content`, `images`, `post_type`, `match_id`, `is_paid`, `price_points`, `free_content_len`, `status`, `create_time`, `update_time`) +SELECT 1, '我更看好防守稳一点的球队,世界杯这种大赛还是先稳住再说。', '[]', 0, 0, 0, 0, 100, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP() +WHERE NOT EXISTS ( + SELECT 1 FROM `la_community_post` WHERE `content` = '我更看好防守稳一点的球队,世界杯这种大赛还是先稳住再说。' +); + +INSERT INTO `la_community_post` (`user_id`, `content`, `images`, `post_type`, `match_id`, `is_paid`, `price_points`, `free_content_len`, `status`, `create_time`, `update_time`) +SELECT 1, '这届世界杯的球员状态起伏很大,关键还是看临场调整和替补深度。', '[]', 0, 0, 0, 0, 100, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP() +WHERE NOT EXISTS ( + SELECT 1 FROM `la_community_post` WHERE `content` = '这届世界杯的球员状态起伏很大,关键还是看临场调整和替补深度。' +); + +INSERT INTO `la_community_post_tag` (`post_id`, `tag_id`) +SELECT p.id, t.id +FROM `la_community_post` p +JOIN `la_community_tag` t ON t.`name` = '世界杯' +WHERE p.`content` IN ( + '世界杯开赛氛围越来越浓了,大家觉得本届最大的黑马会是谁?', + '我更看好防守稳一点的球队,世界杯这种大赛还是先稳住再说。', + '这届世界杯的球员状态起伏很大,关键还是看临场调整和替补深度。' +) +ON DUPLICATE KEY UPDATE `post_id` = `post_id`; + +UPDATE `la_community_tag` t +SET `post_count` = ( + SELECT COUNT(*) + FROM `la_community_post_tag` pt + JOIN `la_community_post` p ON p.id = pt.post_id AND p.delete_time IS NULL + WHERE pt.tag_id = t.id +) +WHERE t.`name` = '世界杯'; diff --git a/_tmp_worldcup_seed2.sql b/_tmp_worldcup_seed2.sql new file mode 100644 index 0000000..00568e4 --- /dev/null +++ b/_tmp_worldcup_seed2.sql @@ -0,0 +1,29 @@ +INSERT INTO `la_community_post` (`user_id`, `content`, `images`, `post_type`, `match_id`, `is_paid`, `price_points`, `free_content_len`, `status`, `create_time`, `update_time`) +SELECT 1, '世界杯开赛氛围越来越浓了,大家觉得本届最大的黑马会是谁?', '[]', 0, 0, 0, 0, 100, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP() +WHERE NOT EXISTS ( + SELECT 1 FROM `la_community_post` WHERE `content` = '世界杯开赛氛围越来越浓了,大家觉得本届最大的黑马会是谁?' +); + +INSERT INTO `la_community_post` (`user_id`, `content`, `images`, `post_type`, `match_id`, `is_paid`, `price_points`, `free_content_len`, `status`, `create_time`, `update_time`) +SELECT 1, '我更看好防守稳一点的球队,世界杯这种大赛还是先稳住再说。', '[]', 0, 0, 0, 0, 100, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP() +WHERE NOT EXISTS ( + SELECT 1 FROM `la_community_post` WHERE `content` = '我更看好防守稳一点的球队,世界杯这种大赛还是先稳住再说。' +); + +INSERT INTO `la_community_post` (`user_id`, `content`, `images`, `post_type`, `match_id`, `is_paid`, `price_points`, `free_content_len`, `status`, `create_time`, `update_time`) +SELECT 1, '这届世界杯的球员状态起伏很大,关键还是看临场调整和替补深度。', '[]', 0, 0, 0, 0, 100, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP() +WHERE NOT EXISTS ( + SELECT 1 FROM `la_community_post` WHERE `content` = '这届世界杯的球员状态起伏很大,关键还是看临场调整和替补深度。' +); + +INSERT INTO `la_community_post_tag` (`post_id`, `tag_id`) +SELECT p.id, 17 +FROM `la_community_post` p +WHERE p.`content` IN ( + '世界杯开赛氛围越来越浓了,大家觉得本届最大的黑马会是谁?', + '我更看好防守稳一点的球队,世界杯这种大赛还是先稳住再说。', + '这届世界杯的球员状态起伏很大,关键还是看临场调整和替补深度。' +) +ON DUPLICATE KEY UPDATE `post_id` = `post_id`; + +UPDATE `la_community_tag` SET `post_count` = (SELECT COUNT(*) FROM `la_community_post_tag` WHERE tag_id = 17) WHERE id = 17; diff --git a/docs/sql/fix_49baodian_image_host.sql b/docs/sql/fix_49baodian_image_host.sql new file mode 100644 index 0000000..d0f1d48 --- /dev/null +++ b/docs/sql/fix_49baodian_image_host.sql @@ -0,0 +1,27 @@ +UPDATE `la_community_post` +SET `images` = REPLACE(`images`, 'https://tk2cdn-ali.tprswe.com/', 'https://tk2cdn.ai4funs.com/') +WHERE `origin_id` LIKE '49baodian:%' + AND `images` LIKE '%https://tk2cdn-ali.tprswe.com/%'; + +UPDATE `la_community_post` +SET `images` = REPLACE(`images`, 'https://tk2cdn-hw.thc517.com/', 'https://tk2cdn.ai4funs.com/') +WHERE `origin_id` LIKE '49baodian:%' + AND `images` LIKE '%https://tk2cdn-hw.thc517.com/%'; + +UPDATE `la_community_post` +SET `ext` = REPLACE(`ext`, 'https://tk2cdn-ali.tprswe.com/', 'https://tk2cdn.ai4funs.com/') +WHERE `origin_id` LIKE '49baodian:%' + AND `ext` LIKE '%https://tk2cdn-ali.tprswe.com/%'; + +UPDATE `la_community_post` +SET `ext` = REPLACE(`ext`, 'https://tk2cdn-hw.thc517.com/', 'https://tk2cdn.ai4funs.com/') +WHERE `origin_id` LIKE '49baodian:%' + AND `ext` LIKE '%https://tk2cdn-hw.thc517.com/%'; + +UPDATE `la_community_post_image` +SET `image_url` = REPLACE(`image_url`, 'https://tk2cdn-ali.tprswe.com/', 'https://tk2cdn.ai4funs.com/') +WHERE `image_url` LIKE 'https://tk2cdn-ali.tprswe.com/%'; + +UPDATE `la_community_post_image` +SET `image_url` = REPLACE(`image_url`, 'https://tk2cdn-hw.thc517.com/', 'https://tk2cdn.ai4funs.com/') +WHERE `image_url` LIKE 'https://tk2cdn-hw.thc517.com/%'; diff --git a/docs/sql/fix_49baodian_split_tags.sql b/docs/sql/fix_49baodian_split_tags.sql new file mode 100644 index 0000000..2fc40c7 --- /dev/null +++ b/docs/sql/fix_49baodian_split_tags.sql @@ -0,0 +1,55 @@ +START TRANSACTION; + +INSERT INTO `la_community_tag` (`name`, `icon`, `sort`, `post_count`, `is_hot`, `status`, `create_time`) +SELECT '旧澳六合', '', 11, 0, 0, 1, UNIX_TIMESTAMP() +WHERE NOT EXISTS ( + SELECT 1 FROM `la_community_tag` WHERE `name` = '旧澳六合' +); + +INSERT INTO `la_community_tag` (`name`, `icon`, `sort`, `post_count`, `is_hot`, `status`, `create_time`) +SELECT '新澳六合', '', 12, 0, 0, 1, UNIX_TIMESTAMP() +WHERE NOT EXISTS ( + SELECT 1 FROM `la_community_tag` WHERE `name` = '新澳六合' +); + +INSERT IGNORE INTO `la_community_post_tag` (`post_id`, `tag_id`) +SELECT p.id, t.id +FROM `la_community_post` p +INNER JOIN `la_community_tag` t ON t.`name` = '旧澳六合' +WHERE p.`origin_id` LIKE '49baodian:draw:a6:%' + OR p.`origin_id` LIKE '49baodian:gallery:a6:%' + OR ( + p.`origin_id` LIKE '49baodian:gallery:%' + AND p.`origin_id` NOT LIKE '49baodian:gallery:xa6:%' + AND p.`origin_id` NOT LIKE '49baodian:gallery:a6:%' + ) + OR ( + p.`origin_id` LIKE '49baodian:draw:%' + AND p.`origin_id` NOT LIKE '49baodian:draw:xa6:%' + ); + +INSERT IGNORE INTO `la_community_post_tag` (`post_id`, `tag_id`) +SELECT p.id, t.id +FROM `la_community_post` p +INNER JOIN `la_community_tag` t ON t.`name` = '新澳六合' +WHERE p.`origin_id` LIKE '49baodian:draw:xa6:%' + OR p.`origin_id` LIKE '49baodian:gallery:xa6:%'; + +INSERT IGNORE INTO `la_community_post_tag` (`post_id`, `tag_id`) +SELECT p.id, t.id +FROM `la_community_post` p +INNER JOIN `la_community_tag` t ON t.`name` = '彩票' +WHERE p.`origin_id` LIKE '49baodian:%'; + +UPDATE `la_community_tag` t +SET `post_count` = ( + SELECT COUNT(*) + FROM `la_community_post_tag` pt + INNER JOIN `la_community_post` p ON p.`id` = pt.`post_id` + WHERE pt.`tag_id` = t.`id` + AND p.`status` = 1 + AND p.`delete_time` IS NULL +) +WHERE t.`name` IN ('彩票', '旧澳六合', '新澳六合'); + +COMMIT; diff --git a/docs/sql/insert_crontab_worldcup_article_translate.sql b/docs/sql/insert_crontab_worldcup_article_translate.sql new file mode 100644 index 0000000..08d956d --- /dev/null +++ b/docs/sql/insert_crontab_worldcup_article_translate.sql @@ -0,0 +1,7 @@ +INSERT INTO `la_dev_crontab` (`name`, `type`, `system`, `remark`, `command`, `params`, `status`, `expression`, `create_time`, `update_time`) +SELECT '世界杯英文文章翻译预热', 1, 0, '仅翻译世界杯分类中疑似英文文章,预热翻译缓存', 'worldcup_article_translate', '', 1, '*/10 * * * *', UNIX_TIMESTAMP(), UNIX_TIMESTAMP() +WHERE NOT EXISTS ( + SELECT 1 FROM `la_dev_crontab` + WHERE `command` = 'worldcup_article_translate' + AND `delete_time` IS NULL +); diff --git a/docs/sql/seed_worldcup_community_posts.sql b/docs/sql/seed_worldcup_community_posts.sql new file mode 100644 index 0000000..2261a3a --- /dev/null +++ b/docs/sql/seed_worldcup_community_posts.sql @@ -0,0 +1,43 @@ +INSERT INTO `la_community_tag` (`name`, `icon`, `sort`, `post_count`, `is_hot`, `status`, `create_time`) +SELECT '世界杯', '', 90, 0, 1, 1, UNIX_TIMESTAMP() +WHERE NOT EXISTS ( + SELECT 1 FROM `la_community_tag` WHERE `name` = '世界杯' +); + +INSERT INTO `la_community_post` (`user_id`, `content`, `images`, `post_type`, `match_id`, `is_paid`, `price_points`, `free_content_len`, `status`, `create_time`, `update_time`) +SELECT 1, '世界杯开赛氛围越来越浓了,大家觉得本届最大的黑马会是谁?', '[]', 0, 0, 0, 0, 100, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP() +WHERE NOT EXISTS ( + SELECT 1 FROM `la_community_post` WHERE `content` = '世界杯开赛氛围越来越浓了,大家觉得本届最大的黑马会是谁?' +); + +INSERT INTO `la_community_post` (`user_id`, `content`, `images`, `post_type`, `match_id`, `is_paid`, `price_points`, `free_content_len`, `status`, `create_time`, `update_time`) +SELECT 1, '我更看好防守稳一点的球队,世界杯这种大赛还是先稳住再说。', '[]', 0, 0, 0, 0, 100, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP() +WHERE NOT EXISTS ( + SELECT 1 FROM `la_community_post` WHERE `content` = '我更看好防守稳一点的球队,世界杯这种大赛还是先稳住再说。' +); + +INSERT INTO `la_community_post` (`user_id`, `content`, `images`, `post_type`, `match_id`, `is_paid`, `price_points`, `free_content_len`, `status`, `create_time`, `update_time`) +SELECT 1, '这届世界杯的球员状态起伏很大,关键还是看临场调整和替补深度。', '[]', 0, 0, 0, 0, 100, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP() +WHERE NOT EXISTS ( + SELECT 1 FROM `la_community_post` WHERE `content` = '这届世界杯的球员状态起伏很大,关键还是看临场调整和替补深度。' +); + +INSERT INTO `la_community_post_tag` (`post_id`, `tag_id`) +SELECT p.id, t.id +FROM `la_community_post` p +JOIN `la_community_tag` t ON t.`name` = '世界杯' +WHERE p.`content` IN ( + '世界杯开赛氛围越来越浓了,大家觉得本届最大的黑马会是谁?', + '我更看好防守稳一点的球队,世界杯这种大赛还是先稳住再说。', + '这届世界杯的球员状态起伏很大,关键还是看临场调整和替补深度。' +) +ON DUPLICATE KEY UPDATE `post_id` = `post_id`; + +UPDATE `la_community_tag` t +SET `post_count` = ( + SELECT COUNT(*) + FROM `la_community_post_tag` pt + JOIN `la_community_post` p ON p.id = pt.post_id AND p.delete_time IS NULL + WHERE pt.tag_id = t.id +) +WHERE t.`name` = '世界杯'; diff --git a/server b/server index c636d10..d9193b7 160000 --- a/server +++ b/server @@ -1 +1 @@ -Subproject commit c636d1064363f270c65b23db023ae915aada0e54 +Subproject commit d9193b7e2ddeb42cbe55a9fc1dbc35f2b755afe0 diff --git a/uniapp b/uniapp index d197d3e..c2c0c0c 160000 --- a/uniapp +++ b/uniapp @@ -1 +1 @@ -Subproject commit d197d3e6d8beef1d97d3408315bca7099faa3c86 +Subproject commit c2c0c0c04f47dca06adddc5030a3f16f45fa3dc0 diff --git a/业务进度管理.md b/业务进度管理.md index 831db71..3c9c797 100644 --- a/业务进度管理.md +++ b/业务进度管理.md @@ -1,150 +1,94 @@ -# 业务进度管理 +# 涓氬姟杩涘害绠$悊 -> 本文件用于跟踪 Sport Era 项目所有功能模块的开发状态、待办事项与避坑记录。每完成一个功能或发现一个坑,及时在对应章节追加。 +> 鏈枃浠剁敤浜庤窡韪?Sport Era 椤圭洰鎵€鏈夊姛鑳芥ā鍧楃殑寮€鍙戠姸鎬併€佸緟鍔炰簨椤逛笌閬垮潙璁板綍銆傛瘡瀹屾垚涓€涓姛鑳芥垨鍙戠幇涓€涓潙锛屽強鏃跺湪瀵瑰簲绔犺妭杩藉姞銆? +## 鐩綍 -## 目录 - -- [一、已完成事项](#一已完成事项) -- [二、进行中事项](#二进行中事项) -- [三、待办事项](#三待办事项) -- [四、避坑记录](#四避坑记录) +- [涓€銆佸凡瀹屾垚浜嬮」](#涓€宸插畬鎴愪簨椤? +- [浜屻€佽繘琛屼腑浜嬮」](#浜岃繘琛屼腑浜嬮」) +- [涓夈€佸緟鍔炰簨椤筣(#涓夊緟鍔炰簨椤? +- [鍥涖€侀伩鍧戣褰昡(#鍥涢伩鍧戣褰? --- -## 一、已完成事项 +## 涓€銆佸凡瀹屾垚浜嬮」 -### 1. 项目基础文档与协作协议 - -- 状态:已完成 -- 时间:2026-05-07 - -完成内容: - -- 创建根目录 `AGENTS.md`,记录项目技术栈、子模块分工、数据库基准与协作规范。 -- 创建 `server/AGENTS.md`、`admin/AGENTS.md`、`uniapp/AGENTS.md`、`pc/AGENTS.md`、`qa/AGENTS.md`。 -- 创建 `业务进度管理.md` 和 `设计稿映射.md`,作为后续进度与设计稿映射维护入口。 - -涉及模块: +### 1. 椤圭洰鍩虹鏂囨。涓庡崗浣滃崗璁? +- 鐘舵€侊細宸插畬鎴?- 鏃堕棿锛?026-05-07 +瀹屾垚鍐呭锛? +- 鍒涘缓鏍圭洰褰?`AGENTS.md`锛岃褰曢」鐩妧鏈爤銆佸瓙妯″潡鍒嗗伐銆佹暟鎹簱鍩哄噯涓庡崗浣滆鑼冦€?- 鍒涘缓 `server/AGENTS.md`銆乣admin/AGENTS.md`銆乣uniapp/AGENTS.md`銆乣pc/AGENTS.md`銆乣qa/AGENTS.md`銆?- 鍒涘缓 `涓氬姟杩涘害绠$悊.md` 鍜?`璁捐绋挎槧灏?md`锛屼綔涓哄悗缁繘搴︿笌璁捐绋挎槧灏勭淮鎶ゅ叆鍙c€? +娑夊強妯″潡锛? - `AGENTS.md` - `server/AGENTS.md` - `admin/AGENTS.md` - `uniapp/AGENTS.md` - `pc/AGENTS.md` - `qa/AGENTS.md` -- `业务进度管理.md` -- `设计稿映射.md` +- `涓氬姟杩涘害绠$悊.md` +- `璁捐绋挎槧灏?md` -### 2. 新闻爬虫文章入库去重 +### 2. 鏂伴椈鐖櫕鏂囩珷鍏ュ簱鍘婚噸 -- 状态:已完成 -- 时间:2026-05-09 - -完成内容: - -- 在懂球帝爬虫公共入库方法 `upsert_articles` 中增加同分类标题去重,阻止不同 `article_id` 的同标题文章重复写入。 -- 新闻和视频采集任务按已知频道传入对应文章分类 `cid`,减少新增 `cid=0` 数据。 -- 对已存在 `article_id` 且旧分类为 `cid=0` 的数据,后续带正确分类再次入库时可迁移到正确分类。 - -涉及模块: +- 鐘舵€侊細宸插畬鎴?- 鏃堕棿锛?026-05-09 +瀹屾垚鍐呭锛? +- 鍦ㄦ噦鐞冨笣鐖櫕鍏叡鍏ュ簱鏂规硶 `upsert_articles` 涓鍔犲悓鍒嗙被鏍囬鍘婚噸锛岄樆姝笉鍚?`article_id` 鐨勫悓鏍囬鏂囩珷閲嶅鍐欏叆銆?- 鏂伴椈鍜岃棰戦噰闆嗕换鍔℃寜宸茬煡棰戦亾浼犲叆瀵瑰簲鏂囩珷鍒嗙被 `cid`锛屽噺灏戞柊澧?`cid=0` 鏁版嵁銆?- 瀵瑰凡瀛樺湪 `article_id` 涓旀棫鍒嗙被涓?`cid=0` 鐨勬暟鎹紝鍚庣画甯︽纭垎绫诲啀娆″叆搴撴椂鍙縼绉诲埌姝g‘鍒嗙被銆? +娑夊強妯″潡锛? - `server/public/dongqiudi-crawler/src/storage/database.py` - `server/public/dongqiudi-crawler/src/scheduler/task_runner.py` -### 3. Truth Social 定时任务入口整理 +### 3. Truth Social 瀹氭椂浠诲姟鍏ュ彛鏁寸悊 -- 状态:已完成 -- 时间:2026-05-09 - -完成内容: - -- 后台定时任务 `truth_social` 改为执行 `public/dongqiudi-crawler/main.py truth_social`。 -- 移除旧的 `server/public/truth-social` 独立采集目录,避免继续维护两套特朗普消息采集代码。 - -涉及模块: +- 鐘舵€侊細宸插畬鎴?- 鏃堕棿锛?026-05-09 +瀹屾垚鍐呭锛? +- 鍚庡彴瀹氭椂浠诲姟 `truth_social` 鏀逛负鎵ц `public/dongqiudi-crawler/main.py truth_social`銆?- 绉婚櫎鏃х殑 `server/public/truth-social` 鐙珛閲囬泦鐩綍锛岄伩鍏嶇户缁淮鎶や袱濂楃壒鏈楁櫘娑堟伅閲囬泦浠g爜銆? +娑夊強妯″潡锛? - `server/app/adminapi/logic/crontab/CrontabLogic.php` - `server/public/dongqiudi-crawler/truth_social.py` -### 4. 49宝典彩票社区爬虫接入 +### 4. 49瀹濆吀褰╃エ绀惧尯鐖櫕鎺ュ叆 -- 状态:已完成 -- 时间:2026-05-11 - -完成内容: - -- 新增 `lottery_community` 爬虫入口,拉取 49宝典首页 Astro props 数据并解析开奖与图库资料。 -- 自动创建或复用社区标签 `彩票`,自动创建或复用发布用户 `lottery_publisher`。 -- 按 `origin_id` 对彩票社区帖子做幂等新增/更新,并同步帖子图片和标签关联。 -- 接入 ThinkPHP `crawler` 命令白名单和 Python 主入口命令映射。 -- 提供幂等 SQL 注册定时任务 `crawler lottery_community`。 -- 修复 49宝典响应中文解码和图库图片域名规则,`prod/` 图片资源改用可直接访问的 `tk2cdn-ali.tprswe.com`。 - -涉及模块: +- 鐘舵€侊細宸插畬鎴?- 鏃堕棿锛?026-05-11 +瀹屾垚鍐呭锛? +- 鏂板 `lottery_community` 鐖櫕鍏ュ彛锛屾媺鍙?49瀹濆吀棣栭〉 Astro props 鏁版嵁骞惰В鏋愬紑濂栦笌鍥惧簱璧勬枡銆?- 鑷姩鍒涘缓鎴栧鐢ㄧぞ鍖烘爣绛?`褰╃エ`锛岃嚜鍔ㄥ垱寤烘垨澶嶇敤鍙戝竷鐢ㄦ埛 `lottery_publisher`銆?- 鎸?`origin_id` 瀵瑰僵绁ㄧぞ鍖哄笘瀛愬仛骞傜瓑鏂板/鏇存柊锛屽苟鍚屾甯栧瓙鍥剧墖鍜屾爣绛惧叧鑱斻€?- 鎺ュ叆 ThinkPHP `crawler` 鍛戒护鐧藉悕鍗曞拰 Python 涓诲叆鍙e懡浠ゆ槧灏勩€?- 鎻愪緵骞傜瓑 SQL 娉ㄥ唽瀹氭椂浠诲姟 `crawler lottery_community`銆?- 淇 49瀹濆吀鍝嶅簲涓枃瑙g爜鍜屽浘搴撳浘鐗囧煙鍚嶈鍒欙紝`prod/` 鍥剧墖璧勬簮鏀圭敤鍙洿鎺ヨ闂殑 `tk2cdn-ali.tprswe.com`銆? +娑夊強妯″潡锛? - `server/public/dongqiudi-crawler/lottery_community.py` - `server/public/dongqiudi-crawler/main.py` - `server/app/common/command/CrawlerCommand.php` - `server/public/dongqiudi-crawler/insert_crontab_lottery_community.sql` -### 5. 项目级文档归档到根目录 - -- 状态:已完成 -- 时间:2026-05-14 - -完成内容: - -- 将项目级文档 `01-产品方案文档.md`、`02-实现流程文档.md`、`爬虫任务脚本文档.md` 从 `docs/` 目录移动到项目根目录统一维护。 -- 在根目录 `AGENTS.md` 中补充项目级文档存放规则,明确协作类与业务类总文档默认放根目录。 -- 同步修正文档引用路径,避免后续继续引用旧的 `docs/` 路径。 - -涉及模块: +### 5. 椤圭洰绾ф枃妗e綊妗e埌鏍圭洰褰? +- 鐘舵€侊細宸插畬鎴?- 鏃堕棿锛?026-05-14 +瀹屾垚鍐呭锛? +- 灏嗛」鐩骇鏂囨。 `01-浜у搧鏂规鏂囨。.md`銆乣02-瀹炵幇娴佺▼鏂囨。.md`銆乣鐖櫕浠诲姟鑴氭湰鏂囨。.md` 浠?`docs/` 鐩綍绉诲姩鍒伴」鐩牴鐩綍缁熶竴缁存姢銆?- 鍦ㄦ牴鐩綍 `AGENTS.md` 涓ˉ鍏呴」鐩骇鏂囨。瀛樻斁瑙勫垯锛屾槑纭崗浣滅被涓庝笟鍔$被鎬绘枃妗i粯璁ゆ斁鏍圭洰褰曘€?- 鍚屾淇鏂囨。寮曠敤璺緞锛岄伩鍏嶅悗缁户缁紩鐢ㄦ棫鐨?`docs/` 璺緞銆? +娑夊強妯″潡锛? - `AGENTS.md` -- `业务进度管理.md` -- `01-产品方案文档.md` -- `02-实现流程文档.md` -- `爬虫任务脚本文档.md` +- `涓氬姟杩涘害绠$悊.md` +- `01-浜у搧鏂规鏂囨。.md` +- `02-瀹炵幇娴佺▼鏂囨。.md` +- `鐖櫕浠诲姟鑴氭湰鏂囨。.md` -### 6. FIFA 世界杯资讯定时采集接入 - -- 状态:已完成 -- 时间:2026-05-15 - -完成内容: - -- 新增 FIFA 世界杯资讯爬虫入口 `fifa_worldcup_news`,通过 FIFA CXM API 拉取世界杯页面新闻区块数据。 -- 增加世界杯文章分类幂等创建/复用逻辑,默认分类名为 `世界杯`,并自动启用显示。 -- 新增定时任务注册 SQL `insert_crontab_fifa_worldcup_news.sql`,采用 `crawler fifa_worldcup_news` 动作并按 10 分钟执行。 -- 将后端定时任务调度链路扩展到 `fifa_worldcup_news`,沿用现有 crawler 异步执行模式。 -- 已验证 FIFA API 可返回 20 条世界杯资讯;本地完整写库验证因 crawler 当前数据库配置指向 `127.0.0.1` 且 MySQL 拒绝连接,需在服务器/可用数据库环境执行。 - -涉及模块: +### 6. FIFA 涓栫晫鏉祫璁畾鏃堕噰闆嗘帴鍏? +- 鐘舵€侊細宸插畬鎴?- 鏃堕棿锛?026-05-15 +瀹屾垚鍐呭锛? +- 鏂板 FIFA 涓栫晫鏉祫璁埇铏叆鍙?`fifa_worldcup_news`锛岄€氳繃 FIFA CXM API 鎷夊彇涓栫晫鏉〉闈㈡柊闂诲尯鍧楁暟鎹€?- 澧炲姞涓栫晫鏉枃绔犲垎绫诲箓绛夊垱寤?澶嶇敤閫昏緫锛岄粯璁ゅ垎绫诲悕涓?`涓栫晫鏉痐锛屽苟鑷姩鍚敤鏄剧ず銆?- 鏂板瀹氭椂浠诲姟娉ㄥ唽 SQL `insert_crontab_fifa_worldcup_news.sql`锛岄噰鐢?`crawler fifa_worldcup_news` 鍔ㄤ綔骞舵寜 10 鍒嗛挓鎵ц銆?- 灏嗗悗绔畾鏃朵换鍔¤皟搴﹂摼璺墿灞曞埌 `fifa_worldcup_news`锛屾部鐢ㄧ幇鏈?crawler 寮傛鎵ц妯″紡銆?- 宸查獙璇?FIFA API 鍙繑鍥?20 鏉′笘鐣屾澂璧勮锛涙湰鍦板畬鏁村啓搴撻獙璇佸洜 crawler 褰撳墠鏁版嵁搴撻厤缃寚鍚?`127.0.0.1` 涓?MySQL 鎷掔粷杩炴帴锛岄渶鍦ㄦ湇鍔″櫒/鍙敤鏁版嵁搴撶幆澧冩墽琛屻€? +娑夊強妯″潡锛? - `server/public/dongqiudi-crawler/fifa_worldcup_news.py` - `server/public/dongqiudi-crawler/main.py` - `server/public/dongqiudi-crawler/insert_crontab_fifa_worldcup_news.sql` - `server/app/common/command/CrawlerCommand.php` - `server/app/adminapi/logic/crontab/CrontabLogic.php` -### 7. 懂球帝世界杯专属采集与用户端世界杯中心 - -- 状态:已完成 -- 时间:2026-05-15 - -完成内容: - -- 新增 `dqd_worldcup` 专属采集任务,固定抓取懂球帝 2026 世界杯 `standing / schedule / person_ranking(goals|assists)`。 -- 世界杯赛程写入 `la_match`,统一使用 `league_name=世界杯`、`competition_id=61`、`sport_type=1`,并保留 `round_name` 与 `stage`。 -- 新增世界杯缓存表 `la_worldcup_standing`、`la_worldcup_person_ranking`,保留小组积分榜和球员榜结构。 -- 新增幂等 SQL `insert_crontab_dqd_worldcup.sql`,自动创建并启用足球二级分类“世界杯”,同时注册 `crawler dqd_worldcup` 定时任务。 -- `MatchController` 新增 `worldCupStandings`、`worldCupRankings`、`worldCupSchedule` 3 个前台接口,供用户端世界杯中心使用。 -- 用户端 `pages/match/match` 在“足球 > 世界杯”分类下新增“赛程对阵图”顶部入口卡,并新增 `packages_match/pages/worldcup` 世界杯专属页,提供“对阵图 / 积分榜 / 射手榜 / 助攻榜 / 赛程”5 个 tab。 -- 已在测试库执行 SQL 并手动跑通一次采集,当前写入结果为:`la_match` 104 场、`la_worldcup_standing` 48 条、`la_worldcup_person_ranking` 的 `goals/assists` 暂为空。 -- 已验证测试服 `/api/match/leagues` 和 `/api/match/lists?league_name=世界杯` 可返回世界杯分类与赛程;`worldCupStandings / worldCupRankings / worldCupSchedule` 仍需等待后端自动同步到测试服后再做最终联调。 - -涉及模块: +### 7. 鎳傜悆甯濅笘鐣屾澂涓撳睘閲囬泦涓庣敤鎴风涓栫晫鏉腑蹇? +- 鐘舵€侊細宸插畬鎴?- 鏃堕棿锛?026-05-15 +瀹屾垚鍐呭锛? +- 鏂板 `dqd_worldcup` 涓撳睘閲囬泦浠诲姟锛屽浐瀹氭姄鍙栨噦鐞冨笣 2026 涓栫晫鏉?`standing / schedule / person_ranking(goals|assists)`銆?- 涓栫晫鏉禌绋嬪啓鍏?`la_match`锛岀粺涓€浣跨敤 `league_name=涓栫晫鏉痐銆乣competition_id=61`銆乣sport_type=1`锛屽苟淇濈暀 `round_name` 涓?`stage`銆?- 鏂板涓栫晫鏉紦瀛樿〃 `la_worldcup_standing`銆乣la_worldcup_person_ranking`锛屼繚鐣欏皬缁勭Н鍒嗘鍜岀悆鍛樻缁撴瀯銆?- 鏂板骞傜瓑 SQL `insert_crontab_dqd_worldcup.sql`锛岃嚜鍔ㄥ垱寤哄苟鍚敤瓒崇悆浜岀骇鍒嗙被鈥滀笘鐣屾澂鈥濓紝鍚屾椂娉ㄥ唽 `crawler dqd_worldcup` 瀹氭椂浠诲姟銆?- `MatchController` 鏂板 `worldCupStandings`銆乣worldCupRankings`銆乣worldCupSchedule` 3 涓墠鍙版帴鍙o紝渚涚敤鎴风涓栫晫鏉腑蹇冧娇鐢ㄣ€?- 鐢ㄦ埛绔?`pages/match/match` 鍦ㄢ€滆冻鐞?> 涓栫晫鏉€濆垎绫讳笅鏂板鈥滆禌绋嬪闃靛浘鈥濋《閮ㄥ叆鍙e崱锛屽苟鏂板 `packages_match/pages/worldcup` 涓栫晫鏉笓灞為〉锛屾彁渚涒€滃闃靛浘 / 绉垎姒?/ 灏勬墜姒?/ 鍔╂敾姒?/ 璧涚▼鈥? 涓?tab銆?- 宸插湪娴嬭瘯搴撴墽琛?SQL 骞舵墜鍔ㄨ窇閫氫竴娆¢噰闆嗭紝褰撳墠鍐欏叆缁撴灉涓猴細`la_match` 104 鍦恒€乣la_worldcup_standing` 48 鏉°€乣la_worldcup_person_ranking` 鐨?`goals/assists` 鏆備负绌恒€?- 宸查獙璇佹祴璇曟湇 `/api/match/leagues` 鍜?`/api/match/lists?league_name=涓栫晫鏉痐 鍙繑鍥炰笘鐣屾澂鍒嗙被涓庤禌绋嬶紱`worldCupStandings / worldCupRankings / worldCupSchedule` 浠嶉渶绛夊緟鍚庣鑷姩鍚屾鍒版祴璇曟湇鍚庡啀鍋氭渶缁堣仈璋冦€? +娑夊強妯″潡锛? - `server/public/dongqiudi-crawler/dqd_worldcup.py` - `server/public/dongqiudi-crawler/main.py` - `server/public/dongqiudi-crawler/insert_crontab_dqd_worldcup.sql` @@ -157,84 +101,45 @@ - `uniapp/src/packages_match/pages/worldcup.vue` - `uniapp/src/pages.json` -### 8. 赛事中心顶部世界杯专题入口优化 - -- 状态:已完成 -- 时间:2026-05-20 - -完成内容: - -- 参考世界杯专题设计稿,将用户端 `pages/match/match` 的世界杯入口从赛事列表区上移到页面头部,放在标题与运动分类之间。 -- 新入口改为蓝色专题卡样式,展示 `2026年国际足联世界杯` 与赛事时间区间,点击继续跳转现有世界杯专属页。 -- 移除原先仅在“足球 > 世界杯”分类下显示的列表内入口,避免同页重复出现两个世界杯入口。 -- 调整赛事页列表高度计算逻辑,改为按实际头部高度回算,避免新增专题卡后遮挡分类条或压缩列表区域。 -- 已完成 `npm run build:h5` 构建,并通过浏览器在本地 H5 验证专题入口已出现在赛事页顶部。 - -涉及模块: +### 8. 璧涗簨涓績椤堕儴涓栫晫鏉笓棰樺叆鍙d紭鍖? +- 鐘舵€侊細宸插畬鎴?- 鏃堕棿锛?026-05-20 +瀹屾垚鍐呭锛? +- 鍙傝€冧笘鐣屾澂涓撻璁捐绋匡紝灏嗙敤鎴风 `pages/match/match` 鐨勪笘鐣屾澂鍏ュ彛浠庤禌浜嬪垪琛ㄥ尯涓婄Щ鍒伴〉闈㈠ご閮紝鏀惧湪鏍囬涓庤繍鍔ㄥ垎绫讳箣闂淬€?- 鏂板叆鍙f敼涓鸿摑鑹蹭笓棰樺崱鏍峰紡锛屽睍绀?`2026骞村浗闄呰冻鑱斾笘鐣屾澂` 涓庤禌浜嬫椂闂村尯闂达紝鐐瑰嚮缁х画璺宠浆鐜版湁涓栫晫鏉笓灞為〉銆?- 绉婚櫎鍘熷厛浠呭湪鈥滆冻鐞?> 涓栫晫鏉€濆垎绫讳笅鏄剧ず鐨勫垪琛ㄥ唴鍏ュ彛锛岄伩鍏嶅悓椤甸噸澶嶅嚭鐜颁袱涓笘鐣屾澂鍏ュ彛銆?- 璋冩暣璧涗簨椤靛垪琛ㄩ珮搴﹁绠楅€昏緫锛屾敼涓烘寜瀹為檯澶撮儴楂樺害鍥炵畻锛岄伩鍏嶆柊澧炰笓棰樺崱鍚庨伄鎸″垎绫绘潯鎴栧帇缂╁垪琛ㄥ尯鍩熴€?- 宸插畬鎴?`npm run build:h5` 鏋勫缓锛屽苟閫氳繃娴忚鍣ㄥ湪鏈湴 H5 楠岃瘉涓撻鍏ュ彛宸插嚭鐜板湪璧涗簨椤甸《閮ㄣ€? +娑夊強妯″潡锛? - `uniapp/src/pages/match/match.vue` -- `业务进度管理.md` -- `设计稿映射.md` +- `涓氬姟杩涘害绠$悊.md` +- `璁捐绋挎槧灏?md` -### 9. 世界杯专题页排名导航组件化 - -- 状态:已完成 -- 时间:2026-05-20 - -完成内容: - -- 参考世界杯专题页“排名”设计稿,将排名区从 `worldcup.vue` 页面内联结构拆分为独立组件。 -- 新增排名导航组件 `RankingNav.vue`,统一承载 `积分榜 / 射手榜 / 助攻榜` 切换。 -- 新增积分榜组件 `StandingsPanel.vue`,单独负责分组标题、表头与球队积分表格渲染。 -- 新增球员榜组件 `PlayerRankingPanel.vue`,单独负责射手榜与助攻榜列表渲染。 -- 积分榜布局按专题设计稿细化为“球队固定在左、场次/胜平负/进失/积分集中在右”的双区块表格结构,移动端表头与数据列保持对齐。 -- `worldcup.vue` 只保留专题主导航、数据加载与 ranking 组件调度,降低页面耦合,便于后续继续按设计稿细化榜单样式。 -- 已执行 `npm run build:h5` 并通过本地 H5 校验“排名”页可正常展示组件化后的导航与积分榜内容。 - -涉及模块: +### 9. 涓栫晫鏉笓棰橀〉鎺掑悕瀵艰埅缁勪欢鍖? +- 鐘舵€侊細宸插畬鎴?- 鏃堕棿锛?026-05-20 +瀹屾垚鍐呭锛? +- 鍙傝€冧笘鐣屾澂涓撻椤碘€滄帓鍚嶁€濊璁$锛屽皢鎺掑悕鍖轰粠 `worldcup.vue` 椤甸潰鍐呰仈缁撴瀯鎷嗗垎涓虹嫭绔嬬粍浠躲€?- 鏂板鎺掑悕瀵艰埅缁勪欢 `RankingNav.vue`锛岀粺涓€鎵胯浇 `绉垎姒?/ 灏勬墜姒?/ 鍔╂敾姒渀 鍒囨崲銆?- 鏂板绉垎姒滅粍浠?`StandingsPanel.vue`锛屽崟鐙礋璐e垎缁勬爣棰樸€佽〃澶翠笌鐞冮槦绉垎琛ㄦ牸娓叉煋銆?- 鏂板鐞冨憳姒滅粍浠?`PlayerRankingPanel.vue`锛屽崟鐙礋璐e皠鎵嬫涓庡姪鏀绘鍒楄〃娓叉煋銆?- 绉垎姒滃竷灞€鎸変笓棰樿璁$缁嗗寲涓衡€滅悆闃熷浐瀹氬湪宸︺€佸満娆?鑳滃钩璐?杩涘け/绉垎闆嗕腑鍦ㄥ彸鈥濈殑鍙屽尯鍧楄〃鏍肩粨鏋勶紝绉诲姩绔〃澶翠笌鏁版嵁鍒椾繚鎸佸榻愩€?- `worldcup.vue` 鍙繚鐣欎笓棰樹富瀵艰埅銆佹暟鎹姞杞戒笌 ranking 缁勪欢璋冨害锛岄檷浣庨〉闈㈣€﹀悎锛屼究浜庡悗缁户缁寜璁捐绋跨粏鍖栨鍗曟牱寮忋€?- 宸叉墽琛?`npm run build:h5` 骞堕€氳繃鏈湴 H5 鏍¢獙鈥滄帓鍚嶁€濋〉鍙甯稿睍绀虹粍浠跺寲鍚庣殑瀵艰埅涓庣Н鍒嗘鍐呭銆? +娑夊強妯″潡锛? - `uniapp/src/packages_match/pages/worldcup.vue` - `uniapp/src/packages_match/pages/worldcup/components/ranking/RankingNav.vue` - `uniapp/src/packages_match/pages/worldcup/components/ranking/StandingsPanel.vue` - `uniapp/src/packages_match/pages/worldcup/components/ranking/PlayerRankingPanel.vue` -- `业务进度管理.md` +- `涓氬姟杩涘害绠$悊.md` -### 10. 世界杯专题页对阵图按真实球队映射 -- 状态:已完成 -- 时间:2026-05-20 +### 10. 涓栫晫鏉笓棰橀〉瀵归樀鍥炬寜鐪熷疄鐞冮槦鏄犲皠 +- 鐘舵€侊細宸插畬鎴?- 鏃堕棿锛?026-05-20 -完成内容: -- 用户端 `packages_match/pages/worldcup` 对阵图页新增基于 `worldCupStandings` 的分组名次索引,将 `A1/A2/.../L4` 直接映射为当前积分榜中的真实球队名称与队徽。 -- `1/16决赛` 中的第三名组合占位符(如 `A3/B3/C3/D3/F3`)改为逐项替换后再拼接展示,避免继续显示字母占位符。 -- 对仍然是“第X场胜者/败者”的后续轮次占位保持原样,不伪造未产生的晋级结果;对无法确定真实队徽的组合占位不再显示默认占位图。 -- 为多球队组合名称增加两行展示样式,避免长文本在专题对阵卡片中被单行截断。 -- 已执行 `uniapp` 构建验证:`npm run build:h5` 通过。 +瀹屾垚鍐呭锛?- 鐢ㄦ埛绔?`packages_match/pages/worldcup` 瀵归樀鍥鹃〉鏂板鍩轰簬 `worldCupStandings` 鐨勫垎缁勫悕娆$储寮曪紝灏?`A1/A2/.../L4` 鐩存帴鏄犲皠涓哄綋鍓嶇Н鍒嗘涓殑鐪熷疄鐞冮槦鍚嶇О涓庨槦寰姐€?- `1/16鍐宠禌` 涓殑绗笁鍚嶇粍鍚堝崰浣嶇锛堝 `A3/B3/C3/D3/F3`锛夋敼涓洪€愰」鏇挎崲鍚庡啀鎷兼帴灞曠ず锛岄伩鍏嶇户缁樉绀哄瓧姣嶅崰浣嶇銆?- 瀵逛粛鐒舵槸鈥滅X鍦鸿儨鑰?璐ヨ€呪€濈殑鍚庣画杞鍗犱綅淇濇寔鍘熸牱锛屼笉浼€犳湭浜х敓鐨勬檵绾х粨鏋滐紱瀵规棤娉曠‘瀹氱湡瀹為槦寰界殑缁勫悎鍗犱綅涓嶅啀鏄剧ず榛樿鍗犱綅鍥俱€?- 涓哄鐞冮槦缁勫悎鍚嶇О澧炲姞涓よ灞曠ず鏍峰紡锛岄伩鍏嶉暱鏂囨湰鍦ㄤ笓棰樺闃靛崱鐗囦腑琚崟琛屾埅鏂€?- 宸叉墽琛?`uniapp` 鏋勫缓楠岃瘉锛歚npm run build:h5` 閫氳繃銆? +娑夊強妯″潡锛?- `uniapp/src/packages_match/pages/worldcup.vue` +- `涓氬姟杩涘害绠$悊.md` -涉及模块: -- `uniapp/src/packages_match/pages/worldcup.vue` -- `业务进度管理.md` +### 11. 鐭俊鍔╂墜鍚屾鐭俊涓庢潵鐢佃褰曞叆搴? +- 鐘舵€侊細宸插畬鎴?- 鏃堕棿锛?026-05-22 -### 11. 短信助手同步短信与来电记录入库 - -- 状态:已完成 -- 时间:2026-05-22 - -完成内容: - -- 扩展 `/api/sms/uploadSms`,同时接收手机端上传的 `smsList` 与 `callList`,统一写入 `la_sms_upload`。 -- 保持短信验证码链路兼容:短信记录仍沿用 `type=1/2`、`status=0/1`;来电记录使用 `type=11/13/15` 区分“已接/未接/拒接”,并使用 `status=2` 表示“不适用”。 -- 登录/绑手机号的短信验证码校验规则调整为:只要 `la_sms_upload` 中存在该手机号的任意上传记录,即视为验证通过,不再要求短信内容与输入验证码完全匹配,也不再限制 7 天内或短信类型。 -- 助手端采集范围收紧为:短信只上传收到的短信,来电只上传打进来的号码,过滤自己发出去的短信和主动拨出的通话记录。 -- 助手端恢复来电真实上传,不再将来电请求按“短信列表为空”视作跳过,并增加助手端请求/响应打印,便于排查实际上传内容。 -- 管理端“系统设置 -> 系统维护 -> 验证码”列表同步支持展示来电记录,新增“记录类型”列,并补充“不适用”状态展示。 -- 新增 SQL 脚本 `docs/sql/alter_la_sms_upload_for_call_records.sql`,用于将 `la_sms_upload.status` 注释扩展为 `0=待验证 1=已使用 2=不适用`。 - -涉及数据库变更: +瀹屾垚鍐呭锛? +- 鎵╁睍 `/api/sms/uploadSms`锛屽悓鏃舵帴鏀舵墜鏈虹涓婁紶鐨?`smsList` 涓?`callList`锛岀粺涓€鍐欏叆 `la_sms_upload`銆?- 淇濇寔鐭俊楠岃瘉鐮侀摼璺吋瀹癸細鐭俊璁板綍浠嶆部鐢?`type=1/2`銆乣status=0/1`锛涙潵鐢佃褰曚娇鐢?`type=11/13/15` 鍖哄垎鈥滃凡鎺?鏈帴/鎷掓帴鈥濓紝骞朵娇鐢?`status=2` 琛ㄧず鈥滀笉閫傜敤鈥濄€?- 鐧诲綍/缁戞墜鏈哄彿鐨勭煭淇¢獙璇佺爜鏍¢獙瑙勫垯璋冩暣涓猴細鍙 `la_sms_upload` 涓瓨鍦ㄨ鎵嬫満鍙风殑浠绘剰涓婁紶璁板綍锛屽嵆瑙嗕负楠岃瘉閫氳繃锛屼笉鍐嶈姹傜煭淇″唴瀹逛笌杈撳叆楠岃瘉鐮佸畬鍏ㄥ尮閰嶏紝涔熶笉鍐嶉檺鍒?7 澶╁唴鎴栫煭淇$被鍨嬨€?- 鍔╂墜绔噰闆嗚寖鍥存敹绱т负锛氱煭淇″彧涓婁紶鏀跺埌鐨勭煭淇★紝鏉ョ數鍙笂浼犳墦杩涙潵鐨勫彿鐮侊紝杩囨护鑷繁鍙戝嚭鍘荤殑鐭俊鍜屼富鍔ㄦ嫧鍑虹殑閫氳瘽璁板綍銆?- 鍔╂墜绔仮澶嶆潵鐢电湡瀹炰笂浼狅紝涓嶅啀灏嗘潵鐢佃姹傛寜鈥滅煭淇″垪琛ㄤ负绌衡€濊浣滆烦杩囷紝骞跺鍔犲姪鎵嬬璇锋眰/鍝嶅簲鎵撳嵃锛屼究浜庢帓鏌ュ疄闄呬笂浼犲唴瀹广€?- 绠$悊绔€滅郴缁熻缃?-> 绯荤粺缁存姢 -> 楠岃瘉鐮佲€濆垪琛ㄥ悓姝ユ敮鎸佸睍绀烘潵鐢佃褰曪紝鏂板鈥滆褰曠被鍨嬧€濆垪锛屽苟琛ュ厖鈥滀笉閫傜敤鈥濈姸鎬佸睍绀恒€?- 鏂板 SQL 鑴氭湰 `docs/sql/alter_la_sms_upload_for_call_records.sql`锛岀敤浜庡皢 `la_sms_upload.status` 娉ㄩ噴鎵╁睍涓?`0=寰呴獙璇?1=宸蹭娇鐢?2=涓嶉€傜敤`銆? +娑夊強鏁版嵁搴撳彉鏇达細 - `la_sms_upload.status` -涉及模块: - +娑夊強妯″潡锛? - `server/app/api/controller/SmsController.php` - `server/app/api/logic/LoginLogic.php` - `server/app/api/logic/UserLogic.php` @@ -243,134 +148,111 @@ - `sport-era-msg/pages/index/index.vue` - `sport-era-msg/pages/logs/logs.vue` - `docs/sql/alter_la_sms_upload_for_call_records.sql` -- `业务进度管理.md` +- `涓氬姟杩涘害绠$悊.md` --- -### 12. 用户页未设密码提示 -- 2026-05-23:`uniapp/src/pages/user/user.vue` 在进入“我的”页面时补充未设置密码提示弹窗;当 `has_password` 为 `0` 时,提示用户尽快修改登录密码,并展示手机号后 6 位作为初始密码说明。 -- 2026-05-23:`server/app/api/validate/LoginAccountValidate.php` 支持空密码用户使用手机号后 6 位直接登录,避免初始化账号被误判为“用户不存在”。 - -### 13. 世界杯页面主导航默认索引 -- 2026-05-23:`uniapp/src/packages_match/pages/worldcup.vue` 的主导航默认索引调整为第 0 项,页面进入时默认停留在首个 tab。 - -### 14. 世界杯专题新闻来源同步首页分类 -- 2026-05-23:`uniapp/src/pages/match/match.vue` 跳转世界杯专题页时携带首页解析到的 `世界杯` 分类 `cid`,`uniapp/src/packages_match/pages/worldcup.vue` 优先使用该 `cid` 拉取新闻,保证专题新闻来源与首页世界杯分类一致。 - -### 15. 新闻资讯 AI 翻译 -- 2026-05-23:`server/app/api/controller/ArticleController.php` 新增 `/article/translate` 翻译接口,`server/app/api/logic/ArticleLogic.php` 复用 `AiService` 生成并缓存文章翻译结果到 `ext`。 -- 2026-05-23:`uniapp/src/pages/news_detail/news_detail.vue` 在新闻详情页新增 AI 翻译入口、加载态与翻译结果展示区,`uniapp/src/api/news.ts` 补充对应请求封装。 - -### 16. 世界杯专题新闻列表 AI 翻译 -- 2026-05-23:`uniapp/src/components/news-card/news-card.vue` 增加可选 AI 翻译触发入口,世界杯专题新闻列表可在卡片内点按翻译按钮。 -- 2026-05-23:`uniapp/src/packages_match/pages/worldcup.vue` 接收翻译事件并以弹窗展示翻译结果,保持其他新闻列表默认不变。 -### 17. 社区首页特朗普分类 AI 翻译复用 -- 2026-05-23:`uniapp/src/packages_community/pages/index.vue` 继续复用 `post-card` 卡片渲染,社区首页无需单独拆分 AI 入口逻辑。 -- 2026-05-23:`uniapp/src/packages_community/components/post-card.vue` 将 `特朗普` 标签纳入 AI 翻译入口判断,沿用帖子翻译弹窗展示方式。 -### 18. 资讯 AI 翻译改为积分确认流程 -- 2026-05-23:`server/app/api/controller/ArticleController.php` 的 `/article/translate` 改为登录后可用,并支持 `article_id/id + confirm` 的积分确认参数。 -- 2026-05-23:`server/app/api/logic/ArticleLogic.php` 为资讯翻译补齐 `needs_payment` 探测、积分扣减、翻译缓存复用与已付费用户缓存读取。 -- 2026-05-23:`uniapp/src/api/news.ts`、`uniapp/src/pages/news_detail/news_detail.vue`、`uniapp/src/packages_match/pages/worldcup.vue` 改为与社区翻译一致的 `POST + confirm` 调用方式,翻译前先提示登录并在确认后扣积分。 -### 19. 赛事详情新增第三方直播入口 -- 2026-05-23:`server/app/api/controller/MatchController.php` 复用 `la_match_data.raw_data` 中的直播源文本,向详情接口补充 `living_tv` 字段,便于前端展示直播来源说明。 -- 2026-05-23:`uniapp/src/pages/match_detail/match_detail.vue` 新增“直播”入口卡片,点击后通过现有 `webview` 页面跳转到懂球帝第三方直播详情页。 - -### 20. 管理端赛事直播链接编辑 -- 2026-05-23:`admin/src/views/match/lists/index.vue` 在赛事编辑弹窗中新增 `live_url` 输入项,用于维护第三方直播链接。 -- 2026-05-23:`server/app/adminapi/logic/match/MatchLogic.php` 允许赛事编辑写入 `live_url`,`uniapp/src/pages/match_detail/match_detail.vue` 优先读取该字段作为直播入口跳转地址。 -- 2026-05-23:新增 `docs/sql/alter_la_match_add_live_url.sql`,用于给 `la_match` 补充 `live_url` 字段。 -- 2026-05-23:已同步测试库 `sbnews.la_match.live_url` 字段,确认 `/adminapi/match.match/edit` 可正常落库。 - -### 21. 赛事详情直播入口仅在有链接时展示 -- 2026-05-23:`uniapp/src/pages/match_detail/match_detail.vue` 将直播入口收敛为仅在 `match.live_url` 存在时展示,不再为无链接赛事自动兜底第三方直播地址。 - -### 22. 世界杯专题比赛卡片跳转详情 -- 2026-05-23:`uniapp/src/packages_match/pages/worldcup.vue` 的赛程卡片和对阵图卡片统一支持点击跳转 `pages/match_detail/match_detail`,方便从世界杯专题直接进入比赛详情页。 - -### 23. 近期踩坑与文档同步 -- 2026-05-24:将本次调试过程中确认的坑点同步到 `sport-era-project-dev` 技能文档和各级 `AGENTS.md`,补充 `Validate::only()` 不过滤请求参数、`la_match.live_url` 必须先补库、世界杯专题页入口一致性以及构建产物不要混入提交等注意事项。 - -## 二、进行中事项 - -暂无。 +### 12. 鐢ㄦ埛椤垫湭璁惧瘑鐮佹彁绀?- 2026-05-23锛歚uniapp/src/pages/user/user.vue` 鍦ㄨ繘鍏モ€滄垜鐨勨€濋〉闈㈡椂琛ュ厖鏈缃瘑鐮佹彁绀哄脊绐楋紱褰?`has_password` 涓?`0` 鏃讹紝鎻愮ず鐢ㄦ埛灏藉揩淇敼鐧诲綍瀵嗙爜锛屽苟灞曠ず鎵嬫満鍙峰悗 6 浣嶄綔涓哄垵濮嬪瘑鐮佽鏄庛€?- 2026-05-23锛歚server/app/api/validate/LoginAccountValidate.php` 鏀寔绌哄瘑鐮佺敤鎴蜂娇鐢ㄦ墜鏈哄彿鍚?6 浣嶇洿鎺ョ櫥褰曪紝閬垮厤鍒濆鍖栬处鍙疯璇垽涓衡€滅敤鎴蜂笉瀛樺湪鈥濄€? +### 13. 涓栫晫鏉〉闈富瀵艰埅榛樿绱㈠紩 +- 2026-05-23锛歚uniapp/src/packages_match/pages/worldcup.vue` 鐨勪富瀵艰埅榛樿绱㈠紩璋冩暣涓虹 0 椤癸紝椤甸潰杩涘叆鏃堕粯璁ゅ仠鐣欏湪棣栦釜 tab銆? +### 14. 涓栫晫鏉笓棰樻柊闂绘潵婧愬悓姝ラ椤靛垎绫?- 2026-05-23锛歚uniapp/src/pages/match/match.vue` 璺宠浆涓栫晫鏉笓棰橀〉鏃舵惡甯﹂椤佃В鏋愬埌鐨?`涓栫晫鏉痐 鍒嗙被 `cid`锛宍uniapp/src/packages_match/pages/worldcup.vue` 浼樺厛浣跨敤璇?`cid` 鎷夊彇鏂伴椈锛屼繚璇佷笓棰樻柊闂绘潵婧愪笌棣栭〉涓栫晫鏉垎绫讳竴鑷淬€? +### 15. 鏂伴椈璧勮 AI 缈昏瘧 +- 2026-05-23锛歚server/app/api/controller/ArticleController.php` 鏂板 `/article/translate` 缈昏瘧鎺ュ彛锛宍server/app/api/logic/ArticleLogic.php` 澶嶇敤 `AiService` 鐢熸垚骞剁紦瀛樻枃绔犵炕璇戠粨鏋滃埌 `ext`銆?- 2026-05-23锛歚uniapp/src/pages/news_detail/news_detail.vue` 鍦ㄦ柊闂昏鎯呴〉鏂板 AI 缈昏瘧鍏ュ彛銆佸姞杞芥€佷笌缈昏瘧缁撴灉灞曠ず鍖猴紝`uniapp/src/api/news.ts` 琛ュ厖瀵瑰簲璇锋眰灏佽銆? +### 16. 涓栫晫鏉笓棰樻柊闂诲垪琛?AI 缈昏瘧 +- 2026-05-23锛歚uniapp/src/components/news-card/news-card.vue` 澧炲姞鍙€?AI 缈昏瘧瑙﹀彂鍏ュ彛锛屼笘鐣屾澂涓撻鏂伴椈鍒楄〃鍙湪鍗$墖鍐呯偣鎸夌炕璇戞寜閽€?- 2026-05-23锛歚uniapp/src/packages_match/pages/worldcup.vue` 鎺ユ敹缈昏瘧浜嬩欢骞朵互寮圭獥灞曠ず缈昏瘧缁撴灉锛屼繚鎸佸叾浠栨柊闂诲垪琛ㄩ粯璁や笉鍙樸€?### 17. 绀惧尯棣栭〉鐗规湕鏅垎绫?AI 缈昏瘧澶嶇敤 +- 2026-05-23锛歚uniapp/src/packages_community/pages/index.vue` 缁х画澶嶇敤 `post-card` 鍗$墖娓叉煋锛岀ぞ鍖洪椤垫棤闇€鍗曠嫭鎷嗗垎 AI 鍏ュ彛閫昏緫銆?- 2026-05-23锛歚uniapp/src/packages_community/components/post-card.vue` 灏?`鐗规湕鏅甡 鏍囩绾冲叆 AI 缈昏瘧鍏ュ彛鍒ゆ柇锛屾部鐢ㄥ笘瀛愮炕璇戝脊绐楀睍绀烘柟寮忋€?### 18. 璧勮 AI 缈昏瘧鏀逛负绉垎纭娴佺▼ +- 2026-05-23锛歚server/app/api/controller/ArticleController.php` 鐨?`/article/translate` 鏀逛负鐧诲綍鍚庡彲鐢紝骞舵敮鎸?`article_id/id + confirm` 鐨勭Н鍒嗙‘璁ゅ弬鏁般€?- 2026-05-23锛歚server/app/api/logic/ArticleLogic.php` 涓鸿祫璁炕璇戣ˉ榻?`needs_payment` 鎺㈡祴銆佺Н鍒嗘墸鍑忋€佺炕璇戠紦瀛樺鐢ㄤ笌宸蹭粯璐圭敤鎴风紦瀛樿鍙栥€?- 2026-05-23锛歚uniapp/src/api/news.ts`銆乣uniapp/src/pages/news_detail/news_detail.vue`銆乣uniapp/src/packages_match/pages/worldcup.vue` 鏀逛负涓庣ぞ鍖虹炕璇戜竴鑷寸殑 `POST + confirm` 璋冪敤鏂瑰紡锛岀炕璇戝墠鍏堟彁绀虹櫥褰曞苟鍦ㄧ‘璁ゅ悗鎵gН鍒嗐€?### 19. 璧涗簨璇︽儏鏂板绗笁鏂圭洿鎾叆鍙?- 2026-05-23锛歚server/app/api/controller/MatchController.php` 澶嶇敤 `la_match_data.raw_data` 涓殑鐩存挱婧愭枃鏈紝鍚戣鎯呮帴鍙hˉ鍏?`living_tv` 瀛楁锛屼究浜庡墠绔睍绀虹洿鎾潵婧愯鏄庛€?- 2026-05-23锛歚uniapp/src/pages/match_detail/match_detail.vue` 鏂板鈥滅洿鎾€濆叆鍙e崱鐗囷紝鐐瑰嚮鍚庨€氳繃鐜版湁 `webview` 椤甸潰璺宠浆鍒版噦鐞冨笣绗笁鏂圭洿鎾鎯呴〉銆? +### 20. 绠$悊绔禌浜嬬洿鎾摼鎺ョ紪杈?- 2026-05-23锛歚admin/src/views/match/lists/index.vue` 鍦ㄨ禌浜嬬紪杈戝脊绐椾腑鏂板 `live_url` 杈撳叆椤癸紝鐢ㄤ簬缁存姢绗笁鏂圭洿鎾摼鎺ャ€?- 2026-05-23锛歚server/app/adminapi/logic/match/MatchLogic.php` 鍏佽璧涗簨缂栬緫鍐欏叆 `live_url`锛宍uniapp/src/pages/match_detail/match_detail.vue` 浼樺厛璇诲彇璇ュ瓧娈典綔涓虹洿鎾叆鍙h烦杞湴鍧€銆?- 2026-05-23锛氭柊澧?`docs/sql/alter_la_match_add_live_url.sql`锛岀敤浜庣粰 `la_match` 琛ュ厖 `live_url` 瀛楁銆?- 2026-05-23锛氬凡鍚屾娴嬭瘯搴?`sbnews.la_match.live_url` 瀛楁锛岀‘璁?`/adminapi/match.match/edit` 鍙甯歌惤搴撱€? +### 21. 璧涗簨璇︽儏鐩存挱鍏ュ彛浠呭湪鏈夐摼鎺ユ椂灞曠ず +- 2026-05-23锛歚uniapp/src/pages/match_detail/match_detail.vue` 灏嗙洿鎾叆鍙f敹鏁涗负浠呭湪 `match.live_url` 瀛樺湪鏃跺睍绀猴紝涓嶅啀涓烘棤閾炬帴璧涗簨鑷姩鍏滃簳绗笁鏂圭洿鎾湴鍧€銆? +### 22. 涓栫晫鏉笓棰樻瘮璧涘崱鐗囪烦杞鎯?- 2026-05-23锛歚uniapp/src/packages_match/pages/worldcup.vue` 鐨勮禌绋嬪崱鐗囧拰瀵归樀鍥惧崱鐗囩粺涓€鏀寔鐐瑰嚮璺宠浆 `pages/match_detail/match_detail`锛屾柟渚夸粠涓栫晫鏉笓棰樼洿鎺ヨ繘鍏ユ瘮璧涜鎯呴〉銆? +### 23. 杩戞湡韪╁潙涓庢枃妗e悓姝?- 2026-05-24锛氬皢鏈璋冭瘯杩囩▼涓‘璁ょ殑鍧戠偣鍚屾鍒?`sport-era-project-dev` 鎶€鑳芥枃妗e拰鍚勭骇 `AGENTS.md`锛岃ˉ鍏?`Validate::only()` 涓嶈繃婊よ姹傚弬鏁般€乣la_match.live_url` 蹇呴』鍏堣ˉ搴撱€佷笘鐣屾澂涓撻椤靛叆鍙d竴鑷存€т互鍙婃瀯寤轰骇鐗╀笉瑕佹贩鍏ユ彁浜ょ瓑娉ㄦ剰浜嬮」銆? +## 浜屻€佽繘琛屼腑浜嬮」 +鏆傛棤銆? --- -## 三、待办事项 +## 涓夈€佸緟鍔炰簨椤? +### 1. 涓氬姟妯″潡杩涘害琛ュ綍 -### 1. 业务模块进度补录 +- 浼樺厛绾э細涓?- 鍒涘缓鏃堕棿锛?026-05-07 -- 优先级:中 -- 创建时间:2026-05-07 +寰呯‘璁わ細 -待确认: +- 鏍规嵁鐜版湁 `01-浜у搧鏂规鏂囨。.md`銆乣02-瀹炵幇娴佺▼鏂囨。.md` 鍜屽綋鍓嶄唬鐮佺姸鎬侊紝琛ュ綍宸插畬鎴愪笟鍔℃ā鍧椼€?- 鎸夋ā鍧楁⒊鐞嗗悗绔帴鍙c€佺鐞嗗悗鍙伴〉闈€乽niapp 椤甸潰銆丳C 椤甸潰褰撳墠瀹屾垚搴︺€? +### 2. 璁捐绋挎槧灏勮ˉ褰? +- 浼樺厛绾э細涓?- 鍒涘缓鏃堕棿锛?026-05-07 -- 根据现有 `01-产品方案文档.md`、`02-实现流程文档.md` 和当前代码状态,补录已完成业务模块。 -- 按模块梳理后端接口、管理后台页面、uniapp 页面、PC 页面当前完成度。 - -### 2. 设计稿映射补录 - -- 优先级:中 -- 创建时间:2026-05-07 - -待确认: - -- 确认当前设计稿平台、项目链接和页面节点名称。 -- 将首页、新闻列表、新闻详情、个人中心、AI 分析等页面与实现路径建立映射。 +寰呯‘璁わ細 +- 纭褰撳墠璁捐绋垮钩鍙般€侀」鐩摼鎺ュ拰椤甸潰鑺傜偣鍚嶇О銆?- 灏嗛椤点€佹柊闂诲垪琛ㄣ€佹柊闂昏鎯呫€佷釜浜轰腑蹇冦€丄I 鍒嗘瀽绛夐〉闈笌瀹炵幇璺緞寤虹珛鏄犲皠銆? --- -## 四、避坑记录 +## 鍥涖€侀伩鍧戣褰? +### 1. ThinkPHP 鏃堕棿瀛楁鑷姩杞崲 -### 1. ThinkPHP 时间字段自动转换 - -- BaseModel 子类查询后 `create_time` / `update_time` 已按配置转为日期字符串。 -- 不要对这些字段再次手动 `date()` 转换,避免字符串强转整数导致显示为 1970-01-01。 - -### 2. MySQL 保留字 - -- 原生 SQL 中 `system`、`order`、`group`、`key` 等字段必须使用反引号包裹。 - -### 3. 逗号分隔输入清理 - -- 手机号、关键词等逗号分隔输入,提交前必须执行 `split → trim → filter(Boolean) → join`。 - -### 4. 外站图片防盗链 - -- 新闻详情等富文本中的外站图片如出现 403,优先在前端渲染层设置 `referrerpolicy="no-referrer"`。 -- 不擅自清洗图片 URL 参数或改写原始路径。 - -### 5. 测试服务器代码同步 - -- 不通过 WSL `sshpass` / `scp` 上传业务代码。 -- 项目代码更新由用户通过 SFTP 等方式处理。 - -### 6. 新增字段与联动入口排查 - -- `Validate::only()` 只限制校验字段,不会过滤请求参数;新增字段必须同时核对 validate、logic、model、保存白名单和数据库列。 -- `adminapi/match.match/edit` 写入失败先看表结构,不要把测试库缺列误判成业务逻辑错误。 -- 世界杯专题页、比赛详情页的入口和显示规则要一起改,直播入口只在 `match.live_url` 有值时展示。 -- 构建产物如 `server/public/admin`、`server/public/mobile` 不要混进提交,提交前先清理临时截图和生成文件。 +- BaseModel 瀛愮被鏌ヨ鍚?`create_time` / `update_time` 宸叉寜閰嶇疆杞负鏃ユ湡瀛楃涓层€?- 涓嶈瀵硅繖浜涘瓧娈靛啀娆℃墜鍔?`date()` 杞崲锛岄伩鍏嶅瓧绗︿覆寮鸿浆鏁存暟瀵艰嚧鏄剧ず涓?1970-01-01銆? +### 2. MySQL 淇濈暀瀛? +- 鍘熺敓 SQL 涓?`system`銆乣order`銆乣group`銆乣key` 绛夊瓧娈靛繀椤讳娇鐢ㄥ弽寮曞彿鍖呰9銆? +### 3. 閫楀彿鍒嗛殧杈撳叆娓呯悊 +- 鎵嬫満鍙枫€佸叧閿瘝绛夐€楀彿鍒嗛殧杈撳叆锛屾彁浜ゅ墠蹇呴』鎵ц `split 鈫?trim 鈫?filter(Boolean) 鈫?join`銆? +### 4. 澶栫珯鍥剧墖闃茬洍閾? +- 鏂伴椈璇︽儏绛夊瘜鏂囨湰涓殑澶栫珯鍥剧墖濡傚嚭鐜?403锛屼紭鍏堝湪鍓嶇娓叉煋灞傝缃?`referrerpolicy="no-referrer"`銆?- 涓嶆搮鑷竻娲楀浘鐗?URL 鍙傛暟鎴栨敼鍐欏師濮嬭矾寰勩€? +### 5. 娴嬭瘯鏈嶅姟鍣ㄤ唬鐮佸悓姝? +- 涓嶉€氳繃 WSL `sshpass` / `scp` 涓婁紶涓氬姟浠g爜銆?- 椤圭洰浠g爜鏇存柊鐢辩敤鎴烽€氳繃 SFTP 绛夋柟寮忓鐞嗐€? +### 6. 鏂板瀛楁涓庤仈鍔ㄥ叆鍙f帓鏌? +- `Validate::only()` 鍙檺鍒舵牎楠屽瓧娈碉紝涓嶄細杩囨护璇锋眰鍙傛暟锛涙柊澧炲瓧娈靛繀椤诲悓鏃舵牳瀵?validate銆乴ogic銆乵odel銆佷繚瀛樼櫧鍚嶅崟鍜屾暟鎹簱鍒椼€?- `adminapi/match.match/edit` 鍐欏叆澶辫触鍏堢湅琛ㄧ粨鏋勶紝涓嶈鎶婃祴璇曞簱缂哄垪璇垽鎴愪笟鍔¢€昏緫閿欒銆?- 涓栫晫鏉笓棰橀〉銆佹瘮璧涜鎯呴〉鐨勫叆鍙e拰鏄剧ず瑙勫垯瑕佷竴璧锋敼锛岀洿鎾叆鍙e彧鍦?`match.live_url` 鏈夊€兼椂灞曠ず銆?- 鏋勫缓浜х墿濡?`server/public/admin`銆乣server/public/mobile` 涓嶈娣疯繘鎻愪氦锛屾彁浜ゅ墠鍏堟竻鐞嗕复鏃舵埅鍥惧拰鐢熸垚鏂囦欢銆? --- -## 文档维护规范 +## 鏂囨。缁存姢瑙勮寖 -1. **每完成一个 issue / 功能点 → 立即追加到「已完成事项」**。 -2. **每发现一个坑 → 立即追加到「避坑记录」**。 -3. **每周清理一次「进行中」与「待办」状态**。 -4. **章节序号连续递增,不重排**,保留历史可追溯。 -5. **涉及数据库变更必须列出表名和字段**。 +1. **姣忓畬鎴愪竴涓?issue / 鍔熻兘鐐?鈫?绔嬪嵆杩藉姞鍒般€屽凡瀹屾垚浜嬮」銆?*銆?2. **姣忓彂鐜颁竴涓潙 鈫?绔嬪嵆杩藉姞鍒般€岄伩鍧戣褰曘€?*銆?3. **姣忓懆娓呯悊涓€娆°€岃繘琛屼腑銆嶄笌銆屽緟鍔炪€嶇姸鎬?*銆?4. **绔犺妭搴忓彿杩炵画閫掑锛屼笉閲嶆帓**锛屼繚鐣欏巻鍙插彲杩芥函銆?5. **娑夊強鏁版嵁搴撳彉鏇村繀椤诲垪鍑鸿〃鍚嶅拰瀛楁**銆? +### 24. 涓栫晫鏉笓棰樻柊闂昏嚜鍔ㄧ炕璇戝睍绀?- 2026-05-28锛歚uniapp/src/packages_match/pages/worldcup.vue` 鐨勬柊闂诲尯鏀逛负鑷姩璇锋眰 `/article/translate` 骞剁洿鎺ュ睍绀轰腑鏂囩炕璇戯紝涓撻椤典笉鍐嶅睍绀烘樉寮?AI 缈昏瘧鍏ュ彛锛屼粎淇濈暀缈昏瘧缁撴灉灞曠ず銆? -### 24. 世界杯专题新闻自动翻译展示 -- 2026-05-28:`uniapp/src/packages_match/pages/worldcup.vue` 的新闻区改为自动请求 `/article/translate` 并直接展示中文翻译,专题页不再展示显式 AI 翻译入口,仅保留翻译结果展示。 +### 25. 鏂囩珷鍒楄〃鎺ュ彛鑷姩缈昏瘧鍥炰紶 +- 2026-05-28锛歚/api/article/lists` 鍦?`cid=22` 鏃朵細鑷姩璇诲彇鎴栫敓鎴愭枃绔犺瘧鏂囧苟鍐欏叆 `ext.translated_content`锛屾帴鍙g洿鎺ュ洖浼犱腑鏂囩炕璇戯紱`packages_match/pages/worldcup` 鍙栨秷鍓嶇浜屾缈昏瘧璇锋眰锛屽彧娑堣垂鍚庣杩斿洖缁撴灉銆? -### 25. 文章列表接口自动翻译回传 -- 2026-05-28:`/api/article/lists` 在 `cid=22` 时会自动读取或生成文章译文并写入 `ext.translated_content`,接口直接回传中文翻译;`packages_match/pages/worldcup` 取消前端二次翻译请求,只消费后端返回结果。 +### 26. 棣栭〉涓庢枃绔犺鎯呯洿鎺ュ睍绀轰腑鏂囩炕璇? +- 2026-05-28锛歚server/app/api/logic/ArticleLogic.php 琛ュ厖璇︽儏鎺ュ彛鐨? ranslated_content 鏈敤鎴风墝鏈熷叆鍙岀洿鎺ュ洖浼犵紦瀛樼粨鏋滐紝棣栭〉鍒楄〃鍗$墖缁х画澶嶇敤 ranslated_content 鏄剧ず涓枃缈昏瘧銆? +- 2026-05-28锛歚uniapp/src/pages/news_detail/news_detail.vue 鍘绘帀鎵嬪姩缈昏瘧鎸夐挳鍜屽弽澶嶈姹傛祦绋嬶紝鏀逛负鐩存帴灞曠ず鎺ュ彛杩斿洖鐨勪腑鏂囩炕璇戝唴瀹癸紝涓栫晫鏉垪琛ㄥ崱鐗囧悓姝ョ粦瀹? ranslated_content銆? -### 26. 首页与文章详情直接展示中文翻? -- 2026-05-28:`server/app/api/logic/ArticleLogic.php 补充详情接口? ranslated_content 未用户牌期入双直接回传缓存结果,首页列表卡片继续复用 ranslated_content 显示中文翻译? -- 2026-05-28:`uniapp/src/pages/news_detail/news_detail.vue 去掉手动翻译按钮和反复请求流程,改为直接展示接口返回的中文翻译内容,世界杯列表卡片同步绑? ranslated_content? +### 27. 首页资讯卡片翻译块独立成行 +- 2026-05-28锛歚uniapp/src/components/feed-card/feed-card.vue鍜?uniapp/src/components/feed-video-card/feed-video-card.vue 灏? ranslated_content 绉诲埌鍥剧墖/瑙嗛鍖哄潡涔嬩笅鐨勭嫭绔嬪叏瀹藉埗琛岋紝閬垮厤缈昏瘧鍐呭鍗犳帀宸﹀彸鍒楀鑷村浘鐗囪鍘嬬缉鍒颁竴渚э紝鍚屾椂淇濇寔鍗$墖绮惧捐灞曠ず銆? -### 27. ҳѶƬ -- 2026-05-28:`uniapp/src/components/feed-card/feed-card.vue?uniapp/src/components/feed-video-card/feed-video-card.vue ? ranslated_content 移到图片/视频区块之下的独立全宽制行,避免翻译内容占掉左右列导致图片被压缩到一侧,同时保持卡片精角展示? +### 28. 世界杯英文资讯定时翻译预热 +- 2026-05-28:新增 server/app/common/command/WorldcupArticleTranslate.php,用于定时扫描世界杯分类文章并仅在疑似英文且未缓存翻译时调用 ArticleLogic::autoTranslateArticle() 落库。 +- 2026-05-28:将命令注册到 server/config/console.php,并新增 docs/sql/insert_crontab_worldcup_article_translate.sql,可将任务加入 la_dev_crontab 统一调度。 +- 2026-05-28:翻译判定会先排除包含中文字符的内容,避免非英文资讯误入 AI 翻译流程。 + +### 29. 世界杯社区内容精选区 +- 2026-05-28:曾在 uniapp/src/packages_community/pages/index.vue 顶部新增世界杯精选社区区块,用于预热世界杯社区内容。 +- 2026-05-28:已根据最新需求撤回顶部精选区,首页恢复为原先的分类流展示。 +- 2026-05-28:新增 docs/sql/seed_worldcup_community_posts.sql,可快速插入 3 条世界杯社区种子帖子并关联 世界杯 标签。 + +### 30. 世界杯英文文章翻译定时任务入库 +- 2026-05-28:已将 `worldcup_article_translate` 预热命令写入远端 `la_dev_crontab`,表达式为 `*/10 * * * *`,用于定时补齐世界杯英文文章的翻译缓存。 +- 2026-05-28:已移除命令内的 50 条限制,避免只覆盖最新内容导致旧文章长期未翻译。 + +### 31. 赛事详情页头部优化 +- 2026-05-29:将 `uniapp/src/pages/match_detail/match_detail.vue` 顶部导航抽离为 `uniapp/src/components/match-detail-header/match-detail-header.vue`,页面只保留返回、标题、副标题和分享入口。 +- 2026-05-29:移除了赛事详情页顶部的 hero 摘要区,保留比赛信息卡、直播、阵容和 AI 分析主体内容不变。 + +### 32. 非 TabBar 页自定义底栏白屏修复 +- 2026-05-29:修正 `uniapp/src/components/tabbar/tabbar.vue` 对 `hide-tab-bar` 的使用,仅在原生 TabBar 页启用,避免在 `packages_match/pages/index` 这类普通页面触发 `hideTabBar:fail not TabBar page`。 +- 2026-05-29:该问题会在赛事入口页产生未处理 rejection,表现为点击赛事后页面白屏或异常闪烁,现已收敛。 + +### 33. iOS 赛事入口兼容修复 +- 2026-05-29:将 `uniapp/src/packages_match/components/MatchCenterPanel.vue` 的 `Object.values(...).flat()` 改为手动合并数组,避免老版本 iOS WebView 不支持 `flat()` 时在赛事入口直接白屏。 +- 2026-05-29:同步将 `uniapp/src/packages_match/pages/index.vue` 与 `uniapp/src/packages_match/pages/worldcup.vue` 的壳组件导入统一为绝对路径,减少子包页面在 App/iOS 端的解析歧义。 + +### 34. 赛事详情页返回赛事中心浮动入口 +- 2026-05-29:在 `uniapp/src/pages/match_detail/match_detail.vue` 右下角新增“赛事中心”浮动圆圈,点击后优先 `switchTab` 返回 `pages/match/match`,失败时回退 `reLaunch`。 + +### 35. 世界杯英文翻译预热容错调整 +- 2026-05-29:将 `server/app/common/command/WorldcupArticleTranslate.php` 的英文判定阈值放宽,并改为按文章 `id` 升序处理,减少正常英文世界杯稿件被误判为“非英文”而跳过的情况。 +- 2026-05-29:世界杯文章列表页本身只读取 `ext.translated_content`,如果宿主机没有持续运行 `php think crontab` 或 `/crontab` 调度入口,未触发预热的文章就会一直保持空翻译状态。 + +### 36. 世界杯专题新闻翻译摘要预览 +- 2026-05-29:`uniapp/src/components/feed-card/feed-card.vue` 与 `uniapp/src/components/feed-video-card/feed-video-card.vue` 的首页世界杯翻译区改为摘要预览,不再全量展开正文。 +- 2026-05-29:`uniapp/src/packages_match/components/WorldCupPanel.vue` 的世界杯专题新闻列表翻译块同步改为摘要预览,保持卡片高度稳定,避免整段译文撑开列表。 diff --git a/设计稿映射.md b/设计稿映射.md index 35af048..84b33df 100644 --- a/设计稿映射.md +++ b/设计稿映射.md @@ -23,6 +23,7 @@ | 设计稿名称 | uniapp 页面路径 | 状态 | 备注 | | --- | --- | --- | --- | | 赛事中心(含世界杯专题入口) | `uniapp/src/pages/match/match.vue` | ✅ 已完成 | 2026-05-20 按世界杯专题稿补充顶部蓝色专题入口,入口位于标题与运动分类之间 | +| 赛事详情页 | `uniapp/src/pages/match_detail/match_detail.vue` | 🚧 部分完成 | 2026-05-29 优化顶部赛事摘要头部,补充联赛、对阵、状态与直播入口信息 | | 世界杯专题页(排名导航) | `uniapp/src/packages_match/pages/worldcup.vue` | 🚧 部分完成 | 2026-05-20 已按设计稿拆分排名导航、积分榜、球员榜组件,后续可继续细化表格视觉与新闻页样式 | | 首页 | `uniapp/src/pages/index/index.vue` | 待核对 | 需结合实际设计稿补充 | | 新闻详情 | `uniapp/src/pages/news_detail/news_detail.vue` | 待核对 | 富文本与图片渲染已存在相关实现 |