当前位置: 首页 > news >正文

微前端 qiankun vite vue3

文章目录

    • 简介
    • 主应用 qiankun-main vue3 vite
    • 子应用 qiankun-app-vue2 webpack5
    • 子应用 qiankun-react webpack5
    • 子应用 quankun-vue3 vite
    • 遇到的问题

在这里插入图片描述

简介

主要介绍以qiankun框架为基础,vite 搭建vue3 项目为主应用,wepack vue2 和 webpack react 搭建的子应用,形成的一个微前端框架。

主应用 qiankun-main vue3 vite

先用vite 创建一个vue3的标准框架 vue-router typescript 这些都可以选上

yarn create vue

主应用还要装上qiankun依赖

yarn add qiankun

创建一个qiankun-config.ts的文件

import { registerMicroApps, start } from 'qiankun'const beforeLoad: (...args: any[]) => any = (app: any) => {console.log('before load', app)
}
const beforeUnmount: (...args: any[]) => any = (app: any) => {console.log('after unmount', app)
}
const beforeMount: (...args: any[]) => any = (app: any) => {console.log('before mount', app)
}
export function registerApps() {try {registerMicroApps([{name: 'app-vue3', // 子应用名称,跟package.json一致entry: '//localhost:7001', // 子应用入口,本地环境下指定端口container: '#sub-container', // 挂载子应用的domactiveRule: '/app/app-vue3', // 路由匹配规则props: {}, // 主应用与子应用通信传值},{name: 'app-react',entry: '//localhost:3000',container: '#sub-container',activeRule: '/app/app-react',props: {},},{name: 'app-vue2',entry: '//localhost:7003',container: '#sub-container',activeRule: '/app/app-vue2',props: {},}],// 生命周期函数 {beforeLoad: [beforeLoad],beforeMount: [beforeMount],afterUnmount: [beforeUnmount],},)start({sandbox: {experimentalStyleIsolation: true, // 沙箱样式隔离},})} catch (err) {console.log(err)}
}

将上面的文件引入main.ts中

import './assets/main.css'
import { registerApps } from './qiankun-config'
import { createApp } from 'vue'
import { createPinia } from 'pinia'import App from './App.vue'
import router from './router'const app = createApp(App)app.use(createPinia())
app.use(router)app.mount('#qiankun') // 记得把html的挂载id dom改一改registerApps()

创建一个专门用来存放子应用的组件 SubContainer.vue

<script setup lang="ts">
</script><template><h1>Container</h1><div id="sub-container"></div>
</template>

改造主应用的路由router/index.ts

import { createRouter, createWebHistory } from 'vue-router'
import HomeView from '../views/HomeView.vue'
// import Layout from '../layout/index.vue'
const router = createRouter({history: createWebHistory(import.meta.env.BASE_URL),routes: [{path: '/',name: 'home',component: HomeView,},{// history模式需要通配所有路由,详见vue-router文档path: '/app/app-vue3/:pathMatch(.*)*',name: 'app-vue3',meta: {},component: () => import('@/views/SubContainer.vue'),},{path: '/app/app-react/:pathMatch(.*)*',name: 'app-react',meta: {},component: () => import('@/views/SubContainer.vue'),},{path: '/app/app-vue2/:pathMatch(.*)*',name: 'app-vue2',meta: {},component: () => import('@/views/SubContainer.vue'),},],
})export default router

主应用到这里开发环境基本就改造完成了 yarn dev启动开发环境服务器

子应用 qiankun-app-vue2 webpack5

安装vue2 webpack的项目
全局先安装vue-cli

npm install -g @vue/cli
# OR
yarn global add @vue/cli

配置电脑的环境变量 让vscode能够正确使用vue命令符
https://blog.csdn.net/yi_zongjishi/article/details/124831223
上述引用的文章里说以管理员权限启动vscode来处理vscode不能使用vue 的情况有点问题,实际上是以管理员权限启动powershell来执行那些命令后就可以了。

安装vue2框架

vue create qiankun-vue2

安装vue-router
vue2只能安装vue-router@3

yarn add vue-router@3

改webpack的output配置 和devServer配置
由于vue.confg.js存在,所以改造它就等于改造webpack

// const { defineConfig } = require('@vue/cli-service')
const { name } = require('./package')
module.exports = {devServer: {port: 7003, // 与主应用配置子应用的端口号一致就行headers: {'Access-Control-Allow-Origin': '*', // 处理开发环境因为端口号不同而产生的跨域问题},},configureWebpack: {// output为quankun官方要求的必须的output: {library: `${name}-[name]`,libraryTarget: 'umd', // 把微应用打包成 umd 库格式chunkLoadingGlobal: `webpackJsonp_${name}`,},},transpileDependencies: true,
}

根目录下创建一个名为 public-path.js的文件

// 在window上为qiankun挂载关键参数
if (window.__POWERED_BY_QIANKUN__) {// eslint-disable-next-line no-undef__webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__
}

在main.js第一行引入,并对main.js改造

import './public-path'
import Vue from 'vue'
import App from './App.vue'
import router from './router'
// import router from './router'
// import store from './store'Vue.config.productionTip = false // 关闭生产提示let instance = nullfunction render(props = {}) {const { container } = propsinstance = new Vue({router,// store,render: h => h(App)// container 表示 是qiankun主应用访问,限制一下搜索子应用挂载dom的范围,最好能改一下这个id的名称}).$mount(container ? container.querySelector('#vue-app2') : '#vue-app2')
}// 如果不是qiankun主应用下访问,而是子应用独立部署,正常执行render
if (!window.__POWERED_BY_QIANKUN__) {render();
}// 根据qiankun官方要求,子应用需要导出三个生命周期钩子函数bootstrap mount unmount
export async function bootstrap() {console.log('[vue] vue app bootstraped')
}
export async function mount(props) {console.log('[vue] props from main framework', props);render(props)
}
export async function unmount() {
// unmount 的时候摧毁掉整个子应用instance.$destroy()instance.$el.innerHTML = ''instance = null
}

记得改掉html文件挂载dom的id为vue-app2

对router.js进行改造

import VueRouter from "vue-router";
import Vue from "vue";
Vue.use(VueRouter);import Home from "./views/Home.vue";
import About from "./views/About.vue";
const routes = [{path: "/",redirect: "/home",},{path: "/home",component: Home,},{path: "/about",component: About,},
];const router = new VueRouter({mode: "history",base: window.__POWERED_BY_QIANKUN__ ? 'app/app-vue2' : '', // 通过qiankun主应用访问子应用时,base需要设置成为主应用专门挂载子用用所在的路径routes,
});export default router;

webpack 5 下的vue2框架项目在开发环境下的改造就差不多完成了。

子应用 qiankun-react webpack5

先从零安装一个react
https://blog.csdn.net/glorydx/article/details/115104561

安装 react-router-dom
改造App.js

import "./App.css";
import About from "./views/About.tsx";
import Home from "./views/Home.tsx";
import { NavLink, useRoutes,  Outlet} from "react-router-dom";
function App() {const base = window.__POWERED_BY_QIANKUN__ ? "/app/app-react/" : "/";const routes = useRoutes([{ path: base, redirect: base + "home", element: <Home /> },{ path: base + "home", element: <Home /> },{ path: base + "about", element: <About /> },]);return (<div className="app"><h1>React Router Dom</h1><div className="main"><div className="leftToolBar"><NavLink to={base + "home"}>Home</NavLink>{/* 或者如下写法传入标签体 */}<NavLink to={base + "about"}>About</NavLink></div><div className="rightContent">{routes}</div></div><Outlet /></div>);
}export default App;

根目录下的 public-path.js

if (window.__POWERED_BY_QIANKUN__) {// eslint-disable-next-line no-undef__webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__
}

改造index.js 最好替换一下挂载的dom id ,同样的需要引入public-path.js

import React from "react";
import ReactDOM from "react-dom/client";
import "./index.css";
import App from "./App";
import reportWebVitals from "./reportWebVitals";
import "./public-path.js";
import { BrowserRouter } from "react-router-dom";
function render(props) {const container = props?.container;const root = ReactDOM.createRoot(container? container.querySelector("#app-react"): document.querySelector("#app-react"));root.render(<BrowserRouter><React.StrictMode><App /></React.StrictMode></BrowserRouter>);
}// 然后加入生命周期即可 同样的三个生命周期导出
export async function bootstrap() {console.log("ReactMicroApp bootstraped");
}/*** 应用每次进入都会调用 mount 方法,通常我们在这里触发应用的渲染方法*/
export async function mount(props) {console.log("ReactMicroApp mount", props);render(props);
}/*** 应用每次 切出/卸载 会调用的方法,通常在这里我们会卸载微应用的应用实例*/
export async function unmount() {console.log("ReactMicroApp unmount");ReactDOM.unmountComponentAtNode(document.getElementById("#app-react"));
}// 如果不是qiankun,正常挂载
if (!window.__POWERED_BY_QIANKUN__) {render();
}
// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();

改造webpack.config.js 前提是react不会自动暴露这东西,在这之前,你必须执行过 npm run eject 或者yarn eject 去暴露webpack的配置文件

主要是给 output加上qiankun需要的配置

	const packageName = require('../package.json').name;...output: {....library: `${packageName}-[name]`,libraryTarget: 'umd',chunkLoadingGlobal: `webpackJsonp_${packageName}`,},

记得把html挂载的id给换了

<div id="app-react"></div>

如果要引入图片或者其他的什么静态资源
比如react项目本身的logo.svg无法正常显示了
需要在react子项目先把打包方式的hash给干掉
在这里插入图片描述
然后把这个svg不改名的情况下,按照路径给copy到主应用中
在这里插入图片描述
这样qiankun主应用vue3的项目就能正常显示这张图片 如果是其它格式的静态资源也是差不多类似上面的操作

子应用 quankun-vue3 vite

还是同样的方式,先安装一个标准的vite vue3项目 需要有vue-router ts 就行

与webpack 5 的配置方式不同,需要安装依赖 vite-plugin-qiankun
yarn add vite-plugin-qiankun

还是先改造main.ts 记得引入public-path.js 文件内容跟之前一样

import './public-path'
import './assets/main.css'
// alert(1111)
import { createApp } from 'vue'
import { createPinia } from 'pinia'import App from './App.vue'
import router from './router'
import { renderWithQiankun, qiankunWindow } from 'vite-plugin-qiankun/dist/helper'let app: any
function render(props = {}) {// 每一次render都需要创建一个新的app = createApp(App)app.use(createPinia()).use(router)const { container } = props as anyapp.mount(container ? container.querySelector('#app-vue3') : '#app-vue3')
}const bootstrap: (...args: any[]) => any = () => {console.log('vue app bootstraped')
}const mount: (...args: any[]) => any = (props) => {const { container } = propsrender(container)console.log('vue3 app mount')
}const unmount: (...args: any[]) => any = () => {app.unmount()
}const initQianKun = () => {// @ts-ignorerenderWithQiankun({mount,bootstrap,unmount,})// render()
}qiankunWindow.__POWERED_BY_QIANKUN__ ? initQianKun() : render()

改造一下router

import { createRouter, createWebHistory } from 'vue-router'
import HomeView from '../views/HomeView.vue'
import { qiankunWindow } from 'vite-plugin-qiankun/dist/helper'
const router = createRouter({history: createWebHistory(qiankunWindow.__POWERED_BY_QIANKUN__ ? '/app/app-vue3/' : '/'),routes: [{path: '/',redirect: '/home',},{path: '/home',name: 'home',component: HomeView,children: [],},{path: '/about',name: 'about',// route level code-splitting// this generates a separate chunk (About.[hash].js) for this route// which is lazy-loaded when the route is visited.component: () => import('../views/AboutView.vue'),},],
})export default router

配置一下vite.config.ts

import { fileURLToPath, URL } from 'node:url'import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
// import vueDevTools from 'vite-plugin-vue-devtools'
import qiankun from 'vite-plugin-qiankun'
// https://vite.dev/config/
export default defineConfig({plugins: [vue(),// vueDevTools(),qiankun('app-vue3', {useDevMode: true,}),],resolve: {alias: {'@': fileURLToPath(new URL('./src', import.meta.url)),},},server: {port: 7001,headers: {'Access-Control-Allow-Origin': '*',},},
})

基本上就改造完成了 然后启动就可以正常访问

遇到的问题

当子应用切换路由后,主应用再切换路由,会报错
当路由发生变化时,触发此pushState函数 ,解决qiankun的一个bug
详情查看 https://blog.csdn.net/chaoPerson/article/details/131398285

解决的办法,如链接所示,在主应用加一个router的hook

router.beforeEach((to, from, next) => {// 当路由发生变化时,触发此pushState函数 ,解决qiankun的一个bug// 详情查看 https://blog.csdn.net/chaoPerson/article/details/131398285if (window.history.state === null) {history.replaceState({back: from.path,current: to.path,forward: null,position: NaN,replaced: false,scroll: null}, 'localhost:5173' + to.path);}next();
});

在子应用当路由变化时 执行 window.history.pushState(null, "", "");
比如react

import { useEffect } from "react";
import "./App.css";
import About from "./views/About.tsx";
import Home from "./views/Home.tsx";
import { NavLink, useRoutes } from "react-router-dom";
function App() {const base = window.__POWERED_BY_QIANKUN__ ? "/app/app-react/" : "/";const routes = useRoutes([{ path: base, redirect: base + "home", element: <Home /> },{ path: base + "home", element: <Home /> },{ path: base + "about", element: <About /> },]);// 当路由发生变化时,触发此pushState函数 ,解决qiankun的一个bug// 详情查看 https://blog.csdn.net/chaoPerson/article/details/131398285useEffect(() => {if(window.__POWERED_BY_QIANKUN__) {window.history.pushState(null, "", "");}}, [routes]);return (<div className="app"><h1>React Router Dom</h1><div className="main"><div className="leftToolBar"><NavLink to={base + "home"}>Home</NavLink>{/* 或者如下写法传入标签体 */}<NavLink to={base + "about"}>About</NavLink></div><div className="rightContent">{routes}</div></div></div>);
}export default App;

比如vue2

<template><div id="app"><h1>qiankun vue2</h1><RouterLink to="/home">home</RouterLink><RouterLink to="/about">about</RouterLink><RouterView /></div>
</template><script>
import {RouterView, RouterLink} from 'vue-router'
export default {name: 'App',components: {RouterView,RouterLink},watch : {$route () {// 当路由发生变化时,触发此pushState函数 ,解决qiankun的一个bug// 详情查看 https://blog.csdn.net/chaoPerson/article/details/131398285if(window.__POWERED_BY_QIANKUN__) {window.history.pushState(null,'','')}}}
}
</script><style>
</style>

相关文章:

微前端 qiankun vite vue3

文章目录 简介主应用 qiankun-main vue3 vite子应用 qiankun-app-vue2 webpack5子应用 qiankun-react webpack5子应用 quankun-vue3 vite遇到的问题 简介 主要介绍以qiankun框架为基础&#xff0c;vite 搭建vue3 项目为主应用&#xff0c;wepack vue2 和 webpack react 搭建的…...

【ArduPilot】Windows下使用Optitrack通过MAVProxy连接无人机实现定位与导航

Windows下使用Optitrack通过MAVProxy连接无人机实现定位与导航 配置动捕系统无人机贴动捕球配置无人机参数使用MAVProxy连接Optitrack1、连接无人机3、设置跟踪刚体ID4、校正坐标系5、配置IP地址&#xff08;非Loopback模式&#xff09;6、启动动捕数据推流 结语 在GPS信号弱或…...

【GPT入门】第24课 langfuse介绍

【GPT入门】第24课 langfuse介绍 1. langfuse概念与作用2. 代码3. 页面效果4. 设计模式1. 装饰器模式2. 上下文管理模式1. langfuse概念与作用 Langfuse是一款专为大规模语言模型(LLM)应用开发设计的开源平台。其作用主要包括以下几个方面: 提升开发效率:通过消除LLM应用构…...

基于javaweb的SpringBoot食品溯源系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…...

SVN简明教程——下载安装使用

SVN教程目录 一、开发中的实际问题二、简介2.1 版本控制2.2 Subversion2.3 Subversion的优良特性2.4 工作原理2.5 SVN基本操作 三、Subversion的安装与配置1. 服务器端程序版本2. 下载源码包3. 下载二进制安装包4. 安装5. 配置版本库① 为什么要配置版本库&#xff1f;② 创建目…...

AJAX的理解和原理还有概念

你想问的可能是 AJAX&#xff08;Asynchronous JavaScript and XML&#xff09; &#xff0c;它并不是一门新的编程语言&#xff0c;而是一种在无需重新加载整个网页的情况下&#xff0c;能够与服务器进行异步通信并更新部分网页的技术。以下从基本概念、原理、优点、使用场景等…...

利用AI让数据可视化

1. 从问卷星上下载一份答题结果。 序号用户ID提交答卷时间所用时间来源来源详情来自IP总分1、《中华人民共和国电子商务法》正式实施的时间是&#xff08;&#xff09;。2、&#xff08;&#xff09;可以判断企业在行业中所处的地位。3、&#xff08;&#xff09;是指店铺内有…...

FOC——Butterworth (巴特沃斯)数字滤波器(2025.03.18)

参考链接1: [DSP] Butterworth &#xff08;巴特沃斯&#xff09;数字滤波器设计参考 参考链接2: 陈佩青《数字信号处理教程》 参考链接3: ButterWorthFIlter(巴特沃斯滤波器) 在此感谢各位前辈大佬的总结&#xff0c;写这个只是为了记录学习大佬资料的过程&#xff0c;内容基本…...

Redis如何实现持久化

Redis如何实现持久化 Redis默认将所有数据存储在内存中&#xff0c;虽然读写效率极高&#xff0c;但存在两大风险 数据易失性&#xff1a;进程重启或服务器宕机导致内存数据丢失。恢复成本高&#xff1a;无法直接通过内存重建大规模数据集。 Redis作为高性能的键值数据库&…...

docker安装rabbitmq并配置hyperf使用

为满足您的高标准需求&#xff0c;我将分步骤为您详细解释如何通过Docker安装RabbitMQ服务器&#xff0c;并展示如何配置PHP的Hyperf框架来使用RabbitMQ。 安装RabbitMQ&#xff1a; 获取RabbitMQ镜像在终端中运行以下命令来拉取RabbitMQ的官方Docker镜像&#xff1a; docker …...

极空间NAS部署gitea教程

极空间NAS部署gitea步骤教程 背景1. 准备镜像1.1 极空间官方1.2 Win系统docker再上传1.3 镜像转录 2. MySql配置2.1 容器配置2.2 命令行配置 3. gitea配置3.1 容器配置3.2 打开网页3.3 网页配置安装 参考资料 背景 极空间Nas和别的Nas不同的地方就在于&#xff0c;他不是那种标…...

大模型学习-从零开始在colab训练大模型

目录 写这篇文章的目的 1.准备训练所需的文件 2.将压缩包上传到谷歌云盘 使用colab 3.训练 写这篇文章的目的 这篇文章是对&#xff1a;大模型学习-在colab中训练并更换模型_colab调整模型-CSDN博客的一个优化&#xff0c;因为在之前的博文中&#xff0c;我是提供了一个现…...

【商城实战(38)】Spring Boot:从本地事务到分布式事务,商城数据一致性的守护之旅

【商城实战】专栏重磅来袭&#xff01;这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建&#xff0c;运用 uniapp、Element Plus、SpringBoot 搭建商城框架&#xff0c;到用户、商品、订单等核心模块开发&#xff0c;再到性能优化、安全加固、多端适配&#xf…...

漏洞知识点《PHP数组绕过深入解析》

在PHP中&#xff0c;通过数组绕过安全限制的核心原理与PHP语言特性和底层实现机制密切相关。以下是具体原因及技术细节分析&#xff1a; 一、PHP参数解析机制的特性 PHP的$_GET、$_POST等超全局变量支持将用户输入自动解析为数组。例如&#xff0c;通过URL参数?username[0]a…...

【极光 Orbit·STC8x】05. GPIO库函数驱动LED流动

【极光 OrbitSTC8】05. GPIO库函数驱动LED流动 七律 逐光流转 八灯列阵若星河&#xff0c;状态为舟渡长波。 寄存器中藏玄机&#xff0c;Switch语句定山河。 循环往复如潮涌&#xff0c;步骤变量掌沉浮。 单片机前展锋芒&#xff0c;代码织就光之舞。 摘要 本文基于STC8H8K6…...

SSH配置过程及无法正常链接问题的解决【小白教学】

1.尝试克隆github上的项目&#xff0c;发现无法正常下载【之前有些是可以的】 git clone https://github.com/mogualla/PythonRobotics.git --depth 3 出现下面的提示【错误】&#xff1a; Cloning into PythonRobotics... fatal: unable to access https://github.com/mogua…...

总结 HTTP 协议的基本格式, 相关知识以及抓包工具fiddler的使用

目录 1 HTTP是什么 2 HTTP协议格式 3 HTTP请求(Request) 3.1 认识URL 3.2 方法 3.3 认识请求"报头"(header) 3.3.1 Host 3.3.2 Content-Length 3.3.3 Content-Type 3.3.4 User-Agent (简称UA) 3.3.5 Referer 3.3.6 Cookie和Session 4 HTTP响应详解 4.…...

Conda 虚拟环境创建:加不加 Python 版本的深度剖析

在 conda 中创建虚拟环境时&#xff0c;是否指定 Python 具体版本会直接影响环境构建的底层逻辑、依赖管理方式以及后续开发的可控性。 一、核心机制对比 不指定 Python 版本 (conda create -n env_name) 默认继承基础环境版本 Conda 会使用当前基础环境&#xff08;如 base&am…...

docker的anythingllm和open-webui压缩包分享(国内镜像拉取,百度云压缩包分享)

文章目录 前言第一部分&#xff1a;镜像获取&#x1f680; 方式一&#xff1a;切换国内下载镜像✅1. 下载anythingllm✅ 2. 下载open-webui &#x1f680;方式二&#xff1a;下载我分享的百度云✅ anythingllm压缩包百度云链接❎ open-webui压缩包 第二部分&#xff1a;下载之后…...

C#命令行参数用法

C#命令行参数用法 static void Main(string[] args){Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);// 解析命令行参数if (args.Length > 0){// 这里处理命令行参数&#xff0c;例如&#xff1a;打开文件、设置配置等// 例如&…...

Unity3D开发AI桌面精灵/宠物系列 【二】 语音唤醒 ivw 的两种方式-Windows本地或第三方讯飞等

Unity3D 交互式AI桌面宠物开发系列【二】ivw 语音唤醒 该系列主要介绍怎么制作AI桌面宠物的流程&#xff0c;我会从项目开始创建初期到最终可以和AI宠物进行交互为止&#xff0c;项目已经开发完成&#xff0c;我会仔细梳理一下流程&#xff0c;分步讲解。 这篇文章主要讲有关于…...

Matlab概率区间预测全家桶更新了,新增光伏出力区间预测,4种分布可供预测

基本介绍 适用于matlab2020及以上。可任意选择置信区间&#xff0c;区间覆盖率picp、区间平均宽度百分比等等&#xff0c;可用于预测不确定性&#xff0c;效果如图所示&#xff0c;采用KDE&#xff0c;4种分布进行预测&#xff0c;有对比&#xff0c;可以替换成自己的数据。 …...

第2章:容器核心原理:深入理解Namespace、Cgroup与联合文件系统

第2章:容器核心原理:深入理解Namespace、Cgroup与联合文件系统 作者:DogDog_Shuai 阅读时间:约20分钟 难度:中级 目录 1. 引言2. Linux容器核心技术3. Namespace详解4. Cgroup详解5. 联合文件系统6. 容器运行时原理...

用css绘制收银键盘

最近需求说需要自己弄个收银键盘&#xff0c;于是乎直接上手搓 主要基于Vue3写的&#xff0c;主要是CSS <template><view class"container"><view class"info"><image class"img" src"" mode"">&l…...

aws训练快速入门教程

AWS 相关核心概念 简洁地介绍一下AWS训练云服务的核心关联概念: AWS核心服务层: 基础设施层: EC2(计算), S3(存储), RDS(数据库)等人工智能层: SageMaker(训练平台), AI服务等 机器学习服务分级: 高层: 预构建AI服务(开箱即用)中层: SageMaker(主要训练平台)底层: 框架和基…...

基于FPGA轨道交通6U机箱CPCI脉冲板板卡

板卡简介&#xff1a; 本板为脉冲板&#xff0c;脉冲板主要执行CPU下达的指令&#xff0c;通过实现各种控制算法来调节PWM&#xff0c;然后输出光纤PWM信号来驱动变频器功率模块以达到控制电机的目的。 性能规格&#xff1a; 电源&#xff1a;DC5V&#xff1b;15V FPGA&…...

数据库GreenDao的使用、升级、以及相关常用注释说明

目录 一、使用GreenDao的流程 添加GreenDao依赖配置greendao的generator生成文件使用GreenDao生成bean类 3.1 创建实体类 3.2 生成dao文件创建GreenDaoManager来进行统一管理&#xff0c;并初始化 4.1 创建GreenDaoManager 4.2 在Application中进行初始化GreenDao使用GreenDa…...

【C++】 —— 笔试刷题day_6

刷题day_6&#xff0c;继续加油哇&#xff01; 今天这三道题全是高精度算法 一、大数加法 题目链接&#xff1a;大数加法 题目解析与解题思路 OK&#xff0c;这道题题目描述很简单&#xff0c;就是给我们两个字符串形式的数字&#xff0c;让我们计算这两个数字的和 看题目我…...

PostgreSQL:语言基础与数据库操作

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...

cmake 之 CMakeLists.txt 中的函数是从哪里来的

我们都知道&#xff0c;cmake会解释执行 CMakeLists.txt 以及其他 *.cmake 脚本&#xff0c; 这里先给出一个“先验” 的知识点&#xff1a; 任何一个独立脚本或脚本函数命令的执行&#xff0c;都是通过 CPP 函数 RunListFile(...) 调用的 void cmMakefile::RunListFile(cmL…...

谷歌or-tools开源库入门

1.命令行编译程序 这里要说明下&#xff0c;直接用qt或者VS2022打开cmake工程&#xff0c;编译没有成功。所以&#xff0c;老老实实的按照官方教程来&#xff0c;使用命令行编译。 &#xff08;1&#xff09;准备 1&#xff09;安装cmake&#xff0c;版本3.18以上&#xff0…...

深入解析 C++ Vector:全面掌握 STL 核心容器的原理与高效实践

一、Vector 的核心概念与特性 Vector 是 C 标准库中最常用的动态数组容器&#xff0c;其底层基于连续内存存储元素&#xff0c;兼具数组的高效访问与动态扩容的灵活性。以下是其核心特性&#xff1a; 1.1 核心特性对比 特性普通数组Vector 容器内存分配静态固定动态增长访问效…...

【MySQL】MySQL数据存储机制之存储引擎

目录 1.如何理解存储引擎&#xff1f; 2.MySQL 提供的存储引擎 3.存储引擎的功能特性 &#xff08;1&#xff09;存储介质 &#xff08;2&#xff09;事务处理能力 &#xff08;3&#xff09;锁定 &#xff08;4&#xff09;备份和恢复 &#xff08;5&#xff09;优化…...

OpenCV旋转估计(1)用于估计图像间仿射变换关系的类cv::detail::AffineBasedEstimator

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 基于仿射变换的估计器。 这种估计器使用匹配器估算的成对变换来为每个相机估算最终的变换。 cv::detail::AffineBasedEstimator 是 OpenCV 库中…...

小红书不绑定手机号会显示ip吗

小红书作为一个生活方式分享平台&#xff0c;拥有庞大的用户群体。在小红书上&#xff0c;用户可以分享自己的生活点滴、购物心得、美食体验等&#xff0c;与其他用户进行互动交流。最近&#xff0c;不少用户对于小红书是否会在不绑定手机号的情况下显示IP属地产生了疑问&#…...

网络空间安全(36)数据库权限提升获取webshell思路总结

一、获取数据库访问权限 寻找漏洞&#xff1a; SQL注入&#xff1a;这是最常见的方法之一。攻击者通过SQL注入漏洞&#xff0c;可以在数据库执行任意SQL语句&#xff0c;从而获取数据库中的数据&#xff0c;甚至可能获取数据库的访问权限。配置文件泄露&#xff1a;有时&#x…...

OceanBase 中,如何抓包分析应用连接超时的问题

本文作者&#xff1a;胡呈清&#xff0c;爱可生 DBA 团队成员&#xff0c;擅长故障分析、性能优化 与MySQL这类单机数据库相比&#xff0c;OceanBase分布式数据库的访问链路相对较长&#xff0c;因此在遇到连接异常时&#xff0c;排查过程需要额外考虑更多环节。接下来&#xf…...

用uv管理python环境/项目(各种应用场景)

一、安装uv 有python的情况 pip install uvWindows powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"linux或macOS curl -LsSf https://astral.sh/uv/install.sh | sh二、换镜像源 uv不会读取pip的镜像源配置&#xff0c;所…...

Linux——进程(5)进程地址空间

先看一个程序和现象 预期现象是&#xff0c;子进程和父进程相互独立&#xff0c;子进程的gval是100&#xff0c;101&#xff0c;102....而父进程一直都是100. 结果我们并不意外&#xff0c;只是我们发现&#xff0c;父子进程的gval的地址是一样的&#xff0c;这有点颠覆我们的认…...

docker(1) -- centos镜像

1. 前言 我在WSL中运行的系统是ubuntu2024&#xff0c;并安装了docker&#xff0c;想要在docker中运行一个centos的系统。 2. 下载并运行镜像 # 下载centos最新版镜像 $ docker pull centos Using default tag: latest latest: Pulling from library/centos a1d0c7532777: P…...

Vitis 2024.1 无法正常编译custom ip的bug(因为Makefile里的wildcard)

现象&#xff1a;如果在vivado中&#xff0c;添加了自己的custom IP&#xff0c;比如AXI4 IP&#xff0c;那么在Vitis&#xff08;2024.1&#xff09;编译导出的原本的.xsa的时候&#xff0c;会构建build失败。报错代码是&#xff1a; "Compiling blank_test_ip..."…...

【源码阅读】多个函数抽象为类(实现各种类型文件转为PDF)

目录 一、原始函数二、类三、转换过程 一、原始函数 最开始就是写了几个函数&#xff08;包括doc、excel、ppt类型的文件&#xff09;转换为pdf&#xff0c;需要将这些函数形成一个类。相似的一类函数就可以组成一个实现特定功能的类 import subprocess import pandas as pd i…...

word插入Mathtype公式居中和自动更新

word插入公式自动更新 前提&#xff1a;安装Mathtype 1.word中查看页的宽度 出现如下 2.设置样式 出现这个窗口 给样式随便起个名字 3.修改样式 3.1 设置两个制表位 第二个 3.2 修改公式字体 如下所示 4. 修改公式格式 4.1在word中打开 Mathtype 4.2 修改公式的格式 变成…...

SpringSecurity配置(自定义认证过滤器)

文末有本篇文章的项目源码文件可供下载学习 在这个案例中,我们已经实现了自定义登录URI的操作,登录成功之后,我们再次访问后端中的API的时候要在请求头中携带token,此时的token是jwt字符串,我们需要将该jwt字符串进行解析,查看解析后的User对象是否处于登录状态.登录状态下,将…...

python字符级差异分析并生成 Word 报告 自然语言处理断句

import difflib from docx import Document from docx.shared import RGBColor from snownlp import SnowNLPdef analyze_char_differences(text_a, text_b):"""分析两个文本的字符级差异:param text_a: 第一个文本:param text_b: 第二个文本"""…...

企业级云MES全套源码,支持app、小程序、H5、台后管理端

企业级云MES全套源码&#xff0c;支持app、小程序、H5、台后管理端&#xff0c;全套源码 开发环境 技术架构&#xff1a;springboot vue-element-plus-admin 开发语言&#xff1a;Java 开发工具&#xff1a;idea 前端框架&#xff1a;vue.js 后端框架&#xff…...

使用GoldenGate完成SQLserver到Oracle的数据实时同步

一、环境准备 *项目**源环境**目标环境*操作系统CentOS Linux release 7.6CentOS Linux release 7.6IP地址192.168.3.92192.168.3.168数据库及版本SQLserver 2016Oracle 11.2.0.4.0GoldenGate用户oggoggGoldenGate版本12.3.0.2.012.3.0.2.0 二、OGG架构 GoldenGate v11 能够…...

【OpenCV C++】如何快速 高效的计算出图像中大于值的像素个数? 遍历比较吗? No,效率太低!那么如何更高效?

文章目录 1 问题2 分析3 代码实现 (两种方法实现)方法1: 使用cv::compare方法2: 使用cv::threshold3.2 compare和threshold 看起来都有二值化效果? 那么二者效率?4 compare函数解释4.1 参数解释4.2 底层行为规则4.3 应用示例4.4 典型应用场景1 问题 一幅图像的目标区域ROI…...

Golang | 每日一练 (6)

&#x1f4a2;欢迎来到张胤尘的技术站 &#x1f4a5;技术如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 Golang | 每日一练 (6)题目参考答案什么是内存逃逸&am…...

git clone, 算是解决可以访问github但无法clone的问题

本文的前提是使用了**且可以正常访问github 查看代理的端口 将其配置到git 首先查看git配置 git config --list然后添加配置&#xff0c;我这边使用的是Hiddfy默认的端口是12334&#xff0c;如果是clash应该是7890 git config --global http.proxy 127.0.0.1:12334其他 删除…...