新增搜索课程和加载组件页面,签到页面添加遮罩防重复扫码,添加 request 便捷方法(get/post/put/delete)

This commit is contained in:
future
2026-06-05 21:26:26 +08:00
committed by liwentao
parent c9aabf23f0
commit ec89d1459a
15 changed files with 2469 additions and 125 deletions
+63 -32
View File
@@ -104,7 +104,7 @@ import { onLoad, onUnload } from '@dcloudio/uni-app'
// 引入状态组件(路径与你保持一致)
import QrStatus from '@/components/QRCode/StatusCard.vue'
// 引入API封装
import { getQRCode, checkIn as apiCheckIn } from '@/request_api/main.js'
import { getQRCode, checkIn as apiCheckIn } from '@/api/main.js'
let image = ref("")
let width = ref(0)
@@ -115,6 +115,7 @@ import { getQRCode, checkIn as apiCheckIn } from '@/request_api/main.js'
const QRStatus = ref("生成中...")
const STQRC = ref(false)//是否扫码
const isCheckIn = ref(false)
const webSoketURL = "ws://localhost:8084/webSocket/checkIn"
const qrcode = ref("")
@@ -209,22 +210,31 @@ import { getQRCode, checkIn as apiCheckIn } from '@/request_api/main.js'
}
/**
* 清除所有QR_开头的缓存(用于测试阶段)
* 清除所有与签到相关的缓存(用于测试阶段)
*/
const clearQRCache = () => {
try {
const keys = uni.getStorageInfoSync().keys || []
let clearedCount = 0
for (const key of keys) {
// 清除 QR_ 开头的缓存(页面内部缓存)
if (key.startsWith(CACHE_PREFIX)) {
uni.removeStorageSync(key)
clearedCount++
}
// 清除 API_CACHE_ 开头的缓存(通过 utils/cache.js 缓存的接口数据)
if (key.startsWith('API_CACHE_')) {
// 只清除与签到相关的 API 缓存
if (key.includes('checkIn') || key.includes('qrcode')) {
uni.removeStorageSync(key)
clearedCount++
}
}
}
console.log(`已清除 ${clearedCount}QR_开头的缓存`)
console.log(`已清除 ${clearedCount}签到相关缓存`)
return clearedCount
} catch (e) {
console.error('清除QR缓存失败:', e)
console.error('清除 QR 缓存失败:', e)
return 0
}
}
@@ -256,10 +266,8 @@ import { getQRCode, checkIn as apiCheckIn } from '@/request_api/main.js'
duration: 2000
})
// 重请求二维码
setTimeout(() => {
getStorage(null)
}, 500)
// 重置页面状态后不再自动请求二维码
uni.hideLoading()
}
}
})
@@ -319,7 +327,7 @@ import { getQRCode, checkIn as apiCheckIn } from '@/request_api/main.js'
errorText.value = '' // 重置错误文本
image.value = ""
getQRCode(true).then(res => {
getQRCode({ cache: true, cacheTime: 5 * 60 * 1000 }).then(res => {
console.log(res)
// 保存到本地缓存(用于签到状态判断)
setCacheData("QRInfo", res)
@@ -403,7 +411,7 @@ import { getQRCode, checkIn as apiCheckIn } from '@/request_api/main.js'
// 手动签到接口
const checkIn = (qrContent) => {
console.log(qrContent)
apiCheckIn(qrContent).then(res => {
apiCheckIn({ qrContent }).then(res => {
closeWebSocket()
console.log(res)
status.value = 'scanned'
@@ -422,17 +430,20 @@ import { getQRCode, checkIn as apiCheckIn } from '@/request_api/main.js'
console.error('签到请求失败:', err)
status.value = 'error'
errorText.value = err.message || '签到失败,请重试' // 对应错误文案
uni.showToast({
title: err.message,
icon: 'none'
})
})
}
// 建立WebSocket连接
const connectWebSocket = (qrContent) => {
const wsUrl = `ws://192.168.43.89:8084/webSocket/checkIn`
console.log('WebSocket 连接地址:', wsUrl)
console.log('WebSocket 连接地址:', webSoketURL)
socketTask = uni.connectSocket({
url: wsUrl,
url: webSoketURL,
success: () => {
console.log('WebSocket 连接中...')
},
@@ -477,17 +488,27 @@ import { getQRCode, checkIn as apiCheckIn } from '@/request_api/main.js'
socketTask.onMessage((res) => {
console.log('收到 WebSocket 消息:', res.data)
const message = res.data
if (message === '正在进行签到') {
// 显示遮罩,防止用户重复扫码
QRStatus.value = "正在进行签到..."
STQRC.value = true
// status.value = 'scanned'
// errorText.value = '' // 成功重置错误文本
// uni.showToast({
// title: '签到成功!',
// icon: 'success',
// duration: 2000
// })
} else if (message === '签到成功' || message.includes('签到成功')) {
// 签到成功,更新状态
status.value = 'scanned'
errorText.value = ''
isCheckIn.value = true
QRStatus.value = "签到成功"
// 缓存签到状态
setCacheData("isCheckIn", true)
setCacheData("checkInTime", "签到成功")
uni.showToast({
title: '签到成功!',
icon: 'success',
duration: 2000
})
// 关闭WebSocket连接
closeWebSocket()
} else if (message.startsWith('二维码无效')) {
uni.showToast({
title: message,
@@ -495,18 +516,32 @@ import { getQRCode, checkIn as apiCheckIn } from '@/request_api/main.js'
duration: 2000
})
status.value = 'error'
errorText.value = '二维码无效,请刷新' // 对应错误文案
errorText.value = '二维码无效,请刷新'
// 隐藏遮罩,允许用户重新操作
STQRC.value = false
QRStatus.value = "生成中..."
setTimeout(() => {
closeWebSocket()
}, 3000)
} else if (message === '消息格式错误') {
uni.showToast({
title: '消息格式错误',
icon: 'none'
})
status.value = 'error'
errorText.value = '消息格式错误' // 对应错误文案
} else {
errorText.value = '消息格式错误'
// 隐藏遮罩,允许用户重新操作
STQRC.value = false
QRStatus.value = "生成中..."
} else if (message.includes('失败') || message.includes('错误')) {
// 其他失败情况
uni.showToast({
title: message,
icon: 'none',
duration: 2000
})
status.value = 'error'
errorText.value = message
// 隐藏遮罩,允许用户重新操作
STQRC.value = false
QRStatus.value = "生成中..."
} else {
console.log('未知消息:', message)
}
})
@@ -523,10 +558,6 @@ import { getQRCode, checkIn as apiCheckIn } from '@/request_api/main.js'
console.error('WebSocket 错误:', err)
status.value = 'error'
errorText.value = '连接失败,请重试' // 对应错误文案
uni.showToast({
title: '连接失败',
icon: 'none'
})
})
}