zdppy+vue3+onlyoffice文档管理系统实战 20240903 上课笔记 登录功能完成

news2024/11/14 12:09:28

接下来

  • 1、注销功能:点击注销按钮,清除登录信息跳转到登录页面
  • 2、token过期

注销功能

useUser.js

import storage from "../../g/storage.js";
import {useRouter} from "vue-router";
import {message} from "ant-design-vue";

export default function useUser() {
    const router = useRouter()
    // 注销
    const logout = () => {
        storage.delete("userid")
        storage.delete("username")
        storage.delete("token")
        message.success("退出登录成功")
        router.push("/login")
    }

    return {
        logout,
    }
}

处理菜单点击:

import {ref} from 'vue';
import useUser from "./useUser.js"

const {logout} = useUser()

const selectedKeys = ref(['latest']);

// 处理菜单点击
const handleMenuClick = ({key}) => {
  switch (key) {
    case 'user-logout':
      logout()
      break
  }
}

头像变成用户名首字母

简单实现:

const avatar = () => {
    const username = storage.get("username") || "U"
    return username.charAt(0).toUpperCase()
}

vue3计算属性

在 Vue 3 中,计算属性(computed properties)是一种特殊类型的依赖项,它们根据响应式数据的变化自动重新计算值。计算属性非常适合用于当你需要根据现有数据派生出一些状态时。

以下是 Vue 3 中使用计算属性的简单示例:

<template>
  <div>
    <p>价格: {{ product.price }}</p>
    <p>含税价格: {{ totalPrice }}</p>
  </div>
</template>

<script setup>
import { computed, ref } from 'vue';

const product = ref({
  name: 'Vue 3 Guide',
  price: 100
});

// 计算属性,用于计算含税总价
const totalPrice = computed(() => {
  return product.value.price * 1.15; // 假设税率为 15%
});
</script>

在这个示例中:

  • 使用 ref 创建了一个响应式的数据对象 product,它包含产品名称和价格。
  • 使用 computed 创建了一个计算属性 totalPrice,它基于 product 的价格计算含税后的总价。这里假设税率为 15%。
  • 在模板中,我们展示了产品的价格和含税价格。

计算属性 totalPrice 会根据 product.price 的变化自动更新。当 product.price 发生变化时,任何依赖于 totalPrice 的视图都会自动更新。

计算属性是惰性的,只有在它们所依赖的响应式数据发生变化时才会重新计算。这使得计算属性非常高效,并且它们是缓存的,只有当依赖项发生变化时,计算属性的值才会重新计算。

请注意,<script setup> 是 Vue 3 引入的一个新的脚本语法糖,它使得组件的编写更加简洁。如果你使用的是传统的 export default 语法,那么你需要稍微调整代码:

export default {
  data() {
    return {
      product: {
        name: 'Vue 3 Guide',
        price: 100
      }
    };
  },
  computed: {
    totalPrice() {
      return this.product.price * 1.15; // 假设税率为 15%
    }
  }
};

在这个传统语法的示例中,计算属性 totalPrice 被定义在 computed 选项中,并且可以通过 this.product 访问响应式数据 product

计算属性版本的头像

核心代码:

const totalPrice = computed(() => {
  return product.value.price * 1.15; // 假设税率为 15%
});

头像代码:

const avatar = computed(() => {
    const username = storage.get("username") || "U"
    return username.charAt(0).toUpperCase()
})

简写代码:

const avatar = computed(() => (storage.get("username") || "U").charAt(0).toUpperCase())

当前界面

在这里插入图片描述

接下来

  • 1、数据的请求是没有权限的,我们应该要验证权限
  • 2、必须要登录才能请求数据,Token必须有效
  • 3、前端要把登录Token传递后端

问题:我们会有非常多的接口,我们是每个接口都手动把Token传递进去吗?

回答:这是比较low的写法,Axios有一个拦截器的功能,我们可以在拦截器中,统一设置携带Token。

axios拦截器

在 JavaScript 中,使用 Axios 进行 HTTP 请求时,可以设置请求拦截器和响应拦截器来统一处理请求和响应。这在处理认证、记录日志、统一格式化数据等场景中非常有用。

以下是 Axios 请求拦截器和响应拦截器的简单示例:

安装 Axios

首先,确保你已经安装了 Axios。如果还没有安装,可以使用 npm 或 yarn 来安装:

npm install axios

或者

yarn add axios

设置拦截器

import axios from 'axios';

// 请求拦截器
axios.interceptors.request.use(
  config => {
    // 在发送请求之前做些什么,例如添加认证头
    const token = localStorage.getItem('user-token');
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
    }
    return config;
  },
  error => {
    // 对请求错误做些什么
    return Promise.reject(error);
  }
);

// 响应拦截器
axios.interceptors.response.use(
  response => {
    // 对响应数据做点什么
    return response;
  },
  error => {
    // 对响应错误做点什么
    if (error.response && error.response.status === 401) {
      // 例如,处理 401 未认证错误
      console.log('未认证,需要重新登录');
    }
    return Promise.reject(error);
  }
);

// 使用 Axios 发送请求
axios.get('/api/data')
  .then(response => {
    console.log('数据获取成功:', response.data);
  })
  .catch(error => {
    console.error('数据获取失败:', error);
  });

在这个示例中:

  • 请求拦截器:在发送请求之前,检查本地存储中是否存在 token,并将其添加到请求头中。如果 token 存在,请求头中将包含 Authorization 字段。
  • 响应拦截器:在收到响应后,根据响应状态进行处理。例如,如果响应状态码为 401(未认证),可以记录日志或执行其他操作。

详细说明

  1. 请求拦截器

    • 使用 axios.interceptors.request.use 方法设置请求拦截器。
    • 第一个参数是一个函数,它接收 config 对象作为参数,你可以在发送请求之前修改它,例如添加或修改请求头。
    • 第二个参数是一个处理错误的函数,如果请求配置出错,可以在这里处理。
  2. 响应拦截器

    • 使用 axios.interceptors.response.use 方法设置响应拦截器。
    • 第一个参数是一个函数,它接收 response 对象作为参数,你可以在处理响应数据之前对其进行操作。
    • 第二个参数是一个处理错误的函数,如果响应出错,可以在这里处理。
  3. 发送请求

    • 使用 axios.get 方法发送 GET 请求,并使用 thencatch 处理成功和失败的情况。

总结

拦截器是 Axios 中非常强大的功能,它们允许你在请求发送之前和响应返回之后统一处理逻辑。这在处理认证、日志记录、错误处理等场景中非常有用。通过设置拦截器,你可以避免在每个请求和响应中重复相同的代码,从而使代码更加简洁和易于维护。

axios创建实例对象

在 Axios 中,你可以创建一个实例对象来配置特定的 axios 实例。这在你需要为应用的不同部分设置不同的基础 URL、头部或超时时间等配置时非常有用。

以下是如何创建 Axios 实例对象的示例:

import axios from 'axios';

// 创建 axios 实例
const instance = axios.create({
  baseURL: 'https://api.example.com', // 设置默认的基础 URL
  timeout: 1000, // 设置默认的超时时间
  headers: {'X-Custom-Header': 'foobar'} // 设置默认的请求头
});

// 使用实例发送请求
instance.get('/data')
  .then(response => {
    console.log('数据获取成功:', response.data);
  })
  .catch(error => {
    console.error('数据获取失败:', error);
  });

// 你可以为实例添加拦截器
instance.interceptors.request.use(
  config => {
    // 在发送请求之前做些什么
    config.headers['Authorization'] = `Bearer your-token`;
    return config;
  },
  error => {
    // 对请求错误做些什么
    return Promise.reject(error);
  }
);

instance.interceptors.response.use(
  response => {
    // 对响应数据做点什么
    return response;
  },
  error => {
    // 对响应错误做点什么
    return Promise.reject(error);
  }
);

在这个示例中:

  • 使用 axios.create() 方法创建了一个 Axios 实例。
  • baseURL 设置了所有请求的默认基础 URL。
  • timeout 设置了所有请求的默认超时时间(以毫秒为单位)。
  • headers 设置了所有请求的默认请求头。
  • 使用实例对象 instance 发送了一个 GET 请求。
  • 为实例对象添加了请求拦截器和响应拦截器。

创建实例对象的好处是你可以针对不同的 API 端点或不同的请求需求设置不同的配置,而不必在每次请求时都设置这些配置。这使得代码更加模块化和可重用。

此外,Axios 实例也是可配置的,这意味着你可以在实例的基础上进一步定制化,例如添加特定的拦截器或配置项。这在构建大型应用时非常有用,因为它允许你为不同的 API 模块或功能创建不同的 Axios 实例。

封装axios

import axios from "axios";
import storage from "./storage.js";

// 全局HTTP请求对象
const req = axios.create({
    baseURL: 'http://127.0.0.1:18888', // 设置默认的基础 URL
    timeout: 3000, // 设置默认的超时时间
    headers: {'Content-Type': 'application/json'} // 设置默认的请求头
});

// 请求拦截器
req.interceptors.request.use(config => {
        // 添加统一的token
        const token = storage.get("token") || ""
        if (token) {
            config.headers.Authorization = token
        }
        return config;
    },
    error => {
        // 对请求错误做些什么
        return Promise.reject(error);
    }
);

// 导出
export default req;

// 响应拦截器
req.interceptors.response.use(
    response => {
        // 对响应数据做点什么
        return response;
    },
    error => {
        // 对响应错误做点什么
        if (error.response && error.response.status === 401) {
            // 例如,处理 401 未认证错误
            console.log('未认证,需要重新登录');
        }
        return Promise.reject(error);
    }
);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2102375.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【vue Lottie】lottie在vue项目中的使用心得

✨减少依赖体积 ●能用原生实现的动效&#xff0c;就不要切Lottie&#xff0c;提前做好切分 ●使用的时候&#xff0c;不要一股脑的复制粘贴过来&#xff0c;而是应该进行如下步骤的清洗 ○合并同样的图片依赖素材&#xff0c;减小依赖图片的大小 ○一些很大的背景图片&…

比亚迪夏亮相,枪口究竟对准了谁?

文/王俣祺 导语&#xff1a;比亚迪的MPV终于要来了&#xff0c;比亚迪夏在成都车展上正式亮相&#xff0c;据说售价会在30万级别&#xff0c;如果是这一几个区间&#xff0c;可以说是把矛头直接指向了腾势D9。作为比亚迪“宗亲”的腾势D9匆忙表示“大哥别开枪&#xff0c;自己人…

多晶透明陶瓷市场发展现状和前景:未来几年年复合增长率CAGR为15.5%

多晶透明陶瓷是一种新型先进功能材料&#xff0c;它具有独特的机械性能和透射性能&#xff0c;在战略和民用领域有着广泛的应用。陶瓷粉末合成、成型和烧结技术的进步使得先进透明陶瓷材料的微观结构、机械性能和光学性能关系的定制成为可能。透明陶瓷材料大致分为可见光、中波…

【qt】多线程实现倒计时

1.界面设计 设置右边的intvalue从10开始倒计时 2.新建Thread类 新建Thread类&#xff0c;使其继承QThread类&#xff0c;多态重写run函数&#xff0c;相当于线程执行函数 3.重写run函数 重写run函数&#xff0c;让另一个进程每隔1s发出一个信号&#xff0c;主线程使用conne…

wireshark使用攻略

简介 wireshark 是网络封包分析工具&#xff0c;可与截取各种网络数据包并且显示数据包的详细信息。 使用 打开wireshark &#xff1a; 在Linux中使用sudo wireshark 打开 打开之后选择对应的网卡&#xff0c;就可以进行网络信息的捕获&#xff0c;开始抓取网络包。 可以…

不管C盘垃圾有多少 芝麻清理就是好!彻底清理电脑垃圾!

不管C盘垃圾有多少 芝麻清理就是好&#xff01;彻底清理电脑垃圾&#xff01;让你没烦恼&#xff01;C盘垃圾是许多人的烦恼&#xff0c;如果靠手动去清理C盘垃圾是个非常麻烦的事情&#xff0c;就算有10多年电脑经验的高手&#xff0c;也未必能做到彻底清理干净C盘。 对于我们…

Allure报告下载不同格式的文件

支持类型&#xff1a; class AttachmentType(Enum):def __init__(self, mime_type, extension):self.mime_type mime_typeself.extension extensionTEXT ("text/plain", "txt")CSV ("text/csv", "csv")TSV ("text/tab-sep…

网络编程9月3日

1&#xff0c;思维导图2&#xff0c;TCP通信 服务器端 #include<myhead.h> #define JCHM 4514 #define IPDZ "192.168.0.113" #define BACKLOG 5 int main(int argc,const char *argv[]) {int oldfdsocket(AF_INET,SOCK_STREAM,0);if(oldfd-1){perror("…

猴子排序:一种理论上的排序算法

猴子排序&#xff1a;一种理论上的排序算法 在编程和算法的世界里&#xff0c;总有一些有趣的算法让人忍俊不禁&#xff0c;同时又让人深思。今天&#xff0c;我们来聊聊一种特别的排序算法——猴子排序&#xff08;Bogosort&#xff09;&#xff0c;也常被戏称为瞎子排序、波…

解放你的带宽和内存:GZIP在解决Redis大Key方面的应用

首发公众号&#xff1a;赵侠客 引用 目前主流HTTP协议接口都是使用JSON格式做数据交换的&#xff0c;JSON数据格式有着结构简单、可读性高、跨平台&#xff0c;易解析等优点&#xff0c;同时也存在着冗余数据会占用非常多的储存空间的问题&#xff0c;这大大增加了JSON格式数据…

MATLAB eig 函数简介:计算特征值和特征向量

在数据科学、工程学和数学中&#xff0c;特征值和特征向量是理解和分析矩阵行为的核心概念。MATLAB 的 eig 函数是处理这些概念的强大工具。本文将介绍 eig 函数的基本用法&#xff0c;并通过示例展示如何使用它来计算特征值和特征向量。 什么是特征值和特征向量&#xff1f; …

应用层(Web与HTTP)

目录 常见术语 1.HTTP概况 2.HTTP连接 非持久HTTP流程 响应时间模型 持久HTTP 3.HTTP报文 3.1HTTP请求报文 3.2HTTP响应报文 HTTP响应状态码 4.Cookies&#xff08;用户-服务器状态&#xff09; cookies&#xff1a;维护状态 Cookies的作用 5.Web缓冲&#xff08;…

CDGA|数据治理:构建高效数据管理体系的实践路径

在当今数字化时代&#xff0c;数据已成为企业最宝贵的资产之一&#xff0c;其质量、安全性和有效利用率直接影响着企业的决策能力、运营效率和市场竞争力。因此&#xff0c;数据治理作为确保数据质量、促进数据价值最大化的关键环节&#xff0c;其重要性日益凸显。本文将从几个…

UE4_地形_悬崖拉伸的解决

参考教程 【虚幻5】UE5_UE4_解决悬崖地形贴图拉伸_哔哩哔哩_bilibili 纹理处理 | 虚幻引擎 4.27 文档 | Epic Developer Community (epicgames.com) 主要通过蓝图节点解决&#xff1a;WorldAlignedTexture WorldAlignedTexture&#xff08;全局一致纹理&#xff09;函数用于…

【自用19.1】C++构造函数

构造函数的作用 在创建一个新的对象时&#xff0c;自动调用的函数&#xff0c;用来进行“初始化”工作&#xff1a; 对这个对象内部的数据成员进行初始化。 构造函数的特点 自动调用&#xff08;在创建新对象时&#xff0c;自动调用&#xff09;构造函数的函数名&#xff0c…

乐凡三防|国产化浪潮下的三防平板

在当前的科技环境下&#xff0c;国产化成为了一个热门话题&#xff0c;尤其在三防平板领域&#xff0c;国产化不仅意味着技术的自给自足&#xff0c;更是国家信息安全与产业自主可控的重要体现。三防平板&#xff0c;即具备防水、防尘、防震功能的平板电脑&#xff0c;其全国产…

02-数组

概述 数组是一个由固定长度的特定类型元素组成的序列&#xff0c;一个数组可以由零个或多个元素组成&#xff0c;一旦声明了&#xff0c;数组的长度就固定了&#xff0c;不能动态变化。 len() 和 cap() 返回结果始终一样。 声明数组 package mainimport ("fmt" )f…

【算法专场】模拟(上)

目录 ​前言 模拟算法 1576. 替换所有的问号 495. 提莫攻击 1688. 比赛中的配对次数 6. Z 字形变换 前言 我们在有时候会看到刷题网站上面看到一些已经把题意讲的很明确的题目&#xff0c;并且一般这种不怎么需要利用那些复杂的算法&#xff0c;只需要我们按照着题目的意…

宝藏!《联盟现代控制特训班题库》(麒麟篇) 习题部分:甄选内容

本文内容&#xff0c;全部选自联盟自动化考研联盟企业店( 店)的&#xff1a;初试《现代控制特性班题库》(麒麟篇)&#xff0c;分为讲义和习题两个部分&#xff0c;本文为习题部分的甄选内容&#xff0c;一本书帮你学透现控。 目录 Part1&#xff1a;资料封面&目录 习题部…

Kafka大厂面试14问(附答案)

怎么保证顺序消费&#xff1f; 同一个生产者发送到同一分区的消息&#xff0c;先发送的比后发送的offset要小。同一生产者发送到不同分区的消息&#xff0c;消息顺序无法保证。 怎么解决这个问题&#xff1f; 给一个topic只设置一个分区 相同key会发给一个分区 怎么保证幂…