You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

228 lines
8.7 KiB

1 month ago
import { toast } from '../../utils/extendApi'
import { getStorage, setStorage } from '../../utils/storage'
// 导入ComponentWithStore方法
import { ComponentWithStore } from 'mobx-miniprogram-bindings'
import { userStore } from '../../stores/userstore'
const computedBehavior = require('miniprogram-computed').behavior;
ComponentWithStore({
storeBindings: {
store: userStore,
fields: ['id', 'identify'], // 从Store中获取id和identify存放在页面的data里
actions: []
},
behaviors: [computedBehavior],
//监听函数
watch :{
'status_roll': function(status_roll){
if(status_roll){
//status_roll>0开始动画
this.startScrolling();
}
}
},
data: {
status_lesson:1,
status_sign:0,
status_roll:0,//点名状态初始化为0
status_roll_string:'',//将status_roll转为文本
texts: [], // 存储从后端获取的数组
displayText: '', // 当前显示的文本(滚动时显示随机文本,停止时显示最终结果)
// finalResult: '', // 最终要显示的点名结果
animation: {}, // 动画数据
animationData: {}, // 动画实例
intervalId: null, // 动画定时器ID后面在轮询函数StartPolling函数中设置了另外一个定时器intervalId2
timeoutId: null // 超时ID
},
methods:{
//
onLoad: function () {
this.startPolling();
this.fetchTexts(); // 从后端获取文本数组
// this.startScrolling(); // 开始滚动随机文本
// setStorage('status_sign',0);
// console.log(getStorage('status_sign'));
// this.setData({
// status_sign:getStorage('status_sign')
// })
this.setData({ //初始化本地点名状态
status_roll:0,
LessonName:getStorage('LessonName')
})
},
SignIn(){
console.log(this.data.status_sign)
if( this.data.status_sign === 0){//未签到状态
wx.request({
url: `http://172.20.10.2:8600/student-api/student/studentsignin/${getStorage('id')}/${getStorage('LessonId')}`, // id在onload函数里面getStore获取
success: (res) => {
if (res.data.code === 200) {
this.setData({
status_sign: 1 //置1,,表示已经签完到
})
toast({ title: '签到成功', icon: 'success' });
} else {
console.error('签到失败:', res.data);
toast({ title: '签到失败', icon: 'error' });
}
},
fail(err) {
console.error('请求失败:', err);
}
});
} else {
toast({ title: '无需重复签到!', icon: 'none' });
}
},
SignOut(){
wx.request({
url: `http://172.20.10.2:8600/student-api/student/lessonstatus/${getStorage('LessonId')}`, // id在onload函数里面getStore获取
success: (res) => {
if (res.data.code === 200) {
this.setData({
status_lesson: res.data.data })
} else {
console.error('获取课程状态失败', res.data);
}
},
fail(err) {
console.error('请求失败:', err);
}
});
if(this.data.status_lesson){
toast({title:'未下课不能签退!',icon:'error'})
} else{
if( this.data.status_sign === 1){//已签到状态
wx.request({
url: `http://172.20.10.2:8600/student-api/student/studentsignout/${getStorage('id')}/${getStorage('LessonId')}`, // id在onload函数里面getStore获取
success: (res) => {
if (res.data.code === 200) {
this.setData({
status_sign: 0 //置0,,表示已经签退
})
toast({ title: '签退成功', icon: 'success' });
wx.switchTab({
url: '/pages/home/home',
})
} else {
console.error('签退失败', res.data);
toast({ title: '签退失败', icon: 'error' });
}
},
fail(err) {
console.error('请求失败:', err);
}
});
} else {
toast({ title: '还未签到!', icon: 'none'});
}
}
},
// 从后端获取学号对应的文本数组
fetchTexts: function () {
const self = this;
wx.request({
url: `http://172.20.10.2:8600/student-api/student/getnolist/${getStorage('LessonId')}`, // 替换为实际的后端API地址
method: 'GET',
success: function (res) {
if (res.data && res.data.code === 200 && Array.isArray(res.data.data)) {
self.setData({ texts: res.data.data });
} else {
console.error('从后端获取文本数组失败:', res);
}
},
fail: function (err) {
console.error('函数调用失败:', err);
}
});
},
//轮询
startPolling: function() {
// 设置轮询
this.intervalId2 = setInterval(() => {
wx.request({
url: `http://172.20.10.2:8600/student-api/student/lessonroll/${getStorage('LessonId')}`, //学生根据课程id轮询访问后端点名状态
success: (res) => {//如果成功
if (res.data != null && res.data.code === 200) {//后端响应成功
console.log('后端响应成功',res.data.data)
if(res.data.data !== this.data.status_roll ){
console.log('roll值与本地记录不同,更新为',res.data.data)
this.setData({
status_roll : res.data.data //更新roll值
})
}
} else {
console.error('后端响应出错:', res.data);
toast({ title: '后端响应出错', icon: 'error' });
}
},
fail(err) {
console.error('请求函数调用失败:', err);
}
});
}, 1000); // 每1秒检查一次
},
startScrolling: function () {
const self = this;
const texts = this.data.texts;
if (texts.length === 0) return;
let currentIndex = Math.floor(Math.random() * texts.length); // 随机初始化当前索引
self.setData({ displayText: texts[currentIndex] });
this.data.intervalId = setInterval(function () {
currentIndex = (currentIndex + 1) % texts.length; // 更新索引
self.setData({ displayText: texts[currentIndex] }); // 更新显示的文本
}, 300); // 假设每300ms切换一次文本可以根据需要调整速度
// 设置一个超时,在指定时间后停止滚动
const autoStopTime = 3000; // 例如5秒后停止
this.data.timeoutId = setTimeout(function () {
self.stopScrollingAndShowResult();
}, autoStopTime);
},
//停止滚动
stopScrollingAndShowResult: function () {
clearInterval(this.data.intervalId); // 停止定时器
clearTimeout(this.data.timeoutId); // 清除超时设置,以防多次触发
const texts = this.data.texts;
const finalIndex = this.data.status_roll // 本地的roll值代表被抽中的学号
this.setData({
status_roll_string : this.data.status_roll.toString() ,
// finalResult: texts[finalIndex] // 存储最终结果如果需要后续使用和data{}配合使用
});
this.setData({
displayText: this.data.status_roll_string, // 更新显示文本为最终结果
})
},
//生命周期卸载
onUnload: function () {
this.stopPolling(); // 页面卸载时停止轮询
clearInterval(this.data.intervalId); // 页面卸载时清除定时器
clearTimeout(this.data.timeoutId); // 页面卸载时清除超时设置
},
//停止轮询
stopPolling: function() {
if (this.intervalId2) {
clearInterval(this.intervalId2);
this.intervalId2 = null; // 清除引用
}
}
}
});