作为一名长期从事企业信息化系统开发的工程师,我最近完成了一个基于Spring Boot的专利申请管理系统。这个项目源于我在工作中接触到的实际需求——许多中小企业和个人发明家在专利申请过程中面临着流程复杂、信息不透明、管理效率低下等问题。
这个系统采用前后端分离架构,后端使用Spring Boot框架,前端采用Vue.js,数据库选用MySQL。系统主要服务于三类用户:普通用户(专利申请人)、代理用户(专利代理人)和系统管理员。通过这个系统,我们成功将传统纸质化的专利申请流程数字化,大大提高了申请效率和管理透明度。
提示:在实际开发中,选择Spring Boot框架的一个重要考虑是其快速开发能力和丰富的生态系统。相比传统的Spring MVC,Spring Boot通过自动配置和起步依赖大大简化了项目搭建过程。
系统主要实现了以下核心功能模块:
在技术选型阶段,我们经过多次讨论和验证,最终确定了以下技术方案:
后端技术栈:
前端技术栈:
选择这些技术的主要考虑因素包括:
系统采用典型的三层架构设计:
code复制┌───────────────────────────────────────┐
│ 表现层 (Presentation) │
│ ┌───────────┐ ┌─────────────┐ │
│ │ Web前端 │ ←──→ │ API Gateway │ │
│ └───────────┘ └─────────────┘ │
└───────────────────────┬───────────────┘
↓
┌───────────────────────────────────────┐
│ 业务逻辑层 (Business) │
│ ┌───────────┐ ┌─────────────┐ │
│ │ 服务模块 │ ←──→ │ 业务规则 │ │
│ └───────────┘ └─────────────┘ │
└───────────────────────┬───────────────┘
↓
┌───────────────────────────────────────┐
│ 数据访问层 (Data) │
│ ┌───────────┐ ┌─────────────┐ │
│ │ 数据库 │ ←──→ │ 缓存 │ │
│ └───────────┘ └─────────────┘ │
└───────────────────────────────────────┘
这种分层架构的优势在于:
系统采用JWT(JSON Web Token)进行用户认证,结合Spring Security实现细粒度的权限控制。这是系统安全性的关键保障。
认证流程:
java复制// JWT生成示例代码
public String generateToken(UserDetails userDetails) {
Map<String, Object> claims = new HashMap<>();
claims.put("roles", userDetails.getAuthorities().stream()
.map(GrantedAuthority::getAuthority)
.collect(Collectors.toList()));
return Jwts.builder()
.setClaims(claims)
.setSubject(userDetails.getUsername())
.setIssuedAt(new Date(System.currentTimeMillis()))
.setExpiration(new Date(System.currentTimeMillis() + JWT_TOKEN_VALIDITY * 1000))
.signWith(SignatureAlgorithm.HS512, secret)
.compact();
}
注意:在实际部署时,务必妥善保管JWT的签名密钥,并设置合理的token过期时间。我们项目中设置为8小时,既保证了安全性又不会频繁要求用户重新登录。
专利申请是系统的核心功能,我们设计了完整的申请流程:
申请准备阶段:
申请提交阶段:
审核处理阶段:
状态跟踪阶段:
java复制// 专利申请提交核心逻辑
@Transactional
public PatentApplication submitApplication(PatentApplicationDTO dto, Long userId) {
// 验证用户权限
User user = userRepository.findById(userId)
.orElseThrow(() -> new BusinessException("用户不存在"));
// 验证表单数据
validateApplication(dto);
// 保存申请
PatentApplication application = new PatentApplication();
BeanUtils.copyProperties(dto, application);
application.setApplicant(user);
application.setApplicationNo(generateApplicationNo());
application.setStatus(ApplicationStatus.SUBMITTED);
application.setSubmitTime(LocalDateTime.now());
// 处理文件上传
if (dto.getAttachments() != null) {
List<Attachment> attachments = fileService.uploadFiles(dto.getAttachments());
application.setAttachments(attachments);
}
return applicationRepository.save(application);
}
代理服务模块为专利代理人提供了专业的工作平台:
主要功能:
我们特别设计了智能提醒功能,通过分析申请数据和官方审查周期,预测可能的审查时间点,提前提醒代理人做好准备。
系统数据库包含30多张表,以下是几个核心表的设计:
专利申请表(patent_application):
sql复制CREATE TABLE `patent_application` (
`id` bigint NOT NULL AUTO_INCREMENT,
`application_no` varchar(32) NOT NULL COMMENT '申请号',
`title` varchar(255) NOT NULL COMMENT '专利名称',
`type` varchar(32) NOT NULL COMMENT '专利类型',
`abstract` text COMMENT '摘要',
`status` varchar(32) NOT NULL COMMENT '申请状态',
`applicant_id` bigint NOT NULL COMMENT '申请人ID',
`agent_id` bigint DEFAULT NULL COMMENT '代理人ID',
`submit_time` datetime NOT NULL COMMENT '提交时间',
`update_time` datetime NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_application_no` (`application_no`),
KEY `idx_applicant` (`applicant_id`),
KEY `idx_agent` (`agent_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='专利申请';
用户表(user):
sql复制CREATE TABLE `user` (
`id` bigint NOT NULL AUTO_INCREMENT,
`username` varchar(64) NOT NULL COMMENT '用户名',
`password` varchar(128) NOT NULL COMMENT '密码',
`real_name` varchar(64) DEFAULT NULL COMMENT '真实姓名',
`email` varchar(128) DEFAULT NULL COMMENT '邮箱',
`phone` varchar(32) DEFAULT NULL COMMENT '手机号',
`user_type` varchar(32) NOT NULL COMMENT '用户类型',
`status` varchar(32) NOT NULL COMMENT '状态',
`create_time` datetime NOT NULL COMMENT '创建时间',
`update_time` datetime NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_username` (`username`),
KEY `idx_phone` (`phone`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户';
系统主要实体关系如下:
我们使用外键约束保证数据完整性,同时在关联查询频繁的字段上建立了适当的索引以提高查询性能。
系统采用Docker容器化部署,部署架构如下:
code复制┌───────────────────────────────────────┐
│ 负载均衡 (Nginx) │
└───────────────┬───────────────┬───────┘
↓ ↓
┌───────────────────────┐ ┌───────────────────────┐
│ 前端容器 (Vue) │ │ API容器 (Spring) │
└───────────────────────┘ └───────────────┬───────┘
↓
┌───────────────────────────────────────┐
│ 数据库集群 (MySQL) │
│ ┌───────────┐ ┌─────────────┐ │
│ │ Master │ ←──→ │ Slave │ │
│ └───────────┘ └─────────────┘ │
└───────────────────────┬───────────────┘
↓
┌───────────────────────────────────────┐
│ 缓存 (Redis) │
└───────────────────────────────────────┘
在系统开发过程中,我们实施了多项性能优化措施:
数据库优化:
缓存策略:
接口优化:
前端优化:
在开发这个系统的过程中,我们积累了一些宝贵的经验:
文档先行:在开始编码前,一定要先完善需求文档和技术设计文档。我们项目初期因为需求变更频繁吃了不少苦头。
自动化测试:建立完善的自动化测试体系可以大大减少回归测试的工作量。我们后期补充了单元测试和接口测试,效果显著。
代码规范:严格执行代码规范,使用静态代码分析工具,这对团队协作和后期维护非常重要。
性能考虑:在系统设计阶段就要考虑性能问题,后期优化往往事倍功半。我们有几个接口因为初期设计不合理,后期重构代价很大。
监控系统:上线后要建立完善的监控系统,包括应用性能监控、错误日志收集等,这能帮助我们快速定位和解决问题。
提示:对于类似的管理系统开发,我建议采用迭代开发的方式,先实现核心功能,再逐步完善。我们项目就是先实现了专利申请和审核的核心流程,然后再补充其他辅助功能,这样既能快速验证系统价值,又能降低开发风险。