温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片!
1. 引言
随着企业采购和工程项目的规模不断扩大,招投标业务涉及的流程环节日益复杂,传统的人工管理方式在信息记录、流程跟踪、数据统计和合规审查等方面存在效率低、易出错、追溯难等问题。本文基于 Java Spring Boot 技术栈,设计并实现一套招投标管理系统,覆盖招标公告发布、投标报名、标书上传、开标评标、中标公示等核心业务环节,旨在提升招投标全流程的规范化、数字化和可追溯性。
2. 系统需求分析
2.1 功能需求
系统面向招标方、投标方和管理员三类角色,主要功能需求如下:
- 招标管理:支持招标公告的发布、编辑、审核和归档,记录招标项目的基本信息、预算金额、投标截止时间等关键字段。
- 投标管理:投标方可在线报名、上传投标文件,系统自动校验文件格式和大小,并记录投标时间。
- 开标评标:支持在线开标、专家评标打分、汇总评分结果,生成评标报告。
- 中标管理:发布中标公示,支持中标通知书的生成与下载。
- 系统管理:用户管理、角色权限分配、操作日志审计等基础管理功能。
2.2 非功能需求
- 安全性:采用 Spring Security 实现认证与授权,敏感数据加密存储,投标文件访问需权限校验。
- 可扩展性:采用分层架构和模块化设计,便于后续扩展电子签章、在线支付等功能。
- 可维护性:统一异常处理、日志记录和接口文档规范,降低后期维护成本。
3. 系统总体设计
3.1 技术架构
系统采用前后端分离架构,后端基于 Spring Boot 构建 RESTful API,前端使用 Vue.js 进行页面渲染,数据库选用 MySQL,缓存层使用 Redis。整体架构如下:
flowchart TD A[浏览器前端 Vue.js] -->|HTTP/JSON| B[Spring Boot 后端] B --> C[Spring Security 认证授权] B --> D[业务模块 Service] D --> E[MyBatis-Plus 数据访问] E --> F[(MySQL 数据库)] B --> G[Redis 缓存] B --> H[MinIO 文件存储]3.2 功能模块划分
系统按业务域划分为以下核心模块:
- 用户认证模块:登录、登出、Token 签发与刷新。
- 招标管理模块:招标项目、公告、标段管理。
- 投标管理模块:投标报名、标书上传、保证金管理。
- 评标管理模块:专家分配、评分表配置、评标结果汇总。
- 公示管理模块:中标公示、质疑投诉处理。
- 系统管理模块:用户、角色、菜单、日志管理。
3.3 数据库设计
系统核心数据表包括用户表、角色表、招标项目表、招标公告表、投标记录表、评标专家表、评分记录表、中标结果表等。以下为招标项目表的主要字段设计:
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键,自增 |
| project_code | varchar(50) | 项目编号 |
| project_name | varchar(200) | 项目名称 |
| budget_amount | decimal(18,2) | 预算金额 |
| bid_deadline | datetime | 投标截止时间 |
| status | tinyint | 项目状态 |
| create_time | datetime | 创建时间 |
4. 系统核心功能实现
4.1 项目环境搭建
首先创建 Spring Boot 项目,引入核心依赖。以下为 pom.xml 中的关键依赖配置:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3.1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency>4.2 用户认证与权限控制
系统使用 Spring Security 结合 JWT 实现无状态认证。用户登录成功后签发 Token,后续请求通过过滤器校验 Token 并加载用户权限。核心代码如下:
@Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.csrf().disable() .authorizeHttpRequests(auth -> auth .antMatchers("/api/auth/login").permitAll() .antMatchers("/api/admin/**").hasRole("ADMIN") .antMatchers("/api/bidder/**").hasRole("BIDDER") .anyRequest().authenticated() ) .addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class); return http.build(); } }4.3 招标公告发布功能
招标方登录后填写招标项目信息并发布公告。系统对公告内容进行合法性校验后保存至数据库,同时将公告状态置为已发布。核心 Service 实现如下:
@Service public class TenderProjectServiceImpl implements TenderProjectService { @Autowired private TenderProjectMapper projectMapper; @Override @Transactional public Long publishProject(TenderProject project) { // 校验项目编号唯一性 if (projectMapper.selectByCode(project.getProjectCode()) != null) { throw new BusinessException("项目编号已存在"); } project.setStatus(TenderStatus.PUBLISHED.getCode()); project.setCreateTime(LocalDateTime.now()); projectMapper.insert(project); return project.getId(); } }4.4 投标文件上传功能
投标方在投标截止时间前可上传投标文件。系统将文件存储到 MinIO 对象存储,并将文件元数据保存至数据库。实现代码如下:
@Service public class BidFileServiceImpl implements BidFileService { @Autowired private MinioClient minioClient; @Autowired private BidRecordMapper bidRecordMapper; @Override public String uploadBidFile(MultipartFile file, Long bidRecordId) { String objectName = "bid/" + UUID.randomUUID() + "_" + file.getOriginalFilename(); try { minioClient.putObject(PutObjectArgs.builder() .bucket("tender-bucket") .object(objectName) .stream(file.getInputStream(), file.getSize(), -1) .contentType(file.getContentType()) .build()); } catch (Exception e) { throw new BusinessException("文件上传失败:" + e.getMessage()); } // 更新投标记录中的文件路径 BidRecord record = bidRecordMapper.selectById(bidRecordId); record.setFilePath(objectName); bidRecordMapper.updateById(record); return objectName; } }4.5 评标打分功能
评标专家登录系统后,对待评标项目进行打分。系统按评分表配置自动汇总各专家评分,并计算综合得分。核心实现如下:
@Service public class EvaluationServiceImpl implements EvaluationService { @Autowired private ScoreRecordMapper scoreRecordMapper; @Override public BigDecimal calculateTotalScore(Long projectId) { // 查询该项目所有评分记录 List<ScoreRecord> records = scoreRecordMapper.selectByProjectId(projectId); // 按投标单位分组汇总 Map<Long, List<ScoreRecord>> groupByBidder = records.stream() .collect(Collectors.groupingBy(ScoreRecord::getBidderId)); // 计算每个投标单位的平均分 BigDecimal maxScore = BigDecimal.ZERO; Long winnerBidderId = null; for (Map.Entry<Long, List<ScoreRecord>> entry : groupByBidder.entrySet()) { BigDecimal avg = entry.getValue().stream() .map(ScoreRecord::getScore) .reduce(BigDecimal.ZERO, BigDecimal::add) .divide(BigDecimal.valueOf(entry.getValue().size()), 2, RoundingMode.HALF_UP); if (avg.compareTo(maxScore) > 0) { maxScore = avg; winnerBidderId = entry.getKey(); } } return maxScore; } }5. 系统测试
系统开发完成后,对核心功能进行了功能测试和性能测试。功能测试覆盖用户登录、招标公告发布、投标文件上传、评标打分、中标公示等主要业务流程,测试用例全部通过。性能测试方面,使用 JMeter 对登录接口和公告查询接口进行并发压测,在 200 并发用户场景下,接口平均响应时间保持在 500 毫秒以内,满足系统设计目标。
6. 总结与展望
本文基于 Spring Boot 设计并实现了招投标管理系统,覆盖了招投标全流程的核心业务环节,通过前后端分离架构、JWT 认证、对象存储等技术方案,提升了系统的安全性、可扩展性和易维护性。系统在实际运行中表现稳定,有效提高了招投标业务的处理效率和数据规范性。
后续工作可以从以下方向继续完善:一是引入电子签章和区块链存证技术,增强文件的法律效力和防篡改能力;二是结合大数据分析,对历史招投标数据进行深度挖掘,为招标方提供供应商信用评估和价格趋势预测;三是完善移动端适配,支持投标方通过手机完成报名和文件上传等操作。