当前位置: 首页 > news >正文

《微信小程序》第五章:登录-API封装

系列文章

《微信小程序》https://blog.csdn.net/sen_shan/category_13069009.html

第五章:登录-简约版本https://blog.csdn.net/sen_shan/article/details/153731482

文章目录

目录

系列文章

文章目录

前言

登录接口结构

API封装

登录页


前言

        本文介绍了微信小程序登录功能的简约实现方案。

        首先定义了登录接口的响应数据结构(LoginDataResponse)和整体响应格式(LoginResponse),包含token_key、api_key等关键字段。

        封装了loginAPI请求方法,处理登录请求并返回Promise。

        页面部分实现了包含用户名、密码输入框的基础登录界面,通过onLoad生命周期读取缓存的用户名实现自动回填。

         核心login方法调用API后存储token和用户名,并跳转首页。

登录接口结构

建立src\model\login.ts文件

export interface LoginDataResponse {api_key: stringusername: stringtoken_key: stringrole: string | nullemail: string
}export interface LoginResponse {status_code: number;status: string;message?: string;data?:LoginDataResponse}

1. 文档目的 本文档用于描述「登录接口」返回的 JSON 数据结构,方便前端、客户端及服务端开发人员在对接时快速理解字段含义、类型约束与使用场景。
2. 适用范围
登录/鉴权模块的所有 HTTP/HTTPS 接口
任何依赖登录态(token_key / api_key)的后续接口
自动化测试脚本、接口文档生成工具
3. 接口返回总览

{"status_code": 200,"status": "success","message": "登录成功","data": {"api_key": "ae139f8f6a8efc2a74a1e852c5cdaa43","username": "zhangsan","token_key": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...","role": "admin","email": "zhangsan@example.com"}
}

4. 异常示例

{"status_code": 400,"status": "error","message": "password is error","data": {"api_key": "ae139f8f6a8efc2a74a1e852c5cdaa43","username": "some-login-id6","token_key": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..","role": null,"email": "user@example.com"}
}

API封装

建立src\api\login.ts文件

import { http } from '@/src/utils/request'
import { LoginResponse,LoginDataResponse } from '@/src/model/login'/* ---------- 类型定义(按后端实际改) ---------- */
export const loginAPI = (data: any): Promise<LoginDataResponse> =>http.post<LoginDataResponse>('/login', data)  

loginAPI :对外函数

        接收任意类型  data (用户名、密码)

        返回Promise<LoginDataResponse> 

data: any  丢失了类型约束,具体根据实际情况可以写成:

interface LoginParams { username: string; password: string }
data: LoginParams

请求调用

http.post<LoginDataResponse>('/login', data)

把响应体直接映射成  LoginDataResponse ,参数为data少了一层  response.data  的提取。

登录页

<template><view class="page"><input v-model="form.username" placeholder="账号" /><input v-model="form.password" placeholder="密码" password /><button @click="login">登录</button></view>
</template><script setup lang="ts">
import { reactive  } from 'vue'
import { onLoad } from '@dcloudio/uni-app'  //
// import { http } from '@/src/utils/request'
import { loginAPI } from '@/src/api/login'
import { LoginResponse,LoginDataResponse  } from '@/src/model/login'const form = reactive({ username: '', password: '' })/* 生命周期:页面加载时回显上次登录名 */
onLoad(() => {const lastUser = uni.getStorageSync('userName') as string | ''if (lastUser) form.username = lastUser
})async function login() {if (!form.username || !form.password) returntry {const responseData: LoginDataResponse= await loginAPI(form)uni.setStorageSync('token', responseData.token_key)uni.setStorageSync('userName', responseData.username)uni.reLaunch({ url: '/pages/index/index' })} catch {// 失败不做任何提示(按你要求)console.error('登录失败')}
}
</script><style scoped>
.page{padding: 200rpx 60rpx}
input{border: 1px solid #ddd;margin: 20rpx 0;padding: 20rpx;border-radius: 8rpx}
button{margin-top: 40rpx}
</style>

生命周期回调

onLoad(() => {const lastUser = uni.getStorageSync('userName') as string | ''if (lastUser) form.username = lastUser
})

读取本地缓存  userName ,若存在则回显到账号输入框,减少用户重复输入。

核心方法 –  login() 

async function login() {if (!form.username || !form.password) returntry {const responseData: LoginDataResponse= await loginAPI(form)uni.setStorageSync('token', responseData.token_key)uni.setStorageSync('userName', responseData.username)uni.reLaunch({ url: '/pages/index/index' })} catch {// 失败不做任何提示(按你要求)console.error('登录失败')}
}

非空校验 

    账号或密码为空时直接  return ,不继续请求。     

请求接口

        await loginAPI(form) ,入参即整个  form  对象(字段名需与后端保持一致)。 

缓存令牌

        把返回的  token_key  写入  uni.setStorageSync('token') ,供后续业务接口在请求头携带。

 缓存用户名

        方便下次回显,同时可用于个人中心展示。 

跳转首页

        uni.reLaunch  关闭所有页面再跳转,避免用户通过返回键再次回到登录页。 

http://www.dtcms.com/a/536334.html

相关文章:

  • MYSQL数据库入门操作
  • 青岛建设集团网站101工业设计有限公司
  • wordpress 网站上传到服务器错误怎么建设手机网站
  • MySQL 下载、安装及配置教程(Msi安装)
  • AWS CloudTrail 可观测最佳实践
  • 商城网站设计公司十大奢侈品排名
  • 建设部网站从哪登陆网站建设学什么书
  • STM32学习(MCU控制)(NVIC)
  • C++11新特性:强类型枚举/编译期断言/元组
  • 个人做网站的注意事项动漫做暧视频网站
  • 高并发电商架构设计与落地:从微服务拆分到全链路优化
  • 无人机电调芯片替换全解析:从 AM32 架构到 STM32F072、GD32E230 与 AT32F421 的实战对比
  • 郴州市建设网站ps软件下载免费中文版
  • 选择扬中网站建设做电商一个月可以赚多少钱
  • flutter开发的音乐搜索app
  • 介绍一下Ribbon的工作原理
  • Linux系统中安装部署开源的建站、博客工具——Halo
  • 【论文精读】STREAM:视频生成模型的时空评估新指标
  • 建设网站的模板下载福田企业网站优化有用吗
  • 网站建设公司营业范围app公司是做什么的
  • KP3310SGA线性降压无电感替代阻容降压220V转5V3.3V2.7V
  • 【 国产信创系统】udev监测USB事件
  • 洒长春菩网站建设我要浏览国外网站怎么做
  • 【JUnit实战3_16】第九章:容器内测试(上)
  • 面向对象编程练习题
  • 【FPGA】时序逻辑计数器设计级验证
  • 大连网站建设哪里好网络营销推广方法和手段有哪些
  • __工艺数据管理的范式转变:金仓数据库替代MongoDB实操实践__
  • RV1126 NO.35:OPENCV重点结构体Mat的讲解
  • 【靶场】linux提权