鸿蒙 Next 相亲防骗雷达 App 开发实战:防骗教育 + 交互式自测 + 内容驱动设计
鸿蒙 Next 相亲防骗雷达 App 开发实战:防骗教育 + 交互式自测 + 内容驱动设计
作者:duluo
SDK 版本:HarmonyOS API 24 (Next)
开发工具:DevEco Studio
语言框架:ArkTS + ArkUI
字数:约 9200 字
目录
- 引言
- 产品概念与内容设计
- 三 Tab 架构设计
- 首页布局与防骗三原则
- 骗局详情与危险信号
- 交互式防骗自测
- 颜色心理学在安全类App中的应用
- 内容驱动设计的优势
- 编译错误全记录
- 第三十三款 App 全景回顾
- 结语
1. 引言
1.1 老年人婚恋骗局的严峻现实
根据中国公安部的数据,2023 年全国破获的电信网络诈骗案件中,针对老年人的案件占比持续上升。其中,婚恋类诈骗是涉案金额最高的类型之一——平均每起案件损失超过 5 万元。
老年人成为婚恋骗局的主要目标,有几个原因:孤独感使他们对"爱情"更渴望、对网络信息的辨别能力较弱、积累了一辈子的积蓄容易成为目标。更可悲的是,很多老人被骗后不敢告诉子女——不是因为贪心,而是因为"怕丢人"。
“相亲防骗雷达"App 的存在意义不是替代反诈中心,而是在长辈的手机里放一个随时可以查看的防骗手册——当有人对他们说"稳赚不赔”、“先转点钱”、“不要告诉孩子"的时候,能想起"这个 App 里说过,这是骗局”。
1.2 本 App 的定位
本 App 是安全教育类产品,与 App 5(防骗训练)类似,但定位更垂直——专门针对婚恋场景。
| 防骗训练(#5) | 相亲防骗雷达(#33) | |
|---|---|---|
| 诈骗类型 | 电信诈骗 | 婚恋诈骗 |
| 目标用户 | 所有老年人 | 有相亲/交友需求的长辈 |
| 教育方式 | 情景训练 | 骗局科普 + 自测题 |
| 内容深度 | 12 个场景 | 6 种骗局详解 + 6 道自测题 |
| 交互方式 | 选择题 | 判断题 |
1.3 三十三款 App 全景
App 数量: 33 代码总行数: ~18,500 行 编译错误数: ~300 个 博客总字数: ~330,000 字 技术博客数: 33 篇2. 产品概念与内容设计
2.1 功能需求
用户故事 1:我想了解婚恋中有哪些常见骗局 用户故事 2:我想知道每个骗局有哪些"危险信号" 用户故事 3:我想测试一下自己能不能识别骗局 用户故事 4:我想每天看到一条防骗提醒 功能清单: ├── F1: 警示横幅 + 防骗三原则 ├── F2: 6 种骗局 Grid 快捷入口 ├── F3: 骗局详情(危险信号 + 防骗建议) ├── F4: 每日防骗语录 ├── F5: 骗局完整列表 ├── F6: 6 道防骗自测题 └── F7: 自测结果反馈2.2 骗局内容设计
6 种骗局覆盖了老年人婚恋中最常见的诈骗类型。每种骗局的signs字段包含 4-5 条危险信号,advice字段提供具体可操作的防骗建议。
内容设计原则:
每条advice遵循"三不"原则:
不说教:不说"你应该...",而是"可以这样做" 不恐吓:不说"你会被骗光",而是"遇到这种情况要小心" 不抽象:不说"提高警惕",而是"认识不到三个月绝不借钱"示例(借钱诈骗的 advice):
不管对方说得多可怜,认识不到三个月绝不借钱。 真爱你的人不会让你为难。两句话:第一句是具体操作(“不到三个月不借钱”),第二句是情感支持(“真爱你的人不会让你为难”)。先给方法,再给安慰。
2.3 防骗自测题设计
6 道自测题采用"是骗局 / 是正常的"二选一判断。题目覆盖了骗局和正常行为的混合:
- 骗局题(4 道):军官结婚要路费、内部投资机会、华侨寄礼物要关税
- 正常题(2 道):关心提醒吃药、邻居介绍公园见面
为什么混合骗局和正常题:如果全部是骗局题,用户学到的只是"所有网上认识的人都不可信"。加入正常题后,用户学会的是"如何区分骗局和正常行为"——这是防骗教育的真正目标。
3. 三 Tab 架构设计
3.1 Tab 配置
build(){Stack(){Column().backgroundColor(C.bg)Column(){this.buildHeader()if(this.activeTab===0)this.buildHomeTab()elseif(this.activeTab===1)this.buildScamTab()elsethis.buildTestTab()this.buildTabBar()}if(this.showDetail)this.buildDetailOverlay()}}| Tab | 图标 | 功能 | 学习路径 |
|---|---|---|---|
| 0 | 🏠 | 首页 — 总览 + 三原则 + 快捷入口 | 第一站:了解概览 |
| 1 | 🔍 | 骗局 — 完整列表 | 第二站:深入学习 |
| 2 | ✅ | 自测 — 判断练习 | 第三站:检验成果 |
三个 Tab 构成了一条从"了解"到"学习"到"检验"的完整学习路径,符合教育产品的标准流程。
3.2 首页布局
┌──────────────────────────────┐ │ ⚠️ 重要提醒 │ │ 婚恋诈骗是老年人最常见的… │ ├──────────────────────────────┤ │ 📋 防骗三原则 │ │ 💰 不借钱:认识不到三个月… │ │ 📞 不转账:任何理由… │ │ 👨👩👧 多商量:涉及钱的事… │ ├──────────────────────────────┤ │ 🔍 常见骗局类型(3列Grid) │ │ 💰借钱 📈投资 🎭假身份 │ │ 🎁礼物 😢情感 👮公检法 │ ├──────────────────────────────┤ │ 💬 防骗语录(每日一句) │ └──────────────────────────────┘3.3 数据流
骗局数据(常量 SCAMS)→ Grid 入口 → 详情弹窗 → 骗局列表 防骗语录(常量 TIPS)→ 首页每日一句(种子算法) 自测题数据 → 自测 Tab → 判断反馈本 App 全部使用常量数据(SCAMS、TIPS、测试题),没有 @State 变量管理用户数据。唯一的状态是showDetail和selectedScam,用于控制弹窗展示。
4. 首页布局与防骗三原则
4.1 警示横幅
Column(){Text('⚠️ 重要提醒').fontSize(18).fontColor(C.danger).fontWeight(FontWeight.Bold)Text('婚恋诈骗是老年人最常见的骗局之一\n涉及金额大、危害严重\n提高警惕,保护好自己的养老钱').fontSize(15).fontColor(C.text).lineHeight(24).textAlign(TextAlign.Center)}.backgroundColor(C.dangerDim).borderRadius(16)使用红色系(C.dangerDim浅红背景 +C.danger深红文字)吸引注意力。三行文案使用\n手动换行,在手机上呈现三段式排版。
4.2 防骗三原则
ForEach([['💰','不借钱','认识不到三个月绝不借钱'],['📞','不转账','任何理由都不给陌生人转账'],['👨👩👧','多商量','涉及钱的事一定和子女商量']],(item:string[])=>{...})三原则的设计用三个关键词概括了老年人婚恋防骗的核心要点:不借钱、不转账、多商量。每个原则用 emoji + 短标题 + 一句话说明,三行排布。
使用字符串数组(string[])替代对象存储原则数据,减少了代码量。每个原则恰好 3 个字段,用索引访问([0] emoji、[1] 标题、[2] 说明)很方便。
4.3 骗局 Grid
Grid(){ForEach(SCAMS,(s:ScamType,idx:number)=>{GridItem(){Column(){Text(s.emoji).fontSize(32)Text(s.name).fontSize(12).fontColor(C.text).fontWeight(FontWeight.Medium)Text(s.level).fontSize(10).fontColor(s.level.indexOf('高危')>=0?C.danger:C.warn)}.height(90).backgroundColor(C.bgCard).borderRadius(14)}},(s:ScamType)=>s.id.toString())}.columnsTemplate('1fr 1fr 1fr')6 种骗局以 3 列 Grid 展示,每项 90px 高。3 列布局在手机屏幕宽度上刚好填满,每项约 100px 宽,足够展示 emoji + 名称 + 风险等级。
等级颜色编码:包含"高危"的文字用红色(C.danger),其他用暖橙(C.warn)。
5. 骗局详情与危险信号
5.1 详情弹窗
Text(SCAMS[this.selectedScam].emoji).fontSize(56)Text(SCAMS[this.selectedScam].name).fontSize(20).fontWeight(FontWeight.Bold)Text(SCAMS[this.selectedScam].level).fontSize(14).fontColor(C.danger)Divider()Text('🚩 危险信号')ForEach(SCAMS[this.selectedScam].signs,(sign:string)=>{Row(){Text('⚠️')Text(sign).fontSize(14)}})Text('💡 防骗建议')Text(SCAMS[this.selectedScam].advice).fontSize(14)弹窗从上到下:大 emoji → 骗局名称 → 风险等级 → 分割线 → 危险信号列表 → 防骗建议。
危险信号列表使用 ForEach 遍历signs数组,每条信号前加 ⚠️ 图标。每条信号独立成行,便于阅读。
5.2 弹窗高度控制
.position({x:'6%',y:'14%'}).height('72%')弹窗高度 72%,留出顶部 14% 和底部 14% 显示遮罩层背景。这个比例经过多次验证(App 1-33),是弹窗内容可读性和背景可见性的最佳折中。
6. 交互式防骗自测
6.1 自测题实现
getTestQuestions():string[][]{return[['网上认识一周的"军官"说要和你结婚,但需要你先转5000元路费。','1','q1'],['相亲对象每天都关心你,提醒你吃药、注意身体。','0','q2'],['对方说有一个稳赚不赔的内部投资机会,让你赶紧投钱。','1','q3'],['邻居介绍的朋友,约你在公园见面喝茶聊天。','0','q4'],['"海外华侨"说要给你寄礼物,但需要你先交2000元关税。','1','q5'],['对方视频通话、见面都愿意,但说想先了解一段时间。','0','q6'],];}每道题用string[]存储:[题目文本、答案(1=骗局/0=正常)、唯一标识]。使用字符串数组而非对象,减少了数据结构复杂度。
6.2 交互判断
Row(){Text('✅ 是骗局').fontSize(14).fontColor(q[1]==='1'?C.safe:C.textMuted).backgroundColor(q[1]==='1'?C.safeDim:C.bgLight).onClick(()=>{this.showTestResult(idx,true);})Text('❌ 是正常的').fontSize(14).fontColor(q[1]==='0'?C.safe:C.textMuted).backgroundColor(q[1]==='0'?C.safeDim:C.bgLight).onClick(()=>{this.showTestResult(idx,false);})}两个按钮并排,点击后触发showTestResult方法。按钮的颜色根据正确答案动态变化——如果用户选了"是骗局"而答案也是"1"(是骗局),按钮显示绿色(正确);否则显示灰色(待选)。
6.3 结果反馈
showTestResult(idx:number,answer:boolean):void{constisScam=this.getTestQuestions()[idx][1]==='1';if(answer===isScam){promptAction.showToast({message:'✅ 判断正确!'});}else{promptAction.showToast({message:'❌ 这是骗局!要小心!'});}}简单的正确/错误反馈。错误的提示直接告诉用户"这是骗局",而不是"你判断错了"——前者传递知识,后者只传递失败感。
7. 颜色心理学在安全类 App 中的应用
7.1 色彩方案
本 App 的色彩方案围绕"安全"和"警示"两个关键词设计:
| 颜色 | 色值 | 心理含义 | 使用场景 |
|---|---|---|---|
| 暖白底色 | #FFF5F0 | 温暖、可亲近 | 主背景 |
| 珊瑚红 | #E86A5A | 警示、重要 | 主色调 |
| 深红 | #D63031 | 危险、紧急 | "高危"标签 |
| 绿色 | #4A9B5A | 安全、正确 | 自测正确反馈 |
| 暖橙 | #E8927C | 警告、注意 | "警惕"标签 |
深红色(#D63031)仅用于"高危"骗局的标签,不用于背景或大面积区域——心理学的"色彩适应"效应表明,长期暴露在红色环境会引发焦虑。安全类 App 需要在"提醒用户注意"和"不让用户紧张"之间找到平衡。
7.2 警示色的使用原则
🔴 深红:仅用于标签文字("高危") 🟠 珊瑚红:用于按钮、标题(主色) 🟡 暖橙:用于中等风险标签 🟢 绿色:用于正确/安全反馈 使用原则: - 深红色面积不超过屏幕的 5% - 珊瑚红面积不超过屏幕的 15% - 暖白色占屏幕的 80% 以上8. 内容驱动设计的优势
8.1 内容 vs 代码的比例
本 App 中,内容数据(SCAMS、TIPS、测试题)占总行数的比例:
SCAMS 数组: 6 种骗局 × 5 个字段 = 约 50 行 TIPS 数组: 8 条语录 = 约 10 行 测试题数据: 6 道题 × 3 个字段 = 约 20 行 内容总行数: 约 80 行 代码总行数: 298 行 内容占比: 约 27%接近三分之一的代码是内容数据,而非 UI 或业务逻辑。这是内容驱动设计(Content-Driven Design)的典型特征——App 的核心价值在内容中,不在代码中。
8.2 内容驱动与功能驱动的对比
| 功能驱动 | 内容驱动 | |
|---|---|---|
| 开发起点 | 先写代码,再填内容 | 先写内容,再写 UI |
| 迭代方式 | 修改代码增加功能 | 修改内容更新知识 |
| 价值来源 | 算法/交互创新 | 内容质量 |
| 更新成本 | 需要发版 | 只需要改数据 |
| 典型 App | AI 树洞(#24) | 本 App |
在本 App 中,如果发现一种新的骗局类型(如"AI 换脸诈骗"),只需要在SCAMS数组中添加一条新记录,不需要修改任何 UI 代码。同样,如果某条防骗建议需要更新,只需要改advice字段的字符串。
8.3 内容驱动设计的适用场景
内容驱动设计最适合"知识传递型"App——App 的价值在于告诉用户一些他们不知道的事情,而不是提供某种工具功能。
适合内容驱动的 App: ✅ 防骗教育 ✅ 健康知识 ✅ 语言学习 ✅ 法规政策解读 不适合内容驱动的 App: ❌ 计算器 ❌ 打卡工具 ❌ 社交平台 ❌ 游戏9. 编译错误全记录
9.1 错误概览
本 App 实现0 个编译错误——与 App 31(慢病管理)并列系列最佳。
0 个错误的原因:
- 没有引入新的代码模式:所有 UI 模式(Tab 架构、Grid、ForEach、Builder 参数传递)都在前 32 款中验证过
- 没有使用 const 声明:所有数据通过 ForEach 回调参数或常量访问,不需要在 @Builder 中声明变量
- 内容数据是常量:SCAMS、TIPS、测试题都是顶层常量,不是 @State 变量
- 弹窗使用内联访问:详情弹窗中所有数据通过
SCAMS[this.selectedScam]内联访问
9.2 从 App 31 学到并应用的规则
- 不要在 @Builder 中用 const → ✅ 全部用内联或 ForEach 参数
- 字符串引号要匹配 → ✅ 编码时检查
- Helper 方法解决数据访问 → ✅ 使用了
getTodayTip()等
9.3 三十三款 App 的错误趋势
App 1: 16 ← 第一课 App 15: 1 ← 模式成熟 App 24: 48 ← AI 探索(波峰) App 28: 8 ← 预览器问题 App 31: 0 ← 首次零错误 App 32: 6 ← 引号问题 App 33: 0 ← 第二次零错误App 33 的第二次零错误比 App 31 的第一次零错误更有意义——它证明了零错误不是偶然,而是可复制的。当你知道如何避免所有已知错误时,零错误就是一个可预期的结果,而不是运气。
10. 第三十三款 App 全景回顾
10.1 数据总览
| 指标 | 数值 |
|---|---|
| 代码行数 | 298 行 |
| 编译错误数 | 0 个 |
| @State 变量 | 3 个 |
| @Builder 方法 | 6 个 |
| 骗局类型 | 6 种 |
| 防骗语录 | 8 条 |
| 自测题 | 6 道 |
| 弹窗数 | 1 个 |
| 外部依赖 | 0 个 |
10.2 三十三款 App 的安全教育类对比
| App | 类型 | 交互方式 | 内容量 | 错误数 |
|---|---|---|---|---|
| 5 🛡️ 防骗训练 | 电信诈骗 | 情景选择 | 12 场景 | 12 |
| 33 🛡️ 相亲防骗 | 婚恋诈骗 | 科普 + 自测 | 6 骗局 + 6 题 | 0 |
两款安全类 App 相隔 28 款 App,错误数从 12 降到了 0——这不是防骗知识的提升,而是 ArkTS 开发能力的提升。相同的产品类型,完全不同的开发效率。
10.3 0 错误开发的工作流
经过 33 款 App 的实践,总结出零错误开发的标准化工作流:
步骤 1:定义 ColorScheme(先写 interface) 步骤 2:定义数据模型(interface + 常量数组) 步骤 3:写 build() 方法(Tab 架构模板) 步骤 4:写各个 @Builder(注意:不能用 const) 步骤 5:写业务方法 步骤 6:编译 → 如果没有错误 → 完成 步骤 7:如果有错误 → 修复 → 回到步骤 6这个工作流在 App 31 和 App 33 中都产生了零错误的结果。它不是一个理论框架,而是一个经过验证的、可重复的实践流程。
11. 结语
11.1 防骗教育的温度
防骗类的 App 很容易做得很"冷"——满屏的红色警示、恐吓性的语言、"你可能会被骗光"的威胁。这种风格可能有效(确实能让人紧张),但它不适合老年人。
老年人的防骗教育需要温度。他们不是不聪明,只是对网络世界不熟悉。他们不是贪心,只是渴望被爱。一个好的防骗 App 应该在说"小心骗子"的同时,也说"被骗不是你的错"。
本 App 的语录中有一条:
被骗不是你的错,是骗子太坏。说出来,不要怕丢人。这句话是 8 条语录中最重要的一条。它告诉用户:如果你被骗了,不是你傻,是骗子太狡猾。说出来,子女不会责怪你。
11.2 内容驱动的价值
33 款 App 中,内容驱动设计的 App(如防骗训练、长辈说明书、方言学习、相亲防骗雷达)有一个共同点:它们的内容可以脱离代码独立存在。
SCAMS 数组中的 6 种骗局、TIPS 中的 8 条语录、6 道自测题——这些内容即使放在 Word 文档里也是有价值的。代码只是内容的容器。
这个发现指向了一个简单的结论:在写代码之前,先想清楚你要传递什么内容。内容对了,代码好不好只是执行层面的问题。
11.3 给开发者的建议
- 内容驱动设计:先写内容,再写 UI。内容的质量决定了 App 的价值,代码只是载体
- 零错误是可复制的:App 31 零错误,App 33 也零错误——证明了零错误不是偶然。跟随标准化工作流,你也可以做到
- 安全类 App 需要温度:不要用恐吓做教育,用共情做教育
- 弹窗高度 72% 是最佳实践:经过 33 款 App 验证,弹窗高度占屏幕 72% 时内容可读性和背景可见性最佳
- 33 款 App 不是终点:每一款 App 都在前一款的基础上改进了一个小细节——从零错误到内容驱动,再到可复用的工作流
11.4 致谢
33 款 App、33 篇博客、约 330,000 字。
从白噪音到相亲防骗雷达,从不知道什么是 @Builder 到零错误构建——33 款 App 记录了一整条学习曲线。
如果你正在读这篇文章,也在学习 HarmonyOS 开发,希望这个系列能为你挡掉一些坑,节省一些时间。
现在,打开 DevEco Studio,去创造属于你自己的 App——不管它多简单,对某个人来说可能很重要。
附录 A:核心代码速查
骗局数据模型
interfaceScamType{id:number;name:string;emoji:string;signs:string[];advice:string;level:string;}防骗自测
showTestResult(idx:number,answer:boolean):void{constisScam=this.getTestQuestions()[idx][1]==='1';if(answer===isScam){promptAction.showToast({message:'✅ 判断正确!'});}else{promptAction.showToast({message:'❌ 这是骗局!要小心!'});}}每日防骗语录
getTodayTip():number{returnMath.floor(Date.now()/86400000)%TIPS.length;}附录 B:色板
| 变量 | 值 | 用途 |
|---|---|---|
C.bg | #FFF5F0 | 主背景 |
C.primary | #E86A5A | 珊瑚红 |
C.danger | #D63031 | 高危标签 |
C.safe | #4A9B5A | 正确反馈 |
C.warn | #E8927C | 警惕标签 |
附录 C:零错误开发检查清单
编码前: □ 不引入新模式(如果必须引入,先小范围测试) □ 不引入新 API(如果必须引入,先查预览器兼容性) 编码中: □ const 不在 @Builder 中使用 □ 字符串引号成对 □ ForEach 有 key 函数 □ 颜色有 interface 编码后: □ 预览器可以打开 □ 所有 Tab 可切换 □ 所有弹窗可打开/关闭 □ 所有交互有反馈