简介

是一款可以计算汽车油耗的小程序。根据加油量、所加油量跑的公里数、当时的油价。即可以计算出汽车的百公里油耗、每公里花费多少钱等数据。并且可以将每次数据永久记录下来,然后可以将多次的数据进行横向的对比,从而直观的看出油耗等数据随时间的变化。
该小程序目前已经上线。扫码即可体验,二维码在后面。

需求来源

前段时间买了人生第一辆车(嘎嘎),作为一个新车车主,想知道这个车的真实油耗是多少,和工信部的油耗差别有多大。每次去加油的时候掏出计时器来计算又很麻烦,自己又是做开发的,就想着是否可以用程序来计算。于是有了这一款小程序。

主要逻辑

从上图可以看出;如果只是计算油耗的话可以直接用上面第一个公式就可以计算出百公里油耗了。但是如果你想计算出每公里花费多少钱;就一定要知道油价了。所以采用的是第二种计算方法。
因此需要用户输入的是:加油总费用,油价,以及公里数三个值。得到的有:百公里油耗,每公里耗费的油钱。
记录的数据有:当前记录时间,当前油价,加油总费用,公里数,百公里油耗,每公里耗费的油钱。

代码实现

前端代码实现

计算页面

需要用户输入的几个值

<view class="input-view-item"><input class="input" type="digit" v-model="unitPrice" placeholder="请输入油价(元/升)"/>
</view>
<view class="input-view-item"><input class="input" type="digit" v-model="totalPrice" placeholder="加油的总价格(元)"/>
</view>
<view class="input-view-item"><input class="input" type="digit" v-model="km" placeholder="行驶里程数(公里)"/>
</view>
<view class="button-view-box"><button class="left" type="primary" @click="compute()">计算</button><!--  #ifdef  MP-WEIXIN --><button class="right" @click="addToHistory">记录</button><!--  #endif -->
</view>

计算函数

compute (addToHistory) {let msgArr = []if(isNaN(Number(this.unitPrice)) || !this.unitPrice) {this.unitPrice = ''msgArr.push('油价')}if(isNaN(Number(this.totalPrice)) || !this.totalPrice) {this.totalPrice = ''msgArr.push('总价格')}if(isNaN(Number(this.km)) || !this.km) {this.km = ''msgArr.push('里程数')}if(msgArr.length) {uni.showToast({title: `请输入${msgArr.join(',')}`,icon: 'none',});return}// 单价let unitPrice = Number(this.unitPrice)// 总价let totalPrice = Number(this.totalPrice)// 公里数let km = Number(this.km)// 没公里花费的钱let money1km = (totalPrice / km).toFixed(2)// 百公里油耗let oil100 = (this.totalPrice / this.unitPrice / km * 100).toFixed(2)// 是否重复点击let isSame = this.money1km === money1km && this.oil100 === oil100this.money1km = money1kmthis.oil100 = oil100// 是否点击的记录按钮if(addToHistory) {isSame = `${this.money1km}${this.oil100}` === this.oldDataif (isSame) {uni.showToast({title: '相同数据;无需重复记录。',icon: 'none'})return}if (this.loading) {return}this.loading = true// 调用微信的云函数wx.cloud.callFunction({name: 'addDataToCould',data: {dbName: 'userOilCompute',list: [{unitPrice,totalPrice,km,oil100: this.oil100,money1km: this.money1km}]}}).then(res => {this.loading = falsethis.oldData = `${this.money1km}${this.oil100}`uni.showModal({title: '提示',content: `记录成功,可到历史油耗中查看`,showCancel: false,success: async (res3) => {if (res3.confirm) {} else if (res3.cancel) {}}});})}
}

历史记录页面

view代码

<view class="history-box" v-if="historyList && historyList.length"><view class="chart-box"><view class="chart-title">百公里油耗变化折线图</view><canvas :style="canvasStyle" canvas-id="canvasLineA" id="canvasLineA" class="charts" @touchstart="touchLineA"></canvas></view><view class="history-list"><view class="item" v-for="(item, index) in historyList" :key="index" @click="deleteItem(item)"><view class="time"><view class="cell">{{showTime(item.createTime)}}</view><view class="cell"><view class="label">油价</view><view class="value">{{item.unitPrice}}</view></view><view class="cell"><view class="label">加油费用</view><view class="value">{{item.totalPrice}}</view></view></view><view class="content"><view class="cell"><view class="label">公里数</view><view class="value">{{item.km}}</view></view><view class="cell"><view class="label">百公里油耗</view><view class="value">{{item.oil100}}升</view></view><view class="cell"><view class="label">每公里耗费</view><view class="value">{{item.money1km}}元</view></view></view></view></view>
</view>
<view v-else class="common-no-data-box"><NoData :text="loading?'加载中...':'暂无数据'"></NoData>
</view>

js代码

获取历史油耗

// 获取历史油耗
async getOilHistory () {this.loading = truelet res = await wx.cloud.callFunction({name: 'getDbListData',data: {dbName: 'userOilCompute',pageNo: 1,pageSize: 50,limitType: 1,orderName: 'createTime',orderType: 'desc',params: {}}})this.loading = falseif (res.errMsg === 'cloud.callFunction:ok') {this.historyList = res.result.datathis.showLine()}
},

转换数据结构

// 将历史数据historyList转换为uCharts所需要的数据结构
showLine () {const canvasId = 'canvasLineA'let chartData = {categories: [],series: [{name: '油耗',data: [],color: '#4cd964',style: 'curve'}]}for (let i = this.historyList.length - 1; i >= 0; i--) {let item = this.historyList[i]chartData.categories.push(this.showTime(item.createTime))chartData.series[0].data.push(item.oil100)}canvaLineA = new uCharts({$this: _self,canvasId: canvasId,type: 'line',fontSize: 10,legend: {show: true},dataLabel: false,dataPointShape: false,background: '#FFFFFF',pixelRatio: _self.pixelRatio,categories: chartData.categories,series: chartData.series,animation: true,enableScroll: false,xAxis: {type: 'grid',gridColor: 'transparent',gridType: 'dash',dashLength: 1,fontColor: '#ffffff',rotateLabel: true,labelCount: 10},yAxis: {gridType: 'line',gridColor: '#242424',splitNumber: 5,// min:10,// max:180,data: [{fontColor: '#ffffff',format: (val) => {return val + '升'}}]},width: _self.cWidth * _self.pixelRatio,height: _self.cHeight * _self.pixelRatio,legend: {fontColor: '#ffffff',show: false},extra: {line: {type: 'straight'}}})},

删除数据

// 删除
deleteItem (item) {uni.showModal({title: '提示',content: `确认删除该条记录吗?`,showCancel: true,success: async (res3) => {if (res3.confirm) {let res = await wx.cloud.callFunction({name: 'delDataFromCould',data: {dbName: 'userOilCompute',primaryKey: '_id',list: [item]}})if (res.errMsg === 'cloud.callFunction:ok') {uni.showToast({title: `删除成功!`,icon: 'none'})}this.getOilHistory()} else if (res3.cancel) {}}})
},

后端代码实现

后端主要做的是将前端需要记录的几个数值,进行增删查的操作。

添加数据的云函数(addDataToCould)

// 云函数入口函数
exports.main = async (event, context) => {const wxContext = cloud.getWXContext()let addCount = 0// 数据库名称 数据库唯一标识(用于添加时判断是否存在) 要插入的数据Listlet {dbName, primaryKey, list} = event;if (list &&list.length) {for(let i = 0;i<list.length;i++) {// 查询该条记录是否存在let item = list[i];item.openId = item.openId || wxContext.OPENIDitem.createTime = new Date()let countResif (primaryKey) { // 如果传来primaryKey;则先判断是否存在;不存在才添加countRes = await db.collection(dbName).where({[primaryKey]: item[primaryKey]}).count();} else { // 直接判定不存在countRes = {total: 0}}if(countRes.total === 0) {// 不存在则添加await db.collection(dbName).add({// data 字段表示需新增的 JSON 数据data: {...item,}})addCount ++}}}return {status: 0,data: {addCount},message: '成功'}
}

注意的是,上面的openId是wx给的,以此可用来标识某条数据是哪一个用户产生

查询数据的云函数(getDbListData)

// 云函数入口函数
exports.main = async (event, context) => {const wxContext = cloud.getWXContext()try{let {params = {},orderName,orderType = 'desc',pageNo, pageSize,dbName} = event;let totalData = await db.collection(dbName).where({...params}).count();let listData = await (async ()=>{let data;let dbObj = await db.collection(dbName).where({...params})if(orderName) { // 如果需要排序 asc 或 descdbObj = await dbObj.orderBy(orderName,orderType)}dbObj = await dbObj.skip((pageNo - 1) * pageSize) // 跳过结果集中的前 10 条,从第 11 条开始返回.limit(pageSize) // 限制返回数量为 10 条.get();data = dbObjreturn data;})()return {totalCount:totalData.total,status: 0,message: '成功',data: listData.data}}catch (e) {return {status: 1,message: '失败',data: e}}
}

删除数据的云函数(delDataFromCould)

// 云函数入口函数
exports.main = async (event, context) => {const wxContext = cloud.getWXContext()let delRes = []// 数据库名称 数据库唯一标识(用于删除时判断是否存在) let {dbName, primaryKey, list} = event;if (list &&list.length) {for(let i = 0;i<list.length;i++) {// 查询该条记录是否存在let item = list[i];let res = await db.collection(dbName).where({[primaryKey]: item[primaryKey]}).remove();delRes.push(res)}}return {status: 0,data: delRes,message: '成功'}
}

数据库(userOilCompute

数据库的话其实只用了一个表userOilCompute 如下图

以上,即该小程序的主要核心代码,其实挺简单的一个小程序

下面是体验码

uniapp + 微信小程序 + 云开发。实现一个可以计算汽车油耗的工具类微信小程序相关推荐

  1. 微信小程序|基于小程序+云开发制作一个菜谱小程序

    今天吃什么?这是一个让强迫症左右为难的问题,跟随此文基于小程序+云开发制作一个菜谱小程序,根据现有食材一键生成菜谱,省心又省力. 一.小程序 1. 创建小程序

  2. 用小程序云开发写一个多人记账小程序

    应女朋友要求,用小程序云开发写一个记账小程序,适合情人记账.家庭记账.团队记账.多人记账的小程序 先上成品图吧 主页: 记账页: 详情页: 个人中心页: 统计页: 其余的页面就不一一展示了,使用到的主 ...

  3. 微信小程序云开发实现一个社区 Demo(补充)

    之前写了一篇文章介绍如何使用云开发来实现一个社区 Demo: 微信小程序~云开发的实现的一个社区 Demo(完结~) 得到很多小伙伴的认可但也出现了一些问题. 主要问题有: 发布的图片不显示,跨端发布 ...

  4. 微信小程序云开发用户身份登录_你必须要掌握的微信小程序云开发

    微信小程序开发已经成为目前最火爆的技能之一,无论是在求职.毕设.兴趣培养等方面都已经成为一项必备技能,而小程序云开发技术的出现更是点燃了整个小程序生态圈. 在2019微信公开课PRO小程序分论坛上,腾 ...

  5. 基于小程序+云开发制作一个文件传输助手小程序

    微信文件传输助手是真人?基于云开发制作一个文件传输助手小程序,你发给ta的小秘密,只有你自己知道. 开发步骤 一.创建小程序 二.云开发配置 环境配置 绑定云环境 三.页面设计 首页 详情页 底部弹窗 ...

  6. 如何使用小程序云开发实现一个简单的留言板

    简介 本教程将教您如何使用小程序云开发快速构建一个留言板应用程序.您将学习到如何使用云数据库.云函数和云存储等功能,以及如何将它们集成到您的小程序中. 小程序开发教程:微信小程序入门与实战 常用组件A ...

  7. 小程序云开发搜索功能的实现正则_几行代码实现小程序云开发提现功能

    先看效果: 纯云开发实现,下面说使用步骤:一:开通商户的企业付款到领取功能说明地址: https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php? ...

  8. 小程序云开发搜索功能的实现正则_码code | 如何借助小程序云开发实现小程序支付功能...

    转载来源:编程小石头 我们在做小程序支付相关的开发时,总会遇到这些难题.小程序调用微信支付时,必须要有自己的服务器,有自己的备案域名,有自己的后台开发.这就导致我们做小程序支付时的成本很大. 本节就来 ...

  9. 微信小程序绑定云服务器文档,微信小程序云开发搭建一个管理小程序.pdf

    微微信信小小程程序序云云开开发发 搭搭建建一一个个管管理理小小程程序序 概概述述 : 开发者可以使用云开发开发微信小程序.小游戏,无需搭建服务器,即可使用云 能力. 云开发为开发者提供完整的云 支持, ...

最新文章

  1. java接收xml数据_关于java后台如何接收xml格式的数据
  2. 遍历文件夹_使用JavaScript遍历本地文件夹的文件
  3. HDOJ 4699-Editor[栈]
  4. SpringBoot调用RESTful Web服务
  5. 数据库---三大设计范式
  6. oracle 9i linux内核,在Linux下安装Oracle9i_oracle
  7. drool-6.5的自学demo
  8. archlinux i3wm通知管理
  9. vue组件库,插件大全
  10. 【COS】函数使用技巧
  11. 才刚满30岁,就中年危机了...
  12. 深入理解JVM一之解析class文件
  13. php监听网卡数据,VnStat PHP:用于监控网络带宽使用的基于Web的界面
  14. hyper-v虚拟机常用命令
  15. DapperPoco -- 基于Dapper的、轻量级的、高性能的、简单的、灵活的ORM框架
  16. 石头扫地机器人卡顿_石头扫地机器人T7系列APP有这些小技巧
  17. AndroidMaterialDesign动画之Curved Motion
  18. 编码中的“乾坤大挪移”——调制技术
  19. read(),readline(),readlines()的区别
  20. 交流电压测量 测量电路

热门文章

  1. 美剧字幕组翻译谈如何提高英语听力口语
  2. dism失败 ox800f0818_win10 Dism错误 0x800f0950 - Microsoft Community
  3. STP(生成树协议)
  4. 搭建FTP服务器出现的“FTP文件夹错误”解决方法
  5. 不较真的生活跟咸鱼有什么区别
  6. 思维导图 基础篇(14)应用-阅读书籍
  7. 第9节 NTFS安全权限—给文件/文件夹设权限
  8. vue接入微前端无界框架总结
  9. 基于队列和哈希的种子填充算法
  10. 模拟Vue响应式原理