要在微信小程序中实现对女性月经的记录和预测,可以按照以下步骤进行:
- 设计界面:设计一个简洁易用的界面,包含记录周期开始日期、结束日期等必要信息,并提供可视化数据分析功能。
- 数据存储:建立数据库来存储用户输入的月经周期信息。可以使用微信小程序自带云开发能力或者第三方平台如LeanCloud等。
- 预测算法:根据用户过去几个月的周期长度和时间跨度,利用数学模型来预测下一次月经开始日期。常见的预测算法有移动平均值、线性回归等。
- 提醒 :将处理好的数据显示或者发送到签前台
废话不多说,我们介绍详细步骤
- 设计界面
在 WXML 文件中创建表单,包含开始日期、结束日期等输入框和提交按钮。使用 WXSS 设置样式并添加图标以提高用户体验。 - 数据存储
首先需要在微信小程序云开发控制台中创建一个数据库,并设置相应的集合和字段。例如,可以创建一个名为“periods”的集合,并设置“start_date”、“end_date”等字段来保存用户输入的周期信息。
然后,在代码中调用 wx.cloud.database() 获取数据库实例,并使用该实例将用户输入的周期信息保存到数据库中。 - 预测算法 以移动平均值为例:
- 在获取到过去几个月(如三个月)的周期数据后,计算这些周期长度的平均值。
- 然后,将该平均值作为下一个预测周期长度,并根据用户输入的最近一次开始日期来计算下一个预测开始日期。例如,如果上一个周期是从 2022 年 5 月 1 日到 5 月 28 日,则可以使用以下代码来计算下一个预测开始日期:
let lastStartDate = new Date('2022/05/01');
let predictedCycleLength = averageCycleLength; // 假设已经计算出了平均长度
let predictedStartDate = new Date(lastStartDate.getTime() + (predictedCycleLength * oneDay));
其中 oneDay
是一天的毫秒数。
4. 提醒
为了提醒用户下一个月经周期的开始日期,可以在代码中使用 wx.showToast()
函数来弹出提示框。例如,在记录完本次周期信息并计算出下一个预测开始日期后,可以添加以下代码:
let nextStartDate = predictedStartDate;
let today = new Date();
if (nextStartDate.getTime() > today.getTime()) {
let daysUntilNextPeriod = Math.floor((nextStartDate.getTime() - today.getTime()) / oneDay);
wx.showToast({
title: '距离下一次月经还有' + daysUntilNextPeriod + '天',
icon: 'none'
});
}
该代码会判断下一个预测开始日期是否晚于当前时间,并计算两者之间的天数差。如果差值大于零,则弹出提示框,显示距离下一次月经开始还有多少天。如果差值小于等于零,则不做任何操作。
完整代码示例:仅供参考 实际需要再做修改 方法没有封装,自己可以再做修改
const db = wx.cloud.database();
const periodsCollection = db.collection('periods');
const oneDay = 24 * 60 * 60 * 1000;
Page({
data: {
startDate: '',
endDate: ''
},
onStartDateChange(event) {
this.setData({startDate: event.detail.value});
},
onEndDateChange(event) {
this.setData({endDate: event.detail.value});
},
async onSubmit() {
let startDate = new Date(this.data.startDate);
let endDate = new Date(this.data.endDate);
if (startDate && endDate && endDate > startDate) {
// 计算周期长度并保存到数据库中
if (startDate&&endDate&&endDate>startDate) {
let cycleLengthInDays=Math.floor((endDate.getTime()-startDate.getTime())/oneDay);
await periodsCollection.add({
data:{
start_date: startDate.toLocaleDateString(),
end_date: endDate.toLocaleDateString()
}
});
// 获取过去三个月的周期数据,并计算平均周期长度和下一个预测开始日期
let today = new Date();
let threeMonthsAgo = new Date(today.getFullYear(), today.getMonth() - 3, 1);
const periodsQueryResult = await periodsCollection.where({
start_date: db.command.gte(threeMonthsAgo)
}).get();
if (periodsQueryResult.data.length > 0) {
// 计算平均周期长度,并保存到本地存储中
let totalCycleLengthInDays=periodsQueryResult.data.reduce((sum, period) => {
return sum + Math.floor((new Date(period.end_date).getTime() - new Date(period.start_date).getTime()) / oneDay);
}, 0);
let averageCycleLengthInDays= Math.round(totalCycleLengthInDays/periodsQueryResult.data.length);
// 计算下一个周期的开始日期,并保存到数据库中
let lastStartDate = new Date(periodsQueryResult.data[0].start_date);
let predictedCycleLengthInDays = averageCycleLengthInDays;
let predictedStartDate = new Date(lastStartDate.getTime() + (predictedCycleLengthInDays * oneDay));
await periodsCollection.add({
data: {
start_date: predictedStartDate.toLocaleDateString(),
end_date: ''
}
});
// 弹出提示框提醒用户下一次月经开始时间(如果有)
if (predictedStartDate) {
let daysUntilNextPeriod = Math.floor((predictedStartDate.getTime() - today.getTime()) / oneDay);
if (daysUntilNextPeriod > 0) {
wx.showToast({
title: '距离下一次月经还有' + daysUntilNextPeriod + '天',
icon: 'none'
});
}
}
// 清空输入框
this.setData({startDate:'',endDate:''});
}
},
})
仅供参考 实际需要再做修改 方法没有封装,自己可以再做修改