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
繁體地址,請注明出處:http://hk.pswp.cn/diannao/84497.shtml
英文地址,請注明出處:http://en.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;如…