跳到主要内容

用户认证流程分析文档

文档概述

本文档详细分析邮轮穿舱件管理系统小程序端的用户认证流程,涵盖登录、验证码登录、用户绑定和密码重置四个核心模块。通过分析相关页面的代码结构、接口调用和加密处理,提供完整的认证流程可视化。

认证架构概览

系统组件关系图

flowchart TD
A[用户界面] --> B[认证页面]
B --> C[API接口层]
C --> D[后端服务]
B --> E[加密工具]
B --> F[本地存储]

subgraph 认证页面
G[login页面]
H[loginCode页面]
I[bindUser页面]
J[forgetPassword页面]
end

subgraph API接口层
K[request.js]
L[bindUser.js]
end

subgraph 工具层
M[crypto.js]
N[本地存储管理]
end

G --> K --> D
H --> K --> D
I --> L --> D
J --> K --> D
G --> M
I --> N

认证流程总览

系统提供四种认证方式:

  1. 密码登录 - 传统用户名密码认证
  2. 微信授权登录 - 基于微信开放平台的快速登录
  3. 验证码登录 - 手机验证码认证
  4. 账户绑定 - 微信用户与系统账户关联

登录页面分析

页面功能结构

登录页面(login.js)提供两种登录方式:密码登录和微信授权登录。

核心数据模型

data: {
passwordInfo: {
account: '', // 用户名
password: '', // 密码
},
radioValue: '', // 协议选择状态
isCheck: false, // 是否同意协议
isPasswordSubmit: false, // 提交按钮状态
}

密码登录流程

sequenceDiagram
participant U as 用户
participant L as Login页面
participant W as 微信API
participant S as 后端服务
participant ST as 本地存储

U->>L: 输入账号密码
L->>L: 验证表单数据
U->>L: 点击登录
L->>W: wx.login()获取code
W-->>L: 返回code
L->>S: POST /wechat/loginWithUsrPwd
Note over L,S: {username, password, code}
S-->>L: 返回access_token
L->>ST: wx.setStorageSync('access_token')
L->>U: 跳转到个人中心

关键代码实现

// 密码登录核心逻辑
async passwordLogin() {
const loginRes = await wx.login();
const res = await request('/wechat/loginWithUsrPwd', 'post', {
username: this.data.passwordInfo.account,
password: this.data.passwordInfo.password,
code: loginRes.code
});
await wx.setStorageSync('access_token', res.access_token);
wx.switchTab({ url: `/pages/my/index` });
}

微信授权登录流程

sequenceDiagram
participant U as 用户
participant L as Login页面
participant W as 微信API
participant S as 后端服务

U->>L: 点击微信登录
L->>W: wx.login()获取code
W-->>L: 返回code
L->>S: POST /wechat/loginWithAutoRegister
Note over L,S: {code}
S-->>L: 返回access_token
L->>U: 自动注册并登录

关键代码实现

// 微信授权登录
async wechatLogin() {
const loginRes = await wx.login();
const res = await request('/wechat/loginWithAutoRegister', 'post', {
code: loginRes.code,
});
await wx.setStorageSync('access_token', res.access_token);
wx.switchTab({ url: `/pages/my/index` });
}

验证码登录页面分析

页面功能结构

验证码登录页面(loginCode.js)提供基于手机验证码的快速登录方式。

核心数据模型

data: {
phoneNumber: '', // 手机号码
sendCodeCount: 60, // 验证码发送倒计时
verifyCode: '', // 验证码
}

验证码登录流程

sequenceDiagram
participant U as 用户
participant LC as LoginCode页面
participant S as 后端服务
participant ST as 本地存储

U->>LC: 输入手机号获取验证码
LC->>S: 发送验证码到手机
U->>LC: 输入收到的验证码
LC->>S: GET /login/postCodeVerify
Note over LC,S: {code: verifyCode}
S-->>LC: 返回token
LC->>ST: 存储access_token
LC->>U: 跳转到个人中心

关键代码实现

async login() {
const res = await request('/login/postCodeVerify', 'get', {
code: this.data.verifyCode
});
if (res.success) {
await wx.setStorageSync('access_token', res.data.token);
wx.switchTab({ url: `/pages/my/index` });
}
}

用户绑定页面分析

页面功能结构

用户绑定页面(bindUser/index.js)用于将微信用户与系统账户进行关联绑定。

核心数据模型

data: {
currentUser: { // 当前用户信息
id: null,
username: '',
email: '',
openid: '',
// ...其他字段
},
bindForm: { // 绑定表单数据
username: '',
password: ''
},
isUnbound: false, // 是否未绑定状态
showBindForm: false // 是否显示绑定表单
}

账户绑定流程

sequenceDiagram
participant U as 用户
participant BU as BindUser页面
participant W as 微信API
participant S as 后端服务
participant ST as 本地存储

BU->>S: GET /miniapp/user/userProfile
S-->>BU: 返回用户信息
alt 已绑定用户
BU->>U: 显示"已绑定"提示
else 未绑定用户
BU->>U: 显示绑定表单
U->>BU: 输入用户名密码
BU->>W: wx.login()获取code
W-->>BU: 返回code
BU->>S: POST /miniapp/bind
Note over BU,S: {username, password, code}
S-->>BU: 绑定成功
BU->>ST: 清除本地token
BU->>U: 跳转回登录页
end

关键绑定逻辑

async onBindAccount() {
const loginRes = await wx.login();
const res = await request('/miniapp/bind', 'post', {
username: bindData.target_username,
password: bindData.password,
code: loginRes.code
});

if (res) {
wx.removeStorageSync('access_token');
wx.reLaunch({ url: '/pages/login/index' });
}
}

未绑定状态检测

系统通过用户名前缀UNBIND_来识别未绑定账户:

checkUnboundStatus(username) {
return username && username.startsWith('UNBIND_');
}

密码重置页面分析

页面功能结构

密码重置页面(forgetPassword/index.js)提供通过邮箱或手机重置密码的功能。

核心数据模型

data: {
account: '', // 账号(邮箱或手机)
loading: false // 加载状态
}

密码重置流程

sequenceDiagram
participant U as 用户
participant FP as ForgetPassword页面
participant S as 后端服务

U->>FP: 输入邮箱或手机号
FP->>FP: 验证账号格式
alt 格式正确
FP->>S: POST /login/forgetPassword
Note over FP,S: {account, type}
S-->>FP: 发送重置链接
FP->>U: 显示发送成功提示
else 格式错误
FP->>U: 显示错误提示
end

关键代码实现

async sendResetLink() {
const isEmail = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(this.data.account);
const isPhone = /^[1][3,4,5,7,8,9][0-9]{9}$/.test(this.data.account);

const res = await request('/login/forgetPassword', 'post', {
data: {
account: this.data.account,
type: isEmail ? 'email' : 'phone',
},
});
}

API接口层分析

请求封装模块

系统使用统一的请求封装(request.js)处理所有HTTP请求:

核心功能特性

  • 自动Token管理:自动从本地存储获取并添加Authorization头
  • 统一错误处理:标准化错误响应格式
  • Mock支持:支持模拟数据延迟
function request(url, method = 'GET', data = {}) {
const header = { 'content-type': 'application/json' };
const tokenString = wx.getStorageSync('access_token');
if (tokenString) {
header.Authorization = `Bearer ${tokenString}`;
}

return new Promise((resolve, reject) => {
wx.request({
url: baseUrl + url,
method,
data,
header,
success(res) {
if (res.statusCode === 200 || res.statusCode === 201) {
resolve(res.data);
} else {
reject({
statusCode: res.statusCode,
message: res.data?.detail || '请求失败',
data: res.data
});
}
}
});
});
}

用户绑定API模块

bindUser.js提供专门的用户绑定相关接口:

// 获取当前用户信息
export const getCurrentUser = () => {
return request({
url: '/api/user/current',
method: 'GET'
});
};

// 绑定系统账户
export const bindAccount = (data) => {
return request({
url: '/api/bind/account',
method: 'POST',
data
});
};

加密处理分析

MD5加密实现

系统使用自定义的MD5加密函数处理敏感数据:

flowchart LR
A[原始字符串] --> B[MD5加密]
B --> C[32位哈希值]
B --> D[密码验证]

加密算法结构

export function md5(str) {
// MD5核心算法实现
function rotateLeft(value, amount) {
const lbits = (value << amount) | (value >>> (32 - amount));
return lbits;
}

function F(x, y, z) { return (x & y) | ((~x) & z); }
function G(x, y, z) { return (x & z) | (y & (~z)); }
function H(x, y, z) { return (x ^ y ^ z); }
function I(x, y, z) { return (y ^ (x | (~z))); }

// ... 完整的MD5算法实现
}

认证状态管理

Token生命周期管理

stateDiagram-v2
[*] --> 未认证
未认证 --> 认证中 : 开始登录
认证中 --> 已认证 : 登录成功
已认证 --> 令牌过期 : token过期
令牌过期 --> 认证中 : 重新认证
已认证 --> [*] : 用户登出
认证中 --> 未认证 : 登录失败

本地存储策略

  • access_token:存储在wx.setStorageSync('access_token')
  • 自动携带:通过request.js自动添加到请求头
  • 安全清除:绑定成功后自动清除旧token

安全考虑与最佳实践

安全机制

  1. 微信Code保护:使用一次性code防止重放攻击
  2. Token自动管理:避免手动处理认证头
  3. 输入验证:客户端和服务端双重验证
  4. 错误信息模糊:不暴露具体错误细节

性能优化

  • 异步处理:所有认证操作均为异步非阻塞
  • 本地缓存:合理使用本地存储减少网络请求
  • 错误恢复:完善的错误处理和用户引导

索引

邮轮穿舱件管理系统的认证架构设计合理,提供了完整的用户认证解决方案。系统通过四种不同的认证方式满足不同用户需求,结合微信生态提供了便捷的登录体验。API层设计规范,加密处理完善,具备良好的安全性和可维护性。

核心优势

  • 多认证方式覆盖全面使用场景
  • 微信生态深度集成
  • 统一的错误处理和状态管理
  • 完善的用户绑定机制

改进建议

  • 可考虑增加生物识别认证支持
  • 强化密码策略和复杂度要求
  • 增加登录日志和异常检测