diff --git a/app.json b/app.json index 467dc1a..19d9400 100644 --- a/app.json +++ b/app.json @@ -6,6 +6,7 @@ "pages/my/my", "pages/news/news-details", "pages/guanyu/guanyu", + "pages/ghdCalculator/ghdCalculator", "pages/webpage/webpage", "pages/tool/tool", "pages/igfrefer/igfrefer", diff --git a/pages/ghdCalculator/ghdCalculator.js b/pages/ghdCalculator/ghdCalculator.js new file mode 100644 index 0000000..e4057a5 --- /dev/null +++ b/pages/ghdCalculator/ghdCalculator.js @@ -0,0 +1,243 @@ +const app = getApp(); + +Page({ + data: { + // 基础数据 + ba: '', // 骨龄 + ca: '', // 实际年龄 + igf1: '', // IGF-1值 + igfbp3: '', // IGFBP-3值 + // 计算结果 + showResult: false, + probability: null, + calculationDetails: null, + // 参考范围 + referenceRanges: { + igf1: { + male: [ + { ageRange: '0-1', min: 55, max: 327 }, + { ageRange: '1-3', min: 51, max: 303 }, + { ageRange: '3-5', min: 49, max: 289 }, + { ageRange: '5-7', min: 52, max: 297 }, + { ageRange: '7-9', min: 57, max: 316 }, + { ageRange: '9-11', min: 88, max: 474 }, + { ageRange: '11-13', min: 110, max: 565 }, + { ageRange: '13-15', min: 202, max: 957 }, + { ageRange: '15-17', min: 193, max: 731 } + ], + female: [ + { ageRange: '0-1', min: 55, max: 327 }, + { ageRange: '1-3', min: 51, max: 303 }, + { ageRange: '3-5', min: 49, max: 289 }, + { ageRange: '5-7', min: 52, max: 297 }, + { ageRange: '7-9', min: 57, max: 316 }, + { ageRange: '9-11', min: 88, max: 474 }, + { ageRange: '11-13', min: 183, max: 850 }, + { ageRange: '13-15', min: 261, max: 1096 }, + { ageRange: '15-17', min: 238, max: 996 } + ] + }, + igfbp3: { + male: [ + { ageRange: '0-1', min: 0.7, max: 3.6 }, + { ageRange: '1-3', min: 0.8, max: 3.9 }, + { ageRange: '3-5', min: 0.9, max: 4.3 }, + { ageRange: '5-7', min: 1.0, max: 4.7 }, + { ageRange: '7-9', min: 1.1, max: 5.2 }, + { ageRange: '9-11', min: 1.3, max: 5.6 }, + { ageRange: '11-13', min: 1.4, max: 6.1 }, + { ageRange: '13-15', min: 1.6, max: 6.8 }, + { ageRange: '15-17', min: 1.8, max: 7.1 } + ], + female: [ + { ageRange: '0-1', min: 0.7, max: 3.6 }, + { ageRange: '1-3', min: 0.8, max: 3.9 }, + { ageRange: '3-5', min: 0.9, max: 4.3 }, + { ageRange: '5-7', min: 1.0, max: 4.7 }, + { ageRange: '7-9', min: 1.1, max: 5.2 }, + { ageRange: '9-11', min: 1.3, max: 5.6 }, + { ageRange: '11-13', min: 1.5, max: 6.3 }, + { ageRange: '13-15', min: 1.7, max: 7.3 }, + { ageRange: '15-17', min: 1.9, max: 7.9 } + ] + } + } + }, + + // 输入处理 + inputBA(e) { + // 只允许输入数字和小数点 + const value = e.detail.value.replace(/[^\d.]/g, ''); + // 确保只有一个小数点 + const formattedValue = value.replace(/\.+/g, '.'); + this.setData({ ba: formattedValue }); + }, + + inputCA(e) { + const value = e.detail.value.replace(/[^\d.]/g, ''); + const formattedValue = value.replace(/\.+/g, '.'); + this.setData({ ca: formattedValue }); + }, + + inputIGF1(e) { + const value = e.detail.value.replace(/[^\d.]/g, ''); + const formattedValue = value.replace(/\.+/g, '.'); + this.setData({ igf1: formattedValue }); + }, + + inputIGFBP3(e) { + const value = e.detail.value.replace(/[^\d.]/g, ''); + const formattedValue = value.replace(/\.+/g, '.'); + this.setData({ igfbp3: formattedValue }); + }, + + // 计算GHD概率 + calculate() { + const { ba, ca, igf1, igfbp3 } = this.data; + + // 输入验证 + if (!this.validateInput()) return; + + try { + // 将字符串转换为数字 + const baNum = parseFloat(ba); + const caNum = parseFloat(ca); + const igf1Num = parseFloat(igf1); + const igfbp3Num = parseFloat(igfbp3); + + // 计算 BA-CA + const baCaDiff = baNum - caNum; + + // 计算 Y = LN(P/1-P) + const y = this.calculateY(baCaDiff, igf1Num, igfbp3Num); + + // 计算概率 P + const p = this.calculateProbability(y); + + // 计算各因素的贡献 + const contributions = this.calculateContributions(baCaDiff, igf1Num, igfbp3Num); + + // 显示结果 + this.setData({ + showResult: true, + probability: p, + calculationDetails: { + steps: [ + `步骤1:设置方程右边为 Y`, + `Y = 3.726 - 0.876×(BA-CA) - 0.058×(IGF-1) + 0.229×(IGFBP-3)`, + `Y = 3.726 - 0.876×(${baNum.toFixed(2)} - ${caNum.toFixed(2)}) - 0.058×${igf1Num.toFixed(2)} + 0.229×${igfbp3Num.toFixed(2)}`, + `Y = 3.726 - 0.876×(${baCaDiff.toFixed(2)}) - 0.058×${igf1Num.toFixed(2)} + 0.229×${igfbp3Num.toFixed(2)}`, + `Y = 3.726 - ${(0.876 * baCaDiff).toFixed(4)} - ${(0.058 * igf1Num).toFixed(4)} + ${(0.229 * igfbp3Num).toFixed(4)}`, + `Y = ${y.toFixed(4)}`, + ``, + `步骤2:解指数方程`, + `P/(1-P) = e^Y`, + `P/(1-P) = e^${y.toFixed(4)}`, + `P/(1-P) = ${Math.exp(y).toFixed(4)}`, + ``, + `步骤3:求概率 P`, + `P = e^Y / (1 + e^Y)`, + `P = ${p.toFixed(4)}`, + ``, + `GHD预测概率:${(p * 100).toFixed(2)}%` + ].join('\n'), + interpretation: this.getInterpretation(p) + } + }); + + } catch (error) { + wx.showToast({ + title: error.message || '计算失败', + icon: 'none' + }); + } + }, + + // 输入验证 + validateInput() { + const { ba, ca, igf1, igfbp3 } = this.data; + + if (!ba || !ca || !igf1 || !igfbp3) { + wx.showToast({ + title: '请填写完整信息', + icon: 'none' + }); + return false; + } + + // 验证输入是否为有效数字 + const baNum = parseFloat(ba); + const caNum = parseFloat(ca); + const igf1Num = parseFloat(igf1); + const igfbp3Num = parseFloat(igfbp3); + + if (isNaN(baNum) || isNaN(caNum) || isNaN(igf1Num) || isNaN(igfbp3Num)) { + wx.showToast({ + title: '请输入有效数字', + icon: 'none' + }); + return false; + } + + // 验证数值范围 + if (baNum <= 0 || caNum <= 0) { + wx.showToast({ + title: '年龄必须大于0', + icon: 'none' + }); + return false; + } + + return true; + }, + + // 计算Y值 + calculateY(baCaDiff, igf1, igfbp3) { + return 3.726 - 0.876 * baCaDiff - 0.058 * igf1 + 0.229 * igfbp3; + }, + + // 计算概率 + calculateProbability(y) { + const expY = Math.exp(y); + return expY / (1 + expY); + }, + + // 计算各因素的贡献 + calculateContributions(baCaDiff, igf1, igfbp3) { + // Implementation of calculateContributions method + }, + + // 获取解释文本 + getInterpretation(p) { + const percentage = (p * 100).toFixed(2); + let interpretation = `预测结果显示该患者患有GHD的概率为${percentage}%\n\n`; + + if (p >= 0.8) { + interpretation += '预测结果提示GHD可能性较大,建议进一步进行相关检查。'; + } else if (p >= 0.5) { + interpretation += '预测结果提示存在GHD可能,建议进行相关检查。'; + } else { + interpretation += '预测结果提示GHD可能性较小,但仍需结合临床表现进行综合判断。'; + } + + return interpretation; + }, + + // 重置表单 + reset() { + this.setData({ + ba: '', + ca: '', + igf1: '', + igfbp3: '', + showResult: false, + probability: null, + calculationDetails: null + }); + }, + + // 返回上一页 + onClickLeft() { + wx.navigateBack(); + } +}); \ No newline at end of file diff --git a/pages/ghdCalculator/ghdCalculator.json b/pages/ghdCalculator/ghdCalculator.json new file mode 100644 index 0000000..f1ebea3 --- /dev/null +++ b/pages/ghdCalculator/ghdCalculator.json @@ -0,0 +1,11 @@ +{ + "usingComponents": { + "van-nav-bar": "/miniprogram/miniprogram_npm/@vant/weapp/nav-bar/index", + "van-overlay": "/miniprogram/miniprogram_npm/@vant/weapp/overlay/index", + "van-field": "/miniprogram/miniprogram_npm/@vant/weapp/field/index", + "van-button": "/miniprogram/miniprogram_npm/@vant/weapp/button/index", + "van-toast": "/miniprogram/miniprogram_npm/@vant/weapp/toast/index" + }, + "navigationBarTitleText": "GHD预测计算", + "navigationStyle": "custom" +} diff --git a/pages/ghdCalculator/ghdCalculator.wxml b/pages/ghdCalculator/ghdCalculator.wxml new file mode 100644 index 0000000..3cc4da3 --- /dev/null +++ b/pages/ghdCalculator/ghdCalculator.wxml @@ -0,0 +1,83 @@ + + + + + + + 骨龄(岁) + + + + + 实际年龄(岁) + + + + + IGF-1值 + + + + + IGFBP-3值 + + + + + 计算 + 重置 + + + + + + 计算结果 + + + + 计算过程: + + {{calculationDetails.steps}} + + + + + + {{calculationDetails.interpretation}} + + + + 注:本计算结果仅供参考,具体诊断请咨询专业医生。预测模型基于二元Logistic回归分析。 + + + \ No newline at end of file diff --git a/pages/ghdCalculator/ghdCalculator.wxss b/pages/ghdCalculator/ghdCalculator.wxss new file mode 100644 index 0000000..dcf92ce --- /dev/null +++ b/pages/ghdCalculator/ghdCalculator.wxss @@ -0,0 +1,175 @@ +/* pages/ghdCalculator/ghdCalculator.wxss *//* 页面容器 */ +.container { + padding: 40rpx; + background: #f5f5f5; + min-height: 100vh; +} + +/* 输入表单 */ +.form-container { + width: 100%; + background: #fff; + border-radius: 24rpx; + padding: 0rpx; + background: #f5f5f5; + box-shadow: 0 4rpx 12rpx rgba(0,0,0,0.05); +} + +.form-group { + margin-bottom: 40rpx; +} + +.form-label { + font-size: 28rpx; + color: #333; + margin-bottom: 16rpx; + display: inline-block; + font-weight: bold; +} + +.form-input { + width: 90%; + height: 80rpx; + background: #ffffff; + border-radius: 16rpx; + padding: 0 24rpx; + font-size: 28rpx; +} + +/* 性别选择 */ +.gender-group { + display: flex; + margin: 20rpx 0; +} + +.gender-item { + flex: 1; + text-align: center; + padding: 20rpx; + border: 2rpx solid #eee; + border-radius: 16rpx; + margin: 0 10rpx; +} + +.gender-item.active { + border-color: #27C2A7; + background: #e6f7f4; +} + +/* 按钮样式 */ +.button-group { + margin-top: 40rpx; +} + +.button { + height: 80rpx; + line-height: 80rpx; + text-align: center; + border-radius: 16rpx; + font-size: 28rpx; + color: #fff; + background: #27C2A7; +} + +.button.secondary { + background: #fff; + border: 2rpx solid #27C2A7; + color: #27C2A7; + margin-top: 20rpx; +} + +/* 结果展示 */ +.result-container { + margin-top: 40rpx; + background: #fff; + border-radius: 24rpx; + padding: 40rpx; +} + +.result-title { + font-size: 32rpx; + font-weight: bold; + color: #333; + text-align: center; + margin-bottom: 40rpx; +} + +.result-item { + display: flex; + justify-content: space-between; + padding: 20rpx 0; + border-bottom: 2rpx solid #eee; +} + +.result-label { + font-size: 28rpx; + color: #666; +} + +.result-value { + font-size: 28rpx; + color: #333; + font-weight: bold; +} + +.result-value.green { + color: #27C2A7; +} + +.result-value.red { + color: #ff4c00; +} + +/* 图表容器 */ +.chart-container { + margin-top: 40rpx; + height: 400rpx; +} + +/* 提示信息 */ +.tips { + font-size: 24rpx; + color: #999; + margin-top: 20rpx; + line-height: 1.6; +} + +.calculation-process { + margin: 20rpx 0; + padding: 20rpx; + background-color: #f8f8f8; + border-radius: 10rpx; +} + +.process-title { + font-size: 28rpx; + color: #333; + margin-bottom: 10rpx; +} + +.process-steps { + display: flex; + flex-direction: column; + font-family: monospace; + font-size: 28rpx; + color: #666; +} + +.process-steps text { + margin: 5rpx 0; + white-space: pre; +} + +.result-interpretation { + margin: 20rpx 0; + padding: 20rpx; + background-color: #fff; + border-radius: 10rpx; + border: 1px solid #eee; +} + +.interpretation-text { + font-size: 28rpx; + color: #333; + white-space: pre-line; +} diff --git a/pages/home/home.js b/pages/home/home.js index 78b8ba8..88568ab 100644 --- a/pages/home/home.js +++ b/pages/home/home.js @@ -61,10 +61,15 @@ Page({ // 性发育图表 go_peizhen() { - if (this.checkLoginAndNavigate()) { - wx.showToast({ - title: '功能正在开发中', - icon: 'none' + // if (this.checkLoginAndNavigate()) { + // wx.showToast({ + // title: '功能正在开发中', + // icon: 'none' + // }) + // } + if (this.checkLoginAndNavigate()) { + wx.navigateTo({ + url: '/pages/ghdCalculator/ghdCalculator' }) } }, diff --git a/pages/home/home.wxml b/pages/home/home.wxml index 33cdd36..d5ab755 100644 --- a/pages/home/home.wxml +++ b/pages/home/home.wxml @@ -16,12 +16,12 @@ {{"生长发育相关参考计算和图表"}} - +