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

Java求职招聘网站开发实践

一、项目介绍

本文将介绍如何使用Java技术栈开发一个求职招聘网站。该网站主要实现求职者和招聘方的双向选择功能,包含用户管理、职位发布、简历投递等核心功能。

二、技术选型

  • 后端框架:Spring Boot 2.7.0
  • 数据库:MySQL 8.0
  • 前端框架:Vue.js 3
  • 权限管理:Spring Security
  • ORM框架:MyBatis-Plus
  • 缓存:Redis
  • 搜索引擎:Elasticsearch

三、核心功能模块

1. 用户管理模块

@Entity
@Table(name = "user")
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String username;private String password;private Integer userType; // 0-求职者,1-招聘方private Date createTime;// getter和setter方法
}

2. 职位管理模块

@RestController
@RequestMapping("/api/job")
public class JobController {@Autowiredprivate JobService jobService;@PostMapping("/publish")public Result publishJob(@RequestBody JobDTO jobDTO) {return jobService.publishJob(jobDTO);}@GetMapping("/list")public PageResult<JobVO> listJobs(JobQueryParam param) {return jobService.listJobs(param);}
}

3. 简历投递模块

@Service
public class ResumeServiceImpl implements ResumeService {@Autowiredprivate ResumeMapper resumeMapper;@Overridepublic Result submitResume(ResumeDTO resumeDTO) {// 校验简历信息validateResume(resumeDTO);// 保存简历Resume resume = convertToEntity(resumeDTO);resumeMapper.insert(resume);// 发送简历投递通知sendNotification(resume);return Result.success();}
}

四、数据库设计

主要数据表

  1. 用户表(user)
  2. 职位表(job)
  3. 简历表(resume)
  4. 投递记录表(delivery_record)
CREATE TABLE `job` (`id` bigint NOT NULL AUTO_INCREMENT,`title` varchar(100) NOT NULL COMMENT '职位标题',`company_id` bigint NOT NULL COMMENT '公司ID',`salary_range` varchar(50) COMMENT '薪资范围',`description` text COMMENT '职位描述',`requirements` text COMMENT '任职要求',`status` tinyint DEFAULT 1 COMMENT '状态:0-关闭 1-开启',`create_time` datetime DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

五、关键技术实现

1. 职位搜索功能

@Service
public class JobSearchService {@Autowiredprivate ElasticsearchClient esClient;public List<JobVO> searchJobs(String keyword) {SearchRequest request = new SearchRequest.Builder().index("jobs").query(q -> q.multiMatch(m -> m.fields("title", "description", "requirements").query(keyword))).build();return parseSearchResult(esClient.search(request));}
}

2. 简历投递流程

@Service
public class DeliveryService {@Transactionalpublic Result deliverResume(DeliveryDTO dto) {// 检查是否重复投递if(checkDuplicate(dto)) {return Result.fail("请勿重复投递");}// 保存投递记录DeliveryRecord record = new DeliveryRecord();record.setJobId(dto.getJobId());record.setResumeId(dto.getResumeId());record.setStatus(DeliveryStatus.PENDING.getCode());deliveryMapper.insert(record);// 异步发送通知notificationService.sendDeliveryNotification(record);return Result.success();}
}

六、性能优化

  1. 使用Redis缓存热门职位信息
  2. 使用Elasticsearch优化职位搜索
  3. 实现分布式Session管理
  4. 引入消息队列处理异步任务

七、安全性考虑

  1. 实现基于JWT的身份认证
  2. 防止SQL注入攻击
  3. XSS防护
  4. 敏感数据加密

八、部署方案

  1. 使用Docker容器化部署
  2. Nginx反向代理
  3. 实现服务器集群
  4. 配置CDN加速

总结

本文介绍了一个求职招聘网站的主要开发内容,包括技术选型、核心功能实现、数据库设计等方面。在实际开发中,还需要考虑更多的细节问题,如并发处理、数据安全、用户体验等。希望本文能为想要开发类似系统的开发者提供参考。

附:简历管理功能详细设计

一、简历数据模型设计

1. 简历基本信息表

CREATE TABLE `resume` (`id` bigint NOT NULL AUTO_INCREMENT,`user_id` bigint NOT NULL COMMENT '用户ID',`name` varchar(50) NOT NULL COMMENT '姓名',`gender` tinyint COMMENT '性别:0-女 1-男',`birth_date` date COMMENT '出生日期',`phone` varchar(20) NOT NULL COMMENT '手机号',`email` varchar(100) COMMENT '邮箱',`highest_education` varchar(20) COMMENT '最高学历',`work_years` int COMMENT '工作年限',`current_status` tinyint COMMENT '当前状态:0-在职 1-离职 2-应届生',`job_intention` varchar(100) COMMENT '求职意向',`expected_salary` varchar(50) COMMENT '期望薪资',`self_evaluation` text COMMENT '自我评价',`status` tinyint DEFAULT 1 COMMENT '状态:0-隐藏 1-公开',`create_time` datetime DEFAULT CURRENT_TIMESTAMP,`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (`id`),KEY `idx_user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2. 教育经历表

CREATE TABLE `resume_education` (`id` bigint NOT NULL AUTO_INCREMENT,`resume_id` bigint NOT NULL COMMENT '简历ID',`school_name` varchar(100) NOT NULL COMMENT '学校名称',`major` varchar(100) COMMENT '专业',`degree` varchar(50) COMMENT '学位',`start_date` date COMMENT '开始时间',`end_date` date COMMENT '结束时间',`description` text COMMENT '在校经历',PRIMARY KEY (`id`),KEY `idx_resume_id` (`resume_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

3. 工作经历表

CREATE TABLE `resume_work_exp` (`id` bigint NOT NULL AUTO_INCREMENT,`resume_id` bigint NOT NULL COMMENT '简历ID',`company_name` varchar(100) NOT NULL COMMENT '公司名称',`position` varchar(100) COMMENT '职位',`start_date` date COMMENT '开始时间',`end_date` date COMMENT '结束时间',`work_description` text COMMENT '工作描述',PRIMARY KEY (`id`),KEY `idx_resume_id` (`resume_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

二、核心功能实现

1. 简历实体类

@Data
@Entity
@Table(name = "resume")
public class Resume {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private Long userId;private String name;private Integer gender;private LocalDate birthDate;private String phone;private String email;private String highestEducation;private Integer workYears;private Integer currentStatus;private String jobIntention;private String expectedSalary;private String selfEvaluation;private Integer status;@OneToMany(mappedBy = "resume", cascade = CascadeType.ALL)private List<ResumeEducation> educationList;@OneToMany(mappedBy = "resume", cascade = CascadeType.ALL)private List<ResumeWorkExp> workExpList;
}

2. 简历服务接口

public interface ResumeService {// 创建/更新简历Result<Long> saveResume(ResumeDTO resumeDTO);// 获取简历详情ResumeVO getResumeDetail(Long resumeId);// 删除简历Result deleteResume(Long resumeId);// 更新简历状态Result updateResumeStatus(Long resumeId, Integer status);// 获取用户的简历列表List<ResumeVO> getUserResumes(Long userId);// 导出简历PDFbyte[] exportResumePDF(Long resumeId);
}

3. 简历服务实现

@Service
@Slf4j
public class ResumeServiceImpl implements ResumeService {@Autowiredprivate ResumeMapper resumeMapper;@Autowiredprivate ResumeEducationMapper educationMapper;@Autowiredprivate ResumeWorkExpMapper workExpMapper;@Override@Transactionalpublic Result<Long> saveResume(ResumeDTO resumeDTO) {try {// 保存基本信息Resume resume = convertToEntity(resumeDTO);if (resume.getId() == null) {resumeMapper.insert(resume);} else {resumeMapper.updateById(resume);// 删除旧的教育和工作经历educationMapper.deleteByResumeId(resume.getId());workExpMapper.deleteByResumeId(resume.getId());}// 保存教育经历saveEducationList(resumeDTO.getEducationList(), resume.getId());// 保存工作经历saveWorkExpList(resumeDTO.getWorkExpList(), resume.getId());return Result.success(resume.getId());} catch (Exception e) {log.error("保存简历失败", e);throw new BusinessException("保存简历失败");}}@Overridepublic ResumeVO getResumeDetail(Long resumeId) {Resume resume = resumeMapper.selectById(resumeId);if (resume == null) {throw new BusinessException("简历不存在");}// 查询教育经历List<ResumeEducation> educationList = educationMapper.selectByResumeId(resumeId);// 查询工作经历List<ResumeWorkExp> workExpList = workExpMapper.selectByResumeId(resumeId);return buildResumeVO(resume, educationList, workExpList);}
}

4. 简历导出功能

@Service
public class ResumeExportService {@Autowiredprivate ResumeService resumeService;public byte[] exportPDF(Long resumeId) {// 获取简历数据ResumeVO resume = resumeService.getResumeDetail(resumeId);// 使用iText或其他PDF库生成PDFDocument document = new Document();ByteArrayOutputStream baos = new ByteArrayOutputStream();PdfWriter.getInstance(document, baos);document.open();// 添加简历内容addBasicInfo(document, resume);addEducation(document, resume.getEducationList());addWorkExp(document, resume.getWorkExpList());document.close();return baos.toByteArray();}private void addBasicInfo(Document document, ResumeVO resume) {// 添加基本信息到PDF}
}

三、简历附件功能

1. 附件表设计

CREATE TABLE `resume_attachment` (`id` bigint NOT NULL AUTO_INCREMENT,`resume_id` bigint NOT NULL COMMENT '简历ID',`file_name` varchar(200) NOT NULL COMMENT '文件名',`file_path` varchar(500) NOT NULL COMMENT '文件路径',`file_size` bigint COMMENT '文件大小(字节)',`file_type` varchar(50) COMMENT '文件类型',`upload_time` datetime DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY (`id`),KEY `idx_resume_id` (`resume_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2. 附件上传服务

@Service
public class ResumeAttachmentService {@Value("${resume.attachment.path}")private String attachmentPath;@Autowiredprivate ResumeAttachmentMapper attachmentMapper;public Result uploadAttachment(MultipartFile file, Long resumeId) {// 校验文件大小和类型validateFile(file);// 生成文件存储路径String fileName = generateFileName(file);String filePath = attachmentPath + "/" + fileName;// 保存文件try {file.transferTo(new File(filePath));// 保存附件记录ResumeAttachment attachment = new ResumeAttachment();attachment.setResumeId(resumeId);attachment.setFileName(file.getOriginalFilename());attachment.setFilePath(filePath);attachment.setFileSize(file.getSize());attachment.setFileType(file.getContentType());attachmentMapper.insert(attachment);return Result.success();} catch (IOException e) {log.error("上传附件失败", e);throw new BusinessException("上传附件失败");}}
}

四、简历模板功能

1. 模板表设计

CREATE TABLE `resume_template` (`id` bigint NOT NULL AUTO_INCREMENT,`template_name` varchar(100) NOT NULL COMMENT '模板名称',`template_type` tinyint COMMENT '模板类型:0-系统模板 1-用户模板',`template_content` text COMMENT '模板内容(JSON格式)',`preview_image` varchar(500) COMMENT '预览图',`status` tinyint DEFAULT 1 COMMENT '状态:0-禁用 1-启用',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2. 模板应用服务

@Service
public class ResumeTemplateService {@Autowiredprivate ResumeTemplateMapper templateMapper;@Autowiredprivate ResumeService resumeService;public Result applyTemplate(Long resumeId, Long templateId) {// 获取模板ResumeTemplate template = templateMapper.selectById(templateId);if (template == null || template.getStatus() != 1) {throw new BusinessException("模板不存在或已禁用");}// 获取当前简历ResumeVO currentResume = resumeService.getResumeDetail(resumeId);// 应用模板样式ResumeDTO updatedResume = applyTemplateStyle(currentResume, template);// 保存更新后的简历return resumeService.saveResume(updatedResume);}
}

五、简历隐私设置

1. 隐私配置表

CREATE TABLE `resume_privacy` (`resume_id` bigint NOT NULL COMMENT '简历ID',`phone_visible` tinyint DEFAULT 1 COMMENT '手机号可见:0-否 1-是',`email_visible` tinyint DEFAULT 1 COMMENT '邮箱可见:0-否 1-是',`birth_date_visible` tinyint DEFAULT 1 COMMENT '生日可见:0-否 1-是',`current_salary_visible` tinyint DEFAULT 0 COMMENT '当前薪资可见:0-否 1-是',PRIMARY KEY (`resume_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2. 隐私控制服务

@Service
public class ResumePrivacyService {@Autowiredprivate ResumePrivacyMapper privacyMapper;public ResumeVO applyPrivacyControl(ResumeVO resume, Long viewerId) {// 获取隐私设置ResumePrivacy privacy = privacyMapper.selectByResumeId(resume.getId());// 如果是简历所有者,显示完整信息if (resume.getUserId().equals(viewerId)) {return resume;}// 根据隐私设置处理敏感信息if (privacy != null) {if (!privacy.getPhoneVisible()) {resume.setPhone(maskPhoneNumber(resume.getPhone()));}if (!privacy.getEmailVisible()) {resume.setEmail(maskEmail(resume.getEmail()));}// ... 处理其他隐私字段}return resume;}private String maskPhoneNumber(String phone) {if (StringUtils.isEmpty(phone)) return phone;return phone.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");}
}

六、简历推荐功能

@Service
public class ResumeRecommendService {@Autowiredprivate ElasticsearchClient esClient;public List<JobVO> recommendJobs(Long resumeId) {// 获取简历关键信息ResumeVO resume = resumeService.getResumeDetail(resumeId);// 构建搜索条件SearchRequest request = new SearchRequest.Builder().index("jobs").query(q -> q.bool(b -> b.should(s -> s.match(m -> m.field("job_requirements").query(resume.getJobIntention()))).should(s -> s.match(m -> m.field("required_education").query(resume.getHighestEducation()))).should(s -> s.range(r -> r.field("required_work_years").lte(resume.getWorkYears()))))).sort(s -> s.field(f -> f.field("_score").order(SortOrder.Desc))).size(10).build();return parseSearchResult(esClient.search(request));}
}

以上是简历管理功能的详细设计,包含了基本的CRUD操作、简历导出、附件管理、模板功能、隐私控制以及推荐功能等核心模块。在实际开发中,还需要注意:

  1. 数据验证和安全性控制
  2. 文件上传的安全处理
  3. 大文件处理优化
  4. 简历内容的版本控制
  5. 简历查看记录追踪
  6. 敏感信息加密存储
  7. 简历导出格式的多样化支持

相关文章:

Java求职招聘网站开发实践

一、项目介绍 本文将介绍如何使用Java技术栈开发一个求职招聘网站。该网站主要实现求职者和招聘方的双向选择功能&#xff0c;包含用户管理、职位发布、简历投递等核心功能。 二、技术选型 后端框架&#xff1a;Spring Boot 2.7.0数据库&#xff1a;MySQL 8.0前端框架&#…...

一文详细了解websocket应用以及连接断开的解决方案

文章目录 websocketvite 热启动探索websocket -心跳websocket 事件监听应用过程中问题总结 websocket Websocket简介 定义和工作原理 Websocket是一种在单个TCP连接上进行全双工通信的协议。与传统的HTTP请求 - 响应模式不同&#xff0c;它允许服务器主动向客户端推送数据。例…...

如何做含有identify抓信号的fpga版本(image或者Bit)

在数字的FPGA debug中除了ila就是identify了&#xff0c;identify是synopsys公司的RTL级的调试工具。要用起来idetify&#xff0c;第一步就是要做出含有identify的信号的FPGA版本&#xff0c;quartus的是image&#xff0c;Ximlinx的是Bit或者Bin文件。具体有以下几步&#xff1…...

AIGC实践-使用Amazon Bedrock的SDXL模型进行文生图

一、Bedrock 简介 Amazon Bedrock 是 Amazon Web Services (AWS) 提供的一种生成式 AI 服务。通过 Bedrock&#xff0c;用户可以方便地使用多种基础模型&#xff08;Foundation Models&#xff09;&#xff0c;包括 OpenAI 的 GPT、Anthropic 的 Claude 等。这些模型可以用于各…...

【源码】Sharding-JDBC源码分析之SQL中分片键路由ShardingSQLRouter的原理

Sharding-JDBC系列 1、Sharding-JDBC分库分表的基本使用 2、Sharding-JDBC分库分表之SpringBoot分片策略 3、Sharding-JDBC分库分表之SpringBoot主从配置 4、SpringBoot集成Sharding-JDBC-5.3.0分库分表 5、SpringBoot集成Sharding-JDBC-5.3.0实现按月动态建表分表 6、【…...

初学 flutter 环境变量配置

一、jdk&#xff08;jdk11&#xff09; 1&#xff09;配置环境变量 新增&#xff1a;JAVA_HOMEC:\Program Files\Java\jdk-11 //你的jdk目录 在path新增&#xff1a;%JAVA_HOME%\bin2&#xff09;验证是否配置成功&#xff08;cmd运行命令&#xff09; java java -version …...

蓝牙 AVRCP 协议详解

前言 随着无线音频设备的普及&#xff0c;蓝牙已经成为智能设备间通信的主流方式之一。除了传输音频流的 A2DP 协议外&#xff0c;AVRCP&#xff08;Audio/Video Remote Control Profile&#xff0c;音频/视频远程控制协议&#xff09;为用户提供了对蓝牙音频设备的控制能力&am…...

在 Ubuntu 18.04 上安装 MySQL 5.7和MySQL 8

1.Ubuntu安装MySQL 5.72.Ubuntu安装MySQL 8 在 Ubuntu 18.04 上安装 MySQL 5.7&#xff0c;可以按照以下步骤操作&#xff1a; 1. 更新系统包列表 运行以下命令以确保系统包列表是最新的&#xff1a; sudo apt update2. 检查默认 MySQL 版本 Ubuntu 18.04 默认提供 MySQL 5.…...

第4章 Spring Boot自动配置

自动配置概述 SpringBoot的两大核心 Spring Boot 框架的两大核心特性可以概括为“启动器”&#xff08;Starter&#xff09;和“自动配置”&#xff08;Auto-configuration&#xff09;。 启动器&#xff08;Starter&#xff09;&#xff1a; Spring Boot 提供了一系列的 Star…...

显存:存储,GPU:计算;Pipeline Parallelism(管道并行)

目录 显存:存储,GPU:计算 流水线切分策略:(数据并并,多头并行,单头MLP切片) 存储(显存)和计算(GPU)负载不均衡的问题 1,2,3,4,5指的计算任务(数据切分) 大方块代表GPU计算 黄色代表显存 解决办法:重计算和流水线切分策略 重计算策略: 流水线切分策略:…...

费曼路径积分简单示例

费曼路径积分简单示例 费曼路径积分是量子力学中的一种计算方法&#xff0c;它通过对所有可能路径的贡献进行积分&#xff0c;来计算粒子从一个点到另一个点的概率幅。与经典力学不同&#xff0c;经典力学中粒子沿着使作用量最小的路径运动&#xff0c;而在量子力学中&#xf…...

40分钟学 Go 语言高并发:【实战】并发安全的配置管理器(功能扩展)

【实战】并发安全的配置管理器&#xff08;功能扩展&#xff09; 一、扩展思考 分布式配置中心 实现配置的集中管理支持多节点配置同步实现配置的版本一致性 配置加密 敏感配置的加密存储配置的安全传输访问权限控制 配置格式支持 支持YAML、TOML等多种格式配置格式自动…...

麒麟安全增强-kysec

DAC: 自主访问控制是linux下默认的接入控制机制,通过对资源读、写、执行操作,保证系统安全 MAC:安全接入控制机制,由操作系统约束的访问控制,默认情况下,MAC不允许任何访问,用户可以自定义策略规则制定允许什么 ,从而避免很多攻击。 MAC强制访问控制常见的实现方式:…...

shell编程(8)

目录 一、until循环 示例 until 和 while 的区别 二、case语句 基本语法 示例 1. 简单的 case 语句 2. 使用通配符 3. 处理多个匹配 case 和 if 的比较 case 语句&#xff1a; if 语句&#xff1a; 三、基本函数 基本函数定义和调用 1. 定义一个简单的函数 2. …...

高级java每日一道面试题-2024年11月24日-JVM篇-说说对象分配规则?

如果有遗漏,评论区告诉我进行补充 面试官: 说说对象分配规则? 我回答: 在Java高级面试中&#xff0c;对象分配规则是一个核心考点&#xff0c;它涉及到JVM的内存管理、对象的创建和初始化等多个方面。以下是对Java对象分配规则的详细解释&#xff1a; 一、内存分配区域 J…...

进程间通信5:信号

引入 我们之前学习了信号量&#xff0c;信号量和信号可不是一个东西&#xff0c;不能混淆。 信号是什么以及一些基础概念 信号是一种让进程给其他进程发送异步消息的方式 信号是随时产生的&#xff0c;无法预测信号可以临时保存下来&#xff0c;之后再处理信号是异步发送的…...

性能测试及调优

一、性能测试介绍 1、什么叫做性能测试&#xff1f; &#xff08;1&#xff09;通过某些工具或手段来检测软件的某些指标是否达到了要求&#xff0c;这就是性能测试 &#xff08;2&#xff09;指通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指…...

实战基于LangChain和ChatGLM私有化部署聊天机器人

本文主要阐述了如何使用第二代6B模型进行对话训练&#xff0c;以及如何通过微调来提高大模型的性能。文中提到了在8501端口上启动第二代6B模型&#xff0c;并使用极简模板进行请求。与第一代模型相比&#xff0c;第二代6B模型具有更强的对话能力&#xff0c;并且可以通过微调来…...

利用adb工具安装卸载安卓平板(手机)软件

参考链接&#xff1a; 1、ADB 操作命令详解及用法大全 2、全面掌握Android调试工具箱&#xff1a;ADB与实用程序实战 平时使用小米手机没有感觉&#xff0c;miui系统做的确实好。最近买了个水货学习系统平板&#xff08;主要看重硬件配置&#xff0c;性价比很高&#xff0c;但…...

基于docker进行任意项目灵活发布

引言 不管是java还是python程序等&#xff0c;使用docker发布的优势有以下几点&#xff1a; 易于维护。直接docker命令进行管理&#xff0c;如docker stop、docker start等&#xff0c;快速方便无需各种进程查询关闭。环境隔离。项目代码任何依赖或设置都可以基本独立&#x…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的&#xff1a;a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...