66
一碰就进、走到就讲、走完有忆——让游客在景区弱网、听不懂、记不住的场景里,把一次旅行看明白。
HarmonyOS 6 原生应用(ArkTS / ArkUI),样板城市为开封。内容包与引擎解耦:换城市只换 KaifengPack.ets 一个文件。
KaifengPack.ets
用 DevEco Studio 26 打开 HarmonyOSexam/,等 Sync 完成后选模拟器或真机 → Run entry。
HarmonyOSexam/
entry
命令行构建(把 IDE 路径换成你本机的):
$ide = "D:\Hmeng\DevEco Studio" # ← 改成你的 DevEco Studio 安装目录 $env:DEVECO_SDK_HOME = "$ide\sdk" cd HarmonyOSexam & "$ide\tools\node\node.exe" "$ide\tools\hvigor\bin\hvigorw.js" ` --mode module -p product=default -p buildMode=debug assembleHap --no-daemon
产物:entry/build/default/outputs/default/entry-default-unsigned.hap(约 800 KB)。 真机安装需在 DevEco 里 File → Project Structure → Signing Configs 勾选自动签名。
entry/build/default/outputs/default/entry-default-unsigned.hap
& "$ide\tools\node\node.exe" "$ide\tools\hvigor\bin\hvigorw.js" ` --mode module -p module=entry@default -p product=default test --no-daemon
测试在 entry/src/test/LocalUnit.test.ets,覆盖检索拒答、行程约束、游记成文三块 (当前行覆盖率:Journal 96% / RagEngine 90% / RouteAgent 64%)。
entry/src/test/LocalUnit.test.ets
Journal
RagEngine
RouteAgent
HarmonyOSexam/ ├── entry/src/main/ets/ │ ├── pages/Index.ets 6 个 Tab:首页 / 行程 / 伴游 / 识物 / 问答 / 我的 │ ├── model/ │ │ ├── Types.ets 数据结构 │ │ └── KaifengPack.ets ★ 开封内容包:10 个点位 × 三层讲解稿 + 出处 │ ├── data/ │ │ ├── Exhibits.ets 16 件展品 + 6 组取景样本 │ │ ├── KnowledgeBase.ets 30 条知识分块(带出处) │ │ └── Geo.ets 点位坐标与步行时长 │ ├── service/ │ │ ├── RouteAgent.ets ★ 行程 Agent(约束过滤 → 偏好打分 → 近邻排序 → 时间预算 → 途中重排) │ │ ├── RagEngine.ets ★ 本地 BM25 检索 + 阈值拒答 + 强制引用 │ │ ├── LlmClient.ets ★ 云侧大模型接入(可选增强层,防幻觉三道闸) │ │ ├── Journal.ets ★ 游记成文(本地模板,只用真实到访记录) │ │ ├── SpeechService.ets Core Speech Kit TTS,失败降级为字幕 │ │ ├── VisionEngine.ets 识物(占位:预置取景样本) │ │ ├── ContinueService.ets 跨端接续(分布式设备发现 + startAbility) │ │ └── Store.ets 沙箱文件持久化(带格式版本) │ └── view/ HomePage / TripPage / GuidePage / ScanPage / AskPage / MinePage / PlaceDetail ├── entry/src/main/resources/rawfile/ │ └── llm_config.example.json 模型配置模板(复制为 llm_config.json 并填 apiKey) ├── entry/src/test/ 单元测试(hypium,27 条) └── docs/ ├── 游必有方-项目设计计划书.md 完整方案(问题定义、架构、降级表、演示脚本) └── 雏形说明.md 当前实现状态:真做了 vs 占位,逐项标注
同步码 / 二维码
「我的 → 账号」生成。二维码是自研编码器(service/QrCode.ets,Byte 模式、纠错 L、版本 1-15), 不依赖第三方库;生成结果已用 zxing 实际扫回验证(含中文、多纠错块、多码字版本)。
service/QrCode.ets
YBF2|u56732781|LaoZhang|13800138000|yangingguan,09:07,30,0;kaifengfu,09:02,50,0|||
, ; | %
想换成真后端时:Account 里补一个 upload()/download(),把同步码换成接口返回即可,调用方不用动。 | 跨端接续 | 🚧 已接分布式设备发现与 startAbility,需双设备联调 | | 定位围栏 | 🚧 模拟路径,界面标注「模拟定位」 | | 识物识别 | 🚧 占位,预置样本 + 证据链,未接 Core Vision Kit | | 元服务 / 服务卡片 | ⬜ 未做(已有 Form Ability 与卡片页,未上 AGC) |
Account
upload()/download()
startAbility
详细差异与已知限制见 docs/雏形说明.md。
docs/雏形说明.md
默认不联网也能跑完所有功能。想让问答从”念原文”变成”答问题”,两步:
# 1. 复制模板 copy HarmonyOSexam\entry\src\main\resources\rawfile\llm_config.example.json ` HarmonyOSexam\entry\src\main\resources\rawfile\llm_config.json # 2. 编辑 llm_config.json,填入 apiKey(endpoint 默认 DeepSeek,任何 OpenAI 兼容接口都行)
llm_config.json 已写进 .gitignore,密钥不会进版本库。
llm_config.json
.gitignore
接上之后有两处会变:
三道闸,写在代码里而不是文档里(service/LlmClient.ets):
service/LlmClient.ets
[n]
界面会如实标出这条回答是怎么来的:云侧组织(金色)或 本地抽取(青色)。
云侧组织
本地抽取
工程里没有服务端,所以**不做假的”云端同步”**。取而代之的是两条都能验证的能力:
1. 本地账号(service/Account.ets)
service/Account.ets
youbi_store_<uid>.dat
uid
2. 同步码 / 二维码(导出 / 导入)
在「我的 → 账号 → 同步码」生成一行文本,同时画出二维码:
另一台设备扫这张码(或把文本贴进「数据同步 → 导入」),到访、收藏、笔记、打卡一起过去。
二维码不是第三方库:service/QrCode.ets 自己实现了 Byte 模式、纠错 L、版本 1-15 的编码 (RS 纠错、交织、掩码择优、格式/版本信息)。正确性用 zxing 真的扫回来验证过, 单测里还锁了一张已验证矩阵的快照,防止以后改坏。
想换成真后端时:Account 里补一个 upload()/download(),把同步码换成接口返回即可,调用方不用动。
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
游必有方 · AI 文旅伴游(开封)
HarmonyOS 6 原生应用(ArkTS / ArkUI),样板城市为开封。内容包与引擎解耦:换城市只换
KaifengPack.ets一个文件。快速开始
用 DevEco Studio 26 打开
HarmonyOSexam/,等 Sync 完成后选模拟器或真机 → Runentry。命令行构建(把 IDE 路径换成你本机的):
产物:
entry/build/default/outputs/default/entry-default-unsigned.hap(约 800 KB)。 真机安装需在 DevEco 里 File → Project Structure → Signing Configs 勾选自动签名。跑单元测试
测试在
entry/src/test/LocalUnit.test.ets,覆盖检索拒答、行程约束、游记成文三块 (当前行覆盖率:Journal96% /RagEngine90% /RouteAgent64%)。目录
实现状态(不粉饰)
同步码 / 二维码
「我的 → 账号」生成。二维码是自研编码器(
service/QrCode.ets,Byte 模式、纠错 L、版本 1-15), 不依赖第三方库;生成结果已用 zxing 实际扫回验证(含中文、多纠错块、多码字版本)。, ; | %会百分号转义,导入时还原详细差异与已知限制见
docs/雏形说明.md。接入云侧大模型(可选)
默认不联网也能跑完所有功能。想让问答从”念原文”变成”答问题”,两步:
llm_config.json已写进.gitignore,密钥不会进版本库。接上之后有两处会变:
三道闸,写在代码里而不是文档里(
service/LlmClient.ets):[n]或编号越界,整条回答作废,回落到本地抽取;界面会如实标出这条回答是怎么来的:
云侧组织(金色)或本地抽取(青色)。账号与数据同步(没有后端也能真搬数据)
工程里没有服务端,所以**不做假的”云端同步”**。取而代之的是两条都能验证的能力:
1. 本地账号(
service/Account.ets)youbi_store_<uid>.dat,换账号看到的是各自的数据uid派生底色 + 昵称首字2. 同步码 / 二维码(导出 / 导入)
在「我的 → 账号 → 同步码」生成一行文本,同时画出二维码:
另一台设备扫这张码(或把文本贴进「数据同步 → 导入」),到访、收藏、笔记、打卡一起过去。
合规与诚实性约定