记录一下方便的条件编译

1. 需要准备:

        1-1、npm i  cross-env -D 是跨平台的自定义编译
        1-2、构造工具:vite/webpack
                ==>  vite: import.meta.env.VITE_NODE_ENV 
                ==> webpack:process.env.NODE_ENV这里使用vite为例子
        1-3、 package.json 

2. 思路与步骤

  1. 首先我们知道 axios这些反向代理在测试环境/生产环境下 都是没有用的;
  2. 所以我们对于这种上线后的我们需要直接访问 就是完整的url的api 例如https:xxx.com/api/xxx,但是这样就会存在cors 跨域问题 对于这个问题有两种解决方法1:nginx的web服务器;2:服务端cors对我们这个域名或ip地址信任或者携带某个字段;这里我们选择第2种 第一种俺也还没有使用过;
  3. 然后就是前端了 ,先把第一步的cross-env下载好,然后到package.json文件中修改
      "scripts": {
        "dev": " cross-env VITE_NODE_ENV=dev vite --mode development --host 0.0.0.0",
        "build": "run-p type-check \"build-only {@}\" --",
        "preview": "vite preview",
        "build-only": "vite build",
        "type-check": "vue-tsc --build --force",
        "dev:prod": "cross-env VITE_NODE_ENV=prod vite",
        "build:prod": "cross-env NODE_ENV=prod vite build"
      },
    /** 
    * --host 0.0.0.0 是为了让局域网也可访问
    * --mode development 这个可以不用加 这个是没有cross-env时候内置的
    * cross-env VITE_NODE_ENV=dev 这个就是设置VITE_NODE_ENV的值
    * "dev:prod": "cross-env VITE_NODE_ENV=prod vite"可以不用 这里是用来测试的
    */
    
  4. 然后需要注意的是 我们的目的就是当为prod时 把一个完整的url拼接出来,为了保证一致性,可以创建一个config.ts来控制
    export const BASE_URL = import.meta.env.VITE_NODE_ENV === 'dev'?'/api':'http://xxx.xxyy.com/'

  5. 然后就是如何应用在请求接口中 这个就比较简单了 我们可以从上面看出来当为dev时就是我们需要使用proxy代理的基地址 不过我不确定axios的baseURL在上线后还有用没有 所以我采取设置axios的baseURL为'/' 对每个请求api添加baseURL,再集成到api中
  6. 目录结构
  7. 接下来先看http.ts
    import utils from '@/utils';
    import axios from 'axios';
    import { useRouter } from 'vue-router';
    const router = useRouter(); // 获取 router 实例
    const http = axios.create({
      // baseURL: '/api'
      baseURL:'/'
    })
    
    // 添加请求拦截器
    http.interceptors.request.use(function (config) {
      // 在发送请求之前做些什么
      config.headers.Authorization = config.headers.Authorization ? config.headers.Authorization : 'Bearer ' + localStorage.getItem('token')
      // console.log('请求头',config.headers)
      return config;
    }, function (error) {
      // 对请求错误做些什么
      return Promise.reject(error);
    });
    // 添加响应拦截器
    http.interceptors.response.use(function (response) {
      // 2xx 范围内的状态码都会触发该函数。
      // console.log(response.headers, 'response')
      
      response.headers.authorization && localStorage.setItem('token', response.headers.authorization)
      // 对响应数据做点什么
      return response.data;
    }, function (error) {
      // 超出 2xx 范围的状态码都会触发该函数。
      // 对响应错误做点什么
      console.log(error.response.data.message, 'liwei')
      switch (error.response.status) {
        case 400:
          // utils.message.error(error.response.data.message.message)
          // utils.message.error(error.response.data.message.response.message[0])
          // 判断类型是否不是数组
          if(!Array.isArray(error.response.data.message.response.message)){
            utils.message.error(error.response.data.message.response.message)
          }else{
            utils.message.error(error.response.data.message.response.message[0])
          }
          
          break;
        case 401:
          utils.message.error(error.response.data.message.message)
          // 重新跳转
          location.href = '#/login'
          
          break;
    
      }
      return Promise.reject(error);
    });
    
    export default http
    
    
  8. 然后是api版块
    import { useUserStore } from '@/stores/userStore'
    import http from "../http"
    import { BASE_URL } from '@/config'
    import type { User, Cover, AuditLog, RegisterUser, FormLibrary, FriendLink,AddCover, ChatMessage, Comment,FriendLinkCategory,Library, ChatList, NotificationType, SendPost, PromiseResult, Statistics, PromiseResult1, Post, UserInfo, Tag } from '@/request/type'
    import { LogType, UserTagType, CoverType,ContentType,StateType } from '@/request/type'
    //  /awei 为不需要token的
    // 登录
    export const loginUser = async (data: User): Promise<UserInfo> => {
        return http.post(`${BASE_URL}user/awei/login`, data)
    }
    // 注册
    export const registerUser = async (data: RegisterUser) => {
        return http.post(`${BASE_URL}user/awei/create`, data)
    }
    
    // 判断邮箱是否注册
    export const isEmailRegister = async (email: string) => {
        return http.get(`${BASE_URL}user/awei/email/${email}`)
    }
    // 发送邮件验证码
    export const sendEmailCode = async (data: { email: string }) => {
        return http.post(`${BASE_URL}mail/awei`, data)
    }
    /**
     * 修改友链分类的名称和描述
     * @type {Object}
     * @property {number} id - 友链分类的唯一标识符
     * @property {string} name - 友链分类的名称,例如 "学习资源"
     * @property {string} description - 友链分类的描述,例如 "好东西"
    */
    export const updateFriendLinkCategory = async (data:{id:number,name:string,description:string}):Promise<PromiseResult<FriendLinkCategory>>=>{
        return http.post(`${BASE_URL}linkcategories/update`,data)
    }
    /**
     * 删除友链分类
     * @type {Object}
     * @property {number[]} ids - 友链分类的唯一标识符
     */
    export const deleteFriendLinkCategory = async (data:{ids:number[]}):Promise<PromiseResult<any>>=>{
        return http.post(`${BASE_URL}linkcategories/delete`,data)
    }
    /**
     * @description 获取评论列表
     * @type {Object}
     * @property {number} page - 页码
     * @property {number} pageSize - 每页显示的评论数量
    */
    export const getCommentList = async (data:{page:number,pageSize:number}):Promise<PromiseResult1<Comment[]>>=>{
        return http.post(`${BASE_URL}comment/getCommentByUserId`,data)
    }
    /**
     * @description 删除评论
     * @type {number}
     * @property {number} id - 评论的唯一标识符
     * @returns **删除后的评论信息**
     */
    export const deleteComment = async (id:number):Promise<PromiseResult<Comment>>=>{
        return http.post(`${BASE_URL}comment/remove/${id}`)
    }
  9. 然后就是集成到index.ts中
    // 集体导出
    import * as user from './user'
    import * as img from './img'
    import * as tc from './tc'
    const api = {
        user,
        img,
        tc
    }
    export default api
  10. ·最后就是根据编译的命令来对应不同的配置了

提一句 由于上线后是直接通过完整的url访问 所以我们需要让服务端cross通过我们的请求 后续会补充上去 

更改!!!

前面提到的不确定axios的baseURL有没有用 现在确定是可以的 这样如果是同一个域名就可以直接设置baseURL 如果不同可以采取前面的 也可以再封装一个axios 如果前后端使用的是同一个域名 都可以不使用 直接使用局部处理就好了

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端开发转行做渗透测试,通过挖漏洞来赚钱

最近&#xff0c;一个做运维的朋友在学渗透测试。他说&#xff0c;他公司请别人做渗透测试的费用是 2w/人天&#xff0c;一共2周。2周 10w 的收入&#xff0c;好香~ 于是&#xff0c;我也对渗透测试产生了兴趣。开始了探索之路~ 什么是渗透测试 渗透测试这名字听起来有一种敬…

网络自动化02:基于xlsx传入设备信息与所需执行备份配置命令,使用netmiko自动化登录分发

这是这个系列第二篇 本文将仅简单介绍使用xlsx导入设备信息&#xff0c;并使用netmiko配置 目录 环境设备信息表格式单线程代码解释代码逻辑分析函数解析 逻辑调用图逻辑说明 遇到的问题写在最后 环境 所有设备均能与我执行Python脚本的环境互通&#xff0c;同时均拥有独立的ip…

Knowledge-refined Denoising Network for Robust Recommendation

Knowledge-refined Denoising Network for Robust Recommendation&#xff08;Sigir23&#xff09; 摘要 知识图&#xff08;KG&#xff09;包含丰富的边信息&#xff0c;是提高推荐性能和可解释性的重要组成部分。然而&#xff0c;现有的知识感知推荐方法直接在KG和用户-项目…

数据结构 之 图的 最小生成树(十二)

提示&#xff1a;本篇难点&#xff1a; 生成树概念的理解 重点&#xff1a;是普利姆算法、克鲁斯卡尔算法构造最小生成树 超超超重点的是 普利姆和克鲁斯卡尔构造最小生成树的算法&#xff0c;这部分可能需要同学们自行去学习了。 一定要理解后用代码能够实现这两个算法已经了解…

如何清空回收站后在 Windows 11/10 中恢复已删除的文件

这篇文章将解释如何将已删除的文件、文件夹和其他项目从回收站还原或恢复到原始位置。有时&#xff0c;我们最终会删除重要的文件和文件夹&#xff0c;然后我们不知道如何将它们恢复到原来的位置。但是您不必担心&#xff0c;因为这篇针对初学者的帖子将详细指导您完成所有步骤…

Axios 请求超时设置无效的问题及解决方案

文章目录 Axios 请求超时设置无效的问题及解决方案1. 引言2. 理解 Axios 的超时机制2.1 Axios 超时的工作原理2.2 超时错误的处理 3. Axios 请求超时设置无效的常见原因3.1 配置错误或遗漏3.2 超时发生在建立连接之前3.3 使用了不支持的传输协议3.4 代理服务器或中间件干扰3.5 …

不懂知识图谱的你,正在失去转行做AI产品经理的机会

伴随着AI这块新的投资风口&#xff0c;新兴企业对AI人才的需求也是激增。所以&#xff0c;你准备好了么&#xff1f; 一、AI来了&#xff0c;你被OUT了&#xff0c;有人却已在快车道上了 给你讲个恐怖的故事&#xff1a;我今年&#xff0c;32岁了&#xff01;三十岁左右是一生…

Generating /run/initramfs/rdsosreport.txt

Linux中遇到Generating /run/initramfs/rdsosreport.txt 第一步&#xff1a;首先输入 ls /dev/mapper 第二步&#xff1a;输入 xfs_repair /dev/mapper/centos-root -L 第三步&#xff1a;重启reboot 不说原因了&#xff0c;直接上解决方式&#xff1a; 第一步&#xff1a;首先…

纯CSS实现UI设计中常见的丝带效果(5)

原文传送门&#xff1a;纯CSS实现UI设计中常见的丝带效果 网页中的丝带效果在设计中扮演着多重角色&#xff0c;其作用可以归纳为以下几个方面&#xff1a; 视觉吸引与装饰 增强视觉吸引力&#xff1a;丝带效果以其独特的形态和色彩&#xff0c;能够迅速吸引用户的注意力&…

OpenCV系列教程六:信用卡数字识别、人脸检测、车牌/答题卡识别、OCR

文章目录 一、信用卡数字识别1.1 模板匹配1.2 匹配多个对象1.3 处理数字模板1.4 预处理卡片信息&#xff0c;得到4组数字块。1.5 遍历数字块&#xff0c;将卡片中每个数字与模板数字进行匹配 二、人脸检测2.1人脸检测算法原理2.2 OpenCV中的人脸检测流程 三、车牌识别3.1 安装t…

音视频入门基础:FLV专题(21)——FFmpeg源码中,获取FLV文件音频信息的实现(上)

由于本文篇幅较长&#xff0c;分为上、中、下三篇。 一、引言 通过FFmpeg命令可以获取到FLV文件的音频压缩编码格式、音频采样率、通道数、音频码率信息&#xff1a; ./ffmpeg -i XXX.flv 而由《音视频入门基础&#xff1a;FLV专题&#xff08;9&#xff09;——Script Tag简…

深度学习之降维和聚类

1 降维和聚类 1.1 图解为什么会产生维数灾难 ​ 假如数据集包含10张照片&#xff0c;照片中包含三角形和圆两种形状。现在来设计一个分类器进行训练&#xff0c;让这个分类器对其他的照片进行正确分类&#xff08;假设三角形和圆的总数是无限大&#xff09;&#xff0c;简单的…

什么是 L0、L1、L2 和 L3 区块链层以及为什么需要它们

区块链的 L 层越来越多地出现在新闻中&#xff08;例如&#xff0c;A16z 投资基金正在投资以太坊Optimism上的 L2 解决方案&#xff0c;或者 Orbs 的 L3 解决方案将其解决方案扩展到 TON 区块链&#xff09;。 层的概念是区块链的一种分类&#xff0c;对于快速了解特定项目如何…

数据分析可视化:散点图矩阵与雷达图的生成

目录 一、经营数据绘制散点图矩阵1.代码解释2.代码说明3.注意事项 二、雷达图1.代码解释2.代码说明3. 注意事项4. 运行代码 总结 一、经营数据绘制散点图矩阵 import seaborn as sns import pandas as pd rc {font.sans-serif:Arial Unicode MS,axes.unicode_minus:False} sn…

硅谷甄选(9)SKU模块

SKU模块 8.1 SKU静态 <template><el-card><el-table border style"margin: 10px 0px"><el-table-column type"index" label"序号" width"80px"></el-table-column><el-table-columnlabel"名称…

ubuntu 异常 断电 日志 查看

sudo less /var/log/syslog 搜 Linux version

解决rabbitmq-plugins enable rabbitmq_delayed_message_exchange :plugins_not_found

问题&#xff1a;我是在docker-compose环境部署的 services:rabbitmq:image: rabbitmq:4.0-managementrestart: alwayscontainer_name: rabbitmqports:- 5672:5672- 15672:15672environment:RABBITMQ_DEFAULT_USER: rabbitRABBITMQ_DEFAULT_PASS: 123456volumes:- ./rabbitmq/…

HCIA(DHCP服务)

第三节 开启DHCP服务 创建地址池 调用全局服务 [R1]dhcp enable 开启DHCP服务 [R1]ip pool AA 创建地址池 [R1-ip-pool-AA]network 192.168.1.0 mask 24 写入网段 [R1-ip-pool-AA]gateway-list 192.168.1.1 写入网关 [R1-ip-pool-AA]dns-list 8.8.8.8 114.1…

GB/T 28046.2-2019 道路车辆 电气及电子设备的环境条件和试验 第2部分:电气负荷(6)

写在前面 本系列文章主要讲解道路车辆电气及电子设备的环境条件和试验GB/T 28046标准的相关知识&#xff0c;希望能帮助更多的同学认识和了解GB/T 28046标准。 若有相关问题&#xff0c;欢迎评论沟通&#xff0c;共同进步。(*^▽^*) 第2部分&#xff1a;电气负荷 附录C C.5…

ES8388 —— 带耳机放大器的低功耗立体声音频编解码器(3)

接前一篇文章&#xff1a;ES8388 —— 带耳机放大器的低功耗立体声音频编解码器&#xff08;2&#xff09; 二、详细描述 4. 时钟模式和采样频率 根据输入的串行音频数据采样频率&#xff0c;ES8388可以在两种速度模式下工作&#xff1a;单速或双速。表1列出了这两种模式下的…