欢迎光临
我们一直在努力

HarmonyOS智慧农业管理应用开发教程--高高种地-- 第21篇:二十四节气与农事指导

第21篇:二十四节气与农事指导

📚 本篇导读

二十四节气是中国传统农耕文明的智慧结晶,反映了季节、气候、物候的变化规律,对农业生产具有重要的指导意义。本篇教程将实现一个完整的节气系统,结合传统农耕智慧与现代技术,为农户提供基于节气的农事指导。

本篇将实现:

  • 📅 节气计算算法(基于公历日期自动计算当前节气)
  • 🌾 节气农事推荐(每个节气的种植建议)
  • 📖 节气知识展示(节气诗词、气候特点)
  • ⏰ 节气提醒功能(节气到来时自动提醒)
  • 📊 节气日历展示(全年24节气一览)

🎯 学习目标

完成本篇教程后,你将掌握:

  • 如何实现节气计算算法
  • 如何设计节气数据模型
  • 如何展示节气信息和农事建议
  • 如何实现节气提醒功能
  • 传统农耕智慧与现代技术的结合

  • 一、二十四节气概述

    1.1 什么是二十四节气?

    二十四节气是中国古代订立的一种用来指导农事的补充历法,是中华民族劳动人民长期经验的积累和智慧的结晶。

    二十四节气列表:

    季节节气时间含义
    春季 立春 2月3-5日 春季开始
    雨水 2月18-20日 降雨增多
    惊蛰 3月5-7日 春雷惊醒蛰虫
    春分 3月20-22日 昼夜平分
    清明 4月4-6日 天气清明
    谷雨 4月19-21日 雨生百谷
    夏季 立夏 5月5-7日 夏季开始
    小满 5月20-22日 麦粒饱满
    芒种 6月5-7日 麦类收割
    夏至 6月21-22日 白昼最长
    小暑 7月6-8日 天气炎热
    大暑 7月22-24日 最热时期
    秋季 立秋 8月7-9日 秋季开始
    处暑 8月22-24日 暑气结束
    白露 9月7-9日 露水增多
    秋分 9月22-24日 昼夜平分
    寒露 10月8-9日 露水变冷
    霜降 10月23-24日 开始降霜
    冬季 立冬 11月7-8日 冬季开始
    小雪 11月22-23日 开始降雪
    大雪 12月6-8日 降雪增多
    冬至 12月21-23日 白昼最短
    小寒 1月5-7日 天气寒冷
    大寒 1月20-21日 最冷时期

    1.2 节气与农业的关系

    节气指导农业生产
    ├── 播种时机
    │ ├── 立春:春耕开始
    │ ├── 惊蛰:春播高峰
    │ └── 清明:春播结束

    ├── 田间管理
    │ ├── 雨水:灌溉施肥
    │ ├── 谷雨:病虫害防治
    │ └── 小满:田间除草

    ├── 收获时节
    │ ├── 芒种:麦类收割
    │ ├── 秋分:秋收开始
    │ └── 霜降:秋收结束

    └── 农闲准备
    ├── 立冬:整理农具
    ├── 冬至:规划来年
    └── 大寒:准备春耕

    1.3 数据模型设计

    节气推荐接口:

    /**
    * 节气推荐信息
    */

    export interface SolarTermRecommendation {
    solarTerm: string; // 节气名称
    period: string; // 时间段
    temperature: string; // 温度特点
    poem: string; // 代表诗词
    poemAuthor: string; // 诗词作者
    vegetables: string[]; // 推荐蔬菜
    fruits: string[]; // 推荐水果
    grains: string[]; // 推荐粮食作物
    flowers: string[]; // 推荐花卉
    precautions: string[]; // 注意事项
    farmWork: string[]; // 农事活动
    }


    二、SolarTermService服务实现

    2.1 服务类设计

    文件位置:entry/src/main/ets/services/SolarTermService.ets

    /**
    * 节气服务
    * 提供农历节气相关的种植推荐
    */

    export class SolarTermService {
    private static instance: SolarTermService;

    private constructor() {}

    public static getInstance(): SolarTermService {
    if (!SolarTermService.instance) {
    SolarTermService.instance = new SolarTermService();
    }
    return SolarTermService.instance;
    }

    /**
    * 获取当前节气
    */

    public getCurrentSolarTerm(): string {
    const now = new Date();
    const month = now.getMonth() + 1;
    const day = now.getDate();

    // 基于公历日期判断节气
    return this.calculateSolarTerm(month, day);
    }

    /**
    * 获取节气种植推荐
    */

    public getSolarTermRecommendation(solarTerm?: string): SolarTermRecommendation {
    const term = solarTerm || this.getCurrentSolarTerm();
    const recommendations = this.getAllRecommendations();
    return recommendations[term] || recommendations['立春'];
    }

    /**
    * 获取所有节气列表
    */

    public getAllSolarTerms(): string[] {
    return [
    '立春', '雨水', '惊蛰', '春分', '清明', '谷雨',
    '立夏', '小满', '芒种', '夏至', '小暑', '大暑',
    '立秋', '处暑', '白露', '秋分', '寒露', '霜降',
    '立冬', '小雪', '大雪', '冬至', '小寒', '大寒'
    ];
    }
    }

    // 导出单例实例
    export const solarTermService = SolarTermService.getInstance();

    2.2 节气计算算法

    /**
    * 根据公历日期计算节气
    * @param month 月份(1-12)
    * @param day 日期(1-31)
    * @returns 节气名称
    */

    private calculateSolarTerm(month: number, day: number): string {
    // 简化的节气判断(基于公历日期)
    if (month === 1) {
    if (day < 6) return '小寒';
    if (day < 20) return '大寒';
    return '立春';
    } else if (month === 2) {
    if (day < 4) return '立春';
    if (day < 19) return '雨水';
    return '惊蛰';
    } else if (month === 3) {
    if (day < 6) return '惊蛰';
    if (day < 21) return '春分';
    return '清明';
    } else if (month === 4) {
    if (day < 5) return '清明';
    if (day < 20) return '谷雨';
    return '立夏';
    } else if (month === 5) {
    if (day < 6) return '立夏';
    if (day < 21) return '小满';
    return '芒种';
    } else if (month === 6) {
    if (day < 6) return '芒种';
    if (day < 21) return '夏至';
    return '小暑';
    } else if (month === 7) {
    if (day < 7) return '小暑';
    if (day < 23) return '大暑';
    return '立秋';
    } else if (month === 8) {
    if (day < 8) return '立秋';
    if (day < 23) return '处暑';
    return '白露';
    } else if (month === 9) {
    if (day < 8) return '白露';
    if (day < 23) return '秋分';
    return '寒露';
    } else if (month === 10) {
    if (day < 8) return '寒露';
    if (day < 24) return '霜降';
    return '立冬';
    } else if (month === 11) {
    if (day < 7) return '立冬';
    if (day < 22) return '小雪';
    return '大雪';
    } else {
    if (day < 7) return '大雪';
    if (day < 22) return '冬至';
    return '小寒';
    }
    }

    算法说明:

    • 基于公历日期进行简化判断
    • 每个节气对应固定的日期范围
    • 实际应用中可使用更精确的天文算法

    2.3 节气数据库

    实现完整的24节气数据:

    /**
    * 所有节气的种植推荐
    */

    private getAllRecommendations(): Record<string, SolarTermRecommendation> {
    return {
    '立春': {
    solarTerm: '立春',
    period: '2月3-5日',
    temperature: '气温回升,万物复苏',
    poem: '律回岁晚冰霜少,春到人间草木知。便觉眼前生意满,东风吹水绿参差。',
    poemAuthor: '宋·张栻',
    vegetables: ['菠菜', '生菜', '香菜', '小白菜', '萝卜'],
    fruits: ['草莓(育苗)', '葡萄(修剪)'],
    grains: ['春小麦', '春玉米(准备)'],
    flowers: ['三色堇', '金盏菊', '矮牵牛'],
    precautions: [
    '注意倒春寒,做好保温措施',
    '及时清理田间杂草',
    '检查灌溉设施',
    '准备春耕农资'
    ],
    farmWork: [
    '翻耕土地,施基肥',
    '修剪果树',
    '播种耐寒蔬菜',
    '温室育苗'
    ]
    },
    '雨水': {
    solarTerm: '雨水',
    period: '2月18-20日',
    temperature: '降雨增多,气温波动',
    poem: '好雨知时节,当春乃发生。随风潜入夜,润物细无声。',
    poemAuthor: '唐·杜甫',
    vegetables: ['豌豆', '蚕豆', '韭菜', '芹菜', '茼蒿'],
    fruits: ['桃树(施肥)', '梨树(修剪)'],
    grains: ['早稻(育秧)', '春玉米'],
    flowers: ['郁金香', '风信子', '报春花'],
    precautions: [
    '注意排水防涝',
    '预防病虫害',
    '控制浇水量',
    '加强通风'
    ],
    farmWork: [
    '继续春耕整地',
    '播种春季作物',
    '果树施肥',
    '蔬菜育苗'
    ]
    },
    '清明': {
    solarTerm: '清明',
    period: '4月4-6日',
    temperature: '天气清明,气温适宜',
    poem: '清明时节雨纷纷,路上行人欲断魂。借问酒家何处有,牧童遥指杏花村。',
    poemAuthor: '唐·杜牧',
    vegetables: ['黄瓜', '番茄', '茄子', '辣椒', '豆角'],
    fruits: ['西瓜(育苗)', '甜瓜(育苗)'],
    grains: ['春玉米', '花生', '大豆'],
    flowers: ['牡丹', '芍药', '月季'],
    precautions: [
    '注意防治病虫害',
    '及时浇水施肥',
    '做好除草工作',
    '防范倒春寒'
    ],
    farmWork: [
    '春播春种',
    '移栽秧苗',
    '果树授粉',
    '田间管理'
    ]
    },
    '立夏': {
    solarTerm: '立夏',
    period: '5月5-7日',
    temperature: '夏季开始,气温升高',
    poem: '绿树阴浓夏日长,楼台倒影入池塘。水晶帘动微风起,满架蔷薇一院香。',
    poemAuthor: '唐·高骈',
    vegetables: ['空心菜', '苋菜', '丝瓜', '冬瓜', '南瓜'],
    fruits: ['西瓜', '甜瓜', '葡萄(管理)'],
    grains: ['夏玉米', '夏大豆'],
    flowers: ['向日葵', '荷花', '茉莉'],
    precautions: [
    '增加浇水频次',
    '注意防暑降温',
    '加强病虫害防治',
    '及时追肥'
    ],
    farmWork: [
    '夏播夏种',
    '中耕除草',
    '灌溉施肥',
    '病虫害防治'
    ]
    },
    '芒种': {
    solarTerm: '芒种',
    period: '6月5-7日',
    temperature: '麦类成熟,农忙时节',
    poem: '时雨及芒种,四野皆插秧。家家麦饭美,处处菱歌长。',
    poemAuthor: '宋·陆游',
    vegetables: ['秋黄瓜', '秋豆角', '秋茄子'],
    fruits: ['葡萄(套袋)', '桃子(采收)'],
    grains: ['晚稻(插秧)', '夏玉米'],
    flowers: ['百日草', '鸡冠花', '凤仙花'],
    precautions: [
    '抢收抢种',
    '防范暴雨',
    '注意防涝',
    '及时晾晒'
    ],
    farmWork: [
    '收割小麦',
    '插秧种稻',
    '夏播作物',
    '果树管理'
    ]
    },
    '秋分': {
    solarTerm: '秋分',
    period: '9月22-24日',
    temperature: '昼夜平分,秋高气爽',
    poem: '秋分客尚在,竹露夕微微。',
    poemAuthor: '唐·杜甫',
    vegetables: ['大白菜', '萝卜', '菠菜', '香菜'],
    fruits: ['苹果(采收)', '梨(采收)'],
    grains: ['冬小麦(准备)'],
    flowers: ['菊花', '桂花', '木芙蓉'],
    precautions: [
    '抓紧秋收',
    '准备秋播',
    '防范早霜',
    '储存农产品'
    ],
    farmWork: [
    '秋收作物',
    '整地施肥',
    '播种冬小麦',
    '果树采收'
    ]
    },
    '冬至': {
    solarTerm: '冬至',
    period: '12月21-23日',
    temperature: '白昼最短,寒冷加剧',
    poem: '天时人事日相催,冬至阳生春又来。',
    poemAuthor: '唐·杜甫',
    vegetables: ['温室蔬菜管理'],
    fruits: ['果树修剪'],
    grains: ['冬小麦(越冬管理)'],
    flowers: ['温室花卉'],
    precautions: [
    '做好防寒保暖',
    '检查温室设施',
    '储备农资',
    '规划来年生产'
    ],
    farmWork: [
    '冬季管理',
    '整理农具',
    '积肥造肥',
    '规划来年'
    ]
    }
    // 其他节气数据…
    };
    }


    三、节气展示UI实现

    3.1 节气卡片组件

    在首页或专门页面展示当前节气:

    @Component
    export struct SolarTermCard {
    @State currentTerm: SolarTermRecommendation | null = null;

    aboutToAppear(): void {
    this.currentTerm = solarTermService.getSolarTermRecommendation();
    }

    build() {
    if (this.currentTerm) {
    Column({ space: 16 }) {
    // 节气标题
    Row() {
    Text('🌾')
    .fontSize(32)

    Column() {
    Text(this.currentTerm.solarTerm)
    .fontSize(24)
    .fontWeight(FontWeight.Bold)
    .fontColor('#333333')

    Text(this.currentTerm.period)
    .fontSize(14)
    .fontColor('#999999')
    .margin({ top: 4 })
    }
    .alignItems(HorizontalAlign.Start)
    .margin({ left: 12 })
    }
    .width('100%')

    // 气候特点
    Text(this.currentTerm.temperature)
    .fontSize(14)
    .fontColor('#666666')
    .width('100%')

    // 诗词
    Column({ space: 8 }) {
    Text(this.currentTerm.poem)
    .fontSize(13)
    .fontColor('#666666')
    .fontStyle(FontStyle.Italic)
    .lineHeight(22)
    .width('100%')

    Text(`—— ${this.currentTerm.poemAuthor}`)
    .fontSize(12)
    .fontColor('#999999')
    .width('100%')
    .textAlign(TextAlign.End)
    }
    .width('100%')
    .padding(12)
    .backgroundColor('#FFF9E6')
    .borderRadius(8)

    // 推荐作物
    this.buildCropSection('推荐蔬菜', this.currentTerm.vegetables, '🥬');
    this.buildCropSection('推荐水果', this.currentTerm.fruits, '🍎');
    this.buildCropSection('推荐粮食', this.currentTerm.grains, '🌾');

    // 农事活动
    this.buildListSection('农事活动', this.currentTerm.farmWork, '👨‍🌾');

    // 注意事项
    this.buildListSection('注意事项', this.currentTerm.precautions, '⚠️');
    }
    .width('100%')
    .padding(16)
    .backgroundColor('#FFFFFF')
    .borderRadius(16)
    .shadow({ radius: 8, color: '#22000000' })
    }
    }

    @Builder
    buildCropSection(title: string, crops: string[], icon: string) {
    if (crops && crops.length > 0) {
    Column({ space: 8 }) {
    Text(`${icon} ${title}`)
    .fontSize(16)
    .fontWeight(FontWeight.Medium)
    .fontColor('#333333')
    .width('100%')

    Flex({ wrap: FlexWrap.Wrap }) {
    ForEach(crops, (crop: string) => {
    Text(crop)
    .fontSize(13)
    .fontColor('#4CAF50')
    .padding({ left: 12, right: 12, top: 6, bottom: 6 })
    .backgroundColor('#E8F5E9')
    .borderRadius(16)
    .margin({ right: 8, bottom: 8 })
    }, (crop: string) => crop)
    }
    .width('100%')
    }
    .width('100%')
    }
    }

    @Builder
    buildListSection(title: string, items: string[], icon: string) {
    Column({ space: 8 }) {
    Text(`${icon} ${title}`)
    .fontSize(16)
    .fontWeight(FontWeight.Medium)
    .fontColor('#333333')
    .width('100%')

    ForEach(items, (item: string, index: number) => {
    Row({ space: 8 }) {
    Text(`${index + 1}.`)
    .fontSize(14)
    .fontColor('#666666')
    .width(24)

    Text(item)
    .fontSize(14)
    .fontColor('#333333')
    .lineHeight(22)
    .layoutWeight(1)
    }
    .width('100%')
    }, (item: string, index: number) => `${title}_${index}`)
    }
    .width('100%')
    }
    }

    3.2 节气日历页面

    展示全年24节气:

    @Entry
    @Component
    struct SolarTermCalendarPage {
    @State allTerms: string[] = [];
    @State selectedTerm: string = '';
    @State termDetail: SolarTermRecommendation | null = null;

    aboutToAppear(): void {
    this.allTerms = solarTermService.getAllSolarTerms();
    this.selectedTerm = solarTermService.getCurrentSolarTerm();
    this.termDetail = solarTermService.getSolarTermRecommendation(this.selectedTerm);
    }

    build() {
    Column() {
    // 导航栏
    Row() {
    Image($r('sys.media.ohos_ic_public_arrow_left'))
    .width(24)
    .height(24)
    .onClick(() => {
    router.back();
    })

    Text('二十四节气')
    .fontSize(18)
    .fontWeight(FontWeight.Medium)
    .layoutWeight(1)
    .textAlign(TextAlign.Center)

    Row().width(24)
    }
    .width('100%')
    .height(56)
    .padding({ left: 16, right: 16 })

    // 节气网格
    Grid() {
    ForEach(this.allTerms, (term: string) => {
    GridItem() {
    Column() {
    Text(term)
    .fontSize(16)
    .fontWeight(this.selectedTerm === term ? FontWeight.Bold : FontWeight.Normal)
    .fontColor(this.selectedTerm === term ? '#FFFFFF' : '#333333')
    }
    .width('100%')
    .height(60)
    .justifyContent(FlexAlign.Center)
    .backgroundColor(this.selectedTerm === term ? '#4CAF50' : '#F5F5F5')
    .borderRadius(8)
    .onClick(() => {
    this.selectedTerm = term;
    this.termDetail = solarTermService.getSolarTermRecommendation(term);
    })
    }
    }, (term: string) => term)
    }
    .columnsTemplate('1fr 1fr 1fr 1fr')
    .rowsGap(12)
    .columnsGap(12)
    .padding(16)
    .height(300)

    // 节气详情
    if (this.termDetail) {
    Scroll() {
    SolarTermCard()
    }
    .layoutWeight(1)
    }
    }
    .width('100%')
    .height('100%')
    .backgroundColor('#F5F5F5')
    }
    }


    四、节气提醒功能

    4.1 检查节气变化

    /**
    * 检查是否进入新节气
    */

    async checkSolarTermChange(): Promise<void> {
    const currentTerm = solarTermService.getCurrentSolarTerm();
    const lastTerm = await StorageUtil.get('last_solar_term', '');

    if (currentTerm !== lastTerm) {
    // 进入新节气
    await this.notifySolarTermChange(currentTerm);
    await StorageUtil.set('last_solar_term', currentTerm);
    }
    }

    /**
    * 通知节气变化
    */

    async notifySolarTermChange(term: string): Promise<void> {
    const recommendation = solarTermService.getSolarTermRecommendation(term);

    // 语音播报
    const text = `今天是${term}节气,${recommendation.temperature}` +
    `建议种植:${recommendation.vegetables.slice(0, 3).join('、')}等作物`;

    await ttsService.speak(text);

    // 显示提醒对话框
    AlertDialog.show({
    title: `${term}节气到了`,
    message: recommendation.temperature,
    primaryButton: {
    value: '查看详情',
    action: () => {
    router.pushUrl({
    url: 'pages/SolarTerm/SolarTermDetailPage',
    params: { term: term }
    });
    }
    },
    secondaryButton: {
    value: '知道了',
    action: () => {}
    }
    });
    }


    五、总结

    本篇教程完成了二十四节气系统的实现,主要包括:

    ✅ 已实现功能

    功能说明
    节气计算 基于公历日期自动计算
    节气数据库 24节气完整数据
    农事推荐 每个节气的种植建议
    节气展示 卡片组件、日历页面
    节气提醒 自动检测并提醒
    诗词文化 传统文化融入

    🎯 核心技术点

  • 节气算法:公历日期计算节气
  • 数据模型:结构化节气信息
  • UI组件:节气卡片、日历网格
  • 提醒机制:节气变化检测
  • 文化传承:诗词与农耕智慧
  • 🚀 下一步

    在下一篇教程中,我们将学习农机管理与租赁服务。


    恭喜! 🎉 你已经完成了二十四节气系统的开发,将传统农耕智慧与现代技术完美结合。

    赞(0)
    未经允许不得转载:171主机测评 » HarmonyOS智慧农业管理应用开发教程--高高种地-- 第21篇:二十四节气与农事指导
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址