微信小程序实现运动能耗计算

news2025/7/28 2:43:59

微信小程序实现运动能耗计算

近我做了一个挺有意思的微信小程序,能够实现运动能耗的计算。只需要输入性别、年龄、体重、运动时长和运动类型这些信息,就能算出对应的消耗热量。

具体来说,在小程序里,性别不同,身体基础代谢和运动时的能耗模式会有差异;年龄影响着身体机能和基础代谢率;体重是计算能耗的关键参数,体重越大,运动时消耗的能量通常越多;运动时长直接关联能耗总量,时长越长,消耗热量自然越多;而不同的运动类型,比如跑步、游泳、跳绳等,它们的运动强度和能耗效率各有不同,所以在计算时需要区分开来。通过综合这些因素,运用特定的算法,就能较为准确地得出运动所消耗的热量。

这个界面示例已经同步到微信小程序啦,大家在微信里搜索「蒜鸟编程」就能看到运行示例,直观感受一下这个计算功能是怎么运作的。如果有对编程、小程序开发感兴趣的小伙伴,还可以在小红书、抖音搜索用户「蒜鸟编程」,上面有更多相关内容分享哦。希望这个小程序和相关分享能给正在学习编程、对运动健康数据计算感兴趣的朋友提供一些参考。当然,要是大家在使用过程中发现有不足的地方,或者觉得哪里有问题,真心希望大家能不吝指正,咱们一起交流探讨,让这个小程序能变得更完善。具体图片如下:
运动能耗计算示例图片

1、js代码:

Page({

  /**
   * 页面的初始数据
   */
  data: {
    current: 'f',
    metValue: 0,
    runList: [{
        id: 1,
        name: '静坐/办公',
        met: 1.5
      },
      {
        id: 2,
        name: '慢走(4km/h)',
        met: 3.5
      },
      {
        id: 3,
        name: '快走(6km/h)',
        met: 5.5
      },
      {
        id: 4,
        name: '慢跑(8km/h)',
        met: 8.0
      },
      {
        id: 5,
        name: '跑步(10km/h)',
        met: 10.0
      },
      {
        id: 6,
        name: '游泳(自由泳)',
        met: 8.0
      },
      {
        id: 7,
        name: '骑自行车(中速)',
        met: 6.0
      },
      {
        id: 8,
        name: '篮球(比赛)',
        met: 8.0
      },
      {
        id: 9,
        name: '足球',
        met: 9.0
      },
      {
        id: 10,
        name: '跳绳(中等强度)',
        met: 10.0
      },
      {
        id: 11,
        name: '跳健身操',
        met: 7.0
      },
      {
        id: 12,
        name: '登山',
        met: 7.0
      },
      {
        id: 13,
        name: '瑜伽',
        met: 3.0
      },
      {
        id: 14,
        name: '力量训练',
        met: 6.0
      }
    ],
    isVisible: false,
    sexValue: '',
    ageValue: '',
    weight: '',
    runInfo: '',
    duration: '',
    blinkTimer: null
  },

  onSelectClick(e) {
    let self = this;
    let attr = ['男性', '女性', '未知'];
    wx.showActionSheet({
      itemList: attr,
      success(res) {
        self.setData({
          sexValue: attr[res.tapIndex]
        })
      },
      fail(res) {
        console.log(res.errMsg)
      }
    })
  },
  //选择监听
  selectClick(e) {
    let old = this.data.current;
    let info = e.currentTarget.dataset;
    let tag = info.index;
    this.setData({
      current: old == tag ? 'f' : tag,
      runInfo: old == tag ? 'f' : info.item
    })
  },
  // 输入绑定
  onInputClick: function (e) {
    let keys = e.currentTarget.dataset.key;
    this.setData({
      [keys]: e.detail.value
    });
  },

  // 计算能耗
  calculateClick() {
    let self = this;
    const {
      sexValue,
      ageValue,
      weight,
      runInfo,
      duration
    } = this.data;
    const age = parseInt(ageValue);
    const wgt = parseFloat(weight);
    const tim = parseFloat(duration);
    // 获取选中的MET值
    if (sexValue == '') {
      wx.showToast({
        title: '请选择性别',
        icon: 'none'
      });
      return;
    }
    if (isNaN(Number(age)) || isNaN(Number(wgt)) || isNaN(Number(tim))) {
      wx.showToast({
        title: '输入的年龄、体重、时长格式存在异常!',
        icon: 'none'
      });
      return;
    }
    // 获取选中的MET值
    if (!runInfo.met) {
      wx.showToast({
        title: '请选择运动类型',
        icon: 'none'
      });
      return;
    }
    let energy = 0;
    if (sexValue === '男性') {
      energy = ((0.2 * (runInfo.met) * wgt) + 7) * (tim / 60);
    } else if (sexValue === '女性') {
      energy = ((0.15 * (runInfo.met) * wgt) + 7) * (tim / 60);
    } else {
      energy = (runInfo.met) * wgt * (tim / 60);
    }
    // 更新结果
    this.setData({
      metValue: energy,
      isVisible: true
    }, () => {
      wx.pageScrollTo({
        scrollTop: 0,
        duration: 300 // 滚动时间,单位为毫秒,可以根据需要调整
      });
      setTimeout(() => {
        self.setData({
          isVisible: false,
          blinkTimer: null
        });
      }, 2000);
    });
  },

  onUnload() {
    let timer = this.data.blinkTimer;
    if (timer) {
      clearTimeout(timer);
    }
  },
})

2、wxml代码:

<view class="level top-box">
  <view class="top-dot">
    <text class="top-num {{isVisible?'blink-text':''}}">{{metValue}} 卡路里</text>
    <text class="top-text">消耗热量</text>
  </view>
  <view class="top-tip">
    <text class="top-tip-text">注:平台仅提供参考示例,不作为其他依据</text>
  </view>
</view>
<view class="input-section">
  <view class="input-group">
    <text class="label">性别 (♀)</text>
    <input class="input" disabled bind:tap="onSelectClick" value="{{sexValue}}" placeholder="点击选择性别" />
  </view>

  <view class="input-group">
    <text class="label">年龄 (岁)</text>
    <input class="input" type="number" bindinput="onInputClick" maxlength="3" data-key="ageValue" value="{{ageValue}}" placeholder="请输入年龄" />
  </view>

  <view class="input-group">
    <text class="label">体重 (kg)</text>
    <input class="input" type="number" bindinput="onInputClick" maxlength="5" data-key="weight" value="{{weight}}" placeholder="请输入体重" />
  </view>

  <view class="input-group">
    <text class="label">运动时长</text>
    <input class="input" type="number" bindinput="onInputClick" maxlength="5" data-key="duration" value="{{duration}}" placeholder="请输入运动时长 (分钟)" />
  </view>

  <view class="input-group">
    <text class="label">运动类型</text>
    <input class="input" disabled value="{{runInfo.name}}" placeholder="点击下方选择运动类型" />
  </view>
</view>
<view class="run-box">
  <view class="run-title">选择运动类型</view>
  <view class="label-box">
    <block wx:for="{{runList}}" wx:key="item">
      <text bindtap="selectClick" data-item="{{item}}" data-index="{{index}}"
      class="label-run {{current==index?'select':''}}">{{item.name}}</text>
    </block>
  </view>
</view>

<button class="calculate-btn" bindtap="calculateClick">
  开始计算
</button>

3、wxss代码:

page {
  font-size: 32rpx;
  padding-bottom: 20rpx;
  background-color: #f1f1f1;
}

.level {
  display: flex;
  flex-direction: row;
  align-items: center;
}

.top-box {
  position: relative;
  padding: 40rpx 20rpx 60rpx 20rpx;
  background-color: #3CB371;
  justify-content: center;
}

.top-text {
  margin: 0 20rpx;
  font-size: 28rpx;
  color: #696969;
}

.top-num {
  padding-bottom: 10rpx;
  font-weight: bold;
  color: #3CB371;
}

.top-dot {
  display: flex;
  flex-direction: column;
  background-color: white;
  color: #000000;
  border-radius: 200rpx;
  width: 60%;
  height: 150rpx;
  align-items: center;
  justify-content: center;
  box-shadow: 0 0 10rpx 10rpx #61a07d;
}

.top-tip {
  position: absolute;
  left: 0;
  right: 0;
  bottom: -20rpx;
  text-align: center;
}

.top-tip-text {
  background-color: #ffffff;
  padding: 15rpx 10%;
  font-size: 24rpx;
  border-radius: 50rpx;
  color: #909399;
}

.input-section {
  background-color: #fff;
  padding: 30rpx;
  margin-bottom: 25rpx;
  margin-top: 50rpx;
}

.input-group {
  display: flex;
  align-items: center;
  margin-bottom: 30rpx;
}

.label {
  width: 25%;
  font-size: 28rpx;
  color: #666;
}

.input {
  flex: 1;
  height: 80rpx;
  font-size: 32rpx;
  padding: 0 10rpx;
  border-bottom: 1rpx solid #eee;
}

.run-box {
  margin-top: 20rpx;
  padding: 30rpx;
  background-color: white;
}

.run-title {
  font-size: 30rpx;
  margin-bottom: 10rpx;
  color: #666666;
}

.label-box {
  margin-top: 10rpx;
  flex-wrap: wrap;
  display: inline-flex;
  flex-direction: row;
}

.label-run {
  background-color: white;
  color: #3CB371;
  margin: 10rpx 25rpx 15rpx 0;
  font-size: 28rpx;
  padding: 8rpx 20rpx;
  border-radius: 50rpx;
  text-align: center;
  border: 1rpx solid #3CB371;
}

.select {
  background-color: #3CB371;
  color: white;
}

.calculate-btn {
  background-color: #4CAF50;
  color: white;
  font-size: 32rpx;
  margin-top: 20rpx;
  border-radius: 40rpx;
  height: 88rpx;
  line-height: 88rpx;
  padding: 0;
  box-shadow: 0 4rpx 12rpx rgba(76, 175, 80, 0.3);
}

.calculate-btn[disabled] {
  background-color: #ccc;
  box-shadow: none;
}

.calculate-btn::after {
  box-shadow: none;
  border: none;
}

/* 定义闪烁动画 */
.blink-text {
  color: #da7828;
  animation: blink 1s infinite;
}

@keyframes blink {

  0%,
  100% {
    opacity: 1;
  }

  50% {
    opacity: 0;
  }
}

4、json代码:

{
  "usingComponents": {},
  "navigationBarBackgroundColor": "#3CB371",
  "navigationBarTitleText": "运动能耗计算"
}

如需查看运动能耗计算的完整源码及运行示例,可在微信小程序、小红书、抖音等平台搜索「蒜鸟编程」获取相关技术内容。平台内提供的示例界面支持直观了解算法实现逻辑,适合学习小程序开发、能耗计算模型的朋友作为参考案例。后续将围绕编程技术持续更新更多实践示例,欢迎开发者针对技术细节进行交流探讨。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2399281.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

iTunes 无法备份 iPhone:10 种解决方法

Apple 设备是移动设备市场上最先进的产品之一&#xff0c;但有些人遇到过 iTunes 因出现错误而无法备份 iPhone 的情况。iTunes 拒绝备份 iPhone 时&#xff0c;可能会令人非常沮丧。不过&#xff0c;幸运的是&#xff0c;我们有 10 种有效的方法可以解决这个问题。您可以按照以…

LangChain4J 使用实践

这里写目录标题 大模型应用场景&#xff1a;创建一个测试示例AIService聊天记忆实现简单实现聊天记录记忆MessageWindowChatMemory实现聊天记忆 隔离聊天记忆聊天记忆持久化 添加AI提示词 大模型应用场景&#xff1a; 创建一个测试示例 导入依赖 <dependency><groupI…

【C++】—— 从零开始封装 Map 与 Set:实现与优化

人生的态度是&#xff0c;抱最大的希望&#xff0c;尽最大的努力&#xff0c;做最坏的打算。 —— 柏拉图 《理想国》 目录 1、理论基石——深度剖析 BSTree、AVLTree 与 RBTree 的概念区别 2、迭代器机制——RBTree 迭代器的架构与工程实现 3、高级容器设计——Map 与 Set…

内网穿透之Linux版客户端安装(神卓互联)

选择Linux系统版本 获取安装包 &#xff1a;https://www.shenzhuohl.com/download.html 这里以Ubuntu 18.04为例&#xff0c;其它版本方法类似 登录Ubuntu操作系统&#xff1a; 打开Ubuntu系统终端&#xff0c;更新版本 apt-get update 安装运行环境&#xff1a; 安装C 运…

开疆智能Profinet转Profibus网关连接CMDF5-8ADe分布式IO配置案例

本案例是客户通过开疆智能研发的Profinet转Profibus网关将PLC的Profinet协议数据转换成IO使用的Profibus协议&#xff0c;操作步骤如下。 配置过程&#xff1a; Profinet一侧设置 1. 打开西门子组态软件进行组态&#xff0c;导入网关在Profinet一侧的GSD文件。 2. 新建项目并…

华为云Flexus+DeepSeek征文|Flexus云服务器单机部署+CCE容器高可用部署快速搭建生产级的生成式AI应用

前引&#xff1a; 在AI技术高速演进的浪潮中&#xff0c;如何快速、高效、安全地搭建一个大模型应用平台&#xff0c;成为开发者和企业关注的焦点。近日&#xff0c;华为云推出的Flexus云服务器配合CCE容器引擎和Dify LLM应用开发平台&#xff0c;带来了极具吸引力的解决方案。…

60天python训练计划----day44

DAY 44 预训练模型 知识点回顾&#xff1a; 预训练的概念常见的分类预训练模型图像预训练模型的发展史预训练的策略预训练代码实战&#xff1a;resnet18 一、预训练的概念 我们之前在训练中发现&#xff0c;准确率最开始随着epoch的增加而增加。随着循环的更新&#xff0c;参数…

【JAVA版】意象CRM客户关系管理系统+uniapp全开源

一.介绍 CRM意象客户关系管理系统&#xff0c;是一个综合性的客户管理平台&#xff0c;旨在帮助企业高效地管理客户信息、商机、合同以及员工业绩。系统通过首页、系统管理、工作流程、审批中心、线索管理、客户管理、商机管理、合同管理、CRM系统、数据统计和系统配置等模块&…

API异常信息如何实时发送到钉钉

#背景 对于一些重要的API&#xff0c;开发人员会非常关注API有没有报错&#xff0c;为了方便开发人员第一时间获取错误信息&#xff0c;我们可以使用插件来将API报错实时发送到钉钉群。 接下来我们就来实操如何实现 #准备工作 #创建钉钉群 如果已有钉钉群&#xff0c;可以跳…

Python爬虫(48)基于Scrapy-Redis与深度强化学习的智能分布式爬虫架构设计与实践

目录 一、背景与行业痛点二、核心技术架构设计2.1 分布式爬虫基础架构2.2 深度强化学习模块 三、生产环境实践案例3.1 电商价格监控系统3.2 学术文献采集系统 四、高级优化技术4.1 联邦学习增强4.2 神经架构搜索&#xff08;NAS&#xff09; 五、总结&#x1f308;Python爬虫相…

(1-6-3)Java 多线程

目录 0.知识拓扑 1. 多线程相关概念 1.1 进程 1.2 线程 1.3 java 中的进程 与 线程概述 1.4 CPU、进程 与 线程的关系 2.多线程的创建方式 2.1 继承Thread类 2.2 实现Runnable接口 2.3 实现Callable接口 2.4 三种创建方式对比 3.线程同步 3.1 线程同步机制概述 …

java31

1.网络编程 三要素&#xff1a; 网址实质上就是ip InetAddress: UDP通信程序&#xff1a; 多个接收端的地址都要加入同一个组播地址&#xff0c;这样发送端发信息&#xff0c;全部接收端都能接受到数据 广播的代码差不多&#xff0c;就是地址不一样而已 TCP通信程序&#xf…

界面组件DevExpress WPF中文教程:Grid - 如何识别行和卡片?

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

【HarmonyOS Next之旅】DevEco Studio使用指南(三十)

目录 1 -> 部署云侧工程 2 -> 通过CloudDev面板获取云开发资源支持 3 -> 通用云开发模板 3.1 -> 适用范围 3.2 -> 效果图 4 -> 总结 1 -> 部署云侧工程 可以选择在云函数和云数据库全部开发完成后&#xff0c;将整个云工程资源统一部署到AGC云端。…

AI基础知识(LLM、prompt、rag、embedding、rerank、mcp、agent、多模态)

AI基础知识&#xff08;LLM、prompt、rag、embedding、rerank、mcp、agent、多模态&#xff09; 1、LLM大语言模型 --基于​​深度学习技术​​&#xff0c;通过​​海量文本数据训练​​而成的超大规模人工智能模型&#xff0c;能够理解、生成和推理自然语言文本 --产品&…

[蓝桥杯]高僧斗法

高僧斗法 题目描述 古时丧葬活动中经常请高僧做法事。仪式结束后&#xff0c;有时会有"高僧斗法"的趣味节目&#xff0c;以舒缓压抑的气氛。 节目大略步骤为&#xff1a;先用粮食&#xff08;一般是稻米&#xff09;在地上"画"出若干级台阶&#xff08;…

pycharm F2 修改文件名 修改快捷键

菜单&#xff1a;File-> Setting&#xff0c; Keymap中搜索 Rename&#xff0c; 其中&#xff0c;有 Refactor-> Rename&#xff0c;右键添加快捷键&#xff0c;F2&#xff0c;删除原有快捷键就可以了。

Python Flask中启用AWS Secrets Manager+AWS Parameter Store配置中心

问题 最近需要改造一个Python的Flask项目。需要在这个项目中添加AWS Secrets Manager作为配置中心&#xff0c;主要是数据库相关配置。 前提 得预先在Amazon RDS里面新建好数据库用户和数据库&#xff0c;以AWS Aurora为例子&#xff0c;建库和建用户语句类似如下&#xff1…

机器学习与深度学习10-支持向量机02

目录 前文回顾6.如何构建SVM7.SVM与多分类问题8.SVM与逻辑回归9.SVM的可扩展性10.SVM的适用性和局限性 前文回顾 上一篇文章链接&#xff1a;地址 6.如何构建SVM 选择合适的核函数和超参数来构建支持向量机&#xff08;SVM&#xff09;模型通常需要一定的经验和实验。以下是…

HikariCP 可观测性最佳实践

HikariCP 介绍 HikariCP 是一个高性能、轻量级的 JDBC 连接池&#xff0c;由 Brett Wooldridge 开发。它以“光”命名&#xff0c;象征快速高效。它支持多种数据库&#xff0c;配置简单&#xff0c;通过字节码优化和智能管理&#xff0c;实现低延迟和高并发处理。它还具备自动…