# 评分器组件开发实战:HarmonyOS ArkTS 五星评分交互应用解析
一、应用概述评分器Star Rating是各类电商、内容平台、生活服务类应用中最常见的交互组件之一。用户通过点击或悬浮操作选择星级评分直观地表达对商品、服务或内容的评价。本文将以 HarmonyOS 原生开发框架 ArkTS 为基础详细解析一个五星评分器组件的完整开发过程涵盖评分展示、交互反馈、悬停预览等核心功能。1.1 功能特性五星评分体系支持 0.5 到 5.0 的评分精度每颗星代表 1 分悬停预览Hover鼠标或手指在星标上悬停时实时显示当前评分值点击确认用户点击确定最终的评分结果动态反馈选中的星标以高亮金色显示未选中的星标显示灰色数值显示实时显示当前评分数值和对应的文字评价如非常好、一般等可配置参数评分组件的星级数量、颜色、大小等均可通过参数配置1.2 适用场景商品评价系统电影/书籍评分服务质量反馈用户满意度调查内容质量评级1.3 技术亮点本组件虽然功能聚焦却涵盖了 ArkTS 开发中的多个关键技术点组件状态管理、触摸事件处理、自定义组件封装、动画反馈、组件间通信等是学习 ArkTS 组件化开发的经典案例。二、技术架构2.1 整体架构概览评分器组件采用容器组件 子组件的层级架构利用 ArkTS 的Component和Builder实现高度模块化。┌────────────────────────────────────────────┐ │ RatingContainer │ │ 评分容器组件 - 状态管理 │ ├────────────────────────────────────────────┤ │ ┌────────────────────────────────────────┐│ │ │ StarComponent ││ │ │ 单个星标组件 - 独立状态 ││ │ │ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ││ │ │ │ Star1│ │ Star2│ │ Star3│ │ Star4│ ││ │ │ └──────┘ └──────┘ └──────┘ └──────┘ ││ │ └────────────────────────────────────────┘│ ├────────────────────────────────────────────┤ │ RatingDisplay评分信息展示区 │ └────────────────────────────────────────────┘2.2 核心数据结构// 评分配置接口 interface RatingConfig { totalStars: number; // 星标总数默认5 starSize: number; // 星标尺寸默认32 activeColor: ResourceColor; // 选中颜色默认金色 inactiveColor: ResourceColor; // 未选中颜色默认灰色 allowHalf: boolean; // 是否允许半星 showText: boolean; // 是否显示评分文本 } // 评分等级映射 const RATING_TEXT_MAP: Recordnumber, string { 0.5: 非常差, 1.0: 差, 1.5: 较差, 2.0: 一般, 2.5: 中等, 3.0: 中上, 3.5: 良好, 4.0: 好, 4.5: 很好, 5.0: 非常好 };2.3 组件层级关系Entry MainPage └── Column (主容器) ├── Text (标题: 请评价我们的服务) └── RatingContainer (自定义评分组件) ├── Row (星标行) │ ├── Star (第1颗星) │ ├── Star (第2颗星) │ ├── Star (第3颗星) │ ├── Star (第4颗星) │ └── Star (第5颗星) ├── Text (评分数值: 4.5) └── Text (评价文本: 非常好)三、核心代码分析3.1 评分容器组件RatingContainer是整个评分器的核心组件负责管理评分状态和处理交互逻辑。Component struct RatingContainer { // 外部传入的配置参数 private config: RatingConfig { totalStars: 5, starSize: 40, activeColor: #FFD700, inactiveColor: #E0E0E0, allowHalf: false, showText: true }; // 内部状态 State currentRating: number 0; // 当前评分值 State hoverRating: number 0; // 悬停时的临时评分值 State isHovering: boolean false; // 是否处于悬停状态 // 对外回调 private onRatingChange?: (rating: number) void; // 计算显示的评分值优先显示悬停值 get displayRating(): number { return this.isHovering ? this.hoverRating : this.currentRating; } // 获取评分的文字描述 get ratingText(): string { const keys Object.keys(RATING_TEXT_MAP).map(Number).sort((a, b) a - b); let closest keys[0]; for (const key of keys) { if (Math.abs(key - this.displayRating) Math.abs(closest - this.displayRating)) { closest key; } } return RATING_TEXT_MAP[closest] || ; } build() { Column({ space: 12 }) { // 星标行 Row({ space: 8 }) { ForEach( Array.from({ length: this.config.totalStars }, (_, i) i 1), (starIndex: number) { StarComponent({ starIndex: starIndex, currentRating: this.displayRating, starSize: this.config.starSize, activeColor: this.config.activeColor, inactiveColor: this.config.inactiveColor, onStarClick: (index: number) { this.handleStarClick(index); }, onStarHover: (index: number) { this.handleStarHover(index); }, onStarLeave: () { this.handleStarLeave(); } }) } ) } // 评分信息展示 if (this.config.showText) { Row({ space: 16 }) { Text(this.displayRating 0 ? this.displayRating.toFixed(1) : 未评分) .fontSize(28) .fontWeight(FontWeight.Bold) .fontColor(this.config.activeColor) Text(this.displayRating 0 ? this.ratingText : 点击星标进行评分) .fontSize(16) .fontColor(#666666) } } } .padding(24) .backgroundColor(Color.White) .borderRadius(16) .shadow({ radius: 8, color: rgba(0, 0, 0, 0.06), offsetX: 0, offsetY: 4 }) } }核心逻辑分析双评分状态currentRating保存用户最终确认的评分hoverRating保存悬停时的临时评分。二者分离可以实现在悬停预览后恢复到原有评分的功能。计算属性displayRating根据是否处于悬停状态返回对应的评分值确保 UI 展示正确的评分。文字匹配ratingText通过计算绝对值最小的差值找到最接近当前评分的文字描述。3.2 单颗星组件StarComponent是评分器的最小单元负责单颗星的渲染和交互事件处理。Component struct StarComponent { private starIndex: number; // 当前星的序号1-based private currentRating: number; // 当前评分值 private starSize: number; // 星标大小 private activeColor: ResourceColor; // 激活颜色 private inactiveColor: ResourceColor; // 未激活颜色 private onStarClick?: (index: number) void; private onStarHover?: (index: number) void; private onStarLeave?: () void; // 计算当前星标的状态 get starState(): full | half | empty { if (this.currentRating this.starIndex) { return full; } else if (this.currentRating this.starIndex - 0.5) { return half; } else { return empty; } } build() { // 使用 Stack 堆叠容器实现半星效果 Stack() { // 灰色背景星未选中 Image($r(app.media.star_empty)) .width(this.starSize) .height(this.starSize) .objectFit(ImageFit.Contain) // 金色前景星选中部分 Image($r(app.media.star_filled)) .width(this.starSize) .height(this.starSize) .objectFit(ImageFit.Contain) .clip(new Rect(0, 0, this.starState full ? this.starSize : this.starState half ? this.starSize / 2 : 0, this.starSize)) .opacity(this.starState empty ? 0 : 1) } .width(this.starSize) .height(this.starSize) .onClick(() { this.onStarClick?.(this.starIndex); }) .onHover((isHover: boolean) { if (isHover) { this.onStarHover?.(this.starIndex); } else { this.onStarLeave?.(); } }) .animation({ duration: 200, curve: Curve.EaseInOut }) } }半星实现原理通过clip属性对金色星标进行裁剪来实现半星效果full状态裁剪宽度为整颗星完全显示金色half状态裁剪宽度为半颗星显示一半金色empty状态裁剪宽度为 0完全不显示金色3.3 交互事件处理评分器的交互核心是鼠标悬停和点击事件的处理逻辑// 处理星标点击事件 handleStarClick(starIndex: number) { let newRating: number; if (this.config.allowHalf) { // 如果已选中同一颗星且当前为整星状态降级为半星 if (this.currentRating starIndex) { newRating starIndex - 0.5; } else { newRating starIndex; } } else { newRating starIndex; } this.currentRating newRating; this.isHovering false; this.onRatingChange?.(this.currentRating); // 添加触觉反馈 vibrator.vibrate({ type: touch, duration: 10 }); } // 处理悬停事件 handleStarHover(starIndex: number) { this.isHovering true; this.hoverRating starIndex; } // 处理悬停离开 handleStarLeave() { this.isHovering false; }交互设计要点半星切换逻辑当allowHalf开启时点击已选中的整颗星会降级为半星为用户提供更精细的评分控制。悬停预览悬停时只修改hoverRating不会覆盖currentRating鼠标移出后恢复显示用户的最终评分。触觉反馈评分确认时调用振动接口提供物理反馈增强交互确认感。3.4 使用自定义构建函数实现星标除了使用ComponentArkTS 还提供了Builder装饰器来构建 UI 片段Builder StarIcon(active: boolean, size: number, color: ResourceColor) { Image(active ? $r(app.media.star_filled) : $r(app.media.star_empty)) .width(size) .height(size) .objectFit(ImageFit.Contain) .colorFilter(active ? { brightness: 1, saturate: 1.5 } : { brightness: 0.8, saturate: 0.5 }) } // 在 build 方法中调用 Row({ space: 8 }) { ForEach(this.stars, (star) { this.StarIcon( star.index this.displayRating, this.config.starSize, this.config.activeColor ) }) }Builder的优势在于它不需要创建新的组件实例性能开销更小适合渲染简单的 UI 片段。四、HarmonyOS关键技术应用4.1 响应式状态管理评分器组件充分利用了 ArkTS 的状态管理机制状态层级设计State currentRating → 驱动评分主显示 State hoverRating → 驱动悬停预览显示 State isHovering → 控制显示模式切换这三个状态变量构成了一个完整的状态机悬停进入 ┌─────────┐ ────────────────→ ┌─────────┐ │ 显示确认 │ │ 显示预览 │ │ 评分状态 │ ←──────────────── │ 评分状态 │ └─────────┘ 悬停离开/点击确认 └─────────┘4.2 事件系统应用HarmonyOS 提供了一套完善的事件系统评分器中使用了以下事件事件类型使用位置触发时机作用onClick星标组件点击星标确认评分onHover星标组件鼠标进入/离开悬停预览onTouch容器组件触摸开始/移动/结束滑动评分滑动评分实现.onTouch((event: TouchEvent) { if (event.type TouchType.Move) { // 计算触摸点对应的评分值 const touchX event.touches[0].x; const starWidth this.config.starSize 8; // 星标宽度 间距 const startX this.starAreaStartX; let rating (touchX - startX) / starWidth 1; rating Math.max(0.5, Math.min(5, Math.round(rating * 2) / 2)); this.hoverRating rating; this.isHovering true; } })滑动评分为用户提供了另一种交互方式手指从星标区域左侧滑到右侧即可快速选定评分操作更加直觉化。4.3 动画与过渡效果ArkTS 内置的动画系统为评分器提供了流畅的视觉反馈// 评分变化时的数字动画 Text(this.displayRating.toFixed(1)) .fontSize(28) .fontWeight(FontWeight.Bold) .fontColor(this.config.activeColor) .animation({ duration: 300, curve: Curve.EaseOut, delay: 0, iterations: 1 }) .transition({ type: TransitionType.Insert, opacity: 0, translate: { x: 0, y: -10 } }) // 星标缩放动画 Image($r(app.media.star_filled)) .width(this.starSize) .height(this.starSize) .scale({ x: this.starState full ? 1.1 : 1.0, y: this.starState full ? 1.1 : 1.0 }) .animation({ duration: 200, curve: Curve.SpringMotion, delay: this.starIndex * 50 // 依次延时的级联效果 })动画设计亮点弹性动画SpringMotion星标选中时使用弹性曲线模拟物理弹性效果视觉反馈生动自然。级联延迟每颗星依次延迟 50ms 执行动画形成流水般的波浪效果。数字过渡评分数值变化时配合淡入和位移动画避免生硬的数字跳变。五、UI设计与交互5.1 视觉层次设计评分器的 UI 设计以简洁清晰为原则突出评分操作本身布局结构┌──────────────────────────────────┐ │ ★★★★★ │ │ 4.5 非常好 │ │ │ │ [确认评分] [重置] │ └──────────────────────────────────┘视觉元素星标采用系统图标资源五角星形状圆润饱满颜色系统选中金色#FFD700— 传递积极、高质的心理暗示未选中浅灰色#E0E0E0— 弱化视觉权重不干扰用户悬停亮金色#FFC107— 比选中色略亮与确认状态区分评分数字大号加粗字体与星标颜色一致强化视觉关联评价文本中性灰色辅助理解评分含义5.2 交互状态定义评分器组件定义了六种交互状态状态触发条件视觉表现初始页面加载未评分所有星标灰色显示点击评分提示悬停鼠标悬停某颗星悬停位置前的星标亮起数字实时变化选中点击确认评分选中星标金色高亮数字锁定半星点击已选整星半星模式选中星标一半亮一半暗确认点击确认按钮触发 onRatingChange 回调重置点击重置按钮恢复到初始状态5.3 无障碍设计// 为视障用户提供无障碍标签 Image($r(app.media.star_filled)) .accessibilityText(第${this.starIndex}颗星当前评分${this.displayRating}分) .accessibilityLevel(yes) .accessibilityDescription(双击选择评分) // 支持键盘操作 .onKeyEvent((event: KeyEvent) { if (event.keyCode KeyCode.KEYCODE_ENTER || event.keyCode KeyCode.KEYCODE_SPACE) { this.onStarClick?.(this.starIndex); } })六、性能优化与最佳实践6.1 渲染性能优化6.1.1 减少组件层级// ❌ 过度嵌套降低渲染性能 Column() { Row() { Column() { Stack() { // 星标内容 } } } } // ✅ 扁平化结构减少组件实例数 Row({ space: 8 }) { // 直接使用 Stack 或 Image }6.1.2 使用 LazyForEach 处理大量评分项如果需要在一个页面中展示多个评分项如商品列表中的评分应该使用LazyForEach代替ForEachclass RatingDataSource extends BasicDataSource { // 实现数据源接口 } LazyForEach(new RatingDataSource(), (item: RatingItem) { ListItem() { RatingContainer({ config: item.config, onRatingChange: (rating) item.onRate(rating) }) } }, (item: RatingItem) item.id)6.1.3 状态变量最小化原则// ❌ 状态粒度太粗任何变化都会触发整个组件重建 State ratingState: { value: number, hover: number, isActive: boolean } { value: 0, hover: 0, isActive: false }; // ✅ 分离独立状态互不干扰 State currentRating: number 0; State hoverRating: number 0; State isHovering: boolean false;6.2 组件化设计原则6.2.1 单一职责每个组件只负责一个功能领域RatingContainer管理评分状态和整体布局StarComponent渲染单颗星并处理原始事件RatingText格式化并展示评分文字6.2.2 接口最小化对外暴露的属性和回调应该精简明确// 只暴露必要的配置项 Component struct RatingContainer { Prop rating: number; Prop config: RatingConfig; onRatingChange?: (rating: number) void; // 不暴露内部实现细节 }6.2.3 默认参数提供合理的默认值降低使用门槛private config: RatingConfig { totalStars: 5, starSize: 32, activeColor: #FFD700, inactiveColor: #E0E0E0, allowHalf: false, showText: true };6.3 适配多种屏幕// 响应式适配 if (this.isWideScreen()) { this.starSize 48; } else { this.starSize 32; } // 根据屏幕宽度动态调整间距 Row({ space: this.getResponsiveSpace() }) { // 星标行 } // 横竖屏适配 .orientation(Orientation.Auto)七、总结与扩展思路7.1 项目总结本文详细解析了基于 HarmonyOS ArkTS 框架开发的评分器组件涵盖了以下核心技术内容声明式状态管理使用State管理评分状态实现 UI 的自动更新自定义组件封装通过Component实现组件的模块化和复用交互事件处理掌握点击、悬停、触摸等事件的处理方式动画系统运用 ArkTS 动画 API 提升交互体验组件通信理解父子组件之间的数据传递和事件回调7.2 扩展思路评分器组件可以从以下几个方向进一步扩展7.2.1 功能增强多维度评分支持外观、“性能”、价格等多个维度的综合评分评分统计展示评分分布直方图、平均分、评分人数等统计信息用户评分记录记录用户的评分历史支持修改和撤销图片评论评分时允许附带图片和文字评论7.2.2 交互升级拖拽评分通过拖拽滑动条代替点击星标适用于大屏设备动效增强评选时烟花、粒子等庆祝动画效果语音评分集成 HarmonyOS 语音识别支持语音评价表情评分在星标基础上增加表情符号的多模态评分7.2.3 技术进阶跨设备协同利用 HarmonyOS 分布式技术在手机和平板间同步评分结果AI 评分推荐基于用户历史评分数据使用 AI 算法推荐可能的评分数据可视化使用 Canvas 组件绘制评分趋势图表性能监控接入 ArkTS Profiler优化组件渲染性能7.3 应用场景展望评分器组件作为最基础的交互组件之一其设计思想可以延伸到更多场景星级评分 → 表情评分 → 拇指评分点赞/踩 ↓ ↓ ↓ 电商评价 社交反馈 内容互动 ↓ ↓ ↓ 信任体系 情感分析 推荐算法在 HarmonyOS 生态中评分器组件还可以与元服务卡片Ability Card结合在桌面直接展示和操作评分实现真正的即评即用。项目代码已完整开源开发者可以直接复用评分器组件或在此基础上进行定制化开发。随着 HarmonyOS 生态的不断壮大掌握 ArkTS 组件化开发技巧将为开发者带来更广阔的职业发展空间。

相关新闻

C++ Linux Web服务器项目:从零实现Reactor高并发架构

C++ Linux Web服务器项目:从零实现Reactor高并发架构

1. 项目概述:为什么这个项目是C求职的“硬通货”?最近帮几个学弟学妹看简历,发现一个挺普遍的现象:很多C方向的应届生或者初级开发者,简历上项目经历一栏,要么是学校课程设计里那些“学生管理系统”、“图书…

2026/7/27 4:29:08 阅读更多 →
从大厂到AI独立开发者:技术转型与创业实践

从大厂到AI独立开发者:技术转型与创业实践

1. 从互联网大厂到AI独立开发者:我的半年转型实录2022年12月31日,我抱着装满个人物品的纸箱走出公司大楼时,北京的寒风像刀子一样刮在脸上。纸箱里装着一个印着公司logo的水杯、几本翻旧的技术书籍,和一沓写满代码片段的便利贴。H…

2026/7/27 4:29:08 阅读更多 →
TI NDK NETTOOLS嵌入式网络开发实战:DNS、TFTP与并发服务器

TI NDK NETTOOLS嵌入式网络开发实战:DNS、TFTP与并发服务器

1. 项目概述与核心价值在嵌入式网络开发领域,尤其是资源受限的微控制器或实时操作系统环境中,实现稳定、高效且易于维护的网络服务是一项极具挑战性的任务。开发者常常需要在有限的ROM、RAM和CPU周期内,集成DNS解析、文件传输和并发服务器等复…

2026/7/27 4:29:08 阅读更多 →

最新新闻

Transformer在深度强化学习中的革命性应用

Transformer在深度强化学习中的革命性应用

1. 项目概述Transformer架构在自然语言处理领域大获成功后,正在深度强化学习(Deep Reinforcement Learning, DRL)领域掀起一场革命。这场技术融合正在重塑序列决策问题的解决范式,为机器人控制、游戏AI、自动驾驶等复杂决策场景带…

2026/7/27 4:38:12 阅读更多 →
Transformer架构核心原理与实践优化指南

Transformer架构核心原理与实践优化指南

1. Transformer架构核心原理解析 Transformer模型自2017年由Google团队提出以来,已经成为自然语言处理领域的基石架构。这个看似复杂的系统实际上建立在一系列精妙设计的模块之上,我们不妨将其想象成一个高效的多语言翻译团队:每个成员&#…

2026/7/27 4:38:12 阅读更多 →
命令行智能助手:自然语言交互提升运维效率

命令行智能助手:自然语言交互提升运维效率

1. 项目概述:当命令行遇上自然语言在运维和开发领域,命令行工具是日常排障的利器。但面对复杂的参数组合和晦涩的命令语法,即便是经验丰富的工程师也难免需要频繁查阅手册。catpaw chat的出现,为这个痛点提供了全新的解决方案——…

2026/7/27 4:38:12 阅读更多 →
Pixel-to-Space技术:智能仓储的视觉革命

Pixel-to-Space技术:智能仓储的视觉革命

1. 项目概述:当像素遇见空间——仓储智能化的新范式在物流行业摸爬滚打十年,我见过太多仓库还在用纸质标签和人工记忆管理货架。直到去年参与某3C电子仓改造项目,第一次接触Pixel-to-Space技术体系时,才真正理解什么叫"用图像…

2026/7/27 4:38:12 阅读更多 →
TMS320C55x DSP时钟与内存接口时序设计实战指南

TMS320C55x DSP时钟与内存接口时序设计实战指南

1. 项目概述与核心价值在嵌入式硬件开发,尤其是基于德州仪器(TI)TMS320C55x系列DSP的设计中,时钟与内存接口的时序设计是决定系统能否稳定运行在标称最高频率下的基石。很多工程师在初次接触这类高速数字系统时,往往会…

2026/7/27 4:38:12 阅读更多 →
C++高性能线程池优化:任务队列设计与调度策略深度解析

C++高性能线程池优化:任务队列设计与调度策略深度解析

1. 项目概述:为什么我们需要一个“聪明”的线程池?在C高性能服务端开发里,线程池几乎是每个项目的标配。它就像餐厅的后厨,任务就是一道道待烹饪的菜肴,线程就是厨师。一个朴素的线程池,可能就是一个简单的…

2026/7/27 4:37:12 阅读更多 →

日新闻

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →
SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

1. 项目概述:从寄存器手册到实战指南 如果你手头有一份类似德州仪器(TI)TMS320x240xA系列DSP的SPI模块技术手册,看着里面密密麻麻的寄存器位定义、时序图和公式,是不是感觉头大?这份资料虽然权威&#xff0…

2026/7/27 0:00:54 阅读更多 →
【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/27 4:33:59 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/26 0:00:31 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/27 4:01:12 阅读更多 →

月新闻