221 lines
5.4 KiB
JavaScript
221 lines
5.4 KiB
JavaScript
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'
|
||
});
|
||
}
|
||
}
|
||
}))
|