const db = wx.cloud.database({ env: 'software-9g3qgled9f6190ea' }) Page({ data: { randomRecord: null ,// 用来存储随机抽取的整个记录 xuenum: 0, add:0, }, // 生命周期函数--监听页面加载 onLoad: function() { this.getRandomRecord(); }, getRandomRecord: function() { const db = wx.cloud.database(); const _ = db.command; let records = []; // 存储所有获取到的记录 const pageSize = 20; // 每页的记录数 let pageOffset = 0; // 当前页的偏移量 const maxRecords = 1000; // 最大获取记录数 // 分页获取记录的函数 const fetchPageOfRecords = (offset, size) => { db.collection('users') 。skip(offset) 。limit(size) 。get({ success: res => { if (res.data.length > 0) { records = records.concat(res.data); // 将新获取的记录添加到records数组中 if (records.length < maxRecords) { pageOffset += pageSize; // 更新偏移量,准备获取下一页 fetchPageOfRecords(pageOffset, pageSize); // 递归调用以获取下一页的记录 } else { // 当获取到足够的记录后,处理records数组 processRecords(); } } else { console.log('没有更多的记录'); processRecords(); // 如果没有更多的记录,处理已有的records数组 } }, fail: err => { console.error('查询失败', err); } }); }; // 处理记录的函数 const processRecords = () => { if (records.length === 0) { console.log('没有找到记录'); return; } // 计算权重并选择记录 const weightedRecords = this.calculateWeights(records); const randomRecord = this.selectRecordByWeight(weightedRecords); const xuenum = randomRecord.num; // 更新数据库中的记录,并添加当前服务器时间戳 db.collection('users').doc(randomRecord._id).update({ data: { timestamp: _.set(db.serverDate()) // 设置当前服务器时间 }, success: updateRes => { console.log('记录更新成功,时间戳添加'); this.ifonlie(); }, fail: updateErr => { console.error('记录更新失败', updateErr); } }); // 更新页面data对象中的randomRecord变量 this.setData({ randomRecord: randomRecord, xuenum: xuenum }); console.log('随机记录:', randomRecord); }; // 开始分页查询 fetchPageOfRecords(pageOffset, pageSize); }, calculateWeights: function(records) { return records.map(record => { // 假设权重是分数的倒数,分数越高,权重越低 const weight = 1 / (record.score || 1); // 防止除以0 return { record, weight }; }); }, selectRecordByWeight: function(weightedRecords) { let cumulativeWeight = 0; weightedRecords.forEach(item => { cumulativeWeight += item.weight; }); if (cumulativeWeight === 0) return null; // 防止除以0 const randomValue = Math.random() * cumulativeWeight; let currentWeight = 0; for (let i = 0; i < weightedRecords.length; i++) { currentWeight += weightedRecords[i].weight; if (currentWeight >= randomValue) { return weightedRecords[i].record; } } return null; // 默认返回null,理论上不应该执行到这里 }, ifonlie:function(){ db.collection('user_ol').where({ num:this.data.xuenum }).get({ success: res => { // 查询成功 this.addcount(); if (res.data.length > 0) { // 如果查询到数据 wx.showToast({ title: '学生在线', icon: 'success', duration: 2000 }); } else { // 如果没有查询到数据 wx.showToast({ title: '学生缺勤', icon: 'none', duration: 2000 }); } }, }) }, addcount: function() { const that = this; // 保存当前上下文 const db = wx.cloud.database(); // 获取数据库引用 const xuenum = this.data.xuenum; // 从data对象中获取xuenum // 查询 user_ol 集合中特定学号的记录 db.collection('user_ol').where({ num: xuenum }).get({ success: function(res) { // 查询成功,处理结果 if (res.data.length > 0) { // 获取记录的 _id 和 count 属性 const recordId = res.data[0]._id; const currentCount = res.data[0].count || 0; // 如果 count 是 0,则更新 users 集合中的 score 并增加 user_ol 集合中的 count let scoreUpdatePromise; if (currentCount >= 0) { // 更新 users 集合中的 score scoreUpdatePromise = db.collection('users').where({ num: xuenum }).update({ data: { score: that.data.randomRecord.score + 1 // 将 score 属性加1 } }); } else { scoreUpdatePromise = Promise.resolve(); // 如果不需要更新 score,使用空的 Promise } scoreUpdatePromise.then(() => { // 更新 user_ol 集合中的 count return db.collection('user_ol').doc(recordId).update({ data: { count: currentCount + 1 // 将 count 属性加1 } }); }).then(updateRes => { // 更新成功 console.log('更新成功', updateRes); }).catch(updateErr => { // 更新失败 console.error('更新失败', updateErr); }); } } }); }, gotoindex5() { wx.navigateTo({ url: '/pages/index5/index5' // 确保路径正确 }) }, inputChange: function(e) { this.setData({ add: e.detail.value }); }, queryUser: function() { const that = this; // 保存当前上下文 const db = wx.cloud.database(); // 获取数据库引用 const xuenum = this.data.xuenum; // 从data对象中获取xuenum const add = this.data.add; // 查询特定学号的记录 db.collection('user_ol').where({ num: xuenum }).get({ success: function(res) { // 查询成功,处理结果 if (res.data.length > 0) { // 获取记录的 count 属性,如果没有则默认为 0 const count = res.data[0].count || 0; const temp = that.data.randomRecord.score; // 计算新的 score 值 const newScore = parseFloat(add) * (0.9+ 0.1* count ) + temp; console.log('成绩',newScore); // 更新记录的 score db.collection('users').where({ num: xuenum }).update({ data: { score: newScore }, success: function(updateRes) { // 更新成功 console.log('更新成功', updateRes); wx.showToast({ title: '分数更新成功', icon: 'success', duration: 2000 }); }, fail: function(updateErr) { // 更新失败 console.error('更新失败', updateErr); wx.showToast({ title: '更新失败,请重试', icon: 'none', duration: 2000 }); } }); } else { // 如果没有查询到数据 wx.showToast({ title: '未找到对应的记录', icon: 'none', duration: 2000 }); } }, fail: function(err) { // 查询失败 console.error('查询失败', err); wx.showToast({ title: '查询失败,请重试', icon: 'none', duration: 2000 }); } }); }, decreaseScore: function() { const that = this; const db = wx.cloud.database(); const xuenum = this.data.xuenum; // 从data对象中获取xuenum if (xuenum === 0) { wx.showToast({ title: '学号未设置', icon: 'none', duration: 2000 }); return; } // 查询 user_ol 集合中特定学号的记录 db.collection('users').where({ num: xuenum }).get({ success: function(res) { if (res.data.length > 0) { const record = res.data[0]; if (record.score > 0) { // 确保 score 大于 0 才进行减操作 // 更新 users 集合中的 score db.collection('users').doc(record._id).update({ data: { score: db.command.inc(-1) // 将 score 属性减1 }, success: function(updateRes) { // 更新成功 console.log('分数减少成功', updateRes); wx.showToast({ title: '分数减少1', icon: 'success', duration: 2000 }); }, fail: function(updateErr) { // 更新失败 console.error('分数减少失败', updateErr); wx.showToast({ title: '分数减少失败,请重试', icon: 'none', duration: 2000 }); } }); } else { wx.showToast({ title: '分数不能为负', icon: 'none', duration: 2000 }); } } else { wx.showToast({ title: '未找到对应的记录', icon: 'none', duration: 2000 }); } }, fail: function(err) { console.error('查询失败', err); wx.showToast({ title: '查询失败,请重试', icon: 'none', duration: 2000 }); } }); }, addScore: function() { const that = this; const db = wx.cloud.database(); const xuenum = this.data.xuenum; // 从data对象中获取xuenum if (xuenum === 0) { wx.showToast({ title: '学号未设置', icon: 'none', duration: 2000 }); return; } // 查询 user_ol 集合中特定学号的记录 db.collection('users').where({ num: xuenum }).get({ success: function(res) { if (res.data.length > 0) { const record = res.data[0]; if (record.score > 0) { // 确保 score 大于 0 才进行减操作 // 更新 users 集合中的 score db.collection('users').doc(record._id).update({ data: { score: db.command.inc(0.5) // 将 score 属性减1 }, success: function(updateRes) { // 更新成功 console.log('分数减少成功', updateRes); wx.showToast({ title: '分数增加0.5', icon: 'success', duration: 2000 }); }, fail: function(updateErr) { // 更新失败 console.error('分数减少失败', updateErr); wx.showToast({ title: '分数减少失败,请重试', icon: 'none', duration: 2000 }); } }); } else { wx.showToast({ title: '分数不能为负', icon: 'none', duration: 2000 }); } } else { wx.showToast({ title: '未找到对应的记录', icon: 'none', duration: 2000 }); } }, fail: function(err) { console.error('查询失败', err); wx.showToast({ title: '查询失败,请重试', icon: 'none', duration: 2000 }); } }); } });