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

在springboot加vue项目中加入图形验证码

后端

首先先要创建一个CaptchaController的类,可以在下面的代码中看到

在getCaptcha的方法里面写好了生成随机的4位小写字母或数字的验证码,然后通过BufferedImage类变为图片,顺便加上了干扰线。之后把图片转为Base64编码方便传给前端

为了安全我写了encrypt方法把4位验证码加密了一下,和图片放在了Mapli传给了前端,后面的verifyCaptcha是对前端输入的内容和我们生成的验证码进行比较,并返回状态码。

package cn.kmbeast.controller;import org.apache.commons.lang3.RandomStringUtils;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;@RestController
@RequestMapping("/captcha")
public class CaptchaController {private static final String ALGORITHM = "AES";private static final String SECRET_KEY = "1234567890123456"; // 16字节的密钥@GetMapping("/get")public Map<String, Object> getCaptcha(HttpServletResponse response) throws Exception {System.out.println("验证码已生成");response.setContentType("image/png");response.setHeader("Cache-Control", "no-cache");response.setHeader("Expires", "0");// 生成随机4位验证码(字母+数字)String code = RandomStringUtils.randomAlphanumeric(4).toLowerCase();// 加密验证码String encryptedCode = encrypt(code);// 生成图片int width = 100, height = 40;BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);Graphics2D g = image.createGraphics();// 设置背景g.setColor(Color.WHITE);g.fillRect(0, 0, width, height);// 绘制干扰线g.setColor(Color.GRAY);for (int i = 0; i < 10; i++) {int x1 = (int) (Math.random() * width);int y1 = (int) (Math.random() * height);int x2 = (int) (Math.random() * width);int y2 = (int) (Math.random() * height);g.drawLine(x1, y1, x2, y2);}// 绘制验证码g.setColor(Color.BLACK);g.setFont(new Font("Arial", Font.BOLD, 30));g.drawString(code, 15, 30);g.dispose();// 将图片转换为Base64编码java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream();ImageIO.write(image, "PNG", baos);byte[] imageBytes = baos.toByteArray();String base64Image = Base64.getEncoder().encodeToString(imageBytes);Map<String, Object> result = new HashMap<>();result.put("image", base64Image);result.put("encryptedCode", encryptedCode);return result;}@PostMapping("/verify")public Map<String, Object> verifyCaptcha(@RequestBody Map<String, String> requestBody) {Map<String, Object> result = new HashMap<>();String inputCode = requestBody.get("code");String encryptedCode = requestBody.get("encryptedCode");try {// 解密验证码String decryptedCode = decrypt(encryptedCode);if (!decryptedCode.equalsIgnoreCase(inputCode)) {result.put("code", 500);result.put("msg", "验证码错误");} else {result.put("code", 200);result.put("msg", "验证码验证通过");}} catch (Exception e) {result.put("code", 500);result.put("msg", "验证码验证出错");}return result;}// 加密方法private String encrypt(String data) throws Exception {SecretKeySpec secretKey = new SecretKeySpec(SECRET_KEY.getBytes(), ALGORITHM);Cipher cipher = Cipher.getInstance(ALGORITHM);cipher.init(Cipher.ENCRYPT_MODE, secretKey);byte[] encryptedBytes = cipher.doFinal(data.getBytes());return Base64.getEncoder().encodeToString(encryptedBytes);}// 解密方法private String decrypt(String encryptedData) throws Exception {SecretKeySpec secretKey = new SecretKeySpec(SECRET_KEY.getBytes(), ALGORITHM);Cipher cipher = Cipher.getInstance(ALGORITHM);cipher.init(Cipher.DECRYPT_MODE, secretKey);byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedData));return new String(decryptedBytes);}
}

前端

在网页要渲染的样式

 <!-- 添加验证码输入框和显示验证码的图片 --><div class="text"><input v-model="code" class="act" placeholder="验证码" /><img :src="captchaImage" @click="refreshCaptcha" alt="验证码" style="cursor: pointer; vertical-align: middle; margin-left: 10px;"></div>

逻辑处理

//在data里加入
data() {return {captchaImage: '', // 新增:用于存储验证码图片的 Base64 编码encryptedCode: '' // 新增:用于存储加密的验证码}},methods: {// 刷新验证码async refreshCaptcha() {try {const { data } = await request.get(`http://localhost:8088/api/online-travel-sys/v1.0/captcha/get`);this.captchaImage = `data:image/png;base64,${data.image}`;this.encryptedCode = data.encryptedCode;this.code = ''; // 刷新验证码时清空输入框} catch (error) {console.error('获取验证码出错:', error);}},async login() {if (!this.act || !this.pwd) {this.$swal.fire({title: '填写校验',text: '账号或密码不能为空',icon: 'error',showConfirmButton: false,timer: DELAY_TIME,});return;}if (!this.code) {this.$swal.fire({title: '填写校验',text: '验证码不能为空',icon: 'error',showConfirmButton: false,timer: DELAY_TIME,});return;}// 先验证验证码是否正确try {const { data } = await request.post(`http://localhost:8088/api/online-travel-sys/v1.0/captcha/verify`, { code: this.code, encryptedCode: this.encryptedCode });if (data.code !== 200) {this.$swal.fire({title: '验证码错误',text: data.msg,icon: 'error',showConfirmButton: false,timer: DELAY_TIME,});this.refreshCaptcha(); // 刷新验证码return;}} catch (error) {console.error('验证码验证请求错误:', error);this.$message.error('验证码验证出错,请重试!');this.refreshCaptcha(); // 刷新验证码return;}}

完整的前端代码

<template><div class="login-container"><div class="login-panel"><div class="logo"><Logo :bag="colorLogo" sysName="旅友请上车"/></div><div class="text"><input v-model="act" class="act" placeholder="账号" /></div><div class="text"><input v-model="pwd" class="pwd" type="password" placeholder="密码" /></div><!-- 添加验证码输入框和显示验证码的图片 --><div class="text"><input v-model="code" class="act" placeholder="验证码" /><img :src="captchaImage" @click="refreshCaptcha" alt="验证码" style="cursor: pointer; vertical-align: middle; margin-left: 10px;"></div><div><span class="login-btn" @click="login">立即登录</span></div><div class="tip"><p>没有账号?<span class="no-act" @click="toDoRegister">点此注册</span></p></div></div></div>
</template><script>
const ADMIN_ROLE = 1;
const USER_ROLE = 2;
const DELAY_TIME = 1300;
import request from "@/utils/request.js";
import { setToken } from "@/utils/storage.js";
import md5 from 'js-md5';
import Logo from '@/components/Logo.vue';
export default {name: "Login",components: { Logo },data() {return {act: '',pwd: '',code: '', // 新增:用于存储用户输入的验证码colorLogo: 'rgb(38,38,38)',captchaImage: '', // 新增:用于存储验证码图片的 Base64 编码encryptedCode: '' // 新增:用于存储加密的验证码}},created() {// 页面加载时初始化验证码this.refreshCaptcha();},methods: {// 跳转注册页面toDoRegister(){this.$router.push('/register');},// 刷新验证码async refreshCaptcha() {try {const { data } = await request.get(`http://localhost:8088/api/online-travel-sys/v1.0/captcha/get`);this.captchaImage = `data:image/png;base64,${data.image}`;this.encryptedCode = data.encryptedCode;this.code = ''; // 刷新验证码时清空输入框} catch (error) {console.error('获取验证码出错:', error);}},async login() {if (!this.act || !this.pwd) {this.$swal.fire({title: '填写校验',text: '账号或密码不能为空',icon: 'error',showConfirmButton: false,timer: DELAY_TIME,});return;}if (!this.code) {this.$swal.fire({title: '填写校验',text: '验证码不能为空',icon: 'error',showConfirmButton: false,timer: DELAY_TIME,});return;}// 先验证验证码是否正确try {const { data } = await request.post(`http://localhost:8088/api/online-travel-sys/v1.0/captcha/verify`, { code: this.code, encryptedCode: this.encryptedCode });if (data.code !== 200) {this.$swal.fire({title: '验证码错误',text: data.msg,icon: 'error',showConfirmButton: false,timer: DELAY_TIME,});this.refreshCaptcha(); // 刷新验证码return;}} catch (error) {console.error('验证码验证请求错误:', error);this.$message.error('验证码验证出错,请重试!');this.refreshCaptcha(); // 刷新验证码return;}const hashedPwd = md5(md5(this.pwd));const paramDTO = { userAccount: this.act, userPwd: hashedPwd };try {const { data } = await request.post(`user/login`, paramDTO);if (data.code !== 200) {this.$swal.fire({title: '登录失败',text: data.msg,icon: 'error',showConfirmButton: false,timer: DELAY_TIME,});return;}setToken(data.data.token);// 使用Swal通知登录成功,延迟后跳转// this.$swal.fire({//     title: '登录成功',//     text: '即将进入系统...',//     icon: 'success',//     showConfirmButton: false,//     timer: DELAY_TIME,// });// 根据角色延迟跳转setTimeout(() => {const { role } = data.data;this.navigateToRole(role);}, DELAY_TIME);} catch (error) {console.error('登录请求错误:', error);this.$message.error('登录请求出错,请重试!');}},navigateToRole(role) {switch (role) {case ADMIN_ROLE:this.$router.push('/admin');break;case USER_ROLE:this.$router.push('/user');break;default:console.warn('未知的角色类型:', role);break;}},}
};
</script><style lang="scss" scoped>
* {user-select: none;
}
.login-container {width: 100%;min-height: 100vh;background-color: rgb(255, 255, 255);display: flex;/* 启用Flexbox布局 */justify-content: center;/* 水平居中 */align-items: center;/* 垂直居中 */flex-direction: column;/* 如果需要垂直居中,确保子元素也是这样排列 */.login-panel {width: 313px;height: auto;padding: 40px 30px 16px 30px;border-radius: 10px;box-shadow: 0 4px 6px rgba(36, 36, 36, 0.1), 0 1px 3px rgba(40, 40, 40, 0.06);.logo {margin: 10px 0 30px 0;}.act,.pwd {margin: 8px 0;height: 53px;line-height: 53px;width: 100%;padding: 0 8px;box-sizing: border-box;border: 1px solid rgb(232, 230, 230);border-radius: 5px;font-size: 18px;padding: 0 15px;margin-top: 13px;}.act:focus,.pwd:focus {outline: none;border: 1px solid rgb(206, 205, 205);transition: 1.2s;}.role {display: inline-block;color: rgb(30, 102, 147);font-size: 14px;padding-right: 10px;}}.login-btn {display: inline-block;text-align: center;border-radius: 3px;margin-top: 20px;height: 43px;line-height: 43px;width: 100%;background-color: rgb(155, 191, 93);font-size: 14px !important;border: none;color: rgb(250,250,250);padding: 0 !important;cursor: pointer;user-select: none;}.tip {margin: 20px 0;p {padding: 3px 0;margin: 0;font-size: 14px;color: #647897;i{margin-right: 3px;}span {color: #3b3c3e;border-radius: 2px;margin: 0 6px;}.no-act:hover{color: #3e77c2;cursor: pointer;}}}}
</style>

结果展示

相关文章:

在springboot加vue项目中加入图形验证码

后端 首先先要创建一个CaptchaController的类&#xff0c;可以在下面的代码中看到 在getCaptcha的方法里面写好了生成随机的4位小写字母或数字的验证码&#xff0c;然后通过BufferedImage类变为图片&#xff0c;顺便加上了干扰线。之后把图片转为Base64编码方便传给前端 为了…...

【系列专栏】银行IT的云原生架构-存储架构-数据库部署 10

银行 IT 的云原生架构&#xff1a;存储架构&#xff08;数据库部署&#xff09; 一、引言 在银行 IT 云原生架构的构建中&#xff0c;存储架构作为关键支撑&#xff0c;其性能、可靠性和扩展性直接影响着银行各类业务系统的运行效率与数据安全。而数据库作为数据存储与管理的…...

OpenGL ES -> 投影变换矩阵完美解决绘制GLSurfaceView绘制图形拉伸问题

GLSurfaceView绘制图形拉伸问题 假如在XML文件中声明GLSurfaceView的宽高为 android:layout_width"match_parent"android:layout_height"match_parent GLSurfaceView绘制的图形在Open GL ES坐标系中&#xff0c;而Open GL ES坐标系会根据GLSurfaceView的宽高将…...

【Three.js】JS 3D library(一个月进化史)

#春节过完了&#xff0c;该继续投入学习了~ 作为一个平面开发者&#xff0c;想要增进更多的技能&#xff0c;掌握web3D开发# 前置知识与技能 1. JavaScript 基础 - 掌握ES6语法&#xff08;类、模块、箭头函数、解构等&#xff09; - 熟悉异步编程&#xff08;Promise、…...

在 debian 12 上安装 mysqlclient 报错

报错如下 Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple Collecting mysqlclientUsing cached https://pypi.tuna.tsinghua.edu.cn/packages/61/68/810093cb579daae426794bbd9d88aa830fae296e85172d18cb0f0e5dd4bc/mysqlclient-2.2.7.tar.gz (91 kB)Installi…...

wordpress主题插件开发中高频使用的38个函数

核心模板函数 get_header()/get_footer()/get_sidebar() – 加载模板部件 the_title()/the_content()/the_excerpt() – 显示文章标题、内容、摘要 the_post() – 循环中获取文章数据 bloginfo(‘url’) – 获取站点URL wp_head()/wp_footer() – 输出头部/尾部代码 wp_n…...

BMS项目-面试及答疑整理

1. SOC计算用的什么原理实现的? bms目前计算SOC使用的安时积分+开路电压首先得对电池有一个抽象得概念,把电池比作游泳池,电量比作游泳池里面的水,电流比作流入和流出得水流,那么充电也就是往游泳池里面灌入水流安时积分:对水流进行一个实时监测,比如1S一次监测,那么每…...

js第十二题

题十二&#xff1a;轮播图 要求&#xff1a; 1.鼠标不在图片上方时&#xff0c;进行自动轮播&#xff0c;并且左右箭头不会显示&#xff1b;当鼠标放在图片上方时&#xff0c;停止轮播&#xff0c;并且左右箭头会显示&#xff1b; 2.图片切换之后&#xff0c;图片中下方的小…...

LeetCode-76.最小覆盖子串

1、题目描述&#xff1a; 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 "" 。 注意&#xff1a; 对于 t 中重复字符&#xff0c;我们寻找的子字符串中该字符数量必须…...

CAS单点登录(第7版)20.用户界面

如有疑问&#xff0c;请看视频&#xff1a;CAS单点登录&#xff08;第7版&#xff09; 用户界面 概述 概述 对 CAS 用户界面 &#xff08;UI&#xff09; 进行品牌化涉及编辑 CSS 样式表以及一小部分相对简单的 HTML 包含文件&#xff0c;也称为视图。&#xff08;可选&…...

【强化学习的数学原理】第08课-值函数近似-笔记

学习资料&#xff1a;bilibili 西湖大学赵世钰老师的【强化学习的数学原理】课程。链接&#xff1a;强化学习的数学原理 西湖大学 赵世钰 文章目录 一、例子&#xff1a;曲线拟合二、原理-目标函数介绍三、原理-优化算法和函数选择四、原理-示例与分析五、Sarsa和Q-learning六、…...

基于css实现正六边形的三种方案

方案一&#xff1a;通过旋转三个长方形生成正六边形 分析&#xff1a; 如下图所示&#xff0c;我们可以通过旋转三个长方形来得到一个正六边形。疑问&#xff1a; 1. 长方形的宽高分别是多少&#xff1f; 设正六边形的边长是100&#xff0c;基于一些数学常识&#xff0c;可以…...

React VS Vue

React 和 Vue 是目前最流行的两个前端框架&#xff0c;它们在设计理念、生态系统和开发体验上各有特点。以下是对 React 和 Vue 的全方位对比&#xff1a; 1. 核心设计理念 React 库而非框架&#xff1a;React 是一个用于构建 UI 的库&#xff0c;专注于视图层&#xff0c;其…...

CMake 编译工具

在使用 CMake 时&#xff0c;你可以通过指定工具链文件来设置编译器&#xff08;如 GCC、G 或 Clang&#xff09;。以下是具体步骤&#xff1a; 1. 创建工具链文件 首先&#xff0c;创建一个工具链文件&#xff08;例如 toolchain.cmake&#xff09;&#xff0c;并在其中指定…...

el-tree选中数据重组成树

vueelement-ui 实现el-tree选择重新生成一个已选中的值组成新的数据树&#xff0c;效果如下 <template><div class"flex"><el-tree class"tree-row" :data"list" ref"tree" :props"{children: children, label: …...

IO、NIO解读和不同点,以及常用的文件流操作方法

java高级——IO、NIO解读和不同点&#xff0c;以及常用的文件流操作方法 前情提要文章介绍1. 什么是IO1.1 节点的分类1.2 传输方式 2. 七大传输方式解读2.1 File类解读2.1.1 创建文件的三种方式2.2.2 File的常用方法2.2.3 如何正确认识FileUtils 2.2 字节流&#xff08;核心&am…...

51单片机-按键

1、独立按键 1.1、按键介绍 轻触开关是一种电子开关&#xff0c;使用时&#xff0c;轻轻按开关按钮就可使开关接通&#xff0c;当松开手时&#xff0c;开关断开。 1.2、独立按键原理 按键在闭合和断开时&#xff0c;触点会存在抖动现象。P2\P3\P1都是准双向IO口&#xff0c;…...

Spring Boot Actuator 监控✨

Spring Boot Actuator 是 Spring Boot 提供的一个强大的监控和管理工具&#xff0c;它可以帮助你深入了解和监控你的应用程序的运行状态。通过 Actuator&#xff0c;你可以获取应用程序的健康状况、内存使用情况、线程信息、HTTP 请求跟踪等。&#x1f680; 核心知识点 &#…...

SpringBoot论坛网站 – 功能详解与部署教程

项目概述 《SpringBoot的论坛网站》是一个基于SpringBoot框架开发的现代化论坛平台&#xff0c;旨在为用户提供一个便捷的交流空间。该项目不仅功能丰富&#xff0c;还具备良好的扩展性和易用性&#xff0c;适合用于学习、分享和讨论各类话题。以下是项目的核心功能模块和部署…...

俄罗斯方块游戏完整代码示例

以下是一个基于Cocos Creator引擎开发的俄罗斯方块游戏的完整代码示例。该游戏实现了俄罗斯方块的基本功能&#xff0c;并且代码整合在单个文件中&#xff0c;无需任何外部依赖&#xff0c;可以直接在浏览器中运行。 1. 创建Cocos Creator项目 首先&#xff0c;确保你已经安装了…...

【设计模式】【结构型模式】组合模式(Composite)

&#x1f44b;hi&#xff0c;我不是一名外包公司的员工&#xff0c;也不会偷吃茶水间的零食&#xff0c;我的梦想是能写高端CRUD &#x1f525; 2025本人正在沉淀中… 博客更新速度 &#x1f44d; 欢迎点赞、收藏、关注&#xff0c;跟上我的更新节奏 &#x1f3b5; 当你的天空突…...

【设计模式】03-理解常见设计模式-行为型模式(专栏完结)

前言 前面我们介绍完创建型模式和创建型模式&#xff0c;这篇介绍最后的行为型模式&#xff0c;也是【设计模式】专栏的最后一篇。 一、概述 行为型模式主要用于处理对象之间的交互和职责分配&#xff0c;以实现更灵活的行为和更好的协作。 二、常见的行为型模式 1、观察者模…...

Qt 6.8版本 自制windows下运行软件<一>——串口调试助手

自制串口调试助手 哔哩哔哩效果展示 一、 说明 本人在读学生&#xff0c;跟随哔哩哔哩网站北京迅为公司的教学视频&#xff0c;进行学习qt&#xff0c;由于视频中的实现过程是利用ui界面的实现&#xff0c;本人在学习过程中&#xff0c;通过完全敲代码的形式&#xff0c;实现同…...

Qt——静态函数中发送信号方法总结(不需要通过类内部信号与槽实现,关键是清楚你发送的信号源自哪个对象)

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C++语言开发基础总结》 《从0到1学习嵌入式Linux开发》 《QT开发实战》 《Android开发实战》...

深入解析 vLLM:高性能 LLM 服务框架的架构之美(一)原理与解析

修改内容时间2.4.1处理请求的流程&#xff0c;引用更好的流程图2025.02.11首发2025.02.08 深入解析 vLLM&#xff1a;高性能 LLM 服务框架的架构之美&#xff08;一&#xff09;原理与解析 深入解析 vLLM&#xff1a;高性能 LLM 服务框架的架构之美&#xff08;二&#xff09;…...

关于视频去水印的一点尝试

一. 视频去水印的几种方法 1. 使用ffmpeg delogo滤镜 delogo 滤镜的原理是通过插值算法&#xff0c;用水印周围的像素填充水印的位置。 示例&#xff1a; ffmpeg -i input.mp4 -filter_complex "[0:v]delogox420:y920:w1070:h60" output.mp4 该命令表示通过滤镜…...

前端常见面试题-2025

vue4.0 Vue.js 4.0 是在 2021 年 9 月发布。Vue.js 4.0 是 Vue.js 的一个重要版本&#xff0c;引入了许多新特性和改进&#xff0c;旨在提升开发者的体验和性能。以下是一些关键的更新和新特性&#xff1a; Composition API 重构&#xff1a;Vue 3 引入了 Composition API 作为…...

JavaEE-SpringBoot快速入门

文章目录 本节目标Maven什么是Maven创建一个Maven项目maven项目功能maven的依赖管理全球仓库, 私服, 本地服务器, 配置国内镜像 第一个SpringBoot项目创建项目运行SpringBoot程序 SpringBoot原理初步Web服务器 总结 本节目标 了解什么是maven, 配置国内源使用Springboot创建项…...

盛铂科技 SMF106 低相位噪声贴片式频率综合器模块

在现代通信和电子设备领域&#xff0c;频率综合器作为关键组件&#xff0c;其性能优劣直接影响系统的整体表现。盛铂科技的 SMF106 低相位噪声贴片式频率综合器&#xff0c;以其卓越的性能和独特设计&#xff0c;成为众多高性能系统的选择。 一、频率覆盖范围广&#xff0c;步进…...

前端【技术方案】重构项目

1. 明确重构目标 优化性能 减少页面加载时间降低资源占用 提升代码可维护性 更规范的代码风格更清晰的代码结构更明确的模块设计 扩展功能 为项目添加新功能改进现有功能 2. 评估项目现状 审查代码 全面检查现有代码&#xff0c;找出代码中的问题&#xff0c;如代码冗余、耦合…...

第十六天 HarmonyOS WebView开发实战:从加载网页到与JavaScript交互

HarmonyOS WebView开发实战&#xff1a;从加载网页到与JavaScript交互 一、WebView基础与HarmonyOS特性解析 在移动应用开发中&#xff0c;WebView作为内嵌浏览器组件&#xff0c;在HarmonyOS&#xff08;鸿蒙系统&#xff09;中扮演着重要角色。它不仅能够加载本地和远程网页…...

Unity学习part2

为bilibili教程【【Unity教程】零基础带你从小白到超神】 https://www.bilibili.com/video/BV1gQ4y1e7SS/?p50&share_sourcecopy_web&vd_source6e7a3cbb802eb986578ad26fae1eeaab的笔记 1、灯光的使用 定向光模拟太阳&#xff0c;是平行光。旋转定向光&#xff0c;光…...

贪吃蛇游戏

贪吃蛇 一、html <div class"container" id"app"></div><script src"./js/index.js"></script>二、css * {margin: 0;top: 0;} .set {margin: 15px auto;width: 600px; } .container {width: 600px;height: 600px;bac…...

docker修改镜像默认存储路径(基于 WSL2 的迁移方法)

打开powershell窗口 任意地方shift右键 1、停止 WSL wsl --shutdown2、导出数据 wsl --export docker-desktop-data E:\docker\DockerDesktopdata\docker-desktop-data.tar wsl --export docker-desktop E:\docker\DockerDesktop\docker-desktop.tar3、取消注册 wsl --un…...

C#+SqlSugar实现主从库读写分离

在使用 **SqlSugar** 进行分库操作时&#xff0c;可以通过配置多个数据库连接&#xff0c;并根据业务逻辑动态切换数据库。以下是一个完整的分库示例&#xff0c;展示如何实现分库功能。 --- ### **1. 安装 NuGet 包** 安装 SqlSugarCore&#xff1a; bash dotnet add packag…...

从无序到有序:上北智信通过深度数据分析改善会议室资源配置

当前企业普遍面临会议室资源管理难题&#xff0c;预约机制不完善和临时会议多导致资源调度不合理&#xff0c;既有空置又有过度拥挤现象。 针对上述问题&#xff0c;上北智信采用了专业数据分析手段&#xff0c;巧妙融合楼层平面图、环形图、折线图和柱形图等多种可视化工具&a…...

以太网详解(八)传输层协议:TCP/UDP 协议

文章目录 传输层协议概述为什么需要传输层&#xff1f;传输层功能网络层与传输层在实现 “端到端” 传输的异同两类服务:面向连接/无连接服务 传输控制协议 TCPTCP 协议数据单元格式TCP 的重传机制快重传和快恢复快重传举例快恢复算法 用户数据报协议 UDPUDP 概述UDP 基本工作过…...

CentOS 8 配置bond

CentOS 8 网络配置的详细步骤和对应的配置文件内容。 1. 配置聚合网卡(Bonding) 配置intranet聚合网卡 在/etc/sysconfig/network-scripts/目录下创建ifcfg-intranet文件,内容如下: TYPE=Bond NAME=intranet DEVICE=intranet ONBOOT=yes BOOTPROTO=none IPADDR=10.2.1.22…...

C语言基础16:二维数组、字符数组

二维数组 定义 二维数组本质上是一个行列式的组合&#xff0c;也就是说二维数组由行和列两部分组成。属于多维数组&#xff0c;二维数组数据是通过行列进行解读。 二维数组可被视为一个特殊的一维数组&#xff0c;相当于二维数组又是一个一维数组&#xff0c;只不过它的元素…...

Java 同步锁性能的最佳实践:从理论到实践的完整指南

目录 一、同步锁性能分析 &#xff08;一&#xff09;性能验证说明 1. 使用同步锁的代码示例 2. 不使用同步锁的代码示例 3. 结果与讨论 &#xff08;二&#xff09;案例初步优化分析说明 1. 使用AtomicInteger原子类尝试优化分析 2. 对AtomicInteger原子类进一步优化 …...

思科、华为、H3C常用命令对照表

取消/关闭 思科no华为undo华三undo 查看 思科show华为display华三display 退出 思科exit华为quit华三quit 设备命名 思科hostname华为sysname华三sysname 进入全局模式 思科enable、config terminal华为system-view华三system-view 删除文件 思科delete华为delete华…...

[qt5学习笔记]Application Example示例程序源码解析

开发环境问题 vs2022下直接打开ui、ts文件失败 解决办法如下图&#xff0c; 设置designer独立运行。估计是嵌入运行存在些许bug。 同理&#xff0c;ts编辑工具linguist也存在这个问题。 qrc rc的编辑嵌入编辑都正常&#xff0c;但分离式更稳定可靠。 qt creator编译失败 原…...

华为交换机堆叠技术简介配置

目录 一、华为堆叠技术简介&#xff08;一&#xff09;提高可靠性&#xff08;二&#xff09;扩展端口数量&#xff08;三&#xff09;增大带宽&#xff08;四&#xff09;简化组网&#xff08;五&#xff09;长距离堆叠 二、华为交换机堆叠技术的案例及命令配置&#xff08;一…...

腿足机器人之四- 卡尔曼滤波

腿足机器人之四卡尔曼滤波 概率学基础贝叶斯准则熵 卡尔曼滤波扩展卡尔曼滤波信息滤波器 在机器人&#xff08;四足、人形&#xff09;领域&#xff0c;感知和行动的不确定性可能由多种因素引起&#xff0c;如传感器噪声、外部环境的变化、非精确控制以及实时性算力限制等。 和…...

nginx 部署前端vue项目

&#x1f468;‍⚕ 主页&#xff1a; gis分享者 &#x1f468;‍⚕ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕ 收录于专栏&#xff1a;前端工程师 文章目录 一、&#x1f353;什么是nginx&#xff1f;二、&#x1f353;nginx 部署…...

【第1章:深度学习概览——1.6 深度学习框架简介与选择建议】

嘿,各位老铁们,今天咱们来一场深度学习框架的深度探索之旅。在这个充满无限可能的深度学习时代,深度学习框架就像是连接理论与实践的桥梁,帮助我们从算法设计走向实际应用。随着技术的飞速发展,深度学习框架的选择变得越来越多样化,每一种框架都有其独特的优势和适用场景…...

NLLB 与 ChatGPT 双向优化:探索翻译模型与语言模型在小语种应用的融合策略

作者&#xff1a;来自 vivo 互联网算法团队- Huang Minghui 本文探讨了 NLLB 翻译模型与 ChatGPT 在小语种应用中的双向优化策略。首先介绍了 NLLB-200 的背景、数据、分词器和模型&#xff0c;以及其与 LLM&#xff08;Large Language Model&#xff09;的异同和协同关系。接着…...

C#的委托delegate与事件event

在C#中&#xff0c;delegate&#xff08;委托&#xff09;和 event&#xff08;事件&#xff09;是两个非常重要的概念&#xff0c;它们主要用于实现回调机制和事件驱动编程。下面详细介绍它们的原理和使用场景。 1. Delegate&#xff08;委托&#xff09; 1.1 委托的原理 委托…...

Spring Boot 集成MyBatis-Plus

文章目录 一、背景说明二、集成过程 2.1 引入 maven 依赖2.2 增加属性配置2.3 自动配置类 三、验证集成 3.1 控制器3.2 服务类3.3 Mapper接口类3.4 实体类3.4 不要忘记XML文件3.5 发起请求 四、技巧拓展 4.1 如何打印sql语句&#xff1f;4.2 如何对参数增加非空验证&#xff1f…...

javacv将视频切分为m3u8视频并播放

学习链接 ffmpeg-demo 当前对应的 gitee代码 Spring boot视频播放(解决MP4大文件无法播放)&#xff0c;整合ffmpeg,用m3u8切片播放。 springboot 通过javaCV 实现mp4转m3u8 上传oss 如何保护会员或付费视频&#xff1f;优酷是怎么做的&#xff1f; - HLS 流媒体加密 ffmpe…...