电影影评+评论:详情浮层接「评价与评论」真功能 laoyang/FamilyBook#27

用户原话(2026-10-28):「鸿蒙端对齐网页端」。观影详情原来只能看平均分。
现在:

1) FbMovieRepo 加影评/评论类型 + reviews/saveReview/deleteReview/
   addReviewComment/deleteReviewComment 五个 API + 解析(含感受目录、评论树、mine 判断)
2) 新组件 FbMovieReviewSheet:我的影评(打分 1-10 星 + 观后感受多选 + 正文 +
   改/删)、全部影评列表(含评论树、回复、逐条删除)
3) FbMovieDetailSheet 加「评价与评论」入口 + 内嵌影评浮层

⚠️ 影评数/均分仍以列表项为准(详情接口不返回,与既有注释一致)。

编译 BUILD SUCCESSFUL;服务端冒烟 _i27_movie_review_api.py 22/0 + 反证命中。
This commit is contained in:
2026-10-28 22:30:09 +08:00
parent 59a9d3df39
commit f1f279f973
3 changed files with 871 additions and 1 deletions
@@ -15,13 +15,14 @@
* 加载中 / 成功 / 失败。别只画成功态 —— 断网时用户会看到"空白浮层"。
*/
import { FbColors, FbMetric } from '../common/Theme';
import { FbColors, FbMetric, fbAlpha } from '../common/Theme';
import { FbModuleDef, fbModuleOf, fbThemeVars } from '../model/Modules';
import { FbMovieAttendeeRow, FbMovieDetail } from '../data/FbMovieRepo';
import { FB_TOKEN_STORE } from '../data/FbTokenStore';
import { FbAvatar, FbRating } from './Widgets';
import { FbSheetRing } from './FbSheetRing';
import { FbSheetClose } from './FbSheetClose';
import { FbMovieReviewSheet } from './FbMovieReviewSheet';
import { fbImageSrc } from '../data/FbAttachQueue';
/**
@@ -45,6 +46,8 @@ export struct FbMovieDetailSheet {
/** 列表项带过来的评分(详情接口不给,见 FbMovieRepo.detail 的说明) */
@Param listRating: number = 0;
@Param listReviewCount: number = 0;
/** 影评/评论浮层是否打开(工单 #27) */
@Local reviewsOpen: boolean = false;
/** 关闭回调 */
@Event onClose: () => void = (): void => {
};
@@ -168,6 +171,21 @@ export struct FbMovieDetailSheet {
if (this.viewerOpen) {
this.viewer()
}
// ---- 影评 + 评论浮层(工单 #27)----
if (this.reviewsOpen && this.detail !== null) {
FbMovieReviewSheet({
movieId: this.detail.id,
movieTitle: this.detail.title,
accent: this.accentColor(),
onClose: (): void => {
this.reviewsOpen = false;
},
onChanged: (): void => {
// 评分/条数可能变了,但详情接口不返回,不在这里强刷
}
})
}
}
.width('100%')
// ⚠️ 高度随内容自适应(浮层是"底部抽屉"形态)。
@@ -417,6 +435,20 @@ export struct FbMovieDetailSheet {
.alignItems(VerticalAlign.Center)
}
// ---- 评价与评论入口(工单 #27)----
Row() {
Text('评价与评论' + (this.listReviewCount > 0 ? '(' + this.listReviewCount.toString() + ')' : ''))
.fontSize(FbMetric.fontSmall)
.fontColor(this.accentColor())
.padding({ left: 12, right: 12, top: 7, bottom: 7 })
.borderRadius(FbMetric.radiusPill)
.backgroundColor(fbAlpha(this.accentColor(), 0.1))
.onClick((): void => {
this.reviewsOpen = true;
})
}
.width('100%')
// ---- 影院 ----
if (d.cinemaName !== '') {
Column({ space: 4 }) {