383 lines
10 KiB
Vue
383 lines
10 KiB
Vue
<script>
|
|
import authUtil from '@/utils/auth.js'; // 引入工具类
|
|
import userUtil from '@/utils/user.js'; // 引入工具类
|
|
export default {
|
|
globalData: {
|
|
website: "https://www.lailab.cc:8080",
|
|
hasUserInfo: false,
|
|
userInfo: {},
|
|
openId: null,
|
|
defaultAuthCode: "D768ECAAB35C55ABBA071C5415D6520E",
|
|
method: {
|
|
getOpenId: "/api/wx/getOpenId",
|
|
getUserByOpenId: "/api/user/getUserByOpenId",
|
|
addUser: "/api/user/addUser",
|
|
getConfigAll: "/api/pic/getPicAll",
|
|
getAuthMd5Code: "/api/auth/getAuthMd5Code"
|
|
},
|
|
homePageData:{
|
|
tip: {
|
|
msg:"世上无难事,只要肯攀登。",
|
|
isShow:true,
|
|
level:2
|
|
},
|
|
swiper: {
|
|
background: [
|
|
{
|
|
type:"color",
|
|
background: "#0226",
|
|
text:"广告位1",
|
|
clickable:true,
|
|
action:"dialog",
|
|
content:"你点击了广告位1",
|
|
|
|
},
|
|
{
|
|
type:"image",
|
|
background: "",
|
|
mode:"scale",
|
|
text:"广告位2",
|
|
clickable:true,
|
|
action:"goto",
|
|
content:"/pages/utils/showImg/showImg"
|
|
|
|
},
|
|
{
|
|
type:"color",
|
|
background: "#A70",
|
|
text:"广告位3",
|
|
clickable:true,
|
|
action:"dialog",
|
|
content:"你点击了广告位3"
|
|
|
|
}
|
|
],
|
|
indicatorDots: true,
|
|
autoplay: true,
|
|
interval: 2000,
|
|
duration: 500,
|
|
vertical: false,
|
|
circular: true
|
|
},
|
|
pics: [
|
|
{
|
|
url:"https://img1.baidu.com/it/u=2172818577,3783888802&fm=253&app=138&f=JPEG?w=800&h=1422",
|
|
source:"LaiLab",
|
|
id:"1"
|
|
},
|
|
{
|
|
url:"https://hellorfimg.zcool.cn/provider_image/large/hi2241910533.jpg?x-image-process=image/format,webp",
|
|
source:"百度",
|
|
id:"2"
|
|
},
|
|
{
|
|
url:"https://c-ssl.dtstatic.com/uploads/blog/202403/13/0GSvde87c0G05zE.thumb.1000_0.jpg",
|
|
source:"百度",
|
|
id:"3"
|
|
},
|
|
{
|
|
url:"https://img0.baidu.com/it/u=3815152378,1770089461&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=1082",
|
|
source:"百度",
|
|
id:"4"
|
|
},
|
|
{
|
|
url:"https://img1.baidu.com/it/u=1046630760,1711311937&fm=253&app=138&f=JPEG?w=800&h=1428",
|
|
source:"百度",
|
|
id:"5"
|
|
},
|
|
{
|
|
url:"https://c-ssl.dtstatic.com/uploads/blog/202312/04/0GSvVw6Xt0exN0g.thumb.1000_0.jpg",
|
|
source:"百度",
|
|
id:"6"
|
|
},
|
|
{
|
|
url:"https://img0.baidu.com/it/u=41840629,336950107&fm=253&app=138&f=JPEG?w=500&h=1109",
|
|
source:"百度",
|
|
id:"7"
|
|
},
|
|
{
|
|
url:"https://hellorfimg.zcool.cn/provider_image/large/hi2241910533.jpg?x-image-process=image/format,webp",
|
|
source:"百度",
|
|
id:"8"
|
|
}
|
|
]
|
|
},
|
|
morePageData:{
|
|
tools: [
|
|
{
|
|
name:"Hello",
|
|
cards:[
|
|
{
|
|
title:"测试",
|
|
detail:"村上春树",
|
|
color:"#aaa",
|
|
icon:"../../static/icons/icon_qrcode.png",
|
|
url:""
|
|
|
|
}
|
|
|
|
]
|
|
},
|
|
],
|
|
}
|
|
|
|
},
|
|
|
|
onLaunch: function() {
|
|
console.log("=== LaiLab小程序主页 ===");
|
|
this.login();
|
|
},
|
|
methods: {
|
|
async login() {
|
|
const that = this;
|
|
const gData = this.globalData;
|
|
|
|
if (gData.hasUserInfo) {
|
|
console.log("已获取用户信息,跳过登录流程");
|
|
return;
|
|
}
|
|
|
|
console.log("未获取用户信息,开始获取");
|
|
|
|
try {
|
|
// 步骤1: 获取微信code
|
|
const step1Result = await this.getWechatCode();
|
|
|
|
// 步骤2: 获取用户信息
|
|
const step2Result = await this.getUserInfo();
|
|
|
|
// 步骤3: 获取OpenId
|
|
console.log(`3.调用方法 ${gData.method.getOpenId} 开始 入参: ${step1Result.code}`);
|
|
const openId = await userUtil.getOpenId(step1Result.code);
|
|
console.log(`3.调用方法 ${gData.method.getOpenId} 结束 返回: ${openId}`);
|
|
gData.openId = openId;
|
|
|
|
// 获取授权码
|
|
var requestData_getAuth = {
|
|
openId: gData.openId
|
|
};
|
|
console.log(`4.1 调用方法 ${gData.method.getAuthMd5Code} 开始 入参: ${JSON.stringify(requestData_getAuth)}`);
|
|
var authCode = await authUtil.getAuthMd5Code(requestData_getAuth)
|
|
console.log(`4.1 调用方法 ${gData.method.getAuthMd5Code} 结束 返回: ${authCode}`);
|
|
// 若用户未注册,则以下步骤将都无法进行,所以填充默认授权码
|
|
if(authCode===''||authCode===null){
|
|
authCode = gData.defaultAuthCode;
|
|
}
|
|
|
|
// 步骤4: 检查用户注册状态
|
|
var requestData_checkUser = {
|
|
openId: gData.openId,
|
|
authCode: authCode
|
|
};
|
|
console.log(`4.2 调用方法 ${gData.method.getUserByOpenId} 开始 入参: ${JSON.stringify(requestData_checkUser)}`);
|
|
const userData = await userUtil.checkUserStatus(requestData_checkUser);
|
|
console.log(`4.2 调用根据 ${gData.method.getUserByOpenId} 结束 返回: ${isexist}`);
|
|
const isexist = userData.data.code;
|
|
switch (isexist) {
|
|
case -1:
|
|
console.log("用户未注册");
|
|
this.handleUserNotRegistered();
|
|
break;
|
|
|
|
case -2:
|
|
console.error(`报错: ${userData.data.message}`);
|
|
this.toast(userData.data.message || "查询用户信息失败", 'error');
|
|
break;
|
|
|
|
case 0:
|
|
console.log(`用户已注册,自动登录!用户信息: ${JSON.stringify(userData.data.data)}`);
|
|
|
|
gData.userInfo = userData.data.data;
|
|
gData.hasUserInfo = true;
|
|
this.toast("自动登录成功", 'success');
|
|
break;
|
|
|
|
default:
|
|
console.warn(`4.未知状态码: ${isexist}`);
|
|
break;
|
|
}
|
|
|
|
} catch (error) {
|
|
console.error("登录流程失败:", error);
|
|
this.toast("登录失败,请重试", 'error');
|
|
}
|
|
},
|
|
|
|
// 步骤1: 获取微信code
|
|
getWechatCode() {
|
|
return new Promise((resolve, reject) => {
|
|
console.log("1.调用登录接口wx.login()开始");
|
|
|
|
uni.login({
|
|
success: function(res) {
|
|
console.log(`1.调用登录接口wx.login()结束 返回: ${JSON.stringify(res)}`);
|
|
console.log(`1.返回参数: code=${res.code}`);
|
|
resolve(res);
|
|
},
|
|
fail: function(res) {
|
|
console.error(`1.调用微信接口wx.login()失败 返回: ${JSON.stringify(res)}`);
|
|
reject(new Error("微信登录失败"));
|
|
}
|
|
});
|
|
});
|
|
},
|
|
|
|
// 步骤2: 获取用户信息
|
|
getUserInfo() {
|
|
return new Promise((resolve, reject) => {
|
|
console.log("2.调用用户信息接口wx.getUserInfo()开始");
|
|
|
|
uni.getUserInfo({
|
|
success: (res) => {
|
|
console.log("2.调用用户信息接口wx.getUserInfo()结束 返回:", res);
|
|
console.log("2.返回参数: userInfo=", res.userInfo);
|
|
resolve(res);
|
|
},
|
|
fail: (res) => {
|
|
console.error(`2.调用微信接口wx.getUserInfo()失败 返回: ${JSON.stringify(res)}`);
|
|
this.authorizeCheck("scope.userInfo");
|
|
reject(new Error("获取用户信息失败"));
|
|
}
|
|
});
|
|
});
|
|
},
|
|
|
|
// 处理用户未注册情况
|
|
handleUserNotRegistered() {
|
|
const that = this;
|
|
|
|
uni.showModal({
|
|
title: '提示',
|
|
content: '检测到您尚未登录,某些工具可能无权使用,请先去登录。',
|
|
confirmText: '去登陆',
|
|
cancelText: '取消',
|
|
success(res) {
|
|
if (res.confirm) {
|
|
console.log("用户选择去登录");
|
|
that.userLogin();
|
|
} else {
|
|
console.log("用户点击取消");
|
|
|
|
}
|
|
}
|
|
});
|
|
},
|
|
|
|
// 用户登录(手动)
|
|
async userLogin() {
|
|
const that = this;
|
|
const gData = this.globalData;
|
|
|
|
// 若用户未登录
|
|
if (!gData.hasUserInfo) {
|
|
this.toast("正在登录", 'loading');
|
|
|
|
try {
|
|
// 获取详细用户信息
|
|
const profile = await this.getUserProfileWithDesc();
|
|
|
|
gData.hasUserInfo = true;
|
|
gData.userInfo = profile.userInfo;
|
|
|
|
this.toast("登录成功", 'success');
|
|
|
|
// 注册用户
|
|
if (gData.openId) {
|
|
console.log(`4.3 调用 ${gData.method.addUser} 开始 入参: ${profile.userInfo}`);
|
|
const result = await userUtil.registerUser(profile.userInfo);
|
|
console.log(`4.3 调用 ${gData.method.addUser} 结束 返回: ${result}`);
|
|
|
|
} else {
|
|
console.warn("没有OpenId,无法注册用户");
|
|
this.toast("登录异常,请重新进入小程序", 'error');
|
|
return;
|
|
}
|
|
|
|
// 跳转到个人中心
|
|
uni.switchTab({
|
|
url: '/pages/mine/mine'
|
|
});
|
|
|
|
} catch (error) {
|
|
console.error("用户登录失败:", error);
|
|
this.toast(error.message || "登录失败", 'error');
|
|
}
|
|
} else {
|
|
this.toast("您已经登录", 'none');
|
|
}
|
|
},
|
|
|
|
// 获取用户详细信息(带描述)
|
|
getUserProfileWithDesc() {
|
|
return new Promise((resolve, reject) => {
|
|
uni.getUserProfile({
|
|
desc: "获取你的昵称、头像、地区及性别",
|
|
success: resolve,
|
|
fail: (res) => {
|
|
reject(new Error("您拒绝了授权请求"));
|
|
}
|
|
});
|
|
});
|
|
},
|
|
|
|
|
|
// 授权检查
|
|
authorizeCheck(scope) {
|
|
console.log(`检查授权: ${scope}`);
|
|
|
|
uni.authorize({
|
|
scope: scope,
|
|
success: () => {
|
|
console.log(`${scope} 授权成功`);
|
|
},
|
|
fail: () => {
|
|
console.log(`${scope} 授权失败`);
|
|
this.toast("需要授权才能使用完整功能", 'none');
|
|
}
|
|
});
|
|
},
|
|
|
|
// Toast提示
|
|
toast(title, icon = 'none', duration = 2000) {
|
|
uni.showToast({
|
|
title: title,
|
|
icon: icon,
|
|
duration: duration
|
|
});
|
|
},
|
|
|
|
// 分享相关方法(保留原有逻辑)
|
|
getRandomShareTitle: function() {
|
|
var arr = [];
|
|
|
|
if (this.globalData.shareapptext) {
|
|
arr = this.globalData.shareapptext;
|
|
}
|
|
|
|
return arr[Math.floor(Math.random() * arr.length)];
|
|
},
|
|
|
|
getMainAppShare: function() {
|
|
return {
|
|
title: this.getRandomShareTitle(),
|
|
path: '/pages/index/index',
|
|
success: function(res) {
|
|
console.log("分享成功");
|
|
},
|
|
fail: function(res) {
|
|
console.log("分享失败");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style>
|
|
/* 每个页面公共css */
|
|
uni-page-body,
|
|
html,
|
|
body {
|
|
height: 100%;
|
|
}
|
|
</style> |