//app.js | |||||
App({ | |||||
onLaunch: function () { | |||||
} | |||||
}) |
{ | |||||
"pages":[ | |||||
"pages/index/index" | |||||
], | |||||
"window": { | |||||
"navigationBarBackgroundColor": "#0082FE", | |||||
"navigationBarTextStyle": "white", | |||||
"navigationBarTitleText": "BM16离线历史记录", | |||||
"backgroundColor": "#eeeeee", | |||||
"backgroundTextStyle": "light" | |||||
}, | |||||
"plugins": { | |||||
"sdkPlugin": { | |||||
"version": "2.4.0", | |||||
"provider": "wx17e93aad47cdae1a" | |||||
} | |||||
}, | |||||
"style": "v2", | |||||
"sitemapLocation": "sitemap.json" | |||||
} |
// const plugin = requirePlugin("myPlugin").AiFresh; | |||||
const {BM16His: plugin} = requirePlugin("sdkPlugin"); | |||||
function inArray(arr, key, val) { | |||||
for (let i = 0; i < arr.length; i++) { | |||||
if (arr[i][key] === val) { | |||||
return i; | |||||
} | |||||
} | |||||
return -1; | |||||
} | |||||
// ArrayBuffer转16进度字符串示例 | |||||
function ab2hex(buffer) { | |||||
var hexArr = Array.prototype.map.call( | |||||
new Uint8Array(buffer), | |||||
function (bit) { | |||||
return ('00' + bit.toString(16)).slice(-2) | |||||
} | |||||
) | |||||
return hexArr.join(','); | |||||
} | |||||
// var information = [] | |||||
Page({ | |||||
data: { | |||||
devices: [], | |||||
mac: "", | |||||
connected: false, | |||||
text: "", | |||||
unitList_all: ['g', 'ml', 'lb:oz', 'oz', 'kg', '斤', '牛奶 ml', '水 ml', '牛奶 floz', '水 floz', 'lb'], | |||||
unitList: ['g', 'ml', 'lb:oz', 'oz'], | |||||
weight: 0, | |||||
unit: 'g', | |||||
unitIndex: 0, | |||||
min: 0, | |||||
second: 0, | |||||
showWriteInput: false, | |||||
connected: false, | |||||
chs: [], | |||||
cmd: '', | |||||
name: '', | |||||
deviceId: null, | |||||
historyList: [], | |||||
height:0, | |||||
information:[], | |||||
}, | |||||
onLoad: function () { | |||||
let screenHeight = wx.getSystemInfoSync().windowHeight; | |||||
this.setData({ | |||||
height: screenHeight - 344, | |||||
}); | |||||
}, | |||||
clearDevices() { | |||||
this.setData({ | |||||
devices: [] | |||||
}) | |||||
this.closeBluetoothAdapter() | |||||
wx.nextTick(()=>{ | |||||
this.openBluetoothAdapter() | |||||
}) | |||||
}, | |||||
// 初始化蓝牙模块 | |||||
openBluetoothAdapter() { | |||||
wx.openBluetoothAdapter({ | |||||
success: (res) => { | |||||
console.log('openBluetoothAdapter success', res) | |||||
this.startBluetoothDevicesDiscovery() | |||||
}, | |||||
fail: (res) => { | |||||
if (res.errCode === 10001) { | |||||
wx.showToast({ | |||||
title: '请打开蓝牙', | |||||
icon: "none" | |||||
}) | |||||
wx.onBluetoothAdapterStateChange(function (res) { | |||||
console.log('onBluetoothAdapterStateChange', res) | |||||
if (res.available) { | |||||
this.startBluetoothDevicesDiscovery() | |||||
} | |||||
}) | |||||
} | |||||
} | |||||
}) | |||||
}, | |||||
// 获取本机蓝牙适配器状态 | |||||
getBluetoothAdapterState() { | |||||
wx.getBluetoothAdapterState({ | |||||
success: (res) => { | |||||
console.log('getBluetoothAdapterState', res) | |||||
if (res.discovering) { | |||||
this.onBluetoothDeviceFound() | |||||
} else if (res.available) { | |||||
this.startBluetoothDevicesDiscovery() | |||||
} | |||||
} | |||||
}) | |||||
}, | |||||
// 开始搜寻附近的蓝牙外围设备 | |||||
startBluetoothDevicesDiscovery() { | |||||
if (this._discoveryStarted) { | |||||
return | |||||
} | |||||
this._discoveryStarted = true | |||||
wx.startBluetoothDevicesDiscovery({ | |||||
allowDuplicatesKey: true, | |||||
services: [ | |||||
"FFE0", | |||||
"F0A0", // BM30广播模块需加上,如使用连接模块可忽略 | |||||
], | |||||
powerLevel: 'high', | |||||
success: (res) => { | |||||
console.log('startBluetoothDevicesDiscovery success', res) | |||||
this.onBluetoothDeviceFound() | |||||
}, | |||||
}) | |||||
}, | |||||
// 停止搜寻附近的蓝牙外围设备 | |||||
stopBluetoothDevicesDiscovery() { | |||||
wx.stopBluetoothDevicesDiscovery() | |||||
}, | |||||
// 监听寻找到新设备的事件 | |||||
onBluetoothDeviceFound() { | |||||
wx.onBluetoothDeviceFound((res) => { | |||||
console.log('res',res); | |||||
res.devices.forEach(device => { | |||||
if (!device.name && !device.localName) { | |||||
return | |||||
} | |||||
const foundDevices = this.data.devices | |||||
console.log('foundDevices',foundDevices); | |||||
const idx = inArray(foundDevices, 'deviceId', device.deviceId) | |||||
let advertisDatas = ab2hex(device.advertisData).split(',').toString() | |||||
let index = advertisDatas.indexOf('6e,49') | |||||
let cid = advertisDatas[index + 9] + advertisDatas[index + 10] | |||||
const data = {} | |||||
// console.log(device) | |||||
// console.log(ab2hex(device.advertisData)) | |||||
// 此处判断是否BM30广播模块,如使用连接模块请删除此 if ,只保留 else 内容 | |||||
if (cid == 14 ||cid == '0e') { | |||||
if (device.advertisServiceUUIDs[0].indexOf("F0A0") !== -1) { | |||||
let parseDataRes = plugin.parseBroadcastData(device.advertisData) | |||||
// console.log(parseDataRes) | |||||
if (parseDataRes.status == 1) { | |||||
let analyzeData = plugin.analyzeBroadcastScaleData(parseDataRes) | |||||
device.analyzeDataText = analyzeData.text | |||||
console.log(analyzeData.data.weight) | |||||
} | |||||
} else { | |||||
let buff = device.advertisData.slice(8, 14) | |||||
device.mac = new Uint8Array(buff) // 保存广播数据中的mac地址,这是由于iOS不直接返回mac地址 | |||||
let tempMac = Array.from(device.mac) | |||||
tempMac.reverse() | |||||
device.macAddr = ab2hex(tempMac, ':').toUpperCase() | |||||
} | |||||
if (idx === -1) { | |||||
data[`devices[${foundDevices.length}]`] = device | |||||
} else { | |||||
data[`devices[${idx}]`] = device | |||||
} | |||||
this.setData(data) | |||||
} | |||||
}) | |||||
}) | |||||
}, | |||||
// 连接低功耗蓝牙设备 | |||||
createBLEConnection(e) { | |||||
this._connLoading = true | |||||
wx.showLoading({ | |||||
title: '连接中', | |||||
}) | |||||
setTimeout(() => { | |||||
if (this._connLoading) { | |||||
this._connLoading = false | |||||
wx.hideLoading() | |||||
} | |||||
}, 6000) | |||||
const ds = e.currentTarget.dataset | |||||
const index = ds.index | |||||
// 保存当前连接的设备,注意不能从wxml的dataset中直接返回该对象,因为ArrarBuffer类型的数据无法保留 | |||||
const deviceId = ds.deviceId | |||||
const name = ds.name | |||||
this._device = this.data.devices[index] | |||||
console.log(this._device) | |||||
wx.createBLEConnection({ | |||||
deviceId, | |||||
success: (res) => { | |||||
// console.log('this._device',this._device); | |||||
let buff = this._device.advertisData.slice(-6) | |||||
let arr = new Uint8Array(buff).reverse() | |||||
let mac = ab2hex(arr).replace(/,/g,":") | |||||
// console.log('mac',mac); | |||||
this.setData({ | |||||
connected: true, | |||||
name, | |||||
deviceId, | |||||
mac | |||||
}) | |||||
console.log("createBLEConnection:success") | |||||
this.log('蓝牙连接成功!') | |||||
wx.stopBluetoothDevicesDiscovery() | |||||
this.onBLEConnectionStateChange() | |||||
this.getBLEDeviceServices(deviceId) | |||||
}, | |||||
fail: res => { | |||||
this._connLoading = false | |||||
wx.hideLoading() | |||||
wx.showToast({ | |||||
title: '连接失败', | |||||
icon: 'none' | |||||
}) | |||||
} | |||||
}) | |||||
// 连接上设备就可以停止蓝牙搜索,减少功耗。 | |||||
this.stopBluetoothDevicesDiscovery() | |||||
}, | |||||
onBLEConnectionStateChange() { | |||||
wx.onBLEConnectionStateChange((res) => { | |||||
console.log('wx.onBLEConnectionStateChange() ', res.deviceId, res.connected, res.errorCode, res.errorMsg) | |||||
// 该方法回调中可以用于处理连接意外断开等异常情况 | |||||
// console.log(`%c device ${res.deviceId} state has changed, connected: ${res.connected}`, 'color: #F26363') | |||||
if (!res.connected) { | |||||
wx.showToast({ | |||||
title: '连接已断开', | |||||
icon: 'none' | |||||
}) | |||||
this.log(this.data.mac + '蓝牙已断开连接....') | |||||
this.setData({ | |||||
showWriteInput: false, | |||||
}) | |||||
} | |||||
}) | |||||
}, | |||||
// 断开与低功耗蓝牙设备的连接 | |||||
closeBLEConnection() { | |||||
wx.closeBLEConnection({ | |||||
deviceId: this._deviceId | |||||
}) | |||||
this.log(this.data.mac + '蓝牙已断开连接....') | |||||
this.setData({ | |||||
showWriteInput: false, | |||||
}) | |||||
}, | |||||
quit(){ | |||||
this.closeBLEConnection() | |||||
this.setData({ | |||||
connected: false, | |||||
information:[] | |||||
}) | |||||
}, | |||||
// 获取蓝牙设备的 serviceId | |||||
getBLEDeviceServices(deviceId) { | |||||
wx.getBLEDeviceServices({ | |||||
deviceId, | |||||
success: (res) => { | |||||
for (let i = 0; i < res.services.length; i++) { | |||||
if (res.services[i].isPrimary && res.services[i].uuid.indexOf('FFE0') > -1) { | |||||
this.getBLEDeviceCharacteristics(deviceId, res.services[i].uuid) | |||||
return | |||||
} | |||||
} | |||||
} | |||||
}) | |||||
}, | |||||
// 获取蓝牙设备某个服务中所有特征值(characteristic) | |||||
getBLEDeviceCharacteristics(deviceId, serviceId) { | |||||
this._deviceId = deviceId | |||||
this._serviceId = serviceId | |||||
this._device.serviceId = serviceId | |||||
wx.getBLEDeviceCharacteristics({ | |||||
deviceId, | |||||
serviceId, | |||||
success: (res) => { | |||||
console.log('getBLEDeviceCharacteristics success', res.characteristics) | |||||
console.log('plugin',plugin); | |||||
// 初始化插件 | |||||
plugin.initPlugin(res.characteristics, this._device) | |||||
wx.onBLECharacteristicValueChange((characteristic) => { | |||||
// 解析特征值,返回解密后的数据 | |||||
let bleData = plugin.parseBleData(characteristic.value) | |||||
console.log(bleData) | |||||
if (bleData.status == 0) { | |||||
console.log("握手成功") | |||||
this._connLoading = false | |||||
wx.hideLoading() | |||||
wx.showToast({ | |||||
title: '连接成功', | |||||
}) | |||||
} else if (bleData.status == 2) { | |||||
let payload = bleData.data //对应协议中的payload数据,可以自行解析该数据 | |||||
// console.log(ab2hex(payload, ' ')) | |||||
// console.log(ab2hex(bleData.completeData, ' ')) | |||||
switch (payload[0]) { | |||||
case 0x1B: | |||||
if (payload[1] == 0) { | |||||
this.log('设置系统时间成功') | |||||
}else if (payload[1] == 1) { | |||||
this.log('设置系统时间失败') | |||||
}else{ | |||||
this.log('系统不支持时间设置') | |||||
} | |||||
break; | |||||
case 0x1C: | |||||
if (payload[1] == 1) { | |||||
let {year,month,day,hour,min,second} = plugin.analyzeSystemTime(payload) | |||||
this.log(`系统时间为:${year}/${month}/${day} ${hour}:${min}:${second}`) | |||||
} else { | |||||
this.log('系统时间无效') | |||||
} | |||||
break; | |||||
case 0x2B: | |||||
if (payload[1] == 0x05) { | |||||
if (payload[2] == 0) { | |||||
this.log('无用户历史记录') | |||||
} else if(payload[2] == 1) { | |||||
this.log('开始发送历史记录') | |||||
}else{ | |||||
this.log('结束发送历史记录') | |||||
} | |||||
} | |||||
if (payload[1] == 0x06) { | |||||
if (payload[2] == 0x01) { | |||||
plugin.analyzeMCUBodyData(payload) | |||||
} else if (payload[2] == 0x02){ | |||||
plugin.analyzeMCUBodyData(payload) | |||||
}else if (payload[2] == 0x03) { | |||||
let { year,month,day,hour,min,second,id,userCharacteristics,sex,age,height,weight,metabolicBasisRate,bodyAge ,uint,symbol,impedance,compute,bodyFat,subcutaneousFat,visceralFat,musclesRate,boneMass,waterContent,proteinRate,heartRate } = plugin.analyzeMCUBodyData(payload) | |||||
this.log(`时间为:${year}/${month}/${day} ${hour}:${min}:${second} | |||||
id:${id} 用户特征:${userCharacteristics},性别:${sex},年龄:${age},身高:${height}, | |||||
体重:${weight},单前单位:${uint},重量数据精度:${symbol},阻抗:${impedance}, | |||||
心率数据:${heartRate},体脂:${bodyFat},皮下脂肪:${subcutaneousFat} | |||||
,内脏脂肪:${visceralFat},肌肉率:${musclesRate},基础代谢率:${metabolicBasisRate}, | |||||
骨量:${boneMass},水含量:${waterContent},蛋白率:${proteinRate},身体年龄:${bodyAge}`) | |||||
} | |||||
} | |||||
if (payload[1] == 0x07) { | |||||
if (payload[2] == 0x01) { | |||||
plugin.analyzeAPPBodyData(payload) | |||||
} else if (payload[2] == 0x02){ | |||||
let { year,month,day,hour,min,second,id,userCharacteristics,sex,age,height,weight,uint,symbol,impedance,compute,heartRate } = plugin.analyzeAPPBodyData(payload) | |||||
this.log(`时间为:${year}/${month}/${day} ${hour}:${min}:${second} | |||||
id:${id} 用户特征:${userCharacteristics},性别:${sex},年龄:${age},身高:${height}, | |||||
体重:${weight},单前单位:${uint},重量数据精度:${symbol},阻抗:${impedance}, | |||||
算法标识:${compute},心率数据:${heartRate}`) | |||||
} | |||||
} | |||||
if (payload[1] == 0x04) { | |||||
if (payload[2] == 0) { | |||||
this.log('更新列表成功') | |||||
} else if(payload[2] == 1){ | |||||
this.log('更新个人用户成功') | |||||
}else if(payload[2] == 2){ | |||||
this.log('更新列表失败') | |||||
}else if(payload[2] == 3){ | |||||
this.log('更新个人用户失败') | |||||
}else{ | |||||
this.log('未知指令') | |||||
} | |||||
} | |||||
} | |||||
} else if (bleData.status == 1){ | |||||
} | |||||
}) | |||||
}, | |||||
fail(res) { | |||||
console.error('getBLEDeviceCharacteristics', res) | |||||
} | |||||
}) | |||||
}, | |||||
log(data){ | |||||
let info = this.data.information | |||||
info.unshift(data) | |||||
this.setData({ | |||||
information:info | |||||
}) | |||||
}, | |||||
writeBLECharacteristicValue(buffer, uuid, deviceId, serviceId) { | |||||
// 向蓝牙设备发送一个二进制流数据 | |||||
wx.writeBLECharacteristicValue({ | |||||
deviceId, | |||||
serviceId, | |||||
characteristicId: uuid, | |||||
value: buffer, | |||||
success(res) { | |||||
console.log('writeBLECharacteristicValue success', res) | |||||
console.log('下发指令==> ' + ab2hex(buffer)) | |||||
} | |||||
}) | |||||
}, | |||||
closeBluetoothAdapter() { | |||||
wx.closeBluetoothAdapter() | |||||
this._discoveryStarted = false | |||||
}, | |||||
setSystemTime(){ | |||||
// console.log('设置时间'); | |||||
plugin.setSystemTime() | |||||
}, | |||||
getSystemTime(){ | |||||
// console.log('获取时间'); | |||||
plugin.getSystemTime() | |||||
}, | |||||
updateUserList(){ | |||||
// console.log('更新用户列表'); | |||||
let userInfo = { identity:0,id:7,sex:1,age:21,height:176,weight:77.5,impedance:450} | |||||
let userInfo1 = { identity:1,id:2,sex:0,age:29,height:162,weight:66.1,impedance:420 } | |||||
let userInfo2 = { identity:0,id:1,sex:1,age:22,height:168,weight:71.1,impedance:430 } | |||||
let userList = [] | |||||
userList.push(userInfo) | |||||
userList.push(userInfo1) | |||||
userList.push(userInfo2) | |||||
plugin.updateUserList(userList) | |||||
}, | |||||
updateUserInformation(){ | |||||
//console.log('更新用户个人信息'); | |||||
let userInfo ={ identity:0,id:7,sex:1,age:21,height:176,weight:77.5,impedance:450} | |||||
plugin.updateUserInformation(userInfo) | |||||
}, | |||||
requestHis(){ | |||||
plugin.requestHis() | |||||
} | |||||
}); |
{ | |||||
"usingComponents": {} | |||||
} |
<wxs module="utils"> | |||||
module.exports.max = function(n1, n2) { | |||||
return Math.max(n1, n2) | |||||
} | |||||
module.exports.len = function(arr) { | |||||
arr = arr || [] | |||||
return arr.length | |||||
} | |||||
module.exports.fill0 = function(num) { | |||||
if (!num) { | |||||
return '00' | |||||
} | |||||
return ('00' + num).slice(-2) | |||||
} | |||||
</wxs> | |||||
<block wx:if="{{!connected}}"> | |||||
<button bindtap="openBluetoothAdapter">开始扫描</button> | |||||
<button bindtap="stopBluetoothDevicesDiscovery">停止扫描</button> | |||||
<button bindtap="closeBluetoothAdapter">结束流程</button> | |||||
<button bindtap="clearDevices">清空列表</button> | |||||
<view class="devices_summary">已发现 {{devices.length}} 个外围设备:</view> | |||||
<view class="device_list"> | |||||
<view wx:for="{{devices}}" wx:key="index" | |||||
class="device_item"> | |||||
<view style="font-size: 16px; color: #333;">{{item.name || item.localName}}</view> | |||||
<view style="font-size: 10px">信号强度: {{item.RSSI}}dBm ({{utils.max(0, item.RSSI + 100)}}%)</view> | |||||
<view style="font-size: 10px">mac地址: {{item.deviceId}}</view> | |||||
<view | |||||
class="device_item_btn" | |||||
hover-class="btn_hover" | |||||
data-device-id="{{item.deviceId}}" | |||||
data-name="{{item.name || item.localName}}" | |||||
data-index="{{index}}" | |||||
bindtap="createBLEConnection" | |||||
>连接</view> | |||||
</view> | |||||
</view> | |||||
</block> | |||||
<view class="wrap" wx:else> | |||||
<view class="stopConnect"> | |||||
<view>{{mac}}</view> | |||||
<view class="btn_connect" hover-class="btn_hover" bindtap="closeBLEConnection">断开连接</view> | |||||
</view> | |||||
<view class="btn_wrap"> | |||||
<button bindtap="setSystemTime">设置系统时间</button> | |||||
<button bindtap="getSystemTime">获取系统时间</button> | |||||
<button bindtap="updateUserList">更新用户列表</button> | |||||
<button bindtap="updateUserInformation">更新个人用户信息</button> | |||||
<button bindtap="requestHis">请求同步历史记录</button> | |||||
<button bindtap="quit">退回蓝牙连接页面</button> | |||||
</view> | |||||
<!-- <view class="weight_wrap"> --> | |||||
<scroll-view class="log" scroll-y style='height:{{2*height}}rpx' scroll-into-view="{{jumpPoint}}"> | |||||
<view class="logList" wx:for="{{information}}"> | |||||
{{item}} | |||||
</view> | |||||
</scroll-view> | |||||
</view> |
page { | |||||
color: #333; | |||||
} | |||||
.devices_summary { | |||||
margin-top: 30px; | |||||
padding: 10px; | |||||
font-size: 16px; | |||||
} | |||||
.device_list { | |||||
min-height: 300px; | |||||
margin: 0 5px; | |||||
border: 1px solid #EEE; | |||||
width: auto; | |||||
} | |||||
.device_item { | |||||
border-bottom: 1px solid #EEE; | |||||
padding: 10px; | |||||
color: #666; | |||||
position: relative; | |||||
} | |||||
.device_item_btn{ | |||||
position: absolute; | |||||
right: 12px; | |||||
top: 50%; | |||||
transform: translateY(-50%); | |||||
width: 60px; | |||||
height: 30px; | |||||
display: flex; | |||||
align-items: center; | |||||
justify-content: center; | |||||
border: 1px solid #ddd; | |||||
border-radius: 3px; | |||||
} | |||||
.connected_info { | |||||
position: fixed; | |||||
bottom: 0; | |||||
width: 100%; | |||||
background-color: #F0F0F0; | |||||
padding: 10px; | |||||
padding-bottom: 20px; | |||||
margin-bottom: env(safe-area-inset-bottom); | |||||
font-size: 14px; | |||||
min-height: 100px; | |||||
box-shadow: 0px 0px 3px 0px; | |||||
} | |||||
.connected_info .operation { | |||||
position: absolute; | |||||
display: inline-block; | |||||
right: 30px; | |||||
} | |||||
.writeInputViewBg{ | |||||
position: fixed; | |||||
top: 0; | |||||
left: 0; | |||||
right: 0; | |||||
bottom: 0; | |||||
z-index: 1000; | |||||
background-color: rgba(0,0,0,0.5); | |||||
} | |||||
.writeInputView{ | |||||
position: fixed; | |||||
top: 30%; | |||||
left: 50%; | |||||
z-index: 1001; | |||||
background-color: #fff; | |||||
width: 80vw; | |||||
height: 300rpx; | |||||
display: flex; | |||||
flex-direction: column; | |||||
align-items: center; | |||||
transform: translateX(-50%); | |||||
} | |||||
.writeInput{ | |||||
margin-top: 60rpx; | |||||
width: 90%; | |||||
height: 60rpx; | |||||
border: 1rpx solid #ccc; | |||||
} | |||||
.writeInput input{ | |||||
width: 100%; | |||||
height: 100%; | |||||
box-sizing: border-box; | |||||
} | |||||
.hint{ | |||||
padding-top: 10rpx; | |||||
font-size: 24rpx; | |||||
color: #999; | |||||
} | |||||
.btns{ | |||||
display: flex; | |||||
align-items: center; | |||||
justify-content: space-between; | |||||
width: 60%; | |||||
margin-top: 50rpx; | |||||
} | |||||
.stopConnect{ | |||||
display: flex; | |||||
align-items: center; | |||||
justify-content: space-between; | |||||
padding: 10px; | |||||
} | |||||
.btn_connect{ | |||||
width: 20%; | |||||
height: 30px; | |||||
display: flex; | |||||
align-items: center; | |||||
justify-content: center; | |||||
background: #f8f8f8; | |||||
border: 1px solid #ddd; | |||||
border-radius: 5px; | |||||
} | |||||
.log{ | |||||
width: 100%; | |||||
} | |||||
.logList{ | |||||
border-bottom: 1px solid #f8f8f8; | |||||
} | |||||
.weight_wrap, | |||||
.timer_wrap{ | |||||
padding: 10px; | |||||
border-top: 1px solid #ddd; | |||||
} | |||||
.timer_value, | |||||
.weight_value{ | |||||
display: flex; | |||||
align-items: center; | |||||
justify-content: center; | |||||
} | |||||
.value_item{ | |||||
margin: 0 5px; | |||||
padding: 4px 6px; | |||||
border: 1px solid #eee; | |||||
min-width: 60px; | |||||
text-align: center; | |||||
} | |||||
.btn_wrap{ | |||||
padding-top: 10px; | |||||
} | |||||
.btn_unitList_title{ | |||||
padding: 10px; | |||||
} | |||||
.btn_unitList{ | |||||
display: flex; | |||||
flex-wrap: wrap; | |||||
align-items: center; | |||||
justify-content: space-around; | |||||
} | |||||
.btn_unit{ | |||||
width: 20%; | |||||
height: 40px; | |||||
display: flex; | |||||
align-items: center; | |||||
justify-content: center; | |||||
background: #f8f8f8; | |||||
border: 1px solid #ddd; | |||||
border-radius: 5px; | |||||
margin: 10px 0; | |||||
} | |||||
.btn_hover{ | |||||
background: rgba(0,0,0,0.1); | |||||
} |
{ | |||||
"description": "项目配置文件", | |||||
"packOptions": { | |||||
"ignore": [], | |||||
"include": [] | |||||
}, | |||||
"setting": { | |||||
"urlCheck": true, | |||||
"es6": true, | |||||
"enhance": true, | |||||
"postcss": true, | |||||
"preloadBackgroundData": false, | |||||
"minified": true, | |||||
"newFeature": false, | |||||
"coverView": true, | |||||
"nodeModules": false, | |||||
"autoAudits": false, | |||||
"showShadowRootInWxmlPanel": true, | |||||
"scopeDataCheck": false, | |||||
"uglifyFileName": false, | |||||
"checkInvalidKey": true, | |||||
"checkSiteMap": true, | |||||
"uploadWithSourceMap": true, | |||||
"compileHotReLoad": false, | |||||
"useMultiFrameRuntime": true, | |||||
"useApiHook": true, | |||||
"useApiHostProcess": false, | |||||
"babelSetting": { | |||||
"ignore": [], | |||||
"disablePlugins": [], | |||||
"outputPath": "" | |||||
}, | |||||
"enableEngineNative": false, | |||||
"bundle": false, | |||||
"useIsolateContext": true, | |||||
"useCompilerModule": true, | |||||
"userConfirmedUseCompilerModuleSwitch": false, | |||||
"userConfirmedBundleSwitch": false, | |||||
"packNpmManually": false, | |||||
"packNpmRelationList": [], | |||||
"minifyWXSS": true | |||||
}, | |||||
"compileType": "miniprogram", | |||||
"libVersion": "2.14.1", | |||||
"appid": "wx17e93aad47cdae1a", | |||||
"projectname": "ailink_demo", | |||||
"simulatorType": "wechat", | |||||
"simulatorPluginLibVersion": {}, | |||||
"condition": {}, | |||||
"editorSetting": { | |||||
"tabIndent": "insertSpaces", | |||||
"tabSize": 4 | |||||
} | |||||
} |
{ | |||||
"description": "项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html", | |||||
"projectname": "ailink_demo", | |||||
"setting": { | |||||
"compileHotReLoad": true | |||||
} | |||||
} |
{ | |||||
"desc": "关于本文件的更多信息,请参考文档 https://developers.weixin.qq.com/miniprogram/dev/framework/sitemap.html", | |||||
"rules": [{ | |||||
"action": "allow", | |||||
"page": "*" | |||||
}] | |||||
} |
////////////////////////////// 返回参数判断 ////////////////////// | |||||
//height传入单位为cm weight单位为kg sex=1为男性 else 为女性 | |||||
module.exports = { | |||||
getWeightDisplay, | |||||
getBMIDisplay, | |||||
getFatRateDisplay, | |||||
getMuscleDisplay, | |||||
getMoistureDisplay, | |||||
getBonemassDisplay, | |||||
getBMRDisplay, | |||||
getVisceralfatDisplay, | |||||
getVisceralfatDisplay, | |||||
getSubcutaneousFatDisplay, | |||||
getProteinRateDisplay, | |||||
getPhysicalAgeDisplay, | |||||
getFatWeightDisplay, | |||||
getMuscleMassDisplay, | |||||
getProteinDisplay, | |||||
getFatLevel, | |||||
getBodyLevel, | |||||
getWeightScore, | |||||
}; | |||||
// 体重 标准判断 | |||||
function getWeightDisplay(height, weight) { | |||||
var i = Math.pow(height / 100, 2); | |||||
var a1 = 18.5 * i; | |||||
var a2 = 25 * i; | |||||
var a3 = 30 * i; | |||||
var string1 = a1.toFixed(1); | |||||
var string2 = a2.toFixed(1); | |||||
var string3 = a3.toFixed(1); | |||||
if (weight == "-.-") { | |||||
return { | |||||
standard: "-.-", | |||||
text: "", | |||||
}; | |||||
} else if (weight < string1) { | |||||
return { | |||||
standard: "偏瘦", | |||||
text: `基于目前的身体状况,您的标准体重范围为${string1}~${string2}kg,保持理想体重有助于身体各机能持续健康运转,维持最佳代谢状态。体重偏瘦或许已经危害到你的健康,建议您保持良好睡眠,适当食用含高卡路里食物,保持良好的饮食习惯。`, | |||||
}; | |||||
} else if (weight >= string1 && weight < string2) { | |||||
return { | |||||
standard: "标准", | |||||
text: `当前体重为${weight}kg,处于标准体重范围,状态良好,保持良好的饮食习惯和适当的运动,追求完美身材吧。`, | |||||
}; | |||||
} else if (weight >= string2 && weight < string3) { | |||||
return { | |||||
standard: "偏胖", | |||||
text: `当前体重为${weight}kg,体重处于不健康区间!请减少高油高热量食物摄入,加强身体锻炼,努力恢复健康体重和好身材。`, | |||||
}; | |||||
} else if (weight >= string3) { | |||||
return { | |||||
standard: "肥胖", | |||||
text: `当前体重为${weight}kg,远高于标准体重,过度肥胖不仅形体臃肿,更是各种慢性疾病的主要导火线,请减少高脂肪、高热量食物的摄入,制定健身计划,加强锻炼,努力恢复健康体重和好身材。`, | |||||
}; | |||||
} | |||||
return {}; | |||||
} | |||||
//BMI标准 | |||||
function getBMIDisplay(BMI) { | |||||
var standard = ""; | |||||
if (BMI < 18.5 && BMI > 0) { | |||||
standard = "偏瘦"; | |||||
} else if (18.5 <= BMI && BMI < 25) { | |||||
standard = "标准"; | |||||
} else if (25 <= BMI && BMI < 30) { | |||||
standard = "偏胖"; | |||||
} else if (BMI >= 30) { | |||||
standard = "肥胖 "; | |||||
} | |||||
return { | |||||
standard: standard, | |||||
text: `BMI(即身体质量指数,简称体质指数,英文为Body Mass Index,简称BMI),是用体重公斤数除以身高米数平方得出的数字,是目前国际上常用的衡量人体胖瘦程度以及是否健康的一个标准。根据您目前的身高体重远高于标准值,我们建议您采用科学的减肥方式,适当减轻体重,避免因肥胖导致的健康问题。`, | |||||
}; | |||||
} | |||||
//体脂率标准 | |||||
function getFatRateDisplay(fatRate, sex, age) { | |||||
if (age >= 30) { | |||||
if (sex == 1) { | |||||
if (fatRate < 11) { | |||||
return { | |||||
standard: "偏低", | |||||
text: `您的体脂率为${fatRate}%,体脂肪水平偏低,处于危险区间。脂肪是维持人体新陈谢和运动的能量物质,过多/过少都不利于健康,建议均衡搭配饮食,适当增加卡路里摄入量。`, | |||||
}; | |||||
} else if (fatRate >= 11 && fatRate < 22) { | |||||
return { | |||||
standard: "标准", | |||||
text: `您的体脂率为${fatRate}%,体脂肪水平标准。保持健康规律作息,注意保持摄入足够水分,增加代谢,有利于保持健康标准体脂率。 `, | |||||
}; | |||||
} else if (fatRate >= 22 && fatRate < 27) { | |||||
return { | |||||
standard: "偏高", | |||||
text: `您的体脂率为${fatRate}%,体脂肪水平偏高,处于危险区间。脂肪是维持人体新陈谢和运动的能量物质,过多/过少都不利于健康,请注意控制高油高脂食物的摄入,并且多做运动。`, | |||||
}; | |||||
} else if (fatRate >= 27) { | |||||
return { | |||||
standard: "高", | |||||
text: `您的体脂率为${fatRate}%,体脂肪水平严重偏高,处于危险区间。脂肪是维持人体新陈谢和运动的能量物质,过多/过少都不利于健康,请注意控制高油高脂食物的摄入,并且多做运动。`, | |||||
}; | |||||
} | |||||
} else { | |||||
if (fatRate < 21) { | |||||
return { | |||||
standard: "偏低", | |||||
text: `您的体脂率为${fatRate}%,体脂肪水平偏低,处于危险区间。脂肪是维持人体新陈谢和运动的能量物质,过多/过少都不利于健康,建议均衡搭配饮食,适当增加卡路里摄入量。`, | |||||
}; | |||||
} else if (fatRate >= 21 && fatRate < 32) { | |||||
return { | |||||
standard: "标准", | |||||
text: `您的体脂率为${fatRate}%,体脂肪水平标准。保持健康规律作息,注意保持摄入足够水分,增加代谢,有利于保持健康标准体脂率。 `, | |||||
}; | |||||
} else if (fatRate >= 32 && fatRate < 39) { | |||||
return { | |||||
standard: "偏高", | |||||
text: `您的体脂率为${fatRate}%,体脂肪水平偏高,处于危险区间。脂肪是维持人体新陈谢和运动的能量物质,过多/过少都不利于健康,请注意控制高油高脂食物的摄入,并且多做运动。`, | |||||
}; | |||||
} else if (fatRate >= 39) { | |||||
return { | |||||
standard: "高", | |||||
text: `您的体脂率为${fatRate}%,体脂肪水平严重偏高,处于危险区间。脂肪是维持人体新陈谢和运动的能量物质,过多/过少都不利于健康,请注意控制高油高脂食物的摄入,并且多做运动。`, | |||||
}; | |||||
} | |||||
} | |||||
} else if (0 < age && age < 30) { | |||||
if (sex == 1) { | |||||
if (fatRate < 10) { | |||||
return { | |||||
standard: "偏低", | |||||
text: `您的体脂率为${fatRate}%,体脂肪水平偏低,处于危险区间。脂肪是维持人体新陈谢和运动的能量物质,过多/过少都不利于健康,建议均衡搭配饮食,适当增加卡路里摄入量。`, | |||||
}; | |||||
} else if (fatRate >= 10 && fatRate < 21) { | |||||
return { | |||||
standard: "标准", | |||||
text: `您的体脂率为${fatRate}%,体脂肪水平标准。保持健康规律作息,注意保持摄入足够水分,增加代谢,有利于保持健康标准体脂率。 `, | |||||
}; | |||||
} else if (fatRate >= 21 && fatRate < 26) { | |||||
return { | |||||
standard: "偏高", | |||||
text: `您的体脂率为${fatRate}%,体脂肪水平偏高,处于危险区间。脂肪是维持人体新陈谢和运动的能量物质,过多/过少都不利于健康,请注意控制高油高脂食物的摄入,并且多做运动。`, | |||||
}; | |||||
} else if (fatRate >= 26) { | |||||
return { | |||||
standard: "高", | |||||
text: `您的体脂率为${fatRate}%,体脂肪水平严重偏高,处于危险区间。脂肪是维持人体新陈谢和运动的能量物质,过多/过少都不利于健康,请注意控制高油高脂食物的摄入,并且多做运动。`, | |||||
}; | |||||
} | |||||
} else { | |||||
if (fatRate < 20) { | |||||
return { | |||||
standard: "偏低", | |||||
text: `您的体脂率为${fatRate}%,体脂肪水平偏低,处于危险区间。脂肪是维持人体新陈谢和运动的能量物质,过多/过少都不利于健康,建议均衡搭配饮食,适当增加卡路里摄入量。`, | |||||
}; | |||||
} else if (fatRate >= 20 && fatRate < 31) { | |||||
return { | |||||
standard: "标准", | |||||
text: `您的体脂率为${fatRate}%,体脂肪水平标准。保持健康规律作息,注意保持摄入足够水分,增加代谢,有利于保持健康标准体脂率。 `, | |||||
}; | |||||
} else if (fatRate >= 31 && fatRate < 38) { | |||||
return { | |||||
standard: "偏高", | |||||
text: `您的体脂率为${fatRate}%,体脂肪水平偏高,处于危险区间。脂肪是维持人体新陈谢和运动的能量物质,过多/过少都不利于健康,请注意控制高油高脂食物的摄入,并且多做运动。`, | |||||
}; | |||||
} else if (fatRate >= 38) { | |||||
return { | |||||
standard: "高", | |||||
text: `您的体脂率为${fatRate}%,体脂肪水平严重偏高,处于危险区间。脂肪是维持人体新陈谢和运动的能量物质,过多/过少都不利于健康,请注意控制高油高脂食物的摄入,并且多做运动。`, | |||||
}; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
//肌肉率标准 | |||||
function getMuscleDisplay(muscle, sex, muscleWeight) { | |||||
if (sex == 1) { | |||||
if (muscle < 40) { | |||||
return { | |||||
standard: "不足", | |||||
text: `你当前的肌肉率为${muscle}%,肌肉含量为${muscleWeight}kg,体内的肌肉含量不足。增加肌肉量能让您更快的消耗热量,以最健康的方式减掉多余脂肪。合理的饮食,适量的运动,能够增加肌肉含量。`, | |||||
}; | |||||
} else if (40 <= muscle && muscle < 60) { | |||||
return { | |||||
standard: "标准", | |||||
text: `你当前的肌肉率为${muscle}%,肌肉含量为${muscleWeight}kg,体内的肌肉含量标准,身体匀称健康,请您保持锻炼。`, | |||||
}; | |||||
} else if (60 <= muscle) { | |||||
return { | |||||
standard: "优", | |||||
text: `你当前的肌肉率为${muscle}%,肌肉含量为${muscleWeight}kg,体内肌肉结量比较充足,请继续保持适当的运动量和合理的饮食。`, | |||||
}; | |||||
} | |||||
} else { | |||||
if (muscle < 30) { | |||||
return { | |||||
standard: "不足", | |||||
text: `你当前的肌肉率为${muscle}%,肌肉含量为${muscleWeight}kg,体内的肌肉含量不足。增加肌肉量能让您更快的消耗热量,以最健康的方式减掉多余脂肪。合理的饮食,适量的运动,能够增加肌肉含量。`, | |||||
}; | |||||
} else if (30 <= muscle && muscle < 50) { | |||||
return { | |||||
standard: "标准", | |||||
text: `你当前的肌肉率为${muscle}%,肌肉含量为${muscleWeight}kg,体内的肌肉含量标准,身体匀称健康,请您保持锻炼。`, | |||||
}; | |||||
} else if (50 <= muscle) { | |||||
return { | |||||
standard: "优", | |||||
text: `你当前的肌肉率为${muscle}%,肌肉含量为${muscleWeight}kg,体内肌肉结量比较充足,请继续保持适当的运动量和合理的饮食。`, | |||||
}; | |||||
} | |||||
} | |||||
} | |||||
//水分标准 | |||||
function getMoistureDisplay(moisture, sex) { | |||||
if (sex == 1) { | |||||
if (moisture < 55) { | |||||
return { | |||||
standard: "不足", | |||||
text: `您当前的身体水分含量为${moisture}%,水分处于偏低水平。身体里充足的水分能帮助您更好的消化食物和吸收养分,并促进代谢,带走身体毒素。建议您保持规律的饮食,每天八杯水,这样就可以维持正常的身体水分平衡。`, | |||||
}; | |||||
} else if (55 <= moisture && moisture < 65) { | |||||
return { | |||||
standard: "标准", | |||||
text: `您当前的身体水分含量为${moisture}%,水分处于标准区间,请继续保持健康的饮食习惯。`, | |||||
}; | |||||
} else if (50 <= moisture) { | |||||
return { | |||||
standard: "优", | |||||
text: `您当前的身体水分含量为${moisture}%,水分处于优良状态。适量饮水,适当运动,继续保持健康的饮食习惯,有助于保持良好的身体状态哦。`, | |||||
}; | |||||
} | |||||
} else { | |||||
if (moisture < 45) { | |||||
return { | |||||
standard: "不足", | |||||
text: `您当前的身体水分含量为${moisture}%,水分处于偏低水平。身体里充足的水分能帮助您更好的消化食物和吸收养分,并促进代谢,带走身体毒素。建议您保持规律的饮食,每天八杯水,这样就可以维持正常的身体水分平衡。`, | |||||
}; | |||||
} else if (45 <= moisture && moisture < 60) { | |||||
return { | |||||
standard: "标准", | |||||
text: `您当前的身体水分含量为${moisture}%,水分处于标准区间,请继续保持健康的饮食习惯。`, | |||||
}; | |||||
} else if (60 <= moisture) { | |||||
return { | |||||
standard: "优", | |||||
text: `您当前的身体水分含量为${moisture}%,水分处于优良状态。适量饮水,适当运动,继续保持健康的饮食习惯,有助于保持良好的身体状态哦。`, | |||||
}; | |||||
} | |||||
} | |||||
} | |||||
//骨重标准 | |||||
function getBonemassDisplay(bonemass, sex, weight) { | |||||
if (sex == 1) { | |||||
if (weight < 60) { | |||||
if (bonemass < 2.4) { | |||||
return { | |||||
standard: "不足", | |||||
text: `您的骨量水平偏低,建议补充含钙丰富的食品,均衡饮食,进行适量运动,有助于钙质的吸收。`, | |||||
}; | |||||
} else if (2.4 <= bonemass && bonemass <= 2.6) { | |||||
return { | |||||
standard: "标准", | |||||
text: `您的骨量水平标准,骨量在短期内不会出现明显变化,您只要保证健康的饮食和适当的锻炼,就可以维持稳定的骨量水平。`, | |||||
}; | |||||
} else if (2.6 < bonemass) { | |||||
return { | |||||
standard: "优", | |||||
text: `您的骨量水平高于标准水平,这说明您的生活习惯比较健康,营养摄入均衡。继续保持良好的生活习惯,有助于保持良好的骨量水平。`, | |||||
}; | |||||
} | |||||
} else if (60 <= weight && weight < 75) { | |||||
if (bonemass < 2.8) { | |||||
return { | |||||
standard: "不足", | |||||
text: `您的骨量水平偏低,建议补充含钙丰富的食品,均衡饮食,进行适量运动,有助于钙质的吸收。`, | |||||
}; | |||||
} else if (2.8 <= bonemass && bonemass <= 3.0) { | |||||
return { | |||||
standard: "标准", | |||||
text: `您的骨量水平标准,骨量在短期内不会出现明显变化,您只要保证健康的饮食和适当的锻炼,就可以维持稳定的骨量水平。`, | |||||
}; | |||||
} else if (3.0 < bonemass) { | |||||
return { | |||||
standard: "优", | |||||
text: `您的骨量水平高于标准水平,这说明您的生活习惯比较健康,营养摄入均衡。继续保持良好的生活习惯,有助于保持良好的骨量水平。`, | |||||
}; | |||||
} | |||||
} else if (75 <= weight) { | |||||
if (bonemass < 3.1) { | |||||
return { | |||||
standard: "不足", | |||||
text: `您的骨量水平偏低,建议补充含钙丰富的食品,均衡饮食,进行适量运动,有助于钙质的吸收。`, | |||||
}; | |||||
} else if (3.1 <= bonemass && bonemass <= 3.3) { | |||||
return { | |||||
standard: "标准", | |||||
text: `您的骨量水平标准,骨量在短期内不会出现明显变化,您只要保证健康的饮食和适当的锻炼,就可以维持稳定的骨量水平。`, | |||||
}; | |||||
} else if (3.3 < bonemass) { | |||||
return { | |||||
standard: "优", | |||||
text: `您的骨量水平高于标准水平,这说明您的生活习惯比较健康,营养摄入均衡。继续保持良好的生活习惯,有助于保持良好的骨量水平。`, | |||||
}; | |||||
} | |||||
} | |||||
} else { | |||||
if (weight < 45) { | |||||
if (bonemass < 1.7) { | |||||
return { | |||||
standard: "不足", | |||||
text: `您的骨量水平偏低,建议补充含钙丰富的食品,均衡饮食,进行适量运动,有助于钙质的吸收。`, | |||||
}; | |||||
} else if (1.7 <= bonemass && bonemass <= 1.9) { | |||||
return { | |||||
standard: "标准", | |||||
text: `您的骨量水平标准,骨量在短期内不会出现明显变化,您只要保证健康的饮食和适当的锻炼,就可以维持稳定的骨量水平。`, | |||||
}; | |||||
} else if (1.9 < bonemass) { | |||||
return { | |||||
standard: "优", | |||||
text: `您的骨量水平高于标准水平,这说明您的生活习惯比较健康,营养摄入均衡。继续保持良好的生活习惯,有助于保持良好的骨量水平。`, | |||||
}; | |||||
} | |||||
} else if (45 <= weight && weight < 60) { | |||||
if (bonemass < 2.1) { | |||||
return { | |||||
standard: "不足", | |||||
text: `您的骨量水平偏低,建议补充含钙丰富的食品,均衡饮食,进行适量运动,有助于钙质的吸收。`, | |||||
}; | |||||
} else if (2.1 <= bonemass && bonemass <= 2.3) { | |||||
return { | |||||
standard: "标准", | |||||
text: `您的骨量水平标准,骨量在短期内不会出现明显变化,您只要保证健康的饮食和适当的锻炼,就可以维持稳定的骨量水平。`, | |||||
}; | |||||
} else if (2.3 < bonemass) { | |||||
return { | |||||
standard: "优", | |||||
text: `您的骨量水平高于标准水平,这说明您的生活习惯比较健康,营养摄入均衡。继续保持良好的生活习惯,有助于保持良好的骨量水平。`, | |||||
}; | |||||
} | |||||
} else if (60 <= weight) { | |||||
if (bonemass < 2.4) { | |||||
return { | |||||
standard: "不足", | |||||
text: `您的骨量水平偏低,建议补充含钙丰富的食品,均衡饮食,进行适量运动,有助于钙质的吸收。`, | |||||
}; | |||||
} else if (2.4 <= bonemass && bonemass <= 2.6) { | |||||
return { | |||||
standard: "标准", | |||||
text: `您的骨量水平标准,骨量在短期内不会出现明显变化,您只要保证健康的饮食和适当的锻炼,就可以维持稳定的骨量水平。`, | |||||
}; | |||||
} else if (2.6 < bonemass) { | |||||
return { | |||||
standard: "优", | |||||
text: `您的骨量水平高于标准水平,这说明您的生活习惯比较健康,营养摄入均衡。继续保持良好的生活习惯,有助于保持良好的骨量水平。`, | |||||
}; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
//基础代谢率标准 | |||||
function getBMRDisplay(BMR, age, weight, sex) { | |||||
var standard = 0; | |||||
if (sex == 1) { | |||||
if (0 < age && age < 3) { | |||||
standard = 60.9 * weight - 54; | |||||
} else if (3 <= age && age < 10) { | |||||
standard = 22.7 * weight + 495; | |||||
} else if (10 <= age && age < 18) { | |||||
standard = 17.5 * weight + 651; | |||||
} else if (18 <= age && age < 30) { | |||||
standard = 15.3 * weight + 679; | |||||
} else if (30 <= age) { | |||||
standard = 11.6 * weight + 879; | |||||
} | |||||
} else { | |||||
if (0 < age && age < 3) { | |||||
standard = 61.0 * weight - 51; | |||||
} else if (3 <= age && age < 10) { | |||||
standard = 22.5 * weight + 499; | |||||
} else if (10 <= age && age < 18) { | |||||
standard = 12.2 * weight + 746; | |||||
} else if (18 <= age && age < 30) { | |||||
standard = 14.7 * weight + 496; | |||||
} else if (30 <= age) { | |||||
standard = 8.7 * weight + 820; | |||||
} | |||||
} | |||||
if (BMR < standard) { | |||||
return { | |||||
standard: "偏低", | |||||
text: `基于您的基础代谢水平,推荐您每日的摄入热量为${standard}kcal.您的基础代谢率为${BMR}kcal,低于标准区间。均衡合理的热量摄入,适量运动能帮助您健康减脂,达到理想身材。 `, | |||||
}; | |||||
} else { | |||||
return { | |||||
standard: "优", | |||||
text: `您的基础代谢率为${BMR}kcal,目前已达标。每天进行一些低强度的运动,合理的热量摄入有助您增加肌肉。`, | |||||
}; | |||||
} | |||||
} | |||||
//内脏脂肪指数标准 | |||||
function getVisceralfatDisplay(visceralfat) { | |||||
if (visceralfat < 9) { | |||||
return { | |||||
standard: "标准", | |||||
text: `内脏脂肪指数反映人体内内脏脂肪堆积的程度。保持标准的内脏脂肪指数,可以大幅降低心脏病、高血压、高血脂和2型糖尿病的发病风险。您的内脏脂肪水平正常,请继续保持健康饮食和适当运动。`, | |||||
}; | |||||
} else if (9 <= visceralfat && visceralfat < 14) { | |||||
return { | |||||
standard: "警惕", | |||||
text: `您的内脏脂肪处于偏高范围内,内脏脂肪指数偏高,将增加心脏病、高血压、高血脂和2型糖尿病的发病风险。健康您控制饮食,减少糖分高、脂肪高、油炸等食物摄入,多吃谷类、蔬菜、水果等富含维生素、蛋白的蔬菜水果,同时多做运动。`, | |||||
}; | |||||
} else if (14 <= visceralfat) { | |||||
return { | |||||
standard: "危险", | |||||
text: `您的内脏脂肪水平严重偏高,内脏脂肪指数偏高,将增加心脏病、高血压、高血脂和2型糖尿病的发病风险。健康您控制饮食,减少糖分高、脂肪高、油炸等食物摄入,多吃谷类、蔬菜、水果等富含维生素、蛋白的蔬菜水果,同时多做运动。`, | |||||
}; | |||||
} | |||||
} | |||||
//皮下脂肪标准 | |||||
function getSubcutaneousFatDisplay(proteinRate, sex) { | |||||
if (sex == 1) { | |||||
if (proteinRate < 7) { | |||||
return { | |||||
standard: "不足", | |||||
text: `皮下脂脂肪就是贮存于皮下的脂肪组织,人体的脂肪大约有2/3贮存在皮下组织。皮下脂肪主要的作用有 绝热和贮存 。皮下脂肪是人体储存‘余粮’的主要场所。您目前处于正常水平以下,不足的皮下脂肪可能会出现身体偏瘦,皮肤缺乏光泽或有全身痛,没力气等现象,建议你平时注意饮食加强营养,避免劳累情绪激动,适当运动锻炼,避免受风寒着凉。`, | |||||
}; | |||||
} else if (7 <= proteinRate && proteinRate < 15) { | |||||
return { | |||||
standard: "标准", | |||||
text: `皮下脂脂肪就是贮存于皮下的脂肪组织,人体的脂肪大约有2/3贮存在皮下组织。皮下脂肪主要的作用有 绝热和贮存 您的皮下脂肪处于正常水平。坚持合理的饮食,良好的生活习惯,适量运动,就可以使身材和健康状态都保持在良好的范围内。`, | |||||
}; | |||||
} else if (15 <= proteinRate) { | |||||
return { | |||||
standard: "偏高", | |||||
text: `您的皮下脂肪高于正常水平。高糖分高脂肪饮食、久坐少动、遗传因素等都是引起皮下脂肪偏高的原因。建议注意均衡饮食,保持良好的生活习惯,控制热量摄入,进行适当运动。`, | |||||
}; | |||||
} | |||||
} else { | |||||
if (proteinRate < 11) { | |||||
return { | |||||
standard: "不足", | |||||
text: `皮下脂脂肪就是贮存于皮下的脂肪组织,人体的脂肪大约有2/3贮存在皮下组织。皮下脂肪主要的作用有 绝热和贮存 。皮下脂肪是人体储存‘余粮’的主要场所。您目前处于正常水平以下,不足的皮下脂肪可能会出现身体偏瘦,皮肤缺乏光泽或有全身痛,没力气等现象,建议你平时注意饮食加强营养,避免劳累情绪激动,适当运动锻炼,避免受风寒着凉。`, | |||||
}; | |||||
} else if (11 <= proteinRate && proteinRate < 17) { | |||||
return { | |||||
standard: "标准", | |||||
text: `皮下脂脂肪就是贮存于皮下的脂肪组织,人体的脂肪大约有2/3贮存在皮下组织。皮下脂肪主要的作用有 绝热和贮存 您的皮下脂肪处于正常水平。坚持合理的饮食,良好的生活习惯,适量运动,就可以使身材和健康状态都保持在良好的范围内。`, | |||||
}; | |||||
} else if (17 <= proteinRate) { | |||||
return { | |||||
standard: "偏高", | |||||
text: `您的皮下脂肪高于正常水平。高糖分高脂肪饮食、久坐少动、遗传因素等都是引起皮下脂肪偏高的原因。建议注意均衡饮食,保持良好的生活习惯,控制热量摄入,进行适当运动。`, | |||||
}; | |||||
} | |||||
} | |||||
} | |||||
//蛋白率 | |||||
function getProteinRateDisplay(proteinRate, sex) { | |||||
if (sex == 1) { | |||||
if (proteinRate < 16) { | |||||
return { | |||||
standard: "不足", | |||||
text: `您的蛋白水平偏低。缺乏蛋白质会引起免疫力下降、肌肉无力和贫血。建议你保持健康饮食,不过分节食,补充足够的营养。`, | |||||
}; | |||||
} else if (16 <= proteinRate && proteinRate <= 18) { | |||||
return { | |||||
standard: "标准", | |||||
text: `您的蛋白水平比例充足,请继续保持,同时也要防止过度摄入,蛋白质过度摄入也会在体内转化成脂肪,造成脂肪堆积。`, | |||||
}; | |||||
} else if (18 < proteinRate) { | |||||
return { | |||||
standard: "优", | |||||
text: `您的蛋白水平优于标准水平,继续保持良好的作息、均衡的饮食,更有助于蛋白质的吸收。`, | |||||
}; | |||||
} | |||||
} else { | |||||
if (proteinRate < 14) { | |||||
return { | |||||
standard: "不足", | |||||
text: `您的蛋白水平偏低。缺乏蛋白质会引起免疫力下降、肌肉无力和贫血。建议你保持健康饮食,不过分节食,补充足够的营养。`, | |||||
}; | |||||
} else if (14 <= proteinRate && proteinRate <= 16) { | |||||
return { | |||||
standard: "标准", | |||||
text: `您的蛋白水平比例充足,请继续保持,同时也要防止过度摄入,蛋白质过度摄入也会在体内转化成脂肪,造成脂肪堆积。`, | |||||
}; | |||||
} else if (16 < proteinRate) { | |||||
return { | |||||
standard: "优", | |||||
text: `您的蛋白水平优于标准水平,继续保持良好的作息、均衡的饮食,更有助于蛋白质的吸收。`, | |||||
}; | |||||
} | |||||
} | |||||
} | |||||
//身体年龄 | |||||
function getPhysicalAgeDisplay(physicalAge, age) { | |||||
if (physicalAge > age) { | |||||
return { | |||||
standard: "偏大", | |||||
text: `身体年龄是以基础代谢为基础,综合体重、身高、脂肪、肌肉等数值,换算所得出的数值。所以身体年龄是一个高于或低于实际年龄的综合判断标准。仅供参考。`, | |||||
}; | |||||
} else if (physicalAge == age) { | |||||
return { | |||||
standard: "标准", | |||||
text: `身体年龄是以基础代谢为基础,综合体重、身高、脂肪、肌肉等数值,换算所得出的数值。所以身体年龄是一个高于或低于实际年龄的综合判断标准。仅供参考。`, | |||||
}; | |||||
} else if (physicalAge < age) { | |||||
return { | |||||
standard: "优", | |||||
text: `身体年龄是以基础代谢为基础,综合体重、身高、脂肪、肌肉等数值,换算所得出的数值。所以身体年龄是一个高于或低于实际年龄的综合判断标准。仅供参考。`, | |||||
}; | |||||
} | |||||
} | |||||
//脂肪量标准 同 体脂率标准 | |||||
function getFatWeightDisplay(fatRate, sex, age) { | |||||
getFatRateDisplay(fatRate, sex, age) | |||||
} | |||||
//肌肉量标准 同 肌肉率标准 | |||||
function getMuscleMassDisplay(muscle, sex, muscleWeight) { | |||||
getMuscleDisplay(muscle, sex, muscleWeight) | |||||
} | |||||
//蛋白量标准 同 蛋白率标准 | |||||
function getProteinDisplay(proteinRate, sex) { | |||||
getProteinRateDisplay(proteinRate, sex) | |||||
} | |||||
//肥胖等级 stWeight=标准体重 | |||||
function getFatLevel(weight, stWeight, height) { | |||||
var Level = (weight - stWeight) / stWeight; | |||||
if (Level < -0.2) { | |||||
return { | |||||
standard: "体重不足", | |||||
text: `肥胖的程度,表现实际体重与理想体重的差距。肥胖等级是判定肥胖症的一个指标。基于目前的身体状况,您的标准体重范围为${ | |||||
18.5 * height * height | |||||
}~${ | |||||
25 * height * height | |||||
}kg,保持理想体重有助于身体各机能持续健康运转,维持最佳代谢状态。体重偏瘦或许已经危害到你的健康,建议您保持良好睡眠,适当食用含高卡路里食物,保持良好的饮食习惯。`, | |||||
}; | |||||
} else if (Level >= -0.2 && Level < -0.1) { | |||||
return { | |||||
standard: "偏瘦", | |||||
text: `肥胖的程度,表现实际体重与理想体重的差距。肥胖等级是判定肥胖症的一个指标。基于目前的身体状况,您的标准体重范围为${ | |||||
18.5 * height * height | |||||
}~${ | |||||
25 * height * height | |||||
}kg,保持理想体重有助于身体各机能持续健康运转,维持最佳代谢状态。体重偏瘦或许已经危害到你的健康,建议您保持良好睡眠,适当食用含高卡路里食物,保持良好的饮食习惯。`, | |||||
}; | |||||
} else if (Level >= -0.1 && Level < 0.1) { | |||||
return { | |||||
standard: "标准", | |||||
text: `肥胖的程度,表现实际体重与理想体重的差距。肥胖等级是判定肥胖症的一个指标。当前体重处于标准体重范围,状态良好,请继续保持良好的饮食习惯和适当的运动,保持完美身材吧。`, | |||||
}; | |||||
} else if (Level > 0.1 && Level <= 0.2) { | |||||
return { | |||||
standard: "偏重", | |||||
text: `肥胖的程度,表现实际体重与理想体重的差距。肥胖等级是判定肥胖症的一个指标。当前体重为${weight}kg,高于标准体重,过度肥胖不仅形体臃肿,更是各种慢性疾病的主要导火线,请减少高脂肪、高热量食物的摄入,制定健身计划,加强锻炼,努力恢复健康体重和好身材。`, | |||||
}; | |||||
} else if (Level > 0.2) { | |||||
return { | |||||
standard: "超重", | |||||
text: `肥胖的程度,表现实际体重与理想体重的差距。肥胖等级是判定肥胖症的一个指标。当前体重为${weight}kg,高于标准体重,过度肥胖不仅形体臃肿,更是各种慢性疾病的主要导火线,请减少高脂肪、高热量食物的摄入,制定健身计划,加强锻炼,努力恢复健康体重和好身材。`, | |||||
}; | |||||
} | |||||
} | |||||
//体型 | |||||
function getBodyLevel(BFRResult, ROMResult) { | |||||
if ((BFRResult == 2 || BFRResult == 3) && ROMResult == 0) { | |||||
return "隐形肥胖"; | |||||
} else if ((BFRResult == 2 || BFRResult == 3) && ROMResult == 1) { | |||||
return "偏胖"; | |||||
} else if ((BFRResult == 2 || BFRResult == 3) && ROMResult == 2) { | |||||
return "结实型偏胖"; | |||||
} else if (BFRResult == 1 && ROMResult == 0) { | |||||
return "缺乏肌肉型"; | |||||
} else if (BFRResult == 1 && ROMResult == 1) { | |||||
return "标准型"; | |||||
} else if (BFRResult == 1 && ROMResult == 2) { | |||||
return "标准肌肉型"; | |||||
} else if (BFRResult == 0 && ROMResult == 0) { | |||||
return "偏瘦"; | |||||
} else if (BFRResult == 0 && ROMResult == 1) { | |||||
return "偏瘦肌肉型"; | |||||
} else if (BFRResult == 0 && ROMResult == 2) { | |||||
return "健美肌肉型"; | |||||
} | |||||
} | |||||
//身体评分 | |||||
function getWeightScore(bmi) { | |||||
if (bmi < 21.6) { | |||||
return bmi / 21.6 * 100; | |||||
} else { | |||||
return 21.6 / bmi * 100; | |||||
} | |||||
} |
const standard = require("./standard") | |||||
module.exports = { | |||||
...standard, | |||||
} |