his-weapp/pages/login/index.js
2026-01-15 15:05:29 +08:00

357 lines
8.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// pages/login/index.js
const { userApi } = require("../../utils/api");
const AuthUtil = require("../../utils/auth");
Page({
/**
* 页面的初始数据
*/
data: {
username: "",
password: "",
loading: false,
wechatLoading: false, // 微信登录加载状态
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
// 检查是否已登录
this.checkLoginStatus();
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
// 每次页面显示时也检查登录状态
this.checkLoginStatus();
},
// 检查登录状态
checkLoginStatus() {
// 获取全局应用实例
const app = getApp();
// 如果全局状态显示已登录,则自动跳转到首页
if (app.globalData.isLoggedIn && app.globalData.userInfo) {
wx.switchTab({
url: "/pages/surgery/index"
});
} else {
// 检查是否有token
if (AuthUtil.hasToken()) {
this.autoLogin();
}
}
},
// 尝试自动登录
async autoLogin() {
this.setData({ loading: true });
try {
const isValid = await AuthUtil.validateUser();
if (isValid) {
const userInfo = AuthUtil.getUserInfo();
// 立即更新全局状态
const app = getApp();
app.globalData.isLoggedIn = true;
app.globalData.userInfo = userInfo;
// 显示提示
wx.showToast({
title: "自动登录成功",
icon: "success",
duration: 1000
});
// 启动token自动刷新
AuthUtil.startTokenRefresh();
// 立即跳转到首页
// 先尝试隐藏 toast避免影响跳转
wx.hideToast();
wx.switchTab({
url: "/pages/surgery/index",
success: () => {
},
fail: (err) => {
// 如果 switchTab 失败,尝试使用 reLaunch
wx.reLaunch({
url: "/pages/surgery/index",
success: () => {
},
fail: (reLaunchErr) => {
}
});
},
});
} else {
// 自动登录失败,已清除登录状态
}
} catch (err) {
// 自动登录异常
} finally {
this.setData({ loading: false });
}
},
// 用户名输入变化
onUsernameChange(e) {
this.setData({
username: e.detail.value,
});
},
// 密码输入变化
onPasswordChange(e) {
this.setData({
password: e.detail.value,
});
},
// 跳转到设备状态页面
goToDeviceStatus() {
wx.navigateTo({
url: '/pages/device_status/index',
});
},
// 微信一键登录
handleWechatLogin() {
this.setData({ wechatLoading: true });
// 调用微信登录
wx.login({
success: (res) => {
if (res.code) {
// 获取用户信息(可选)
wx.getUserProfile({
desc: '用于完善用户资料',
success: (userRes) => {
// 调用后端API进行微信登录
this.performWechatLogin(res.code, userRes.userInfo.nickName);
},
fail: () => {
// 用户拒绝授权使用code进行登录不带昵称
this.performWechatLogin(res.code);
}
});
} else {
wx.showToast({
title: '获取微信授权失败',
icon: 'none'
});
this.setData({ wechatLoading: false });
}
},
fail: (err) => {
wx.showToast({
title: '微信登录调用失败',
icon: 'none'
});
this.setData({ wechatLoading: false });
}
});
},
// 执行微信登录
performWechatLogin(code, nickname = null) {
userApi.miniLogin(code, nickname)
.then((res) => {
if (res.code === 1 || res.code === 200) {
// 登录成功保存token和用户信息
const { token, user } = res.data;
AuthUtil.setToken(token);
AuthUtil.setUserInfo(user);
// 启动token自动刷新
AuthUtil.startTokenRefresh();
// 立即更新全局状态
const app = getApp();
app.globalData.isLoggedIn = true;
app.globalData.userInfo = user;
wx.showToast({
title: "微信登录成功",
icon: "success",
duration: 1000
});
// 立即跳转到首页
// 先尝试隐藏 toast避免影响跳转
wx.hideToast();
wx.switchTab({
url: "/pages/surgery/index",
success: () => {
},
fail: (err) => {
// 如果 switchTab 失败,尝试使用 reLaunch
wx.reLaunch({
url: "/pages/surgery/index",
success: () => {
},
fail: (reLaunchErr) => {
}
});
},
});
} else {
// 登录失败
wx.showToast({
title: res.msg || "微信登录失败",
icon: "none",
});
}
})
.catch((err) => {
wx.showToast({
title: err.message || "微信登录失败,请稍后重试",
icon: "none",
});
})
.finally(() => {
this.setData({ wechatLoading: false });
});
},
// 处理登录
handleLogin() {
const { username, password } = this.data;
// 基本表单验证
if (!username.trim()) {
wx.showToast({
title: "请输入用户名",
icon: "none",
});
return;
}
if (!password.trim()) {
wx.showToast({
title: "请输入密码",
icon: "none",
});
return;
}
// 显示加载状态
this.setData({ loading: true });
// 调用登录API
userApi
.login(username, password)
.then((res) => {
// 检查登录是否成功(支持 code: 1 或 code: 200
if (res.code !== 1 && res.code !== 200) {
wx.showToast({
title: res.msg || "用户名或密码错误",
icon: "none",
});
this.setData({ loading: false });
return;
}
// 检查用户状态(小程序允许状态>=1的用户登录
if (res.data.user.user_status < 1) {
wx.showToast({
title: "您的账户已被禁用或需要等待管理员审核",
icon: "none",
});
this.setData({ loading: false });
return;
}
// 登录成功保存token
const { token, user } = res.data;
AuthUtil.setToken(token);
AuthUtil.setUserInfo(user);
// 启动token自动刷新
AuthUtil.startTokenRefresh();
// 立即更新全局状态
const app = getApp();
app.globalData.isLoggedIn = true;
app.globalData.userInfo = user;
wx.showToast({
title: "登录成功",
icon: "success",
duration: 1000
});
// 登录成功后立即导航到首页
// 先尝试隐藏 toast避免影响跳转
wx.hideToast();
wx.switchTab({
url: "/pages/surgery/index",
success: () => {
},
fail: (err) => {
// 如果 switchTab 失败,尝试使用 reLaunch
wx.reLaunch({
url: "/pages/surgery/index",
success: () => {
},
fail: (reLaunchErr) => {
}
});
},
});
})
.catch((err) => {
wx.showToast({
title: err.message || "登录失败,请稍后重试",
icon: "none",
});
})
.finally(() => {
this.setData({ loading: false });
});
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {},
});