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

最大的域名注册网站是那个/竞价交易规则

最大的域名注册网站是那个,竞价交易规则,如何做病毒式网站推广,WordPress附件下载插件前言 随着技术的飞速发展,我们公司内部一个基于“上古神器” jQuery PHP 构建的十年历史老项目已显力不从心,技术非常老旧且维护成本高昂,其实已经无数次想要重构,但是苦于历史遗留原因以及业务的稳定性而一直难以下手&#xff0…

前言

        随着技术的飞速发展,我们公司内部一个基于“上古神器” jQuery + PHP 构建的十年历史老项目已显力不从心,技术非常老旧且维护成本高昂,其实已经无数次想要重构,但是苦于历史遗留原因以及业务的稳定性而一直难以下手,而且一时半会又不能全部重构。本次新页面较多且后续将持续迭代新模块,而老页面的改动较少且代码库错综复杂,牵一发而动全身。

        经过几番思考,我们发现微前端是一种非常实用的去实施渐进式重构的架构,很适合用微前端技术来完成本次需求,最终决定利用 Vue3 + Vite 搭建一个全新的基座(主应用),作为新旧系统融合的桥梁,将原来的老项目接入到基座,后面的新需求都在新项目里面开发就行,不用再动老项目。此举不仅实现了新页面用 Vue3 开发,而且老项目也能和新项目融合在一起,既保持了旧系统的稳定运行,又引入了新技术栈的活力。

        同时,鉴于我们另一个 Vue2 + webpack 项目也同样面临技术过时和项目规模庞大的问题,每次开发时运行起来非常卡顿,打包很慢,后期难以维护,也需要用微前端来进行一些拆分,不可能一直往该项目上堆代码。

        所以,我们决定一步到位,设计了一套微前端项目模板,将微前端的核心配置抽象为可复用的插件,并结合自研组件库、HTTP请求、权限控制等插件,构建了一个全面的项目脚手架,旨在简化未来项目的搭建流程,提升开发效率,确保技术栈的先进性与可持续性。

微前端框架选型(MicroApp)

        从对⽐图可以看出,⽬前开源的微前端框架中有的功能 Micro App都有,并提供了⼀些它们不具备的功能,⽐如静态资源地址补全,元素隔离,插件系统等。

        我们本次项目使用的是 Vue3+Vite+TypeScript 的技术栈,在综合对比了各个框架之后,认为MicroApp是最适合我们当前现实情况的。原因有下:

  1. 使用简单,将所有功能都封装到一个类WebComponent组件内,从而实现在基座应用中嵌入一行代码即可渲染一个微前端应用。

  2. 不需要像 single-spa 和 qiankun 一样要求子应用修改渲染逻辑并暴露出方法,也不需要修改webpack配置,是目前市面上接入微前端成本最低的方案

  3. 功能丰富,提供了 js沙箱、样式隔离、元素隔离、预加载、数据通信、静态资源补全等一系列完善的功能。

  4. 零依赖,这赋予它小巧的体积和更高的扩展性。

  5. 兼容所有框架,为了保证各个业务之间独立开发、独立部署的能力,micro-app做了诸多兼容,在任何技术框架中都可以正常运行。

  6. 侵入性低:对原代码几乎没有影响

  7. 组件化:基于webComponents思想实现微前端。

微前端架构设计(pnpm+monorepo)

        使用 pnpm 和 monorepo 管理项目依赖和代码结构,确保所有子应用和基座应用都位于同一仓库的不同目录下,便于集中管理和版本控制。

/root  
|-- /packages  |-- /main-app        # 基座应用  |-- /old-app-wrapper # 老项目接入容器  |-- /new-module-a    # 新应用A  |-- /new-module-b    # 新应用B  ...  
|-- /pnpm-workspace.yaml  
|-- /package.json
  • 基座应用(Main App)

    • 使用 Vue 3 + Vite 搭建的基座应用将成为整个系统的核心,负责路由管理、权限验证、资源加载等基础设施功能。基座应用应保持轻量级,避免过度耦合,并提供必要的API和事件系统供子应用使用。

  • 子应用(Micro Apps)

    • 老项目接入(旧应用容器):将老项目(PHP+jQuery)作为一个子应用,确保与基座应用的隔离和独立运行。新建一个项目,用于专门展示老项目页面,先在路由表中给所有路由都添加一个 iframeUrl参数(存的是旧页面的地址),并封装一个 iframe 组件,在组件中监听路由变化,动态更新Iframe的src,每一次切换路由,就将页面的地址传入 iframe 组件,从而加载出对应的老页面。

    • 新模块开发(新应用容器)新页面和模块直接在Vue 3项目中开发,利用Vue 3的Composition API、响应式系统等优势,提高开发效率和代码质量。当旧系统中有某个部分要重构时,则将旧项目中的路由下线,并将重构后的模块进行上线,实现无缝替换。

  • 通信机制

    • 建立基座应用与子应用之间的有效通信机制,如使用自定义事件、全局状态管理(如Vuex或Zustand)或专门的通信库。

    • 自定义事件:基座应用可以监听来自子应用的自定义事件,并作出相应处理。子应用同样可以监听基座应用的事件。

    • 全局状态管理:使用Vuex或Zustand等状态管理库,在基座应用中维护全局状态,子应用可以通过API访问或修改这些状态(如果允许)。

    • 专门的通信库:如使用single-spa、qiankun等微前端框架提供的API进行通信。

项目模板与脚手架

  • 模板设计:

    • 核心配置插件化:将微前端的核心配置(如子应用注册、加载策略、生命周期管理等)封装成可复用的插件,便于在不同项目中快速集成。

    • 自研组件库:整合并封装常用的UI组件,提高开发效率和界面一致性。

    • HTTP请求插件:封装统一的HTTP请求处理逻辑,包括请求拦截、响应处理、错误重试等,简化API调用。

    • 权限控制插件:基于角色或权限的动态路由控制,确保系统的安全性。

  • 脚手架构建:

    • 使用Vite作为构建工具,利用其快速冷启动和热模块替换特性,提升开发体验。

    • 集成ESLint、Prettier等代码质量工具,确保代码风格统一和减少错误。

    • 提供一键生成项目结构的脚本,包括基础目录、配置文件、基础路由和页面模板等。

  • CICD:

    • 统一的CICD流程为各个子应用和主应用提供统一的构建/部署流程

微前端设计思路

  1. 拆分功能模块:首先,我们需要将整个后台管理系统拆分为多个独立的功能模块,如用户管理模块、专项管理模块、订单管理模块等。每个模块都可以作为一个独立的微应用进行开发和维护。

  2. 设计通信协议:为了实现各个微应用之间的通信和资源共享,我们需要设计一套统一的通信协议和API。例如,我们可以定义一个emit方法来触发自定义事件,以及一个on方法来监听自定义事件;我们还可以使用Webpack的CommonsChunkPlugin插件来实现公共资源的提取和共享。

  3. 开发主应用:主应用是整个后台管理系统的入口,它负责加载和管理各个微应用。主应用需要提供一个容器元素来承载各个微应用的内容,并提供一些基础设施服务,如路由管理、状态管理等。此外,主应用还需要实现与各个微应用的通信和资源共享。

  4. 开发微应用:每个微应用都是一个独立的功能模块,它可以独立开发、部署和运行。每个微应用都需要提供一个容器元素来承载该应用的内容,并提供一些与主应用交互的接口,如共享资源、通信等。此外,微应用还需要实现自身的业务逻辑和界面展示。

  5. 集成测试:在完成各个微应用的开发后,我们需要对整个系统进行集成测试,确保各个微应用之间的通信和资源共享正常工作。此外,我们还需要对整个系统的性能、稳定性等进行测试和优化。

v-micro-app-plugin

        本文中的微前端项目,使用的是 v-micro-app-plugin插件 ,它是一款基于京东MicroApp框架的微前端插件,旨在帮助开发者快速地将微应用集成到不同的系统中,实现高效、灵活的前端模块化开发。以下是详细的使用指南,希望能够帮助你快速上手。

        本文中的案例-资源地址

  • 微前端插件 v-micro-app-plugin 源码地址:GitHub - yoguoer/v-micro-app-plugin: v-micro-app-plugin是一款基于MicroApp的微前端插件,实现快速安装使用。
  • 用该插件搭建的的示例项目 vMicroVerseHub 源码地址:GitHub - yoguoer/vMicroVerseHub: vMicroversehub 是一个使用 v-micro-app-plugin搭建的 monorepo 微前端项目框架,主要用于给出案例,更好地展示插件的功能和用法。

        该插件暂时放在私有 npm 包中,外部无法获取,但是可以直接将项目中打包后生成的dist文件夹复制下来,放到需要使用的项目中的 node_modules 文件夹下即可。(虽然这并不是一个推荐的做法,因为它绕过了 npm 的包管理和版本控制功能,可能会导致一系列问题,包括版本冲突、难以维护和更新等。)当然,也可以私信我,我直接把包分享给你啦!~~

项目实践

技术栈:

  • 主应用:Vue3+Vite+TypeScript

  • 子应用1(老项目):用 iframe 挨个嵌入

  • 子应用2(新模块):react / Vue3 ...

        本次重构的是一个后台管理系统,最外层是基座,基座不仅是微前端应用集成的一个关键平台,还承载着维护公共资源、管理依赖项以及确立开发规范的重要使命。具体而言,其职责可概括为以下几点:

  1. 子应用集成,给子应用提供渲染容器

  2. 权限管理

  3. 会话管理

  4. 路由、菜单管理

  5. 主题管理

  6. 共享依赖

  7. 多语言管理(important)

        因为micro-app对主应用和子应用的技术栈没有任何要求,所以,我们新建三个项目,my-app(Vue3)、my-app1(React)、my-app2(Vue2)。my-app是整体项目的主应用,也就是基座,my-app1和my-app2都是平级的子应用。

搭建微前端基座

1、创建一个项目作为主应用,这个步骤就不赘述了。

笔者创建了一个主应用叫 main-app,提供一个框架给子应用。

2、安装 v-micro-app-plugin 微前端插件

pnpm i v-micro-app-plugin --save

3、配置并使用

        为了便于后续复用该配置信息(配置路由、菜单、名称等等),我们将 options 参数独立出来,放在 settings 文件夹下的 microAppSetting.ts 文件中。

  • microAppSetting.ts:

const env = import.meta.env.MODE
​
const microAppUrl = {  appFirst: {  development: 'http://localhost:3000/#/',  test: 'https://test.example.com/vivien/appFirst/',  production: 'https://www.example.com/vivien/appFirst/'  },  appSecond: {  development: 'http://localhost:4000/#/',  test: 'https://test.example.com/vivien/appSecond/',  production: 'https://www.example.com/vivien/appSecond/'  },  };  
​
const microAppSetting = {projectName: 'mainApp',subAppConfigs: {'appFirst': {name: 'appFirst',url: microAppUrl['appFirst'][env]},'appSecond': {name: 'appSecond',url: microAppUrl['appSecond'][env]}},isBaseApp: true, // 标记当前应用为主应用basePath: '/', // 打包路径或其他基础路径 disableSandbox: false, // 是否禁用沙箱iframe: true, // 是否使用 iframe
}
​
export default microAppSetting
export { microAppUrl }
  • main.js:

import microAppSetting from '@/settings/microAppSetting'
​
const options = microAppSetting
​
// 初始化微前端插件  
await initMyMicroApp(app, options, router, store);

⚠注意:一定要在 router 和 store 初始化后,才可以使用 initMyMicroApp 进行初始化!!!举个简单的例子:

import { createApp } from 'vue'
import './style.css'
import App from './App.vue'y
import { createPinia } from 'pinia'
import router from './router/index'
import ElementPlus from 'element-plus'
import 'element-plus/theme-chalk/index.css'
import initMyMicroApp from 'v-micro-app-plugin'
import microAppSetting from '@/settings/microAppSetting'
​
const app = createApp(App)
const store = createPinia()
app.use(router).use(ElementPlus).use(store)
​
// 初始化微前端插件  
const options = microAppSetting
await initMyMicroApp(app, options, router, store);
​
app.mount('#app')

构建子应用

1、创建任意多个项目作为子应用,这个步骤就不赘述了。

笔者创建了两个子应用,一个叫 sub-app-first,一个叫 sub-app-second。

2、安装 v-micro-app-plugin 微前端插件

pnpm i v-micro-app-plugin --save

3、配置并使用

  • sub-app-first:

const options = {projectName: 'appFirst',subAppConfigs: {},isBaseApp: false, // 标记当前应用不为主应用basePath: '/', // 打包路径或其他基础路径 disableSandbox: false, // 是否禁用沙箱iframe: true, // 是否使用 iframe
}
​
// 初始化微前端插件  
await initMyMicroApp(app, options, router, store);
  • sub-app-second:

const options = {projectName: 'appSecond',subAppConfigs: {},isBaseApp: false, // 标记当前应用不为主应用basePath: '/', // 打包路径或其他基础路径 disableSandbox: false, // 是否禁用沙箱iframe: true, // 是否使用 iframe
}
​
// 初始化微前端插件  
await initMyMicroApp(app, options, router, store);

配置路由信息

        有了主子应用之后,我们就需要在主应用中给子应用配置路由信息,这里一共有 2 个子应用,我们为它们分别进行配置。

  • appFirst:

import microAppSetting from '@/settings/microAppSetting'export default {path: '/appFirst',name: 'appFirst',component: Layout,order: 1,hidden: false,meta: {title: 'appFirst',hideBreadcrumb: false,icon: Document,microAppOptions: microAppSetting.subAppConfigs!['appFirst']}
}
  • appSecond:

import microAppSetting from '@/settings/microAppSetting'export default {path: '/appSecond',name: 'appSecond',component: Layout,order: 2,hidden: false,meta: {title: 'appSecond',hideBreadcrumb: false,icon: Document,microAppOptions: microAppSetting.subAppConfigs!['appSecond'],}
}

封装 MicroAppContainer

        众所周知,路由切换时,可以给<router-view />填充上对应路径的内容,同理,microApp中的<micro-app></micro-app>也有同样的功能。我们可以对其进行二次封装,结合 v-if,以便于根据是路由指向的是子应用,还是本系统自由模块,来判断究竟是渲染微应用视图,还是渲染普通视图。

        为了达到这个目的,我们可以新建一个 MicroAppContainer 文件夹,在其中创建一个index.vue,然后键入以下内容:

<template><div :class="[`${prefixCls}-container`]"><!-- name:应用名称, url:应用地址 --><micro-app v-bind="options" :name="options.name" keep-alive></micro-app></div>
</template>
<script setup lang="ts">
import { watch } from "vue";const props = defineProps<{options: {[key: string]: any;};
}>();let prefixCls = props.options.namewatch(() => props.options,(newValue) => {prefixCls = newValue.name},{ immediate: true, deep: true }
);
</script>
<style></style>

⚠注意:

keep-alive 属性可根据需要决定是否设置。

区分是否微应用视图

  • 在你需要加载子应用页面的地方:

        <div :class="[`${prefixCls}-viewer-microapp`]" v-if="isMicroAppView"><MicroAppContainer :options="microAppOptions" /></div><div v-else><router-view /></div>
  • 一些必要的逻辑语句:

import { watchEffect, ref } from 'vue'
import { useRoute } from 'vue-router'
const route = useRoute()let isMicroAppView: Ref = ref(false)
let microAppOptions: Ref = ref({})
watchEffect(async () => {microAppOptions.value = route.meta.microAppOptionsisMicroAppView.value = !isNullOrUnDef(microAppOptions.value) && !isEmpty(microAppOptions.value)
})

运行项目

        我们可以看到,sub-app-first 和 sub-app-second 均能独立作为一个系统去运行,并且在 main-app 下也能作为一个模块存在。

  • sub-app-first:

  • sub-app-second:

  • main-app:

  • 控制台输出信息:

封装 Iframe 组件

        前文已经提到,老页面不需要做任何修改,且牵一发而动全身,只适合直接用 iframe 搬过来,相当于换个皮肤展示就好。但又因页面数量庞大,所以我们选择直接封装一个 iframe 组件,配合路由动态设置其 src 值,实现页面的动态切换。

        在这里,我们专门创建了一个子应用,用于独立地展示该老系统,起到新旧隔离的作用,具体操作步骤如下:

1、首先,在 views 中新建一个 iframeViews 文件夹,然后创建 index.vue

<template><div ref="iframeContainers" v-if="loading"><iframe:key="name":src="url"height="100%"width="100%"sandbox="allow-scripts allow-same-origin"frameborder="0"></iframe></div>
</template><script setup>
import { ref, onMounted, watch, onUnmounted } from 'vue'
import { useRoute } from 'vue-router'let route = useRoute() // 获取当前路由信息const iframeContainers = ref(null)
let url = ref(null)
let name =  ref(null)
let loading = ref(false)onMounted(() => {
})onUnmounted(() => {
})watch(() => route,(newRoute) => {loading.value = trueurl.value = newRoute.meta.iframeUrlname.value = newRoute.name// console.log('🚀 ~ watch ~ newPath:', newRoute, url.value, name.value)},{ immediate: true, deep: true }
)
</script><style scoped>
</style>

2、配置路由表

// 用户管理
import { Layout } from '@/router/layout'
import { $t } from "@/plugins/locales/setupLocale";
import { User } from "@element-plus/icons-vue";
import { getIframeUrl } from "@/settings/iframeUrlSetting";export default {path: "/user",name: 'user',component: Layout,order: 1,hidden: false,redirect: "userList",meta: {title: $t('用户管理'),hideBreadcrumb: false,icon: User},children: [{path: '/userList',component: () => import("@/views/iframeViews/index.vue"),name: 'userList',hidden: false,meta: {title: $t('用户列表'),iframeUrl: getIframeUrl('userList'),}},{path: '/auth',component: () => import("@/views/iframeViews/index.vue"),name: 'auth',hidden: false,meta: {title: $t('权限列表'),iframeUrl: getIframeUrl('auth'),}}]
}

3、为了能够在开发、测试、部署环境下都能正常运行,避免跨域问题,我们还需要通过灵活的方式来动态获取 iframeUrl

const env = import.meta.env.VITE_NODE_ENV
const url = {development: "https://example.com/vivien_test/",production: "https://example.com/vivien_prod/",test: "https://example.tcl.com/vivien_test/",
}
const iframeUrl = {development: {userList: '/vivien/user/index.html',auth: '/vivien/auth/index.html'},production: {userList: '/prod/user/index.html',auth: '/prod/auth/index.html'},test: {userList: '/test/user/index.html',auth: '/test/auth/index.html'}
}
// 获取iframeUrl
export function getIframeUrl(name: string): string {return url[env] + iframeUrl[env][name]
}

完成基本功能

        经过这番操作,我们的旧系统就全部都嵌入进来啦!至于新系统,我们就和平常的开发一样,常规操作就可以了。主应用打开的视图如下:

        不管我们拆分成了多少个项目来开发然后拼接成一个页面,对于用户来说,这完完全全就是一个系统,只是对于开发者来说有区别而已。

通信功能

        完成了基础功能之后,我们还需要确保应用之间能够相互通信,由于主应用和子应用的通信 API 有一点差别,用的时候容易混淆,不够简便,所以我们对其进行了二次封装,提供了统一的通信 API。

对于具体的使用方法,我们通过几个简单的例子来说明:

准备工作

        首先,要引入我们的 getMicroAppMessage() 方法,获取一个通信对象

import { getMicroAppMessage } from "v-micro-app-plugin";const microAppMessage = getMicroAppMessage();
  • 发出全局信息:用法一致

  microAppMessage.sendGlobal({data: { fun: "sendGlobal", text: "给全局发送数据~sendGlobal" },callback: () => {console.log("使用sendGlobal发送数据成功,执行回调!");},});
  • 子应用给主应用发出信息:无需 appName 参数

  microAppMessage.sendMessage({data: { app: "appSecond", value: "子应用给主应用发送数据~sendMessage" },callback: () => {console.log("子应用使用sendMessage发送数据成功,执行回调!");},});
  • 主应用给子应用发出信息:需要 appName 参数

  microAppMessage.sendMessage({data: { app: "mainApp", value: "主应用给appFirst发送数据~sendMessage" },appName: "appFirst",callback: () => {console.log("主应用使用sendMessage发送数据成功,执行回调!");},});
  • 接收全局信息: 用法一致

  setTimeout(() => {console.log("接收到的全局信息getGlobalMessage:", microAppMessage.getGlobalMessage());}, 1000);
  • 子应用接收主应用发来的信息:无需 appName 参数

  setTimeout(() => {console.log("子应用接收到主应用发来的非全局信息getMessage:",microAppMessage.getMessage());}, 1000);
  • 主应用接收子应用发来的信息:需要 appName 参数

  setTimeout(() => {console.log("主应用收到appFirst发来的信息getMessage:", microAppMessage.getMessage('appFirst'),"主应用收到appSecond发来的信息getMessage:", microAppMessage.getMessage('appSecond'));}, 1000);
  • 控制台信息:

相关文章:

使用MicroApp重构旧项目

前言 随着技术的飞速发展&#xff0c;我们公司内部一个基于“上古神器” jQuery PHP 构建的十年历史老项目已显力不从心&#xff0c;技术非常老旧且维护成本高昂&#xff0c;其实已经无数次想要重构&#xff0c;但是苦于历史遗留原因以及业务的稳定性而一直难以下手&#xff0…...

【Golang】go mod的使用

【1】GO111MODULE有三个值&#xff1a;off, on, auto off&#xff1a;go命令行将不会支持module功能&#xff0c;将会使用旧版本那种通过vendor目录或者GOPATH来查找依赖包的方式。 on&#xff1a;go命令行会使用modules功能&#xff0c;而不…...

Linux内核之网络套接字

文章目录 前言一、TCP4层模型和OSI7层模型OSI 7层模型TCP/IP 4层模型比较 二、套接字概念三、sockaddr_in和sockaddr结构体sockaddr_insockaddr区别 四、协议中的数据划分数据划分和首部添加流程数据接收与解析流程流程图 前言 一、TCP4层模型和OSI7层模型 OSI 7层模型 物理…...

SpringBoot事务-调度-缓存

一.Spring Boot中的事务管理 设置事务 Transactional(isolation Isolation.DEFAULT) Transactional(propagation Propagation.REQUIRED) 开启事务 EnableTransactionManagement 1. 开启事务管理 要开启 Spring 的事务管理&#xff0c;你需要在你的 Spring Boot 应用中添加 …...

社交媒体分析:如何利用Facebook的数据提升业务决

在数字化时代&#xff0c;社交媒体已经成为企业战略中不可或缺的一部分。Facebook&#xff0c;作为全球最大的社交平台之一&#xff0c;提供了丰富的数据资源&#xff0c;这些数据不仅能够帮助企业了解市场趋势&#xff0c;还能提升业务决策的精准度。本文将探讨如何有效利用Fa…...

企业中的流程组织

在每个实施SAP的企业中&#xff0c;除了传统的IT部门(包括SAP顾问所在的部门)&#xff0c;必不可少的是一定形式的流程组织(Process Organization)&#xff0c;流程组织的主要作用有 梳理企业内部业务流程&#xff0c;根据企业发展需要变更企业内部流程确定企业流程规范和部门…...

Redis:查询是否包含某个字符/字符串之二

上一篇&#xff1a;Redis&#xff1a;查询是否包含某个字符/字符串之一-CSDN博客 下一篇&#xff1a;Redis&#xff1a;查询是否包含某个字符/字符串之三-CSDN博客 摘要&#xff1a; 要查询数据&#xff0c;就需要遍历key&#xff0c;遍历value&#xff0c;其中包含存储等辅助…...

算法笔记|Day23贪心算法

算法笔记|Day23贪心算法 ☆☆☆☆☆leetcode 455.分发饼干题目分析代码 ☆☆☆☆☆leetcode 376. 摆动序列题目分析代码 ☆☆☆☆☆leetcode 53. 最大子序和题目分析代码 ☆☆☆☆☆leetcode 455.分发饼干 题目链接&#xff1a;leetcode 455.分发饼干 题目分析 优先考虑饼干…...

[星瞳科技]OpenMV使用时有哪些常见错误和解决办法?

常见代码错误 ImportError:no module named xxx 这个错误是Import错误&#xff0c;没有stepper这个模块。 原因&#xff1a; 你没有把stepper.py这个文件拖到你的板子里。见&#xff1a;模块的使用 拖过去之后&#xff0c;需要重启&#xff0c;使模块生效 MemoryError:FB …...

深度学习入门(二):PyTorch使用-张量的类型转换,拼接操作,索引操作,形状操作

目录 1. 张量类型转换 1.1 张量转换为 numpy 数组 1.2 numpy 转换为张量 1.3 标量张量和数字的转换 1.4 小节 2. 张量拼接操作 2.1 torch.cat 函数的使用 2.2 torch.stack 函数的使用 2.3 小节 3. 张量索引操作 3.1 简单行、列索引 3.2 列表索引 3.3 范围索引 3.…...

使用C#禁止Windows系统插入U盘(除鼠标键盘以外的USB设备)

试用网上成品的禁用U盘的相关软件&#xff0c;发现使用固态硬盘改装的U盘以及手机等设备&#xff0c;无法被禁止&#xff0c;无奈下&#xff0c;自己使用C#手搓了一个。 基本逻辑&#xff1a; 开机自启&#xff1b;启动时&#xff0c;修改注册表&#xff0c;禁止系统插入USB存…...

18. 基于ES实战海量数据检索

18. 基于ES实战海量数据检索 一. 概述二. Elasticsearch 全文检索1. 分布式搜索引擎2. 搜索引擎种类3. 倒排索引三. elastic使用1. 官网介绍2. docker安装3. elasticsearch-head工具4. 分词与内置分词4.1 内置分词器(了解即可)4.2 `IK`中文分词器三. 整合SpringCloud1. 基础配置…...

SpringBoot和Redis的交互数据操作以及Redis的持久化/删除策略和缓存问题

目录 一、SpringBoot和Redis/MySQL的数据交互 二、Redis的持久化 1、持久化过程保存什么 2、RDB方式 &#xff08;1&#xff09;RDB手动 &#xff08;2&#xff09;RDB自动 &#xff08;3&#xff09;RDB的优点 &#xff08;4&#xff09;RDB缺点 3、AOF方式 &#…...

Butterworth filter的运行原理

想象一下&#xff0c;你正在录制一个舞蹈表演的视频&#xff0c;但在录制过程中&#xff0c;摄像机由于风的影响稍微晃动了一下。现在&#xff0c;录像中的舞者看起来不再那么流畅&#xff0c;动作变得有点颤抖。你希望能让舞者的动作重新看起来平滑和优雅&#xff0c;这时你就…...

掌握SQL的威力:批量更新与删除的艺术

标题&#xff1a;掌握SQL的威力&#xff1a;批量更新与删除的艺术 在数据库管理中&#xff0c;批量更新&#xff08;UPDATE&#xff09;和删除&#xff08;DELETE&#xff09;操作是常见的需求&#xff0c;特别是在处理大量数据时。SQL作为数据库查询和操作的标准语言&#xf…...

《新一代数据可视化分析工具应用指南》正式开放下载

2024年8月12日&#xff0c;由DataEase开源项目组编写的《新一代数据可视化分析工具应用指南》白皮书正式面向广大用户开放下载。 《新一代数据可视化分析工具应用指南》是DataEase开源项目组为了支持企业落地并推广BI工具、推进企业数据可视化建设而编著的指导手册。通过本白皮…...

数据结构与算法——BFS(广度优先搜索)

算法介绍&#xff1a; 广度优先搜索&#xff08;Breadth-First Search&#xff0c;简称BFS&#xff09;是一种遍历或搜索树和图的算法&#xff0c;也称为宽度优先搜索&#xff0c;BFS算法从图的某个节点开始&#xff0c;依次对其所有相邻节点进行探索和遍历&#xff0c;然后再…...

登录 k8s-Dashboard 显示 Your connection is not private

文章目录 一、背景二、解决方案 一、背景 部署好 kubernetes-Dashboard 后使用 master节点的 ipport 登录 Dashboard 显示 Your connection is not private 无论是 Edge 还是 Google Chrome 都是这样的情况 二、解决方案 点击网页空白处&#xff0c;英文输入法输入&#xf…...

【Bifrost】ubuntu24.04 远程构建及clion设置编码风格google

Bifrost 构建通过clion 远程到ubuntu24.04 构建感觉是不认识这种写法,这种至少是c++11 fix : 修改absl 的构建cmakelist,明确c++17 好像还是不行error: ‘uint8_t’ was not declared in this scope加入:#include <stdint.h>可以解决一部分。那么,这种呢?/home/zha…...

批量查询全国快递单号:高效追踪物流信息

在日常生活和工作中&#xff0c;我们经常会遇到需要查询多个快递单号物流信息的情况。如果手动逐一查询&#xff0c;不仅效率低下&#xff0c;而且容易出错。为了解决这个问题&#xff0c;我们可以借助固乔科技推出的【固乔快递查询助手】软件&#xff0c;轻松实现全国快递的批…...

DVWA | CSRF(LowMedium)攻击的渗透实践

目录 概述 Low Medium 概述 CSRF&#xff08;Cross-Site Request Forgery&#xff0c;跨站请求伪造&#xff09; 是一种网络攻击方式。 通过伪造当前用户的行为&#xff0c;让目标服务器误以为请求由当前用户发起&#xff0c;并利用当前用户权限实现业务请求伪造。 例如&a…...

Tmagic-editor低代码底层拖拽库Moveable示例学习

在前面咱们的自研低代码海报制作平台学习分享计划中分享了自己开发的基本拖拽组件&#xff0c;也只是做了最简单的基本实现。真要写产品&#xff0c;更多还是依赖相关的开源优秀库。 文章目录 参考基本拖拽基本缩放基本Scalable基本旋转基于原点的拖拽和旋转关于练习源码 参考 …...

公开测评:文件防泄密系统哪家好|4款文件防泄密软件推荐

在文件防泄密系统领域&#xff0c;有多款软件以其高效、安全和全面的功能脱颖而出&#xff0c;为企业数据保护提供了有力支持。以下是四款值得推荐的文件防泄密软件&#xff0c;它们各具特色&#xff0c;能够满足不同企业的数据安全需求。 1. 安企神软件 7天试用版https://wor…...

【wiki知识库】09.欢迎页面添加(统计浏览量)Vue修改

目录 ​编辑 一、今日目标 二、新增the-welcome组件 2.1 template 2.2 script 2.2.1 getStatistic 2.2.2 get30DayStatistic 一、今日目标 上篇文章链接&#xff1a;【wiki知识库】08.添加用户登录功能--前端Vue部分修改-CSDN博客 今天就要实现最后的东西了&#xff0c…...

ui自动化难点

位置坐标&#xff1a;可以通过滑动等方式实现 颜色显示&#xff1a;UIAuto.DEV (devsleep.com) --此工具可以解决很多属性上无法解决的问题 原理&#xff1a; 对系统控件的选择和点击实现该方法...

静态路由与默认路由和实验以及ARP工作原理

目录 1.静态路由和默认路由 1.1 静态路由 1.2 默认路由 1.3 主要区别总结 2.实验 2.1 实验 2.1.1 实验top 2.1.2 实验要求 2.2 实验配置 2.2.1 ip信息配置 2.2.2 配置静态 2.2.3配置默认 2.3 实验结果查看 3.为什么第一个ping会显示丢包&#xff1f; 3.1 ARP 工…...

美国洛杉矶大带宽服务器的运维与监控

美国洛杉矶的大带宽服务器因其优越的地理位置、高速的网络连接以及充足的带宽资源&#xff0c;在全球范围内享有很高的声誉。为了确保这些服务器的稳定运行和高效服务&#xff0c;运维与监控工作显得尤为重要。以下是一些关于美国洛杉矶大带宽服务器运维与监控方面的科普内容。…...

AtCoder Beginner Contest 367 A~D

本期封面原图 画师えびら A - Shout Everyday 题意 b点睡觉c点起床&#xff0c;问你a点是不是醒着的 思路 直接判断即可&#xff0c;注意处理跨天的情况 代码 #include <bits/stdc.h> #define mod 998244353 using namespace std; typedef long long ll; typedef …...

oracle 保留两位小数

在Oracle数据库中&#xff0c;保留两位小数可以通过多种函数实现&#xff0c;主要包括ROUND、TRUNC和TO_CHAR函数。每种函数都有其特定的使用场景和效果。 1. ROUND函数 ROUND函数用于对数值进行四舍五入操作&#xff0c;保留指定的小数位数。其基本语法为&#xff1a; ROUN…...

Aop切面技术之存储用户信息

一、背景 在我们日常项目中&#xff0c;常常会将用户的认证信息存入缓存中&#xff0c;方便我们在程序执行中&#xff0c;进行获取用户信息。本篇文章主要是介绍使用自定义注解和AOP切面技术进行实现&#xff0c;这也也是非常容易使用的。 二、代码详解 2.1 自定义注解 定义…...