Spring Boot招投标管理系统设计与实现详解
如果非要选一个毕业设计题目招投标管理系统确实是计算机专业一个非常值得做的方向。原因很简单它属于典型的真实业务系统流程是活的状态是有约束的权限是有层级的数据是有关联的不是那种学生管理、图书管理里纯增删改查能比的。而且这个题目贴近建筑工程行业的信息化需求技术栈用上Spring Boot全家桶业务覆盖招标、投标、开标、评标、中标整条链路答辩时无论讲流程设计还是讲技术难点都拿得出手。这篇内容我就以Spring Boot框架下的建筑工程招投标信息化管理系统为例把整个设计与实现过程完整拆开讲。涉及需求分析、数据库建模、核心流程状态机设计、基于RBAC的权限体系、评标模块的计算逻辑、以及部署上线前需要避掉的坑。不管你是选了这个毕设题目还是单纯想把这类管理系统的实现思路吃透这篇都能给你一套可以直接落地的参考方案。1. 项目概述与底层设计思路1.1 建筑工程招投标为什么要信息化建筑工程招投标的业务链路本身不难理解建设单位有工程项目需要选择施工单位于是发布招标公告施工单位看到公告按招标文件要求准备投标文件并提交到了截止时间招标方组织开标请专家评审最终确定中标单位公示结果。但真实业务落到线下时问题非常集中纸质文件流转慢盖章签字流程跑好几天招标文件、投标文件版本容易搞混废标情况频发开标时间靠人工盯错过时间就是事故评标过程依赖人工统计分数算错、改分说不清楚历史资料散落各处后续审计根本没法追溯。这些问题归结起来就是一个核心诉求流程要在线化、节点要可控化、结果要可追溯。信息化管理系统的目标就是把整条链路搬上线让招标公告在线发布、投标文件在线加密递交、开标过程按时间自动触发、评标分数在线计算并留痕、中标结果在线公示。对招标方来说流程进度清晰对投标方来说参与过程透明对管理员来说权限可控、数据可审计。系统真正解决的是建筑工程招投标场景中“信息不对称、流程不透明、资料难追溯”三大痛点。1.2 技术栈选型与核心考量这个题目用Spring Boot做后端基本是当前主流且最稳妥的选择。后端框架层面Spring Boot的价值在于自动配置和生态整合。它内置了Web容器不用像传统SSH那样做复杂的XML配置一个工程初始化就能跑起来这对毕设开发节奏非常重要。Spring家族自带的依赖注入、事务管理、AOP切面做权限拦截、日志记录都有天然优势。持久层我选了MyBatis-Plus。相比纯MyBatis它在单表CRUD场景下省掉大量重复SQL代码生成器还能根据数据库表直接生成实体类、Mapper、Service的骨架代码直接把开发效率拉满。复杂多表查询和动态SQL又能保留MyBatis的灵活性写自定义SQL控制局。对于招投标系统这种业务表多、关联查询密集的项目来说这个组合非常顺手。数据库用MySQL存储过程不需要复杂统计查询也不多但MySQL的InnoDB引擎对事务的支持要优先保证因为投标文件提交、评标结果录入这类操作必须保证数据一致性。Redis作为缓存中间件主要用来存验证码、在线用户Token、以及招标公告等热点数据的临时缓存。前端采用Vue Element UI做前后端分离后端提供纯JSON接口。后端开发重点放在接口设计、鉴权、流程控制上前端负责页面渲染。为了部署方便前端项目构建后由Nginx托管后端打成Jar包由Java进程运行整体结构清晰。注意既然是毕业设计技术栈选择一定要优先考虑“讲解逻辑清晰”和“开发效率高”而不是刻意追求冷门框架或新版本特性。评委关注的是你对框架原理的理解和业务落地的能力不是用了多新的版本号。1.3 功能模块整体拆解系统按角色和业务域拆分为五大核心模块模块名称核心功能覆盖角色用户与权限模块账号管理、角色分配、菜单权限、操作日志管理员项目管理模块工程项目信息维护、标段划分、招标计划管理招标方招投标流程模块招标公告发布、投标文件递交、保证金核验、开标管理招标方、投标方评标管理模块专家库维护、专家随机抽取、评分录入、汇总计算、评标报告评标专家中标与公示模块中标候选人推荐、结果公示、合同信息登记招标方、投标方、公众这五大模块并非彼此孤立而是由一条完整的状态流串起来项目立项后创建招标计划计划审核通过后发布公告公告到期进入投标阶段投标截止后自动开标开标后进入评标环节评标完成后生成中标候选最终公示并归档。后面章节的数据库设计和代码实现都要围绕这条主线展开。2. 数据库模型与核心流程梳理2.1 核心表结构与设计思路整个系统的数据模型可以归纳为三组主体数据、流程数据、关联数据。主体数据表包括用户表、角色表、项目表、标段表、企业表。用户表字段除了常规的账号、密码、手机号、邮箱之外还必须有status状态字段用来控制账号启用禁用。项目表是整个系统的数据源头工程名称、项目编号、建设单位、投资规模、计划开工日期、项目地址这些核心信息都在这里同时保留remark备注字段和create_time审计字段方便后续排查问题。流程数据表是系统的骨架重点包括招标信息表保存招标编号、项目ID、标段ID、招标方式、公告内容、报名开始结束时间、澄清截止时间、投标截止时间、开标时间、投标保证金金额、招标文件下载次数。投标信息表保存投标企业ID、招标ID、投标报价、工期承诺、项目经理姓名、投标文件附件路径、提交时间、保证金缴纳凭证、密封状态。评标记录表保存评标专家ID、投标信息ID、评审打分、评审意见、评标时间。中标结果表保存招标ID、中标企业ID、中标金额、中标日期、公示开始结束时间、状态。关联数据表则负责维护多对多关系用户角色关联表、评标专家与标段关联表、操作日志表、通知消息表。字段设计的总体原则是“够用不过度设计”。很多同学一上来就设计二十多张表字段冗余严重写代码时自己都分不清业务边界。招投标系统要保证状态可追踪、数据可回溯核心字段必须有但没必要堆砌无意义的审计字段或字典表把招标、投标、评标、中标四条主表设计扎实系统就站稳了八成。2.2 招投标状态机与流程控制招投标系统最容易翻车的地方就是流程乱跳投标还没截止系统就允许评标公告还在草稿状态投标人就能递交文件中标公示没结束状态就直接归档。这种问题必须用状态机机制来约束。先定义招标主流程状态枚举public enum TenderStatus { DRAFT(0, 草稿), PENDING_AUDIT(1, 待审核), PUBLISHED(2, 已发布), ACCEPTING(3, 投标中), BID_OPENED(4, 已开标), EVALUATING(5, 评标中), RESULT_PUBLISHED(6, 结果已公示), COMPLETED(7, 已完成), CANCELLED(8, 已取消); }状态流转不是随意跳转的比如草稿可以提交审核审核通过才能发布发布后定时进入投标中到了截止时间自动触发开标。每次状态变化都必须在代码里做校验最简单可控的方式是定义一个状态转移合法性映射private static final MapTenderStatus, ListTenderStatus TRANSITIONS new HashMap(); static { TRANSITIONS.put(TenderStatus.DRAFT, Arrays.asList(TenderStatus.PENDING_AUDIT, TenderStatus.CANCELLED)); TRANSITIONS.put(TenderStatus.PENDING_AUDIT, Arrays.asList(TenderStatus.PUBLISHED, TenderStatus.CANCELLED)); TRANSITIONS.put(TenderStatus.PUBLISHED, Arrays.asList(TenderStatus.ACCEPTING, TenderStatus.CANCELLED)); // 其余状态转移同理 } public boolean canTransition(TenderStatus from, TenderStatus to) { ListTenderStatus allowed TRANSITIONS.get(from); return allowed ! null allowed.contains(to); }这套设计把状态流转规则集中在同一个类里管理改一处就能全局生效。更重要的是代码里每次更新状态都必须带上“原状态”作为条件确保并发情况下不会出现两个请求把状态从同一个节点推进到不同地方。2.3 自行设计状态机还是引入工作流引擎这一块我在开发前专门纠结过要不要直接用Flowable或Activiti这类工作流引擎。最终结论是不引入。工作流引擎确实强大但招投标系统的流程属于“节点固定、状态明确”的类型本质上是一条带状态约束的直线没有复杂的会签、或签、条件网关。引入Flowable会让项目结构多出一层引擎配置、流程定义XML、部署管理对毕业设计来说解释成本高演示时还容易出现引擎初始化问题。自研状态机代码量不大逻辑透明答辩时还能对着代码讲清楚“为什么不允许跳转”这反而是加分项。如果你的项目要求中明确规定了必须用工作流引擎那另说如果只是自己选型毕业设计场景下自研状态机是更优解。3. 核心模块实现与关键代码解读3.1 招标公告发布与进度管理招标公告发布是整个流程的入口。公告创建时绑定项目和标段填写招标方式、报名时间段、投标截止时间、开标时间、保证金金额、联系方式等核心字段。我当时的实现里公告状态从DRAFT变为PENDING_AUDIT需要管理员审核审核通过后状态改为PUBLISHED此时前端招标列表才对投标方可见。公告实体类设计时注意时间字段用LocalDateTime不要用Date配合Jackson格式化后前端拿到的是ISO标准字符串处理起来省心很多Data TableName(tb_tender_info) public class TenderInfo { TableId(type IdType.AUTO) private Long id; private String tenderNo; private Long projectId; private Long sectionId; private String tenderName; private String tenderMethod; private LocalDateTime publishTime; private LocalDateTime bidStartTime; private LocalDateTime bidDeadline; private LocalDateTime openTime; private BigDecimal depositAmount; private String announcementContent; private Integer status; private String createBy; private LocalDateTime createTime; }关键点在于接口层要防止状态越权操作。比如发布公告接口Service方法第一行就应该查一次当前状态public void publishTender(Long tenderId) { TenderInfo tender tenderMapper.selectById(tenderId); if (!statusService.canTransition(tender.getStatus(), TenderStatus.PUBLISHED.getCode())) { throw new BizException(当前状态不允许发布操作); } // 校验时间合法性例如开标时间必须晚于投标截止时间 if (tender.getOpenTime().isBefore(tender.getBidDeadline())) { throw new BizException(开标时间不能早于投标截止时间); } User user SecurityUtils.getCurrentUser(); TenderInfo update new TenderInfo(); update.setId(tenderId); update.setStatus(TenderStatus.PUBLISHED.getCode()); update.setPublishTime(LocalDateTime.now()); update.setUpdateBy(user.getUsername()); tenderMapper.updateById(update); }这里必须强调一点更新操作只更新需要变化的字段不要直接把整个TenderInfo对象塞进updateById防止把其他字段的脏数据一并覆盖。3.2 投标文件上传与时限控制投标模块最核心的是文件递交和截止时间控制。文件上传首选用MinIO做对象存储本地开发调试方便部署时也能用Docker快速起一个MinIO容器。如果不想引入额外中间件直接存服务器本地磁盘加Nginx映射也行但要注意路径规范化不允许用户通过URL拼接路径去访问其他目录下的文件。上传接口要做三层校验文件扩展名白名单校验、文件大小上限校验、投标截止时间校验。前两个是通用安全要求第三个是业务强约束必须在Service层判断public void submitBid(Long tenderId, MultipartFile file, BigDecimal bidAmount) { TenderInfo tender tenderMapper.selectById(tenderId); // 投标截止时间校验 if (LocalDateTime.now().isAfter(tender.getBidDeadline())) { throw new BizException(已超过投标截止时间无法提交投标文件); } // 同一标段同一企业只能提交一次 Long exists bidMapper.selectCount( new LambdaQueryWrapperBidInfo() .eq(BidInfo::getTenderId, tenderId) .eq(BidInfo::getEnterpriseId, currentEnterpriseId())); if (exists 0) { throw new BizException(该标段已提交过投标文件请勿重复投标); } // 校验通过后保存文件、插入投标记录 String fileUrl fileStorageService.upload(file); BidInfo bid new BidInfo(); // ... 填充字段、保存 }超时提交被拦截这个逻辑光靠前端禁用按钮不够后端必须作为硬校验存在。实际测试时我特意把服务器时间往回调了一分钟来验证确认接口确实返回了“已超过投标截止时间”的提示这个细节在演示时非常加分。3.3 自动开标与定时任务开标动作要求精确在截止时间触发靠人工点按钮不现实必须用定时任务兜底。Spring Boot中Scheduled注解是最直接的方案。我用它做两个任务一个是每分钟扫描一次所有处于PUBLISHED或ACCEPTING状态且开标时间已到的招标信息自动把状态改为BID_OPENED另一个是每天清理过期的验证码缓存防止Redis中堆积无用数据。开标任务的核心代码Component Slf4j public class TenderScheduler { Resource private TenderMapper tenderMapper; Scheduled(cron 0 * * * * ?) public void autoOpenBid() { ListTenderInfo list tenderMapper.selectList( new LambdaQueryWrapperTenderInfo() .in(TenderInfo::getStatus, TenderStatus.PUBLISHED.getCode(), TenderStatus.ACCEPTING.getCode()) .le(TenderInfo::getOpenTime, LocalDateTime.now())); for (TenderInfo tender : list) { // 更新状态为已开标 lambdaUpdate() .eq(TenderInfo::getId, tender.getId()) .eq(TenderInfo::getStatus, tender.getStatus()) .set(TenderInfo::getStatus, TenderStatus.BID_OPENED.getCode()) .set(TenderInfo::getUpdateTime, LocalDateTime.now()); log.info(招标编号 {} 已自动开标, tender.getTenderNo()); } } }写定时任务最容易忽略的是并发与幂等任务执行时间点重叠可能导致同一条数据被重复更新。我用“状态作为update条件”来处理即使两个任务同时扫描到同一条记录后执行的那个会因为where条件中的status已变更而更新0条记录不会造成状态错乱。3.4 评标模块与评分计算评标是整个系统里最体现逻辑含量的模块因为它不只是简单的增删改查还要解决专家分配、分数计算、结果排名三个核心问题。专家抽取采用随机分配某个标段进入评标状态时系统从专家库中随机选择指定数量的专家记录到评标任务表中。抽签逻辑不是用数据库order by rand()而是查出所有合格专家ID列表后在内存中做随机数据量小、效率高、更容易控制抽取数量。评分计算这里要做一个加权汇总。每个专家对每个投标人打分分数包含商务分、技术分、价格分三项权重可以按照标段配置比如商务30%、技术50%、价格20%总分为百分制public BigDecimal calcFinalScore(ListEvaluationScore scores) { // 对每一位专家给出的评分进行加权 BigDecimal technicalWeight new BigDecimal(0.5); BigDecimal commercialWeight new BigDecimal(0.3); BigDecimal priceWeight new BigDecimal(0.2); BigDecimal total BigDecimal.ZERO; for (EvaluationScore score : scores) { BigDecimal single score.getTechnicalScore().multiply(technicalWeight) .add(score.getCommercialScore().multiply(commercialWeight)) .add(score.getPriceScore().multiply(priceWeight)); total total.add(single); } // 取多位专家的平均分 return total.divide(new BigDecimal(scores.size()), 2, RoundingMode.HALF_UP); }这里有一个隐藏的业务陷阱多位专家打分时极端高分或极端低分是否剔除。真实招标里通常会在评标细则中规定去掉一个最高分和一个最低分。我在系统里做了一个可配置开关评标规则表中设置removeExtreme标志为true时排序后去除头尾再取平均。这样做答辩时可以直接解释现实业务场景中的评分策略比固定算法更有说服力。4. 权限体系与安全防护设计4.1 RBAC权限模型落地招投标系统涉及三种以上的角色权限必须走RBAC模型不能靠if else判断用户名来实现。数据库里维护用户表、角色表、菜单表、用户角色关联表、角色菜单关联表后端通过Spring Security或自定义拦截器完成认证和授权。我使用Spring Security JWT的方案登录成功后签发Token前端把Token放在请求头的Authorization字段里后端通过OncePerRequestFilter解析Token把用户信息和角色信息放入SecurityContext。每个接口通过PreAuthorize注解控制访问权限PreAuthorize(hasAnyRole(ADMIN, TENDERER)) PostMapping(/tender/create) public Result createTender(RequestBody TenderInfoDTO dto) { return tenderService.createTender(dto); } PreAuthorize(hasRole(BIDDER)) PostMapping(/bid/submit) public Result submitBid(RequestBody BidSubmitDTO dto) { return bidService.submitBid(dto); }方法级权限注解可读性很高接口列表一眼就能看出谁可以操作。这里要注意的是注解只能解决“角色能不能访问这个接口”的问题解决不了“用户是否拥有这条数据”数据级权限必须在Service层做二次校验。4.2 越权访问防护很多毕设系统ACL做得很薄弱最典型的问题就是越权投标方A直接拼一个ID调接口去查投标方B的投标文件详情。这种漏洞评委演示时一抓一个准。防护手段是在Service层断言数据归属。比如查询投标详情时先判断当前用户名下的企业ID是否与这条投标记录的企业ID一致不一致直接抛异常public BidDetailVO getBidDetail(Long bidId) { BidInfo bid bidMapper.selectById(bidId); if (bid null) { throw new BizException(投标记录不存在); } // 数据级权限校验 Long currentEnterpriseId enterpriseService.getCurrentEnterpriseId(); if (!bid.getEnterpriseId().equals(currentEnterpriseId)) { throw new BizException(无权限查看该投标记录); } // 组装VO返回 }开标之前投标方应当看到的是“已递交”状态但接口绝对不允许在开标前返回投标金额等敏感字段。实现方式是查询VO组装时根据当前状态动态屏蔽字段从数据出口把关而不是依赖前端隐藏。4.3 安全细节处理清单安全方面我自己总结了一份必须逐项排查的清单第一密码存储用BCrypt加密不要用MD5。BCrypt自动带盐相同密码每次加密结果都不同即使数据库泄露也不容易撞库。第二防SQL注入。MyBatis-Plus的LambdaQueryWrapper底层是预编译参数绑定只要不硬拼SQL就安全。自定义SQL全部使用#{}占位符不用${}。这一点在答辩时会被问必须能讲清楚。第三防XSS攻击。前端Vue的默认插值转义能挡住大部分反射型XSS但后端仍有必要做一次全局过滤对请求参数中的script标签、onclick事件等危险关键字进行转义防止攻击者绕过前端直接调用接口。第四文件上传安全。白名单校验扩展名和处理Content-Type双保险一般来说jsp、exe、sh等扩展名一概拒绝。上传目录与项目根目录分离防止通过Web路径直接执行或下载。5. 部署上线与常见问题排查实录5.1 前后端分离部署步骤开发环境跑通只是第一步要真正完成毕设部署演示环节往往比开发更折磨人。我的建议是开发结束后尽早安排一次全流程部署别等到最后三天才动手。部署环境我用了腾讯云轻量服务器2核4G配置完全够跑这套系统。后端打Jar包后扔到服务器的/opt/app目录MySQL和Redis用Docker一键启动前端项目构建后生成的dist目录放到Nginx的html目录下再配一条反向代理把/api路径转发到后端8080端口就完成了。关键Nginx配置如下server { listen 80; server_name your-domain.com; root /usr/share/nginx/html; index index.html; location / { try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }注意前端请求的BaseURL在生产环境必须用相对路径/api不要写死localhost否则部署到服务器后所有接口都会离线。这个坑我踩过一次改一处全局变量解决。5.2 高频问题排查速查表开发过程中我整理了最容易出问题的几个点直接列成表格方便后来人对照问题现象排查方向解决方案前端请求接口报404Nginx代理路径和后端Controller路径是否一致用curl测试后端接口确认/开头对齐后端接口偶尔报500查看服务日志是否有空指针或SQL异常主要检查关联表数据是否存在脏数据定时任务没有执行确认启动类是否加了EnableScheduling缺少注解导致定时任务不扫描上传文件后访问报403检查存储目录的linux权限chmod给到755确认进程可读写数据库中文乱码连接串是否指定编码连接串加characterEncodingutf8前端白屏打包时路由模式与Nginx配置不匹配配置try_files回退到index.htmlJWT登录后接口401检查过滤器链路Token解析是否在过滤器内完成确认JWT过滤器在Security过滤器链之前执行5.3 性能优化与并发处理招投标系统的并发量并不会很高但有两个场景必须做并发保护。一是同一企业同一标段重复提交投标文件虽然代码里有校验但两个请求同时到达时数据库层面还是要加唯一索引兜底。我的建议是在投标信息表上建立(tender_id, enterprise_id)唯一索引确保业务层漏判时数据库能拦住。二是保证金状态切换。模拟支付回调时可能重复通知接口需要对同一笔订单做幂等校验。用订单号加锁或者数据库唯一约束都能解决否则重复回调会导致保证金金额翻倍入账。数据库层面给招标信息表的status、create_time字段建了普通索引投标信息表的tender_id、enterprise_id建了组合索引。这套系统的数据量在千万行以内时索引建在路上就不会有性能瓶颈。6. 答辩准备与经验参考6.1 答辩时的高频问题准备招投标系统的答辩评委大概率会从这几个角度提问提前备好答案现场就有底气。第一个高频问题是“你的系统为什么引入状态机”。要答清楚招投标流程有严格的前后置关系状态机把流转规则集中化、可视化配合状态变更校验能防止非法跳转这是整个系统的业务核心。顺带举一个例子投标截止后投标接口被强行打开状态机校验直接拒绝。第二个问题是“权限是如何控制的”。要从RBAC模型讲起说明用户、角色、菜单三层模型和Spring Security过滤器链的工作方式重点解释为什么数据级权限必须在Service层校验而不只是靠前端菜单渲染来隐藏。第三个问题是“评标分数如何保证公平性”。要讲随机抽取专家、极端值剔除、评分留痕几个点说明系统只是辅助工具最终决策仍遵循招标文件规则系统保证数据不被篡改、过程可追溯。6.2 演示Demo的关键准备演示翻车往往不是逻辑问题而是数据没准备好。我建议提前写一个演示脚本准备3个投标企业账号、5位评标专家账号、1个已完成全部流程的历史招标数据、1个正在投标中的新招标数据。演示时先展示历史项目从已归档的项目列表点进去给评委看完整的招标公告、投标列表、每家企业的评分明细、最终中标结果。再切换到正在投标的项目现场演示投标文件上传、界面展示状态变化、管理员后台将状态推进如果条件允许演示一下定时任务把开标时间改到一分钟后的自动开标。这样两段式演示既展示完整流程又展示实时操作时间控制在十分钟内评委体验是最好的。6.3 可扩展方向与亮点补充如果想让系统在答辩中更出彩有两个方向可以扩展。第一个是加分项加入基于WebSocket的消息通知。招标公告发布后系统自动将通知推送给所有关注该标段的投标企业评标结果公示时投标方页面实时更新状态。这一功能实现成本不高但演示效果非常直观也展示了实时通信的能力。第二个是进阶项引入简单的数据分析。比如用ECharts展示每月招标项目数量趋势、各投标企业中标率排名、招标金额区间分布等图表。技术上就是从业务表做Group By统计前端接图表组件渲染却能体现出“信息化管理系统不只有录入功能还能辅助决策”的价值。注意扩展功能一定要基于主线流程做锦上添花不要喧宾夺主。如果基础流程没跑稳固扩展功能越多演示时翻车的概率越大。7. 个人经验与最后建议整个系统做完我最真实的感受是招投标管理系统这个题目的价值不在于代码量多大而在于它把真实世界的业务规则落进了系统里。状态机、权限模型、评分算法、幂等控制这些不是从教科书上背出来的概念而是这个系统里每个功能都绕不开的真实约束。把这套逻辑理顺写代码反而变得很顺。如果你是零基础开始做建议的开发顺序是先建库建表再写登录注册和权限框架做出主流程其他部分不着急项目发布、投标、开标、评标、中标这条主线一天不跑通先不动那些花哨的副功能。每完成一个模块就顺手补充测试数据保证整个系统随时处于可演示状态。最后分享一个小经验写代码时把状态枚举、业务异常类、统一返回结果封装这类基础代码放前面后面所有业务模块都会用到。我在开发中期重构过一次状态枚举结果受影响的Service代码改了十几个文件一度非常痛苦。如果一开始就把这些地基打牢后面的开发会顺畅得多。项目做完之后最大的收获不是那几千行代码而是面对一套有复杂业务约束的系统时敢动手去拆解和落地的自信这个比什么都重要。

相关新闻

手写词法分析器:从状态机到精准错误定位的完整实现

手写词法分析器:从状态机到精准错误定位的完整实现

1. 项目概述:为什么一个词法分析器值得花三天重写三遍“编译原理(一):实现词法分析程序”——这行字出现在某高校《程序设计语言原理》课程实验手册第一页时,我正坐在实验室后排调试一个连空格都识别不出来的字符串分割…

2026/10/13 5:04:22 阅读更多 →
Flowable表结构全解析:六大表分类与核心查询优化指南

Flowable表结构全解析:六大表分类与核心查询优化指南

1. Flowable 表结构整体拆解:从“一脸懵”到“心中有图”很多朋友第一次接触 Flowable,启动完工程、跑通一个请假流程后,打开数据库一看,哗啦啦几十张表摆在面前,直接懵掉。这跟 MyBatis-Plus、Spring Data JPA 那种几…

2026/10/13 5:04:22 阅读更多 →
爬虫技术进阶:从动态渲染定位到签名参数模拟的实战排查

爬虫技术进阶:从动态渲染定位到签名参数模拟的实战排查

爬虫技术分享这个主题,我在技术群里聊过很多次。聊多了之后发现一个有意思的现象:不少人觉得爬虫就是“requests发个GET,拿回来解析HTML”,简单到不值得单独拿出来讲;可真到接手一个稍微像样的真实数据页面时&#xff…

2026/10/13 5:04:22 阅读更多 →

最新新闻

Zynq软硬件协同实战:EMIO扩展GPIO中断控制PL端LED

Zynq软硬件协同实战:EMIO扩展GPIO中断控制PL端LED

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

2026/10/13 5:51:38 阅读更多 →
PyTorch可视化避坑指南:深度解析visdom架构与稳定实践

PyTorch可视化避坑指南:深度解析visdom架构与稳定实践

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

2026/10/13 5:51:38 阅读更多 →
Scala List深度解析:不可变链表与模式匹配实战指南

Scala List深度解析:不可变链表与模式匹配实战指南

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

2026/10/13 5:51:38 阅读更多 →
C/C++面试三件套:语言、操作系统与网络如何串成一条线

C/C++面试三件套:语言、操作系统与网络如何串成一条线

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

2026/10/13 5:51:38 阅读更多 →
PPT转Word在线编辑:基于UEditor和python-pptx的内容桥接方案

PPT转Word在线编辑:基于UEditor和python-pptx的内容桥接方案

1. 教育场景下的真实需求:为什么非要"PPT转Word再编辑"过去半年我在帮某高校的继续教育学院做在线备课系统,最频繁的需求之一就是"老师上传一个PPT课件,系统里最好能直接变成可编辑的Word讲义"。第一次听到这个需求&…

2026/10/13 5:51:38 阅读更多 →
ARMv8-A异常处理全解析:从向量表到中断返回

ARMv8-A异常处理全解析:从向量表到中断返回

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

2026/10/13 5:50:38 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →