当前位置: 首页 > article >正文

Flutter 跨平台实战:OpenHarmony 健康管理应用 Day9|首页 UI 美化、个人信息展示与功能快捷导航

Flutter 跨平台实战OpenHarmony 健康管理应用 Day9首页 UI 美化、个人信息展示与功能快捷导航欢迎加入开源鸿蒙跨平台社区https://openharmonycrossplatform.csdn.net 前言大家好本篇是我真实完成Flutter OpenHarmony 健康管理应用的 Day9 开发笔记基于 Day1-Day8 已经完成项目初始化、表单录入、页面路由、本地持久化存储、数据图表可视化、底部导航整体框架搭建等功能。今天主要对应用首页进行全面 UI 美化改造实现欢迎信息卡片展示、个人信息自动读取、功能快捷导航跳转、健康温馨提示面板整体采用卡片圆角 阴影布局页面层次更分明、界面更贴近商用 APP 风格全程只用 DevEco Studio 开发一步不漏、全部写细新手照着做就能一次成功我会把首页布局重构、卡片组件使用、异步读取本地数据、跨 Tab 快捷跳转、界面美化适配的全过程记录详细照着做就能掌握 Flutter 页面美化与模块化布局开发技巧。 本文你能学到全部都是干货Flutter Card 卡片圆角、阴影、内边距完整美化用法FutureBuilder 异步读取本地缓存数据并动态渲染 UI首页模块化拆分欢迎区、功能导航区、温馨提示区通过上下文查找导航状态实现首页点击快捷切换底部 Tab已有项目无损迭代美化保留之前所有业务功能多组件组合排版、间距适配、页面滑动适配技巧OpenHarmony 跨平台 UI 统一美化适配规范 开发环境与项目准备1. 开发环境开发工具DevEco Studio全程仅使用这一个工具不使用其他编辑器开发语言Dart框架FlutterOpenHarmony 适配版本调试方式Web 浏览器端调试避开模拟器配置繁琐问题完整验证首页美化、数据展示与页面跳转功能后续适配OpenHarmony 模拟器及真机当前 UI 美化代码可直接兼容.hap打包发布2. 项目准备基于 Day8 已完成底部导航框架的项目无需新建工程直接在原有项目上迭代开发已完成三页面底部导航、健康数据录入、本地存储、图表展示功能项目依赖无缺失、可正常编译运行无需新增第三方依赖沿用已有依赖库即可保留原有工程目录与鸿蒙适配配置不破坏项目结构本项目全程基于 Flutter for OpenHarmony 开发后续继续迭代 UI 细节与功能扩展本篇为首页美化与快捷导航优化篇。 核心功能Day9 开发实现内容1. 功能说明本次 Day9 迭代开发完成以下核心内容首页全新 UI 重构采用卡片式布局界面整洁美观进入首页自动读取本地保存的姓名、年龄、性别并展示欢迎信息新增功能快捷导航卡片点击可直接跳转到健康录入、个人中心页面增加健康温馨提示面板提升 APP 人性化体验全部页面保留原有录入、存储、图表、导航切换所有功能适配页面滚动内容过多可正常滑动防止布局溢出样式统一美化圆角、阴影、间距规范统一2. 完整可运行核心代码lib/main.dartimport package:flutter/material.dart; import package:shared_preferences/shared_preferences.dart; import package:fl_chart/fl_chart.dart; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); override Widget build(BuildContext context) { return MaterialApp( title: 鸿蒙健康管理APP, debugShowCheckedModeBanner: false, theme: ThemeData(primarySwatch: Colors.blue), home: const MainBottomNavPage(), ); } } // // 底部导航主框架 // class MainBottomNavPage extends StatefulWidget { const MainBottomNavPage({super.key}); override StateMainBottomNavPage createState() _MainBottomNavPageState(); } class _MainBottomNavPageState extends StateMainBottomNavPage { int _currentIndex 0; final ListWidget _pageList const [ HomePage(), HealthInputPage(), ProfilePage(), ]; override Widget build(BuildContext context) { return Scaffold( body: _pageList[_currentIndex], bottomNavigationBar: BottomNavigationBar( currentIndex: _currentIndex, onTap: (index) { setState(() { _currentIndex index; }); }, items: const [ BottomNavigationBarItem(icon: Icon(Icons.home), label: 首页), BottomNavigationBarItem(icon: Icon(Icons.add_box), label: 健康录入), BottomNavigationBarItem(icon: Icon(Icons.person), label: 个人中心), ], ), ); } } // // 首页Day9 美化版 // class HomePage extends StatelessWidget { const HomePage({super.key}); override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text(首页), centerTitle: true, ), body: SingleChildScrollView( padding: const EdgeInsets.all(20), child: FutureBuilderSharedPreferences( future: SharedPreferences.getInstance(), builder: (ctx, snapshot) { if (!snapshot.hasData) { return const Center(child: CircularProgressIndicator()); } final sp snapshot.data!; String name sp.getString(name) ?? 未设置; String age sp.getString(age) ?? ; String gender sp.getString(gender) ?? ; return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ // 欢迎面板 Card( elevation: 4, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(16), ), child: Padding( padding: const EdgeInsets.all(20.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text( 欢迎回来, style: TextStyle(fontSize: 22, fontWeight: FontWeight.bold), ), const SizedBox(height: 8), Text( 姓名$name, style: const TextStyle(fontSize: 16), ), if (age.isNotEmpty) Text(年龄$age 岁, style: const TextStyle(fontSize: 16)), if (gender.isNotEmpty) Text(性别$gender, style: const TextStyle(fontSize: 16)), ], ), ), ), const SizedBox(height: 20), // 功能卡片 const Text( 功能导航, style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), ), const SizedBox(height: 12), Card( child: ListTile( leading: const Icon(Icons.add_chart, color: Colors.blue), title: const Text(健康数据录入), subtitle: const Text(记录身高、体重、心率信息), onTap: () { final nav context.findAncestorStateOfType_MainBottomNavPageState(); nav?.setState(() { nav._currentIndex 1; }); }, ), ), Card( child: ListTile( leading: const Icon(Icons.person, color: Colors.green), title: const Text(个人中心), subtitle: const Text(查看健康数据与图表), onTap: () { final nav context.findAncestorStateOfType_MainBottomNavPageState(); nav?.setState(() { nav._currentIndex 2; }); }, ), ), const SizedBox(height: 20), // 健康提示 const Card( color: Colors.lightBlueAccent, child: Padding( padding: EdgeInsets.all(16.0), child: Text( 温馨提示定期记录健康数据关注身体变化保持健康生活, style: TextStyle(color: Colors.white, fontSize: 14), ), ), ), ], ); }, ), ), ); } } // // 健康录入页面 // class HealthInputPage extends StatefulWidget { const HealthInputPage({super.key}); override StateHealthInputPage createState() _HealthInputPageState(); } class _HealthInputPageState extends StateHealthInputPage { final formKey GlobalKeyFormState(); final nameCtrl TextEditingController(); final ageCtrl TextEditingController(); final heightCtrl TextEditingController(); final weightCtrl TextEditingController(); final heartCtrl TextEditingController(); String? gender; override void initState() { super.initState(); loadData(); } Futurevoid loadData() async { final sp await SharedPreferences.getInstance(); setState(() { nameCtrl.text sp.getString(name) ?? ; ageCtrl.text sp.getString(age) ?? ; gender sp.getString(gender); heightCtrl.text sp.getString(height) ?? ; weightCtrl.text sp.getString(weight) ?? ; heartCtrl.text sp.getString(heart) ?? ; }); } Futurevoid saveData() async { final sp await SharedPreferences.getInstance(); sp.setString(name, nameCtrl.text); sp.setString(age, ageCtrl.text); sp.setString(gender, gender ?? ); sp.setString(height, heightCtrl.text); sp.setString(weight, weightCtrl.text); sp.setString(heart, heartCtrl.text); } override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text(健康录入), centerTitle: true), body: Padding( padding: const EdgeInsets.all(20), child: SingleChildScrollView( child: Form( key: formKey, child: Column( children: [ TextFormField( controller: nameCtrl, decoration: const InputDecoration( labelText: 姓名, border: OutlineInputBorder(), ), ), const SizedBox(height: 12), TextFormField( controller: ageCtrl, keyboardType: TextInputType.number, decoration: const InputDecoration( labelText: 年龄, border: OutlineInputBorder(), ), ), const SizedBox(height: 12), DropdownButtonFormFieldString( value: gender, decoration: const InputDecoration( labelText: 性别, border: OutlineInputBorder(), ), items: const [ DropdownMenuItem(value: 男, child: Text(男)), DropdownMenuItem(value: 女, child: Text(女)), ], onChanged: (val) setState(() gender val), ), const SizedBox(height: 12), TextFormField( controller: heightCtrl, keyboardType: TextInputType.number, decoration: const InputDecoration( labelText: 身高(cm), border: OutlineInputBorder(), ), ), const SizedBox(height: 12), TextFormField( controller: weightCtrl, keyboardType: TextInputType.number, decoration: const InputDecoration( labelText: 体重(kg), border: OutlineInputBorder(), ), ), const SizedBox(height: 12), TextFormField( controller: heartCtrl, keyboardType: TextInputType.number, decoration: const InputDecoration( labelText: 心率, border: OutlineInputBorder(), ), ), const SizedBox(height: 30), ElevatedButton( onPressed: () async { if (formKey.currentState!.validate()) { await saveData(); ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text(数据保存成功)), ); } }, child: const Text(保存数据), ), ], ), ), ), ), ); } } // // 个人中心 // class ProfilePage extends StatelessWidget { const ProfilePage({super.key}); override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text(个人中心), centerTitle: true), body: FutureBuilderSharedPreferences( future: SharedPreferences.getInstance(), builder: (ctx, snapshot) { if (!snapshot.hasData) { return const Center(child: CircularProgressIndicator()); } final sp snapshot.data!; double h double.tryParse(sp.getString(height) ?? 0) ?? 0; double w double.tryParse(sp.getString(weight) ?? 0) ?? 0; double hr double.tryParse(sp.getString(heart) ?? 0) ?? 0; return SingleChildScrollView( padding: const EdgeInsets.all(20), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text(个人信息, style: TextStyle(fontSize: 22, fontWeight: FontWeight.bold)), const SizedBox(height: 10), Text(姓名${sp.getString(name) ?? }, style: const TextStyle(fontSize: 16)), Text(年龄${sp.getString(age) ?? }, style: const TextStyle(fontSize: 16)), Text(性别${sp.getString(gender) ?? }, style: const TextStyle(fontSize: 16)), const SizedBox(height: 20), const Text(健康指标, style: TextStyle(fontSize: 22, fontWeight: FontWeight.bold)), const SizedBox(height: 10), Text(身高${sp.getString(height) ?? 0} cm, style: const TextStyle(fontSize: 16)), Text(体重${sp.getString(weight) ?? 0} kg, style: const TextStyle(fontSize: 16)), Text(心率${sp.getString(heart) ?? 0} 次/分, style: const TextStyle(fontSize: 16)), const SizedBox(height: 30), const Text(健康数据图表, style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold)), const SizedBox(height: 20), SizedBox( height: 280, child: BarChart( BarChartData( alignment: BarChartAlignment.spaceAround, titlesData: FlTitlesData(show: true), borderData: FlBorderData(show: false), barGroups: [ BarChartGroupData(x: 1, barRods: [BarChartRodData(toY: h, color: Colors.blue)]), BarChartGroupData(x: 2, barRods: [BarChartRodData(toY: w, color: Colors.green)]), BarChartGroupData(x: 3, barRods: [BarChartRodData(toY: hr, color: Colors.red)]), ], ), ), ), ], ), ); }, ), ); } }3. 关键逻辑与加分点解析采用 FutureBuilder 异步获取本地存储避免页面卡顿与空白Card 组件统一设置圆角与阴影全局 UI 风格标准化首页拆分为欢迎模块、功能导航模块、温馨提示模块结构清晰通过上下文查找根导航状态实现无需路由直接切换底部 Tab所有原有录入、存储、图表、导航功能完全保留无功能丢失页面嵌套 SingleChildScrollView适配不同屏幕解决内容溢出未填写信息时做默认值处理界面不会出现空白异常文字 调试与运行完整流程终端执行flutter pub get确保依赖正常加载输入flutter run -d web-server启动项目进入首页自动加载本地个人信息并展示欢迎卡片点击功能导航卡片可直接跳转到对应页面进入健康录入填写数据保存首页信息自动同步更新重启应用数据不丢失首页 UI、跳转、图表全部正常页面滑动流畅卡片样式美观无报错无布局溢出 跨平台适配说明本次 Day9 首页美化代码基于 Flutter 跨平台特性一套代码多端兼容平台运行方式适配说明Chrome 浏览器端flutter run -d web-server首页卡片、文字排版、跳转功能全部正常适配OpenHarmony 模拟器 / 真机编译生成.hapUI 样式、卡片圆角阴影、布局排版原生适配无需额外修改代码即可打包发布 超全错误排查与解决方案错误场景解决方案首页一直转圈不显示内容检查是否正常初始化 SharedPreferences网络调试模式依赖加载完整点击功能卡片无反应确认查找的导航状态类名和页面类名完全一致页面内容溢出报错给外层嵌套 SingleChildScrollView 开启滚动适配文字排版错乱统一设置 padding、SizedBox 间距保持布局规范 项目后续规划Day9 已完成首页 UI 全面美化、个人信息动态展示与功能快捷导航开发后续将继续迭代完善个人中心功能扩展、全局主题样式统一、页面细节优化等内容让整体应用更加精致完整。 项目总结本篇完整记录了 Day9 对健康管理 APP 首页进行 UI 重构与美化的全过程熟练使用 Card 卡片布局、FutureBuilder 异步数据加载、页面内跨 Tab 跳转等实用技巧在完全保留历史所有功能的前提下大幅提升 APP 界面颜值和交互体验项目结构更加模块化为后续更多功能扩展和界面优化打下良好基础。✅ 结尾小贴士全篇代码可直接复制替换运行无需额外修改全程使用 DevEco Studio 即可完成开发调试无需切换其他编辑器点赞收藏不迷路后续每日开发笔记持续更新

相关文章:

Flutter 跨平台实战:OpenHarmony 健康管理应用 Day9|首页 UI 美化、个人信息展示与功能快捷导航

🎯Flutter 跨平台实战:OpenHarmony 健康管理应用 Day9|首页 UI 美化、个人信息展示与功能快捷导航 欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net 🚀 前言 大家好,本篇是我真实…...

如何永久保存你的微信聊天记忆?这款开源工具让你轻松打造个人数字档案馆

如何永久保存你的微信聊天记忆?这款开源工具让你轻松打造个人数字档案馆 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_…...

基于Neo4j图数据库构建AI智能体长期记忆系统

1. 项目概述:为AI智能体构建一个“外置大脑”最近在折腾AI智能体(Agent)项目时,我遇到了一个普遍存在的瓶颈:记忆管理。无论是基于LangChain、AutoGPT还是其他框架构建的智能体,其对话历史、任务上下文和知…...

Me-LLaMA:基于持续预训练的医学大语言模型构建与应用实践

1. 项目概述:当大语言模型遇上医学,Me-LLaMA如何炼成?在通用大语言模型(LLM)如ChatGPT、LLaMA等席卷全球的浪潮下,一个核心问题逐渐浮出水面:这些“通才”在处理高度专业化、容错率极低的医学领…...

MCP协议实战:将PokeAPI封装为AI工具,实现自然语言查询宝可梦数据

1. 项目概述与核心价值最近在折腾AI助手和本地工具集成,发现一个痛点:很多API文档查询起来太麻烦,尤其是像PokeAPI这种数据量大、结构复杂的接口。直接让AI去调用,要么得写一堆胶水代码,要么就是权限和格式对不上。直到…...

如何在Mac上免费解密QQ音乐加密文件:QMCDecode完整使用指南

如何在Mac上免费解密QQ音乐加密文件:QMCDecode完整使用指南 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目录,…...

Golang怎么实现方法集与接口的匹配_Golang如何理解值类型和指针类型实现接口的区别【详解】

Go中接口实现取决于类型的方法集:值类型T仅含T接收者方法,指针类型T同时含T和T接收者方法;若接口方法含指针接收者,则只有*T能实现该接口。方法集决定接口能否被实现Go 里接口能否被某个类型实现,不看它有没有写 func …...

别再只会用Nmap了!Kali自带的WhatWeb指纹识别工具,从基础扫描到批量实战保姆级教程

WhatWeb实战指南:超越Nmap的Web指纹识别艺术 在渗透测试和信息收集领域,Nmap无疑是大多数安全工程师的首选工具。但当你面对大量Web资产需要快速识别技术栈时,Kali Linux内置的WhatWeb工具往往能带来意想不到的效率提升。作为一名长期活跃在红…...

3分钟快速上手:Amlogic/Rockchip/Allwinner电视盒子刷Armbian终极指南

3分钟快速上手:Amlogic/Rockchip/Allwinner电视盒子刷Armbian终极指南 【免费下载链接】amlogic-s9xxx-armbian Supports running Armbian on Amlogic, Allwinner, and Rockchip devices. Support a311d, s922x, s905x3, s905x2, s912, s905d, s905x, s905w, s905, …...

如何快速合并B站缓存视频:终极免费工具使用指南

如何快速合并B站缓存视频:终极免费工具使用指南 【免费下载链接】BilibiliCacheVideoMerge 🔥🔥Android上将bilibili缓存视频合并导出为mp4,支持安卓5.0 ~ 13,视频挂载弹幕播放(Android consolidates and exports the …...

基于OpenClaw与AI的智能错题管理系统:自由标签与间隔重复算法实践

1. 项目概述:一个会“思考”的错题管家备考过GRE、考研或者任何需要大量刷题考试的朋友,应该都经历过这个阶段:错题本越记越厚,但真正要复习的时候却无从下手。要么是题目抄得手酸,要么是拍了一堆照片在相册里吃灰&…...

终极鸣潮工具箱指南:如何简单快速解锁120FPS与数据分析

终极鸣潮工具箱指南:如何简单快速解锁120FPS与数据分析 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools WaveTools是一款专为《鸣潮》玩家设计的开源工具箱,提供帧率解锁、画质优化、…...

从简谱到MIDI:Python音乐编码转换工具的设计与实现

1. 项目概述:一个“通乐码”的探索与实践最近在GitHub上看到一个挺有意思的项目,叫simonxmau/tonglema。光看这个名字,可能有点摸不着头脑,但点进去之后,你会发现它其实是一个关于“通乐码”的探索性仓库。对于很多开发…...

如何免费解锁WeMod高级功能:终极用户体验增强指南

如何免费解锁WeMod高级功能:终极用户体验增强指南 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer 还在为WeMod的付费限制而烦恼吗&#xff1…...

H3C防火墙双主模式RBM配置实战:如何用两台设备实现业务负载分担?

H3C防火墙双主模式RBM配置实战:如何用两台设备实现业务负载分担? 在当今企业网络架构中,防火墙作为关键安全节点,其高可用性设计直接关系到业务连续性。传统主备模式虽然能提供故障切换保障,但备设备长期处于闲置状态&…...

低查重AI教材生成神器,15分钟完成10万字教材编写,太牛了!

编写教材的工具选择困境与解决方案 在编写教材之前,选择合适的工具往往让人感到无比纠结。使用办公软件,功能显得过于简单,搭建框架和格式规范需要手动操作,耗时又繁琐;而专业的AI写教材工具呢,虽然功能多…...

ChatAir:原生Android AI聊天聚合应用,支持多模型与本地部署

1. 项目概述:一个原生Android AI聊天聚合应用如果你和我一样,在手机上同时用着ChatGPT、Claude、Gemini和DeepSeek,每次想切换模型都得打开不同的网页或者应用,那感觉确实有点割裂。更别提网页版在移动端的体验总有些别扭&#xf…...

掌握低查重AI教材生成方法,AI写教材工具让30万字教材编写不再难!

梳理教材的知识点实属一项“细致活”,最大的问题就在于如何平衡与连接!一方面,我们担心重要的知识点会被遗漏;另一方面,又难以掌握内容的难度层次——小学的教材常常写得太深奥,导致学生无法理解&#xff1…...

开发 AI 客服系统时利用 Taotoken 实现模型的容灾与降级

开发 AI 客服系统时利用 Taotoken 实现模型的容灾与降级 1. 在线客服系统的稳定性挑战 在线客服系统对 AI 响应的稳定性和低延迟有着极高的要求。当用户发起咨询时,系统需要在秒级内返回准确、连贯的回复,任何延迟或中断都会直接影响用户体验。传统单一…...

通达信缠论插件:3步实现自动化技术分析,告别手工画线烦恼

通达信缠论插件:3步实现自动化技术分析,告别手工画线烦恼 【免费下载链接】ChanlunX 缠中说禅炒股缠论可视化插件 项目地址: https://gitcode.com/gh_mirrors/ch/ChanlunX 你是否还在为缠论分析中繁琐的笔段划分而头疼?面对复杂的K线走…...

利用快马ai快速原型设计,一键生成微pe环境下的系统自动化部署脚本

今天想和大家分享一个特别实用的技术实践——如何用InsCode(快马)平台快速生成Windows PE环境下的系统自动化部署脚本。这个需求源于我最近频繁帮朋友重装系统,每次手动操作太耗时,于是尝试用AI生成脚本实现一键部署。 需求场景分析 微PE作为轻量级Windo…...

java面试无从下手?用快马生成新手入门项目,边学边练掌握核心考点

作为一个Java新手,面对面试题海常常感到无从下手。最近我发现了一个特别实用的学习方法——通过InsCode(快马)平台生成结构化的Java面试题学习项目,边学边练效果特别好。 项目结构设计 整个项目按照初级、中级两个难度级别组织,每个级别下又细…...

AI辅助开发:让快马AI推理并生成智能识别多绘屏保残留的清理程序

今天在帮朋友清理电脑时,遇到了一个顽固的屏保软件"多绘屏保",发现常规卸载后还是残留了不少文件。正好最近在用InsCode(快马)平台做AI辅助开发,就想着能不能用AI来生成一个智能清理工具。下面记录下我的探索过程: 首先…...

OpenUI Lang:专为AI流式生成UI设计的高效语言与框架实践

1. 项目概述:OpenUI,一个为生成式UI而生的新标准如果你和我一样,在过去一年里尝试过用大语言模型(LLM)来生成用户界面,那你一定经历过这种痛苦:模型吐出一大段JSON,你得写个复杂的解…...

Labelme不止能画框!解锁它的人体姿态标注隐藏功能,让你的数据集更专业

Labelme不止能画框!解锁它的人体姿态标注隐藏功能,让你的数据集更专业 在计算机视觉领域,高质量的数据标注往往是决定模型性能的关键因素。对于人体姿态估计这类精细任务,传统矩形框标注早已无法满足需求。Labelme作为一款开源标注…...

基于Kustomize与Argo CD的Kubernetes云原生技术栈部署实践

1. 项目概述与核心价值 如果你和我一样,在家庭实验室(Homelab)或者开发测试环境中折腾过Kubernetes,那你一定对管理一大堆YAML文件深有体会。今天要聊的这个项目, zimmertr/Kubernetes-Manifests ,就是一…...

基于LLM的智能文档生成:从代码理解到自动化文档工程实践

1. 项目概述:当文档生成遇上智能体最近在折腾一个挺有意思的项目,叫effect-llm-docs。简单来说,这是一个利用大型语言模型(LLM)来自动化生成、更新和维护项目文档的工具。如果你和我一样,经历过项目迭代飞快…...

保姆级教程:用阿里云源在CentOS 7上快速部署Zabbix 5.0代理服务器

保姆级教程:用阿里云源在CentOS 7上快速部署Zabbix 5.0代理服务器 最近在帮朋友搭建监控系统时,发现很多新手在部署Zabbix代理服务器时都会遇到各种问题——从依赖包安装失败到配置文件参数错误,再到数据库连接异常。作为一个踩过无数坑的老运…...

ParroT框架:通过数据质控与增强提升大语言模型指令微调效果

1. 项目概述:一个为大型语言模型“教说话”的指令调优框架最近在折腾大语言模型(LLM)的指令微调时,发现了一个挺有意思的开源项目:wxjiao/ParroT。这名字起得挺形象,“鹦鹉学舌”,核心目标就是高…...

用STM32CubeMX和HAL库搞定匿名上位机V7.12通信(附完整工程源码)

STM32CubeMX与HAL库实现匿名上位机V7.12高效通信实战指南 在嵌入式开发领域,调试工具的效率往往决定了项目推进的速度。匿名上位机作为国内开发者广泛使用的调试工具,其V7.12版本提供了强大的数据可视化功能,但如何与STM32芯片建立稳定高效的…...