pref: 小程序添加静默登录
This commit is contained in:
21
src/apis.js
21
src/apis.js
@@ -179,6 +179,27 @@ export const loginAPI = async (phone, nickName, avatarData, code) => {
|
|||||||
return result;
|
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) => {
|
export const bindDeviceAPI = (device) => {
|
||||||
return request("POST", "/user/device/bindDevice", {
|
return request("POST", "/user/device/bindDevice", {
|
||||||
device,
|
device,
|
||||||
|
|||||||
@@ -86,18 +86,17 @@ const handleLogin = async () => {
|
|||||||
icon: "none",
|
icon: "none",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
await doLogin();
|
||||||
|
};
|
||||||
|
|
||||||
|
async function doLogin() {
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
try {
|
try {
|
||||||
const wxResult = await wxLogin();
|
const wxResult = await wxLogin();
|
||||||
const fileManager = uni.getFileSystemManager();
|
const fileManager = uni.getFileSystemManager();
|
||||||
const avatarBase64 = fileManager.readFileSync(avatarUrl.value, "base64");
|
const avatarBase64 = fileManager.readFileSync(avatarUrl.value, "base64");
|
||||||
const base64Url = `data:image/png;base64,${avatarBase64}`;
|
const base64Url = `data:image/png;base64,${avatarBase64}`;
|
||||||
const result = await loginAPI(
|
await loginAPI(phone.value, nickName.value, base64Url, wxResult.code);
|
||||||
phone.value,
|
|
||||||
nickName.value,
|
|
||||||
base64Url,
|
|
||||||
wxResult.code
|
|
||||||
);
|
|
||||||
const data = await getHomeData();
|
const data = await getHomeData();
|
||||||
if (data.user) updateUser(data.user);
|
if (data.user) updateUser(data.user);
|
||||||
const devices = await getMyDevicesAPI();
|
const devices = await getMyDevicesAPI();
|
||||||
@@ -139,6 +138,10 @@ const openPrivacyLink = () => {
|
|||||||
|
|
||||||
onShow(() => {
|
onShow(() => {
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
|
agree.value = false;
|
||||||
|
phone.value = "";
|
||||||
|
avatarUrl.value = "";
|
||||||
|
nickName.value = "";
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@@ -1,25 +1,26 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { ref, onMounted } from "vue";
|
import {onMounted, ref} from "vue";
|
||||||
import { onShow, onShareAppMessage, onShareTimeline } from "@dcloudio/uni-app";
|
import {onShareAppMessage, onShareTimeline, onShow} from "@dcloudio/uni-app";
|
||||||
import Container from "@/components/Container.vue";
|
import Container from "@/components/Container.vue";
|
||||||
import AppFooter from "@/components/AppFooter.vue";
|
import AppFooter from "@/components/AppFooter.vue";
|
||||||
import AppBackground from "@/components/AppBackground.vue";
|
|
||||||
import UserHeader from "@/components/UserHeader.vue";
|
import UserHeader from "@/components/UserHeader.vue";
|
||||||
import Signin from "@/components/Signin.vue";
|
import Signin from "@/components/Signin.vue";
|
||||||
import BubbleTip from "@/components/BubbleTip.vue";
|
import BubbleTip from "@/components/BubbleTip.vue";
|
||||||
|
|
||||||
import {
|
import {
|
||||||
|
checkUserBindAPI,
|
||||||
getAppConfig,
|
getAppConfig,
|
||||||
getRankListAPI,
|
getDeviceBatteryAPI,
|
||||||
getHomeData,
|
getHomeData,
|
||||||
getMyDevicesAPI,
|
getMyDevicesAPI,
|
||||||
getDeviceBatteryAPI,
|
getRankListAPI,
|
||||||
|
silentLoginAPI,
|
||||||
} from "@/apis";
|
} from "@/apis";
|
||||||
import {topThreeColors} from "@/constants";
|
import {topThreeColors} from "@/constants";
|
||||||
import { canEenter } from "@/util";
|
|
||||||
|
|
||||||
import useStore from "@/store";
|
import useStore from "@/store";
|
||||||
import {storeToRefs} from "pinia";
|
import {storeToRefs} from "pinia";
|
||||||
|
|
||||||
const store = useStore();
|
const store = useStore();
|
||||||
const {
|
const {
|
||||||
updateConfig,
|
updateConfig,
|
||||||
@@ -55,12 +56,36 @@ const toRankListPage = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
onShow(async () => {
|
onShow(async () => {
|
||||||
const token = uni.getStorageSync(
|
const env = uni.getAccountInfoSync().miniProgram.envVersion;
|
||||||
`${uni.getAccountInfoSync().miniProgram.envVersion}_token`
|
const token = uni.getStorageSync(`${env}_token`);
|
||||||
|
|
||||||
|
if (!user.value.id && !token) {
|
||||||
|
try {
|
||||||
|
const wxResult = await uni.login({provider: "weixin"});
|
||||||
|
const bindResult = await checkUserBindAPI(wxResult.code);
|
||||||
|
if (bindResult.binded) {
|
||||||
|
const newResult = await uni.login({provider: "weixin"});
|
||||||
|
const silentResult = await silentLoginAPI(newResult.code);
|
||||||
|
if (silentResult.user) updateUser(silentResult.user);
|
||||||
|
const devices = await getMyDevicesAPI();
|
||||||
|
if (devices.bindings && devices.bindings.length) {
|
||||||
|
updateDevice(
|
||||||
|
devices.bindings[0].deviceId,
|
||||||
|
devices.bindings[0].deviceName
|
||||||
);
|
);
|
||||||
|
const data = await getDeviceBatteryAPI();
|
||||||
|
updateOnline(data.online);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
showModal.value = true;
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.log("检查绑定状态失败", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const promises = [getRankListAPI()];
|
const promises = [getRankListAPI()];
|
||||||
if (token) {
|
if (token || user.value.id) {
|
||||||
promises.push(getHomeData());
|
promises.push(getHomeData());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -223,7 +248,8 @@ onShareTimeline(() => {
|
|||||||
<text>段位</text>
|
<text>段位</text>
|
||||||
<text>{{
|
<text>{{
|
||||||
user.lvlName || "暂无"
|
user.lvlName || "暂无"
|
||||||
}}</text>
|
}}
|
||||||
|
</text>
|
||||||
</view>
|
</view>
|
||||||
<view>
|
<view>
|
||||||
<text>赛季平均环数</text>
|
<text>赛季平均环数</text>
|
||||||
@@ -235,7 +261,8 @@ onShareTimeline(() => {
|
|||||||
user.avg_win
|
user.avg_win
|
||||||
? Number((user.avg_win * 100).toFixed(2)) + "%"
|
? Number((user.avg_win * 100).toFixed(2)) + "%"
|
||||||
: "暂无"
|
: "暂无"
|
||||||
}}</text>
|
}}
|
||||||
|
</text>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
@@ -364,6 +391,7 @@ onShareTimeline(() => {
|
|||||||
width: 32rpx;
|
width: 32rpx;
|
||||||
height: 32rpx;
|
height: 32rpx;
|
||||||
}
|
}
|
||||||
|
|
||||||
.player-avatar > view:first-child {
|
.player-avatar > view:first-child {
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
background: #777777;
|
background: #777777;
|
||||||
@@ -374,6 +402,7 @@ onShareTimeline(() => {
|
|||||||
height: 18px;
|
height: 18px;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
.player-avatar > image:last-child {
|
.player-avatar > image:last-child {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
@@ -392,18 +421,22 @@ onShareTimeline(() => {
|
|||||||
margin-left: 2px;
|
margin-left: 2px;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
.my-data {
|
.my-data {
|
||||||
display: flex;
|
display: flex;
|
||||||
margin-top: 20px;
|
margin-top: 20px;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
}
|
}
|
||||||
|
|
||||||
.my-data > view:first-child {
|
.my-data > view:first-child {
|
||||||
width: 28%;
|
width: 28%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.my-data > view:first-child > image {
|
.my-data > view:first-child > image {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
transform: translateX(-8px);
|
transform: translateX(-8px);
|
||||||
}
|
}
|
||||||
|
|
||||||
.my-data > view:nth-child(2) {
|
.my-data > view:nth-child(2) {
|
||||||
width: 68%;
|
width: 68%;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
@@ -411,9 +444,11 @@ onShareTimeline(() => {
|
|||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
}
|
}
|
||||||
|
|
||||||
.my-data > view:nth-child(2) > view:nth-child(2) {
|
.my-data > view:nth-child(2) > view:nth-child(2) {
|
||||||
width: 38%;
|
width: 38%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.my-data > view:nth-child(2) > view {
|
.my-data > view:nth-child(2) > view {
|
||||||
width: 28%;
|
width: 28%;
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
@@ -423,11 +458,13 @@ onShareTimeline(() => {
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.my-data > view:nth-child(2) > view > text:last-child {
|
.my-data > view:nth-child(2) > view > text:last-child {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
line-height: 25px;
|
line-height: 25px;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
}
|
}
|
||||||
|
|
||||||
.top-theme {
|
.top-theme {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -437,6 +474,7 @@ onShareTimeline(() => {
|
|||||||
height: 60px;
|
height: 60px;
|
||||||
z-index: -1;
|
z-index: -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
.top-theme > image {
|
.top-theme > image {
|
||||||
width: 300rpx;
|
width: 300rpx;
|
||||||
transform: translate(-4%, -14%);
|
transform: translate(-4%, -14%);
|
||||||
|
|||||||
Reference in New Issue
Block a user