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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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; // 清除引用
}
}
}
});