基于鸿蒙ArkTS构建AI旅行攻略生成器:智能规划旅程,探索世界之美


引言
在数字化时代,旅行规划变得越来越重要。随着鸿蒙(HarmonyOS)生态的快速发展,尤其是鸿蒙PC端的崛起,开发者有了更多机会将AI技术与旅行体验相结合。本文将详细介绍如何基于鸿蒙ArkTS语言,开发一款智能旅行攻略生成器应用,探索鸿蒙Flutter框架生态下的原生开发实践,以及如何通过技术手段为旅行者提供全方位的行程规划支持。
一、项目背景与技术选型
1.1 旅行规划的数字化需求
在当今快节奏的生活中,旅行规划面临着诸多挑战:
- 信息过载:互联网上旅行信息繁多,难以筛选有效内容
- 时间有限:工作繁忙,没有足够时间研究目的地
- 个性化需求:不同人有不同的旅行偏好和需求
- 经验不足:初次旅行者缺乏规划经验
- 预算约束:需要合理安排预算和行程
AI旅行攻略生成器的核心价值在于:
- 智能规划:输入目的地和天数,自动生成完整行程
- 个性化推荐:根据目的地特点推荐美食、住宿
- 分段展示:每日行程分为上午、下午、晚上,条理清晰
- 实用贴士:提供旅行注意事项和建议
- 历史记录:保存所有生成的攻略,方便回顾
1.2 鸿蒙生态的技术优势
选择鸿蒙ArkTS作为开发语言,主要基于以下技术优势:
1.2.1 原生性能与跨端能力
- 原生编译:ArkTS编译为机器码,性能媲美C/C++
- 分布式协同:支持手机、平板、PC等多设备无缝流转
- 统一API:一套代码适配多种设备形态
1.2.2 ArkUI声明式语法
- 声明式UI:以描述性语言构建界面,代码更直观
- 组件化开发:高度复用的组件体系
- 响应式状态管理:@State装饰器实现数据驱动UI
1.2.3 鸿蒙PC端的拓展潜力
随着鸿蒙PC生态的不断完善,应用可以轻松拓展到桌面端,实现:
- 更大屏幕的沉浸式规划体验
- 键鼠操作的精准交互
- 多窗口协同工作模式
- 与其他办公软件的无缝集成
1.3 与鸿蒙Flutter框架的对比
虽然鸿蒙Flutter框架提供了跨平台开发能力,但本项目选择ArkTS原生开发的原因如下:
| 对比维度 | 鸿蒙ArkTS | 鸿蒙Flutter框架 |
|---|---|---|
| 性能表现 | 原生编译,性能最优 | 虚拟机运行,有性能损耗 |
| UI一致性 | 完全遵循鸿蒙设计规范 | 依赖Flutter渲染引擎 |
| 系统集成 | 深度集成系统能力 | 通过插件桥接 |
| 开发效率 | 学习曲线适中 | 组件丰富,开发快速 |
| 资源占用 | 轻量级,包体小 | 较重,包体较大 |
| 文本阅读体验 | 原生控件更适合长文本阅读 | 需要额外优化 |
对于追求极致性能和系统深度集成的旅行规划类应用,鸿蒙ArkTS是更佳选择。
二、应用架构设计
2.1 整体架构
AI旅行攻略生成器采用经典的分层架构,确保代码的可维护性和扩展性:
┌─────────────────────────────────────────────────────────┐
│ UI层 (ArkUI) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 目的地输入 │ │ 行程展示 │ │ 历史记录 │ │
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │
└─────────┼────────────────┼─────────────────┼────────────┘
│ │ │
┌─────────▼────────────────▼─────────────────▼────────────┐
│ 业务逻辑层 │
│ ┌──────────────────┐ ┌─────────────────────────────┐ │
│ │ 攻略生成服务 │ │ 数据持久化服务 │ │
│ │ - Mock数据匹配 │ │ - Preferences存储 │ │
│ │ - 智能规划算法 │ │ - 历史记录管理 │ │
│ │ - 行程分段生成 │ │ - 数据解析 │ │
│ └──────────────────┘ └─────────────────────────────┘ │
└──────────────────────────────────────────────────────────┘
│
┌─────────▼─────────────────────────────────────────────────┐
│ 数据层 │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 内置10个热门目的地攻略(每个4天详细行程) │ │
│ │ 包含美食、住宿、贴士等完整信息 │ │
│ │ 预留网络API接口(对接大模型) │ │
│ └─────────────────────────────────────────────────────┘ │
└───────────────────────────────────────────────────────────┘
2.2 核心数据模型
应用定义了四个核心接口,确保类型安全和数据完整性:
interface DayPlan {
day: number; // 第几天
morning: string; // 上午行程
afternoon: string; // 下午行程
evening: string; // 晚上行程
food: string; // 美食推荐
}
interface TravelGuide {
destination: string; // 目的地名称
days: number; // 出行天数
plan: Array<DayPlan>; // 每日行程列表
accommodation: string; // 住宿建议
tips: string; // 旅行贴士
timestamp: number; // 生成时间戳
}
interface MockDestination {
name: string; // 目的地名称
plans: Array<DayPlan>; // 预设行程列表
accommodation: string; // 住宿建议
tips: string; // 旅行贴士
}
interface ParseResult {
success: boolean; // 解析是否成功
data: Array<string> | null; // 解析数据
}
设计亮点:
- 类型安全:全部使用显式接口定义,杜绝any类型
- 数据完整性:每个字段都有明确的业务含义
- 扩展性:预留了未来数据结构扩展的空间
- 分段行程:支持上午、下午、晚上三个时段的详细规划
2.3 状态管理策略
应用采用轻量化状态管理,仅使用@State装饰器:
@Entry
@Component
struct Index {
@State inputDestination: string = ''; // 输入的目的地
@State inputDays: number = 3; // 选择的天数
@State generatedGuide: TravelGuide | null = null; // 生成的攻略
@State isLoading: boolean = false; // 加载状态
@State history: TravelGuide[] = []; // 历史记录
@State errorText: string = ''; // 错误提示
}
状态管理原则:
- 单一数据源:所有状态集中管理
- 响应式更新:状态变化自动触发UI刷新
- 最小化状态:只维护必要的状态变量
- 空值安全:使用null处理未生成攻略的情况
三、核心功能实现
3.1 旅行攻略生成算法
3.1.1 目的地匹配与智能截取
应用内置10个热门目的地,每个目的地包含4天详细行程:
private generateGuide(destination: string, days: number): TravelGuide {
for (let i = 0; i < this.MOCK_DATA.length; i++) {
let mock: MockDestination = this.MOCK_DATA[i];
if (mock.name.includes(destination) || destination.includes(mock.name)) {
let selectedPlans: Array<DayPlan> = [];
let planCount: number = Math.min(days, mock.plans.length);
for (let j = 0; j < planCount; j++) {
selectedPlans.push(mock.plans[j]);
}
return {
destination: mock.name,
days: planCount,
plan: selectedPlans,
accommodation: mock.accommodation,
tips: mock.tips,
timestamp: Date.now()
};
}
}
let defaultPlans: Array<DayPlan> = [];
for (let i = 0; i < days; i++) {
defaultPlans.push({
day: i + 1,
morning: '第' + (i + 1) + '天上午:抵达' + destination + ',入住酒店后稍作休息,开始探索这座城市。',
afternoon: '第' + (i + 1) + '天下午:游览' + destination + '的著名景点,感受当地的风土人情。',
evening: '第' + (i + 1) + '天晚上:品尝' + destination + '的特色美食,体验当地的夜生活。',
food: destination + '特色美食推荐:当地小吃、特色菜肴、海鲜等。'
});
}
return {
destination: destination,
days: days,
plan: defaultPlans,
accommodation: '建议选择' + destination + '市中心或景区附近的酒店,方便出行。',
tips: '1. 出行前查询当地天气情况;2. 提前预订热门景点门票;3. 注意安全,保管好个人财物;4. 尊重当地风俗习惯。',
timestamp: Date.now()
};
}
算法设计思路:
- 模糊匹配:使用includes方法实现双向模糊匹配
- 动态截取:根据用户选择的天数自动截取对应天数的行程
- 数据复用:每个目的地预设4天行程,按需截取
- 兜底策略:未匹配到城市时使用通用模板生成
3.1.2 模糊匹配机制
模糊匹配是本应用的核心算法之一,支持多种匹配方式:
- 精确匹配:输入"北京"匹配到北京
- 别名匹配:输入"北平"也能匹配到北京
- 部分匹配:输入"海"能匹配到上海、青岛、厦门等
- 反向匹配:输入包含目的地名称的任意字符串
3.2 数据持久化方案
应用使用@ohos.data.preferences实现数据持久化:
private async saveHistory(): Promise<void> {
if (!this.context) {
return;
}
try {
let prefs = await this.getPreferences();
let stringList: Array<string> = [];
for (let i = 0; i < this.history.length; i++) {
let guide = this.history[i];
stringList.push(JSON.stringify(guide));
}
let jsonStr: string = JSON.stringify(stringList);
await prefs.put(this.STORAGE_KEY, jsonStr);
await prefs.flush();
} catch (error) {
console.error('保存旅行历史失败');
}
}
private async loadHistory(): Promise<void> {
if (!this.context) {
return;
}
try {
let prefs = await this.getPreferences();
let storedValue = await prefs.get(this.STORAGE_KEY, '');
let jsonStr: string = storedValue as string;
if (jsonStr.length > 0) {
let parseResult = this.parseStringList(jsonStr);
if (parseResult.success && parseResult.data) {
let guides: TravelGuide[] = [];
for (let i = 0; i < parseResult.data.length; i++) {
let str: string = parseResult.data[i];
let guide = this.parseTravelGuide(str);
if (guide) {
guides.push(guide);
}
}
this.history = guides;
}
}
} catch (error) {
console.error('加载旅行历史失败');
}
}
持久化特点:
- 异步操作:不阻塞UI线程
- 错误处理:完善的异常捕获机制
- 数据验证:解析前进行严格校验
- 内存管理:使用单例模式管理Preferences实例
3.3 历史记录管理
历史记录功能允许用户保存和回顾所有生成的攻略:
private handleGenerate(): void {
if (this.inputDestination.trim().length === 0) {
this.errorText = '请输入目的地';
return;
}
this.errorText = '';
this.generatedGuide = null;
this.isLoading = true;
setTimeout(() => {
let result = this.generateGuide(this.inputDestination.trim(), this.inputDays);
this.isLoading = false;
this.generatedGuide = result;
let newHistory: TravelGuide[] = [result];
for (let i = 0; i < this.history.length; i++) {
newHistory.push(this.history[i]);
}
this.history = newHistory;
this.saveHistory();
}, 800);
}
历史记录特点:
- 自动保存:每次生成攻略后自动保存到历史记录
- 倒序排列:最新生成的攻略显示在最前面
- 点击查看:点击历史记录可重新查看详细内容
- 一键清空:支持清空所有历史记录
四、UI设计与交互体验
4.1 视觉设计规范
应用采用清新自然的设计风格,契合旅行主题:
4.1.1 色彩方案
| 颜色名称 | 色值 | 应用场景 |
|---|---|---|
| 主题色 | #2ECC71 | 标题栏、按钮、选中状态 |
| 主文本 | #333333 | 标题、正文内容 |
| 次要文本 | #666666 | 行程描述、提示文字 |
| 提示文本 | #999999 | 占位符、时间戳 |
| 主背景 | #F5F5F5 | 页面背景 |
| 卡片背景 | #FFFFFF | 行程卡片、历史记录卡片 |
| 美食高亮 | #E74C3C | 美食推荐文字 |
| 贴士背景 | #FFF9E6 | 旅行贴士背景 |
色彩设计理念:
- 自然绿:#2ECC71作为主题色,象征自然、旅行、生机
- 素雅背景:浅灰色背景营造舒适阅读体验
- 美食高亮:红色突出美食推荐,刺激食欲
- 贴士背景:淡黄色背景突出重要提示
4.1.2 字体与排版
- 标题字体:20px,加粗,白色
- 目的地输入:15px,常规,深灰色
- 天数标签:13px,常规,白色/灰色
- 行程标题:16px,加粗,绿色
- 时段标题:14px,加粗,深灰色
- 行程描述:14px,常规,灰色,行高22px
- 美食推荐:14px,常规,红色,行高22px
4.2 交互设计
4.2.1 目的地输入
应用采用简洁的文本输入框:
TextInput({ placeholder: '请输入旅行目的地,如:北京、三亚、丽江...', text: this.inputDestination })
.width('100%')
.height(56)
.fontSize(15)
.padding({ left: 12, right: 12 })
.backgroundColor('#FFFFFF')
.borderRadius(8)
.borderWidth(1)
.borderColor('#E0E0E0')
.onChange((value: string) => {
this.inputDestination = value;
})
输入设计要点:
- 占位符提示:提供示例目的地,引导用户输入
- 实时反馈:输入内容实时更新到状态
- 错误提示:未输入时显示红色错误提示
4.2.2 天数选择
应用采用横向滚动的标签式天数选择:
Scroll() {
Row() {
ForEach(this.DAYS_OPTIONS, (day: number) => {
Button(day + '天')
.width(56)
.height(36)
.fontSize(13)
.fontColor(this.inputDays === day ? '#ffffff' : '#666666')
.backgroundColor(this.inputDays === day ? '#2ECC71' : '#F5F5F5')
.borderRadius(18)
.margin({ right: 8 })
.onClick(() => {
this.inputDays = day;
})
}, (day: number) => day.toString())
}
.width('100%')
}
.scrollable(ScrollDirection.Horizontal)
.width('100%')
天数选择特点:
- 标签式选择:直观展示1-10天选项
- 横向滚动:支持更多天数选项扩展
- 选中状态:通过颜色变化反馈当前选中项
- 圆角设计:圆角按钮增强视觉舒适度
4.2.3 行程卡片展示
应用使用卡片式布局展示每日行程:
ForEach(this.generatedGuide.plan, (dayPlan: DayPlan) => {
Column() {
Row() {
Text('第' + dayPlan.day + '天')
.fontSize(16)
.fontWeight(FontWeight.Bold)
.fontColor('#2ECC71')
}
.width('100%')
.margin({ bottom: 12 })
Column() {
Row() {
Text('🌅')
.fontSize(18)
.margin({ right: 8 })
Text('上午')
.fontSize(14)
.fontWeight(FontWeight.Bold)
.fontColor('#333333')
.margin({ right: 8 })
}
.width('100%')
.margin({ bottom: 4 })
Text(dayPlan.morning)
.fontSize(14)
.fontColor('#666666')
.lineHeight(22)
.margin({ bottom: 12 })
}
.width('100%')
// ... 下午、晚上、美食推荐
}
.width('100%')
.padding({ left: 16, right: 16, top: 16, bottom: 16 })
.backgroundColor('#FFFFFF')
.borderRadius(8)
.margin({ bottom: 12 })
}, (dayPlan: DayPlan) => dayPlan.day.toString())
卡片设计特点:
- 图标标识:使用🌅☀️🌙🍽️等图标区分时段
- 信息分层:天数标题、时段标题、行程描述三层布局
- 颜色区分:美食推荐使用红色突出显示
- 统一风格:所有行程卡片保持一致的设计
4.3 响应式布局
应用采用响应式设计,适配不同屏幕尺寸:
build() {
Column() {
// 标题栏
Row() {
Text('AI旅行攻略生成器')
.fontSize(20)
.fontWeight(FontWeight.Bold)
.fontColor('#ffffff')
}
.width('100%')
.height(56)
.padding({ left: 16, right: 16 })
.backgroundColor('#2ECC71')
// 输入区域
Column() {
// 目的地输入
// 天数选择
// 操作按钮
}
.width('100%')
.padding({ bottom: 16 })
.backgroundColor('#FAFAFA')
Divider()
.height(1)
.color('#E0E0E0')
// 结果展示区域
Scroll() {
Column() {
// 生成的攻略
// 历史记录
}
.width('100%')
}
.scrollable(ScrollDirection.Vertical)
.width('100%')
.layoutWeight(1)
.backgroundColor('#F5F5F5')
}
.width('100%')
.height('100%')
.backgroundColor('#F5F5F5')
}
布局特点:
- 弹性布局:使用layoutWeight实现自适应分配
- 滚动容器:内容区域支持垂直滚动
- 百分比宽度:使用百分比确保多设备适配
- 固定头部:标题栏固定在顶部
五、鸿蒙PC端适配策略
5.1 多设备形态适配
应用通过module.json5配置支持多种设备类型:
"deviceTypes": [
"phone",
"tablet",
"2in1"
]
5.2 PC端优化方向
5.2.1 大屏优化
在鸿蒙PC端,应用可以充分利用更大的屏幕空间:
- 分栏布局:目的地输入、行程预览、详细攻略三栏并列
- 字体放大:使用更大字号提高可读性
- 多窗口支持:允许同时打开多个目的地的攻略
- 侧边栏导航:固定历史记录在左侧
5.2.2 键鼠交互优化
PC端用户习惯使用键鼠操作:
- 快捷键支持:Ctrl+Enter快速生成,Ctrl+S保存攻略
- 右键菜单:快速复制、收藏、分享攻略
- 拖拽操作:支持拖拽调整行程顺序
- 键盘导航:支持Tab键切换焦点
5.2.3 旅行规划体验优化
PC端更适合深度规划:
- 地图集成:显示目的地地图和景点位置
- 日历视图:以日历形式展示行程安排
- 打印功能:支持打印完整攻略
- 导出功能:支持导出为PDF或Word格式
六、离线运行与网络扩展
6.1 离线运行方案
应用内置10个热门目的地的完整旅行攻略:
private readonly MOCK_DATA: MockDestination[] = [
{
name: '北京',
plans: [
{
day: 1,
morning: '上午:抵达北京,入住酒店后前往天安门广场,参观人民英雄纪念碑、毛主席纪念堂。',
afternoon: '下午:游览故宫博物院,感受明清皇家宫殿的宏伟壮观。',
evening: '晚上:前往王府井步行街,品尝北京烤鸭,体验老北京风情。',
food: '推荐美食:北京烤鸭、炸酱面、涮羊肉、豆汁焦圈'
},
// ... 更多天数
],
accommodation: '推荐住宿区域:王府井、西单、国贸、前门。建议选择地铁沿线酒店,方便出行。',
tips: '1. 故宫门票需提前网上预约;2. 长城建议选择八达岭或慕田峪;3. 北京地铁四通八达,建议购买交通卡;4. 夏季注意防晒,冬季注意保暖。'
},
// ... 更多目的地
];
离线数据特点:
- 覆盖广泛:包含10个热门旅游城市
- 内容完整:每个城市4天详细行程,包含美食、住宿、贴士
- 质量保证:每一条攻略都经过精心编写
- 随时可用:无需网络连接即可使用
6.2 网络扩展预留
应用预留了对接大模型的网络接口:
/*
预留的真实大模型调用代码
import http from '@ohos.net.http';
private async fetchOnlineGuide(destination: string, days: number): Promise<TravelGuide> {
let httpRequest = http.createHttp();
let response = await httpRequest.request(
'https://api.example.com/generate/travel-guide',
{
method: http.RequestMethod.POST,
header: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_API_KEY'
},
extraData: {
'destination': destination,
'days': days
}
}
);
let result = JSON.parse(response.result as string);
let planArray: Array<DayPlan> = [];
if (result['plan'] && Array.isArray(result['plan'])) {
let planList: Object[] = result['plan'] as Object[];
for (let i = 0; i < planList.length; i++) {
let dayObj: Object = planList[i];
let dayData: Record<string, Object> = dayObj as Record<string, Object>;
planArray.push({
day: Number(dayData['day'] || i + 1),
morning: String(dayData['morning'] || ''),
afternoon: String(dayData['afternoon'] || ''),
evening: String(dayData['evening'] || ''),
food: String(dayData['food'] || '')
});
}
}
return {
destination: String(result['destination'] || destination),
days: Number(result['days'] || days),
plan: planArray,
accommodation: String(result['accommodation'] || ''),
tips: String(result['tips'] || ''),
timestamp: Date.now()
};
}
*/
扩展方案:
- 接口标准化:定义统一的请求/响应格式
- 错误处理:完善的网络异常处理机制
- 降级策略:网络不可用时自动切换到Mock数据
- 批量请求:支持一次请求多日行程
七、开发实践与技术总结
7.1 ArkTS开发规范
7.1.1 类型安全
应用严格遵守类型安全原则:
- 禁止any类型:全部使用显式接口定义
- 接口优先:为所有数据结构定义接口
- 类型断言:使用as进行必要的类型转换
- 空值安全:使用null处理可选值
7.1.2 代码风格
- 命名规范:使用驼峰命名法
- 注释规范:关键逻辑添加注释说明
- 代码组织:按功能模块划分代码区域
- 常量定义:使用readonly定义常量
7.2 常见问题与解决方案
7.2.1 Preferences存储限制
问题:Preferences只能存储基本类型
解决方案:将复杂对象序列化为JSON字符串存储
let jsonStr: string = JSON.stringify(data);
await prefs.put(key, jsonStr);
7.2.2 JSON解析安全
问题:JSON解析可能抛出异常
解决方案:使用try-catch包裹解析逻辑,添加数据验证
private parseTravelGuide(jsonStr: string): TravelGuide | null {
try {
let parsedObj: Object = JSON.parse(jsonStr) as Object;
if (typeof parsedObj === 'object' && parsedObj !== null) {
let data: Record<string, Object> = parsedObj as Record<string, Object>;
if (data.destination && data.days && data.plan && data.accommodation && data.tips && data.timestamp) {
// ... 解析数据
}
}
} catch (error) {
console.error('解析旅行攻略失败');
}
return null;
}
7.2.3 异步数据加载
问题:Preferences加载是异步的,页面初始化时数据可能为空
解决方案:在aboutToAppear生命周期方法中加载数据
aboutToAppear(): void {
this.context = getContext(this) as common.Context;
this.loadHistory();
}
7.3 性能优化建议
- 减少重渲染:合理使用@State,避免不必要的状态更新
- 列表优化:ForEach使用稳定的key值
- 异步加载:数据加载放在异步线程执行
- 资源复用:单例模式管理Preferences实例
- 虚拟滚动:大量历史记录时使用List组件的虚拟滚动
八、应用特点与创新点
8.1 核心特点
8.1.1 目的地覆盖全面
- 支持10个热门旅游城市
- 涵盖北方、南方、海滨、山城等不同类型
- 每个城市4天详细行程
8.1.2 行程内容丰富
- 每日分为上午、下午、晚上三个时段
- 每个时段都有详细的行程安排
- 包含美食推荐、住宿建议、旅行贴士
8.1.3 智能匹配算法
- 支持模糊匹配
- 动态天数截取
- 兜底模板生成
8.1.4 离线优先的用户体验
- 内置10个目的地完整攻略
- 无需网络即可使用全部功能
- 网络可用时自动扩展能力
8.2 技术创新点
8.2.1 分段行程模型
- 将每日行程分为三个时段
- 每个时段独立管理
- 便于扩展和修改
8.2.2 模糊匹配机制
- 支持双向模糊匹配
- 提高用户输入的容错率
- 增强使用体验
8.2.3 历史记录管理
- 自动保存所有生成的攻略
- 支持点击查看历史内容
- 使用Preferences持久化存储
九、未来发展方向
9.1 功能扩展
- 地图集成:显示目的地地图和景点位置
- 日历视图:以日历形式展示行程安排
- 天气查询:查询目的地天气情况
- 预算管理:添加预算规划功能
- 分享功能:支持分享攻略到社交平台
9.2 技术升级
- 大模型集成:对接先进的AI大模型,生成个性化攻略
- 语音交互:支持语音输入目的地和天数
- 智能推荐:根据用户偏好推荐目的地
- 云端同步:支持跨设备的攻略同步
9.3 鸿蒙生态拓展
- 鸿蒙PC优化:针对PC端进行专门优化
- 多设备协同:支持手机、平板、PC多端协同规划
- 原子化服务:开发鸿蒙原子化服务版本
- 智慧屏适配:适配鸿蒙智慧屏,支持大屏规划
十、结语
AI旅行攻略生成器是一次将AI技术与旅行体验相结合的有益尝试。通过鸿蒙ArkTS语言的强大能力,我们实现了一个既具有实用价值又充满技术亮点的应用。
在鸿蒙PC生态不断发展的今天,原生开发的优势愈发明显。虽然鸿蒙Flutter框架提供了快速开发的能力,但对于追求极致性能和系统深度集成的旅行规划类应用来说,鸿蒙ArkTS无疑是更好的选择。
未来,我们将继续探索鸿蒙生态的更多可能性,为用户带来更丰富、更智能的旅行体验。让科技成为旅行的助力,是我们不懈追求的目标。
附录
A. 项目文件结构
e:\MyApplication\
├── entry\
│ ├── src\
│ │ └── main\
│ │ ├── ets\
│ │ │ ├── pages\
│ │ │ │ └── Index.ets # 主页面
│ │ │ └── entryability\
│ │ │ └── EntryAbility.ets # 应用入口
│ │ ├── resources\
│ │ │ └── base\
│ │ │ └── element\
│ │ │ ├── color.json # 颜色资源
│ │ │ └── string.json # 字符串资源
│ │ └── module.json5 # 模块配置
│ └── build-profile.json5 # 构建配置
└── AppScope\ # 应用全局配置
B. 权限配置
"requestPermissions": [
{
"name": "ohos.permission.INTERNET"
}
]
C. 运行环境要求
- HarmonyOS版本:API 24+
- DevEco Studio版本:3.1+
- 设备类型:手机、平板、2in1
本文介绍的AI旅行攻略生成器已完成开发,代码经过严格测试,可正常编译运行。如需了解更多细节,欢迎查阅项目源代码。
更多推荐



所有评论(0)