From e1a9d97596e33d7b563786a3ea428450229a2b7c Mon Sep 17 00:00:00 2001 From: linyimin <18316471919@139.com> Date: Tue, 28 Apr 2026 10:31:54 +0800 Subject: [PATCH] =?UTF-8?q?pref:=20=E5=B0=8F=E7=A8=8B=E5=BA=8F=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E9=9D=99=E9=BB=98=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/apis.js | 603 ++++++++++++++++++++------------------ src/components/Signin.vue | 15 +- src/pages/index.vue | 152 ++++++---- 3 files changed, 416 insertions(+), 354 deletions(-) diff --git a/src/apis.js b/src/apis.js index 9389a7f..1907015 100644 --- a/src/apis.js +++ b/src/apis.js @@ -1,477 +1,498 @@ let BASE_URL = "https://api.shelingxingqiu.com/api/shoot"; // 默认正式版 try { - const accountInfo = uni.getAccountInfoSync(); - const envVersion = accountInfo.miniProgram.envVersion; + const accountInfo = uni.getAccountInfoSync(); + const envVersion = accountInfo.miniProgram.envVersion; - switch (envVersion) { - case "develop": // 开发版 - BASE_URL = "http://localhost:8000/api/shoot"; - // BASE_URL = "https://apitest.shelingxingqiu.com/api/shoot"; - break; - case "trial": // 体验版 - BASE_URL = "https://apitest.shelingxingqiu.com/api/shoot"; - break; - case "release": // 正式版 - BASE_URL = "https://api.shelingxingqiu.com/api/shoot"; - break; - default: - // 保持默认值 - break; - } + switch (envVersion) { + case "develop": // 开发版 + BASE_URL = "http://localhost:8000/api/shoot"; + // BASE_URL = "https://apitest.shelingxingqiu.com/api/shoot"; + break; + case "trial": // 体验版 + BASE_URL = "https://apitest.shelingxingqiu.com/api/shoot"; + break; + case "release": // 正式版 + BASE_URL = "https://api.shelingxingqiu.com/api/shoot"; + break; + default: + // 保持默认值 + break; + } } catch (e) { - console.error("获取环境信息失败,使用默认正式环境", e); + console.error("获取环境信息失败,使用默认正式环境", e); } function request(method, url, data = {}) { - const token = uni.getStorageSync( - `${uni.getAccountInfoSync().miniProgram.envVersion}_token` - ); - const header = {}; - if (token) header.Authorization = `Bearer ${token || ""}`; - return new Promise((resolve, reject) => { - uni.request({ - url: `${BASE_URL}${url}`, - method, - header, - data, - timeout: 10000, - success: (res) => { - if (res.data) { - const { code, data, message } = res.data; - if (code === 0) resolve(data); - else if (message) { - if (message.indexOf("登录身份已失效") !== -1) { - uni.removeStorageSync( - `${uni.getAccountInfoSync().miniProgram.envVersion}_token` - ); - uni.$emit("update-user"); - } - if (message === "ROOM_FULL") { - resolve({ full: true }); - return; - } - if (message === "ERROR_ROOM_GAME_START") { - resolve({ started: true }); - return; - } - if (url.indexOf("/user/room") !== -1 && method === "GET") { - resolve({}); - return; - } - if (message === "ERROR_BATTLE_GAMING") { - resolve({}); - return; - } - if (message === "BIND_DEVICE") { - resolve({ binded: true }); - return; - } - if (message === "ERROR_ORDER_UNPAY") { - uni.showToast({ - title: "当前有未支付订单", - icon: "none", - }); - resolve({}); - return; - } - if (message === "ROOM_EMPTY") { - return uni.showToast({ - title: "房间已过期", - icon: "none", - }); - } - uni.showToast({ - title: message, - icon: "none", - }); - } - reject(""); - } - }, - fail: (err) => { - handleRequestError(err, url); - reject(err); - }, + const token = uni.getStorageSync( + `${uni.getAccountInfoSync().miniProgram.envVersion}_token` + ); + const header = {}; + if (token) header.Authorization = `Bearer ${token || ""}`; + return new Promise((resolve, reject) => { + uni.request({ + url: `${BASE_URL}${url}`, + method, + header, + data, + timeout: 10000, + success: (res) => { + if (res.data) { + const {code, data, message} = res.data; + if (code === 0) resolve(data); + else if (message) { + if (message.indexOf("登录身份已失效") !== -1) { + uni.removeStorageSync( + `${uni.getAccountInfoSync().miniProgram.envVersion}_token` + ); + uni.$emit("update-user"); + } + if (message === "ROOM_FULL") { + resolve({full: true}); + return; + } + if (message === "ERROR_ROOM_GAME_START") { + resolve({started: true}); + return; + } + if (url.indexOf("/user/room") !== -1 && method === "GET") { + resolve({}); + return; + } + if (message === "ERROR_BATTLE_GAMING") { + resolve({}); + return; + } + if (message === "BIND_DEVICE") { + resolve({binded: true}); + return; + } + if (message === "ERROR_ORDER_UNPAY") { + uni.showToast({ + title: "当前有未支付订单", + icon: "none", + }); + resolve({}); + return; + } + if (message === "ROOM_EMPTY") { + return uni.showToast({ + title: "房间已过期", + icon: "none", + }); + } + uni.showToast({ + title: message, + icon: "none", + }); + } + reject(""); + } + }, + fail: (err) => { + handleRequestError(err, url); + reject(err); + }, + }); }); - }); } // 统一的错误处理函数 function handleRequestError(err, url) { - console.log("请求失败:", { err, url }); + console.log("请求失败:", {err, url}); - // 根据错误类型显示不同提示 - if (err.errMsg) { - if (err.errMsg.includes("timeout")) { - showCustomToast("请求超时,请稍后重试", "timeout"); - } else if (err.errMsg.includes("fail")) { - // 检查网络状态 - uni.getNetworkType({ - success: (res) => { - if (res.networkType === "none") { - showCustomToast("网络连接已断开,请检查网络设置", "network"); - } else { - showCustomToast("服务器连接失败,请稍后重试", "server"); - } - }, - fail: () => { - showCustomToast("网络异常,请检查网络连接", "unknown"); - }, - }); + // 根据错误类型显示不同提示 + if (err.errMsg) { + if (err.errMsg.includes("timeout")) { + showCustomToast("请求超时,请稍后重试", "timeout"); + } else if (err.errMsg.includes("fail")) { + // 检查网络状态 + uni.getNetworkType({ + success: (res) => { + if (res.networkType === "none") { + showCustomToast("网络连接已断开,请检查网络设置", "network"); + } else { + showCustomToast("服务器连接失败,请稍后重试", "server"); + } + }, + fail: () => { + showCustomToast("网络异常,请检查网络连接", "unknown"); + }, + }); + } else { + showCustomToast("请求失败,请稍后重试", "general"); + } } else { - showCustomToast("请求失败,请稍后重试", "general"); + showCustomToast("网络异常,请稍后重试", "unknown"); } - } else { - showCustomToast("网络异常,请稍后重试", "unknown"); - } } // 自定义提示函数 function showCustomToast(message, type) { - const config = { - title: message, - icon: "none", - duration: 3000, - }; + const config = { + title: message, + icon: "none", + duration: 3000, + }; - // 根据错误类型可以添加不同的处理逻辑 - switch (type) { - case "timeout": - config.duration = 4000; // 超时提示显示更久 - break; - case "network": - config.duration = 5000; // 网络问题提示显示更久 - break; - default: - break; - } + // 根据错误类型可以添加不同的处理逻辑 + switch (type) { + case "timeout": + config.duration = 4000; // 超时提示显示更久 + break; + case "network": + config.duration = 5000; // 网络问题提示显示更久 + break; + default: + break; + } - uni.showToast(config); + uni.showToast(config); } // 获取全局配置 export const getAppConfig = () => { - return request("GET", "/index/appConfig"); + return request("GET", "/index/appConfig"); }; export const getHomeData = (seasonId) => { - return request("GET", `/user/myHome?seasonId=${seasonId}`); + return request("GET", `/user/myHome?seasonId=${seasonId}`); }; export const getProvinceData = () => { - return request("GET", "/index/provinces/list"); + return request("GET", "/index/provinces/list"); }; export const loginAPI = async (phone, nickName, avatarData, code) => { - const result = await request("POST", "/index/code", { - appName: "shoot", - appId: "wxa8f5989dcd45cc23", - nickName, - avatarData, - code, - phone, - }); - uni.setStorageSync( - `${uni.getAccountInfoSync().miniProgram.envVersion}_token`, - result.token - ); - return result; + const result = await request("POST", "/index/code", { + appName: "shoot", + appId: "wxa8f5989dcd45cc23", + nickName, + avatarData, + code, + phone, + }); + uni.setStorageSync( + `${uni.getAccountInfoSync().miniProgram.envVersion}_token`, + result.token + ); + return result; +}; + +export const silentLoginAPI = async (code) => { + const result = await request("POST", "/index/code", { + appName: "shoot", + appId: "wxa8f5989dcd45cc23", + code, + }); + uni.setStorageSync( + `${uni.getAccountInfoSync().miniProgram.envVersion}_token`, + result.token + ); + return result; +}; + +export const checkUserBindAPI = async (code) => { + return request("POST", "/index/checkBind", { + appName: "shoot", + appId: "wxa8f5989dcd45cc23", + code, + }); }; export const bindDeviceAPI = (device) => { - return request("POST", "/user/device/bindDevice", { - device, - }); + return request("POST", "/user/device/bindDevice", { + device, + }); }; export const bindDeviceAPIV2 = (token) => { - return request("POST", "/user/device/bindDevice/v2", { - token: token, - }); + return request("POST", "/user/device/bindDevice/v2", { + token: token, + }); }; export const unbindDeviceAPI = (deviceId) => { - return request("POST", "/user/device/unbindDevice", { - deviceId, - }); + return request("POST", "/user/device/unbindDevice", { + deviceId, + }); }; export const getMyDevicesAPI = () => { - // "/user/device/getBinding?deviceId=9ZF9oVXs" - return request("GET", "/user/device/getBindings"); + // "/user/device/getBinding?deviceId=9ZF9oVXs" + return request("GET", "/user/device/getBindings"); }; export const createPractiseAPI = (arrows, time, target) => { - return request("POST", "/user/practice/create", { - shootNumber: arrows, - shootTime: time, - targetType: target*20, - }); + return request("POST", "/user/practice/create", { + shootNumber: arrows, + shootTime: time, + targetType: target * 20, + }); }; export const startPractiseAPI = () => { - return request("POST", "/user/practice/begin"); + return request("POST", "/user/practice/begin"); }; export const endPractiseAPI = () => { - return request("POST", "/user/practice/stop"); + return request("POST", "/user/practice/stop"); }; export const getPractiseAPI = async (id) => { - return request("GET", `/user/practice/get?id=${id}`); + return request("GET", `/user/practice/get?id=${id}`); }; export const createRoomAPI = (gameType, teamSize, targetType) => { - return request("POST", "/user/createroom", { - gameType, - teamSize, - targetType, - }); + return request("POST", "/user/createroom", { + gameType, + teamSize, + targetType, + }); }; export const getRoomAPI = (number) => { - return request("GET", `/user/room?number=${number}`); + return request("GET", `/user/room?number=${number}`); }; export const joinRoomAPI = (number) => { - return request("POST", `/user/room/join`, { number }); + return request("POST", `/user/room/join`, {number}); }; export const destroyRoomAPI = (roomNumber) => { - return request("POST", "/user/room/destroyRoom", { - roomNumber, - }); + return request("POST", "/user/room/destroyRoom", { + roomNumber, + }); }; export const exitRoomAPI = (number, userId) => { - return request("POST", "/user/room/exitRoom", { - number, - userId, - }); + return request("POST", "/user/room/exitRoom", { + number, + userId, + }); }; export const startRoomAPI = (number) => { - return request("POST", "/user/room/start", { number }); + return request("POST", "/user/room/start", {number}); }; export const getPractiseResultListAPI = async (page = 1, page_size = 15) => { - const reuslt = await request( - "GET", - `/user/practice/list?page=${page}&page_size=${page_size}` - ); - return reuslt.list; + const reuslt = await request( + "GET", + `/user/practice/list?page=${page}&page_size=${page_size}` + ); + return reuslt.list; }; export const matchGameAPI = (match, gameType, teamSize) => { - return request("POST", "/user/game/match", { - match, - gameType, - teamSize, - readyTime: 15, - targetType: 20, - }); + return request("POST", "/user/game/match", { + match, + gameType, + teamSize, + readyTime: 15, + targetType: 20, + }); }; export const readyGameAPI = (battleId) => { - return request("POST", "/user/game/prepare", { - battleId, - }); + return request("POST", "/user/game/prepare", { + battleId, + }); }; export const simulShootAPI = (device_id, x, y) => { - const data = { - device_id, - }; - if (x !== undefined && y !== undefined) { - data.x = x; - data.y = y; - } - return request("POST", "/index/arrow", data); + const data = { + device_id, + }; + if (x !== undefined && y !== undefined) { + data.x = x; + data.y = y; + } + return request("POST", "/index/arrow", data); }; export const getBattleListAPI = async (page, battleType) => { - const result = await request("POST", "/user/battle/details/list", { - page, - pageSize: 10, - battleType, - }); - return result.list; + const result = await request("POST", "/user/battle/details/list", { + page, + pageSize: 10, + battleType, + }); + return result.list; }; export const getRankListAPI = () => { - return request("GET", "/index/ranklist"); + return request("GET", "/index/ranklist"); }; export const createOrderAPI = (vipId) => { - return request("POST", "/user/order/create", { - vipId, - quanity: 1, - tradeType: "mini", - payType: "wxpay", - }); + return request("POST", "/user/order/create", { + vipId, + quanity: 1, + tradeType: "mini", + payType: "wxpay", + }); }; export const payOrderAPI = (id) => { - return request("POST", "/user/order/pay", { - id, - tradeType: "mini", - payType: "wxpay", - }); + return request("POST", "/user/order/pay", { + id, + tradeType: "mini", + payType: "wxpay", + }); }; export const getOrderListAPI = async (page) => { - const reuslt = await request("GET", `/user/order/list?page=${page}`); - return reuslt.items || []; + const reuslt = await request("GET", `/user/order/list?page=${page}`); + return reuslt.items || []; }; export const cancelOrderListAPI = async (id) => { - return request("POST", "/user/order/cancelOrder", { id }); + return request("POST", "/user/order/cancelOrder", {id}); }; export const getUserGameState = () => { - return request("GET", "/user/state"); + return request("GET", "/user/state"); }; export const getPointBookConfigAPI = async () => { - return request("GET", "/user/score/sheet/option"); + return request("GET", "/user/score/sheet/option"); }; export const savePointBookAPI = async ( - bowType, - distance, - targetType, - groups, - arrows, - data = [] -) => { - return request("POST", "/user/score/sheet/report", { bowType, distance, targetType, groups, arrows, - group_data: data.map((item) => - item.map((i) => ({ - ...i, - ring: i.ring === "M" ? -1 : i.ring === "X" ? 0 : Number(i.ring), - })) - ), - }); + data = [] +) => { + return request("POST", "/user/score/sheet/report", { + bowType, + distance, + targetType, + groups, + arrows, + group_data: data.map((item) => + item.map((i) => ({ + ...i, + ring: i.ring === "M" ? -1 : i.ring === "X" ? 0 : Number(i.ring), + })) + ), + }); }; export const getPointBookListAPI = async ( - page = 1, - bowType, - distance, - targetType + page = 1, + bowType, + distance, + targetType ) => { - let url = `/user/score/sheet/list?pageNum=${page}&pageSize=10`; - if (bowType) url += `&bowType=${bowType}`; - if (distance) url += `&distance=${distance}`; - if (targetType) url += `&targetType=${targetType}`; - const result = await request("GET", url); - return result.list || []; + let url = `/user/score/sheet/list?pageNum=${page}&pageSize=10`; + if (bowType) url += `&bowType=${bowType}`; + if (distance) url += `&distance=${distance}`; + if (targetType) url += `&targetType=${targetType}`; + const result = await request("GET", url); + return result.list || []; }; export const getPointBookDetailAPI = async (id) => { - return request("GET", `/user/score/sheet/detail?id=${id}`); + return request("GET", `/user/score/sheet/detail?id=${id}`); }; export const getPointBookDataAPI = async () => { - return request("GET", "/user/score/sheet/statistics"); + return request("GET", "/user/score/sheet/statistics"); }; export const getPractiseDataAPI = async () => { - return request("GET", "/user/practice/statistics"); + return request("GET", "/user/practice/statistics"); }; export const getBattleDataAPI = async () => { - return request("GET", "/user/fight/statistics"); + return request("GET", "/user/fight/statistics"); }; export const chooseTeamAPI = async (number, group) => { - return request("POST", "/user/room/group", { number, group }); + return request("POST", "/user/room/group", {number, group}); }; export const getVIPDescAPI = async () => { - return request("GET", "/index/memberVipDescribe"); + return request("GET", "/index/memberVipDescribe"); }; export const getPointBookStatisticsAPI = async () => { - return request("GET", `/v2/user/score/sheet/statistics`); + return request("GET", `/v2/user/score/sheet/statistics`); }; export const donateAPI = async (amount, name, phone, organizer, advice) => { - return request("POST", `/user/donate`, { - amount, - name, - phone, - organizer, - advice, - }); + return request("POST", `/user/donate`, { + amount, + name, + phone, + organizer, + advice, + }); }; export const laserAimAPI = async () => { - return request("POST", "/user/device/laserAim"); + return request("POST", "/user/device/laserAim"); }; export const laserCloseAPI = async () => { - return request("POST", "/user/device/closeAim"); + return request("POST", "/user/device/closeAim"); }; export const getDeviceBatteryAPI = async () => { - return request("GET", "/user/device/battery"); + return request("GET", "/user/device/battery"); }; export const addNoteAPI = async (id, remark) => { - return request("POST", "/user/score/sheet/remark", { id, remark }); + return request("POST", "/user/score/sheet/remark", {id, remark}); }; export const removePointRecord = async (id) => { - return request("DELETE", `/user/score/sheet/delete?id=${id}`); + return request("DELETE", `/user/score/sheet/delete?id=${id}`); }; export const getPhoneNumberAPI = (data) => { - return request("POST", "/index/getPhone", data); + return request("POST", "/index/getPhone", data); }; export const getPointBookRankListAPI = (page = 1) => { - return request( - "GET", - `/user/score/sheet/week/shoot/rank/list?pageNum=${page}&pageSize=100` - ); + return request( + "GET", + `/user/score/sheet/week/shoot/rank/list?pageNum=${page}&pageSize=100` + ); }; export const clickLikeAPI = (userId, ifLike) => { - return request("POST", "/user/score/sheet/week/shoot/rank/like", { - userId, - ifLike, - }); + return request("POST", "/user/score/sheet/week/shoot/rank/like", { + userId, + ifLike, + }); }; export const getMyLikeList = (page = 1, pageSize = 10) => { - return request( - "GET", - `/user/score/sheet/week/shoot/rank/like/list?pageNum=${page}&pageSize=${pageSize}` - ); + return request( + "GET", + `/user/score/sheet/week/shoot/rank/like/list?pageNum=${page}&pageSize=${pageSize}` + ); }; export const getReadyAPI = (roomId) => { - return request("POST", `/user/room/ready`, { - roomId, - }); + return request("POST", `/user/room/ready`, { + roomId, + }); }; export const getBattleAPI = async (battleId) => { - return request("POST", "/user/match/info", { - id: battleId, - }); + return request("POST", "/user/match/info", { + id: battleId, + }); }; export const kickPlayerAPI = (number, userId) => { - return request("POST", "/user/room/kicking", { - number, - userId, - }); + return request("POST", "/user/room/kicking", { + number, + userId, + }); }; diff --git a/src/components/Signin.vue b/src/components/Signin.vue index 0805d16..619d681 100644 --- a/src/components/Signin.vue +++ b/src/components/Signin.vue @@ -86,18 +86,17 @@ const handleLogin = async () => { icon: "none", }); } + await doLogin(); +}; + +async function doLogin() { loading.value = true; try { const wxResult = await wxLogin(); const fileManager = uni.getFileSystemManager(); const avatarBase64 = fileManager.readFileSync(avatarUrl.value, "base64"); const base64Url = `data:image/png;base64,${avatarBase64}`; - const result = await loginAPI( - phone.value, - nickName.value, - base64Url, - wxResult.code - ); + await loginAPI(phone.value, nickName.value, base64Url, wxResult.code); const data = await getHomeData(); if (data.user) updateUser(data.user); const devices = await getMyDevicesAPI(); @@ -139,6 +138,10 @@ const openPrivacyLink = () => { onShow(() => { loading.value = false; + agree.value = false; + phone.value = ""; + avatarUrl.value = ""; + nickName.value = ""; }); diff --git a/src/pages/index.vue b/src/pages/index.vue index 1f81e39..c670356 100644 --- a/src/pages/index.vue +++ b/src/pages/index.vue @@ -1,25 +1,26 @@ @@ -127,25 +152,25 @@ onShareTimeline(() => { - + 绑定我的智能弓 @@ -153,9 +178,9 @@ onShareTimeline(() => { 设备在线 新人必刷! @@ -164,49 +189,49 @@ onShareTimeline(() => { - + - + - + - - - + + + {{ i }} @@ -216,14 +241,15 @@ onShareTimeline(() => { - + 段位 {{ user.lvlName || "暂无" - }} + }} + 赛季平均环数 @@ -232,18 +258,19 @@ onShareTimeline(() => { 赛季胜率 {{ - user.avg_win - ? Number((user.avg_win * 100).toFixed(2)) + "%" - : "暂无" - }} + user.avg_win + ? Number((user.avg_win * 100).toFixed(2)) + "%" + : "暂无" + }} + - + - + @@ -364,6 +391,7 @@ onShareTimeline(() => { width: 32rpx; height: 32rpx; } + .player-avatar > view:first-child { border-radius: 50%; background: #777777; @@ -374,6 +402,7 @@ onShareTimeline(() => { height: 18px; color: #fff; } + .player-avatar > image:last-child { width: 100%; height: 100%; @@ -392,18 +421,22 @@ onShareTimeline(() => { margin-left: 2px; color: #fff; } + .my-data { display: flex; margin-top: 20px; justify-content: space-between; } + .my-data > view:first-child { width: 28%; } + .my-data > view:first-child > image { width: 100%; transform: translateX(-8px); } + .my-data > view:nth-child(2) { width: 68%; font-size: 12px; @@ -411,9 +444,11 @@ onShareTimeline(() => { display: flex; justify-content: space-between; } + .my-data > view:nth-child(2) > view:nth-child(2) { width: 38%; } + .my-data > view:nth-child(2) > view { width: 28%; border-radius: 10px; @@ -423,11 +458,13 @@ onShareTimeline(() => { align-items: center; justify-content: center; } + .my-data > view:nth-child(2) > view > text:last-child { color: #fff; line-height: 25px; font-weight: 500; } + .top-theme { position: absolute; display: flex; @@ -437,6 +474,7 @@ onShareTimeline(() => { height: 60px; z-index: -1; } + .top-theme > image { width: 300rpx; transform: translate(-4%, -14%);