ertonglianxibiao/pages/login/login.js

221 lines
5.4 KiB
JavaScript
Raw Normal View History

2026-01-14 15:33:15 +08:00
import { injectPage, gatewayHttpClient } from '@jdmini/api'
const api = require('../../utils/api.js')
const defaultAvatarUrl = 'https://mmbiz.qpic.cn/mmbiz/icTdbqWNOwNRna42FI242Lcia07jQodd2FJGIYQfG0LAJGFxM4FbnQP6yfMxBgJ0F3YRqJCJ1aPAK2dQagdusBZg/0'
Page(injectPage({})({
data: {
avatarUrl: defaultAvatarUrl,
nickname: '',
isLoading: false,
loginSuccess: false,
btnText: '完成登录',
btnIcon: '✓',
canSubmit: false
},
onLoad(options) {
// 检查是否已登录
const userId = wx.getStorageSync('userId');
if (userId) {
// 已登录,检查是否有返回页面
this.navigateBack();
return;
}
// 保存来源页面信息
if (options.from) {
this.setData({
fromPage: options.from
});
}
// 设置默认头像并检查提交状态
this.checkCanSubmit();
},
// 选择头像
onChooseAvatar(e) {
const { avatarUrl } = e.detail;
this.setData({
avatarUrl: avatarUrl
}, () => {
this.checkCanSubmit();
});
},
// 输入昵称
onNicknameInput(e) {
this.setData({
nickname: e.detail.value
}, () => {
this.checkCanSubmit();
});
},
// 检查是否可以提交
checkCanSubmit() {
const { avatarUrl, nickname } = this.data;
// 检查是否选择了自定义头像(非默认头像)和填写了昵称
const hasCustomAvatar = avatarUrl && avatarUrl !== defaultAvatarUrl;
const hasNickname = nickname && nickname.trim().length > 0;
const canSubmit = hasCustomAvatar && hasNickname;
this.setData({
canSubmit: canSubmit
});
},
// 处理登录
async handleLogin() {
const { avatarUrl, nickname, isLoading } = this.data;
if (isLoading) {
return;
}
// 检查头像是否已授权(是否选择了非默认头像)
const hasCustomAvatar = avatarUrl && avatarUrl !== defaultAvatarUrl;
// 检查昵称是否已填写
const hasNickname = nickname && nickname.trim().length > 0;
// 验证授权状态
if (!hasCustomAvatar && !hasNickname) {
wx.showToast({
title: '请先授权头像,再点授权昵称',
icon: 'none',
duration: 2500
});
return;
}
if (!hasCustomAvatar) {
wx.showToast({
title: '头像未授权',
icon: 'none',
duration: 2000
});
return;
}
if (!hasNickname) {
wx.showToast({
title: '昵称未授权',
icon: 'none',
duration: 2000
});
return;
}
// 开始登录
this.setData({
isLoading: true,
btnText: '登录中...',
btnIcon: '⏳'
});
// 获取 app.js 中通过 waitLogin 已经获取的第三方登录信息
const app = getApp();
const openid = app.globalData.openid;
const wxUserInfo = app.globalData.wxUserInfo || wx.getStorageSync('jdwx-userinfo');
if (!openid && !wxUserInfo) {
this.handleLoginError('获取登录信息失败,请重启小程序');
return;
}
//上传头像到图片服务
const JDavatarUrl= await gatewayHttpClient.uploadAvatar(avatarUrl)
console.log(JDavatarUrl.data)
// 使用 openid 进行登录
const finalOpenid = openid || wxUserInfo.openId;
this.performLogin(finalOpenid, nickname.trim(), JDavatarUrl.data);
},
// 执行登录请求
performLogin(openid, nickname, avatarUrl) {
// 获取邀请人ID
const inviterId = wx.getStorageSync('inviterId') || getApp().globalData.inviterId || null
// 调用后端登录接口
api.userLogin(openid, nickname, avatarUrl, inviterId).then(result => {
// 清除邀请人ID只在注册时使用一次
wx.removeStorageSync('inviterId')
// 保存用户信息
wx.setStorageSync('userId', result.data.user.id);
wx.setStorageSync('token', result.data.token);
wx.setStorageSync('userInfo', {
nickname: result.data.user.nickname,
avatar: result.data.user.avatar,
points: result.data.user.points
});
// 更新按钮状态
this.setData({
isLoading: false,
loginSuccess: true,
btnText: '登录成功',
btnIcon: '✓'
});
// 延迟跳转
setTimeout(() => {
this.navigateBack();
}, 1000);
}).catch(err => {
console.error('登录失败', err);
this.handleLoginError(err.message || '登录失败,请重试');
});
},
// 处理登录错误
handleLoginError(message) {
wx.showToast({
title: message,
icon: 'none'
});
this.setData({
isLoading: false,
btnText: '完成登录',
btnIcon: '✓'
});
},
// 导航返回
navigateBack() {
// 检查是否有存储的返回信息
const returnTo = wx.getStorageSync('returnTo');
if (returnTo) {
// 清除存储的返回信息
wx.removeStorageSync('returnTo');
// 根据返回类型进行跳转
if (returnTo.type === 'switchTab') {
wx.switchTab({
url: returnTo.url
});
} else if (returnTo.type === 'redirectTo') {
wx.redirectTo({
url: returnTo.url
});
} else {
wx.navigateTo({
url: returnTo.url
});
}
} else if (this.data.fromPage) {
// 使用URL参数中的来源页面
wx.navigateBack();
} else {
// 默认返回首页
wx.switchTab({
url: '/pages/index/index'
});
}
}
}))