Android女性生理健康APP源码解析:周期预测与状态记录实现
简介面向女性健康管理场景的安卓完整源码项目整合生理周期记录、生理期状态跟踪、基于历史日期预测下一次经期、结合记录给出针对性生理建议等功能同时支持录入身高体重计算身体质量指数。压缩包共134个文件整体约2.27MB其中53个XML布局文件负责界面排版36张PNG图片提供图标与视觉素材31个Java源文件实现核心业务逻辑另有Gradle构建脚本、项目说明文档以及可直接安装的调试安装包目录结构清晰按模块划分便于阅读与二次开发。资源适合计算机相关专业学生进行课程设计、期末大作业或毕业设计参考也适合安卓学习者研究小型健康类应用从数据记录到结果展示的完整链路。当前已有94人浏览学习项目包含完整源码与说明文档调试通过可运行读者可对照代码掌握日期计算、状态记录、轻量存储、界面交互等关键实现最终还能得到一份具备演示价值的成品安装包。1. Android 女性生理健康管理 APP从源码拆解周期预测与状态记录的实现逻辑拿到这份「基于 Android 的女性生理健康管理 APP」源码工程时我第一反应是这类项目在 GitHub 上并不少见但真正能直接编译运行、且把「周期记录 经期预测」做成闭环的并不多。这个 APP 的核心并不复杂它通过 SQLite 持久化用户每日标记的生理状态再依据历史周期长度和经期长度做加权推算给出下一次经期和排卵期的预估窗口。说白了它把「记录」和「预测」两件事串成了一条完整的业务线。适合的人群很明确正在学 Android 的开发者想找一个有完整数据库操作、日期计算和图表展示的练手项目以及想做健康类 APP 产品原型但不想从零搭架子的人。本文会从工程结构、数据表设计、预测算法、状态机流转到实际编译时的坑逐层拆给你看。2. 工程结构与生命周期管理先搞清楚它是个什么样的 Android 项目2.1 模块划分与 Gradle 配置的阅读顺序拿到源码后第一步不是急着点 Run而是先把工程目录过一遍。这个项目的 Gradle 配置基本决定了你能不能在本地跑起来。通常这类教学性质的项目会用compileSdk 33或更高而minSdk往往在21~24之间——这说明它兼容 Android 5.0 以上的设备。我建议先打开根目录的build.gradle确认三件事依赖仓库是否包含google()和mavenCentral()、app模块的依赖里有没有androidx.appcompat、以及implementation里的第三方库版本号是否和本地 SDK 匹配。如果工程里用的是老式android.support包那你需要先做迁移否则编译会在资源链接阶段直接报错。常见的做法是先跑一次./gradlew assembleDebug让它把缺失的依赖拉下来。如果网络环境有限制gradle-wrapper.properties里的distributionUrl要确认指向的是国内可访问的镜像地址。项目源码里没有内置本地依赖包这一点需要特别留意——它意味着你的首次构建时长基本取决于 Gradle 和 Android Gradle Plugin 的下载速度。2.2 Activity 跳转路径与页面职责的梳理这个 APP 的页面流逻辑非常清晰符合单入口、多页签的套路。一般会有三个主页面记录页用于标记当天状态、日历页用于查看历史记录、统计页用于展示预测结果和周期趋势。记录页通常是MainActivity内部用Fragment或ViewPager2承载子页面。我强烈建议你在读代码时先看AndroidManifest.xml确认启动 Activity 是谁、有没有配置exported属性——Android 12 之后没有显式声明exported的应用会在安装时直接崩掉这是很多新手在这类源码上翻车的第一个坑。从源码的onClick事件分布来看页面的交互逻辑写在Activity内部的比重比较大部分列表适配器用了RecyclerView.Adapter的经典写法。如果你的需求是把它改成 MVVM 架构那需要把Activity里的网络请求和数据刷新逻辑拆到ViewModel中但就当前版本而言直接读它的Activity层反而能更快理解业务流用户点击「记录」按钮 → 弹出状态选择对话框 → 写入数据库 → 刷新日历视图。2.3 状态机在 UI 跳转中的应用这里有一个值得留意的设计APP 把「生理状态」抽象成枚举类型比如NORMAL、MENSTRUAL、PMS、OVULATION。这些枚举在代码中到处传递控制着日历高亮颜色、预测算法输入参数和通知内容。它的好处是——当你需要在不同页面共享同一种数据语义时只需传递一个enum而不必重复查库。这种设计在小型项目里是最平衡的做法不需要引入状态机框架但代码的可读性比直接传int常量高得多。你在后续修改功能时只需要在枚举里加一个类型再在对应的switch分支中补充处理逻辑即可。3. 生理周期记录与预测算法从数据库设计到日期计算的完整实现3.1 SQLite 表结构设计思路这类健康类 APP 的核心是数据表设计。源码中最关键的表通常是menstrual_records字段一般包括id、user_id、start_date、end_date、cycle_length、period_length、status、note。注意cycle_length并不是用户手动填的而是根据相邻两次开始日期计算得出的。表里还有一个predicted_next_start字段用于缓存预测结果避免每次展示统计页时都重复跑一遍算法。表设计时需要预留一个custom_events表来记录用户额外标记的信息比如「腹痛」「情绪低落」这样的症状标签。这样做的好处是后续做数据可视化时你可以直接按日期关联两张表而不必改动主表的字段结构。从源码的DbHelper类来看onCreate里执行了多张表的建表语句升级方案用的是onUpgrade中DROP TABLE IF EXISTS后重建——这种做法的坏处是升级会清空用户数据好在个人项目并没有那么多历史包袱。3.2 周期预测算法的实现逻辑预测算法是这个 APP 的精华所在。先看它是怎么算的。代码中通常有一个PredictionManager.java核心方法是predictNextCycle(ListMenstrualRecord records)。算法并不玄学本质是取最近 N 次周期长度的加权平均值再根据个体差异性做修正public Prediction predictNextCycle(ListMenstrualRecord records) { // 至少需要最近3条记录才能做有效预测 if (records.size() 3) { return buildInsufficientDataPrediction(); } double totalCycle 0; double totalPeriod 0; int validCount 0; // 从最近的记录往前取最多6条计算加权平均 int startIndex Math.max(0, records.size() - 6); for (int i startIndex; i records.size(); i) { MenstrualRecord record records.get(i); // 过滤异常值周期长度不在20~45天范围内的记录不参与计算 if (record.getCycleLength() 20 record.getCycleLength() 45) { totalCycle record.getCycleLength(); totalPeriod record.getPeriodLength(); validCount; } } if (validCount 0) { return buildInsufficientDataPrediction(); } double avgCycle totalCycle / validCount; double avgPeriod totalPeriod / validCount; // 取最近一次开始日期加上平均周期得到下次预测开始日 Date lastStart records.get(records.size() - 1).getStartDate(); Calendar calendar Calendar.getInstance(); calendar.setTime(lastStart); calendar.add(Calendar.DAY_OF_YEAR, (int) Math.round(avgCycle)); Date predictedStart calendar.getTime(); // 安全窗口左右浮动2天 calendar.add(Calendar.DAY_OF_YEAR, -2); Date safeStart calendar.getTime(); calendar.add(Calendar.DAY_OF_YEAR, 4); Date safeEnd calendar.getTime(); Prediction prediction new Prediction(); prediction.setPredictedStartDate(predictedStart); prediction.setSafeStartDate(safeStart); prediction.setSafeEndDate(safeEnd); prediction.setAverageCycleLength(avgCycle); prediction.setAveragePeriodLength(avgPeriod); return prediction; }这段逻辑的巧妙之处在于三点第一它的startIndex限制最多取 6 条记录防止用户积累了几年数据后计算量变大第二它过滤掉了 20~45 天之外的「异常周期」——比如用户某次生病导致周期紊乱这些数据如果不剔除会把平均值拉偏第三安全窗口的 ±2 天浮动虽然简单粗暴但实际使用中确实能覆盖大多数人的生理波动。这里我把avgCycle做四舍五入后加到lastStart上得到一个基准预测日再向前后扩展两天形成窗口这对于当前版本的 APP 来说已经够用。3.3 日历视图与月经周期的数据绑定源码中日历模块用的是RecyclerView自绘网格而不是引入CalendarView或第三方库。它的实现方式是自己按月份生成日期列表然后逐日比对数据库中的记录isMenstrualDay为true的日期会被高亮。这样做的好处是就算你没有网络也能正常查看历史数据。绘制逻辑通常写在CalendarAdapter中核心是根据ListMenstrualRecord生成一个MapString, Integerkey是格式化的年月日字符串value是状态码private MapString, Integer buildDateStatusMap(ListMenstrualRecord records) { MapString, Integer statusMap new HashMap(); SimpleDateFormat sdf new SimpleDateFormat(yyyy-MM-dd, Locale.CHINA); for (MenstrualRecord record : records) { Date start record.getStartDate(); Calendar calendar Calendar.getInstance(); calendar.setTime(start); // 将经期内的每一天都标记为 MENSTRUAL for (int i 0; i record.getPeriodLength() i 10; i) { String dateKey sdf.format(calendar.getTime()); statusMap.put(dateKey, STATUS_MENSTRUAL); calendar.add(Calendar.DAY_OF_YEAR, 1); } } return statusMap; }注意这里有个细节i 10的限制是为了防止异常数据导致死循环或内存膨胀。经期长度超过 10 天本就罕见把它作为上限是工程上的容错手段。状态码本身在CalendarAdapter.onBindViewHolder里决定日期文本的颜色和背景色。3.4 数据导出与备份的另类用途源码中我在assets目录里发现了一个privacy_policy_template.txt模板这个模板覆盖了大部分合规场景数据本地存储、第三方 SDK 说明、用户权利声明等。如果以后要把 APP 发布到应用商店这个模板拿来改一改就能用。数据导出方面APP 没有内置 CSV 导出功能但DbHelper里提供了getReadableDatabase().query()的开放接口开发者可以很方便地写一个小工具把记录导出成表格。如果你拿到源码后想加这个功能JDBC 方式连接 SQLite 文件即可Android 自带SQLiteDatabase的query方法返回Cursor遍历后写入FileOutputStream。4. 编译、打包与真机调试这套代码跑起来之前要处理的五个问题4.1 首次编译时 Gradle 依赖下载失败的问题现象执行./gradlew assembleDebug时长时间卡在Downloading Gradle-...或报Caused by: java.net.SocketException: Connection reset。原因Gradle Wrapper 默认从services.gradle.org下载发行版国内部分网络环境访问不稳定再加上项目中依赖的androidx.appcompat等库需要从google()仓库拉取如果代理配置不当就会超时。解决修改gradle-wrapper.properties中的distributionUrl为国内镜像地址比如https://mirrors.cloud.tencent.com/gradle/gradle-8.7-bin.zip。同时把build.gradle里的仓库源替换为阿里云镜像maven { url https://maven.aliyun.com/repository/google }。同样的googleplay服务如果拉取不了把classpath com.android.tools.build:gradle:8.2.2对应的插件下载到本地mavenLocal中也能绕过去。4.2 高版本 API 引起的exported崩溃现象在 Android 12 设备上安装后直接闪退Logcat 报java.lang.SecurityException: Permission Denial: starting Intent。原因AndroidManifest.xml中MainActivity没有显式设置android:exportedtrue。Android 12 起要求所有声明了LAUNCHER的 Activity 必须指定exported属性否则系统直接拒绝启动。解决在AndroidManifest.xml的activity节点中补充android:exportedtrue。这个改动虽小但它直接决定 APP 能否在主流新机型上跑起来。4.3 数据库升级导致旧数据丢失现象从 1.0 版本升级到 1.1 版本后用户之前记录的周期数据全部消失。原因DbHelper.onUpgrade中写的是DROP TABLE IF EXISTS ...加onCreate(db)重建这是快速开发阶段最常见的偷懒写法但它会清空所有已有数据。解决改成逐步迁移策略——在onUpgrade里先判断当前版本号如果小于 2执行ALTER TABLE menstrual_records ADD COLUMN note TEXT这样的增量操作。不要轻易删表这是做数据型 APP 的基本素养。4.4 日期格式在不同语言环境下解析异常现象在部分欧洲语言的系统方言下日历页日期显示错乱或SimpleDateFormat(yyyy-MM-dd)解析崩溃。原因源码中多处使用了SimpleDateFormat但未指定Locale系统默认语言环境下的月份缩写和中文环境不一致导致parse方法在遇到非数字字符时抛异常。解决所有SimpleDateFormat统一显式传Locale.CHINA或Locale.US并避免使用MMM这类依赖语言环境的模式。这个坑排查起来不容易因为它在中文模拟器上完全正常只有切到英文或者其他语言才会复现属于典型的「测试环境没覆盖到」的问题。4.5 真机调试时数据库文件不可见现象Logcat里看到数据库写入正常但用adb shell进入data/data/包名/databases目录时提示权限拒绝。原因从 Android 11 开始run-as命令对debuggable应用仍然有效但如果在build.gradle中配置了release签名或者应用不是debug构建类型run-as会因签名不匹配而失效。解决在app/build.gradle的debug构建类型中确认debuggable true并使用./gradlew installDebug安装调试包。如果实在需要查看release包的数据先通过adb backup导出应用数据再解包分析这是最稳妥的方式。5. 把预测准确率再往上提一档引入排卵期估算与数据可视化5.1 排卵期预测的简易加入方式当前版本的预测只输出「下次经期开始日」和「安全窗口」没有涉及排卵期。而实际用户对排卵期的关注度往往更高——无论是备孕还是避孕排卵日都是一个核心信息。常见做法是在预测逻辑中加入排卵日估算排卵日通常在下次月经来潮前的 14 天左右。如果已知平均周期长度为avgCycle那么可以用下面这段代码补上public Date estimateOvulationDate(Date predictedNextStart, double avgCycle) { Calendar calendar Calendar.getInstance(); calendar.setTime(predictedNextStart); // 排卵日在下次来潮前14天注意是往前减 calendar.add(Calendar.DAY_OF_YEAR, -14); return calendar.getTime(); }这段代码要在拿到predictedNextStart之后调用才有意义可以直接把结果扩到Prediction对象中。注意avgCycle是 double 类型但加减日期时统一用int天数避免时区或夏令时导致的毫秒误差。同样的道理排卵期窗口可以定义为排卵日前后各加两天这个窗口期对大多数周期规律的女性是适用的。5.2 周期趋势图的绘制方案如果要做统计页的数据可视化我推荐引入MPAndroidChart。这个库虽然已经有几年没大更新了但胜在稳定、文档全、中文资料多。折线图的 X 轴放月份Y 轴放周期长度值能直观看到自己的周期是否有异常波动。实现时要注意LineChart的xAxis.setLabelCount()如果不设置默认只显示 5 个标签导致月份信息看不清楚。常用做法是xAxis.setLabelCount(12, true); xAxis.setGranularity(1f); // 强制最小间隔为1避免小数坐标对于这个 APP 的现状它的核心算法和数据层已经打得很扎实图表只是锦上添花。如果你只是想在毕业设计或面试项目里展示「完整闭环」把上面的排卵期估算加进去就够了——这会让你的项目在「功能完整度」上超过大多数模板项目。5.3 状态提醒与通知的落地建议源码里提到支持基于预测日期的提醒但没有具体实现。这个功能加单个AlarmManager定时任务并不复杂关键点在于 Android 8.0 之后必须用NotificationChannel才能弹出通知否则startForeground会直接崩溃。我一般会在Application或MainActivity的onCreate中创建渠道private void createNotificationChannel() { NotificationChannel channel new NotificationChannel( period_reminder, 生理期提醒, NotificationManager.IMPORTANCE_HIGH ); NotificationManager manager getSystemService(NotificationManager.class); manager.createNotificationChannel(channel); }设置提醒时还要注意AlarmManager的唤醒类型——setExactAndAllowWhileIdle在省电模式下仍然能按时触发但在低端机上可能会受厂商限制我自己一般会再写一个BootReceiver来监听BOOT_COMPLETED重启后重新注册定时任务否则用户重启手机后所有提醒都失效这算一个很常见的隐性坑。从那以后我每次做完提醒功能都强制走一遍「重启设备 → 检查定时任务是否存活」的验证流程。希望这篇拆解能让你在拿到这份源码后少走这些弯路把精力真正花在理解算法和业务逻辑上。本文还有配套的精品资源点击获取

相关新闻

Java SE 17 OCP认证备考:拆解1Z0-829考试底层逻辑与高频陷阱

Java SE 17 OCP认证备考:拆解1Z0-829考试底层逻辑与高频陷阱

简介:本资源是面向Java开发者与备考人员的OCP Java SE 17认证(Exam 1Z0-829)权威实战练习资料,由资深Java教育专家Jeanne Boyarsky与Scott Selikoff联合编写,专为突破考试难点、强化真题应试能力而设计。全书覆盖Java …

2026/10/11 16:18:33 阅读更多 →
Sherlock工业视觉平台:拖拽式流水线与产线级标定实战

Sherlock工业视觉平台:拖拽式流水线与产线级标定实战

简介:本资源是一份面向自动化检测工程师、机器视觉初学者及工业现场技术人员的Sherlock机器视觉软件入门教学课件,聚焦于零代码图形化开发场景下的核心功能实践与界面操作逻辑。课件系统讲解了Landmark位置标定、Calibration刻度校准、Search区域搜索及C…

2026/10/11 16:18:33 阅读更多 →
航空订票系统UML建模实战:类图、时序图与状态图协同设计

航空订票系统UML建模实战:类图、时序图与状态图协同设计

简介:本资源是一份面向软件工程专业学生与UML初学者的航空订票系统完整UML建模设计文档,聚焦系统需求分析与可视化建模实践,解决课程设计、课程实训及毕业设计中建模规范性与模块完整性难题。文档以Word格式(.docx)单文…

2026/10/11 16:17:33 阅读更多 →

最新新闻

反转链表全解析:迭代、递归与头插法及常见变形

反转链表全解析:迭代、递归与头插法及常见变形

反转链表是链表操作的经典题,也是我每次带新人必讲的第一道题。它表面上就一句话:把单链表中的指针方向全部反过来,返回新的头节点。但就是这一句话,能同时考察你对指针引用的掌握、对边界条件的敏感度,以及能不能把迭…

2026/10/11 17:11:08 阅读更多 →
Shardeum慈善捐赠:区块链公益捐款平台完整指南

Shardeum慈善捐赠:区块链公益捐款平台完整指南

Shardeum慈善捐赠:区块链公益捐款平台完整指南 【免费下载链接】shardeum Shardeum is an EVM based autoscaling blockchain 项目地址: https://gitcode.com/GitHub_Trending/sh/shardeum Shardeum 是一个基于 EVM 的自动扩缩容区块链,其内置的安…

2026/10/11 17:11:08 阅读更多 →
36氪刚说“React Native 黄金时代被 AI 终结“,Builder.io 转头押注 agent-native

36氪刚说“React Native 黄金时代被 AI 终结“,Builder.io 转头押注 agent-native

36氪刚说"React Native 黄金时代被 AI 终结",Builder.io 转头押注 agent-native 【免费下载链接】agent-native A framework for building agentic apps 项目地址: https://gitcode.com/GitHub_Trending/ag/agent-native 2026 年秋天,一…

2026/10/11 17:11:08 阅读更多 →
反转链表全解析:从迭代递归到K个一组翻转

反转链表全解析:从迭代递归到K个一组翻转

作为一名刷了几年题的老开发,我始终觉得链表操作是数据结构里最“手熟”的一类问题——代码量不大,边界条件却极多,而且特别考验指针思维。反转链表这道题,几乎每个面试题库里都有,被称作链表操作的经典题一点都不夸张…

2026/10/11 17:11:08 阅读更多 →
OpenCV植物叶片识别:从轮廓提取到SVM分类的完整实战

OpenCV植物叶片识别:从轮廓提取到SVM分类的完整实战

简介:本资源是一份面向Python初学者与计算机视觉入门者的OpenCV图像处理实践教程,聚焦植物叶片识别这一典型形状分析任务,系统讲解轮廓检测、特征提取与几何描述等核心技能。内容涵盖二值化预处理、cv2.findContours()与cv2.drawContours()函…

2026/10/11 17:10:07 阅读更多 →
Ollama模型路径迁移全攻略:改环境变量、搬家数据,彻底解决磁盘爆满

Ollama模型路径迁移全攻略:改环境变量、搬家数据,彻底解决磁盘爆满

本地跑大模型的人,十个有九个迟早要面对同一个问题:磁盘满了。Ollama 默认把模型塞在用户目录下,Windows 上就是 C 盘,Linux 和 macOS 则是家目录。一个 7B 的量化模型 4 到 5GB,13B 直接上 8GB,再多拉两个…

2026/10/11 17:10:07 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →