项目实践 之 pdf简历的解析和填充(若依+vue3)
文章目录
- 环境背景
- 最终效果
- 前端讲解
- 左侧模块解析
- 右侧上传模块解析
- 前端步骤
- 后端讲解
- 代码
- 前端
环境背景
- 若依前后端分离框架 + vue
- 最后边附有代码哦
最终效果
前端讲解
左侧模块解析
- 1、左侧表单使用el-form
注意:
1、prop出现的字段,需要保证是该类所具有的字段
2、点击提交按钮后,调用的是handleSubmit方法
右侧上传模块解析
① v-if=“uploadedFileName” 如果对uploadedFileName不为空,该控件显示
② v-model=“upload.open” 在vue2中会写成 :visible.sync=“upload.open” ,在vue3中是不生效的,需要修改
③ 上传文件限制,只能上传1个
④ 前端限制,上传的文件只能是pdf
前端步骤
-
1、在打开页面时,通过 created() 的 this.fetchResumeData()来获取数据
-
2、fetchResumeData通过await getResumeByUsername(username)来调用js的方法然后获得数据,然后通过this.myResume=response.data填充
-
3、当点击上传简历按钮时,会调用handleImport方法,然后更改upload的open属性为true,这样就显示了上传文件的对话框了
-
4、文件上传完成后,会调用submitFileForm方法,开始上传,同时调用upload中的url进行文件解析
-
5、上传成功后,会调用handleFileSuccess方法,然后将内容填充
后端讲解
- pom文件
<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.26</version>
</dependency>
- controller层
@RequestMapping("/parsepdf")public AjaxResult parsePdf(@RequestParam("file") MultipartFile file) {try {// 保存文件到本地String filePath = PdfUtil.save(file);// 获取 PDF 文件内容String content = PdfUtil.getContent(file.getInputStream());// 解析 PDF 内容并封装为简历信息Map<String, String> map = PdfUtil.setResume(content,file.getName(),filePath);// 返回解析后的数据return AjaxResult.success(map);} catch (Exception e) {System.err.println(e.getMessage());return AjaxResult.error("文件解析失败:" + e.getMessage());}}
-
pdf格式说明
需按照如下的格式,因为正则匹配的解析是这么来的,可以结合后边的正则函数查看
-
PdfUtil类
package com.ruoyi.utils;import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.utils.file.FileUploadUtils;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class PdfUtil {/*** 将上传的文档保存到本地* @param file* @return* @throws IOException*/public static String save(MultipartFile file) throws IOException{String path = FileUploadUtils.upload(file);// 为什么是e?String realPath = path.substring(path.indexOf("e")+2);String baseDir = RuoYiConfig.getProfile();String filePath = baseDir + realPath;return filePath;}public static String getContent(InputStream inputStream) throws IOException {try (PDDocument document = PDDocument.load(inputStream)) {PDFTextStripper stripper = new PDFTextStripper();return stripper.getText(document);}}/*** 将内容按照字段存储进行匹配* @param content* @return*/public static Map<String,String> setResume(String content,String fileName,String filePath){// map用来存储解析到的内容Map<String,String> map = new HashMap<>();map.put("file_name",fileName);map.put("file_path",filePath);String skillRegex ="专业技能\\s+(.*?)(?=工作经历|$)"; ; // "专业技能\r?\n([\s\S]+)"String skill = regex(skillRegex,content);System.err.println("--------------专业技能-------------");System.err.println("skills:"+skill);map.put("skills",skill);String phoneRegex = "联系方式:(\\d+) 邮箱:(\\S+)";String phone = regex(phoneRegex,content);System.err.println("--------------联系电话-------------");System.err.println("phone"+phone);map.put("phone",phone);String titleRegex = "求职意向\\s+(.*?)(?=简介|$)";String title = regex(titleRegex,content);System.err.println("--------------求职意向-------------");System.err.println("title"+title);map.put("title",title);String summaryRegex = "简介\\s+(.*?)(?=获奖及证书|$)";String summary = regex(summaryRegex,content);System.err.println("--------------简介即总结-------------");System.err.println("summary"+summary);map.put("summary",summary);String experienceRegex = "工作经历\\s+(.*?)(?=工作项目经历|$)";// "工作项目经历\\r?\\n([\\s\\S]+)"String experience = regex(experienceRegex,content);System.err.println("--------------工作项目经历-------------");System.err.println("experience"+experience);map.put("experience",experience);String projectRegex = "工作项目经历\\s+(.*)";// "工作项目经历\\r?\\n([\\s\\S]+)"String project = regex(projectRegex,content);System.err.println("--------------工作项目经历-------------");System.err.println("content"+project);map.put("content",project);String educationRegex = "教育经历\\s+(.*)"; // "< < < 个人信息\\s*(.*?)(?=< < < 教育背景)"String education = regex(educationRegex,content);System.err.println("--------------教育背景-------------");System.err.println("education"+education);map.put("education",education);String certificationRegex = "获奖及证书\\s+(.*?)(?=专业技能|$)";String certification = regex(certificationRegex,content);System.err.println("--------------获奖及证书-------------");System.err.println("certifications"+certification);map.put("certifications",certification);return map;}/*** 匹配规则* @param regex 匹配要求* @param content 需要匹配的内容* @return 匹配结果*/public static String regex(String regex,String content){Pattern pattern=Pattern.compile(regex,Pattern.DOTALL);// 如果想要获取多行,这里一定添加的是Pattern.DOTALLMatcher matcher=pattern.matcher(content);if(matcher.find()){String data=matcher.group(1).trim();return data;}return null;}
}
代码
前端
<template><div class="container"><div class="my-myResume"><!--简历编辑页面--><el-form :model="myResume" ref="resumeForm" label-width="120px" class="myResume-form"><el-form-item label="求职意向" prop="title"><el-input v-model="myResume.title" placeholder="请输入简历标题"></el-input></el-form-item><el-form-item label="联系方式A" prop="summary"><el-input type="textarea" v-model="myResume.phone" placeholder="请输入您的手机号码"></el-input></el-form-item><el-form-item label="个人介绍" prop="summary"><el-input type="textarea" v-model="myResume.summary" placeholder="请输入个人介绍"></el-input></el-form-item><el-form-item label="工作经历" prop="experience"><el-input type="textarea" v-model="myResume.experience" placeholder="请输入工作经历"></el-input></el-form-item><el-form-item label="工作项目经历" prop="content"><el-input type="textarea" v-model="myResume.content" placeholder="请输入工作项目经历"></el-input></el-form-item><el-form-item label="教育经历" prop="education"><el-input type="textarea" v-model="myResume.education" placeholder="请输入教育经历"></el-input></el-form-item><el-form-item label="专业技能" prop="skills"><el-input type="textarea" v-model="myResume.skills" placeholder="请输入专业技能"></el-input></el-form-item><el-form-item label="获奖及证书" prop="certifications"><el-input type="textarea" v-model="myResume.certifications" placeholder="请输入获得的认证"></el-input></el-form-item><el-button type="primary" @click="handleSubmit">提交</el-button></el-form></div><div class="pdfModule"><!-- 上传PDF按钮--><el-button type="primary" @click="handleImport">上传PDF简历</el-button><div v-if="uploadedFileName" class="file-name">已上传文件:{{ uploadedFileName }}</div><!-- 上传对话框--><el-dialog :title="upload.title" v-model="upload.open" width="400px" append-to-body="true"><el-uploadref="upload":limit="1"accept=".pdf":headers="upload.headers":action="upload.url":disabled="upload.isUploading":on-progress="handleFileUploadProgress":on-success="handleFileSuccess":auto-upload="false"><i class="el-icon-upload"></i><div class="el-upload__text">将文件拖到此处,或 <em>点击上传</em></div><div class="el-upload__tip text-center" slot="tip"><span>仅允许导入pdf格式文件</span></div></el-upload><div slot="footer" class="dialog-footer"><el-button type="primary" @click="submitFileForm">确定</el-button><el-button @click="upload.open = false">取消</el-button></div></el-dialog></div></div>
</template><script>
import {ElForm, ElFormItem, ElInput, ElButton, ElMessage} from 'element-plus';
import {updateResume, getResumeByUsername, uploadResume, getUserIdByUsername} from '@/api/myResume/myResume'; // 更新API路径import Cookies from 'js-cookie'import axios from 'axios';import {getToken} from "@/utils/auth.js";export default {name: 'MyResume',data() {return {// 初始化简历对象myResume: {resume_id: null, //初始化为null,后续从当前用户获取title: '',phone:'',summary: '',experience: '',content:'',education: '',skills: '',certifications: '',file_name:'',file_path:'',},// 简历导入参数upload:{open:false,title:"上传PDF简历",isUploading:false,headers:{ Authorization:"Bearer "+getToken()},// url:process.env.VUE_APP_BASE_API+"/resumes/resume/import"url:"http://localhost:8088/student/myResume/parsepdf"},uploadedFileName:'', // 存储上传的文件名称};},methods: {// 导入按钮操作/*** 打开上传对话框*/handleImport(){this.upload.title ="上传PDF简历";this.upload.open = true;},/*** 文件上传中处理*/handleFileUploadProgress(event,file,fileList){this.upload.isUploading = true;console.log("文件上传中", event, file, fileList);},/*** 文件上传成功处理*/async handleFileSuccess(response,file){this.upload.open = false;this.upload.isUploading = false;this.$refs.upload.clearFiles();if(response.code===200){this.fillFormWithPDFData(response.data);// 将解析的数据填充到表单中this.uploadedFileName = file.name; //显示上传的文件名称ElMessage.success('文件上传成功');}else{ElMessage.error('文件解析失败');}},/*** 提交上传的文件*/submitFileForm(){console.log("上传接口 URL:", this.upload.url); // 调试日志this.$refs.upload.submit();},// 将解析的PDF数据填充到表单中fillFormWithPDFData(data) {this.myResume.title = data.title || '';this.myResume.phone = data.phone || '';this.myResume.summary = data.summary || '';this.myResume.experience = data.experience || '';this.myResume.education = data.education || '';this.myResume.skills = data.skills || '';this.myResume.certifications = data.certifications || '';this.myResume.content = data.content || '';this.myResume.file_name = data.file_name || '';this.myResume.file_path = data.file_path || '';},// 提交表单更新简历async handleSubmit() {try {const username = this.getCurrentUsername(); // 获取当前用户的usernameconsole.log(username);if(!username){this.$message.error('未获取到用户信息');return;}const res = await updateResume(this.myResume);// 调用更新简历的APIconst userId = await getUserIdByUsername(username);console.log(userId);// const res = await axios.post(url, this.myResume);if (res.code === 200) {ElMessage.success('简历更新成功');} else {ElMessage.success('简历更新失败');}} catch (error) {console.error('提交失败:', error);ElMessage.success('简历更新失败');}},// 获取简历数据 (初始加载)async fetchResumeData() {try {const username = await this.getCurrentUsername();const response = await getResumeByUsername(username); // 调用获取简历数据的方法if (response.code === 200) {this.myResume = response.data; // 使用返回的数据更新 myResumethis.uploadedFileName = this.myResume.file_name;// 显示已上传的文件名称if(this.uploadedFileName){this.upload.open = true;}} else {console.error('获取简历数据失败:', response.msg);}} catch (error) {console.error('请求失败:', error);}},// 获取当前用户的usernamegetCurrentUsername(){const name = Cookies.get('username');return name;// return this.$store.state.user.userId;// return localStorage.getItem('userId');}},created() {this.fetchResumeData(); // 页面加载时获取简历数据}};
</script><style scoped>/* 容器布局 */
.container {display: flex;width: 100%;height: 100vh; /* 使容器占满整个视口高度 */background-color: #f9f9f9; /* 浅灰色背景 */
}/* 简历编辑区域 */
.my-myResume {flex: 7; /* 占据 4 份 */padding: 20px;overflow-y: auto; /* 如果内容过多,允许滚动 */
}/* PDF上传区域 */
.pdfModule {flex: 2; /* 占据 1 份 */padding: 20px;/*border-left: 1px solid #ddd; !* 添加左边框分隔 *!*/
}/* 表单样式 */
.myResume-form {max-width: 800px; /* 限制表单最大宽度 */margin: 0 auto; /* 居中显示 */
}.file-name{margin-top: 10px;font-size: 14px;color:#666;
}.el-upload__text {font-size: 14px;color: #666;
}.el-upload__tip {font-size: 12px;color: #999;
}.dialog-footer {text-align: right;
}
</style>
- js内容
// src/myResume/myResume.jsimport request from '@/utils/request'
// 根据username获取userId
export function getUserIdByUsername(username){return request({url:`/student/myResume/getUserId/${username}`,method:'get'})
}
// 更新简历数据
export function updateResume(data) {return request({url: '/student/myResume/updateResume',method: 'put',data: data})
}// 根据username获取简历数据
export function getResumeByUsername(username) {return request({url: `/student/myResume/getByUsername/${username}`,method: 'get',})
}
相关文章:
项目实践 之 pdf简历的解析和填充(若依+vue3)
文章目录 环境背景最终效果前端讲解左侧模块解析右侧上传模块解析前端步骤 后端讲解代码前端 环境背景 若依前后端分离框架 vue最后边附有代码哦 最终效果 前端讲解 左侧模块解析 1、左侧表单使用el-form 注意: 1、prop出现的字段,需要保证是该类所…...
RAGS评测后的数据 如何利用influxdb和grafan 进行数据汇总查看
RAGS(通常指相关性、准确性、语法、流畅性)评测后的数据能借助 InfluxDB 存储,再利用 Grafana 进行可视化展示,实现从四个维度查看数据,并详细呈现每个问题对应的这四个指标情况。以下是详细步骤: 1. 环境准备 InfluxDB 安装与配置 依据自身操作系统,从 InfluxDB 官网下…...
本地部署阿里的万象2.1文生视频(Wan2.1-T2V-1.3B)模型
文章目录 (零)在线体验(一)本地部署(1.1)克隆仓库(1.2)安装依赖(1.2.1)安装 flash-attention(1.2.2)重新安装依赖(1.2.3&a…...
centos设置 sh脚本开机自启动
1. start.sh脚本 #!/bin/bash# 依赖docker,等待xxx容器完全启动 sleep 60curl -X POST "localhost:8381/models?urlmymodel.mar&model_namemymodel&batch_size1&max_batch_delay10&initial_workers1"sudo /usr/local/nginx/sbin/nginx …...
一文读懂什么是K8s Admission Controller
#作者:曹付江 文章目录 1、什么是 Admission Controllers?2、如何创建 Admission Controllers?3、Admission 控制器的最佳实践 K8s 中的操作与安全标准执行机制: 1、什么是 Admission Controllers? Admission contro…...
江协科技/江科大-51单片机入门教程——P[1-3] 单片机及开发板介绍
前言:本节主要的任务是了解一下 51 单片机和所用的普中51开发板。 目录 一、单片机介绍 二、单片机的应用领域 三、STC89C52单片机 四、命名规则 五、单片机内部拆解 六、单片机内部结构图 七、单片机管脚图 八、单片机最小系统 九、开发板介绍 十、开发…...
一周学会Flask3 Python Web开发-Jinja2模板继承和include标签使用
锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 不管是开发网站还是后台管理系统,我们页面里多多少少有公共的模块。比如博客网站,就有公共的头部&…...
4.3MISC流量分析练习-wireshark-https
流量分析题目的例题 1.了解wireshark的过滤方式 2.了解tls跟ssl协议基本还原 3.了解xor基本变换方式,获取flag 附件是一个流量包,打开之后有各种流量,但是分析无果,然后丢到kali中使用binwalk进行分析,发现有一个r…...
wifi5和wifi6,WiFi 2.4G、5G,五类网线和六类网线,4G和5G的区别
wifi5和wifi6的区别 是Wi-Fi 5和Wi-Fi 6的选择与路由器密切相关。路由器是创建和管理无线网络的设备,它决定了网络的类型和性能。具体来说: 路由器的标准支持:路由器可以支持不同的Wi-Fi标准,如Wi-Fi 5(802.11ac)和Wi-Fi 6(802.11ax)。支持Wi-Fi 6的路由器能够提供更高…...
【二分查找】P9698 [GDCPC2023] Path Planning|普及
本文涉及的基础知识点 本博文代码打包下载 C二分查找 [GDCPC2023] Path Planning 题面翻译 【题目描述】 有一个 n n n 行 m m m 列的网格。网格里的每个格子都写着一个整数,其中第 i i i 行第 j j j 列的格子里写着整数 a i , j a_{i, j} ai,j。从 0…...
请介绍一下Java的面向对象特性
Java是一种纯面向对象的语言,它支持类、继承、封装和多态等面向对象的基本概念。以下是Java面向对象特性的详细介绍: 一、封装 封装是面向对象编程的核心思想之一,它指的是将对象的属性和方法结合在一起,并隐藏对象的内部实现细…...
使用ZFile打造属于自己的私有云系统结合内网穿透实现安全远程访问
文章目录 前言1.关于ZFile2.本地部署ZFile3.ZFile本地访问测试4.ZFile的配置5.cpolar内网穿透工具安装6.创建远程连接公网地址7.固定ZFile公网地址 前言 在数字化的今天,我们每个人都是信息的小能手。无论是职场高手、摄影达人还是学习狂人,每天都在创造…...
Spring 源码硬核解析系列专题(八):Spring Security 的认证与授权源码解析
在前几期中,我们从 Spring 核心到 Spring Boot,再到 Spring Cloud,逐步探索了 Spring 生态的底层原理。作为企业级应用的关键组件,Spring Security 提供了全面的安全解决方案,包括认证(Authentication)和授权(Authorization)。本篇将深入 Spring Security 的源码,剖析…...
Windows 图形显示驱动开发-WDDM 3.2-自动显示切换(七)
亮度数据 为了确保用户不会因为切换而注意到亮度变化,GPU0 和 GPU1 显示的所有亮度属性都必须相同。 此要求可确保在切换 GPU0 至 GPU1 之前的任何亮度级别,在切换至 GPU1 后都可以支持。 为此,GPU0 和 GPU1 的驱动程序必须: 使…...
Android ObjectBox数据库使用与集成指南
ObjectBox其核心特点ObjectBox与 SQLite 和 Realm 的对比Android集成ObjectBox创建ObjectBox实体对象创建ObjectBox操作管理类OBManager在Application初始化ObjectBox插入或更新数据查询数据统计数据分页数据查询删除数据总结今天分享一套Android另一个数据库ObjectBox。Object…...
C++ Qt常见面试题(3):Qt内存管理机制
Qt 内存管理机制是其框架的重要组成部分,目的是简化开发者对内存的管理,减少内存泄漏的风险,同时提供高效的资源使用方式。Qt 的内存管理机制主要依赖于 对象树(Object Tree) 和 父子关系(Parent-Child Relationship) 的设计,通过智能管理对象的生命周期来实现自动化的…...
到底什么是认证?
哈喽!欢迎来到程序视点,我是小二哥!本店菜品如下: #风暴过后以桶 认证和授权 什么是认证 认证 (Authentication) 是根据凭据验明访问者身份的流程。即验证“你是你所说的那个人”的过程。 身份认证,通常通过用户名…...
量子计算可能改变世界的四种方式
世界各地的组织和政府正将数十亿美元投入到量子研究与开发中,谷歌、微软和英特尔等公司都在竞相实现量子霸权。 这其中的利害关系重大,有这么多重要的参与者,量子计算机的问世可能指日可待。 为做好准备,,我们必须了…...
【Web安全】图片验证码DOS漏洞
文章目录 免责声明一、漏洞原理二、测试步骤三、测试案例四、修复方式免责声明 在网络安全领域,技术文章应谨慎使用,遵守法律法规,严禁非法网络活动。未经授权,不得利用文中信息进行入侵,造成的任何后果,由使用者自行承担,本文作者不负责。提供的工具仅限学习使用,严禁…...
鸿蒙Next如何自定义标签页
前言 项目需求是展示标签,标签的个数不定,一行展示不行就自行换行。但是,使用鸿蒙原生的 Grid 后发现特别的难看。然后就想着自定义控件。找了官方文档,发现2个重要的实现方法,但是,官方的demo中讲的很少&…...
一周学会Flask3 Python Web开发-Jinja2模板过滤器使用
锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 在Jinja2中,过滤器(filter)是一些可以用来修改和过滤变量值的特殊函数,过滤器和变量用一个竖线 | &a…...
HarmonyOS 5.0应用开发——鸿蒙接入高德地图实现POI搜索
【高心星出品】 文章目录 鸿蒙接入高德地图实现POI搜索运行结果:准备地图编写ArkUI布局来加载HTML地图 鸿蒙接入高德地图实现POI搜索 在当今数字化时代,地图应用已成为移动设备中不可或缺的一部分。随着鸿蒙系统的日益普及,如何在鸿蒙应用中…...
浅谈HTTP及HTTPS协议
1.什么是HTTP? HTTP全称是超文本传输协议,是一种基于TCP协议的应用非常广泛的应用层协议。 1.1常见应用场景 一.浏览器与服务器之间的交互。 二.手机和服务器之间通信。 三。多个服务器之间的通信。 2.HTTP请求详解 2.1请求报文格式 我们首先看一下…...
内存泄漏指什么?常见的内存泄漏有哪些?
内存泄漏是指程序在运行过程中,由于某些原因导致程序无法释放已经不再使用的内存,使得这部分内存持续被占用,最终可能导致系统可用内存逐渐减少,严重时会影响系统性能甚至导致程序崩溃。(内存泄漏是指程序中已经分配的…...
FFmpeg视频处理入门级教程
一、FFmpeg常规处理流程 #mermaid-svg-W8X1llNEyuYptV3I {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-W8X1llNEyuYptV3I .error-icon{fill:#552222;}#mermaid-svg-W8X1llNEyuYptV3I .error-text{fill:#552222;str…...
PINN求解固体力学问题——论文加代码
PINN求解固体力学问题——论文加代码 1. 训练2. 可视化 论文:Physics-Informed Deep Learning and its Application in Computational Solid and Fluid Mechanics 1. 训练 # %load Plane_Stress_W-PINNs.py """ Forward Problem for Plane Stress …...
HC32F460_SCI驱动(一)
在开始介绍HC32F460的SCI驱动之前,先重点说明一下功能组与串口相关参数,以便于更好的描述SCI驱动。 1. 功能组 1.1 基本概念 HC32F460的引脚功能复用机制通过Func_Grp(功能组)实现,其灵活性显著高于传统单片机(如STM32系列)。每个引脚支持多种外设功能,具体功能通过选…...
程序诗篇里的灵动笔触:指针绘就数据的梦幻蓝图
大家好啊,我是小象٩(๑ω๑)۶ 我的博客:Xiao Xiangζั͡ޓއއ 很高兴见到大家,希望能够和大家一起交流学习,共同进步。 这一节我们来学习指针的相关知识,学习内存和地址,指针变量和地址,包…...
QT:QPen、QBrush、与图形抗锯齿的关联
QPen QPen 是 Qt 框架中用于定义绘图时使用的画笔属性的类。在使用 QPainter 进行 2D 绘图时,QPen 可以控制线条的外观,比如线条的颜色、宽度、样式(如实线、虚线等)、端点样式(如方形端点、圆形端点等)和…...
数据结构秘籍(一)线性数据结构
1.数组 数组(Array)是一种很常见的数据结构。它由相同类型的元素(element)组成,并且是使用一块连续的内存来存储。 我们直接可以利用元素的索引(index)计算出该元素对应的存储地址。 数组的特…...
【数据分享】2000-2024年全国逐年归一化植被指数(NDVI)栅格数据(年平均值)
NDVI,全名为Normalized Difference Vegetation Index,中文名称为归一化植被指数。这个指数可以用来定性和定量评价植被覆盖及其生长活力,我们也可以简单地将它理解为体现植被密度和健康状况的一个指标。 之前我们给大家分享了来源于MOD13A3数…...
解决前端计算的浮点精度问题
问题:比如1001*1.11等于110.11 但是如果用前端开发处理的话 ,因为涉及到浮点数运算(这是因为JavaScript(以及其他许多编程语言)使用IEEE 754标准来表示浮点数,导致某些十进制小数无法精确表示,…...
C语言基本知识------指针(4)
1. 回调函数是什么? 回调函数就是⼀个通过函数指针调用的函数。 如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数 时,被调⽤的函数就是回调函数。 void qsort(void base,//指针…...
004 Kafka异常处理
6.异常处理 文章目录 6.异常处理1.异常分类与处理原则2.生产者异常处理1. 同步发送捕获异常2. 异步发送回调处理 3.消费者异常处理1.全局异常处理器2.方法级处理3.重试yml配置 4.死信队列(DLQ)配置1. 启用死信队列2. 手动发送到DLQ 5.事务场景异常处理1.…...
C++模拟实现map和set
C模拟实现map和set 1、STL源代码分析2、实现出复用红黑树的框架3、实现红黑树的迭代器4、解决map和set中key不可修改问题5、解决insert返回值问题完整代码 模拟实现map和set实际上是对红黑树的封装,如对红黑树的实现有疑问,请移步:C手撕红黑树…...
使用elasticdump导出/导入 -- ES数据
导出指定索引数据到指定文件夹: ./elasticdump --inputhttp://用户:密码IP:9201/索引名字 --output导出路径/out.json --typedata 将导出的文件导入 ./elasticdump --input路径/out.json --outputhttp://账号:密码IP:9201/索引名称 --typedata --fileTypejson 【el…...
CSDN年度评选揭晓,永洪科技AI技术与智能应用双星闪耀
近日,永洪科技在CSDN(中国专业开发者社区)的年度评选中,凭借在人工智能技术创新与vividime在行业应用中的卓越表现,一举斩获“人工智能企业”及“智能应用”双料大奖。这一荣誉不仅彰显了永洪科技在AI领域的领先地位&a…...
Kubernetes 资源利用率翻倍?离在线混合部署深度解析
还在为 Kubernetes 集群资源利用率低而烦恼?还在为高昂的云成本而头疼?今天,我们就来聊聊 Kubernetes 中的一项黑科技——离在线混合部署,让大家的集群资源利用率翻倍,成本减半! 🤔 什么是离在线…...
【Java】Spring Boot全量YAML配置说明
目录 Spring Boot 配置文件基础核心配置日志配置Web 服务器配置数据源配置JPA 配置缓存配置国际化配置邮件服务配置自定义配置使用示例1. Spring Boot 配置文件基础 Spring Boot 的配置文件可以使用以下文件格式: application.propertiesapplication.ymlSpring Boot 默认加载…...
【STL】7.STL常用算法(1)
STL常用算法(1) 前言简介一.遍历算法1.for_each2.transform 二.查找算法1.find2.find_if3.adjacent_find4.binary_search5.count6.cout_if 三.排序算法1.sort2.random_shuffle3.merge4.reverse 总结 前言 stl系列主要讲述有关stl的文章,使用S…...
弱监督语义分割学习计划(1)-简单实现CAM但是效果不好
零: 项目说明 是这样的一个事情,经过与deepseek的一番讨论和交流,DeepSeek为我设计了一个30天高强度学习计划,重点聚焦弱监督/无监督语义分割在野外场景的应用,结合理论与实践,并最终导向可落地的开源项目。目前开始了…...
内存泄漏问题分享
在前端开发中,内存泄漏(Memory Leak)是指由于代码问题导致浏览器无法回收不再使用的内存,从而影响网页的性能,导致页面变慢,甚至崩溃。前端内存泄漏通常由以下几种原因引起,理解和修复这些问题对…...
用 DeepSeek 打样!KubeSphere LuBan 用 3 天/3 分钟“干掉”大模型部署焦虑
用 DeepSeek 打样!KubeSphere LuBan 用 3 天/3 分钟“干掉”大模型部署焦虑 大模型落地,如何告别“部署焦虑”? DeepSeek-R1 的惊艳表现无需赘述,但企业落地时的高门槛却让许多开发者望而却步——复杂的部署流程、资源调度难题、…...
Java在云计算平台中的应用研究
Java在云计算平台中的应用研究 随着云计算的广泛应用,越来越多的企业和开发者开始选择基于云计算的架构来构建和部署应用。Java作为一种成熟的编程语言,凭借其跨平台性、强大的生态系统以及优秀的并发处理能力,已成为云计算平台中常用的编程…...
【学写LibreCAD】0 仿写LibreCAD简介
一、LibreCAD 核心模块: 核心模块(Core) 功能:处理 CAD 的核心逻辑,如几何计算、图形对象管理、坐标系转换等。关键组件: 图形对象:如直线、圆、圆弧、多段线等。数学工具:向量、矩…...
【质量管理】怎么评估职能部门当前质量管理成熟度
评估目的 在做质量管理时,我们需要先了解各职能部门当前质量管理成熟度。从而识别改进机会,为各职能部门后续质量提升计划提供依据。 直白说:就是让那些不肯动的人动起来,同时往往总经理对各部门的质量管理成熟度的评分要更低&…...
音乐游戏Dance Dance Revolution(DDR)模拟器
文章目录 (一)Dance Dance Revolution(1.1)基本情况(1.2)机体 (二)模拟器(2.1)主程序(2.2)模拟器主题 (三)曲谱…...
【Pandas】pandas Series filter
Pandas2.2 Series Computations descriptive stats 方法描述Series.align(other[, join, axis, level, …])用于将两个 Series 对齐,使其具有相同的索引Series.case_when(caselist)用于根据条件列表对 Series 中的元素进行条件判断并返回相应的值Series.drop([lab…...
SpringBoot项目注入 traceId 来追踪整个请求的日志链路
SpringBoot项目注入 traceId 来追踪整个请求的日志链路,有了 traceId, 我们在排查问题的时候,可以迅速根据 traceId 查找到相关请求的日志,特别是在生产环境的时候,用户可能只提供一个错误截图,我们作为开发…...
UVM 软链接应用
软链接在环境中主要是为了代码复用,目前用到的场景有两种: 1)将UT 环境的代码 链接到ST环境上复用: 将ut 的transaction和sequence等在ST上复用 使用方法 在st对应目录下执行命令: ln -s 。…/xxxx/UT/xxx/xx_transact…...