From faf87fe3d6421ed4a33c55013e460bddf2a567c2 Mon Sep 17 00:00:00 2001 From: hujun Date: Fri, 20 Mar 2026 16:50:49 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E5=B1=80=E5=90=8E?= =?UTF-8?q?=E5=A4=8D=E7=9B=98=E6=9C=8D=E5=8A=A1=E4=B8=8E=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E5=AE=B9=E5=99=A8=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增复盘服务相关DTO、Controller和Service 实现复盘页面容器组件ReviewPageContainer 更新前端页面架构文档与开发计划 移除DemoGameController中的演示复盘接口 补充复盘服务单元测试 --- .../java/document_symbols_cache_v23-06-25.pkl | Bin 416535 -> 420203 bytes .serena/memories/blood_battle_scoring_v1.md | 17 +- .serena/memories/review_service_v1.md | 16 + .../game/controller/DemoGameController.java | 1 - .../game/service/GameSessionService.java | 8 + .../review/controller/ReviewController.java | 29 ++ .../review/dto/ReviewMistakeItem.java | 13 + .../review/dto/ReviewSettlementItem.java | 15 + .../review/dto/ReviewSummaryResponse.java | 21 + .../review/dto/ReviewTrainingFocusItem.java | 12 + .../review/service/ReviewService.java | 400 ++++++++++++++++++ .../review/service/ReviewServiceTest.java | 97 +++++ docs/DEVELOPMENT_PLAN.md | 14 + docs/H5_GAME_PAGE_ARCHITECTURE.md | 16 + frontend/src/App.vue | 358 ++++------------ frontend/src/components/AppShell.vue | 31 ++ frontend/src/components/GameWorkspace.vue | 163 +++++++ frontend/src/components/PublicSeatBoard.vue | 39 ++ frontend/src/components/RoomControlPanel.vue | 97 +++++ frontend/src/components/RoomLobbyPanel.vue | 68 +++ frontend/src/components/RoomWorkspace.vue | 68 +++ frontend/src/components/SelfHandPanel.vue | 60 +++ frontend/src/components/ViewSwitchPanel.vue | 37 ++ frontend/src/pages/GamePageContainer.vue | 90 ++++ frontend/src/pages/ReviewPageContainer.vue | 156 +++++++ frontend/src/pages/RoomPageContainer.vue | 59 +++ frontend/src/types/review.ts | 34 ++ 27 files changed, 1639 insertions(+), 280 deletions(-) create mode 100644 .serena/memories/review_service_v1.md create mode 100644 backend/src/main/java/com/xuezhanmaster/review/controller/ReviewController.java create mode 100644 backend/src/main/java/com/xuezhanmaster/review/dto/ReviewMistakeItem.java create mode 100644 backend/src/main/java/com/xuezhanmaster/review/dto/ReviewSettlementItem.java create mode 100644 backend/src/main/java/com/xuezhanmaster/review/dto/ReviewSummaryResponse.java create mode 100644 backend/src/main/java/com/xuezhanmaster/review/dto/ReviewTrainingFocusItem.java create mode 100644 backend/src/main/java/com/xuezhanmaster/review/service/ReviewService.java create mode 100644 backend/src/test/java/com/xuezhanmaster/review/service/ReviewServiceTest.java create mode 100644 frontend/src/components/AppShell.vue create mode 100644 frontend/src/components/GameWorkspace.vue create mode 100644 frontend/src/components/PublicSeatBoard.vue create mode 100644 frontend/src/components/RoomControlPanel.vue create mode 100644 frontend/src/components/RoomLobbyPanel.vue create mode 100644 frontend/src/components/RoomWorkspace.vue create mode 100644 frontend/src/components/SelfHandPanel.vue create mode 100644 frontend/src/components/ViewSwitchPanel.vue create mode 100644 frontend/src/pages/GamePageContainer.vue create mode 100644 frontend/src/pages/ReviewPageContainer.vue create mode 100644 frontend/src/pages/RoomPageContainer.vue create mode 100644 frontend/src/types/review.ts diff --git a/.serena/cache/java/document_symbols_cache_v23-06-25.pkl b/.serena/cache/java/document_symbols_cache_v23-06-25.pkl index 761610e822376a3bcf39164edfd77ccae2afe404..a98ceb0310ed13ac3bb0d4f22dc0d7005f68fb97 100644 GIT binary patch literal 420203 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 literal 416535 zcmeFa37A|*buTX4l8`J*@*>%?<)uBA?H+41t45pUWi&I=jHOwa8ChN=#GUTj)7|Rn zJM=P=983r}CJqh8Ff4IcY#bKb7zmG@B=7M;Nd9?XLqbAA2;1ik9^ns3fIx`z&Z*^g z-Ri2Y+oRERjXnD8n(lLN-CKQrRj1B5b?Ve>m%e?;k~5azzq@CmrQ61x*fBR7Z^`Fk zEt5_v+md#sotBt4*>a-j-j#H+lTN9L8Tz=_HY3Z?4Ha@d|X=z!`$xgU4SbbT(;N%MA(1<7Qd${HIyol> z4To>V(pm5e@rL9%`y;gHCi$}c%aSYb76$J5fPWd>ZuoXav6wtpxMLmAR{QYd zw+6UlU2=V(0oZflwdZ3OW#eGf%}u9bF1~X`;GGx3GnV>K#BV#KcOvcTz#ZG^JCj!? z8TFG2wfFVvVjW5@j#_WBkZWq4;?BaLszgA-x6VsXA0;bcu&>AUM;C3T}?8QS;_&7$|J%;5V=tCGduX(v;33SJK1wj%Jhi=Z;t zzwA-?4IC$;XrL!)85Pn(wZZd?fjqEud+zLkjc^w&j?GzQ#qC=rc z;C@*ld0_wY0KYE_@H?vDH{P+)=Qn;sXVQC1=Yy$xAeAo=8@G2FJXv7d*0--eRYwS} zn{u-gLH?IL4%G9|pDnl(ZjSW&APUz7P-s!0fOlN#qk!LtEVB`XZ`Tur32=qa7KOF| z3cD02;2mWY@SC+L{IHHFM3cqYVz4`aL9YS>yrYZ(ek1bV#*y%gI%3c;<>d2f6!dav zUx51u6x_!<%G}3qwvK@GS+GV}M*uD>X7k0VDKA%WwD_U`twL%7nV#EjDBN)(GMsXjdzq8jo+w> ziHt`7K0d$RjDC528GVJ5$zT`H(-kQ@mrMi@3VpJ z$@s9I+w&S-e2-{!AdV9Tj zeyqMce>r%CQ*j}LgDLX?g$BPc0na6IQ-s-B931{vF*Y6vfbV_UT=_2)EA^X<{G3XE^!oSeKdg9R~2aC9c8ren_X!AZhg_(%F%+!Bhiy{j`vCa zBE@i0;P6xchwmzIz&pw~;5TX{*fMI~T3;M?i8$=5@SG}8s3OC@A3)>R3N-MJG8*{p zN~>hp`|69v+Eji|#>pPj+h@NCu=oW9i}8-K3WeV`+NMH%q`qA4$WuQM56CN&5sl=@!1IPTUljOU4YU&(q5!U{i?{9^K}$!{f}Oa6QM3}AbD4Hg@*h+@%+#U3n% zusDoG3X5qhUXR6Fuy_v^k74l{EWU)r*Rl8x6eL{n&B@1UxZ=xa6>B!?777`65`s`h zX#is|SkY~bjkj-eoNe*8@m6PRyc2>K6WbF`tFxnH>vnhhJO?YLe*-^z|C027;U7)N zV*1x`5u(Nd_bw@>Ur>lnF1*GhK%GIh0Pzm@58 zp|R=nuvo@^?aSbAX?{CzdL=gCGAz!|awu#IDN_F)~CT zu)%KAFzU1jqO}A4fKOPE)~i8cWZ0CW28mslL1N@4D?#eA2&C08A%%tLLN!E;tQ|+} zx(pE`+c}N~EP|*hPqb~e;f?w3+3Hs+3yYDYpvGb&Qz(|J6^adN1h1uJ@TjQ=8LM`w zq);$2pR7t3pv~%A2H>zLW(qSlNypnQLbaKq+IwQk%e!%ZHDGqQHmY&mVZfDDlW}Ea zh;}41oc*{aEW$NPag~B)>Y$rw*gmHO~#dx z+ZPP3Z?Xtih(|~NB%~ROxlTqiyM_Ywx7DD&(*P=~CWFez3umxCXc4GK9T=r2M}7UW z9Q_E3UOpA$p__!*Xr>(tDsod~z?s_ZuQ{_1HySkOKTvmsPZ~M`t0vn%jJ$B>;}2QX z5w7%daX072d)!RH$wvvafx-agr`1q?!2l(z)*u-{jO>r;4PXQ*JD63L&?oDUr(1ug z^96O}0{Y$ui|LKngln_G57fi#Qgq!s0bpyb+6cVetVhJ^=-;=B57~mNNI|l5M_b4C?c1Ez`Ciof z8vJ@#)cZRA(Jksd2^VouPrMf#{(qw&2N(7D((~l$S;wP6%On@7xPUs7d?fu7lPyYi{Q!UPscCN~K-XueVHE@NxfgSWkuq+pN5hJ5R zQ`tUt{c?3RNMFL*mwYV!9c(B|Vlw|-@JIOedF+DeZ^H}yL?*P?oIL@-HNDvhOwUVu ziw2CXYA_fXf|t}_u(@xA zF!D}&P&xCg`VWzfIhN#9jA`9dgp9|K#JVav+tlbV@+~@a*!5-!9Y*fA2c0z*pmSjm z9as(VGSentwyS|*_g2qXlTJ%@=a8BX$D3pY*_hs)$^#Mud@ZML}tvu-I~g$##5P8AsjNh)yOdN9vw35`gIaAjND}pGPhcQ%-VwM zz_A}8=aL)Lh%mBttg!3ySYc#~#>%(_h^#~FaR9afIuq`2aXgdCCrx_rjcQmJdADw$ zu2dKude>yq=tf#hjmb}>zgGg7#Ty?ErH^$`a^LW?)9nk zl14|$4oSKJllsHNOtZc_rb)TOm3af?i`*C$7fzXK(G=N}@x1sR2N%#s16p}gM93vf zHX4dLNmFE4Jta0p#)1-=wqF(quxLk|!YkE2*DiH8ypxhKa#5+&uxhKMZpg@&+0za0 zt$#NxT})2y!H&pwHI{diQf!v1u{ol~CSkyaRg+z?j10SiiHInzg9TMGIK*>(U{hqB zo#bz|0I&@cZUN3$Qk?8l6|bZkuVV(hSTz|hMuyyIR^#lt<5w`?$EwNrF)~`}I3?RU-acXhe%DBOPC0R{^4q%)9#oz=$?R798N)m&H&j5)sTJ802!-xo;1oBnMYZPi8AXv!hUT5N*6oD zf`|T*JzgPjN`wKUFDNk@c-a{SkXSt#Bu3_L4~sy0+0y#Q(?nr|0UZ0@m5nnmwK$lV z0}jt!s*V{Xr&EJ=jsY~kqJ)}HhwP11916L(>O8jASpZveb=agcvkc&^(SUcp2|Qj= z29MJ%1n)`JaHq^c5$a>{v0E6^EVyvUM8BT1=4fiZW!J?i*(IjJIYB zAR9|Us>qBx?Bxp-w%$a-jRmK*;0`SG-qKr{f2&D8$<6?An+D>&CWv`O8DdVi5aR1C zfcSbkD!D!2r=kp~F7l!h&8ccYvQLBLttKRSMHxv>=Mh5|=`?*7AlXL;E6W{H9qU_EAnl~8Fmsgb0<@Bxg86}47_k%U9L81N<5ltfBPRH)=3^y9q;HQO1zdEyVC07GQWKah!sh)0I+NA%=PH zof^D8V8V-6l=0$p3x(z*7T|R=oKwe#RT(g#;N~}efEwBNJ}dL_LmD_AGr`F#t_v<( z3~)LR*)9bSzpJx*_2U*Gx;vJE1ce+^DkQt|!xg7p^E+w~rXSIu`6&~cyrMifIo)5N zx5wo8QwyNHzK}b~h9XC6j;6)WXpsD>2}xd2Mv~JlbnE=J1xPmLXfVt$tXIKS7d@JW z>G3HIZhvROjaR%{?FSlserdvoSCsML^h@|y!`aRbe12vD zKCLk?TS#S#Zdan<=GX{3lqw{>BE%9_Mmibb`;`X17fkT+iZXnhZlMS51q
  • Yi|8 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

    B>uT-_kbKxuyIFShdA}w;TY~+hM zpwGa9qMoWvm!?ip(hJ?EWFV?%6Vac={|Be(7BaQ4d&-U3YLoJINYSW=?v21IVHi(_ z14;*YwBJQw=izE)U%5IqBcuQUz3UG z0^<+p(Q*?fK+QWOz;$C`gV!N$2}%Uebx!C9BZPiy9--@sKB4RPSNHaA_y5#&LjP~W zgx)sXE!|uAbH`XZ=?5WVD(#Q%PPQR2H;Ax3!VXqV$VA^n?I4zONW)4ZdyXZCXz_(I-^>zQ-lQ5K5R%n7cHG?&a=0 CSsW9Q6AhCx`#sb#mC~JLI#WYsn!5 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 diff --git a/.serena/memories/blood_battle_scoring_v1.md b/.serena/memories/blood_battle_scoring_v1.md index f9eed6c..580551a 100644 --- a/.serena/memories/blood_battle_scoring_v1.md +++ b/.serena/memories/blood_battle_scoring_v1.md @@ -6,12 +6,23 @@ - 过水不胡:玩家在响应窗口里本可 `HU` 但选择 `PASS` 后,直到自己下一次真正摸牌前,不能再做响应胡;不影响碰、杠、自摸胡。 - 教学建议链路已扩展为:`recommendedAction`、`explanation`、`candidates`,其中 `candidates` 透传到私有 WebSocket 教学消息,前端已支持展示候选牌、评分和原因标签中文映射。 - 前端 H5 对局页已完成正式动作面板、响应动作面板、玩家视角切换、公共事件时间线、最近结算卡片、教学推荐高亮等联调。 -- 2026-03-20 当日新增一轮前端结构收口: +- 2026-03-20 当日新增前端结构收口: - 新增 `docs/H5_GAME_PAGE_ARCHITECTURE.md`,完成 `S1-08` 页面信息架构与拆分方案。 - 前端共享类型已抽到 `frontend/src/types/game.ts`。 + - 复盘类型已抽到 `frontend/src/types/review.ts`。 - UI 标签映射与事件/结算格式化函数已抽到 `frontend/src/utils/gameUi.ts`。 - - 已拆出展示组件:`GameActionDock.vue`、`GameMessageStack.vue`、`PublicEventTimeline.vue`。 - - `App.vue` 当前定位已经收敛为“页面容器 + 请求/订阅协调层”,便于下一轮继续拆 `RoomPage / GamePage / ReviewPage`。 + - 顶层页面外壳已拆出:`AppShell.vue`。 + - 页面级区块组件已拆出:`RoomWorkspace.vue`、`GameWorkspace.vue`。 + - 房间流组件已拆出:`RoomControlPanel.vue`、`RoomLobbyPanel.vue`。 + - 对局展示组件已拆出:`GameActionDock.vue`、`GameMessageStack.vue`、`PublicEventTimeline.vue`、`ViewSwitchPanel.vue`、`SelfHandPanel.vue`、`PublicSeatBoard.vue`。 + - `pages/` 目录已建立,当前入口容器已命名为:`RoomPageContainer.vue`、`GamePageContainer.vue`。 + - `ReviewPageContainer.vue` 已对齐后端 `ReviewSummaryResponse` 协议,并支持手动加载 demo 复盘数据,但尚未接入真实复盘数据和路由。 +- 2026-03-20 当日新增最小复盘协议骨架: + - 后端新增 `review` 包,包含 `ReviewSummaryResponse`、`ReviewSettlementItem`、`ReviewMistakeItem`、`ReviewTrainingFocusItem`。 + - 后端新增 `ReviewService`,当前提供演示复盘数据。 + - 示例接口已开放:`GET /api/demo/review`。 + - 前端 `App.vue` 已能手动加载这条接口并把数据传入 `ReviewPageContainer`。 + - `DemoGameServiceTest` 已新增复盘示例测试,当前总测试数为 55。 - 2026-03-20 当日还修复了 `GameSessionServiceTest` 中两条“过水不胡”测试的脆弱构造,改为显式控制响应胡候选与后续安全弃牌,避免依赖随机初始牌与中间牌路。 - 当前验证状态:`cd backend && mvn test` 通过;`cd frontend && npm run build` 通过。 - 注释约定继续有效:后端复杂规则、前端复杂交互、后续数据库脚本和迁移都要补适当偏多的中文注释,尤其说明规则判断、状态切换、消息边界与字段语义。 \ No newline at end of file diff --git a/.serena/memories/review_service_v1.md b/.serena/memories/review_service_v1.md new file mode 100644 index 0000000..ee5f0da --- /dev/null +++ b/.serena/memories/review_service_v1.md @@ -0,0 +1,16 @@ +# 局后复盘服务 V1(2026-03-20) +- 已移除 demo 复盘链路:`DemoGameController` 不再暴露 `GET /api/demo/review`,`DemoGameService` 也已移除 demo review 生成逻辑。 +- 新增真实复盘接口:`GET /api/games/{gameId}/review?userId={userId}`。 +- `ReviewController` 负责暴露接口,`ReviewService` 负责基于真实 `GameSession` 和 `settlementHistory` 生成 `ReviewSummaryResponse`。 +- `GameSessionService` 新增只读查询口 `getSessionForReview(String gameId)`,当前仅供复盘服务读取内存态会话;未引入新持久化或快照表。 +- 当前复盘算法范围(KISS/YAGNI 版本): + - 个人总览:读取当前座位最终分数、结果标签、总结文案。 + - 关键结算:从 `settlementHistory` 中筛出与该座位直接相关的结算,生成标题、摘要、分值和番型/结算标签。 + - 关键失误:仅基于真实负向结算生成启发式问题项,当前覆盖点炮、自摸失分、抢杠胡、退税、查叫、明杠/杠类被动付分。 + - 训练方向:基于负向结算类型和是否有正向胡牌样本,生成风险控制、成叫效率、杠牌时机、基础番型等训练建议。 +- 当前限制: + - 仍是内存态复盘,服务重启后对局与复盘数据会丢失。 + - 还没有逐手牌谱回放、动作级失误定位、个人可见信息回放时间线。 + - `mistakeInsights` 仍是启发式生成,不是严格牌效/安牌分析。 +- 前端已改为手动加载当前真实对局/当前视角复盘;切换视角或切换对局时会清空旧复盘,避免显示过期摘要。 +- 已验证:`cd backend && mvn test` 通过;`cd frontend && npm run build` 通过。 \ No newline at end of file diff --git a/backend/src/main/java/com/xuezhanmaster/game/controller/DemoGameController.java b/backend/src/main/java/com/xuezhanmaster/game/controller/DemoGameController.java index 4c1ec4b..63d5e71 100644 --- a/backend/src/main/java/com/xuezhanmaster/game/controller/DemoGameController.java +++ b/backend/src/main/java/com/xuezhanmaster/game/controller/DemoGameController.java @@ -28,4 +28,3 @@ public class DemoGameController { return ApiResponse.success(demoGameService.createDemoTeachingAdvice()); } } - diff --git a/backend/src/main/java/com/xuezhanmaster/game/service/GameSessionService.java b/backend/src/main/java/com/xuezhanmaster/game/service/GameSessionService.java index 491925f..3f9427d 100644 --- a/backend/src/main/java/com/xuezhanmaster/game/service/GameSessionService.java +++ b/backend/src/main/java/com/xuezhanmaster/game/service/GameSessionService.java @@ -107,6 +107,14 @@ public class GameSessionService { return toStateResponse(session, userId); } + /** + * 复盘服务当前仍直接消费内存态对局与结算历史, + * 这里先提供只读查询入口,避免 review 包直接接触会话仓储细节。 + */ + public GameSession getSessionForReview(String gameId) { + return getRequiredSession(gameId); + } + public GameStateResponse performAction(String gameId, GameActionRequest request) { GameSession session = getRequiredSession(gameId); ActionType actionType = parseActionType(request.actionType()); diff --git a/backend/src/main/java/com/xuezhanmaster/review/controller/ReviewController.java b/backend/src/main/java/com/xuezhanmaster/review/controller/ReviewController.java new file mode 100644 index 0000000..d4299a0 --- /dev/null +++ b/backend/src/main/java/com/xuezhanmaster/review/controller/ReviewController.java @@ -0,0 +1,29 @@ +package com.xuezhanmaster.review.controller; + +import com.xuezhanmaster.common.api.ApiResponse; +import com.xuezhanmaster.review.dto.ReviewSummaryResponse; +import com.xuezhanmaster.review.service.ReviewService; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api") +public class ReviewController { + + private final ReviewService reviewService; + + public ReviewController(ReviewService reviewService) { + this.reviewService = reviewService; + } + + @GetMapping("/games/{gameId}/review") + public ApiResponse review( + @PathVariable String gameId, + @RequestParam String userId + ) { + return ApiResponse.success(reviewService.createGameReviewSummary(gameId, userId)); + } +} diff --git a/backend/src/main/java/com/xuezhanmaster/review/dto/ReviewMistakeItem.java b/backend/src/main/java/com/xuezhanmaster/review/dto/ReviewMistakeItem.java new file mode 100644 index 0000000..26ba88a --- /dev/null +++ b/backend/src/main/java/com/xuezhanmaster/review/dto/ReviewMistakeItem.java @@ -0,0 +1,13 @@ +package com.xuezhanmaster.review.dto; + +/** + * 复盘页里的“关键失误”条目。 + * 字段口径优先服务 H5 展示与后续训练题沉淀,不先做复杂评分模型。 + */ +public record ReviewMistakeItem( + String severity, + String title, + String issue, + String suggestion +) { +} diff --git a/backend/src/main/java/com/xuezhanmaster/review/dto/ReviewSettlementItem.java b/backend/src/main/java/com/xuezhanmaster/review/dto/ReviewSettlementItem.java new file mode 100644 index 0000000..d468156 --- /dev/null +++ b/backend/src/main/java/com/xuezhanmaster/review/dto/ReviewSettlementItem.java @@ -0,0 +1,15 @@ +package com.xuezhanmaster.review.dto; + +import java.util.List; + +/** + * 复盘页里的“关键结算节点”条目。 + * 当前先用扁平结构表达,后续接真实局后数据时再决定是否拆更细的事件层级。 + */ +public record ReviewSettlementItem( + String title, + String summary, + int scoreDelta, + List fanLabels +) { +} diff --git a/backend/src/main/java/com/xuezhanmaster/review/dto/ReviewSummaryResponse.java b/backend/src/main/java/com/xuezhanmaster/review/dto/ReviewSummaryResponse.java new file mode 100644 index 0000000..2d7607d --- /dev/null +++ b/backend/src/main/java/com/xuezhanmaster/review/dto/ReviewSummaryResponse.java @@ -0,0 +1,21 @@ +package com.xuezhanmaster.review.dto; + +import java.util.List; + +/** + * 局后复盘页的最小协议骨架。 + * 当前先覆盖“总览、关键失误、训练方向”三块正式页面必需信息,后续再按真实复盘算法逐步扩展。 + */ +public record ReviewSummaryResponse( + String gameId, + String userId, + String playerNickname, + int seatNo, + int finalScore, + String resultLabel, + String conclusion, + List settlementTimeline, + List mistakeInsights, + List trainingFocuses +) { +} diff --git a/backend/src/main/java/com/xuezhanmaster/review/dto/ReviewTrainingFocusItem.java b/backend/src/main/java/com/xuezhanmaster/review/dto/ReviewTrainingFocusItem.java new file mode 100644 index 0000000..27d4a13 --- /dev/null +++ b/backend/src/main/java/com/xuezhanmaster/review/dto/ReviewTrainingFocusItem.java @@ -0,0 +1,12 @@ +package com.xuezhanmaster.review.dto; + +/** + * 复盘页里的“后续训练方向”条目。 + * 当前先保留最小训练类型标签,避免过早引入大而全训练体系。 + */ +public record ReviewTrainingFocusItem( + String drillType, + String title, + String description +) { +} diff --git a/backend/src/main/java/com/xuezhanmaster/review/service/ReviewService.java b/backend/src/main/java/com/xuezhanmaster/review/service/ReviewService.java new file mode 100644 index 0000000..a21217a --- /dev/null +++ b/backend/src/main/java/com/xuezhanmaster/review/service/ReviewService.java @@ -0,0 +1,400 @@ +package com.xuezhanmaster.review.service; + +import com.xuezhanmaster.common.exception.BusinessException; +import com.xuezhanmaster.game.domain.GameSeat; +import com.xuezhanmaster.game.domain.GameSession; +import com.xuezhanmaster.game.domain.ScoreChange; +import com.xuezhanmaster.game.domain.SettlementFan; +import com.xuezhanmaster.game.domain.SettlementResult; +import com.xuezhanmaster.game.domain.SettlementType; +import com.xuezhanmaster.game.service.GameSessionService; +import com.xuezhanmaster.review.dto.ReviewMistakeItem; +import com.xuezhanmaster.review.dto.ReviewSettlementItem; +import com.xuezhanmaster.review.dto.ReviewSummaryResponse; +import com.xuezhanmaster.review.dto.ReviewTrainingFocusItem; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; + +@Service +public class ReviewService { + + private final GameSessionService gameSessionService; + + public ReviewService(GameSessionService gameSessionService) { + this.gameSessionService = gameSessionService; + } + + public ReviewSummaryResponse createGameReviewSummary(String gameId, String userId) { + GameSession session = gameSessionService.getSessionForReview(gameId); + GameSeat reviewSeat = session.getTable().getSeats().stream() + .filter(seat -> seat.getPlayerId().equals(userId)) + .findFirst() + .orElseThrow(() -> new BusinessException("GAME_SEAT_NOT_FOUND", "当前玩家不在对局中")); + + List settlementHistory = List.copyOf(session.getSettlementHistory()); + List settlementTimeline = buildSettlementTimeline(settlementHistory, reviewSeat.getSeatNo()); + List mistakeInsights = buildMistakeInsights(settlementHistory, reviewSeat.getSeatNo()); + List trainingFocuses = buildTrainingFocuses( + settlementHistory, + reviewSeat.getSeatNo(), + reviewSeat.getScore(), + mistakeInsights + ); + + return new ReviewSummaryResponse( + session.getGameId(), + reviewSeat.getPlayerId(), + reviewSeat.getNickname(), + reviewSeat.getSeatNo(), + reviewSeat.getScore(), + buildResultLabel(reviewSeat.getScore()), + buildConclusion(reviewSeat, settlementTimeline, mistakeInsights), + settlementTimeline, + mistakeInsights, + trainingFocuses + ); + } + + private List buildSettlementTimeline(List settlementHistory, int seatNo) { + List items = new ArrayList<>(); + for (SettlementResult settlementResult : settlementHistory) { + Integer scoreDelta = resolveSeatDelta(settlementResult, seatNo); + if (scoreDelta == null) { + continue; + } + List fanLabels = buildFanLabels(settlementResult); + items.add(new ReviewSettlementItem( + buildSettlementTitle(settlementResult, scoreDelta), + buildSettlementSummary(settlementResult, scoreDelta, fanLabels), + scoreDelta, + fanLabels + )); + } + if (items.isEmpty()) { + items.add(new ReviewSettlementItem( + "暂无个人结算", + "当前对局还没有产生与你直接相关的结算变化,复盘摘要会在出现真实得失分后逐步丰富。", + 0, + List.of("等待结算") + )); + } + return List.copyOf(items); + } + + private List buildMistakeInsights(List settlementHistory, int seatNo) { + List negativeSettlements = settlementHistory.stream() + .filter(result -> { + Integer delta = resolveSeatDelta(result, seatNo); + return delta != null && delta < 0; + }) + .sorted(Comparator.comparingInt((SettlementResult result) -> Math.abs(resolveSeatDelta(result, seatNo))).reversed()) + .limit(3) + .toList(); + + List items = new ArrayList<>(); + for (SettlementResult settlementResult : negativeSettlements) { + int scoreDelta = resolveSeatDelta(settlementResult, seatNo); + items.add(switch (settlementResult.settlementType()) { + case DIAN_PAO_HU -> new ReviewMistakeItem( + "HIGH", + "点炮导致失分", + "你在他人弃牌胡结算中承担了 " + formatScore(scoreDelta) + ",说明中后盘危险张控制仍有明显缺口。", + "当对手已经副露成型或番型抬高时,优先保留现成安全张,避免继续压高危中张。" + ); + case QIANG_GANG_HU -> new ReviewMistakeItem( + "HIGH", + "补杠时机过激", + "你在补杠后被对手抢杠胡,直接产生 " + formatScore(scoreDelta) + " 的回撤。", + "补杠前先检查场上是否已出现高压听牌信号,必要时放弃补杠收益,优先确保不放大失分。" + ); + case ZI_MO_HU -> new ReviewMistakeItem( + "MEDIUM", + "未能压住对手自摸", + "对手自摸时你被扣除 " + formatScore(scoreDelta) + ",说明本局在速度或成叫质量上没有形成足够压制。", + "后续训练应强化中盘成型速度判断,避免在明显落后牌速时仍维持松散手型。" + ); + case TUI_SHUI -> new ReviewMistakeItem( + "MEDIUM", + "杠分未守住", + "本局出现退税,导致你回吐 " + formatScore(scoreDelta) + ",说明前序杠牌收益没有稳定兑现。", + "练习在流局风险升高时复盘杠牌收益与听牌质量,避免为短期税分牺牲整体成叫。" + ); + case CHA_JIAO -> new ReviewMistakeItem( + "HIGH", + "流局未成叫", + "流局查叫阶段你承担了 " + formatScore(scoreDelta) + ",反映出收尾阶段的成叫效率不足。", + "进入残局后要更早切换到保叫路线,优先确保最小可支付听牌,而不是继续追求高番远型。" + ); + case MING_GANG -> new ReviewMistakeItem( + "MEDIUM", + "放杠失分", + "你在他人明杠结算里承担了 " + formatScore(scoreDelta) + ",说明对明显碰后加杠的防范还不够。", + "看到对手碰后,应更早记录其可能补强的牌张,减少继续喂牌或协助做大的情况。" + ); + case BU_GANG, AN_GANG -> new ReviewMistakeItem( + "LOW", + "杠分压制不足", + "对手通过杠牌从你这里拿走了 " + formatScore(scoreDelta) + ",本局资源交换略偏被动。", + "后续可专项训练杠前后局势判断,明确什么时候该抢速度,什么时候该减少被动付分。" + ); + }); + } + return List.copyOf(items); + } + + private List buildTrainingFocuses( + List settlementHistory, + int seatNo, + int finalScore, + List mistakeInsights + ) { + List items = new ArrayList<>(); + Set addedDrillTypes = new LinkedHashSet<>(); + + if (hasNegativeSettlement(settlementHistory, seatNo, SettlementType.DIAN_PAO_HU, SettlementType.QIANG_GANG_HU, SettlementType.ZI_MO_HU)) { + addTrainingFocus( + items, + addedDrillTypes, + "RISK_CONTROL", + "危险张与守备节奏训练", + "围绕真实失分节点复盘中后盘危险张排序,建立“副露压力上升时先保底不放炮”的判断习惯。" + ); + } + + if (hasNegativeSettlement(settlementHistory, seatNo, SettlementType.CHA_JIAO) || finalScore <= 0) { + addTrainingFocus( + items, + addedDrillTypes, + "READY_HAND", + "成叫效率训练", + "重点训练残局从做大切换到保叫的时机,避免在查叫阶段继续承担被动失分。" + ); + } + + if (hasSettlement(settlementHistory, seatNo, SettlementType.MING_GANG, SettlementType.BU_GANG, SettlementType.AN_GANG, SettlementType.TUI_SHUI)) { + addTrainingFocus( + items, + addedDrillTypes, + "GANG_TIMING", + "杠牌收益判断训练", + "把本局杠牌、退税与抢杠相关节点串起来看,训练“能不能杠”和“杠完是否值得”的双重判断。" + ); + } + + if (!hasPositiveHu(settlementHistory, seatNo)) { + addTrainingFocus( + items, + addedDrillTypes, + "PATTERN_BUILDING", + "基础番型成型训练", + "当前结算里你的直接胡牌样本不足,建议先从常见番型与听牌速度训练入手,提升稳定得分能力。" + ); + } + + if (items.isEmpty()) { + addTrainingFocus( + items, + addedDrillTypes, + "ADVANTAGE_CONVERT", + "优势局扩大训练", + "本局没有明显失误结算,后续可把重点放在如何把已有领先进一步转化为更稳定的收尾优势。" + ); + } + + if (items.size() == 1 && !mistakeInsights.isEmpty()) { + addTrainingFocus( + items, + addedDrillTypes, + "REVIEW_REPEAT", + "关键失分复现训练", + "把本局最高代价的 1 到 2 个结算节点单独复现,形成固定复盘模板,提升下一局的可迁移性。" + ); + } + + return List.copyOf(items); + } + + private void addTrainingFocus( + List items, + Set addedDrillTypes, + String drillType, + String title, + String description + ) { + if (addedDrillTypes.add(drillType)) { + items.add(new ReviewTrainingFocusItem(drillType, title, description)); + } + } + + private String buildResultLabel(int finalScore) { + if (finalScore > 0) { + return "本局净胜"; + } + if (finalScore < 0) { + return "本局失分"; + } + return "本局持平"; + } + + private String buildConclusion( + GameSeat reviewSeat, + List settlementTimeline, + List mistakeInsights + ) { + long positiveSettlements = settlementTimeline.stream() + .filter(item -> item.scoreDelta() > 0) + .count(); + long negativeSettlements = settlementTimeline.stream() + .filter(item -> item.scoreDelta() < 0) + .count(); + + if (reviewSeat.getScore() > 0) { + if (negativeSettlements > 0 && !mistakeInsights.isEmpty()) { + return "本局净胜 " + formatScore(reviewSeat.getScore()) + + ",虽然通过 " + positiveSettlements + " 次真实得分节点建立优势,但仍暴露出“" + + mistakeInsights.get(0).title() + "”这类回撤点。"; + } + return "本局净胜 " + formatScore(reviewSeat.getScore()) + + ",主要依靠 " + positiveSettlements + " 次真实结算建立优势,整体节奏相对稳定。"; + } + if (reviewSeat.getScore() < 0) { + if (!mistakeInsights.isEmpty()) { + return "本局净失 " + formatScore(reviewSeat.getScore()) + + ",关键回撤集中在“" + mistakeInsights.get(0).title() + + "”,建议优先围绕该节点做针对性训练。"; + } + return "本局净失 " + formatScore(reviewSeat.getScore()) + + ",当前直接失分样本不多,但结算收益不足,后续需要优先提升稳定成叫与基础得分能力。"; + } + return "本局最终持平,期间共有 " + positiveSettlements + " 次得分与 " + negativeSettlements + + " 次失分节点,后续应重点复盘收益转化是否足够稳定。"; + } + + private boolean hasNegativeSettlement(List settlementHistory, int seatNo, SettlementType... settlementTypes) { + Set acceptedTypes = Set.of(settlementTypes); + return settlementHistory.stream() + .filter(result -> acceptedTypes.contains(result.settlementType())) + .anyMatch(result -> { + Integer delta = resolveSeatDelta(result, seatNo); + return delta != null && delta < 0; + }); + } + + private boolean hasSettlement(List settlementHistory, int seatNo, SettlementType... settlementTypes) { + Set acceptedTypes = Set.of(settlementTypes); + return settlementHistory.stream() + .filter(result -> acceptedTypes.contains(result.settlementType())) + .anyMatch(result -> resolveSeatDelta(result, seatNo) != null); + } + + private boolean hasPositiveHu(List settlementHistory, int seatNo) { + return settlementHistory.stream() + .filter(result -> result.settlementType() == SettlementType.DIAN_PAO_HU + || result.settlementType() == SettlementType.ZI_MO_HU + || result.settlementType() == SettlementType.QIANG_GANG_HU) + .anyMatch(result -> { + Integer delta = resolveSeatDelta(result, seatNo); + return delta != null && delta > 0; + }); + } + + private Integer resolveSeatDelta(SettlementResult settlementResult, int seatNo) { + for (ScoreChange scoreChange : settlementResult.scoreChanges()) { + if (scoreChange.seatNo() == seatNo) { + return scoreChange.delta(); + } + } + return null; + } + + private List buildFanLabels(SettlementResult settlementResult) { + if (!settlementResult.settlementDetail().fans().isEmpty()) { + return settlementResult.settlementDetail().fans().stream() + .map(SettlementFan::label) + .toList(); + } + return List.of(settlementTypeLabel(settlementResult.settlementType())); + } + + private String buildSettlementTitle(SettlementResult settlementResult, int scoreDelta) { + return switch (settlementResult.settlementType()) { + case DIAN_PAO_HU -> scoreDelta > 0 ? "点炮胡得分" : "点炮失分"; + case ZI_MO_HU -> scoreDelta > 0 ? "自摸胡得分" : "对手自摸失分"; + case QIANG_GANG_HU -> scoreDelta > 0 ? "抢杠胡得分" : "补杠被抢"; + case MING_GANG -> scoreDelta > 0 ? "明杠收益" : "放杠失分"; + case BU_GANG -> scoreDelta > 0 ? "补杠收益" : "对手补杠失分"; + case AN_GANG -> scoreDelta > 0 ? "暗杠收益" : "对手暗杠失分"; + case TUI_SHUI -> scoreDelta > 0 ? "退税回补" : "杠分被退税"; + case CHA_JIAO -> scoreDelta > 0 ? "查叫收益" : "流局查叫失分"; + }; + } + + private String buildSettlementSummary( + SettlementResult settlementResult, + int scoreDelta, + List fanLabels + ) { + String fanSummary = fanLabels.isEmpty() ? "" : ",标签:" + String.join(" / ", fanLabels); + return switch (settlementResult.settlementType()) { + case DIAN_PAO_HU -> scoreDelta > 0 + ? "你通过他人弃牌完成胡牌,获得 " + formatScore(scoreDelta) + + ",来源座位 " + settlementResult.sourceSeatNo() + fanSummary + "。" + : "你向座位 " + settlementResult.actorSeatNo() + " 点炮,产生 " + + formatScore(scoreDelta) + fanSummary + "。"; + case ZI_MO_HU -> scoreDelta > 0 + ? "你完成自摸,从仍未胡牌对手处累计获得 " + formatScore(scoreDelta) + fanSummary + "。" + : "座位 " + settlementResult.actorSeatNo() + " 自摸时,你承担了 " + + formatScore(scoreDelta) + fanSummary + "。"; + case QIANG_GANG_HU -> scoreDelta > 0 + ? "你在抢杠窗口完成胡牌,获得 " + formatScore(scoreDelta) + + ",目标来自座位 " + settlementResult.sourceSeatNo() + fanSummary + "。" + : "你补杠时被座位 " + settlementResult.actorSeatNo() + " 抢杠胡,损失 " + + formatScore(scoreDelta) + fanSummary + "。"; + case MING_GANG -> scoreDelta > 0 + ? "你通过明杠从座位 " + settlementResult.sourceSeatNo() + " 取得 " + + formatScore(scoreDelta) + fanSummary + "。" + : "你为座位 " + settlementResult.actorSeatNo() + " 的明杠支付了 " + + formatScore(scoreDelta) + fanSummary + "。"; + case BU_GANG -> scoreDelta > 0 + ? "你完成补杠,从其余未胡玩家处累计获得 " + formatScore(scoreDelta) + fanSummary + "。" + : "座位 " + settlementResult.actorSeatNo() + " 补杠时,你承担了 " + + formatScore(scoreDelta) + fanSummary + "。"; + case AN_GANG -> scoreDelta > 0 + ? "你完成暗杠,从其余未胡玩家处累计获得 " + formatScore(scoreDelta) + fanSummary + "。" + : "座位 " + settlementResult.actorSeatNo() + " 暗杠时,你承担了 " + + formatScore(scoreDelta) + fanSummary + "。"; + case TUI_SHUI -> scoreDelta > 0 + ? "你在局末获得退税回补,拿回 " + formatScore(scoreDelta) + + ",来源座位 " + settlementResult.sourceSeatNo() + "。" + : "你被执行退税,向座位 " + settlementResult.actorSeatNo() + " 回吐了 " + + formatScore(scoreDelta) + "。"; + case CHA_JIAO -> scoreDelta > 0 + ? "流局查叫阶段,你从座位 " + settlementResult.sourceSeatNo() + " 获得 " + + formatScore(scoreDelta) + fanSummary + "。" + : "流局查叫阶段,你向座位 " + settlementResult.actorSeatNo() + " 支付了 " + + formatScore(scoreDelta) + fanSummary + "。"; + }; + } + + private String settlementTypeLabel(SettlementType settlementType) { + return switch (settlementType) { + case DIAN_PAO_HU -> "点炮胡"; + case QIANG_GANG_HU -> "抢杠胡"; + case ZI_MO_HU -> "自摸胡"; + case BU_GANG -> "补杠"; + case MING_GANG -> "明杠"; + case AN_GANG -> "暗杠"; + case TUI_SHUI -> "退税"; + case CHA_JIAO -> "查叫"; + }; + } + + private String formatScore(int scoreDelta) { + return scoreDelta > 0 ? "+" + scoreDelta : String.valueOf(scoreDelta); + } +} diff --git a/backend/src/test/java/com/xuezhanmaster/review/service/ReviewServiceTest.java b/backend/src/test/java/com/xuezhanmaster/review/service/ReviewServiceTest.java new file mode 100644 index 0000000..76e7d4b --- /dev/null +++ b/backend/src/test/java/com/xuezhanmaster/review/service/ReviewServiceTest.java @@ -0,0 +1,97 @@ +package com.xuezhanmaster.review.service; + +import com.xuezhanmaster.game.domain.GameSession; +import com.xuezhanmaster.game.domain.SettlementDetail; +import com.xuezhanmaster.game.domain.SettlementFan; +import com.xuezhanmaster.game.domain.SettlementResult; +import com.xuezhanmaster.game.domain.TileSuit; +import com.xuezhanmaster.game.dto.GameStateResponse; +import com.xuezhanmaster.game.engine.GameEngine; +import com.xuezhanmaster.game.service.BloodBattleScoringService; +import com.xuezhanmaster.game.service.DeckFactory; +import com.xuezhanmaster.game.service.GameActionProcessor; +import com.xuezhanmaster.game.service.GameSessionService; +import com.xuezhanmaster.game.service.HuEvaluator; +import com.xuezhanmaster.game.service.ResponseActionResolver; +import com.xuezhanmaster.game.service.ResponseActionWindowBuilder; +import com.xuezhanmaster.game.service.SettlementService; +import com.xuezhanmaster.review.dto.ReviewSummaryResponse; +import com.xuezhanmaster.room.dto.CreateRoomRequest; +import com.xuezhanmaster.room.dto.RoomSummaryResponse; +import com.xuezhanmaster.room.dto.ToggleReadyRequest; +import com.xuezhanmaster.room.service.RoomService; +import com.xuezhanmaster.strategy.service.StrategyService; +import com.xuezhanmaster.teaching.service.PlayerVisibilityService; +import com.xuezhanmaster.teaching.service.TeachingService; +import com.xuezhanmaster.ws.service.GameMessagePublisher; +import org.junit.jupiter.api.Test; +import org.springframework.messaging.simp.SimpMessagingTemplate; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; + +class ReviewServiceTest { + + private final RoomService roomService = new RoomService(); + private final HuEvaluator huEvaluator = new HuEvaluator(); + private final BloodBattleScoringService bloodBattleScoringService = new BloodBattleScoringService(huEvaluator); + private final SettlementService settlementService = new SettlementService(bloodBattleScoringService); + private final GameSessionService gameSessionService = new GameSessionService( + roomService, + new GameEngine(new DeckFactory()), + new GameActionProcessor(huEvaluator), + new ResponseActionWindowBuilder(huEvaluator), + new ResponseActionResolver(), + settlementService, + bloodBattleScoringService, + huEvaluator, + new StrategyService(), + new PlayerVisibilityService(), + new TeachingService(), + new GameMessagePublisher(mock(SimpMessagingTemplate.class)) + ); + private final ReviewService reviewService = new ReviewService(gameSessionService); + + @Test + void shouldBuildReviewSummaryFromRealSessionSettlementHistory() { + RoomSummaryResponse room = roomService.createRoom(new CreateRoomRequest("host-1", true)); + roomService.toggleReady(room.roomId(), new ToggleReadyRequest("host-1", true)); + + GameStateResponse started = gameSessionService.startGame(room.roomId(), "host-1"); + gameSessionService.selectLackSuit(started.gameId(), "host-1", TileSuit.WAN.name()); + GameSession session = gameSessionService.getSessionForReview(started.gameId()); + + SettlementResult positiveGang = settlementService.settleSupplementalGang(session.getTable(), 0, "三万"); + session.getSettlementHistory().add(positiveGang); + SettlementResult negativeChaJiao = settlementService.settleChaJiao( + session.getTable(), + 2, + 0, + "七筒", + new SettlementDetail(1, 2, 4, List.of( + new SettlementFan("QING_YI_SE", "清一色", 2) + )) + ); + session.getSettlementHistory().add(negativeChaJiao); + + ReviewSummaryResponse review = reviewService.createGameReviewSummary(started.gameId(), "host-1"); + + assertThat(review.gameId()).isEqualTo(started.gameId()); + assertThat(review.userId()).isEqualTo("host-1"); + assertThat(review.playerNickname()).isEqualTo("Host"); + assertThat(review.finalScore()).isEqualTo(-1); + assertThat(review.resultLabel()).isEqualTo("本局失分"); + assertThat(review.settlementTimeline()).hasSize(2); + assertThat(review.settlementTimeline()) + .extracting(item -> item.title()) + .containsExactly("补杠收益", "流局查叫失分"); + assertThat(review.mistakeInsights()) + .extracting(item -> item.title()) + .contains("流局未成叫"); + assertThat(review.trainingFocuses()) + .extracting(item -> item.drillType()) + .contains("READY_HAND", "GANG_TIMING"); + } +} diff --git a/docs/DEVELOPMENT_PLAN.md b/docs/DEVELOPMENT_PLAN.md index 68213e4..4a08f78 100644 --- a/docs/DEVELOPMENT_PLAN.md +++ b/docs/DEVELOPMENT_PLAN.md @@ -272,6 +272,7 @@ room 房间、座位、加入、准备 game 对局、动作、状态、事件、动作处理 strategy 推荐动作、AI 决策 teaching 教学建议、玩家可见状态 +review 局后复盘、错题与训练方向协议骨架 web 演示或基础接口 ws WebSocket 配置与消息发布 ``` @@ -287,11 +288,24 @@ ws WebSocket 配置与消息发布 同时,已完成第一轮最小拆分准备: - 共享类型:`frontend/src/types/game.ts` +- 复盘类型:`frontend/src/types/review.ts` - UI 格式化工具:`frontend/src/utils/gameUi.ts` - 展示组件: + - `frontend/src/components/AppShell.vue` + - `frontend/src/components/RoomWorkspace.vue` + - `frontend/src/components/GameWorkspace.vue` + - `frontend/src/components/RoomControlPanel.vue` + - `frontend/src/components/RoomLobbyPanel.vue` - `frontend/src/components/GameActionDock.vue` - `frontend/src/components/GameMessageStack.vue` - `frontend/src/components/PublicEventTimeline.vue` + - `frontend/src/components/ViewSwitchPanel.vue` + - `frontend/src/components/SelfHandPanel.vue` + - `frontend/src/components/PublicSeatBoard.vue` +- 页面级容器目录已建立: + - `frontend/src/pages/RoomPageContainer.vue` + - `frontend/src/pages/GamePageContainer.vue` + - `frontend/src/pages/ReviewPageContainer.vue` 后续建议按页面拆分为: diff --git a/docs/H5_GAME_PAGE_ARCHITECTURE.md b/docs/H5_GAME_PAGE_ARCHITECTURE.md index a684ae8..a74e5d2 100644 --- a/docs/H5_GAME_PAGE_ARCHITECTURE.md +++ b/docs/H5_GAME_PAGE_ARCHITECTURE.md @@ -65,6 +65,22 @@ 当前阶段不要求一次性引入完整路由,但组件组织和文档命名要按这个终态准备。 +当前代码层已经落下对应的页面级容器命名: + +- `frontend/src/pages/RoomPageContainer.vue` +- `frontend/src/pages/GamePageContainer.vue` +- `frontend/src/pages/ReviewPageContainer.vue` + +其中 `ReviewPageContainer` 当前仍是占位实现,用于固定页面职责,不代表已经接入真实复盘数据。 + +当前还补了一条最小演示协议入口: + +- 后端真实接口:`GET /api/games/{gameId}/review?userId={userId}` + +它的目标不是替代真实局后数据,而是先把前后端在 `ReviewSummaryResponse` 这套字段上的语义对齐。 + +当前前端已经能在不接入正式路由的前提下,手动加载这条 demo 复盘数据并渲染 `ReviewPageContainer`。 + ### 3.2 当前这一轮的落地点 本轮先聚焦 `GamePage`。 diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 43955d2..c77b415 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -1,9 +1,10 @@ diff --git a/frontend/src/components/AppShell.vue b/frontend/src/components/AppShell.vue new file mode 100644 index 0000000..84b17ae --- /dev/null +++ b/frontend/src/components/AppShell.vue @@ -0,0 +1,31 @@ + + + diff --git a/frontend/src/components/GameWorkspace.vue b/frontend/src/components/GameWorkspace.vue new file mode 100644 index 0000000..32bc030 --- /dev/null +++ b/frontend/src/components/GameWorkspace.vue @@ -0,0 +1,163 @@ + + + diff --git a/frontend/src/components/PublicSeatBoard.vue b/frontend/src/components/PublicSeatBoard.vue new file mode 100644 index 0000000..17ab9f2 --- /dev/null +++ b/frontend/src/components/PublicSeatBoard.vue @@ -0,0 +1,39 @@ + + + diff --git a/frontend/src/components/RoomControlPanel.vue b/frontend/src/components/RoomControlPanel.vue new file mode 100644 index 0000000..fb60bf7 --- /dev/null +++ b/frontend/src/components/RoomControlPanel.vue @@ -0,0 +1,97 @@ + + + diff --git a/frontend/src/components/RoomLobbyPanel.vue b/frontend/src/components/RoomLobbyPanel.vue new file mode 100644 index 0000000..2ba93b3 --- /dev/null +++ b/frontend/src/components/RoomLobbyPanel.vue @@ -0,0 +1,68 @@ + + + diff --git a/frontend/src/components/RoomWorkspace.vue b/frontend/src/components/RoomWorkspace.vue new file mode 100644 index 0000000..4486016 --- /dev/null +++ b/frontend/src/components/RoomWorkspace.vue @@ -0,0 +1,68 @@ + + + diff --git a/frontend/src/components/SelfHandPanel.vue b/frontend/src/components/SelfHandPanel.vue new file mode 100644 index 0000000..242308a --- /dev/null +++ b/frontend/src/components/SelfHandPanel.vue @@ -0,0 +1,60 @@ + + + diff --git a/frontend/src/components/ViewSwitchPanel.vue b/frontend/src/components/ViewSwitchPanel.vue new file mode 100644 index 0000000..3f50841 --- /dev/null +++ b/frontend/src/components/ViewSwitchPanel.vue @@ -0,0 +1,37 @@ + + + diff --git a/frontend/src/pages/GamePageContainer.vue b/frontend/src/pages/GamePageContainer.vue new file mode 100644 index 0000000..e8c09e2 --- /dev/null +++ b/frontend/src/pages/GamePageContainer.vue @@ -0,0 +1,90 @@ + + + diff --git a/frontend/src/pages/ReviewPageContainer.vue b/frontend/src/pages/ReviewPageContainer.vue new file mode 100644 index 0000000..e8fc8c4 --- /dev/null +++ b/frontend/src/pages/ReviewPageContainer.vue @@ -0,0 +1,156 @@ + + + diff --git a/frontend/src/pages/RoomPageContainer.vue b/frontend/src/pages/RoomPageContainer.vue new file mode 100644 index 0000000..264ba10 --- /dev/null +++ b/frontend/src/pages/RoomPageContainer.vue @@ -0,0 +1,59 @@ + + + diff --git a/frontend/src/types/review.ts b/frontend/src/types/review.ts new file mode 100644 index 0000000..70b2dfd --- /dev/null +++ b/frontend/src/types/review.ts @@ -0,0 +1,34 @@ +// 复盘页单独维护一份类型定义,避免把“局中状态”和“局后分析”继续混在同一个类型文件里。 + +export type ReviewSettlementItem = { + title: string + summary: string + scoreDelta: number + fanLabels: string[] +} + +export type ReviewMistakeItem = { + severity: string + title: string + issue: string + suggestion: string +} + +export type ReviewTrainingFocusItem = { + drillType: string + title: string + description: string +} + +export type ReviewSummaryResponse = { + gameId: string + userId: string + playerNickname: string + seatNo: number + finalScore: number + resultLabel: string + conclusion: string + settlementTimeline: ReviewSettlementItem[] + mistakeInsights: ReviewMistakeItem[] + trainingFocuses: ReviewTrainingFocusItem[] +}