import axios from 'axios' // 创建axios实例 const api = axios.create({ // baseURL: 'http://localhost:8123/api', baseURL: 'https://www.yicaishuzhi.com/api', 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') }, // 获取用户统计信息(总用户数和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) { // 模拟API请求,实际项目中应该调用真实的后端API return new Promise((resolve) => { setTimeout(() => { // 模拟验证管理员账号密码 if (username === 'admin' && password === '123456') { resolve({ success: true, data: { id: 1, userName: '系统管理员', userAccount: 'admin', userRole: 'admin', avatar: null, createTime: new Date().toISOString() }, message: '登录成功' }) } else { resolve({ success: false, data: null, message: '账号或密码错误' }) } }, 1000) // 模拟网络延迟 }) }, // 获取会员码统计数据 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