Files
cpzs-frontend-new/src/api/index.js

894 lines
27 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import axios from 'axios'
// 创建axios实例
const api = axios.create({
baseURL: import.meta.env.VITE_API_BASE_URL,
timeout: 300000, // 5分钟超时时间300秒
withCredentials: true, // 关键支持跨域携带cookie和session
headers: {
'Content-Type': 'application/json'
}
})
// 防止重复提示的标志
let isKickedOut = false
// 响应拦截器
api.interceptors.response.use(
response => {
const data = response.data
// 检查是否是session过期的响应
if (data && data.success === false) {
// 可以根据后端返回的错误码或消息判断是否是session过期
const message = data.message || ''
// 专门处理账号在其他设备登录的情况
if (message.includes('其他设备登录') || message.includes('当前会话已失效')) {
if (!isKickedOut) {
isKickedOut = true
console.log('检测到账号在其他设备登录,正在踢出当前会话...')
// 动态导入 Element Plus 的消息组件
import('element-plus').then(({ ElMessage }) => {
ElMessage.warning({
message: '您的账号已在其他设备登录,请重新登录',
duration: 3000,
showClose: true
})
})
// 检查当前路径是否为后台管理路径
if (window.location.pathname.startsWith('/cpzsadmin') && window.location.pathname !== '/cpzsadmin/login') {
// 后台管理会话
import('../store/user.js').then(({ userStore }) => {
userStore.adminLogout(true) // 标记为被踢出
setTimeout(() => {
window.location.href = '/cpzsadmin/login'
isKickedOut = false // 重置标志
}, 1500)
})
} else {
// 前台用户会话
import('../store/user.js').then(({ userStore }) => {
userStore.logout(true) // 标记为被踢出
setTimeout(() => {
isKickedOut = false // 重置标志
}, 3000)
})
}
}
return data
}
// 处理其他登录/权限相关的错误
if (message.includes('未登录') || message.includes('登录过期') || message.includes('无权限') || message.includes('Invalid session')) {
console.log('检测到session过期清除本地登录状态')
// 检查当前路径是否为后台管理路径
if (window.location.pathname.startsWith('/cpzsadmin') && window.location.pathname !== '/cpzsadmin/login') {
console.log('后台管理会话过期,正在注销...')
// 动态导入userStore避免循环依赖
import('../store/user.js').then(({ userStore }) => {
userStore.adminLogout()
window.location.href = '/cpzsadmin/login'
})
} else {
// 前台用户会话过期处理
import('../store/user.js').then(({ userStore }) => {
userStore.logout()
})
}
}
}
return data
},
error => {
console.error('API请求错误:', error)
// 检查HTTP状态码401/403通常表示未授权/session过期
if (error.response && (error.response.status === 401 || error.response.status === 403)) {
console.log('检测到401/403错误可能是session过期或无权限')
// 检查当前路径是否为后台管理路径
if (window.location.pathname.startsWith('/cpzsadmin') && window.location.pathname !== '/cpzsadmin/login') {
console.log('后台管理会话过期,正在注销...')
// 动态导入userStore避免循环依赖
import('../store/user.js').then(({ userStore }) => {
userStore.adminLogout()
window.location.href = '/cpzsadmin/login'
})
} else {
// 前台用户会话过期处理
import('../store/user.js').then(({ userStore }) => {
userStore.logout()
})
}
}
return Promise.reject(error)
}
)
// API接口方法
export const lotteryApi = {
// 用户登录
userLogin(userAccount, userPassword) {
return api.post('/user/login', {
userAccount,
userPassword
})
},
// 用户注册
userRegister(userAccount, userPassword, checkPassword, userName) {
return api.post('/user/register', {
userAccount,
userPassword,
checkPassword,
userName
})
},
// 用户注销
userLogout() {
return api.post('/user/logout')
},
// 获取当前登录用户信息
getLoginUser() {
return api.get('/user/get/login')
},
// 获取用户信息(用于编辑)
getUserInfo() {
return api.get('/user/get/login')
},
// 更新用户信息
updateUserInfo(userInfo) {
console.log('调用更新用户信息接口:', userInfo)
return api.post('/user/update', userInfo, {
headers: {
'Content-Type': 'application/json'
}
})
},
// 上传文件
uploadFile(file) {
const formData = new FormData()
formData.append('file', file)
return api.post('/file/upload', formData, {
headers: {
'Content-Type': 'multipart/form-data'
}
})
},
// 获取用户统计信息总用户数和VIP用户数
getUserCount() {
return api.get('/user/count')
},
// 检查当前用户VIP是否过期
checkVipExpire() {
return api.get('/user/check-vip-expire')
},
// 获取用户推测记录(支持分页)
getPredictRecordsByUserId(userId, page = 1) {
return api.get(`/ball-analysis/predict-records/${userId}?page=${page}`)
},
// 按条件查询推测记录(支持分页和状态筛选)
queryPredictRecords(userId, predictStatus, page = 1, pageSize = 10) {
return api.post('/data-analysis/query-predict-records', {
userId: userId,
predictStatus,
current: page,
pageSize
})
},
// 获取近期开奖信息
getRecentDraws(limit = 6) {
return api.get(`/ball-analysis/recent-draws?limit=${limit}`)
},
// 获取最新100条开奖信息表相查询
getRecent100Draws() {
return api.get('/ball-analysis/recent-100-draws')
},
// 按日期范围查询开奖信息
queryDraws(startDate, endDate) {
const params = new URLSearchParams()
if (startDate) params.append('startDate', startDate)
if (endDate) params.append('endDate', endDate)
return api.get(`/ball-analysis/query-draws?${params.toString()}`)
},
// 根据期号查询开奖信息
getDrawById(drawId) {
return api.get(`/ball-analysis/draw/${drawId}`)
},
// 创建推测记录
createPredictRecord(userId, drawId, drawDate, redBalls, blueBall) {
const params = new URLSearchParams()
params.append('userId', userId)
params.append('drawId', drawId)
params.append('drawDate', drawDate)
params.append('redBalls', redBalls)
params.append('blueBall', blueBall)
return api.post('/ball-analysis/create-predict', params, {
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
})
},
// 首球算法
analyzeBalls(userId, level, redBalls, blueBall) {
const params = new URLSearchParams()
params.append('userId', userId)
params.append('level', level)
params.append('redBalls', redBalls)
params.append('blueBall', blueBall)
return api.post('/ball-analysis/analyze', params, {
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
})
},
// 精推版双色球第一步分析
jtssqFirstStepAnalysis(level, redBalls, blueBall) {
const params = new URLSearchParams()
params.append('level', level)
params.append('redBalls', redBalls)
params.append('blueBall', blueBall)
return api.post('/jtssq/analysis/first-step', params, {
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
})
},
// 精推版双色球第二步分析
jtssqSecondStepAnalysis(level, redBalls, blueBall, nextFirstBall) {
const params = new URLSearchParams()
params.append('level', level)
params.append('redBalls', redBalls)
params.append('blueBall', blueBall)
params.append('nextFirstBall', nextFirstBall)
return api.post('/jtssq/analysis/second-step', params, {
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
})
},
// 精推版双色球第三步分析
jtssqThirdStepAnalysis(level, redBalls, blueBall, nextRedBalls) {
const params = new URLSearchParams()
params.append('level', level)
params.append('redBalls', redBalls)
params.append('blueBall', blueBall)
params.append('nextRedBalls', nextRedBalls)
return api.post('/jtssq/analysis/third-step', params, {
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
})
},
// 跟随球号分析算法
fallowBallAnalysis(userId, level, firstThreeRedBalls, lastSixRedBalls, blueBall) {
const params = new URLSearchParams()
params.append('userId', userId)
params.append('level', level)
params.append('firstThreeRedBalls', firstThreeRedBalls)
params.append('lastSixRedBalls', lastSixRedBalls)
params.append('blueBall', blueBall)
return api.post('/ball-analysis/fallow', params, {
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
})
},
// 蓝球分析算法
blueBallAnalysis(userId, level, predictedRedBalls, predictedBlueBalls, lastRedBalls, lastBlueBall) {
const params = new URLSearchParams()
params.append('userId', userId)
params.append('level', level)
params.append('predictedRedBalls', predictedRedBalls)
params.append('predictedBlueBalls', predictedBlueBalls)
params.append('lastRedBalls', lastRedBalls)
params.append('lastBlueBall', lastBlueBall)
return api.post('/ball-analysis/blue-ball', params, {
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
})
},
// 获取用户推测统计数据
getUserPredictStat(userId, lotteryType) {
return api.get(`/data-analysis/user-predict-stat/${userId}`, {
params: { lotteryType }
})
},
// 获取首球命中率统计
getFirstBallHitRate(lotteryType) {
return api.get('/ball-analysis/first-ball-hit-rate', {
params: { lotteryType }
})
},
// 获取蓝球命中率统计
getBlueBallHitRate(lotteryType) {
return api.get('/ball-analysis/blue-ball-hit-rate', {
params: { lotteryType }
})
},
// 获取红球命中率统计
getRedBallHitRate(lotteryType) {
return api.get('/ball-analysis/red-ball-hit-rate', {
params: { lotteryType }
})
},
// 获取奖金统计
getPrizeStatistics() {
return api.get('/ball-analysis/prize-statistics')
},
// 激活会员码
activateVipCode(userId, code) {
return api.post('/user/activate-vip', {
userId,
code
})
},
// 批量生成会员码
generateVipCodes(numCodes, vipExpireTime) {
return api.post('/vip-code/generate', {
numCodes,
vipExpireTime
})
},
// 获取可用会员码
getAvailableVipCode(vipExpireTime) {
return api.get(`/vip-code/available?vipExpireTime=${vipExpireTime}`)
},
// 上传Excel文件导入数据T1-T7 sheet
uploadExcelFile(file) {
const formData = new FormData()
formData.append('file', file)
return api.post('/excel/upload', formData, {
headers: {
'Content-Type': 'multipart/form-data'
}
})
},
// 上传Excel文件导入开奖数据T10工作表
uploadLotteryDrawsFile(file) {
const formData = new FormData()
formData.append('file', file)
return api.post('/excel/upload-lottery-draws', formData, {
headers: {
'Content-Type': 'multipart/form-data'
}
})
},
// 上传Excel文件追加导入开奖数据T10工作表
appendLotteryDrawsFile(file) {
const formData = new FormData()
formData.append('file', file)
return api.post('/excel/append-lottery-draws', formData, {
headers: {
'Content-Type': 'multipart/form-data'
}
})
},
// 获取用户兑换记录
getExchangeRecordsByUserId(userId) {
return api.get(`/vip-exchange-record/user/${userId}`)
},
// 获取用户列表
getUserList(params) {
console.log('调用获取用户列表接口:', params)
const queryParams = new URLSearchParams()
// 添加查询参数
if (params?.userAccount) {
queryParams.append('userAccount', params.userAccount)
}
if (params?.userName) {
queryParams.append('userName', params.userName)
}
if (params?.phone) {
queryParams.append('phone', params.phone)
}
if (params?.userRole) {
queryParams.append('userRole', params.userRole)
}
if (params?.status !== undefined && params?.status !== '') {
queryParams.append('status', params.status)
}
if (params?.isVip !== undefined && params?.isVip !== '') {
queryParams.append('isVip', params.isVip)
}
// 分页参数
if (params?.page) {
queryParams.append('page', params.page)
}
if (params?.size) {
queryParams.append('size', params.size)
}
return api.get(`/user/list${queryParams.toString() ? '?' + queryParams.toString() : ''}`)
},
// 更新用户状态
updateUserStatus(params) {
console.log('调用更新用户状态接口:', params)
// 使用Content-Type: application/json 调用接口
return api.post('/user/update-status', params, {
headers: {
'Content-Type': 'application/json'
},
timeout: 10000 // 设置10秒超时
}).then(response => {
console.log('更新用户状态接口响应:', response)
return response
}).catch(error => {
console.error('更新用户状态接口错误:', error)
throw error
})
},
// 添加用户
addUser(userForm) {
console.log('调用添加用户接口:', userForm)
return api.post('/user/add', userForm)
},
// 更新用户
updateUser(userForm) {
console.log('调用更新用户接口:', userForm)
return api.post('/user/update', userForm)
},
// 删除用户
deleteUser(userId) {
console.log('调用删除用户接口:', userId)
return api.post('/user/delete', { id: userId }, {
headers: {
'Content-Type': 'application/json'
}
})
},
// 获取所有推测记录总数
getTotalPredictCount() {
console.log('调用getTotalPredictCount接口...')
return api.get('/data-analysis/total-predict-count').then(response => {
console.log('getTotalPredictCount接口响应:', response)
return response
}).catch(error => {
console.error('getTotalPredictCount接口错误:', error)
throw error
})
},
// 根据用户ID和操作模块获取操作历史
getOperationHistoryByUserIdAndModule(userId, operationModule) {
return api.get(`/operation-history/user/${userId}/module/${operationModule}`)
},
// 管理员登录(复用用户登录接口,后台会根据角色判断权限)
adminLogin(username, password) {
return api.post('/user/login', {
userAccount: username,
userPassword: password
})
},
// 获取会员码统计数据
getVipCodeStats() {
return api.get('/vip-code/stats')
},
// 获取会员码统计数量
getVipCodeCount() {
console.log('调用getVipCodeCount接口...')
return api.get('/vip-code/count').then(response => {
console.log('getVipCodeCount接口响应:', response)
return response
}).catch(error => {
console.error('getVipCodeCount接口错误:', error)
throw error
})
},
// 获取会员码列表
getVipCodeList(params) {
// 构建查询参数
const queryParams = new URLSearchParams()
// 分页参数
if (params.page) queryParams.append('current', params.page)
if (params.size) queryParams.append('pageSize', params.size)
// 搜索关键词(会员码)
if (params.keyword) queryParams.append('code', params.keyword)
// 状态筛选
if (params.status !== undefined && params.status !== '') {
// 直接使用status值作为isUse参数
queryParams.append('isUse', params.status)
}
// 有效期筛选
if (params.expireTime) queryParams.append('vipExpireTime', params.expireTime)
// 时间范围筛选
if (params.startTime) queryParams.append('startTime', params.startTime)
if (params.endTime) queryParams.append('endTime', params.endTime)
// 发起请求
return api.get(`/vip-code/list/page?${queryParams.toString()}`)
},
// 删除会员码
deleteVipCode(id) {
return api.post(`/vip-code/delete/${id}`)
},
// 获取红球历史数据全部记录
getHistoryAll() {
return api.get('/ball-analysis/history-all')
},
// 获取红球最近100期数据记录
getHistory100() {
return api.get('/ball-analysis/history-100')
},
// 获取红球历史数据排行记录
getHistoryTop() {
return api.get('/ball-analysis/history-top')
},
// 获取红球100期数据排行记录
getHistoryTop100() {
return api.get('/ball-analysis/history-top-100')
},
// 获取蓝球历史数据全部记录
getBlueHistoryAll() {
return api.get('/ball-analysis/blue-history-all')
},
// 获取蓝球最近100期数据记录
getBlueHistory100() {
return api.get('/ball-analysis/blue-history-100')
},
// 获取蓝球历史数据排行记录
getBlueHistoryTop() {
return api.get('/ball-analysis/blue-history-top')
},
// 获取蓝球100期数据排行记录
getBlueHistoryTop100() {
return api.get('/ball-analysis/blue-history-top-100')
},
// 发送短信验证码
sendSmsCode(phoneNumber) {
return api.post('/sms/sendCode', null, {
params: {
phoneNumber
}
})
},
// 手机号登录
userPhoneLogin(phone, code) {
return api.post('/user/phone/login', {
phone,
code
})
},
// 手机号注册
userPhoneRegister(userAccount, userPassword, checkPassword, phone, code, userName) {
return api.post('/user/phone/register', {
userAccount,
userPassword,
checkPassword,
phone,
code,
userName
})
},
// 重置密码
resetPassword(phone, code, newPassword, confirmPassword) {
console.log('调用重置密码接口:', { phone, code, newPassword, confirmPassword })
return api.post('/user/reset-password', {
phone,
code,
newPassword,
confirmPassword
}, {
headers: {
'Content-Type': 'application/json'
}
})
},
// 红球组合分析
redBallCombinationAnalysis(masterBall, slaveBall) {
const params = new URLSearchParams()
params.append('masterBall', masterBall)
params.append('slaveBall', slaveBall)
return api.get(`/ball-analysis/red-ball-combination-analysis?${params.toString()}`)
},
// 红球与蓝球的组合性分析
redBlueCombinationAnalysis(masterBall, slaveBall) {
const params = new URLSearchParams()
params.append('masterBall', masterBall)
params.append('slaveBall', slaveBall)
return api.get(`/ball-analysis/red-blue-combination-analysis?${params.toString()}`)
},
// 蓝球与红球的组合性分析
blueRedCombinationAnalysis(masterBall, slaveBall) {
const params = new URLSearchParams()
params.append('masterBall', masterBall)
params.append('slaveBall', slaveBall)
return api.get(`/ball-analysis/blue-red-combination-analysis?${params.toString()}`)
},
// 红球与红球的接续性分析
redRedPersistenceAnalysis(masterBall, slaveBall) {
const params = new URLSearchParams()
params.append('masterBall', masterBall)
params.append('slaveBall', slaveBall)
return api.get(`/ball-analysis/red-red-persistence-analysis?${params.toString()}`)
},
// 蓝球与蓝球的接续性分析
blueBluePersistenceAnalysis(masterBall, slaveBall) {
const params = new URLSearchParams()
params.append('masterBall', masterBall)
params.append('slaveBall', slaveBall)
return api.get(`/ball-analysis/blue-blue-persistence-analysis?${params.toString()}`)
},
// 红球与蓝球的接续性分析
redBluePersistenceAnalysis(masterBall, slaveBall) {
const params = new URLSearchParams()
params.append('masterBall', masterBall)
params.append('slaveBall', slaveBall)
return api.get(`/ball-analysis/red-blue-persistence-analysis?${params.toString()}`)
},
// 蓝球与红球的接续性分析
blueRedPersistenceAnalysis(masterBall, slaveBall) {
const params = new URLSearchParams()
params.append('masterBall', masterBall)
params.append('slaveBall', slaveBall)
return api.get(`/ball-analysis/blue-red-persistence-analysis?${params.toString()}`)
},
// 根据开奖期号查询开奖球号
getDrawNumbersById(drawId) {
return api.get(`/ball-analysis/draw/${drawId}/numbers`)
},
// 获取近10期开奖期号
getRecent10DrawIds() {
return api.get('/ball-analysis/recent-10-draw-ids')
},
// 根据操作模块获取操作历史(真实接口)
getOperationHistoryByModule(operationModule) {
console.log('调用根据操作模块获取操作历史接口:', operationModule)
return api.get(`/operation-history/module/${operationModule}`)
},
// 根据操作结果获取操作历史(真实接口)
getOperationHistoryByResult(operationResult) {
console.log('调用根据操作结果获取操作历史接口:', operationResult)
return api.get(`/operation-history/result/${operationResult}`)
},
// 获取操作历史列表(统一接口)
getOperationHistoryList(params) {
console.log('调用获取操作历史列表接口:', params)
const queryParams = new URLSearchParams()
if (params?.operationModule !== undefined && params.operationModule !== '') {
queryParams.append('operationModule', params.operationModule)
}
if (params?.operationResult !== undefined && params.operationResult !== '') {
queryParams.append('operationResult', params.operationResult)
}
if (params?.keyword !== undefined && params.keyword !== '') {
queryParams.append('keyword', params.keyword)
}
return api.get(`/operation-history/list${queryParams.toString() ? '?' + queryParams.toString() : ''}`)
},
// ==================== 公告管理接口 ====================
// 添加公告
addAnnouncement(data) {
console.log('调用添加公告接口:', data)
return api.post('/announcement/add', data)
},
// 查询公告列表(分页)
getAnnouncementList(params) {
console.log('调用查询公告列表接口:', params)
const queryParams = new URLSearchParams()
if (params?.current) queryParams.append('current', params.current)
if (params?.pageSize) queryParams.append('pageSize', params.pageSize)
if (params?.title) queryParams.append('title', params.title)
if (params?.status !== undefined && params?.status !== null && params?.status !== '') {
queryParams.append('status', params.status)
}
if (params?.priority !== undefined && params?.priority !== null && params?.priority !== '') {
queryParams.append('priority', params.priority)
}
if (params?.publisherId) queryParams.append('publisherId', params.publisherId)
if (params?.publisherName) queryParams.append('publisherName', params.publisherName)
if (params?.startTime) queryParams.append('startTime', params.startTime)
if (params?.endTime) queryParams.append('endTime', params.endTime)
return api.get(`/announcement/list/page${queryParams.toString() ? '?' + queryParams.toString() : ''}`)
},
// 根据ID查询公告详情
getAnnouncementById(id) {
console.log('调用根据ID查询公告接口:', id)
return api.get(`/announcement/${id}`)
},
// 更新公告
updateAnnouncement(data) {
console.log('调用更新公告接口:', data)
return api.post('/announcement/update', data)
},
// 删除公告
deleteAnnouncement(id) {
console.log('调用删除公告接口:', id)
return api.delete(`/announcement/delete/${id}`)
},
// 获取置顶公告
getTopAnnouncements() {
console.log('调用获取置顶公告接口')
return api.get('/announcement/top')
},
// 获取所有已发布公告
getPublishedAnnouncements() {
console.log('调用获取所有已发布公告接口')
return api.get('/announcement/published')
},
// ==================== 推测管理接口 ====================
// 管理员获取所有双色球推测记录
getAllSsqPredictRecords(params) {
const queryParams = new URLSearchParams()
if (params?.userId) queryParams.append('userId', params.userId)
if (params?.predictResult) queryParams.append('predictResult', params.predictResult)
if (params?.current) queryParams.append('current', params.current)
if (params?.pageSize) queryParams.append('pageSize', params.pageSize)
return api.get(`/ball-analysis/admin/all-records?${queryParams.toString()}`)
},
// 管理员获取所有大乐透推测记录
getAllDltPredictRecords(params) {
const queryParams = new URLSearchParams()
if (params?.userId) queryParams.append('userId', params.userId)
if (params?.predictResult) queryParams.append('predictResult', params.predictResult)
if (params?.current) queryParams.append('current', params.current)
if (params?.pageSize) queryParams.append('pageSize', params.pageSize)
return api.get(`/dlt-predict/admin/all-records?${queryParams.toString()}`)
},
// ==================== 奖金统计接口 ====================
// 管理员获取双色球中奖记录明细
getAdminPrizeStatistics(params) {
const queryParams = new URLSearchParams()
if (params?.userId) queryParams.append('userId', params.userId)
if (params?.prizeGrade) queryParams.append('prizeGrade', params.prizeGrade)
if (params?.current) queryParams.append('current', params.current)
if (params?.pageSize) queryParams.append('pageSize', params.pageSize)
return api.get(`/ball-analysis/admin/prize-statistics?${queryParams.toString()}`)
},
// 管理员获取大乐透中奖记录明细
getAdminDltPrizeStatistics(params) {
const queryParams = new URLSearchParams()
if (params?.userId) queryParams.append('userId', params.userId)
if (params?.prizeGrade) queryParams.append('prizeGrade', params.prizeGrade)
if (params?.current) queryParams.append('current', params.current)
if (params?.pageSize) queryParams.append('pageSize', params.pageSize)
return api.get(`/dlt-predict/admin/prize-statistics?${queryParams.toString()}`)
},
// 记录页面访问PV
recordPageView(pagePath) {
return api.post(`/pv/record?pagePath=${encodeURIComponent(pagePath)}`)
},
// 获取总PV
getTotalPageViews() {
return api.get('/pv/total')
},
// 获取今日PV
getTodayPageViews() {
return api.get('/pv/today')
},
// 获取近N天PV统计
getPageViewsByDays(days = 7) {
return api.get(`/pv/stats?days=${days}`)
}
}
export default api