一、系统架构与核心技术选型
本系统采用前后端分离架构,确保高内聚、低耦合,便于维护和扩展。
1.1 后端技术栈
使用Spring Boot 2.7.18作为核心框架,其内嵌Tomcat服务器简化部署。数据库选用MySQL 8.0.33,并配合MyBatis-Plus 3.5.4.1进行数据持久化操作。具体依赖在pom.xml中配置如下:
```
org.springframework.boot
spring-boot-starter-web
com.baomidou
mybatis-plus-boot-starter
3.5.4.1
mysql
mysql-connector-java
8.0.33
```
1.2 前端技术栈
前端使用Vue 3.3.4和Element Plus 2.3.8构建用户界面。通过Vite 4.4.9进行项目构建,提升开发体验。使用以下命令创建项目:
```
npm create vue@latest vue-archive-frontend
创建过程中,手动选择安装 Router, Pinia, Element Plus
```
二、开发环境搭建
确保你的本地开发环境已准备就绪。
2.1 后端环境配置
从MySQL官网下载并安装MySQL 8.0.33。安装完成后,创建数据库和用户:
```
CREATE DATABASE `ip_archive_db` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'archive_user'@'%' IDENTIFIED BY 'YourStrongPassword123!';
GRANT ALL PRIVILEGES ON `ip_archive_db`. TO 'archive_user'@'%';
FLUSH PRIVILEGES;
```
接着,在后端项目的src/main/resources/application.yml中配置数据库连接:
```
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/ip_archive_db?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
username: archive_user
password: YourStrongPassword123!
```
2.2 前端环境配置
确保已安装Node.js 18.17.0或更高版本。进入前端项目目录,安装依赖并启动开发服务器:
```
cd vue-archive-frontend
npm install
npm run dev
```
开发服务器启动后,在浏览器中访问 http://localhost:5173 即可看到应用。
三、核心功能模块开发
系统核心围绕知识产权档案的生命周期管理,包括专利、商标、软件著作权等。
3.1 数据库表设计
创建核心的`intellectual_property`表,用于存储知识产权档案的基本信息:
```
CREATE TABLE `intellectual_property` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`ip_number` varchar(100) NOT NULL COMMENT '知识产权编号',
`ip_name` varchar(500) NOT NULL COMMENT '知识产权名称',
`ip_type` tinyint NOT NULL COMMENT '类型:1-专利,2-商标,3-软件著作权',
`applicant` varchar(255) NOT NULL COMMENT '申请人',
`application_date` date NOT NULL COMMENT '申请日期',
`authorization_date` date DEFAULT NULL COMMENT '授权日期',
`legal_status` tinyint DEFAULT '1' COMMENT '法律状态:1-申请中,2-已授权,3-已失效',
`attachment_path` varchar(1000) DEFAULT NULL COMMENT '附件存储路径',
`created_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_ip_number` (`ip_number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='知识产权档案主表';
```
3.2 后端实体与Mapper开发
在Java后端项目中,创建对应的实体类IntellectualProperty.java:
```
package com.example.archive.entity;
import com.baomidou.mybatisplus.annotation.;
import lombok.Data;
import java.time.LocalDate;
import java.util.Date;
@Data
@TableName("intellectual_property")
public class IntellectualProperty {
@TableId(type = IdType.AUTO)
private Long id;
private String ipNumber;
private String ipName;
private Integer ipType;
private String applicant;
private LocalDate applicationDate;
private LocalDate authorizationDate;
private Integer legalStatus;
private String attachmentPath;
@TableField(fill = FieldFill.INSERT)
private Date createdTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updatedTime;
}
```
创建Mapper接口IntellectualPropertyMapper.java,继承MyBatis-Plus的BaseMapper:
```
package com.example.archive.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.archive.entity.IntellectualProperty;
public interface IntellectualPropertyMapper extends BaseMapper
{
}
```
3.3 后端服务与控制层开发
创建服务层接口与实现类,实现档案的增删改查逻辑。以新增档案为例,在IntellectualPropertyServiceImpl.java中:
```
@Override
public boolean saveIP(IntellectualPropertyDTO dto) {
// 1. 校验知识产权编号是否重复
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.eq(IntellectualProperty::getIpNumber, dto.getIpNumber());
if (this.count(wrapper) > 0) {
throw new BusinessException("该知识产权编号已存在");
}
// 2. DTO转Entity
IntellectualProperty entity = new IntellectualProperty();
BeanUtils.copyProperties(dto, entity);
// 3. 保存到数据库
return this.save(entity);
}
```
创建控制层IntellectualPropertyController.java,暴露RESTful API:
```
@RestController
@RequestMapping("/api/ip")
public class IntellectualPropertyController {
@Autowired
private IIntellectualPropertyService ipService;
@PostMapping
public ResultVO add(@RequestBody @Valid IntellectualPropertyDTO dto) {
boolean success = ipService.saveIP(dto);
return success ? ResultVO.success("新增成功") : ResultVO.error("新增失败");
}
}
```
3.4 前端页面与接口调用
在前端项目src/views/archive目录下创建AddForm.vue组件,用于新增档案。使用Element Plus表单组件:
```
提交
```

在中编写提交逻辑,调用后端API:
```
import { reactive, ref } from 'vue'
import { ElMessage } from 'element-plus'
import { addIntellectualProperty } from '@/api/archive'
const formData = reactive({
ipNumber: '',
ipName: '',
ipType: 1,
applicant: '',
applicationDate: ''
})
const submitForm = async () => {
try {
await addIntellectualProperty(formData)
ElMessage.success('档案创建成功')
// 重置表单或跳转列表页
} catch (error) {
ElMessage.error(error.message || '操作失败')
}
}
```
api/archive.js中封装具体的请求函数:
```
import request from '@/utils/request'
export function addIntellectualProperty(data) {
return request({
url: '/api/ip',
method: 'post',
data
})
}
```
四、附件上传与管理
知识产权档案通常包含扫描件、证书等附件,需要实现文件上传功能。
4.1 后端文件上传接口
使用Spring Boot处理文件上传。在application.yml中配置文件存储路径和大小限制:
```
spring:
servlet:
multipart:
max-file-size: 50MB
max-request-size: 100MB
file:
upload-dir: /var/uploads/ip-archive
```
创建FileUploadController.java:
```
@PostMapping("/upload")
public ResultVO uploadFile(@RequestParam("file") MultipartFile file) {
if (file.isEmpty()) {
return ResultVO.error("文件为空");
}
try {
// 生成唯一文件名,防止覆盖
String originalFilename = file.getOriginalFilename();
String fileExtension = originalFilename.substring(originalFilename.lastIndexOf("."));
String savedFileName = UUID.randomUUID().toString() + fileExtension;
Path uploadPath = Paths.get(uploadDir);
if (!Files.exists(uploadPath)) {
Files.createDirectories(uploadPath);
}
Path filePath = uploadPath.resolve(savedFileName);
file.transferTo(filePath.toFile());
String accessUrl = "/uploads/" + savedFileName;
return ResultVO.success("上传成功", accessUrl);
} catch (IOException e) {
return ResultVO.error("上传失败:" + e.getMessage());
}
}
```
配置静态资源映射,使上传的文件可以通过URL访问。在配置类中添加:
```
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Value("${file.upload-dir}")
private String uploadDir;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/uploads/")
.addResourceLocations("file:" + uploadDir + "/");
}
}
```
4.2 前端上传组件集成
在前端表单中,使用Element Plus的Upload组件:
```
点击上传
支持上传PDF、JPG、PNG文件,单个文件不超过50MB
```
在脚本中处理上传成功后的回调,将返回的文件路径保存到表单数据中:
```
const handleUploadSuccess = (response) => {
if (response.code === 200) {
formData.attachmentPath = response.data // 保存文件访问路径
ElMessage.success('附件上传成功')
}
}
```
五、系统部署上线
开发完成后,需要将前后端应用部署到生产服务器。
5.1 后端应用打包与运行
在后端项目根目录,使用Maven打包为可执行的JAR文件:
```
mvn clean package -DskipTests
```
打包完成后,在target目录下会生成archive-system-0.0.1-SNAPSHOT.jar文件。将其上传到服务器,使用以下命令启动:
```
创建应用目录并上传JAR文件
mkdir -p /opt/archive-system
cd /opt/archive-system
使用nohup在后台运行,并将日志输出到指定文件
nohup java -jar archive-system-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod > app.log 2>&1 &
```
生产环境的配置文件application-prod.yml需要独立配置,确保数据库连接、文件路径等与生产环境一致。
5.2 前端应用构建与Nginx配置
进入前端项目目录,构建生产环境版本:
```
npm run build
```
构建完成后,将dist目录下的所有文件上传到服务器的/usr/share/nginx/html/archive目录。配置Nginx,将前端请求代理到后端API,并处理前端路由。编辑Nginx配置文件(例如/etc/nginx/conf.d/archive.conf):
```
server {
listen 80;
server_name your-domain.com; 替换为你的域名或IP
前端静态文件
location / {
root /usr/share/nginx/html/archive;
index index.html;
try_files $uri $uri/ /index.html; 支持Vue Router的history模式
}
后端API代理
location /api/ {
proxy_pass http://localhost:8080; 代理到后端Spring Boot应用
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
上传文件访问路径代理
location /uploads/ {
proxy_pass http://localhost:8080/uploads/;
}
}
```
保存配置后,测试Nginx配置并重启服务:
```
sudo nginx -t
sudo systemctl restart nginx
```
至此,综合档案管理系统知识产权版已部署完成,可通过服务器IP或域名访问。