1.实现消费记录报告部分
期望获得
//消费数据,数据库获取
Totalcost: “10000”,//总支出,数据库获取
cafeprice:“100”,//食堂花费,数据库获取
cafeovflow: “超过”,//取值为 超过或者低于,从数据库获取。
cafepercente:“90”,//取值为百分比,数据库获取
遇到的第一个问题就是,之前传入的参数是按照字符串形式传入的,调用sum接口他直接忽略所有不为数字类型的值,返回参数为0
这里也找了很久的官方文档,试图找到可以把整个数据库数据类型调整的借口,或者能根据查询到的值利用praserFloat
进行转化,
想查看monogdb的相关文档进行处理,但是微信的接口不大一样,参考有的文章又说使用match
和project
,然后结合foreach
,但还是不行,只能使用笨办法,直接重新导入整个数据库,又浪费几个小时,头大。
正式开始,之前的试探monogdb的过程中,理清了projec
t和 match
这里也利用这两个模块进行筛选数据,同时,对于group
,_id
设置的是你想要聚类的分组,没有则设置为null
,这里统计全部时设置为_id : null
,对每个同学进行计算,设置为_id : '$uid'
,后面利用sum
进行累加统计。
同时会遇到小程序云函数中用group分组查询,只能查询20条的问题。
这里参考链接调整limit开放group分组查询只有20条的问题
使用group 获得全部用户数量,相除得到百分比
1.1 云函数端
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database()
const _ = db.command
// 云函数入口函数
exports.main = async (event, context) => {
const $ = db.command.aggregate
//指定学期,指定学号消费总额
const total_consumption = await db.collection('consumption').aggregate().match({
uid:event.uid,
学期 : event.学期
}).group({
_id : null,
totalprice : $.sum('$account')
}).end()
//指定学期,指定学号食堂消费总额
const restaurant_consumption = await db.collection('consumption').aggregate().match({
uid:event.uid,
学期 : event.学期,
title : "食堂"
}).group({
_id : null,
totalprice : $.sum('$account')
}).end()
const total1 = total_consumption.list[0].totalprice
console.log(total1)
const total2 = restaurant_consumption.list[0].totalprice
//查询小于或等于该同学食堂消费总额的人数
const smallerNum = await db.collection('consumption').aggregate().match({
学期 : event.学期,
title : "食堂"
}).limit(1000000).group({
_id : '$uid',
totalprice: $.sum('$account')
}).match({
totalprice:_.lte(total2)
}).count('超过的同学数目').end()
const total3 = smallerNum.list[0].超过的同学数目
var tasks = {'total1':total1,'total2':total2,'smaller':total3}
return tasks
}
在云函数端加入函数,将浮点数转化为百分数字符串,由于前端界面已设置%,这里加上注释
/*小数转百分数*/
/*Number()数据类型转换,指定截取转换后的小数点后几位(四舍五入)*/
function toPercent(point){
var str=Number(point*100).toFixed(2);
// str+="%";
return str;
}
1.2结果:
1.3
对接所有云函数时,之前查询集合都写在云函数内部,现在需要全体更改test->uid
1.4 封装一个函数用于合并json对象
放在app.js文件中
extend:function(data,dataExtend){
var res={};
for (var key in data) {
res[key] = data[key];
}
for (var key in dataExtend) {
res[key] = dataExtend[key];
}
return res;
},
小程序端调用获得图书记录
callFunction3:function(){
console.log("Button is clicked")
var that = this
//这里默认学期2,学号97
wx.cloud.callFunction({
name:"score",
data:{
uid : '1',
学期:'2'
},
complete: res => {
console.log('callFunction test result: ', res)
// var data = this.extend(res.result,{token: this.data.cardInfo});
var data = this.extend(res.result,this.data.cardInfo);
console.log('data',data)
that.setData({
cardInfo:data
})
console.log('cardInfor',this.data.cardInfo)
}
})
}
1.5 一时兴起,对接了消费记录部分
#onshow()函数内添加,基本和前面的代码区别不大,修改uid即可
var uid = wx.getStorageSync('uid');
wx.cloud.callFunction({
name:"consumption",
data:{
uid : uid
},
complete: res => {
console.log('callFunction test result: ', res)
that.setData({
// title:res.result.data[0]['title']
items:res.result.data
})
console.log('title',this.data.items)
}
})
#onLoad()下
//对接数据
var uid = wx.getStorageSync('uid');
var that = this
//这里默认学期2
wx.cloud.callFunction({
name:"score",
data:{
uid : uid,
学期:'2'
},
complete: res => {
console.log('callFunction test result: ', res)
// var data = this.extend(res.result,{token: this.data.cardInfo});
var data = this.extend(res.result,this.data.cardInfo);
console.log('data',data)
that.setData({
cardInfo:data
})
console.log('cardInfor',this.data.cardInfo)
}
})
效果如下:
写到凌晨4点可还行