【编写Node接口;接口动态获取VUE文件并异步加载, 并渲染impoort插件使用】
编写Node接口;接口动态获取VUE文件并异步加载, 并渲染impoort插件使用;
- vue3-sfc-loader
- 主要特征:
- 编写Node接口:
- Vue2项目使用:
- Vue3项目使用:(页面按需加载插件、图片等)
- 主要使用:页面按需加载插件、图片。
- 扩展——页面下一步异步加载动态组件:详细代码及组件引用扩展
- 完整源码:
本文使用vue3-sfc-loader在运行时从Node.js服务器动态加载Vue3和Vue2的单文件组件,无需依赖Node.js构建过程,同时展示了在Express应用中设置接口以及在Vue项目中使用loader的详细步骤。
vue3-sfc-loader ( https://github.com/FranckFreiburger/vue3-sfc-loader),它是Vue3/Vue2 单文件组件加载器。
在运行时从 html/js 动态加载 .vue 文件。无需 Node.js 环境,无需 (webpack) 构建步骤。
vue3-sfc-loader
*以下来源博主:https://blog.csdn.net/SongZhengxing_/article/details/137627777
本文添加补充:页面按需加载插件、图片
等
主要特征:
- 支持 Vue 3 和 Vue 2(参见dist/)
- 仅需要 Vue 仅运行时构建
- 提供esm和umd捆绑包(示例)
- 嵌入式ES6模块支持(含import())
- TypeScript 支持、JSX 支持
- 自定义 CSS、HTML 和脚本语言支持,请参阅pug和stylus示例
- SFC 自定义块支持
- 通过日志回调正确报告模板、样式或脚本错误
- 专注于组件编译。网络、样式注入和缓存由您决定(参见下面的示例)
- 轻松构建您自己的版本并自定义您需要支持的浏览器
编写Node接口:
编写Node接口提供服务,用于返回vue文件
项目初始化和安装
mkdir nodeServe
cd nodeServe
npm iniy -y
npm install express cors
项目完整结构
nodeServer
├── index.js
├── loaderVue2.vue
├── loaderVue3.vue
├── package-lock.json
└── package.json
添加 index.js
// express 基于Node.js平台,快速、开放、极简的 Web 开发框架 https://www.expressjs.com.cn/
const express = require("express")
const app = express()
const cors = require("cors")
const fs = require('fs');// 配置cors中间件,允许跨域
app.use(cors())app.get("/getVue2Str", (req, res) => {// 服务端读取文件,并变成字符串。传递给前端const data = fs.readFileSync('./loaderVue2.vue', 'utf8');res.send({code:200,fileStr:data,fileName:"loaderVue2.vue"});
})app.get("/getVue3Str", (req, res) => {// 服务端读取文件,并变成字符串。传递给前端const data = fs.readFileSync('./loaderVue3.vue', 'utf8');res.send({code:200,fileStr:data,fileName:"loaderVue2.vue"});
})app.listen(3000, () => {console.log("服务启动成功:http://localhost:3000")
})
这里用到的两个vue文件代码如下:
loaderVue2.vue
<template><div><h1>我是远程加载的组件</h1><input :value="value" @input="changeName" /><button @click="patchParentEvent">触发父组件方法</button></div>
</template>
<script>
export default {props: ["value"],methods: {changeName(e) {this.$emit("input", e.target.value);},patchParentEvent() {this.$emit("parentEvent");},},
};
</script><style scoped>
h1 {color: red;
}
</style>
loaderVue3.vue
<template><div><h1>测试远程页</h1><div>引入图片:<img :src="resourceVersion" alt="" /></div><input v-model="input" placeholder="placeholder" @input="changeValue" /><button @click="emitParentFun">点击emit</button></div>
</template><script setup>
import { defineProps, defineEmits, ref, onMounted } from "vue";
import resourceVersion from "@/assets/images/resource_version.png";
import { ElMessage } from "element-plus";const props = defineProps(["modelValue"]);
// 更新model绑定的值固定写法: update:modelValue
const emit = defineEmits(["update:modelValue", "childClick"]);let input = ref("");onMounted(() => {input.value = props.modelValue;// window环境指向的是接收方的window环境// console.log(window.testName);
});const changeValue = (e) => {// 修改父组件的值emit("update:modelValue", e.target.value);
};const emitParentFun = () => {ElMessage({message: "引入组件测试",type: "success",});// console.log("调用父组件的方法3", input.value);emit("childClick", input.value);
};
</script><style scope>
.text-red {color: red;
}
</style>
运行:
node index.js
接口返回的格式如下:
http://localhost:3000/getVue2Str
{"code": 200,"fileStr": "<template>\r\n <div>\r\n <h1>我是远程加载的组件</h1>\r\n <input :value=\"value\" @input=\"changeName\" />\r\n <button @click=\"patchParentEvent\">触发父组件方法</button>\r\n </div>\r\n</template>\r\n<script>\r\nexport default {\r\n props: [\"value\"],\r\n methods: {\r\n changeName(e) {\r\n this.$emit(\"input\", e.target.value);\r\n },\r\n patchParentEvent() {\r\n this.$emit(\"parentEvent\");\r\n },\r\n },\r\n};\r\n</script>\r\n\r\n<style scoped>\r\nh1 {\r\n color: red;\r\n}\r\n</style>\r\n","fileName": "loaderVue2.vue"
}
Vue2项目使用:
安装 vue3-sfc-loader
npm install vue3-sfc-loader
使用
注意:
vue2要从dist/vue2-sfc-loader这个目录下引入loadModule使用
vue2要从dist/vue3-sfc-loader这个目录下引入loadModule使用
<template><div><component :is="remote" v-bind="$attrs" v-if="remote" v-model="name" @parentEvent="parentEvent"></component></div>
</template><script>
import * as Vue from "vue"
import {loadModule} from "vue3-sfc-loader/dist/vue2-sfc-loader"export default {name: 'App',data() {return {name: "李四",remote: null,url: "http://localhost:3000/getVue2Str",}},mounted() {this.load(this.url)},watch: {name(newName) {console.log(newName, "监听到变化")}},methods: {// 加载async load(url) {let res = await fetch(url).then(res => res.json());const options = {moduleCache: {vue: Vue},async getFile() {return res.fileStr},addStyle(textContent) {const style = Object.assign(document.createElement('style'), {textContent})const ref = document.head.getElementsByTagName('style')[0] || nulldocument.head.insertBefore(style, ref)},};// 加载远程组件this.remote = await loadModule(res.fileName || "loader.vue", options)},// 子组件调用parentEvent() {console.log("父组件事件触发")}}
}
</script>
效果显示:
Vue3项目使用:(页面按需加载插件、图片等)
安装:
npm install vue3-sfc-loader
主要使用:页面按需加载插件、图片。
- 返回的展示页面,正常使用插件及引入图片
- 父组件中,需要将(接口返回的) 子组件中引入的插件等同等import
<template><div><componentv-if="componentName":is="componentName"ref="stepComponent":listData="testList":handleNodeClick="handleNodeClick"@childClick="childClick"/></div>
</template><script setup>
import { ref, onMounted, computed, defineAsyncComponent, defineComponent, h, shallowRef } from "vue";
import { loadModule } from "vue3-sfc-loader/dist/vue3-sfc-loader";
import * as Vue from "vue";
import * as ElementPlus from "element-plus";
import testPic from "@/assets/images/resource_version.png";//加载页面组件
const resResult = ref();
const componentName = computed(() => {const options = {// 模块缓存moduleCache: {vue: Vue,"element-plus": ElementPlus, // 组件按需引入"@/assets/images/resource_version.png": testPic, // 图片引入},async getFile() {return resResult.value.fileStr;},addStyle(textContent) {const style = Object.assign(document.createElement("style"), {textContent,});const ref = document.head.getElementsByTagName("style")[0] || null;document.head.insertBefore(style, ref);},};return defineAsyncComponent(() =>loadModule(resResult.value?.fileName || "loader.vue", options));
})// 接口请求————获取的后端页面数据
onMounted(async () => {let url = "http://localhost:3000/getVue3Str";resResult.value = await fetch(url ).then((res) => res.json());console.log("resResult------", resResult.value);
});
</script><style scoped>
</style>
扩展——页面下一步异步加载动态组件:详细代码及组件引用扩展
<template><div class="step-content" style="height: 100%; min-height: 380px"><div class="step-left"><el-steps direction="vertical" :active="active"><el-step title="创建工程" /><el-step title="基础配置" /><el-step title="模型选取" /><el-step title="模型配置" /><el-step title="生成" /><el-step title="下载" /></el-steps></div><div class="step-right"><div class="step-bd"><componentv-if="componentName":is="componentName"ref="stepComponent":listData="true":handleNodeClick="false"@childClick="childClick"/><el-empty v-else description="空" /></div><div class="next-btn-bd"><el-button style="margin-top: 12px" @click="cancelClick">取消</el-button><el-button style="margin-top: 12px" @click="previousClick">上一步</el-button><el-button style="margin-top: 12px" @click="nextClick">下一步</el-button></div></div></div>
</template><script setup>
import {ref,onMounted,computed,defineAsyncComponent,defineComponent,h,shallowRef,
} from "vue";
import { resetRelation, resetMeta, backendUpdate } from "@/api/system";
import { ElMessage } from "element-plus";
import step1Component from "./basicComponent.vue";
import { useAuthStore } from "@/store/authStore";
import { compileScript, parse } from "@vue/compiler-sfc";
import { loadModule } from "vue3-sfc-loader/dist/vue3-sfc-loader";
import * as Vue from "vue";
import * as ElementPlus from "element-plus";
import testPic from "@/assets/images/resource_version.png";
const authStore = useAuthStore();
const token = authStore.getToken();const stepComponent = ref(null);
// 下一步
const active = ref(0);
// const asyncComponent = ref(null);
const AsyncComponent = shallowRef(null);const previousClick = () => {if (active.value-- < 1) active.value = 0;
};
const nextClick = async () => {// import("./basicComponent2.vue")// .then((module) => {// asyncComponent.value = defineAsyncComponent(() =>// Promise.resolve(module.default)// );// // 或者更简单地,直接使用加载的模块(如果不需要额外的异步处理逻辑)// // asyncComponent.value = module.default;// })// .catch((err) => {// console.error("Failed to load component:", err);// });// return;// if (stepComponent.value) {// if (active.value === 1) {// // await stepComponent.value?.childNextMethod();// } else if (active.value === 2) {// // await stepComponent.value?.childNextMethod();// } else if (active.value === 3) {// // await stepComponent.value?.childNextMethod();// } else if (active.value === 4) {// // await stepComponent.value?.childNextMethod();// } else if (active.value === 5) {// // await stepComponent.value?.childNextMethod();// } else if (active.value === 6) {// // await stepComponent.value?.childNextMethod();// }// }if (active.value++ > 5) active.value = 0;
};
const cancelClick = () => {active.value = 0;
};const resResult = ref();
const componentName = computed(() => {if (active.value === 1) {const options = {moduleCache: {vue: Vue,"element-plus": ElementPlus,"@/assets/images/resource_version.png": testPic,},async getFile() {return resResult.value.fileStr;},addStyle(textContent) {const style = Object.assign(document.createElement("style"), {textContent,});const ref = document.head.getElementsByTagName("style")[0] || null;document.head.insertBefore(style, ref);},};// defineAsyncComponent(() =>// loadModule(res.fileName || "loader.vue", options)// );// const loadDynamicComponent = () =>// loadModule(resResult.value..fileName || "loader.vue", options);// 加载远程组件return defineAsyncComponent(() =>loadModule(resResult.value?.fileName || "loader.vue", options));} else if (active.value === 4) {// return defineAsyncComponent(() => import("./basicComponent2.vue"));return defineAsyncComponent({loader: () => import("./basicComponent2.vue"),loadingComponent: {template: "<div>Loading...</div>",},errorComponent: {template: "<div>Error loading component</div>",},delay: 200, // 显示加载组件的延迟时间(毫秒)timeout: 3000, // 超时时间(毫秒)});} else if (active.value === 3) {// 模拟异步加载组件const loadDynamicComponent = () => {return new Promise((resolve) => {setTimeout(() => {// 动态创建组件const AsyncDynamicComponent = defineComponent({name: "AsyncDynamicComponent",setup() {// 使用 ref 定义响应式数据const title = ref("Dynamic Title");const description = ref("This is a dynamically loaded component.");// 返回渲染函数return () =>h("div", // 根元素{}, // 属性[h("h1", {}, title.value), // 动态标题h("p", {}, description.value), // 动态描述]);},});// 解析 Promise,返回动态组件resolve(AsyncDynamicComponent);}, 0);});};// 使用 defineAsyncComponent 加载这个动态组件const AsyncLoadedComponent = defineAsyncComponent(loadDynamicComponent);return defineAsyncComponent(loadDynamicComponent);} else if (active.value === 2) {const loadDynamicComponent4 = () => {return new Promise((resolve) => {setTimeout(() => {// 动态模板字符串const templateString = `<div><h1>{{ title }}</h1><p>{{ description }}</p></div>`;// 动态创建组件const AsyncDynamicComponent4 = defineComponent({name: "AsyncDynamicComponent4",setup() {const count = ref(0);const increment = () => {count.value++;};// 返回渲染函数return () =>h("div", // 根元素{}, // 属性[h("p", {}, `Count: ${count.value}`),h("button", { onClick: increment }, "Increment"),]);},});// 解析 Promise,返回动态组件resolve(AsyncDynamicComponent4);}, 0);});};// 使用 defineAsyncComponent 加载这个动态组件const AsyncLoadedComponent = defineAsyncComponent(loadDynamicComponent4);return defineAsyncComponent(loadDynamicComponent4);} else if (active.value === 5) {// -------------const dynamicLoader = {loadedComponents: new Map(),async loadComponent({ name, js, css }) {if (this.loadedComponents.has(name)) {return this.loadedComponents.get(name);}// 加载CSSif (css) {const link = document.createElement("link");link.rel = "stylesheet";link.href = css; //css的URL路径document.head.appendChild(link);}// 加载JS// const script = await fetch(js).then((r) => r.text());const script = `import { openBlock as r, createElementBlock as s } from "vue";
const _ = (c, t) => {const e = c.__vccOpts || c;for (const [o, n] of t)e[o] = n;return e;
}, a = {}, f = { class: "cs1" };
function l(c, t) {return r(), s("div", f, "测试");
}
const i = /* @__PURE__ */ _(a, [["render", l]]);
export {i as default
};
`;// 创建沙盒环境// 如果JS模块依赖外部库或Vue本身,可能会因为沙盒环境无法访问外部变量而报错。// 例如,如果JS代码里有import Vue from 'vue',在沙盒中执行时会找不到Vue,导致错误。// 用户可能需要确保JS代码是自包含的,或者正确传递依赖。const component = new Function(`"use strict";const exports = {};const module = { exports };${script}return module.exports.__esModule ? module.exports.default : module.exports;`)();// 缓存组件this.loadedComponents.set(name, component);return component;},};const jsUrl = `const _sfc_main = {__name: 'MyComponent',setup(__props) {const count = ref(0);return (_ctx, _cache) => {return _createVNode("button", {onClick: () => count.value++}, "Clicked: " + count.value)}}
};
export default _sfc_main;`;const cssUrl = ``;// Vue 3 示例====const AsyncComponent = defineAsyncComponent({loader: () =>dynamicLoader.loadComponent({name: `componentName`,js: "", // jsUrlcss: "", // cssUrl}),loadingComponent: {template: "<div>Loading...</div>",},errorComponent: {template: "<div>Error loading component</div>",},timeout: 3000,});return AsyncComponent;// -------------} else if (active.value === 6) {async function loadVueComponent(url = "") {// 1. 请求获取 .vue 文件内容// fetch('/api/get-vue-file-content')// .then(response => response.text())// .then(vueFileContent => {// console.log(vueFileContent);// // 在这里你可以将 vueFileContent 显示在页面上// })// .catch(error => console.error('Error fetching Vue file content:', error));// const response = await fetch(url);// const vueContent = await response.text();const vueContent = ``;const vueFileContent = `<template> <div> <h1>{{ title }}</h1> </div></template>
<script1>
export default {data() {return {title: 'Hello Vue!'};}
};
</script1>
<style scoped>
h1 {color: blue;
}
</style>
`;// 2. 使用 compiler-sfc 解析内容const { descriptor } = parse(vueContent);// 3. 提取各部分内容const template = descriptor.template?.content;const scriptContent = descriptor.script?.content || "export default {}";const styles = descriptor.styles.map((style) => style.content).join("\n");// 4. 动态编译 script 部分const { content: scriptCode } = compileScript(descriptor, {id: `dynamic-component-${Date.now()}`,});// 5. 将 script 转换为组件选项const scriptModule = { exports: {} };const script = new Function("exports", "module", scriptCode);script(scriptModule.exports, scriptModule);const componentOptions = scriptModule.exports.default || {};// 6. 处理模板if (template) {componentOptions.template = template;}// 7. 处理样式(可选:动态添加样式到页面)if (styles) {const styleEl = document.createElement("style");styleEl.textContent = styles;document.head.appendChild(styleEl);}// 8. 返回 Vue 组件return defineComponent(componentOptions);}loadVueComponent();}
});// ============
// const AsyncComponent = shallowRef(null);
// const props = ref({});// // 动态加载组件
// async function loadComponent() {
// try {
// const config = await fetchComponentConfig();
// AsyncComponent.value = await dynamicLoader.loadComponent(config);
// } catch (err) {
// handleError(err);
// }
// }
// ==============================// uid
// const generateUID = () => {
// const time = Date.now().toString(36);
// const random = Math.random().toString(36).substr(2, 5);
// return `${time}_${random}`;
// };const childClick = (newVal) => {console.log("获取子组事件和值", newVal);
};onMounted(async () => {resResult.value = await fetch("http://localhost:3000/getVue3Str").then((res) => res.json());console.log("resResult------", resResult.value);
});
</script><style scoped>
.step-content {display: flex;.step-left {min-width: 200px;}.step-right {flex: 1;display: flex;flex-direction: column;.step-bd {border: 3px solid var(--resource-relation-border);padding: 10px;flex: 1;}.next-btn-bd {text-align: right;/* height: 30px; */}}
}
</style>
完整源码:
https://gitee.com/szxio/load-remote-vue-components
相关文章:
【编写Node接口;接口动态获取VUE文件并异步加载, 并渲染impoort插件使用】
编写Node接口;接口动态获取VUE文件并异步加载, 并渲染impoort插件使用; vue3-sfc-loader主要特征: 编写Node接口:Vue2项目使用:Vue3项目使用:(页面按需加载插件、图片等)主要使用&am…...
vue入门:template 和 JSX
temlplate 和 jsx 最终渲染时都是创建 dom 节点 template 和 JSX 混合使用 <template><div><span>Message: {{ msg }}</span><br/><VNodes :vnodes"getJSXSpan()"/><VNodes :vnodes"getAnchoredHeading(4)"/>…...
[Dify] Dify 本地部署及连接 Ollama 模型全流程指南
在构建私有化智能应用时,Dify 作为一款开源的大模型应用开发平台,具备强大的插件体系和可扩展能力。本文将详细介绍如何在本地环境中部署 Dify,并成功连接本地的 Ollama 模型,解决实际部署过程中常见的问题与错误。 一、本地部署 Dify 步骤详解 1. 安装 Docker 环境(以 W…...
基于PyQt5的Jupyter Notebook转Python工具
一、项目背景与核心价值 在数据科学领域,Jupyter Notebook因其交互特性广受欢迎,但在生产环境中通常需要将其转换为标准Python文件。本文介绍一款基于PyQt5开发的桌面级转换工具,具有以下核心价值: 可视化操作:提供友好的GUI界面,告别命令行操作 批量处理:支持目录递归…...
从自然语言到 JSON 数据交互:探索 MCP 协议的自动化任务实现
好的!以下是基于我们讨论的关于 MCP 协议、JSON 数据交互以及自然语言到 JSON 转换的实现过程的总结,格式化为一篇 CSDN 风格的博客记录。这篇文章将记录你的发现,适合分享给技术社区。 从自然语言到 JSON 数据交互:探索 MCP 协议…...
n8n 本地部署及实践应用,实现零成本自动化运营 Telegram 频道(保证好使)
n8n 本地部署及实践应用,实现零成本自动化运营 Telegram 频道(保证好使) 简介 n8n 介绍 一、高度可定制性 二、丰富的连接器生态 三、自托管部署(本地部署) 四、社区驱动 n8n 的部署 一、前期准备 二、部署步…...
嵌入式学习(37)-STM32串口发送中断的实现
一、概述 项目中需要用到发送中断,所以了解了发送中断的一些知识。 二、应用 状态寄存器USART_SR的复位值为0x00C0H, 也就是第七位TXE和第六位TC复位值为1,而TXE1,表明发送数据寄存器为空, TC1表明发送已完成。 USART_ITConfig(USART1, USA…...
Android envsetup与Python venv使用指南
Android envsetup 和 Python venv 是两种完全不同的环境配置工具,分别服务于不同的开发场景。以下是对它们的详细解释及使用方法: 1. Android envsetup 用途: Android envsetup 是 Android 源码开发中的环境配置脚本(envsetup.sh…...
安卓关机和重启源码流程
// systemui关机 frameworks/base/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsComponent.java Overridepublic void shutdown() {try {mBarService.shutdown();} catch (RemoteException e) {}}frameworks/base/services/core/java/com/android…...
解决单设备号双目摄像头调用难题:经验分享与总结
解决单设备号双目摄像头调用难题:经验分享与总结 在计算机视觉项目中,双目摄像头的调用是常见需求,但过程中往往会遇到各种挑战。最近,我就经历了一段曲折但最终成功解决问题的历程,现在将这段宝贵经验分享给大家。 一、问题背景 我手头的双目摄像头仅有一个设备号(设…...
【RL系列】DAPO: An Open-Source LLM Reinforcement Learning System at Scale
1. 简介 尽管RL对complex reasoning效果提升有重要作用,但是在openAI o1和DeepSeek R1 technical report上都没有详细的实验细节。本文主要提出了DAPO算法,提出了4个关键技术点并开源参数和代码。在AIME 2024验证了DAPO算法的有效性。 2. Tricks Exc…...
五子棋(测试报告)
文章目录 一、项目介绍二、测试用例三、自动化测试用例的部分展示注册登录游戏大厅游戏匹配 总结 一、项目介绍 本项目是一款基于Spring、SpringMVC、MyBatis、WebSocket的双人实时对战五子棋游戏,游戏操作便捷,功能清晰明了。 二、测试用例 三、自动化测试用例的…...
【小工具】定时任务执行器
定时任务执行器 背景版本代码JobJob执行机 背景 有时我们的项目内需要一个定时执行器来执行某些任务,就需要一个简单好用的定时任务机。 注意,这个定时任务机并不原生支持分布式,如果需要分布式的功能请自己实现。 版本 jdk21 代码 Job …...
LVGL源码(7):渲染
在LVGL源码(4):LVGL关于EVENT事件的响应逻辑_lvgl实现显示打车-CSDN博客这篇文章中,我们提到了LVGL的三大步骤:检测用户输入操作、调用我们编写的逻辑、在屏幕上显示对应的画面;而在学习完“样式”之后,我们或许可以将上述步骤说明…...
02_通过调用硅基流动平台deepseekapi按输入的标题生成文章
from openai import OpenAIclient OpenAI(base_urlhttps://api.siliconflow.cn/v1,api_keyyou api-key )# 定义关键词变量 keyword "人性的弱点都有哪些?"# 发送带有流式输出的请求 response client.chat.completions.create(model"deepseek-ai/D…...
三、Virtual Device Manager
一、创建AVD AVD是Android Virtual Device(安卓虚拟设备),我们可以启动Android Studio 选择 Virtual Device Manager 创建并启动一个模拟器。 二、设置屏幕大小 上面直接创建的镜像是不能设置屏幕大小的,启动后笔记本屏幕都放不下ÿ…...
MATLAB2022b安装
1 从百度网盘下载MATLAB2022b,下载完成后解压到某个文件夹; 链接: MATLAB2022b 提取码: 6666 2 打开解压后的文件夹,进入setup文件夹,双击打开“setup.exe”文件; 3 在弹出窗口中选择“高级选项”-->“我有文件安…...
计算机编码
计算机,不能直接存储文字,存储的是编码。 计算机只能处理二进制的数据,其它数据,比如:0-9、a-z、A-Z,这些字符,我们可以定义一套规则来表示。假如:A用110表示,B用111表示…...
Dell EMC Unity NAS 认证方式介绍
近日有个客户要配置EMC Unity的NAS访问,我们知道NAS有Linux环境下的NFS和Windows环境下的SMB(也叫做CIFS)。单独配置其中的一种访问协议相对简单,但是客户提出的要求是要对文件系统同时NFS和SMB访问,这就有些复杂&…...
SpringAi 会话记忆功能
在使用chatGPT,豆包等产品后,就会发现他们的会话有“记忆”功能。 那么我们用API接口的话,这个是怎么实现的呢? 属于比较粗暴的方式,把之前的内容与新的提示词一起再次发给大模型。让我们看到他们有记忆功能。 下面介绍…...
BUUCTF-web刷题篇(25)
34.the mystery of ip 给出链接,输入得到首页: 有三个按钮,flag点击后发现页面窃取客户端的IP地址,通过给出的github代码中的php文件发现可以通过XFF或Client-IP传入值。使用hackbar或BP 使用XSS,通过github给出的目录…...
Elasticsearch 性能优化:从原理到实践的全面指南
Elasticsearch(ES)作为一款基于 Lucene 的分布式搜索和分析引擎,广泛应用于日志分析、搜索引擎和实时数据处理等场景。然而,在高并发、大数据量环境下,Elasticsearch 的性能可能面临瓶颈,如查询延迟高、索引…...
UITableVIew性能优化概述
UITableVIew性能优化概述 文章目录 UITableVIew性能优化概述前言如何优化优化的本质卡顿的原因 CPU层级cell复用UITableVIew尽量采用复用 定义cell的种类尽量少,可以多用hidden缓存cell高度基础设置预先设置高度设置一个预先缓存 异步绘制滑动按照需加载尽量显示大小…...
【Linux网络与网络编程】09.传输层协议TCP
前言 TCP 即 传输控制协议 (Transmission Control Protocol),该协议要对数据的传输进行一个详细的控制(数据传输时什么时候传输,一次发多少,怎么发,出错了怎么办……) 本篇博客将从下面这张TCP协议格式图…...
08.unity 游戏开发-unity编辑器资源的导入导出分享
08.unity 游戏开发-unity编辑器资源的导入导出分享 提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是Python基础语法。前后每一小节的内容是存在的有:学习and理解的关联性,希望对您有用~ unity简介…...
Docker Swarm 集群
Docker Swarm 集群 本文档介绍了 Docker Swarm 集群的基本概念、工作原理以及相关命令使用示例,包括如何在服务调度中使用自定义标签。本文档适用于需要管理和扩展 Docker 容器化应用程序的生产环境场景。 1. 什么是 Docker Swarm Docker Swarm 是用于管理 Docker…...
数据中台、数据湖和数据仓库 区别
1. 核心定义与定位 数据仓库(Data Warehouse) 定义:面向主题的、集成的、历史性且稳定的结构化数据集合,主要用于支持管理决策和深度分析。定位:服务于管理层和数据分析师,通过历史数据生成报表和商业智能…...
【CodeMirror】系列(二)官网示例(五)可撤销操作、拆分视图、斑马条纹
一、可撤销操作 默认情况下,history 历史记录扩展仅跟踪文档和选择的更改,撤销操作只会回滚这些更改,而不会影响编辑器状态的其他部分。 不过你也可以将其他的操作定义成可撤销的。如果把这些操作看作状态效果,就可以把相关功能整…...
SpringBoot 动态路由菜单 权限系统开发 菜单权限 数据库设计 不同角色对应不同权限
介绍 系统中的路由配置可以根据用户的身份、角色或其他权限信息动态生成,而不是固定在系统中。不同的用户根据其权限会看到不同的路由,访问不同的页面。对应各部门不同的权限。 效果 [{"id": 1,"menuName": "用户管理"…...
scikit-learn 开源框架在机器学习中的应用
文章目录 scikit-learn 开源框架介绍1. 框架概述1.1 基本介绍1.2 版本信息 2. 核心功能模块2.1 监督学习2.2 无监督学习2.3 数据处理 3. 关键设计理念3.1 统一API设计3.2 流水线(Pipeline) 4. 重要辅助功能4.1 模型选择4.2 评估指标 5. 性能优化技巧5.1 并行计算5.2 内存优化 6…...
GPT-4、Grok 3与Gemini 2.0 Pro:三大AI模型的语气、风格与能力深度对比
更新后的完整CSDN博客文章 以下是基于您的要求,包含修正后的幻觉率部分并保留原始信息的完整CSDN博客风格文章。幻觉率已调整为更符合逻辑的描述,其他部分保持不变。 GPT-4、Grok 3与Gemini 2.0 Pro:三大AI模型的语气、风格与能力深度对比 …...
Cyber Weekly #51
赛博新闻 1、英伟达开源新模型,性能直逼DeepSeek-R1 本周,英伟达开源了基于Meta早期Llama-3.1-405B-Instruct模型开发的Llama-3.1-Nemotron-Ultra-253B-v1大语言模型,该模型拥有2530亿参数,在多项基准测试中展现出与6710亿参数的…...
QT聊天项目开发DAY02
1.添加输入密码的保密性 LoginWidget::LoginWidget(QDialog*parent): QDialog(parent) {ui.setupUi(this);ui.PassWord_Edit->setEchoMode(QLineEdit::Password);BindSlots(); }2.添加密码的验证提示 3.修复内存泄漏,并嵌套UI子窗口到主窗口里面 之前并没有设置…...
Spring AI高级RAG功能查询重写和查询翻译
1、创建查询重写转换器 // 创建查询重写转换器queryTransformer RewriteQueryTransformer.builder().chatClientBuilder(openAiChatClient.mutate()).build(); 查询重写是RAG系统中的一个重要优化技术,它能够将用户的原始查询转换成更加结构化和明确的形式。这种转…...
速盾:高防CDN的原理和高防IP一样吗?
随着互联网的发展,网络安全威胁日益严重,尤其是DDoS攻击、CC攻击等恶意行为,给企业带来了巨大的风险。为了应对这些挑战,许多企业开始采用高防CDN(内容分发网络)和高防IP作为防御措施。尽管两者都能提供一定…...
SQLite-Web:一个轻量级的SQLite数据库管理工具
SQLite-Web 是一个基于 Web 浏览器的轻量级 SQLite 数据库管理工具。它基于 Python 开发,免费开源,无需复杂的安装或配置,适合快速搭建本地或内网的 SQLite 管理和开发环境。 SQLite-Web 支持常见的 SQLite 数据库管理和开发任务,…...
数智读书笔记系列028 《奇点更近》
一、引言 在科技飞速发展的今天,我们对未来的好奇与日俱增。科技将如何改变我们的生活、社会乃至人类本身?雷・库兹韦尔的《奇点更近》为我们提供了深刻的见解和大胆的预测,让我们得以一窥未来几十年的科技蓝图。这本书不仅是对未来科技趋势…...
深入理解linux操作系统---第4讲 用户、组和密码管理
4.1 UNIX系统的用户和组 4.1.1 用户与UID UID定义:用户身份唯一标识符,16位或32位整数,范围0-65535。系统用户UID为0(root)、1-999(系统服务),普通用户从1000开始分配特殊UID&…...
系统设计模块之安全架构设计(常见攻击防御(SQL注入、XSS、CSRF、DDoS))
一、SQL注入攻击防御 SQL注入是通过恶意输入篡改数据库查询逻辑的攻击方式,可能导致数据泄露或数据库破坏。防御核心在于隔离用户输入与SQL代码,具体措施包括: 参数化查询(预编译语句) 原理:将SQL语句与用…...
redission锁释放失败处理
redission锁释放失败处理 https://www.jianshu.com/p/055ae798547a 就是可以删除 锁的key 这样锁就释放了,但是 还是要结合业务,这种是 非正规的处理方式,还是要在代码层面进行处理。...
Visual Studio Code 在.S汇编文件中添加调试断点及功能简介
目录 一、VS Code汇编文件添加断点二、VS Code断点调试功能简介1. 设置断点(1) 单行断点(2) 条件断点(3) 日志断点 2. 查看断点列表3. 调试时的断点控制4. 禁用/启用断点5. 删除断点6. 条件断点的使用7. 多线程调试8. 远程调试9. 调试配置文件 一、VS Code汇编文件添加断点 最…...
计算视觉与数学结构及AI拓展
在快速发展的计算视觉领域,算法、图像处理、神经网络和数学结构的交叉融合,在提升我们对视觉感知和分析的理解与能力方面发挥着关键作用。本文探讨了支撑计算视觉的基本概念和框架,强调了数学结构在开发鲁棒的算法和模型中的重要性。 AI拓展…...
Vue2 老项目升级 Vue3 深度解析教程
Vue2 老项目升级 Vue3 深度解析教程 摘要 Vue3 带来了诸多改进和新特性,如性能提升、组合式 API、更好的 TypeScript 支持等,将 Vue2 老项目升级到 Vue3 可以让项目获得这些优势。本文将深入解析升级过程,涵盖升级前的准备工作、具体升级步骤…...
器件封装-2025.4.13
1.器件网格设置要与原理图一致,同时器件符号要与数据手册一致 2.或者通过向导进行编辑,同时电机高级符号向导进行修改符号名称 2.封装一般尺寸大小要比数据手册大2倍到1.5倍 焊盘是在顶层绘制,每个焊盘距离要用智能尺子测量是否跟数据手册一…...
Python 基础语法汇总
Python 语法 │ ├── 基本结构 │ ├── 语句(Statements) │ │ ├── 表达式语句(如赋值、算术运算) │ │ ├── 控制流语句(if, for, while) │ │ ├── 定义语句(def…...
Java函数式编程魔法:Stream API的10种妙用
在Java 8中引入的Stream API为函数式编程提供了一种全新的方式。它允许我们以声明式的方式处理数据集合,使代码更加简洁、易读且易于维护。本文将介绍Stream API的10种妙用,帮助你更好地理解和应用这一强大的工具。 1. 过滤操作:筛选符合条件…...
【力扣hot100题】(094)编辑距离
记得最初做这题完全没思路,这次凭印象随便写了一版居然对了。 感觉这题真的有点为出题而出题的意思,谁拿到这题会往动态规划方向想啊jpg 也算是总结出规律了,凡是遇到这种比较俩字符串的十有八九是动态规划,而且是二维动态规划&…...
穿透三层内网VPC2
网络拓扑 目标出网web地址:192.168.139.4 信息收集端口扫描: 打开8080端口是一个tomcat的服务 版本是Apache Tomcat/7.0.92 很熟悉了,可能存在弱口令 tomcat/tomcat 成功登录 用哥斯拉生成马子,上传war包,进入后台 C…...
AI数字消费第一股,重构商业版图的新物种
伍易德带领团队发布“天天送AI数字商业引擎”,重新定义流量与消费的关系 【2025年4月,深圳】在人工智能浪潮席卷全球之际,深圳天天送网络科技有限公司于深圳大中华喜来登酒店重磅召开“AI数字消费第一股”发布盛典。公司创始人伍易德首次系统…...
Unity 基于navMesh的怪物追踪惯性系统
今天做项目适合 策划想要实现一个在现有的怪物追踪系统上实现怪物拥有惯性功能 以下是解决方案分享: 怪物基类代码: using UnityEngine; using UnityEngine.AI;[RequireComponent(typeof(NavMeshAgent))] [RequireComponent(typeof(AudioSource))] …...