Spring Boot昆虫标本管理系统实战:从数据库设计到毕业答辩全流程
简介这是一份面向高校毕业设计场景的Spring Boot昆虫标本管理系统完整项目资料。系统围绕昆虫标本汇总、标本分类、论坛管理、留言咨询及图片识别等功能模块展开采用Java语言与MySQL数据库以B/S结构实现管理员与用户双端操作可有效降低人工管理成本、提升标本信息学习效率。压缩包以ZIP格式打包整体约95.37MB核心内容涵盖项目源代码、SQL数据库文件、答辩PPT及毕业论文文档其中源码便于初学者梳理Spring Boot整合数据库的开发思路SQL文件可直接还原系统运行环境论文与PPT则为毕设撰写和答辩汇报提供现成参照。目前已有165人学习下载适合正在准备JavaWeb方向毕业设计、需要完整可运行项目作为模板或想快速理解昆虫标本信息化管理业务流程的读者。1. Spring Boot昆虫标本管理系统为什么这个毕业设计题目年年都有人做每年毕业季计算机专业的选题清单里总有几个“管理系统”常青树昆虫标本管理系统就是其中之一。它看起来冷门其实非常聪明昆虫标本有明确的分类学属性、采集信息、存放位置和图片档案天然能把一张主表拆出多张关联表把 Spring Boot MyBatis MySQL 这套主流技术栈全部串起来。对要做毕业设计的学生来说这个题目不挑学校、不挑导师方向业务逻辑清楚演示效果直观答辩时不用背一堆晦涩的概念也能把“做了什么”讲明白。对指导老师来说它又足够容纳权限、文件上传、分页检索这些常规“工作量点”。这篇笔记就按我实际带毕设时常用的落地路径从数据库设计讲到答辩前的验证把这条线完整走一遍。2. 从需求到表结构昆虫标本管理系统的数据库设计与SQL落地2.1 库表怎么拆标本主表、分类表与采集记录的边界做管理系统的第一步永远是画表不是写代码。昆虫标本管理的核心对象是“一件标本”围绕它要回答四个问题这是什么、从哪来、放哪了、谁在管。于是表就围绕这四个问题展开。最常见的拆法是五张表起步。sys_user 管登录和账号insect_category 管分类层级目、科、属insect_specimen 是标本主表specimen_image 单独放图片路径——我建议拆出来因为一件标本可能有多张图塞在主表里会让查询变笨至于采集地和存放位置用字符串字段就够了不要为了“规范”强行再建字典表。很多学生会把简单问题复杂化给“采集地”单独建一张省市区表结果答辩时被追问“为什么不用统一字典表”反而答不上来。主表的字段设计我一般这样定specimen_code 唯一编号学名、中文名、分类ID、采集人、采集日期、采集地、经纬度、存放位置、备注再加 create_time 和 deleted 两个通用字段。其中 deleted 用逻辑删除做毕业设计时不要物理删数据答辩时能演示“删除了还能在库里看到记录”这个细节比你说十句“我考虑了数据安全”都有说服力。2.2 SQL文件里开箱即用的建表语句与初始数据标题配套的 SQL 文件里通常应该包含建库脚本、建表脚本、初始用户和测试数据。拿到手以后别急着直接跑先看一段典型的建表语句确认它用的字符集和存储引擎。CREATE DATABASE IF NOT EXISTS insect_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE insect_db; DROP TABLE IF EXISTS insect_specimen; CREATE TABLE insect_specimen ( id BIGINT AUTO_INCREMENT PRIMARY KEY, specimen_code VARCHAR(32) NOT NULL COMMENT 标本编号, chinese_name VARCHAR(64) NOT NULL COMMENT 中文名, scientific_name VARCHAR(128) COMMENT 学名, category_id BIGINT NOT NULL COMMENT 分类ID关联insect_category, collector VARCHAR(32) COMMENT 采集人, collect_date DATE COMMENT 采集日期, collect_location VARCHAR(128) COMMENT 采集地, longitude DECIMAL(10,6) COMMENT 经度, latitude DECIMAL(10,6) COMMENT 纬度, store_position VARCHAR(128) COMMENT 存放位置, remark VARCHAR(255) COMMENT 备注, deleted TINYINT DEFAULT 0 COMMENT 逻辑删除0正常 1已删除, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, UNIQUE KEY uk_specimen_code (specimen_code), KEY idx_category (category_id), KEY idx_collect_location (collect_location) ) ENGINEInnoDB COMMENT昆虫标本主表;这里三个点必须跟评委解释清楚。第一是 utf8mb4 字符集它能存生僻学名里的特殊符号用 utf8 在某些 MySQL 版本下会报“Incorrect string value”这是标本类系统最容易踩的坑。第二是 specimen_code 的唯一索引标本编号就是现实中的实物扫码编号必须唯一这是阻断重复录入的最便宜的手段。第三是 InnoDB 引擎支持事务和外键语义毕业设计别用 MyISAM虽然它快一点点但答辩时被问“为什么不用 InnoDB”你会很被动。category_id关联的分类表也很重要它决定了你能不能做“按目、按科、按属逐级筛选”的演示功能。如果只有一层分类你这套系统就和普通图书管理系统没区别了答辩亮点直接减半。我一般要求分类表至少有三层字段设计具体做法在下一节展开。2.3 为什么字段类型和索引要这样设给答辩埋好伏笔字段类型的设计不是随手的。标本编号用 VARCHAR(32) 是因为很多校园标本编号是“年份流水号采集地缩写”的复合格式纯数字用 BIGINT 反而不好存经纬度用 DECIMAL(10,6)精度到约 0.1 米足够支撑“按采集地附近范围查询”这种演示扩展日期用 DATE 而不是 DATETIME因为采集日期本身就是“某一天”存时分秒没有意义还能少占存储。分类表的设计我单独说这是“有设计感”的地方CREATE TABLE insect_category ( id BIGINT AUTO_INCREMENT PRIMARY KEY, parent_id BIGINT DEFAULT 0 COMMENT 父分类ID0表示顶级, category_name VARCHAR(64) NOT NULL, category_level TINYINT NOT NULL COMMENT 层级1目 2科 3属, sort_order INT DEFAULT 0, UNIQUE KEY uk_name_level (category_name, category_level) ) ENGINEInnoDB COMMENT昆虫分类表;这张表用 parent_id 做成邻接表模型做三级分类完全够用。答辩时被问“为什么不用左右值模型”你可以答标本分类变更频率低、层级固定三层邻接表查询简单而且 SQL 文件里直接就能看到父子关系维护成本远低于左右值需要重算所有节点编号的做法。这种“有取舍”的回答比背教材定义要加分得多。至于索引主表里我建了三个唯一索引管标本编号普通索引管 category_id 和 collect_location。不要给每个字段都加索引——某些学生为了显得专业把所有字段都加了一遍 KEY结果插入数据时索引维护开销巨大演示时删一条记录肉眼可见地卡顿这就是典型的“过度优化反被优化”。3. 用Spring Boot把标本身份、分类、库存串起来核心模块的代码实现3.1 实体类与MyBatis-Plus用最少的代码把CRUD写稳数据库表建好后进入代码层。这套系统的技术栈推荐 Spring Boot MyBatis-Plus 的组合理由很简单MyBatis-Plus 的 BaseMapper 把单表 CRUD 全部内置了你只需要写业务上真正需要定制的方法毕业设计的“工作量”体现在表设计、关联查询和业务逻辑上而不是重复的 insert 语句。实体类直接对应 insect_specimen 表用 Lombok 注解消除样板代码Data TableName(insect_specimen) public class InsectSpecimen { TableId(type IdType.AUTO) private Long id; private String specimenCode; private String chineseName; private String scientificName; private Long categoryId; private String collector; private LocalDate collectDate; private String collectLocation; private BigDecimal longitude; private BigDecimal latitude; private String storePosition; private String remark; TableLogic private Integer deleted; TableField(fill FieldFill.INSERT) private LocalDateTime createTime; }TableLogic这个注解是逻辑删除的关键加了它之后MyBatis-Plus 生成的 deleteById 会自动转成 UPDATE deleted1而不是物理 DELETE。这是毕业设计系统里成本最低、答辩效果最好的“安全设计”。TableField(fill FieldFill.INSERT)配合 MetaObjectHandler 可以做创建时间自动填充少写很多重复代码。这里的命名规则要注意数据库字段用下划线specimen_code实体类用驼峰specimenCodeMyBatis-Plus 默认开启了下划线转驼峰所以不需要写一堆 TableField 映射。如果哪一天查询结果全是 null第一个怀疑对象就是 map-underscore-to-camel-case 被关掉了。3.2 标本查询与筛选按分类、采集地、关键词检索的Service写法主表的增删改查都用 BaseMapper 自带方法就够了真正的业务逻辑在“组合条件查询”。比如标本列表页通常有四个筛选项中文名关键词、分类层级、采集地、采集时间范围。用 MyBatis-Plus 的 LambdaQueryWrapper 写比写拼接 XML 要清爽得多也不容易漏条件。public PageInsectSpecimen pageSpecimens(int page, int size, String keyword, Long categoryId, String location) { LambdaQueryWrapperInsectSpecimen wrapper new LambdaQueryWrapper(); wrapper.eq(InsectSpecimen::getDeleted, 0) .like(StringUtils.hasText(keyword), InsectSpecimen::getChineseName, keyword) .eq(categoryId ! null, InsectSpecimen::getCategoryId, categoryId) .like(StringUtils.hasText(location), InsectSpecimen::getCollectLocation, location) .orderByDesc(InsectSpecimen::getCreateTime); return insectSpecimenMapper.selectPage(new Page(page, size), wrapper); }这段代码里最值得跟答辩评委讲的是like方法第一个参数。StringUtils.hasText(keyword)为 true 时才拼接这个条件false 时这条语句会被直接跳过。这意味着前端传空字符串时不会生成LIKE %%这种全表扫描的查询也不会因为 categoryId 为 null 而eq出一个恒假条件。很多学生写条件查询喜欢用 if 判断一个个拼字符串 SQL不仅代码长还容易在拼接时漏空格。用 LambdaQueryWrapper 配合“条件前置”写法代码行数少一半逻辑还清晰。但 LambdaQueryWrapper 有一个边界要记住它解决的是单表复杂查询。如果要做“标本关联分类名称”的列表展示——列表页往往要显示“中文名 所属科 所属属”而不是一个 categoryId——就不要在 Wrapper 里硬 join。常见做法是查询出分页数据后用一次selectBatchIds把所有涉及的分类取出来在内存里组装成 MapLong, Category再填充到返回的 VO 里。批量查询代替循环单查这是能肉眼看出性能差别的优化。3.3 上传标本图片与文件存储的落地细节图片上传是这套系统“看起来完整”的胜负手。标本管理系统没有照片功能再全也显得单薄。上传方案我这里只推荐本地磁盘存储 静态资源映射不推荐把图片二进制塞进 MySQL 的 BLOB 字段——那会让数据库文件膨胀得很厉害备份 SQL 文件时动不动几百 MB。PostMapping(/upload) public ResultString upload(RequestParam(file) MultipartFile file) { if (file.isEmpty()) { return Result.error(请选择文件); } String originalFilename file.getOriginalFilename(); String suffix originalFilename.substring(originalFilename.lastIndexOf(.)); String fileName UUID.randomUUID().toString().replace(-, ) suffix; File dir new File(uploadPath); if (!dir.exists()) { dir.mkdirs(); } file.transferTo(new File(uploadPath fileName)); return Result.success(/upload/ fileName); }文件名的处理是这里最容易翻车的地方。直接用原始文件名保存会撞上两个真实问题一是中文名文件在不同操作系统下编码不一致二是同名文件互相覆盖。用 UUID 重命名就同时解决了这两件事而原始文件的展示名可以放进标本主表的 remark 字段或者单独一个文件名字段里。另外要强调路径安全。uploadPath必须从配置文件读取不能写死在代码里。常见做法是配成绝对路径加前缀保证系统重启后还能访问。配合 Spring Boot 的静态资源映射把 /upload/** 映射到本地目录spring: servlet: multipart: max-file-size: 10MB max-request-size: 20MB web: resources: static-locations: classpath:/static/,file:${upload.path}file:${upload.path}前缀是这个配置里最容易被忽略的如果只写${upload.path}Spring 会把它当成 classpath 下的路径处理永远找不到磁盘文件。这个坑陪我走了很久后来每套项目我都会在启动日志里打印一行“Upload dir: xxx”确认映射生效。4. 拿源代码跑通本地环境项目导入、配置修改与启动排错4.1 拿到源代码后先改这三处配置数据源、端口与日志从资源包解压下来的文件夹一般长这样一个后端工程目录、一个 SQL 文件夹、一份论文和答辩 PPT。第一件事不是看代码而是改配置、建库、导数据、启动。顺序错了会浪费大量时间在“代码本身没报错但环境跑不起来”的排查上。用 IDEA 打开后端工程后等 Maven 依赖下载完这一步经常要十几分钟如果网络不好会很久耐心等然后打开 src/main/resources/application.yml。需要改的核心配置就三处数据源连接信息、端口号、文件上传路径。server: port: 8088 spring: datasource: url: jdbc:mysql://localhost:3306/insect_db?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl mapper-locations: classpath*:mapper/**/*.xml upload: path: D:/insect_upload/端口我建议改成 8088 而不是默认的 8080原因很现实8080 太常用你的电脑上随便一个服务就可能占着它。改成不常用的端口答辩现场启动时少一次报错。数据源的 url 里serverTimezoneAsia/Shanghai必须写MySQL 8.x 驱动不指定时区会直接报错这是一个纯环境问题和你的代码好坏无关。log-impl这行配置是调试期的好帮手。它会把每一条执行的 SQL 打印到控制台包括参数值。答辩前建议关掉不然控制台刷屏影响演示开发阶段开着能直接看到你的 like 查询拼出来的完整 SQL 长什么样。4.2 初始化数据库SQL文件的导入顺序与常见报错建好库表的前提是执行 SQL 文件。常见做法是直接用 Navicat 或 MySQL Workbench 打开 .sql 文件整体运行。但这里有一个顺序问题如果 SQL 文件里有DROP TABLE IF EXISTS和CREATE DATABASE你要注意当前连接的用户有没有 DROP 权限。很多校园机房给的 MySQL 账号权限不全导入失败时先看是不是权限问题而不是怀疑 SQL 写错。导入成功后随便查一条数据确认字符集SELECT id, chinese_name FROM insect_specimen LIMIT 5;如果中文显示正常说明 utf8mb4 配置生效如果显示乱码先查表字符集SHOW TABLE STATUS LIKE insect_specimen再看看连接工具的编码设置。不是在 SQL 文件里改个CHARSETutf8就算完同一套数据要保证“库、表、连接”三层字符集一致这是标本中文名不乱码的前提。初始数据这块我建议除了管理员账号admin/admin123 之类的默认账号至少要往标本表里插十几条数据。数据要有层次不同目、不同采集地、不同采集日期。为什么要这么做后面答辩章节会说这里先记住空表演示是答辩翻车重灾区评委一看到空列表就开始问“你测试过吗”。4.3 端口冲突与数据库连接失败的排查顺序启动 Spring Boot 项目最常见的报错有两类。第一类是端口被占用启动日志里会出现Port already in use、BindException等字样。解决办法是换端口或者找到占用进程。# 查看端口占用情况 netstat -ano | findstr 8088 # 找到对应PID后在任务管理器里确认进程再结束这里必须强调一句不要一看到 PID 就 taskkill先确认是不是你自己的另一个 IDEA 实例在跑。很多学生一台电脑开两个项目后启动的报端口占用把前一个项目关了就好。真需要强制结束进程时用taskkill /F /PID 进程号但要知道这是有风险的——如果占用端口的刚好是某个系统服务呢所以先看进程名再动手。第二类报错是数据库连不上典型报错是Access denied for user或Communications link failure。排查顺序固定三步先看 MySQL 服务有没有启动再看用户名密码对不对最后看 url 里的库名是不是建好的那个。不要一上来就怀疑代码写错了——这套系统本身就是个普通的 Spring Boot 工程环境不通时九成是配置问题不是业务代码问题。把这三步走完再去看异常栈排查效率会高很多。4.4 用Postman验证核心接口标本新增与分页列表后端启动成功后别急着去点前端页面先用 Postman 把两个核心接口打一遍确认后端接口本身是通的。这一步既是在验证代码也是为答辩时的“我先讲接口再演示界面”做准备。以新增标本为例这个接口一般长这样设计POST /api/specimen Content-Type: application/json { specimenCode: IN2025001, chineseName: 中华蜜蜂, scientificName: Apis cerana, categoryId: 1, collector: 张三, collectDate: 2025-03-12, collectLocation: 湖南长沙岳麓山, storePosition: A区-03-07 }Controller 层接收参数后要做两件看起来不起眼但很重要的事第一是检查specimenCode是否已存在存在就返回友好提示而不是让数据库抛唯一约束异常给前端第二是设置默认值比如备注没传就设为“无”创建时间由填充器生成。PostMapping(/add) public ResultString add(RequestBody InsectSpecimen specimen) { LambdaQueryWrapperInsectSpecimen wrapper new LambdaQueryWrapper(); wrapper.eq(InsectSpecimen::getSpecimenCode, specimen.getSpecimenCode()); if (insectSpecimenMapper.selectCount(wrapper) 0) { return Result.error(标本编号已存在请检查输入); } insectSpecimenMapper.insert(specimen); return Result.success(新增成功); }这段代码体现了“防御式编程”的思路数据库唯一索引是最后一道防线但用户不该直接看到 MySQL 的异常堆栈。提前用 selectCount 判断一次返回的是业务人员能看懂的中文提示。答辩评委问“为什么先查再插不做成异常捕获”你就可以答常规业务场景下并发量很低先查再插足够保证数据准确性且用户体验更好。这是一个有取舍的回答比“老师让我这么写的”强很多。分页列表接口验证也简单GET /api/specimen/page?page1size10keyword蜜蜂location长沙返回的应该是带 total 记录数的分页结构。这一步确认后再打开前端页面去联调问题定位范围一下子缩小了一半。5. 避坑指南毕业设计阶段最常翻车的7个操作点每条都是真实经历这套系统整体不难但“不难”不等于“不会出问题”。按我见过和犯过的错挑几条典型写在这里。每一条都是“现象 → 原因 → 解决”你可以直接对照排查。字符合集与乱码问题现象标本中文名插入数据库后显示“”或乱码页面展示也是问号。 原因建库时没指定字符集用了 MySQL 默认的 latin1或者连接 url 里没带 characterEncoding 参数。 解决重建数据库指定 utf8mb4连接串里补上characterEncodingutf8检查表和字段的字符集。三步都做齐才会真正稳定。注意乱码一旦写入改字符集不会修复已存在的数据只能清表重导。SQL 文件里初始数据如果是乱码导入后也要重新处理。Lombok 与 JDK 版本冲突现象项目一启动就报java.lang.NoSuchMethodError: lombok...或者编译期注解不生效实体类没有 getter/setter代码里所有调用点都标红。 原因开发机装了较新的 JDK 版本比如 JDK 21而项目里引用的 Lombok 版本太老两者不兼容。 解决去 pom.xml 把 Lombok 版本升到与 JDK 匹配的版本。排查时先看java -version和 pom 里 lombok 版本再用排除法新开一个最简单的实体类测试 Lombok 是否生效。这个坑看起来是环境问题实则是依赖版本管理问题答辩前一定确认项目在演示机器上能重新编译通过而不是只在你自己电脑上能跑。分页查询失效返回所有数据而非当前页现象调用分页接口传入 page1size10结果返回了全部数据total 值也不对。 原因MyBatis-Plus 的 selectPage 需要配置分页插件没有配置 PaginationInnerInterceptor 时分页方法会被当作普通查询执行物理分页不会生效。 解决在配置类里加一个 MybatisPlusInterceptor Bean。这是“功能代码对了但配置缺了”的典型场景代码层面看不出问题实际运行时行为完全不对。文件上传失败提示文件大小超限现象上传标本照片时点击提交后报MaxUploadSizeExceededException大一点的照片比如手机随手拍的 3~5MB必然失败。 原因Spring Boot 默认的单个文件上传上限是 1MB请求体上限 10MB。没改配置的自然就踩上了。 解决在 application.yml 里把 max-file-size 调到 10MB 或更大。更好一点的方案是前端上传前先用 canvas 压缩图片再传这个写进论文里也算一个“用户体验优化点”。注意改完配置必须重启项目生效不用怀疑“为什么改了半天没用”。页面404前端访问不到后端接口现象前端项目单独跑在 5173 或 8080 端口请求后端接口全部 404 或 CORS 报错。 原因前后端分离架构下前端发请求的地址不对或者后端没开跨域配置。 解决优先用相对路径配合后端统一前缀或者在开发环境配置代理。这属于工程化问题很多学生把前端打包后放进后端 static 目录来避免跨域也是一种省事方案答辩时被问“为什么这么做”也能说得清。答辩现场接口突然变慢或数据库连不上现象昨天在自己电脑上跑得好好的今天到答辩教室启动列表加载要等 10 秒甚至直接报数据库连接失败。 原因拿教室的 Wi-Fi 连接了本机 MySQL网络抖动导致连接超时更常见的是教室电脑没装 MySQL 服务或服务没启动。 解决自带一台已配置好的笔记本更稳的做法是把数据库和项目都跑在本机确保演示时无网络依赖。这个坑我见过太多次了只能靠提前演练整个启动流程来避免。标本编号重复录入没有提示现象连续录入两个相同编号的标本系统直接抛异常页面显示白屏 JSON 错误信息。 原因只靠数据库唯一索引拦截没有在业务层提前判断。 解决在新增接口里先按 specimenCode 查询一次存在则返回友好提示。数据库约束是底线保障但用户体验必须靠业务代码兜住。6. 答辩演示前的最后准备验证数据、固定端口与一套不会翻车的展示脚本所有开发工作结束后别急着打印论文。答辩演示和平时自己点着玩是两回事——评委看的是“你能不能讲清楚一件事”标注数据的真实性、系统的稳定性、以及你对边界条件的理解。所以我会要求把最后两三天留给演示准备具体做三件事。第一件事是整理验证数据集。前面说的“插十几条有层次的数据”现在就派上用场了。让标本列表页第一屏就有不同分类、不同采集地的内容最好让“中华蜜蜂”这种常见种和“某某稀有种”同时出现——选择展示数据本身就是对系统业务的一种理解。再准备一条 SQL 查一下分类统计SELECT c.category_name, COUNT(s.id) AS cnt FROM insect_category c LEFT JOIN insect_specimen s ON s.category_id c.id AND s.deleted 0 GROUP BY c.id;这条 SQL 在答辩时现场跑一次然后用“分类统计报表”功能展示同样的结果。评委能看到数据库和页面是对得上的这一下就把“系统是真实可运行”立住了。第二件事是把端口固定下来。application.yml 里写成 8088然后每次启动前先netstat确认端口没被占。不要到现场才意识到端口被某个后台程序占了那时候再改配置、重启、等依赖加载节奏就乱了。我习惯在启动日志里加一行提示显示“当前启动端口8088”一眼确认环境符合预期。第三件事是走一遍演示脚本。我的演示顺序是固定的先登录页进系统打开标本列表展示分页和搜索用 Postman 现场调一次新增接口讲到防御式编程时把“重复编号会提示”的细节演给评委看去数据库里查这条新数据回页面刷新看到记录出现最后展示逻辑删除——删一条数据再回数据库看那条记录的 deleted 字段变成 1 而不是消失。整套下来 3~5 分钟每个环节都能证明一个论点表设计合理、接口健壮、数据库操作可见。演示时如实说“数据是测试数据”很正常“这是我从网上找的图片”也完全没问题关键是你对系统每个操作都有把握能接住追问。这些年带毕设我最深的体会是做管理系统不拼技术炫技拼的是“每个环节都能讲出为什么”。当时带的一个学生系统功能做得很全但答辩前没检查演示数据现场打开列表是空的评委问“怎么能看到效果”他支支吾吾半天场面一度很不好看。后来我总结成这套流程先给足数据再定好端口最后把脚本背熟——任何一套系统做到这三点就算稳了一半。希望帮到你也祝你答辩顺利。本文还有配套的精品资源点击获取

相关新闻

Spring Boot 3 下用 Knife4j 4.x 替代 Swagger2 的完整落地指南

Spring Boot 3 下用 Knife4j 4.x 替代 Swagger2 的完整落地指南

1. 为什么 Spring Boot 3 一升级,Swagger2 就得靠边站先交代个背景:我参与过一次内部项目升级,从 Spring Boot 2.7 升到 3.x,最先把人搞崩的不是业务代码,而是 API 文档。pom 里还留着springfox-boot-starter 3.0.0的依…

2026/10/10 7:30:23 阅读更多 →
多Agent协作实战:从单体Agent到总控调度架构的工程实践

多Agent协作实战:从单体Agent到总控调度架构的工程实践

我一度觉得,把一个大模型Agent当成万能助手去处理复杂任务,这件事本身就是个错误。任务稍微复杂一点,它要么忘记前面已经得出的结论,要么卡在某个子环节上原地打转,甚至一本正经地把完全错误的信息写进最终报告。后来我…

2026/10/10 7:30:22 阅读更多 →
Java对象内存布局揭秘:从Mark Word到字段重排

Java对象内存布局揭秘:从Mark Word到字段重排

如果你手头正好有一个 Java 项目,可以先做个最简单的实验:定义一个只有几个字段的类,分别用不同顺序写一遍字段,然后用jol-core打印对象的内存布局。你会发现一个反直觉的事实——字段声明顺序不一样,对象最终占用的字…

2026/10/10 7:30:22 阅读更多 →

最新新闻

冬天骑车别只穿厚:六个关键点决定安全与舒适

冬天骑车别只穿厚:六个关键点决定安全与舒适

冬天骑车,不是穿厚点就行,这六点很关键每年一入冬,骑行群里就开始聊同一个话题——冷。有人翻出最厚的羽绒服,有人把两条秋裤叠着穿,还有人手都冻僵了还坚持蹬。我见过太多人把“冬天骑车”简单理解为“多穿衣服”&…

2026/10/10 8:57:33 阅读更多 →
klog 分级日志库实战:从 glog 分支到 Kubernetes 生态的 Go 日志方案与 Octant 集成

klog 分级日志库实战:从 glog 分支到 Kubernetes 生态的 Go 日志方案与 Octant 集成

云原生后端前端运维可观测性开发工具 【免费下载链接】octant Highly extensible platform for developers to better understand the complexity of Kubernetes clusters. 项目地址: https://gitcode.com/gh_mirrors/oc/octant 点击查看 免费下载 klog 是 Kuberne…

2026/10/10 8:57:33 阅读更多 →
GoatCounter 前端接入指南:count.js 脚本的设置、数据参数与 API 方法全解析

GoatCounter 前端接入指南:count.js 脚本的设置、数据参数与 API 方法全解析

数据分析后端 【免费下载链接】goatcounter Easy web analytics. No tracking of personal data. 项目地址: https://gitcode.com/gh_mirrors/go/goatcounter 点击查看 免费下载 GoatCounter 是一款强调隐私保护的轻量级网页统计工具("Easy web an…

2026/10/10 8:57:33 阅读更多 →
Django-基于RestNet50的猕猴桃叶病害识别分类系统-大数据开发大数据专业毕业设计

Django-基于RestNet50的猕猴桃叶病害识别分类系统-大数据开发大数据专业毕业设计

猕猴桃作为一种富含维生素 C 等多种营养成分的水果,在全球水果市场中占据着重要地位。中国是猕猴桃的原产国,也是种植和生产大国。然而,猕猴桃在生长过程中极易受到多种病害的侵袭,尤其是猕猴桃叶病害,严重影响了猕猴桃…

2026/10/10 8:57:33 阅读更多 →
我用两行命令,让 Codex、Claude Code、Grok Build 全部跑上了 DeepSeek、Kimi、Qwen——OpenCodex 深度实战指南

我用两行命令,让 Codex、Claude Code、Grok Build 全部跑上了 DeepSeek、Kimi、Qwen——OpenCodex 深度实战指南

文章目录 一、先讲个扎心的故事 二、它到底能让你干什么?——功能全景图 三、5 分钟极速上手 3.1 安装条件 3.2 三条命令跑起来 3.3 交互式初始化 3.4 停止——干净到没有残留 四、架构拆解:这个代理内部到底长什么样? 五、核心功能逐个击破 5.1 模型路由:`provider/model`…

2026/10/10 8:57:33 阅读更多 →
408复试机试Day8复盘:计组模拟与图数组代码实战

408复试机试Day8复盘:计组模拟与图数组代码实战

408复旦机试复试学习Day8——说实话,前三天我还处于“机试到底考什么”的焦虑里,今天才算真正把节奏踩稳了。这篇不是攻略,就是一份第8天的真实备考复盘:我今天干了一件事,就是围绕408机试把两个最核心的板块——计算机…

2026/10/10 8:56:32 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →