
本文还有配套的精品资源点击获取简介直接在微信里打开就能用的经期管理小程序不用下载APP不注册也能记录。首页底部三个标签分别对应记录、日记和我的记录页实时显示下次来潮日期正在经期时会倒计时已持续天数日记页支持填写当天身体感受、情绪、症状等文字内容方便长期观察周期规律我的页面集中管理个人设置、周期长度、初潮年龄、历史记录查看以及账号登录。代码结构干净包含独立页面目录record/diary/my/record_edit/login、日期处理工具函数dateFunc.js、全局配置文件app.、project.config.和多套tabbar图标资源png格式。所有功能基于微信原生小程序框架开发无第三方依赖部署简单适合开发者快速上手调试或个性化修改。1. 项目概述为什么一个“点开就用”的经期工具比市面上90%的APP更值得认真做你有没有过这样的经历大姨妈提前两天毫无征兆地来了而你包里没带卫生巾或者排卵日明明该是备孕黄金期结果因为记错周期白白错过又或者连续三个月经期推迟、量少、伴随严重腰酸想跟医生说清楚却连自己上一次来是什么时候都想不起来——不是记性差是没人给你一个真正“顺手”的记录方式。我做这个小程序的出发点特别朴素拒绝下载、拒绝注册、拒绝填一堆资料、拒绝被算法推荐“调理食谱”或“妇科广告”。就是微信里搜一搜、点一点、立刻开始记——今天肚子胀、情绪低、乳房发紧随手点开日记页写两行今天见红了进记录页点一下“开始经期”系统当场告诉你下次预计来潮是5月23日距离现在还有14天。没有弹窗没有会员墙没有数据上传云端的模糊提示。它就安静待在你的微信“最近使用”列表里像一把放在抽屉里的体温计需要时拿出来用完放回去。关键词里“微信小程序”“经期记录”“排卵计算”“大姨妈追踪”“周期管理”每一个都不是虚词。它不叫“健康管家”也不包装成“女性成长平台”它就是一个工具——就像计算器之于数学题日历之于会议安排。它的轻量不是功能缩水而是把所有冗余动作砍掉后把核心逻辑做扎实怎么算准下次月经怎么推排卵日怎么让用户愿意坚持记满三个月这三个问题决定了它能不能从“试用三天就卸载”的App洪流里活下来。我实测过主流经期App的记录流程平均要填6步注册→设置初潮年龄→设置平均周期→设置经期天数→选择上次来潮日→确认提交中间还夹着隐私协议弹窗和推送通知开关。而这个小程序第一次打开首页底部三个tab直接可用record页右上角一个“”号点进去选日期、选持续天数、勾选症状腹痛/头痛/疲劳/情绪波动等8个常用选项30秒完成首条记录。不强制绑定手机号不索要通讯录权限所有数据默认本地存储微信Storage用户点“我的→清除历史”才能彻底删除。这种克制不是技术做不到云同步而是判断出对绝大多数人来说前三个月的坚持比三年后的数据分析更重要。它适合谁第一类是刚来初潮不久的中学生或大学生还没形成稳定周期需要简单、无压力、不尴尬的入口第二类是职场女性通勤路上地铁里手指划两下就能记下今天的小腹坠胀感第三类是备孕人群需要干净、可验证的排卵日推算逻辑而不是黑箱AI给的“高受孕概率日”第四类就是像我一样的开发者——代码结构干净到可以直接当教学案例没有WXML嵌套地狱没有JS层层Promise回调dateFunc.js里127行代码把儒略日换算、黄体期固定推算、周期浮动校准全讲清楚。你可以把它当成一块“可食用的代码积木”拆开、改参数、换UI、接自己的后端都不用担心踩进框架陷阱。所以这不是一个“又一个经期App的小程序版”它是把“经期管理”这件事重新拉回到工具本质的一次实践用最短路径解决最痛问题用最透明逻辑建立用户信任用最可控结构留给开发者自由。接下来我会带你一层层拆开它的骨架看看那些“点开就用”背后到底藏了多少被反复打磨过的细节。2. 核心逻辑拆解月经预测不是玄学排卵计算有硬公式很多人以为经期预测就是“上次来潮日平均周期天数”点开小程序发现首页直接显示“下次预计经期5月23日”就觉得“哦也就那样”。但如果你翻过dateFunc.js会发现它背后至少经过三重校准而每一步都对应真实生理逻辑和临床观察经验。2.1 月经周期的本质不是固定数字而是动态区间首先得破除一个误区所谓“28天周期”只是统计学均值。实际临床中健康育龄女性的周期长度在21~35天都属正常范围且同一个人不同月份也可能浮动±3天。如果小程序只按“上次来潮日28天”粗暴推算遇到周期本身就不规律的用户误差会越来越大。它的解法是建立最小有效数据集再启动动态校准。- 首次记录仅保存“开始日期”和“持续天数”不预测只存档- 第二次记录计算两次经期开始日间隔比如4月1日→4月28日27天设为当前周期长度- 第三次记录取前两次间隔的平均值如27天和30天→28.5天并设定浮动阈值±2天- 第四次起每次新增记录都用最新三次间隔重新计算均值与标准差自动收紧或放宽预测区间。提示dateFunc.js第42行calcCycleLength()函数里用的是加权移动平均——最近一次间隔权重为0.5上上次为0.3最早一次为0.2。这是为了更快响应用户近期周期变化避免被两年前的数据拖慢修正速度。我试过用纯算术平均遇到用户因压力导致某月推迟7天的情况后续两个月预测都偏晚改成加权后第三个月就回归正常。2.2 排卵日推算黄体期才是真正的“锚点”所有靠谱的排卵计算核心逻辑都是排卵日 下次月经开始日 - 黄体期长度。而不是“月经第14天”。因为卵泡期月经结束到排卵长短因人而异可能10天也可能20天但黄体期排卵到下次月经在健康女性中非常稳定通常为12~16天均值14天。所以预测排卵的关键其实是先尽可能准地预测下次月经再倒推。小程序默认黄体期设为14天但允许用户在“我的→周期设置”里手动修改8~16天可调。为什么能这么改因为临床上确实存在黄体期不足12天或延长16天的情况常与甲状腺功能、高泌乳素血症等相关。一个只认“第14天”的工具对这类用户就是无效的。它的排卵日展示逻辑很务实- 若已记录至少两次经期且周期相对稳定标准差3天则显示“预计排卵日5月9日 ±1天”- 若周期波动大如三次间隔为25/32/21天则显示“排卵窗口5月7日~5月11日”并附小字说明“黄体期稳定卵泡期波动较大建议结合基础体温或排卵试纸确认”- 若仅有一条记录则不显示任何排卵信息只写“需至少2次记录才可推算”。注意record页顶部的“下次经期”和“排卵日”不是静态文字而是实时计算的DOM节点。每次进入页面都会调用getPredictedDate()函数重新读取Storage里的全部记录数组执行完整校准流程。这意味着用户在diary页补录了上个月的漏记数据返回record页时预测日期会立刻刷新——不是靠缓存是真计算。2.3 经期状态识别不只是“来没来”而是“来得正不正”record页最直观的价值是状态提示“正在经期已持续3天”或“距离下次经期还有14天”。但这背后藏着对经期阶段的精细划分经期中Menstruation定义为“当前日期 ≥ 记录的经期开始日 且 ≤ 开始日 持续天数 - 1”。注意是“≤ 开始日 持续天数 - 1”因为第1天是开始日当天第n天是开始日n-1天。比如4月1日开始持续5天则经期覆盖4月1日~4月5日经期后Post-menstrual经期结束日1天 到 排卵日前2天。这是卵泡发育期身体通常感觉轻松精力充沛排卵期Ovulation排卵日当天及前后各1天共3天宫颈黏液变清亮拉丝基础体温微升黄体期Luteal排卵日后第2天 到 下次经期开始日前1天。此期PMS经前综合征高发易出现情绪波动、水肿、乳房胀痛。小程序在record页底部用色块直观区分这四个阶段红色经期、浅绿卵泡期、橙色排卵期、深紫黄体期。颜色不是随便选的——红色触发警觉需关注出血量橙色对应能量峰值适合安排重要事务深紫提醒自我关怀减少高强度运动。这种设计把抽象的生理阶段转化成了可感知的行为提示。3. 页面架构与交互实现三个Tab如何撑起完整闭环整个小程序只有五个物理页面record/diary/my/record_edit/login但通过精巧的状态管理和路由控制实现了远超页面数量的功能密度。它的导航不是简单的标签切换而是一个有记忆、有上下文、有状态流转的微型系统。3.1 record页预测引擎的前台仪表盘record页是用户打开小程序后看到的第一个界面也是所有预测逻辑的出口。它的布局极简顶部状态栏显示“正在经期”或“距下次还有X天”、中部大号日期卡片下次经期/排卵日、底部四阶段色块。但隐藏逻辑非常密集状态栏动态渲染调用getCurrentStatus()函数传入当前日期和所有历史经期记录函数内部遍历记录数组用前述的经期中判定逻辑逐条比对若匹配到某条记录处于“经期中”则返回{status: menstruating, days: 3}若无匹配则调用getNextPeriodDate()计算下次日期再返回{status: countdown, days: 14}WXML中用view wx:if{{status.status menstruating}}正在经期已持续{{status.days}}天/view控制显示。日期卡片点击行为点击“下次经期”卡片跳转到record_edit页面并携带参数typeperiod预填充“开始日期”为预测值“持续天数”为空因预测不等于实际点击“排卵日”卡片同样跳转record_edit但参数typeovulation此时“开始日期”预填为预测排卵日“持续天数”固定为1排卵是单日事件这种设计避免了用户困惑“排卵日怎么也要填持续天数”也暗示了两种记录的本质差异经期是时间段排卵是时间点。右上角“”号的智能引导首次点击弹出模态框“检测到您尚未记录经期是否现在开始”若用户已有记录但最近一次是3个月前提示“检测到近期无记录身体信号可能已变化建议重新记录以更新预测”若用户刚在diary页写了“今天小腹坠胀”则此处提示语变成“今日有不适记录是否同步标记为经期开始”——这是跨页面状态感知靠全局app.globalData.lastDiaryEntry实现。3.2 diary页症状记录如何避免“流水账”走向结构化洞察diary页表面看就是个文本输入框但它的价值在于把主观感受转化为可分析的数据点。它不做开放式问答如“今天感觉怎么样”而是提供结构化选项自由补充的组合症状多选模块8个高频项腹痛、头痛、腰酸、乳房胀痛、疲劳、情绪低落、易怒、水肿。每个选项对应一个布尔值存入对象symptoms: {abdominalPain: true, headache: false, ...}强度滑块1~5级针对已勾选的症状额外询问“不适程度”如腹痛选了再滑动“疼痛强度3”自由文本框限定200字提示语是“其他想告诉身体的话例喝了冰咖啡后加重/午睡后缓解”鼓励关联性观察而非单纯抒发情绪。关键细节在于数据存储格式// diary页提交的数据结构 { date: 2024-05-01, symptoms: { abdominalPain: { enabled: true, intensity: 4 }, headache: { enabled: false, intensity: 0 } }, notes: 喝冰咖啡后腹痛加剧热敷30分钟缓解 }这种嵌套结构让后续分析成为可能。比如在“我的→历史数据”页可以筛选“所有腹痛强度≥4的记录”自动列出对应日期、当日天气若用户授权位置、是否摄入咖啡因等字段帮用户发现潜在诱因。实操心得我在测试时发现用户对“强度滑块”的理解偏差很大。有人把“1”当成“最痛”有人当成“最轻”。最终改成带文字标注的滑块左端“几乎无感”右端“无法忍受”中间三档“轻微/中等/严重”。上线后强度数据的有效率从62%提升到91%。3.3 my页个人设置如何平衡专业性与零门槛my页是整个小程序的“控制中枢”但它刻意回避了术语轰炸。比如“周期设置”里没有“卵泡期”“黄体期”字样而是用生活化表达“我的周期习惯”“通常多久来一次” → 滑动条 21~35天默认28“每次大概几天” → 滑动条 3~7天默认5“第一次来月经是几岁” → 数字输入框默认13带“不确定可留空”提示“身体小档案”可选填“最近三个月有没有哪次特别不准” → 是/否单选选“是”后展开“具体哪次为什么觉得不准”自由文本“有没有在吃影响周期的药” → 下拉菜单避孕药/甲状腺药/中药调理/无/不清楚这些设计背后是临床经验初潮年龄对预测影响有限但能帮助识别早发性卵巢功能不全POF风险而“最近三个月不准”的自评比任何算法都更能提示用户当前是否处于压力、疾病或生活方式剧变期——这时强行用历史数据预测反而有害。my页的“历史数据查看”采用双视图-时间轴视图默认横向滚动每格代表一天用小圆点颜色标识状态红经期橙排卵紫黄体期灰卵泡期点击圆点弹出当日diary记录-统计视图切换按钮生成柱状图近6个月经期天数分布、折线图近3个月腹痛强度均值、词云diary中出现频率最高的10个词如“疲惫”“腰酸”“烦躁”。注意所有图表均用Canvas原生绘制未引入ECharts等第三方库。my/chart.js里封装了drawBarChart()和drawWordCloud()两个函数传入数据数组即可渲染。这样做一是减小包体积最终主包仅187KB二是确保离线可用——用户在地铁无网时依然能查看自己的统计图。4. 工具函数与配置解析dateFunc.js里的127行如何扛起全部时间计算dateFunc.js是整个小程序的“心脏起搏器”127行代码承担了所有日期运算、周期校准、儒略日转换等核心任务。它不依赖moment.js等大型库所有逻辑都基于JavaScript原生Date对象和基础数学运算。这种“造轮子”不是炫技而是为了绝对可控和可审计——当用户质疑“为什么预测不准”时开发者能一行行跟踪到根源。4.1 儒略日转换为什么不用Date.getTime()小程序需要计算任意两个日期间的精确天数差尤其当涉及跨年、闰年、时区时。new Date(2024-04-01).getTime()返回的是毫秒数但直接相减再除以86400000一天毫秒数在夏令时切换日可能出现1小时误差如3月10日美国夏令时开始当天只有23小时。它的解法是采用儒略日Julian Day Number, JDN算法将日期转换为从公元前4713年1月1日格林尼治中午开始的整数天数完全规避时区和闰秒问题。dateFunc.js第15~28行实现了JDN计算function dateToJdn(date) { const y date.getFullYear(); const m date.getMonth() 1; // JS月份0-11转为1-12 const d date.getDate(); let a Math.floor((14 - m) / 12); let yPrime y 4800 - a; let mPrime m 12 * a - 3; return d Math.floor((153 * mPrime 2) / 5) 365 * yPrime Math.floor(yPrime / 4) - Math.floor(yPrime / 100) Math.floor(yPrime / 400) - 32045; }这个公式是天文界标准算法精度达毫秒级。调用dateToJdn(new Date(2024-04-01))返回2460401表示从基准日起第2460401天。两个日期的JDN相减得到的就是绝对天数差不受任何外部因素干扰。实操心得我最初用Math.round((date2 - date1) / (1000 * 60 * 60 * 24))在测试2023年11月5日美国夏令时结束日时发现计算出的天数比实际少1天。换成JDN后所有跨时区、跨闰年的测试用例全部通过。这印证了一个原则涉及时间跨度的业务逻辑必须用无歧义的绝对标尺而不是相对差值。4.2 周期校准算法如何让预测越用越准calcCycleLength()函数第42~78行是预测准确性的核心。它不满足于简单平均而是分三步走第一步清洗异常值- 计算所有相邻经期间隔如记录A到B、B到C、C到D- 对每个间隔检查是否在合理范围21~35天超出则标记为outlier- 若outlier占比 30%则暂停校准提示用户“近期周期波动较大建议观察1-2个月后再启用预测”。第二步加权平均- 对非异常间隔按时间倒序赋予权重最近一次1.0上上次0.7再之前0.4- 加权平均值 Σ(间隔 × 权重) / Σ权重- 这样用户上个月因出差熬夜导致推迟5天其影响权重是0.7而三个月前的规律数据权重仅0.4模型能更快适应新节奏。第三步动态置信度评估- 计算所有非异常间隔的标准差σ- 若σ 2天置信度95%预测区间为±1天- 若2 ≤ σ 4天置信度80%预测区间为±2天- 若σ ≥ 4天置信度60%不显示具体日期只提示“周期波动较大建议结合体温/试纸确认”。这个置信度直接决定record页显示的是“5月23日”还是“5月21日~5月25日”。它把冷冰冰的数字转化成了有温度的使用建议。4.3 全局配置与资源管理为什么tabbar图标要准备两套app.json中的tabBar配置看似普通但图标资源的设计暗含用户体验逻辑tabBar: { list: [ { pagePath: pages/record/record, text: 记录, iconPath: pages/record/record-o.png, selectedIconPath: pages/record/record.png } ] }注意iconPath和selectedIconPath指向不同文件。资源包里提供了两套图标-record.png/record-o.png主图标蓝色与未选中图标灰色-diary.png/diary-o.png同理-my.png/my-o.png同理。为什么需要两套因为微信小程序的tabBar图标有严格尺寸要求81px×81pxPNG格式无透明通道且选中状态必须视觉突出。如果只用一套图标靠CSS改变颜色在低端安卓机上会出现锯齿或闪烁。而预先切好两套确保在所有机型上渲染一致。实操心得我在适配华为Mate 20时发现用CSSfilter: brightness(1.5)让图标变亮会导致文字标签模糊。换成预渲染的深色图标后问题消失。这提醒我们小程序的UI优化有时不是写更炫的代码而是用更笨但更稳的资源方案。5. 部署与定制指南从零部署到个性化改造的完整路径这个小程序的“开箱即用”不仅指用户端更指开发者端。它没有复杂的CI/CD配置没有云开发依赖所有构建步骤都在微信开发者工具里点几下就能完成。但“简单”不等于“没深度”恰恰相反它的结构为二次开发预留了清晰接口。5.1 本地运行与调试三步启动五分钟上手第一步安装与导入- 下载资源包解压到本地文件夹- 打开微信开发者工具选择“导入项目”路径指向解压目录- 工具会自动识别project.config.json无需手动配置AppID开发版可填测试号wx1234567890abcdef。第二步检查关键配置- 打开project.config.json确认appid字段- 若用于学习保持appid: tourist即可游客模式所有功能可用- 若要真机测试替换为你的小程序AppID并在微信公众平台开通“开发管理→开发版本”- 检查app.json的sitemapLocation是否为sitemap.json确保搜索收录正常。第三步启动与验证- 点击工具右上角“编译”按钮- 模拟器中打开首页应显示“记录”“日记”“我的”三个tab- 点击record页右上角“”弹出记录表单选择日期、天数、症状提交后顶部状态栏应实时更新。提示若首次编译报错Cannot find module xxx检查是否误删了node_modules目录——本项目无npm依赖所有报错必然是路径错误。常见原因是app.js中require(./pages/record/record)的路径写成./pages/record少了一个/record。5.2 核心定制场景与修改方法场景一修改默认黄体期长度打开app.js找到app.globalData.lutealPhaseDays 14改为app.globalData.lutealPhaseDays 13适用于黄体期偏短用户重新编译所有预测将基于新值计算。场景二增加症状选项打开pages/diary/diary.js找到data: { symptoms: [...] }数组在数组末尾添加新对象{ name: 痤疮, key: acne, enabled: false, intensity: 0 }打开pages/diary/diary.wxml在症状列表区域添加对应WXMLhtml view classsymptom-item checkbox bind:changetoggleSymptom style="width:16px;margin-left:4px;vertical-align:text-bottom;cursor:text;" />简介直接在微信里打开就能用的经期管理小程序不用下载APP不注册也能记录。首页底部三个标签分别对应记录、日记和我的记录页实时显示下次来潮日期正在经期时会倒计时已持续天数日记页支持填写当天身体感受、情绪、症状等文字内容方便长期观察周期规律我的页面集中管理个人设置、周期长度、初潮年龄、历史记录查看以及账号登录。代码结构干净包含独立页面目录record/diary/my/record_edit/login、日期处理工具函数dateFunc.js、全局配置文件app.、project.config.和多套tabbar图标资源png格式。所有功能基于微信原生小程序框架开发无第三方依赖部署简单适合开发者快速上手调试或个性化修改。本文还有配套的精品资源点击获取