旅行打包清单 App --- HarmonyOS AI 应用开发技术博客
一、项目背景与需求分析
1.1 行业背景
随着旅游业的复苏和人们生活水平的提高,出行已成为现代生活中不可或缺的一部分。然而,旅行前的打包工作常常让人感到头疼------忘带物品、带太多不必要的东西、根据目的地和季节准备的物品不合适等问题普遍存在。
根据旅游行业调研数据,超过 70% 的旅行者在出行前有过"忘带重要物品"的经历,超过 50% 的旅行者表示"打包是旅行中最令人焦虑的环节之一"。一个能够根据目的地、天数、季节和旅行类型智能生成打包清单的工具,能够显著缓解旅行者的焦虑,提升出行体验。

1.2 需求分析
通过与旅行爱好者和旅游从业者的深入交流,我们明确了以下核心需求:
功能需求:
- 输入目的地信息
- 输入出行天数
- 选择出行季节
- 选择旅行类型(商务、休闲、探险、度假等)
- AI 生成完整的打包清单
- 必备物品清单(证件、钱包、钥匙等)
- 衣物清单(根据目的地气候和旅行类型推荐)
- 洗漱用品清单
- 电子产品清单
- 证件清单
- 出行建议和注意事项
非功能需求:
- 清单分类清晰,便于逐项核对
- 推荐结果符合目的地气候特征
- 支持不同旅行类型的差异化推荐
- 清单长度适中,避免过度推荐
1.3 目标用户画像
- 自由行旅行者:需要全面的打包建议
- 商务出差人士:需要精简高效的打包清单
- 家庭出游者:需要为全家成员准备物品清单
- 户外探险者:需要专业的户外装备清单
- 旅行博主:需要高效打包,频繁出行
二、技术架构设计
2.1 整体架构概述
旅行打包清单 App 采用与项目其他应用一致的 Model-Service-Page 三层架构。该应用的特色在于 Model 层包含了多个分类的清单字段,能够生成结构化的打包清单。
2.2 架构分层详解
┌─────────────────────────────────────────────────────┐
│ Page 层 │
│ PackingPage (UI 组件 + 状态管理 + 交互逻辑) │
│ ┌─────────────────────────────────────────────────┐ │
│ │ @State inputData @State resultData │ │
│ │ @State showResult 清单分类展示 │ │
│ └─────────────────────────────────────────────────┘ │
├─────────────────────────────────────────────────────┤
│ Service 层 │
│ PackingService (AI 推理 + 旅行知识 + 气候数据) │
│ ┌─────────────────────────────────────────────────┐ │
│ │ generateData(input) → PackingData │ │
│ │ 目的地分析 气候匹配 物品推荐 清单生成 │ │
│ └─────────────────────────────────────────────────┘ │
├─────────────────────────────────────────────────────┤
│ Model 层 │
│ PackingData (数据定义 + 类型约束 + 默认值) │
│ ┌─────────────────────────────────────────────────┐ │
│ │ destination days trip_type │ │
│ │ must_have optional emergency tips │ │
│ └─────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘
2.3 Model 层设计
PackingData 类定义了旅行打包清单的所有数据字段:
typescript
export class PackingData {
destination: string = '' // 目的地
days: number = 0 // 出行天数
trip_type: string = '' // 旅行类型
must_have: Record<string, string> = {} // 必备物品清单(分类+内容)
optional: string[] = [] // 可选物品列表
emergency: string[] = [] // 应急物品列表
tips: string[] = [] // 出行建议列表
}
must_have 字段使用 Record<string, string> 类型,非常适合表达"物品分类 → 物品详情"的映射关系,例如:
json
{
"证件": "身份证、护照、签证复印件",
"衣物": "外套3件、T恤5件、裤子3条",
"洗漱": "牙刷、牙膏、洗发水、沐浴露"
}
2.4 Service 层设计
PackingService 的核心是结合旅行知识和气候数据生成个性化清单:
typescript
export class PackingService {
private model: PackingData
constructor() {
this.model = new PackingData()
}
generateData(input: Record<string, Object>): PackingData {
let result: PackingData = new PackingData()
// Mock data generation logic based on input
return result
}
}
在实际实现中,该方法会考虑以下因素:
- 目的地气候分析: 根据目的地和季节推荐合适的衣物
- 旅行类型匹配: 商务旅行侧重正装和办公用品,休闲旅行侧重舒适衣物
- 天数计算: 根据出行天数计算物品数量(如"3 天需要 3 套内衣")
- 应急准备: 根据目的地特点推荐应急物品(如海边推荐防晒霜,山区推荐驱蚊水)
2.5 Page 层设计
Page 层包含四个输入字段,分别对应目的地、天数、季节和旅行类型:
typescript
@Entry
@Component
struct PackingPage {
@State inputData: Record<string, Object> = {}
@State resultData: PackingData | null = null
@State showResult: boolean = false
private service: PackingService = new PackingService()
}
三、AI 提示词工程原理
3.1 旅行打包知识体系
生成高质量的打包清单需要丰富的旅行知识,这些知识通过 Prompt 注入到 AI 模型中:
气候知识:
- 热带地区:轻薄衣物、防晒用品、防蚊用品
- 寒带地区:保暖衣物、防寒装备、保湿用品
- 雨季地区:雨具、防水袋、速干衣物
- 干燥地区:保湿用品、润唇膏、防晒用品
旅行类型知识:
- 商务旅行:正装、名片、笔记本电脑、充电器
- 休闲度假:休闲衣物、泳装、相机、防晒霜
- 户外探险:登山鞋、冲锋衣、急救包、指南针
- 城市观光:舒适步行鞋、背包、地图、充电宝
3.2 提示词模板设计
你是一位经验丰富的旅行规划师,擅长为不同旅行者定制打包清单。
旅行信息:
- 目的地:{destination}
- 出行天数:{days} 天
- 季节:{season}
- 旅行类型:{trip_type}
请根据以上信息,生成一份完整的旅行打包清单:
1. 必备物品清单:按类别列出(证件、衣物、洗漱用品、电子产品等)
2. 可选物品:根据个人需求选择携带的物品
3. 应急物品:针对目的地特点的应急物品
4. 出行建议:针对该目的地和旅行类型的出行建议
3.3 物品数量计算规则
为了让 AI 生成的清单更加精确,我们在 Prompt 中嵌入了物品数量计算规则:
- 内衣数量:天数 × 1(含备用的 1 套)
- 袜子数量:天数 × 1(含备用的 1 双)
- 上衣数量:天数 × 0.7(约 2/3 天数)
- 裤子数量:天数 × 0.3(约 1/3 天数)
- 洗漱用品:按天数分装,或使用旅行装
四、核心功能实现详解
4.1 输入模块设计
四个输入字段分别捕获目的地、天数、季节和旅行类型信息:
typescript
Text('目的地')
.fontSize(14)
.fontWeight(FontWeight.Bold)
TextInput({ placeholder: '请输入目的地' })
.onChange((val: string) => { this.inputData['destination'] = val })
Text('天数')
.fontSize(14)
.fontWeight(FontWeight.Bold)
TextInput({ placeholder: '请输入天数' })
.onChange((val: string) => { this.inputData['days'] = val })
Text('出行类型')
.fontSize(14)
.fontWeight(FontWeight.Bold)
TextInput({ placeholder: '请输入出行类型' })
.onChange((val: string) => { this.inputData['trip_type'] = val })
4.2 数据流分析
用户输入目的地、天数、季节、旅行类型
→ inputData 状态更新
→ 点击"AI 生成"按钮
→ service.generateData(inputData)
→ 解析目的地信息
→ 分析气候特征
→ 匹配旅行类型
→ 计算物品数量
→ 生成分类清单
→ 返回 PackingData
→ resultData 状态更新
→ 条件渲染展示结果
4.3 结果展示策略
结果展示区域在数据就绪后渲染:
typescript
if (this.showResult && this.resultData !== null) {
Text('生成结果')
.fontSize(18)
.fontWeight(FontWeight.Bold)
Text('打包清单')
.fontSize(14)
.fontColor($r('app.color.text_secondary'))
}
在完整实现中,清单可以按类别分组展示,每个类别使用一个卡片组件,包含物品列表和数量建议。
五、用户体验优化
5.1 清单交互优化
勾选核对: 每个清单项都提供复选框,用户可以在打包过程中逐项勾选核对,避免遗漏。
进度提示: 显示打包进度的百分比,让用户直观了解打包完成情况。
自定义添加: 允许用户自定义添加清单项,满足个性化需求。
5.2 智能推荐优化
季节性推荐: 根据出行季节自动调整衣物推荐,如夏季推荐轻薄衣物,冬季推荐保暖衣物。
目的地特殊推荐: 根据目的地特点推荐特殊物品,如去海边推荐泳装和防晒霜,去山区推荐登山鞋和驱蚊水。
旅行类型差异化: 不同旅行类型生成不同的清单重点,如商务旅行突出证件和办公用品,休闲旅行突出衣物和娱乐用品。
5.3 视觉设计优化
清单分类一目了然: 使用不同的颜色和图标区分清单类别,如证件类用蓝色、衣物类用绿色、洗漱类用紫色。
物品数量可视化: 使用数字标签或进度条显示物品数量,让用户一目了然。
六、性能优化与最佳实践
6.1 Record 类型在清单管理中的应用
在旅行打包清单中,Record<string, string> 类型用于管理分类物品清单:
typescript
must_have: Record<string, string> = {}
// 使用示例
this.resultData.must_have['证件'] = '身份证、护照、签证'
this.resultData.must_have['衣物'] = 'T恤 × 5、裤子 × 3、外套 × 1'
6.2 数值计算与类型转换
天数是一个数值字段,从 TextInput 获取的是字符串类型,需要在 Service 层进行类型转换:
typescript
let days: number = Number(input['days'])
// 根据天数计算物品数量
let tshirtCount: number = Math.ceil(days * 0.7)
6.3 列表渲染优化
对于多个清单项,使用 ForEach 进行循环渲染:
typescript
// 遍历必备物品清单
let keys: string[] = Object.keys(this.resultData.must_have)
ForEach(keys, (key: string) => {
Column() {
Text(key)
.fontSize(16)
.fontWeight(FontWeight.Bold)
Text(this.resultData.must_have[key])
.fontSize(14)
}
.margin({ bottom: 12 })
})
七、总结与展望
7.1 项目总结
旅行打包清单 App 展示了 AI 在旅行规划领域的应用价值。通过将旅行知识和气候数据注入 AI 模型,我们构建了一个能够根据个性化需求生成打包清单的智能工具。
项目亮点:
- 多维度的输入参数带来个性化的清单推荐
- 结构化的清单分类,便于用户逐项核对
- 物品数量计算规则,避免过度推荐或遗漏
- 目的地和季节性的智能调整
7.2 未来展望
天气 API 集成: 接入实时天气数据,获取目的地出行期间的天气预报,自动调整衣物推荐。
语言翻译: 集成 HarmonyOS 的翻译能力,自动将物品名称翻译成目的地语言,方便在海外购物。
行李重量估算: 根据清单物品自动估算总重量,帮助用户控制行李重量。
旅行日志: 记录用户的出行历史,分析用户的打包习惯,提供越来越精准的推荐。
7.3 技术启示
旅行打包清单 App 的开发实践表明,AI 在生活服务类应用中的价值在于将专业知识转化为个性化的服务。打包清单看似简单,但背后涉及气候学、地理学、旅行规划等多个领域的知识。
通过 Model-Service-Page 架构,我们将这些知识沉淀在 Service 层,将清单的结构化数据建模在 Model 层,使得整个应用既专业又灵活。这种架构设计理念------将复杂知识封装在服务层,对外提供简洁的接口------是 AI 应用开发的核心方法论。