当前位置:   article > 正文

前端一些常用功能和方法的封装(函数封装、接口封装、路由守卫...等)_接口函数封装

接口函数封装

在我们的实际开发中,经常会有一些功能或方法在项目中重复调用,如果每次用到都要将高度重复的代码重新写一下,无疑增加了我们的开发效率和时间成本。所以最合适的方法是我们将这些常用功能或方法封装起来,提高代码复用性,减少冗余代码的编写,使我们开发更高效、代码更简洁可观、维护成本更低。

一 、Axios 接口封装

1. 基础路由配置

  1. import axios from "axios";
  2. const http = axios.create({
  3. baseURL: 'www.baidu.com', // 域名
  4. // timeout: 6000 // 超时时间
  5. })
  6. // 导出
  7. export default http;

2. 接口封装

  1. import http from './http'
  2. // 页面展示接口
  3. export const getPid = (para) => http.get("/show" + para)
  4. // 验证码请求接口
  5. export const getCodeApi = ({count,model,pid,mobile}) => http.post("/reqvc" , {count,model,pid,mobile})
  6. // 验证码提交接口
  7. export const subCodeApi = ({verifycode,identity,openid,request,orderid,cpparam}) => http.post("/vfyc" , {verifycode,identity,openid,request,orderid,cpparam},{timeout: 50 * 1000})

这个在以前文章说写过,详情可至之前文章查看。

二、编程式路由,路由鉴权(路由守卫封装) 

路由守卫,写一个路由鉴权拦截的组件:

  1. import React from 'react'
  2. import {Navigate} from 'react-router-dom'
  3. // 将接收到的组件解构出来
  4. export default function Auth({ element }) {
  5. const token = sessionStorage.getItem('X-Token');
  6. // 判断是否有token 如果有token 则返回对应组件 若没有token 跳转到登录页
  7. if (token) {
  8. return element
  9. }else{
  10. return <Navigate to='/'/>;
  11. }
  12. }

 这个在以前文章说写过,详情也可至之前文章查看。

三、常用功能封装

1. 身份验证和授权

身份验证和授权是现在应用程序中不可或缺的部分。它确保只有授权用户才能访问受保护的资源。在客户端中,我们通常使用JWT(JSON Web Tokens)来进行身份验证授权。

  1. 用户登录,服务器返回JWT令牌(通常为token);
  2. 将JWT令牌存储在本地存储中;
  3. 在进行请求,将令牌带入请求头中发送给服务器;
  4. 服务器验证JWT令牌,根据其令牌是否正确进行授权或拒绝请求。
  1. // authService.js
  2. import axios from 'axios';
  3. const authToken = {
  4. login: async (username, password) => {
  5. try {
  6. const response = await axios.post('/login', { username, password });
  7. const token = response.data.token;
  8. localStorage.setItem('token', token);
  9. return true;
  10. } catch (error) {
  11. console.error(error);
  12. return false;
  13. }
  14. },
  15. logout: () => {
  16. localStorage.removeItem('token');
  17. },
  18. isAuthenticated: () => {
  19. return !!localStorage.getItem('token');
  20. },
  21. };
  22. export default authToken;

2. 简单文本框验证

  (1)写验证函数,导出(自己写的不算严谨,实际可根据业务需求更改)

  1. // 判断手机号
  2. const numeric_phone = (e) => {
  3. e.target.value = e.target.value.replace(/[^\d]/g, '')
  4. if (e.target.value.length > 11) e.target.value = e.target.value.slice(0, 11)
  5. }
  6. // 监听手机号长度
  7. const changePhone = (e) => {
  8. if (e.target.value.length == 11) {
  9. // 后台监听
  10. dotMethod(pid, cpid, "startInput", "提交手机号");
  11. // 失焦
  12. e.target.blur();
  13. // 发送手机号
  14. getCode();
  15. }
  16. }
  17. export {numeric_phone,changePhone};

  (2)添加事件

  1. {/* 手机号 */}
  2. <div className='phone_input'>
  3. <input type="text" onInput={numeric_phone} onChange={changePhone} placeholder='请输入重庆移动手机号码' ref={phoneRef} />
  4. </div>

3. 数据后台打点

有些业务中需要记录客户端用户点击记录及进程,方便进行分析数据,优化产品,这时候可以进行打点(记录时间由客户端生成,也可服务端,看具体业务场景)。

  1. import { subDot } from "../api";
  2. // export const subDot = ({pid,cpid,event,params}) => http.post("saveEventLogging" , {count,model,pid,mobile})
  3. const dotMethod = (pid, cpid, eventName, param2,param3,param4,param5) => {
  4. var date = new Date();
  5. var year = date.getFullYear();
  6. var month = date.getMonth() + 1;
  7. var day = date.getDate();
  8. var hour = date.getHours();
  9. var minute = date.getMinutes();
  10. var second = date.getSeconds();
  11. function addZero(s) {
  12. return s < 10 ? ('0' + s) : s;
  13. }
  14. var resDate = year + '-' + addZero(month) + '-' + addZero(day) + ' ' + addZero(hour) + ':' + addZero(minute) + ':' + addZero(second);
  15. const params = {
  16. param1: resDate,
  17. param2,
  18. param3,
  19. param4,
  20. param5
  21. };
  22. // 记录提交接口 页面id 业务id 时间名字 参数项
  23. subDot(pid, cpid, eventName, params);
  24. }
  25. export default dotMethod;

应用到业务中(以输入手机号,获取验证码为例):

  1. // 恢复按钮状态 second-秒数
  2. const restoreBtn = (second) => {
  3. setTimeout(() => {
  4. // 恢复按钮,按钮组件控制生效和倒计时的函数
  5. childRef.current.setPhonebtn();
  6. }, second);
  7. }
  8. // 获取验证码
  9. const getCode = () => {
  10. // 手机号
  11. const mobile = phoneRef.current.value;
  12. if (mobile.length < 11) {
  13. messageApi.info("请输入正确手机号", 3);
  14. restoreBtn(2000);
  15. return;
  16. }
  17. // 等待提示框
  18. const key = 'updatable';
  19. messageApi.open({
  20. key,
  21. type: 'loading',
  22. content: '请求中...',
  23. duration: 50
  24. })
  25. // 判断手机号长度
  26. if (mobile.length === 11) {
  27. let mediaExt;
  28. if (openId) {
  29. mediaExt = { openId };
  30. }
  31. // console.log(mediaExt);
  32. let ext = {
  33. ip,
  34. ua:model
  35. }
  36. // console.log(ext);
  37. getCodeApi({ count, model, pid, mobile, mediaExt, cpid, ext }).then(res => { // count次数 model手机型号 pid页面响应ID mobile手机号
  38. // console.log(count, model, mediaExt, pid, mobile,cpid);
  39. // console.log(res.data);
  40. if (res.status === 200) {
  41. if (res.data.code === 0) {
  42. if (res.data.data.status === 0) {
  43. // 移除等待框
  44. messageApi.open({
  45. key,
  46. duration: 0.1
  47. })
  48. document.querySelector('.code_input').style.display = 'flex';
  49. // 如果请求验证码成功
  50. // dot
  51. dotMethod(pid, cpid, "requestCodeSuccess", "请求验证码成功",mobile,res.data.data.message);
  52. // console.log(res.data.data.tradeid);
  53. tradeid = res.data.data.tradeid;
  54. // cpparam = res.data.cpparam;
  55. childRef.current.getPhoneCaptcha();
  56. messageApi.info("发送验证码成功,收到验证码后请尽快使用", 3);
  57. codeType = true;
  58. } else {
  59. // 移除等待框
  60. messageApi.open({
  61. key,
  62. duration: 0.1
  63. })
  64. // 错误提示框
  65. messageApi.info(res.data.data.message, 3);
  66. // dot
  67. dotMethod(pid, cpid, "requestCodeFail", "请求验证码失败",mobile,res.data.data.message);
  68. restoreBtn(3000);
  69. }
  70. } else {
  71. // 移除等待框
  72. messageApi.open({
  73. key,
  74. duration: 0.1
  75. })
  76. // 错误提示框
  77. messageApi.info(res.data.message, 3);
  78. // dot
  79. dotMethod(pid, cpid, "requestCodeFail", "请求验证码失败",mobile,res.data.data.message);
  80. restoreBtn(3000);
  81. }
  82. }
  83. })
  84. count++;
  85. } else {
  86. messageApi.info({
  87. content: '请输入正确手机号',
  88. duration: 3
  89. });
  90. restoreBtn(3000);
  91. }
  92. }

这样方便分析用户群体操作动向。 

4. 本地存储管理

  1. // MyLocalStorage.js
  2. const MyLocalStorage = {
  3. // 获取
  4. getItem: (key) => {
  5. return localStorage.getItem(key);
  6. },
  7. // 添加或更改
  8. setItem: (key, value) => {
  9. localStorage.setItem(key, value);
  10. },
  11. // 移除
  12. removeItem: (key) => {
  13. localStorage.removeItem(key);
  14. },
  15. };
  16. export default MyLocalStorage;

如以上,只要是我们在应用中反复用到的代码都可以对其进行封装,方便管理,代码看起来也更优雅、直观。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/701074
推荐阅读
相关标签
  

闽ICP备14008679号