济源市住房和城乡建设局网站/网站指数查询

济源市住房和城乡建设局网站,网站指数查询,wordpress投票插件wp-polls,阜宁做网站哪家公司好文章目录 环境背景最终效果前端讲解左侧模块解析右侧上传模块解析前端步骤 后端讲解代码前端 环境背景 若依前后端分离框架 vue最后边附有代码哦 最终效果 前端讲解 左侧模块解析 1、左侧表单使用el-form 注意: 1、prop出现的字段,需要保证是该类所…

文章目录

  • 环境背景
  • 最终效果
  • 前端讲解
    • 左侧模块解析
    • 右侧上传模块解析
    • 前端步骤
  • 后端讲解
  • 代码
    • 前端

环境背景

  • 若依前后端分离框架 + 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',})
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/71934.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何看待 Kaiming He 最新提出的 Fractal Generative Models ?

何恺明团队提出的分形生成模型(Fractal Generative Models) 引发了广泛关注,其核心思想是通过递归调用生成模型模块构建自相似结构,类似数学中的分形概念(如雪花结构),从而高效生成高分辨率数据(如图像)。 Fractal Generative Models即分形生成模型,是一种新型的生成…

Debian系统终端输入ifconfig报错

报错 bash: ifconfig: command not found 原因 Debian 上默认不安装 ifconfig 软件包。这是因为 ifconfig 已被弃用&#xff0c;取而代之的是新的 ip 命令。该 ip 命令现在负责修改或显示路由、网络设备、接口和隧道 如果仍然想使用旧的 ifconfig 命令&#xff0c;则必须显式…

【NLP 27、文本分类任务 —— 传统机器学习算法】

不要抓着枯叶哭泣&#xff0c;你要等待初春的新芽 —— 25.1.23 一、文本分类任务 定义&#xff1a;预先设定好一个文本类别集合&#xff0c;对于一篇文本&#xff0c;预测其所属的类别 例如&#xff1a; 情感分析&#xff1a; 这家饭店太难吃了 —> 正类 …

Lumoz Chain正式上线:AI 时代的新算力破局者

新的叙事和技术突破永远是推动行业前行的核心动力。当下&#xff0c;AI Agent无疑是最炙手可热的赛道之一。 当加密世界将目光投向AI领域时&#xff0c;大多数项目仍停留在以AI为工具或应用场景的层面&#xff0c;试图通过集成AI模型或优化链上功能来吸引用户。然而&#xff0c…

Python - Python连接数据库

Python的标准数据库接口为&#xff1a;Python DB-API&#xff0c;Python DB-API为开发人员提供了数据库应用编程接口。 PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个实现库&#xff0c;Python2中则使用mysqldb。 PyMySQL 遵循 Python 数据库 API v2.0 规范&…

面试八股文--数据库基础知识总结(1)

1、数据库的定义 数据库&#xff08;DataBase&#xff0c;DB&#xff09;简单来说就是数据的集合数据库管理系统&#xff08;Database Management System&#xff0c;DBMS&#xff09;是一种操纵和管理数据库的大型软件&#xff0c;通常用于建立、使用和维护数据库。数据库系统…

关于在java项目部署过程MySQL拒绝连接的分析和解决方法

前言 在最近一次部署项目一次项目部署过程中&#xff0c;由于没有对MySQL数据库的部分权限和远程连接进行授权&#xff0c;导致了在执行项目功能API时&#xff0c;出现MySQL连接异常或MySQL拒绝连接的问题。 问题 以下是部分报错截图&#xff1a; 分析 根据日志提示&#xf…

PhotoLine绿色版 v25.00:全能型图像处理软件的深度解析

在图像处理领域,PhotoLine以其强大的功能和紧凑的体积,赢得了国内外众多用户的喜爱。本文将为大家全面解析PhotoLine绿色版 v25.00的各项功能,帮助大家更好地了解这款全能型的图像处理软件。 一、迷你体积,强大功能 PhotoLine被誉为迷你版的Photoshop,其体积虽小,但功能却…

002 Java操作kafka客户端

Java操作kafka客户端 文章目录 Java操作kafka客户端3.Java操作kafka客户端1.引入依赖2. Kafka服务配置3、生产者&#xff08;Producer&#xff09;实现1. 基础配置与发送消息2. 关键配置说明 4.消费者&#xff08;Consumer&#xff09;实现1. 基础配置与消费消息2. 关键配置说明…

【SRC实战】信息泄露导致越权会员功能

01 — 漏洞证明 1、VIP功能 2、SVIP功能 3、点击任意用户发起私聊&#xff0c;发现userId纯数字可遍历 4、返回包泄露身高范围height&#xff0c;星座constellation&#xff0c;属相zodiac&#xff0c;恋爱目标purpose&#xff0c;教育程度degree&#xff0c;成功越权VIP功能 …

游戏引擎学习第125天

仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾并为今天的内容做准备。 昨天&#xff0c;当我们离开时&#xff0c;工作队列已经完成了基本的功能。这个队列虽然简单&#xff0c;但它能够执行任务&#xff0c;并且我们已经为各种操作编写了测试。字符串也能够正常推送到队…

《OpenCV》——光流估计

什么是光流估计&#xff1f; 光流估计的前提&#xff1f; 基本假设 亮度恒定假设&#xff1a;目标像素点的亮度在相邻帧之间保持不变。这是光流计算的基础假设&#xff0c;基于此可以建立数学方程来求解光流。时间连续或运动平滑假设&#xff1a;相邻帧之间的时间间隔足够小&a…

信息系统的安全防护

文章目录 引言**1. 物理安全****2. 网络安全****3. 数据安全****4. 身份认证与访问控制****5. 应用安全****6. 日志与监控****7. 人员与管理制度****8. 其他安全措施****9. 安全防护框架**引言 从技术、管理和人员三个方面综合考虑,构建多层次、多维度的安全防护体系。 信息…

如何防止 Instagram 账号被盗用:安全设置与注意事项

如何防止 Instagram 账号被盗用&#xff1a;安全设置与注意事项 在这个数字化时代&#xff0c;社交媒体平台如 Instagram 已成为我们日常生活的一部分。然而&#xff0c;随着网络犯罪的增加&#xff0c;保护我们的在线账户安全变得尤为重要。以下是一些关键的安全设置和注意事…

Redis|复制 REPLICA

文章目录 是什么能干嘛怎么玩案例演示复制原理和工作流程复制的缺点 是什么 官网地址&#xff1a;https://redis.io/docs/management/replication/Redis 复制机制用于将数据从一个主节点&#xff08;Master&#xff09;复制到一个或多个从节点&#xff08;Slave&#xff09;&a…

树莓集团南京产业园再布局:深入剖析背后逻辑

在产业园区蓬勃发展的当下&#xff0c;树莓集团在南京的产业园再布局行动备受瞩目。这一举措并非偶然&#xff0c;其背后蕴含着深刻且多元的战略逻辑。 一、顺应区域产业发展趋势 南京作为长三角地区的重要城市&#xff0c;产业基础雄厚且多元。近年来&#xff0c;南京大力推动…

Spring源码分析の循环依赖

文章目录 前言一、循环依赖问题二、循环依赖的解决三、整体流程分析 前言 常见的可能存在循环依赖的情况如下&#xff1a; 两个bean中互相持有对方作为自己的属性。   类似于&#xff1a; 两个bean中互相持有对方作为自己的属性&#xff0c;且在构造时就需要传入&#xff1a…

Docker 部署 Jenkins持续集成(CI)工具

[TOC](Docker 部署 Jenkins持续集成(CI)工具) 前言 Jenkins 是一个流行的开源自动化工具&#xff0c;广泛应用于持续集成&#xff08;CI&#xff09;和持续交付&#xff08;CD&#xff09;的环境中。通过 Docker 部署 Jenkins&#xff0c;可以简化安装和配置过程&#xff0c;并…

《Effective Objective-C》阅读笔记(中)

目录 接口与API设计 用前缀避免命名空间冲突 提供“全能初始化方法” 实现description方法 尽量使用不可变对象 使用清晰而协调的命名方式 方法命名 ​编辑类与协议命名 为私有方法名加前缀 理解OC错误模型 理解NSCopying协议 协议与分类 通过委托与数据源协议进行…