Files
HuajisheTools/HuajisheCheckChaoXing/pages/home/home.js
2025-10-01 10:01:52 +08:00

275 lines
7.6 KiB
JavaScript

import config from '@utils/config';
import util from '@utils/util';
import API from '@utils/api';
import log from '@utils/log';
let api = null;
Page({
data: {
tab: 'login', // login / courses / activities / signin
typeDefine: ["拍照签到", "普通签到", "二维码签到", "手势签到", "位置签到", "签到码签到"],
swiperList: (config.swiperList || [
"/swiper/1.png",
"/swiper/2.png",
"/swiper/3.png",
"/swiper/4.png",
]).map(item => `https://testingcf.jsdelivr.net/gh/${config.repository}@main/resource${item}`),
repository: config.repository,
},
onLoad(options) {
this.setData({
'username': util.getStorage('username'),
'password': util.getStorage('password'),
}, () => {
this.setData(Object.assign(this.data, options))
})
},
onUnload() {
util.setStorage('username', this.data.username);
util.setStorage('password', this.data.password);
},
input(e) { // 输入绑定
this.setData({
[e.currentTarget.dataset.input]: e.detail.value.trim(),
})
},
login() { // 账号登录
const username = this.data.username;
const password = this.data.password;
if (!username || !password) {
util.showInfo("帐号或密码不能为空!")
return;
}
api = new API(username, password);
api.login()
.then(res => {
util.showInfo(res.mes);
if (res.status) {
api.getUserInfo()
.then(userinfo => {
util.showInfo("登录成功")
this.setData({
'userinfo': userinfo,
'tab': 'courses',
})
this.options.username = username;
this.options.password = password;
this.onUnload(); // 缓存
this.get_courses(); // 获取课程
})
}
})
.catch(e => {
util.showInfo("网络不稳定 请稍后再试");
log.error("登录失败", e)
})
},
get_courses() { // 获取课程列表
api.getCourse()
.then(courses => {
this.setData({
'courses': courses,
})
util.showInfo("获取课程成功")
})
.catch(e => {
util.showInfo("获取课程失败,请重试")
log.error("获取课程失败", e)
})
},
get_activities(e) { // 获取签到列表
const item = e.currentTarget.dataset.item;
api.getActivity(item.courseId, item.classId)
.then(activities => {
this.setData({
'activities': activities.slice(0, 20),
'tab': 'activities',
})
util.showInfo("获取活动成功");
})
.catch(e => {
util.showInfo("获取活动失败,请重试")
log.error("获取活动失败", e)
})
},
async to_signin(e) { // 进入签到页
const item = e.currentTarget.dataset.item;
this.getUserLocation()
api = new API(this.data.username, this.data.password);
api.beforeSign(item.activeId, item.courseId, item.classId);
this.data.hasValidate = await api.hasValidate(item.activeId); // 是否有滑块验证码
this.data.token = ([0, 1].includes(item.type)) ? await api.getToken() : ''; // 超星云盘token
api.getActivityInfo(item.activeId) // 获取签到活动信息
.then(info => this.setData({
'info': Object.assign(info, item),
'info.type': info.otherId || (1 - info.ifphoto), // 是否为拍照签到
'tab': 'signin',
}))
},
getUserLocation() { // 获取用户位置
wx.getLocation({
'type': 'gcj02',
})
.then(gcj02 => {
log.info("获取用户位置", gcj02)
API.allToBaidu(gcj02.longitude, gcj02.latitude)
.then(bd09ll => this.setData({
'location.longitude': bd09ll.x,
'location.latitude': bd09ll.y,
}))
API.getAddressText(gcj02.longitude, gcj02.latitude)
.then(text => this.setData({
'location.name': text,
}))
})
.catch(e => {
util.showInfo("用户拒绝定位")
log.debug("用户拒绝定位", e)
})
},
chooseLocation() { // 选择位置
wx.chooseLocation(this.data.location) // 国测局坐标系 gcj02
.then(gcj02 => {
log.info("用户选择位置", gcj02)
API.allToBaidu(gcj02.longitude, gcj02.latitude)
.then(bd09ll => this.setData({
'location.latitude': bd09ll.y,
'location.longitude': bd09ll.x,
'location.name': gcj02.name || gcj02.address,
}))
})
.catch(e => {
util.showInfo("取消位置选择")
log.debug("取消位置选择", e)
})
},
async signin(e) { // 提交签到
const objectId = (this.data.srcList || []).length ? this.data.srcList[0] : "";
const location = this.data.location;
const info = this.data.info;
const userinfo = this.data.userinfo;
let res = "";
if (this.data.hasValidate)
this.data.validate = ""; // 课后作业:此处请自行实现 GET请求 https://cx.micono.eu.org/api/validate
if (info.type == 0 || info.type == 1) { // 图片/普通
if (objectId == 0 && info.type == 0) {
const ok = await wx.showModal({
title: '确认直接签到吗?',
content: '你还没有上传图片',
})
if (ok.confirm != true)
return;
}
res = await api.defaultSign(info.activeId, objectId, null, null, null, null, null, null, userinfo.name, this.data.validate);
}
if (info.type == 3 || info.type == 5) { // 签到码/手势
res = await api.defaultSign(info.activeId, null, null, null, null, this.data.signCode, null, null, userinfo.name, this.data.validate);
}
if (info.type == 4) { // 位置
res = await api.defaultSign(info.activeId, null, location.longitude, location.latitude, location.name, null, null, null, userinfo.name, this.data.validate);
}
if (info.type == 2) { // 二维码
const qrcode = await wx.scanCode();
log.debug("扫码结果", qrcode)
let params = {};
qrcode.result.split('?')[1].split('&').forEach(param => {
const parts = param.split('=');
const key = decodeURIComponent(parts[0]);
const value = decodeURIComponent(parts[1]);
params[key] = value;
});
const enc = params.enc;
res = await this.data.api.defaultSign(info.activeId, null, location.longitude, location.latitude, location.name, null, null, enc, userinfo.name, this.data.validate);
}
const msg = API.getResult(res);
util.showInfo(msg, 'none', true);
this.setData({
'result': msg,
})
},
handleAdd(e) { // 上传图片
const files = e.detail.files;
const token = this.data.token;
const fileList = this.data.fileList || [];
files.forEach(file => {
this.setData({
'fileList': [...fileList, {
...file,
'status': 'loading'
}],
'srcList': this.data.srcList || [],
});
const length = fileList.length;
const task = wx.uploadFile({
url: `https://pan-yz.chaoxing.com/upload?_token=${token}`,
filePath: file.url,
name: 'file',
formData: {
'puid': this.data.userinfo.uid
},
success: res => {
const data = JSON.parse(res.data);
if (data.result) {
log.debug("图片上传结果", data)
util.showInfo("图片上传成功")
this.setData({
[`fileList[${length}].status`]: 'done',
[`srcList[${length}]`]: data.objectId,
});
} else {
util.showInfo(data.msg)
this.handleRemove()
}
},
});
task.onProgressUpdate((res) => {
this.setData({
[`fileList[${length}].percent`]: Math.floor(res.progress * 0.99),
});
});
})
},
handleRemove(e) { // 删除图片
const index = e?.detail?.index || this.data.fileList.length - 1;
this.data.fileList.splice(index, 1);
this.data.srcList.splice(index, 1);
this.setData({
'fileList': this.data.fileList,
'srcList': this.data.srcList,
});
},
back() { // 返回
const tabs = ["login", "courses", "activities", "signin"];
this.setData({
'tab': tabs[(tabs.indexOf(this.data.tab) || 1) - 1],
})
},
onShareAppMessage() { // 分享
return {
'title': '学习通签到助手',
'imageUrl': '/static/image/share.png',
}
}
})