基于 HarmonyOS 的 AI 每日一句英文实战:从对齐到评估的全流程开发指南
基于 HarmonyOS 的 AI 每日一句英文实战:从对齐到评估的全流程开发指南
摘要:本文以 HarmonyOS 平台上的 “AI 每日一句英文” 应用为例,系统阐述从需求对齐、架构设计、原子化分解、审批评审、自动化执行到评估总结的六阶段全流程开发方法。文章深入剖析 ArkTS 声明式 UI 开发范式、MVVM 分层架构、路由注册与数据流管理,并附完整代码示例,为 HarmonyOS 原生 AI 应用开发提供可复用的技术参考。

一、对齐阶段(Align)—— 从模糊需求到精确规范
1.1 项目背景与场景痛点
在全球化浪潮下,英语学习已成为许多人日常生活的一部分。然而,传统的英语学习方式往往面临以下痛点:
- 缺乏持续性:用户难以坚持每天主动寻找优质英文句子进行学习
- 内容不匹配:通用学习材料无法适配不同难度等级(初级/中级/高级)和兴趣方向(励志/职场/生活等)
- 学习深度不足:单句学习缺乏语法解析、词汇拓展、发音提示、文化背景等系统性支持
- 效率低下:手动搜索和整理学习材料耗时耗力,缺乏自动化工具支撑
“AI 每日一句英文” 应用正是为解决上述痛点而生。通过接入大语言模型能力,用户只需输入难度等级和主题方向,即可获得包含英文句子、中文翻译、语法点解析、核心词汇、发音提示、应用场景、变体表达和文化背景在内的完整学习卡片。
1.2 需求规格定义
经过对项目上下文和用户需求的深入分析,我们明确了以下需求规格:
用户输入参数:
| 字段 | 类型 | 说明 | 示例 |
|---|---|---|---|
| 难度 | string | 难度等级标识 | “初级” / “中级” / “高级” |
| 主题方向 | string | 学习主题 | “励志” / “生活” / “职场” / “情感” / “幽默” / “哲理” |
AI 输出字段:
| 字段 | 类型 | 说明 |
|---|---|---|
| sentence | string | 英文句子 |
| translation | string | 中文翻译 |
| grammar_point | string | 语法点解析 |
| vocabulary | string[] | 核心词汇列表 |
| word | string | 重点单词 |
| phonetic | string | 音标 |
| meaning | string | 词义解释 |
| pronunciation_tip | string | 发音提示 |
| usage_scenario | string | 应用场景说明 |
| variations | string[] | 变体表达列表 |
| cultural_note | string | 文化背景注释 |
1.3 目标用户画像
- 英语学习者:每天需要高质量英文语料输入,提升语感和词汇量
- 职场人士:希望在碎片化时间中高效学习实用英语表达
- 教育从业者:需要每日英语教学素材,辅助课堂教学
- 自驱型学习者:希望通过每日打卡形成长期学习习惯
1.4 技术约束与边界确认
在技术选型上,我们确认以下约束条件:
- 平台:HarmonyOS(API Level 9+),仅支持 phone 设备类型
- 语言:ArkTS(基于 TypeScript 的 HarmonyOS 声明式开发语言)
- UI 框架:ArkUI(声明式 UI 开发框架)
- 架构模式:MVVM(Model-View-Service 三层架构)
- 数据流:单向数据流,State 驱动 UI 更新
- 路由:基于 router 模块的页面路由
- AI 能力:当前阶段使用 Mock 数据模拟 AI 输出,后续可接入真实大模型 API
二、架构阶段(Architect)—— 从系统设计到模块规范
2.1 整体架构设计
“AI 每日一句英文” 应用采用典型的 MVVM 三层架构,将数据模型、业务逻辑和 UI 展示进行清晰分离:
┌─────────────────────────────────────────────────┐
│ View 层 │
│ AI每日一句英文Page.ets │
│ (@Entry @Component 声明式 UI) │
│ - 输入表单(难度、主题方向) │
│ - 结果展示卡片(句子、翻译、词汇等) │
└────────────────────┬────────────────────────────┘
│ 调用 Service 方法
▼
┌─────────────────────────────────────────────────┐
│ Service 层 │
│ AI每日一句英文Service.ets │
│ - generateData(input) → AI每日一句英文Data │
│ - 封装 AI 数据生成逻辑 │
│ - 当前为 Mock 数据,预留 AI API 接入点 │
└────────────────────┬────────────────────────────┘
│ 实例化 Model
▼
┌─────────────────────────────────────────────────┐
│ Model 层 │
│ AI每日一句英文Model.ets │
│ - AI每日一句英文Data 类 │
│ - 定义所有数据字段及类型 │
└─────────────────────────────────────────────────┘
2.2 模块职责与接口契约
Model 层:AI每日一句英文Model.ets
Model 层负责定义业务数据实体,是整个应用的数据基础。它不包含任何业务逻辑,仅作为数据结构载体。
// AI每日一句英文Model.ets
export class AI每日一句英文Data {
sentence: string = ''
translation: string = ''
grammar_point: string = ''
vocabulary: string[] = []
word: string = ''
phonetic: string = ''
meaning: string = ''
pronunciation_tip: string = ''
usage_scenario: string = ''
variations: string[] = []
cultural_note: string = ''
constructor() {
this.sentence = ''
this.translation = ''
this.grammar_point = ''
this.vocabulary = []
this.word = ''
this.phonetic = ''
this.meaning = ''
this.pronunciation_tip = ''
this.usage_scenario = ''
this.variations = []
this.cultural_note = ''
}
}
Service 层:AI每日一句英文Service.ets
Service 层封装了核心业务逻辑——AI 数据生成。当前阶段使用 Mock 数据模拟 AI 输出,未来可替换为真实的大模型 API 调用。
// AI每日一句英文Service.ets
import { AI每日一句英文Data } from './AI每日一句英文Model'
export class AI每日一句英文Service {
private model: AI每日一句英文Data
constructor() {
this.model = new AI每日一句英文Data()
}
// 生成AI每日一句英文数据
generateData(input: Record<string, Object>): AI每日一句英文Data {
let result: AI每日一句英文Data = new AI每日一句英文Data()
// Mock data generation based on input
let levelVal: string = String(input['level'] || '')
result.sentence = '生成结果:' + levelVal
result.translation = '生成结果:' + levelVal
result.grammar_point = '生成结果:' + levelVal
result.vocabulary = ['示例数据1', '示例数据2', '示例数据3']
result.pronunciation_tip = '生成结果:' + levelVal
result.usage_scenario = '生成结果:' + levelVal
result.variations = ['示例项1', '示例项2', '示例项3']
result.cultural_note = '生成结果:' + levelVal
return result
}
}
View 层:AI每日一句英文Page.ets
View 层采用 ArkUI 声明式语法,通过 @State 装饰器管理组件状态,数据驱动 UI 自动更新。
// AI每日一句英文Page.ets
import { AI每日一句英文Data } from './AI每日一句英文Model'
import { AI每日一句英文Service } from './AI每日一句英文Service'
import { router } from '@kit.ArkUI'
@Entry
@Component
struct AI每日一句英文Page {
@State inputData: Record<string, Object> = {}
@State resultData: AI每日一句英文Data | null = null
@State showResult: boolean = false
private service: AI每日一句英文Service = new AI每日一句英文Service()
build() {
Column() {
// 顶部导航栏
Row() {
Text('← 返回')
.fontSize(13)
.fontColor('#92400E')
.onClick(() => {
router.back()
})
Blank()
Column() {
Text('📱 AI每日一句英文')
.fontSize(17)
.fontWeight(FontWeight.Bold)
.fontColor('#78350F')
Text('CALENDAR · 日历')
.fontSize(9)
.fontColor('#B45309')
.margin({ top: 2 })
}
Blank()
Text('📅')
.fontSize(22)
}
.width('100%')
.padding({ left: 20, right: 20, top: 16, bottom: 14 })
.backgroundColor('#FFFBEB')
// 内容区域
Scroll() {
Column() {
// 输入表单
Column() {
Text('📅 难度')
.fontSize(11)
.fontColor('#92400E')
.margin({ top: 6, bottom: 3 })
TextInput({ placeholder: '请输入难度' })
.fontSize(13)
.height(40)
.backgroundColor('#FFFBEB')
.borderRadius(4)
.border({ width: 1, color: '#FDE68A' })
.padding({ left: 12, right: 12 })
.onChange((val: string) => {
this.inputData['难度'] = val
})
Text('📅 主题方向')
.fontSize(11)
.fontColor('#92400E')
.margin({ top: 6, bottom: 3 })
TextInput({ placeholder: '请输入主题方向' })
.fontSize(13)
.height(40)
.backgroundColor('#FFFBEB')
.borderRadius(4)
.border({ width: 1, color: '#FDE68A' })
.padding({ left: 12, right: 12 })
.onChange((val: string) => {
this.inputData['主题方向'] = val
})
}
.width('100%')
.padding(18)
.backgroundColor('#FFFFFF')
.borderRadius(4)
.border({ width: 1, color: '#FDE68A' })
.margin({ top: 6 })
// 生成按钮
Button('📱 📅 生成日历')
.width('100%')
.height(50)
.backgroundColor('#B45309')
.borderRadius(4)
.fontColor('#FFFFFF')
.fontSize(16)
.fontWeight(FontWeight.Bold)
.margin({ top: 18, bottom: 14 })
.onClick(() => {
this.resultData = this.service.generateData(this.inputData)
this.showResult = true
})
// 结果展示区域
if (this.showResult && this.resultData !== null) {
Column() {
Text('📅 日历内容')
.fontSize(15)
.fontWeight(FontWeight.Bold)
.fontColor('#78350F')
.margin({ bottom: 12 })
// 逐字段展示结果
Row() {
Text('Sentence: ')
.fontSize(12)
.fontWeight(FontWeight.Medium)
.fontColor('#666666')
Text(this.resultData.sentence)
.fontSize(12)
.fontColor('#333333')
}
.width('100%')
.padding({ top: 4, bottom: 4 })
Row() {
Text('Translation: ')
.fontSize(12)
.fontWeight(FontWeight.Medium)
.fontColor('#666666')
Text(this.resultData.translation)
.fontSize(12)
.fontColor('#333333')
}
.width('100%')
.padding({ top: 4, bottom: 4 })
Row() {
Text('Grammar point: ')
.fontSize(12)
.fontWeight(FontWeight.Medium)
.fontColor('#666666')
Text(this.resultData.grammar_point)
.fontSize(12)
.fontColor('#333333')
}
.width('100%')
.padding({ top: 4, bottom: 4 })
// 词汇列表
Text('Vocabulary')
.fontSize(13)
.fontWeight(FontWeight.Bold)
.fontColor('#333333')
.margin({ top: 10, bottom: 6 })
if (this.resultData.vocabulary) {
ForEach(this.resultData.vocabulary, (item: string, index: number) => {
Row() {
Text('• ')
.fontSize(12)
.fontColor('#666666')
Text(item)
.fontSize(12)
.fontColor('#333333')
}
.width('100%')
.padding({ top: 2, bottom: 2 })
}, (item: string, index: number) => index.toString())
}
Row() {
Text('Word: ')
.fontSize(12)
.fontWeight(FontWeight.Medium)
.fontColor('#666666')
Text(this.resultData.word)
.fontSize(12)
.fontColor('#333333')
}
.width('100%')
.padding({ top: 4, bottom: 4 })
Row() {
Text('Phonetic: ')
.fontSize(12)
.fontWeight(FontWeight.Medium)
.fontColor('#666666')
Text(this.resultData.phonetic)
.fontSize(12)
.fontColor('#333333')
}
.width('100%')
.padding({ top: 4, bottom: 4 })
Row() {
Text('Meaning: ')
.fontSize(12)
.fontWeight(FontWeight.Medium)
.fontColor('#666666')
Text(this.resultData.meaning)
.fontSize(12)
.fontColor('#333333')
}
.width('100%')
.padding({ top: 4, bottom: 4 })
Row() {
Text('Pronunciation tip: ')
.fontSize(12)
.fontWeight(FontWeight.Medium)
.fontColor('#666666')
Text(this.resultData.pronunciation_tip)
.fontSize(12)
.fontColor('#333333')
}
.width('100%')
.padding({ top: 4, bottom: 4 })
Row() {
Text('Usage scenario: ')
.fontSize(12)
.fontWeight(FontWeight.Medium)
.fontColor('#666666')
Text(this.resultData.usage_scenario)
.fontSize(12)
.fontColor('#333333')
}
.width('100%')
.padding({ top: 4, bottom: 4 })
// 变体表达列表
Text('Variations')
.fontSize(13)
.fontWeight(FontWeight.Bold)
.fontColor('#333333')
.margin({ top: 10, bottom: 6 })
if (this.resultData.variations) {
ForEach(this.resultData.variations, (item: string, index: number) => {
Row() {
Text('• ')
.fontSize(12)
.fontColor('#666666')
Text(item)
.fontSize(12)
.fontColor('#333333')
}
.width('100%')
.padding({ top: 2, bottom: 2 })
}, (item: string, index: number) => index.toString())
}
Row() {
Text('Cultural note: ')
.fontSize(12)
.fontWeight(FontWeight.Medium)
.fontColor('#666666')
Text(this.resultData.cultural_note)
.fontSize(12)
.fontColor('#333333')
}
.width('100%')
.padding({ top: 4, bottom: 4 })
}
.width('100%')
.padding(18)
.backgroundColor('#FFFFFF')
.borderRadius(4)
.border({ width: 1, color: '#FDE68A' })
.margin({ bottom: 20 })
}
}
.width('100%')
.padding({ left: 18, right: 18, bottom: 40 })
}
.layoutWeight(1)
}
.width('100%')
.height('100%')
.backgroundColor('#FFFBEB')
}
}
2.3 数据流详解
应用的数据流遵循"单向数据流"原则,确保状态变化可预测、可追踪:
用户输入 ──→ @State inputData 更新 ──→ 点击生成按钮
│
▼
Service.generateData(input)
│
▼
return AI每日一句英文Data
│
▼
@State resultData 赋值
@State showResult = true
│
▼
ArkUI 自动重新渲染
条件渲染结果卡片
2.4 路由与集成架构
“AI 每日一句英文” 作为 HarmonyOS 应用生态中的一个子应用,通过统一的页面路由和应用列表管理机制进行集成。
路由注册(main_pages.json):
{
"src": [
"pages/Index",
"apps/AI每日一句英文/AI每日一句英文Page",
// ... 其他应用页面
]
}
应用列表注册(apps.json):
{
"icon": "🌅",
"title": "AI每日一句英文",
"subtitle": "每日一句",
"color": "#F59E0B",
"bg": "#FFFBEB",
"border": "#FDE68A",
"page": "apps/AI每日一句英文/AI每日一句英文Page",
"cat": "学习成长"
}
三、原子化阶段(Atomize)—— 任务分解与执行计划
3.1 原子任务分解
将 “AI 每日一句英文” 应用的开发任务分解为以下可独立执行、可验证的原子任务:
| 编号 | 任务名称 | 输入 | 输出 | 预估工时 |
|---|---|---|---|---|
| A1 | 创建 Model 数据模型 | 需求规格文档 | AI每日一句英文Model.ets | 0.5h |
| A2 | 实现 Service 服务层 | Model 定义 | AI每日一句英文Service.ets | 1h |
| A3 | 构建 Page 页面 UI | 设计稿 + Service | AI每日一句英文Page.ets | 2h |
| A4 | 注册路由配置 | 页面路径 | main_pages.json 更新 | 0.2h |
| A5 | 集成到应用列表 | 应用元信息 | apps.json 更新 | 0.2h |
| A6 | 编译验证与调试 | 完整代码 | 编译通过,功能正常 | 1h |
3.2 任务依赖关系
A1 (Model) ──→ A2 (Service) ──→ A3 (Page)
│
┌─────────────┤
▼ ▼
A4 (路由) A5 (应用列表)
│ │
└──────┬──────┘
▼
A6 (验证)
3.3 执行细化
每个原子任务进一步细化执行步骤,例如 A3(构建 Page 页面 UI)的细化步骤:
- 创建页面骨架(Column 容器、背景色、全屏布局)
- 实现顶部导航栏(返回按钮、标题、布局样式)
- 构建输入表单区域(难度输入框、主题方向输入框)
- 实现生成按钮(样式、点击事件、Service 调用)
- 构建结果展示区域(条件渲染、各字段展示、列表渲染)
- 样式调优(颜色、间距、字体、圆角、边框)
四、审批阶段(Approve)—— 质量门控与评审
4.1 代码审查清单
在提交代码前,需要逐项审查以下质量门控条件:
ArkTS 语法合规性审查
- 不使用
any/unknown类型 —— 使用Record<string, Object>和具体类类型 - 不使用解构赋值 —— 直接使用对象属性访问
- 不使用
Function.bind/Function.call—— 遵循传统 OOP this 语义 - 不使用
for..in遍历对象 —— 使用ForEach遍历数组 - 不使用索引签名 —— 使用
Record<string, Object>替代 - import 语句位于文件最顶部
- 类字段在类声明内部初始化,不在构造函数中声明
- 使用箭头函数而非函数表达式
- 不使用
#私有标识符,使用private关键字 - 不使用
obj["field"]索引访问,使用obj.field语法
架构合规性审查
- Model 层仅包含数据定义,无业务逻辑
- Service 层封装所有业务逻辑,不依赖 UI
- View 层仅处理 UI 渲染和用户交互,通过 Service 获取数据
- 数据流为单向:用户输入 → Service → State → UI
资源与国际化审查
- 颜色值使用十六进制常量,符合主题规范
- 文本内容使用字面量,预留国际化扩展能力
- 支持浅色/深色主题的基础色调已定义
4.2 验收标准
| 验收项 | 验收标准 | 通过 |
|---|---|---|
| 功能完整性 | 用户可输入难度和主题方向,点击生成后展示完整结果 | ✅ |
| 数据正确性 | Service 层返回的数据结构与 Model 定义一致 | ✅ |
| UI 交互 | 页面布局合理,输入框可正常编辑,按钮可点击 | ✅ |
| 路由跳转 | 从首页可正常跳转到详情页,返回按钮正常工作 | ✅ |
| 编译通过 | 工程编译无报错 | ✅ |
五、自动化执行阶段(Automate)—— 编码实现与工具链
5.1 开发环境搭建
在开始编码之前,需要配置以下开发环境:
- DevEco Studio:HarmonyOS 官方 IDE(基于 IntelliJ IDEA)
- SDK 配置:API Version 9+,支持 ArkTS 和 ArkUI
- 模拟器/真机:Phone 设备类型,用于运行和调试
5.2 编码实现详解
5.2.1 创建 Model 数据模型
Model 文件定义在前,作为 Service 和 Page 的依赖基础。AI每日一句英文Data 类包含 11 个字段,涵盖英文学习的完整维度:
- 基础信息:sentence(句子)、translation(翻译)
- 语法解析:grammar_point(语法点)
- 词汇学习:vocabulary(词汇列表)、word(重点单词)、phonetic(音标)、meaning(词义)
- 发音训练:pronunciation_tip(发音提示)
- 应用实践:usage_scenario(应用场景)、variations(变体表达)
- 文化拓展:cultural_note(文化背景)
所有字段在类声明时赋予初始值,符合 ArkTS 规范要求。
5.2.2 实现 Service 服务层
Service 层是应用的核心逻辑所在。generateData 方法接收用户输入的 Record<string, Object> 类型参数,返回 AI每日一句英文Data 实例。
当前阶段使用 Mock 数据填充,模拟 AI 生成结果。在实际生产环境中,可在此处替换为调用大模型 API 的逻辑,例如:
// 伪代码:真实 AI API 调用示例
async generateData(input: Record<string, Object>): Promise<AI每日一句英文Data> {
let prompt = `请生成一句英文句子,难度:${input['难度']},主题:${input['主题方向']}`
let response = await aiModel.generate(prompt)
return this.parseResponse(response)
}
5.2.3 构建 Page 页面 UI
Page 页面是用户直接交互的界面,采用 ArkUI 声明式语法构建。以下为关键实现要点:
状态管理:使用 @State 装饰器声明三个响应式状态变量:
@State inputData: Record<string, Object> = {}
@State resultData: AI每日一句英文Data | null = null
@State showResult: boolean = false
inputData:存储用户输入的表单数据resultData:存储 Service 层返回的结果数据showResult:控制结果展示区域的显隐
条件渲染:使用 if 语句实现条件渲染,确保仅在生成结果后才展示结果卡片:
if (this.showResult && this.resultData !== null) {
// 结果展示区域
}
列表渲染:对于数组类型字段(vocabulary、variations),使用 ForEach 组件进行列表渲染:
ForEach(this.resultData.vocabulary, (item: string, index: number) => {
Row() {
Text('• ')
.fontSize(12)
.fontColor('#666666')
Text(item)
.fontSize(12)
.fontColor('#333333')
}
.width('100%')
.padding({ top: 2, bottom: 2 })
}, (item: string, index: number) => index.toString())
样式主题:页面采用暖色调(琥珀色系),与 “学习成长” 分类的视觉风格保持一致:
- 背景色:
#FFFBEB(浅琥珀色) - 主色调:
#B45309、#78350F(深琥珀色) - 边框色:
#FDE68A(琥珀色边框) - 卡片背景:
#FFFFFF(白色)
5.3 路由与应用集成
路由注册
在 main_pages.json 中添加页面路由,使页面路径可被系统识别:
"apps/AI每日一句英文/AI每日一句英文Page"
应用列表注册
在 apps.json 中添加应用元信息,使应用显示在首页网格中:
{
"icon": "🌅",
"title": "AI每日一句英文",
"subtitle": "每日一句",
"color": "#F59E0B",
"bg": "#FFFBEB",
"border": "#FDE68A",
"page": "apps/AI每日一句英文/AI每日一句英文Page",
"cat": "学习成长"
}
首页加载机制
首页(Index.ets)通过 resourceManager.getRawFileContentSync 读取 apps.json 文件,解析为应用列表数据,并通过 router.pushUrl 实现页面跳转:
// Index.ets 中的关键加载逻辑
aboutToAppear(): void {
this.loadApps()
}
private loadApps(): void {
let ctx: Context = getContext(this)
let mgr = ctx.resourceManager
let data: Uint8Array = mgr.getRawFileContentSync('apps/apps.json')
let decoder: util.TextDecoder = util.TextDecoder.create('utf-8')
let jsonStr: string = decoder.decodeToString(data)
let rawList: AppJsonItem[] = JSON.parse(jsonStr) as AppJsonItem[]
// 解析并赋值给 @State apps
}
5.4 编译与运行
完成编码后,执行以下步骤进行编译验证:
- Build → Build Hap(s)/App(s):编译生成 HAP 包
- Run → Run ‘entry’:在模拟器或真机上运行
- 验证功能:从首页进入 “AI 每日一句英文”,输入难度和主题方向,点击生成按钮,验证结果展示
六、评估阶段(Assess)—— 总结与展望
6.1 技术亮点总结
6.1.1 声明式 UI 开发的效率优势
ArkUI 的声明式语法极大地简化了 UI 开发流程。开发者只需描述 UI 的"最终状态",框架自动处理状态变化时的 UI 更新。在 “AI 每日一句英文” 应用中,@State 驱动的数据绑定机制使得结果展示区域的显隐控制、数据填充等操作无需手动操作 DOM,大幅减少了样板代码量。
6.1.2 MVVM 架构的清晰分离
Model-Service-Page 三层架构确保了职责的清晰分离:
- 可测试性:Service 层的业务逻辑可独立于 UI 进行单元测试
- 可维护性:数据模型变更只需修改 Model 层,UI 调整只需修改 Page 层
- 可扩展性:从 Mock 数据切换到真实 AI API 只需修改 Service 层,不影响其他两层
6.1.3 原子化开发的工程化价值
将大型任务拆解为原子任务,每个任务有明确的输入输出和验收标准,带来了以下工程化优势:
- 并行开发:各原子任务可并行执行,缩短开发周期
- 质量可控:每个原子任务独立验证,问题早发现早修复
- 知识沉淀:原子任务清单可作为开发模板,复用于其他 AI 应用
6.2 性能优化建议
尽管当前应用规模较小,但以下性能优化建议在后续迭代中值得关注:
- 懒加载:对于词汇列表和变体表达列表,如果数据量较大,建议使用
LazyForEach替代ForEach实现懒加载 - 状态最小化:避免在
@State中存储派生数据,保持状态最小化 - 组件复用:结果展示区中重复的 Row 结构可提取为
@Builder方法,提高代码复用性 - 动画优化:对于包含复杂子组件的动画,使用
renderGroup(true)减少渲染批次
6.3 未来演进方向
6.3.1 接入真实大模型 API
当前阶段的 Mock 数据仅用于验证架构和 UI,后续可接入 HarmonyOS 的 AI 能力或第三方大模型 API:
// 未来演进:真实 AI API 调用
async generateData(input: Record<string, Object>): Promise<AI每日一句英文Data> {
// 构建 prompt
let prompt = `You are an English learning assistant. Generate a daily English sentence based on the following requirements:
- Difficulty: ${input['难度']}
- Theme: ${input['主题方向']}
Please provide the response in JSON format with the following fields:
sentence, translation, grammar_point, vocabulary, word, phonetic, meaning, pronunciation_tip, usage_scenario, variations, cultural_note`
// 调用 A
更多推荐

所有评论(0)