# vue0524 **Repository Path**: edn126/vue0524 ## Basic Information - **Project Name**: vue0524 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-05-24 - **Last Updated**: 2026-03-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # vue0524 This template should help get you started developing with Vue 3 in Vite. ## Recommended IDE Setup [VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur). ## Customize configuration See [Vite Configuration Reference](https://vitejs.dev/config/). ## Project Setup ```sh npm install ``` ### Compile and Hot-Reload for Development ```sh npm run dev ``` ### Compile and Minify for Production ```sh npm run build ``` ### 调试过程: 关于:node src/mock/MockServer.js 目前格式还是cjs,暂时esm不支持,需要后续调整 支持数据的get,不支持上传持久化 node src/mock/MockServer1.js node .\src\mock\MockServer.js 支持postman的数据上传,data保存在data.json 单条数据格式: { "id": 4, "name": "赵六" } 关于:node src/mock/MockServer2.js 同时支持单条和多条数据上传和持久化 [ { "id": 4, "name": "赵六" }, { "id": 5, "name": "孙七" }, { "id": 6, "name": "周八" } ] 目前还存在问题,需要后续调整 设置了data.json作为数据持久化库,用来保存数据 # pinia的风格 ### 使用Setup函数风格(推荐) ``` // stores/counter.js import { defineStore } from 'pinia' import { ref, computed } from 'vue' export const useCounterStore = defineStore('counter', () => { const count = ref(0) const doubleCount = computed(() => count.value * 2) function increment() { count.value++ } function decrement() { count.value-- } return { count, doubleCount, increment, decrement } }) ``` ###使用选项对象风格 ``` // stores/counter.js import { defineStore } from 'pinia' export const useCounterStore = defineStore('counter', { state: () => ({ count: 0 }), getters: { doubleCount(state) { return state.count * 2 } }, actions: { increment() { this.count++ }, decrement() { this.count-- } } }) ``` # 动态配置的思路 vue3前端软件,在访问的后端服务时,有时内网的后端IP会发生变化,解决思路: 一种方案是提前在env中设置好后端IP地址,这种方式在系统部署容易固化,不方便调整后端服务的IP地址; 二是在设置一个公共目录的配置文件,可以手动更新公共目录的配置文件,实现了调整后端服务的IP地址; 三是是做个配置页面,手动输入后端服务的ip地址。 四是做一个后端服务端,提供动态配置的后端服务接口,前端软件在启动时,从后端服务接口获取配置信息,后端服务可以存储在数据库中,也可以存储在文件中。 请给出推荐的方式,和示例代码,希望代码容易以后再其他项目中移植,且采用pinia和组合式api的写法 # 实现方式 1. 存储在浏览器的localStorage中,定义一个key为config的item,value为json字符串,json字符串中包含后端服务的ip地址和端口号 2. 从服务端获取,定义一个接口,返回json字符串,json字符串中包含后端服务的ip地址和端口号 3. 从文件中获取,定义一个接口,返回json字符串,json字符串中包含后端服务的ip地址和端口号 4. 从环境变量中获取,定义一个环境变量,包含后端服务的ip地址和端口号 # 动态配置思路的四个方案: ​1. ​环境变量(.env)固化配置​​: 实现:在项目根目录通过.env.development/.env.production设置VITE_API_BASE_URL等变量,前端代码直接引用。 缺点:配置随代码打包固化,若后端IP变化需重新打包部署,灵活性极低;无法应对生产环境的临时IP变动。 ​​2. 公共静态配置文件(public/config.json)​​: 实现:将配置放在public目录下(前端构建时会原样拷贝),通过fetch('/config.json')读取,支持手动修改文件更新配置。 缺点:依赖前端能访问到该文件(需确保文件路径正确、服务器未限制访问);修改后需刷新页面才能生效;无法实现“实时更新”(除非轮询文件);配置变更无权限控制,任何人都能修改。 ​​3. 前端配置页面(手动输入)​​: 实现:开发一个配置页面,用户手动输入后端IP等信息,保存到localStorage中。 缺点:依赖用户主动操作,若忘记配置或配置错误,会导致服务不可用;配置仅存储在本地,换设备/浏览器需重新配置;无版本管理,误操作后难以回溯。 4.​ ​后端动态配置服务(推荐增强方案)​​: 实现:搭建一个轻量级后端服务(或利用现有后端),提供/api/config接口返回前端所需的配置(如后端API地址、超时时间等);配置存储在后端数据库或文件中,支持可视化修改。 优势:​​配置集中管理​​(后端统一维护,无需前端干预);​​动态生效​​(前端启动或定时拉取即可更新);​​权限可控​​(只有有权限的用户能修改配置);​​支持复杂配置​​(如多环境、多实例配置)。 补充:可结合“本地缓存”提升可靠性——前端启动时先从后端拉取配置,失败则读取本地缓存的配置,极端情况还能 fallback 到默认配置。 推荐方式:​​推荐采用「后端动态配置服务 + 本地缓存 + 默认配置」的混合方案 # 同步规则 (1)启动时加载流程 本地缓存:localStorage.getItem('config') 若有缓存:解析为JSON,赋值给currentConfig,跳过后续步骤。 若无缓存:进入下一步。 ​​降级到公共静态文件​​: 拉取public/config.json,成功则保存到localStorage并使用。 如无config.json失败:进入下一步。 ​​兜底环境变量​​: 使用.env中的配置,保证应用能启动。 (2)配置更新流程 1. 用户通过配置页面修改(配置,上传按钮) 页面上配置修改保存到localStorage。 2. ​​优先尝试后端动态服务​​: 成功:更新currentConfig,保存到localStorage,设置​​定时刷新​​(每5分钟拉取一次)。 失败:进入降级流程。 ​​降级到本地缓存(localStorage)​​: 若有缓存:直接使用,跳过后续步骤。 若无缓存:进入下一步。 ​​降级到公共静态文件​​: 拉取public/config.json,成功则保存到localStorage并使用。 失败:进入下一步。 ​​兜底环境变量​​: 使用.env中的配置,保证应用能启动。 (2)配置更新流程 ​​用户通过配置页面修改​​: 调用updateConfig,更新currentConfig和localStorage。 同步到​​后端动态服务​​,确保所有客户端(包括自己)下次拉取能获取最新配置。 ​​后端服务主动更新​​: 前端通过​​定时刷新​​获取最新配置,覆盖currentConfig和localStorage,保证配置一致性。 (3)异常处理 ​​网络中断​​:降级到低优先级配置(本地缓存→文件→环境变量)。 ​​后端配置错误​​:保留上一次有效配置,避免应用崩溃。 ​​本地缓存损坏​​:跳过缓存,尝试下一个来源。 # 普通json解析方法 //javascript 解析普通json字符串 // 1. 定义 JSON 字符串 const jsonString = `{ "server": { "apiBaseUrl": "http://127.0.0.1:6000", "publicApiUrl": "http://192.168.1.199:3000", "port": 3000 }, "geoserver": { "http://192.168.1.68:8080": { "cn": [ "JL1KF01A_PMS02_20250111114728_200339415_101_0030_001_L3D_PSH", "JL1KF02B03_PMS01_20250512121714_200382571_101_0016" ], "hn": [ "JL1KF01A_200297952_001_L5D_PSH" ] }, "http://192.168.1.199:8081": { "JHHY_external": [ "浙江天台抽蓄_0", "浙江天台抽蓄_1" ] } } }`; // 2. 解析 JSON 字符串为 JavaScript 对象 const config = JSON.parse(jsonString); // 3. 获取各参数 // --- 获取 server 配置 --- const apiBaseUrl = config.server.apiBaseUrl; const publicApiUrl = config.server.publicApiUrl; const port = config.server.port; console.log("--- Server Config ---"); console.log("API Base URL:", apiBaseUrl); // 输出: http://127.0.0.1:6000 console.log("Public API URL:", publicApiUrl); // 输出: http://192.168.1.199:3000 console.log("Port:", port); // 输出: 3000 // --- 获取 geoserver 配置 --- // 注意:键名包含特殊字符,必须使用方括号表示法 // 获取第一个 geoserver 服务器的配置 const geoServer1 = config.geoserver['http://192.168.1.68:8080']; const cnLayers = geoServer1.cn; // 或者 config.geoserver['http://192.168.1.68:8080']['cn'] const hnLayers = geoServer1.hn; console.log("\n--- GeoServer Config (192.168.1.68:8080) ---"); console.log("CN Layers:", cnLayers); console.log("First CN Layer:", cnLayers[0]); // 输出: JL1KF01A_PMS02_20250111114728_200339415_101_0030_001_L3D_PSH console.log("HN Layers:", hnLayers); // 获取第二个 geoserver 服务器的配置 const geoServer2 = config.geoserver['http://192.168.1.199:8081']; const jhhyLayers = geoServer2.JHHY_external; console.log("\n--- GeoServer Config (192.168.1.199:8081) ---"); console.log("JHHY External Layers:", jhhyLayers); console.log("Second JHHY Layer:", jhhyLayers[1]); // 输出: 浙江天台抽蓄_1 # python 解析json字符串 import json # 1. 定义 JSON 字符串 (使用三引号保持格式) json_string = """ { "server": { "apiBaseUrl": "http://127.0.0.1:6000", "publicApiUrl": "http://192.168.1.199:3000", "port": 3000 }, "geoserver": { "http://192.168.1.68:8080": { "cn": [ "JL1KF01A_PMS02_20250111114728_200339415_101_0030_001_L3D_PSH", "JL1KF02B03_PMS01_20250512121714_200382571_101_0016" ], "hn": [ "JL1KF01A_200297952_001_L5D_PSH" ] }, "http://192.168.1.199:8081": { "JHHY_external": [ "浙江天台抽蓄_0", "浙江天台抽蓄_1" ] } } } """ # 2. 解析 JSON 字符串为 Python 字典 config = json.loads(json_string) # 3. 获取各参数 # --- 获取 server 配置 --- api_base_url = config['server']['apiBaseUrl'] public_api_url = config['server']['publicApiUrl'] port = config['server']['port'] print("--- Server Config ---") print(f"API Base URL: {api_base_url}") # 输出: http://127.0.0.1:6000 print(f"Public API URL: {public_api_url}") # 输出: http://192.168.1.199:3000 print(f"Port: {port}") # 输出: 3000 # --- 获取 geoserver 配置 --- # Python 访问字典键,无论是否包含特殊字符,都使用方括号 # 获取第一个 geoserver 服务器的配置 geo_server_1 = config['geoserver']['http://192.168.1.68:8080'] cn_layers = geo_server_1['cn'] hn_layers = geo_server_1['hn'] print("\n--- GeoServer Config (192.168.1.68:8080) ---") print(f"CN Layers: {cn_layers}") print(f"First CN Layer: {cn_layers[0]}") # 输出: JL1KF01A_PMS02_20250111114728_200339415_101_0030_001_L3D_PSH print(f"HN Layers: {hn_layers}") # 获取第二个 geoserver 服务器的配置 geo_server_2 = config['geoserver']['http://192.168.1.199:8081'] jhhy_layers = geo_server_2['JHHY_external'] print("\n--- GeoServer Config (192.168.1.199:8081) ---") print(f"JHHY External Layers: {jhhy_layers}") print(f"Second JHHY Layer: {jhhy_layers[1]}") # 输出: 浙江天台抽蓄_1 # geoserver解析方法 典型的遍历嵌套 JSON 结构的任务。我们需要分三步走: 获取 geoserver 对象,计算其键的数量,这就是 URL 的数量。 遍历每个 URL,获取其对应的对象,再计算该对象的键的数量,这就是 workspace 的数量。 遍历每个 workspace,获取其对应的值(这是一个数组),这个数组就是 layers 列表。 1. JavaScript 实现 在 JavaScript 中,我们使用 Object.keys() 来获取对象的所有键,并通过 .length 属性获取数量。使用 for...in 循环来遍历对象的键。 # 遍历嵌套 JSON 结构 // 1. 定义并解析 JSON 字符串 const jsonString = `{ "server": { "apiBaseUrl": "http://127.0.0.1:6000" }, "geoserver": { "http://192.168.1.68:8080": { "cn": ["JL1KF01A_PMS02_...", "JL1KF02B03_PMS01_..."], "hn": ["JL1KF01A_200297952_..."], "DQWSY": ["湖南_DAWSY_0", "湖南_DAWSY_1"], "JHHY_internal": ["浙江天台抽蓄_0"] }, "http://192.168.1.199:8081": { "JHHY_external": ["浙江天台抽蓄_0", "浙江天台抽蓄_1"] } } }`; const config = JSON.parse(jsonString); const geoserver = config.geoserver; // 2. 获取 geoserver 下有多少个 URL const urlCount = Object.keys(geoserver).length; console.log(`GeoServer 下共有 ${urlCount} 个 URL。`); console.log('------------------------------------------'); // 3. 遍历每个 URL,获取其下的 workspace 和 layers for (const url in geoserver) { const workspaces = geoserver[url]; const workspaceCount = Object.keys(workspaces).length; console.log(`URL: ${url}`); console.log(` - 包含 ${workspaceCount} 个 Workspace:`); // 遍历每个 workspace for (const workspaceName in workspaces) { const layers = workspaces[workspaceName]; console.log(` - Workspace "${workspaceName}" 包含 ${layers.length} 个 Layers:`); // 遍历并打印每个 layer layers.forEach(layer => { console.log(` - ${layer}`); }); } console.log('------------------------------------------'); } # 20260328 重启vue3 with ai