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