生产设备数字档案馆系统需要实现设备档案的电子化、结构化存储与全生命周期管理。核心功能包括设备档案录入、版本管理、关联查询、权限控制与数据可视化。基于以下考量选择技术方案:
安装Docker与Docker Compose,用于快速部署依赖服务:
Ubuntu系统安装命令
sudo apt update
sudo apt install docker.io docker-compose -y
sudo systemctl start docker
sudo systemctl enable docker
创建docker-compose.yml文件,内容如下:
version: '3.8'
services:
postgres:
image: postgres:15-alpine
environment:
POSTGRES_DB: equipment_archive
POSTGRES_USER: archive_admin
POSTGRES_PASSWORD: Archive@123
ports:
- "5432:5432"
volumes:
- pg_data:/var/lib/postgresql/data
minio:
image: minio/minio:latest
command: server /data --console-address ":9001"
environment:
MINIO_ROOT_USER: minioadmin
MINIO_ROOT_PASSWORD: minioadmin123
ports:
- "9000:9000"
- "9001:9001"
volumes:
- minio_data:/data
elasticsearch:
image: elasticsearch:8.12.0
environment:
discovery.type: single-node
ES_JAVA_OPTS: "-Xms512m -Xmx512m"
xpack.security.enabled: "false"
ports:
- "9200:9200"
volumes:
- es_data:/usr/share/elasticsearch/data
volumes:
pg_data:
minio_data:
es_data:
执行docker-compose up -d启动所有服务。
使用Spring Initializr创建项目,依赖选择:Spring Web, Spring Data JPA, PostgreSQL Driver, Lombok。
项目结构
src/main/java/com/equipment/archive/
├── config/ 配置类
├── controller/ 控制器
├── entity/ 实体类
├── repository/ 数据访问层
├── service/ 业务层
└── dto/ 数据传输对象
创建核心实体Equipment,对应数据库表:
@Entity
@Table(name = "equipment")
@Data
public class Equipment {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, unique = true)
private String equipmentCode; // 设备编码
@Column(nullable = false)
private String equipmentName; // 设备名称
@Column(nullable = false)
private String equipmentType; // 设备类型
@Column(columnDefinition = "jsonb")
private String specifications; // 技术参数(JSON格式)
@Column(nullable = false)
private LocalDate purchaseDate; // 购置日期
@Column
private String manufacturer; // 生产厂家
@Column
private String maintenanceRecords; // 维修记录
@Column
private String attachmentIds; // 关联附件ID列表
@CreatedDate
private LocalDateTime createTime;
@LastModifiedDate
private LocalDateTime updateTime;
}
创建MinIO配置类:
@Configuration
public class MinioConfig {
@Value("${minio.endpoint}")
private String endpoint;
@Value("${minio.accessKey}")
private String accessKey;
@Value("${minio.secretKey}")
private String secretKey;
@Bean
public MinioClient minioClient() {
return MinioClient.builder()
.endpoint(endpoint)
.credentials(accessKey, secretKey)
.build();
}
}
文件上传服务类:
@Service
public class FileStorageService {
@Autowired
private MinioClient minioClient;
private final String BUCKET_NAME = "equipment-files";
@PostConstruct
public void init() throws Exception {
boolean exists = minioClient.bucketExists(
BucketExistsArgs.builder().bucket(BUCKET_NAME).build()
);
if (!exists) {
minioClient.makeBucket(
MakeBucketArgs.builder().bucket(BUCKET_NAME).build()
);
}
}
public String uploadFile(MultipartFile file, String equipmentCode)
throws Exception {
String fileName = equipmentCode + "/" +
System.currentTimeMillis() + "_" +
file.getOriginalFilename();
minioClient.putObject(
PutObjectArgs.builder()
.bucket(BUCKET_NAME)
.object(fileName)
.stream(file.getInputStream(), file.getSize(), -1)
.contentType(file.getContentType())
.build()
);
return fileName;
}
}
创建RESTful API控制器:

@RestController
@RequestMapping("/api/equipment")
public class EquipmentController {
@Autowired
private EquipmentService equipmentService;
@PostMapping
public ResponseEntity createEquipment(
@RequestBody EquipmentDTO equipmentDTO) {
Equipment equipment = equipmentService.createEquipment(equipmentDTO);
return ResponseEntity.ok(equipment);
}
@PostMapping("/{equipmentCode}/upload")
public ResponseEntity uploadAttachment(
@PathVariable String equipmentCode,
@RequestParam("file") MultipartFile file) {
String fileId = equipmentService.uploadAttachment(
equipmentCode, file);
return ResponseEntity.ok(fileId);
}
@GetMapping("/search")
public ResponseEntity> searchEquipment(
@RequestParam String keyword,
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "10") int size) {
List result = equipmentService.search(keyword, page, size);
return ResponseEntity.ok(result);
}
}
创建Vue项目并安装依赖:
npm create vue@latest equipment-archive-frontend
cd equipment-archive-frontend
npm install element-plus axios vue-router
创建设备列表组件EquipmentList.vue:
设备档案列表
新增设备
查看
编辑
创建文件上传组件FileUpload.vue:
拖拽文件到此处或点击上传
支持上传图纸、说明书、维修记录等文件,单个文件不超过100MB
创建application.yml配置文件:
server:
port: 8080
spring:
datasource:
url: jdbc:postgresql://localhost:5432/equipment_archive
username: archive_admin
password: Archive@123
driver-class-name: org.postgresql.Driver
jpa:
hibernate:
ddl-auto: update
show-sql: true
properties:
hibernate:
format_sql: true
dialect: org.hibernate.dialect.PostgreSQLDialect
minio:
endpoint: http://localhost:9000
accessKey: minioadmin
secretKey: minioadmin123
elasticsearch:
uris: http://localhost:9200
logging:
level:
com.equipment.archive: DEBUG
配置Nginx统一访问入口:
server {
listen 80;
server_name equipment-archive.local;
location /api/ {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location / {
root /var/www/equipment-archive-frontend/dist;
index index.html;
try_files $uri $uri/ /index.html;
}
}
创建启动脚本start.sh:
!/bin/bash
启动后端服务
cd backend
nohup java -jar equipment-archive-0.0.1-SNAPSHOT.jar > backend.log 2>&1 &
启动前端服务
cd ../frontend
nohup npm run dev > frontend.log 2>&1 &
echo "系统启动完成"
echo "后端服务日志: backend/backend.log"
echo "前端服务日志: frontend/frontend.log"
执行chmod +x start.sh添加执行权限,然后运行./start.sh启动系统。
创建数据导入脚本import_data.py:
import pandas as pd
import requests
import json
读取Excel格式的历史设备数据
df = pd.read_excel('historical_equipment.xlsx')
base_url = 'http://localhost:8080/api/equipment'
for _, row in df.iterrows():
equipment_data = {
'equipmentCode': str(row['设备编码']),
'equipmentName': row['设备名称'],
'equipmentType': row['设备类型'],
'specifications': json.dumps({
'功率': row['功率'],
'转速': row['转速'],
'电压': row['电压']
}),
'purchaseDate': row['购置日期'].strftime('%Y-%m-%d'),
'manufacturer': row['生产厂家']
}
response = requests.post(base_url, json=equipment_data)
if response.status_code == 200:
print(f"导入成功: {row['设备编码']}")
else:
print(f"导入失败: {row['设备编码']} - {response.text}")
执行SQL脚本创建管理员用户:
INSERT INTO users (username, password, role, created_at)
VALUES (
'admin',
'$2a$10$YourHashedPasswordHere',
'ADMIN',
NOW()
);
-- 创建权限表
CREATE TABLE permissions (
id SERIAL PRIMARY KEY,
user_id INTEGER REFERENCES users(id),
equipment_type VARCHAR(50),
can_view BOOLEAN DEFAULT true,
can_edit BOOLEAN DEFAULT false,
can_delete BOOLEAN DEFAULT false
);
-- 为管理员分配全部权限
INSERT INTO permissions (user_id, equipment_type, can_view, can_edit, can_delete)
VALUES (1, 'ALL', true, true, true);
配置Logback日志系统:
logs/equipment-archive.log
logs/equipment-archive.%d{yyyy-MM-dd}.log
30
%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n