vue3前端后端地址可配置方案

在开发vue3项目过程中,需要切换不同的服务器部署,代码中配置的服务需要可灵活配置,不随着run npm build把网址打包到代码资源中,不然每次切换都需要重新run npm build。需要一个配置文件可以修改服务地址,而打包的代码资源直接copy就可以了。

记录一下下面的方法

vue3项目跟路径下创建proxy.js, 并且地址写在proxy.js中,挂载到window对象上

window.APP_config = {apiBaseURL: 'http://localhost:8080',wsBaseURL: 'ws://localhost:8080/ws',};

项目的index.html中延迟加载proxy.js文件

<!doctype html>
<html lang="en"><head><meta charset="UTF-8" /><link rel="icon" type="image/png" href="/icon.png" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>KXJL Chat OCR</title></head><body><div id="app"></div><script type="module" src="/src/main.js"></script><script src="/proxy.js" defer></script></body>
</html>

main.js中注入,需要监听dom事件,只有dom加载完成才能调用window对象的属性

import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
import router from './router/router.js'
import ElementPlus  from 'element-plus'
import 'element-plus/theme-chalk/index.css'
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
import axios from "axios"var app = createApp(App)// 使用 DOMContentLoaded 事件确保 DOM 加载完成后再访问 window.APP_config
document.addEventListener('DOMContentLoaded', () => {if (window.APP_config) {// 注入配置到 Vue 应用中app.provide('APP_config', window.APP_config);}for (const [key, component] of Object.entries(ElementPlusIconsVue)) {app.component(key, component)}router.isReady().then(() => {if (router.currentRoute.value.path !== '/') {router.push('/');}});app.provide('axios', axios)app.use(router)app.use(ElementPlus)app.mount('#app')});

其他任何地方可调用

import { ref, onMounted, onUnmounted, inject } from 'vue';
const APP_config = inject('APP_config');
console.log(APP_config)
const ws_url = APP_config.wsBaseURL    
console.log("ws_url", ws_url)

ws的调用

<template lang=""><div class="imgocrinfer"><div class="input"><div class="imgup"><el-uploadclass="upload-demo"dragaction=""multiple:auto-upload="false":on-change="handleFileChange":on-remove="handleRemove"><el-icon class="el-icon--upload"><Plus /></el-icon><div class="el-upload__text">点击或拖拽文件到此处上传</div><div class="el-upload__text">支持jpg、png</div><template #tip><div class="el-upload__tip">jpg/png files with a size less than 500kb</div></template></el-upload></div><div class="prompt_input"><el-input class="textarea" v-model="prompt"  type="textarea"  placeholder="请输入提示词" @input="on_input_change"> </el-input></div><div class="submit"><el-button type="primary" plain :icon="Edit" @click="on_click">点击OCR识别</el-button></div></div><div class="imgshow"><div><span>图片预览</span></div><div class="imgPreview" ref="imageRef" style=" margin-top:10px"><img v-if="previewImage" :src="previewImage" alt="Preview Imag" @load="onImageLoad"></div></div><div class="textshow"><div><span>文字识别结果</span></div><div style="margin-top:10px"><el-input class="textarea"  v-model="text_result"  type="textarea"  placeholder="" > </el-input></div></div></div>
</template><script setup>import { ref, onMounted, onUnmounted, inject } from 'vue';import { Edit } from '@element-plus/icons-vue';const text_result = ref("");const previewImage = ref('');const prompt = ref('');const image_base64_str = ref("")const imageRef = ref(null);const imgWidth = ref("");const imgHeight = ref("");const maxImageWidth = ref('');const maxImageHeight = ref('');const ws = ref(null);const isConnected = ref(false);const APP_config = inject('APP_config');console.log(APP_config)const ws_url = APP_config.wsBaseURL    console.log("ws_url", ws_url)const connectWebSocket =() =>{ws.value = new WebSocket(ws_url);ws.value.onopen = onOpenHandler;ws.value.onmessage = (event) => {        text_result.value += event.data// 如果这是最后一条预期的消息,关闭连接if ( event.data.isLastMessage) {ws.value.close()}};ws.value.onclose = (event) => {isConnected.value = falseconsole.log('WebSocket connection closed', event);};ws.value.onerror = (error) => {console.error('WebSocket error', error);};}onUnmounted(()=>{if (ws.value && ws.value.readyState === WebSocket.OPEN){ws.value.close()}})const onOpenHandler = () => {isConnected.value = true;sendTextAndImage()}const on_input_change = () =>{text_result.value = ""}// 发送数据async function sendTextAndImage() {console.log("sendTextAndImage")const payload = {"text":prompt.value,"image_base64_str": image_base64_str.value,};if (isConnected.value && prompt.value && image_base64_str.value){console.log("payload: ", payload)ws.value.send(JSON.stringify(payload));}}const handleFileChange = (file, uploadFiles) =>{if (uploadFiles.length >= 2){uploadFiles.splice(0,uploadFiles.length-1)}if(file.raw && file.raw.type.startsWith("image/")){const reader = new FileReader()reader.onload = (e) => {previewImage.value = e.target.resultimage_base64_str.value = e.target.result.split(",")[1]let img = new Image()img.src = e.target.resultimg.onload=()=>{imgWidth.value = img.widthimgHeight.value = img.height if (imgWidth.value > imgHeight.value) {// 如果图片宽度大于高度,则限制宽度maxImageWidth.value = "100%";maxImageHeight.value = "auto";} else {// 否则,限制高度maxImageWidth.value = 'auto';maxImageHeight.value = `100%`;}}}reader.readAsDataURL(file.raw)}else{ElMessage.error('Please upload an image file.')}};const handleRemove = (file, uploadFiles) =>{    if (uploadFiles.length ==0){previewImage.value = ""prompt.value = ""text_result.value = ""}};const onImageLoad = () => {// 在图片加载完成后,强制浏览器重新计算尺寸// 这可以通过触发一个重排或重绘来实现requestAnimationFrame(() => {// 强制浏览器重排const imgElement = document.querySelector('img')imgElement.style.width = maxImageWidth.value;imgElement.style.height = maxImageHeight.value});};const on_click = ()=>{if ( ! prompt.value && !image_base64_str.value){alert("prompt 和 图片不能为空,请重新输入")}text_result.value = ""if (! isConnected.value){connectWebSocket()}// onOpenHandler()// prompt.value = ""// image_base64_str.value = ""}defineOptions({name: 'imgOcrInference',});
</script><style lang="scss">
.imgocrinfer{display: flex;.input{width: 14.7vw;height: 90vh;border:2px solid #ffffff;box-shadow: 1px 0 4px #8c9eb11a;border-radius: 8px;.imgup{width: 14.7vw;height: 30vh;border:2px solid #ffffff;box-shadow: 1px 0 4px #8c9eb11a;border-radius: 8px;.el-upload{width: 14.3vw;}}.prompt_input{height: 15vh;.el-textarea__inner{width: 14.3vw;resize: none;height: 100px;}}.submit{width: 14.3vw;.el-button {width: 14.3vw;}}}.imgshow{height: 600px;width: 29.5vw;border:2px solid #ffffff;box-shadow: 1px 0 4px #8c9eb11a;border-radius: 8px;margin-left: 1vw;.imgPreview{border:2px solid rgb(167, 200, 238);height: 58vh;border-radius: 8px;}}.textshow{width: 19.8vw;border:2px solid #ffffff;box-shadow: 1px 0 4px #8c9eb11a;border-radius: 8px;.el-textarea__inner{width: 19.8vw;height: 58vh;}}
}
</style>

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

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

相关文章

大模型微调与高效训练

随着预训练大模型(如BERT、GPT、ViT、LLaMA、CLIP等)的崛起,人工智能进入了一个新的范式:预训练-微调(Pre-train, Fine-tune)。这些大模型在海量数据上学习到了通用的、强大的表示能力和世界知识。然而,要将这些通用模型应用于特定的下游任务或领域,通常还需要进行微调…

编程技能:字符串函数10,strchr

专栏导航 本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏&#xff0c;故划分为两个专栏导航。读者可以自行选择前往哪个专栏。 &#xff08;一&#xff09;WIn32 专栏导航 上一篇&#xff1a;编程技能&#xff1a;字符串函数09&#xff0c;strncmp 回到目录…

动态规划-53.最大子数组和-力扣(LeetCode)

一、题目解析 在给定顺序的数组中找出一段具有最大和的连续子数组&#xff0c;且大小最小为1. 二、算法原理 1.状态表示 我们可以意一一枚举出所有的子数组&#xff0c;但我们想要的是最大子数组&#xff0c;所以f[i]表示&#xff1a;以i位置为结尾&#xff0c;所有子数组的最…

C++ queue对象创建、queue赋值操作、queue入队、出队、获得队首、获得队尾操作、queue大小操作、代码练习

对象创建&#xff0c;代码见下 #include<iostream> #include<queue>using namespace std;int main() {// 1 默认构造函数queue<int> q1;// 2 拷贝构造函数queue<int> q2(q1);return 0;} queue赋值操作&#xff0c;代码见下 #include<iostream>…

全链路解析:影刀RPA+Coze API自动化工作流实战指南

在数字化转型加速的今天&#xff0c;如何通过RPA与API的深度融合实现业务自动化提效&#xff0c;已成为企业降本增效的核心命题。本文以「影刀RPA」与「Coze API」的深度协作为例&#xff0c;系统性拆解从授权配置、数据交互到批量执行的完整技术链路&#xff0c;助你快速掌握跨…

php本地 curl 请求证书问题解决

错误: cURL error 60: SSL certificate problem: unable to get local issuer certificate (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for 解决方案 在php目录下创建证书文件夹, 执行下面生成命令, 然后在php.ini 文件中配置证书路径; 重启环境 curl --eta…

【图数据库】--Neo4j 安装

目录 1.Neo4j --概述 2.JDK安装 3.Neo4j--下载 3.1.下载资源包 3.2.创建环境变量 3.3.运行 Neo4j 是目前最流行的图形数据库(Graph Database)&#xff0c;它以节点(Node)、关系(Relationship)和属性(Property)的形式存储数据&#xff0c;专门为处理高度连接的数据而设计。…

MIT 6.S081 2020Lab5 lazy page allocation 个人全流程

文章目录 零、写在前面一、Eliminate allocation from sbrk()1.1 说明1.2 实现 二、Lazy allocation2.1 说明2.2 实现 三、Lazytests and Usertests3.1 说明3.2 实现3.2.1 lazytests3.2.2 usertests 零、写在前面 可以阅读下4.6页面错误异常 像应用程序申请内存&#xff0c;内…

(Git) 稀疏检出(Sparse Checkout) 拉取指定文件

文章目录 &#x1f3ed;作用&#x1f3ed;指令总览&#x1f477;core.sparseCheckout&#x1f477;sparse-checkout 文件 &#x1f3ed;实例演示⭐END&#x1f31f;交流方式 &#x1f3ed;作用 类似于 .gitignore 进行文件的规则匹配。 一般在需要拉取大型项目指定的某些文件…

docker初学

加载镜像&#xff1a;docker load -i ubuntu.tar 导出镜像&#xff1a;docker save -o ubuntu1.tar ubuntu 运行&#xff1a; docker run -it --name mu ubuntu /bin/bash ocker run -dit --name mmus docker.1ms.run/library/ubuntu /bin/bash 进入容器&#xff1a;docke…

Docker系列(二):开机自启动与基础配置、镜像加速器优化与疑难排查指南

引言 docker 的快速部署与高效运行依赖于两大核心环节&#xff1a;基础环境搭建与镜像生态优化。本期博文从零开始&#xff0c;系统讲解 docker 服务的管理配置与镜像加速实践。第一部分聚焦 docker 服务的安装、权限控制与自启动设置&#xff0c;确保环境稳定可用&#xff1b…

计算机视觉(图像算法工程师)学习路线

计算机视觉学习路线 Python基础 常量与变量 列表、元组、字典、集合 运算符 循环 条件控制语句 函数 面向对象与类 包与模块Numpy Pandas Matplotlib numpy机器学习 回归问题 线性回归 Lasso回归 Ridge回归 多项式回归 决策树回归 AdaBoost GBDT 随机森林回归 分类问题 逻辑…

工业软件国产化:构建自主创新生态,赋能制造强国建设

随着全球产业环境的变化和技术的发展&#xff0c;建立自主可控的工业体系成为我国工业转型升级、走新型工业化道路、推动国家制造业竞争水平提升的重要抓手。 市场倒逼与政策护航&#xff0c;国产化进程双轮驱动 据中商产业研究院预测&#xff0c;2025年中国工业软件市场规模…

OpenCV CUDA 模块图像过滤------创建一个高斯滤波器函数createGaussianFilter()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::cuda::createGaussianFilter 是 OpenCV CUDA 模块中的一个工厂函数&#xff0c;用于创建一个高斯滤波器。这个滤波器可以用来平滑图像&#…

【RocketMQ 生产者和消费者】- 生产者发送故障延时策略

文章目录 1. 前言2. FaultItem3. LatencyFaultToleranceImpl 容错集合处理类3.1 updateFaultItem 更新容错集合3.2 isAvailable 判断 broker 是否可用3.3 pickOneAtLeast 至少选出一个故障 broker 4. MQFaultStrategy 故障策略类4.1 属性4.2 updateFaultItem 更新延迟故障容错信…

【HarmonyOS 5】Map Kit 地图服务之应用内地图加载

#HarmonyOS SDK应用服务&#xff0c;#Map Kit&#xff0c;#应用内地图 目录 前期准备 AGC 平台创建项目并创建APP ID 生成调试证书 生成应用证书 p12 与签名文件 csr 获取 cer 数字证书文件 获取 p7b 证书文件 配置项目签名 项目开发 配置Client ID 开通地图服务 配…

(1-6-1)Java 集合

目录 0.知识概述&#xff1a; 1.集合 1.1 集合继承关系类图 1.2 集合遍历的三种方式 1.3 集合排序 1.3.1 Collections实现 1.3.2 自定义排序类 2 List 集合概述 2.1 ArrayList &#xff08;1&#xff09;特点 &#xff08;2&#xff09;常用方法 2.2 LinkedList 3…

Vue.extend

Vue.extend 是 Vue 2 中的一个重要 API&#xff0c;用于基于一个组件配置对象创建一个“可复用的组件构造函数”。它是 Vue 内部构建组件的底层机制之一&#xff0c;适用于某些高级用法&#xff0c;比如手动挂载组件、弹窗动态渲染等。 ⚠️ 在 Vue 3 中已被移除&#xff0c;V…

【MySQL系列】SQL 分组统计与排序

博客目录 引言一、基础语法解析二、GROUP BY 的底层原理三、ORDER BY 的排序机制四、NULL 值的处理策略五、性能优化建议六、高级变体查询 引言 在现代数据分析和数据库管理中&#xff0c;分组统计是最基础也是最核心的操作之一。无论是业务报表生成、用户行为分析还是系统性能…

spring中的InstantiationAwareBeanPostProcessor接口详解

一、接口定位与核心功能 InstantiationAwareBeanPostProcessor是Spring框架中扩展Bean生命周期的关键接口&#xff0c;继承自BeanPostProcessor。它专注于Bean的实例化阶段&#xff08;对象创建和属性注入&#xff09;的干预&#xff0c;而非父接口的初始化阶段&#xff08;如…