From aa82db6b15c7e3892b2ef6dd2744cc27f4e1110c Mon Sep 17 00:00:00 2001
From: mangmang <362165265@qq.com>
Date: Sun, 15 Mar 2026 19:54:06 +0800
Subject: [PATCH] feat: initialize Spring Boot infrastructure project
---
.gitignore | 7 +
pom.xml | 80 +++++++++
.../MusicMetadataSystemApplication.java | 14 ++
.../metadata/common/api/ApiResponse.java | 59 +++++++
.../common/exception/BusinessException.java | 20 +++
.../handler/GlobalExceptionHandler.java | 25 +++
.../infrastructure/entity/FailFileEntity.java | 156 ++++++++++++++++
.../entity/FileProcessEntity.java | 167 ++++++++++++++++++
.../entity/ProcessTaskEntity.java | 167 ++++++++++++++++++
.../entity/SystemConfigEntity.java | 101 +++++++++++
.../infrastructure/mapper/FailFileMapper.java | 9 +
.../mapper/FileProcessMapper.java | 9 +
.../mapper/ProcessTaskMapper.java | 9 +
.../mapper/SystemConfigMapper.java | 9 +
.../metadata/service/FailFileService.java | 19 ++
.../metadata/service/FileProcessService.java | 19 ++
.../metadata/service/ProcessTaskService.java | 19 ++
.../metadata/service/SystemConfigService.java | 19 ++
.../service/impl/FailFileServiceImpl.java | 38 ++++
.../service/impl/FileProcessServiceImpl.java | 38 ++++
.../service/impl/ProcessTaskServiceImpl.java | 38 ++++
.../service/impl/SystemConfigServiceImpl.java | 38 ++++
src/main/resources/application.yml | 34 ++++
src/main/resources/schema.sql | 65 +++++++
24 files changed, 1159 insertions(+)
create mode 100644 .gitignore
create mode 100644 pom.xml
create mode 100644 src/main/java/com/music/metadata/MusicMetadataSystemApplication.java
create mode 100644 src/main/java/com/music/metadata/common/api/ApiResponse.java
create mode 100644 src/main/java/com/music/metadata/common/exception/BusinessException.java
create mode 100644 src/main/java/com/music/metadata/common/handler/GlobalExceptionHandler.java
create mode 100644 src/main/java/com/music/metadata/infrastructure/entity/FailFileEntity.java
create mode 100644 src/main/java/com/music/metadata/infrastructure/entity/FileProcessEntity.java
create mode 100644 src/main/java/com/music/metadata/infrastructure/entity/ProcessTaskEntity.java
create mode 100644 src/main/java/com/music/metadata/infrastructure/entity/SystemConfigEntity.java
create mode 100644 src/main/java/com/music/metadata/infrastructure/mapper/FailFileMapper.java
create mode 100644 src/main/java/com/music/metadata/infrastructure/mapper/FileProcessMapper.java
create mode 100644 src/main/java/com/music/metadata/infrastructure/mapper/ProcessTaskMapper.java
create mode 100644 src/main/java/com/music/metadata/infrastructure/mapper/SystemConfigMapper.java
create mode 100644 src/main/java/com/music/metadata/service/FailFileService.java
create mode 100644 src/main/java/com/music/metadata/service/FileProcessService.java
create mode 100644 src/main/java/com/music/metadata/service/ProcessTaskService.java
create mode 100644 src/main/java/com/music/metadata/service/SystemConfigService.java
create mode 100644 src/main/java/com/music/metadata/service/impl/FailFileServiceImpl.java
create mode 100644 src/main/java/com/music/metadata/service/impl/FileProcessServiceImpl.java
create mode 100644 src/main/java/com/music/metadata/service/impl/ProcessTaskServiceImpl.java
create mode 100644 src/main/java/com/music/metadata/service/impl/SystemConfigServiceImpl.java
create mode 100644 src/main/resources/application.yml
create mode 100644 src/main/resources/schema.sql
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..edb8944
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,7 @@
+target/
+.idea/
+.classpath
+.project
+.settings/
+*.log
+data/
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..d809082
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,80 @@
+
+
+ 4.0.0
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 3.2.6
+
+
+
+ com.music
+ music-metadata-system
+ 1.0.0
+ music-metadata-system
+ Music metadata normalization and archiving infrastructure
+
+
+ 21
+ 3.5.7
+ 0.10.2
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ com.baomidou
+ mybatis-plus-spring-boot3-starter
+ ${mybatis-plus.version}
+
+
+
+ com.h2database
+ h2
+ 2.2.224
+ runtime
+
+
+
+ org.springframework.boot
+ spring-boot-starter-validation
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ org.graalvm.buildtools
+ native-maven-plugin
+ ${graalvm.native.buildtools.version}
+ true
+
+
+ build-native
+
+ compile-no-fork
+
+
+
+
+
+
+
diff --git a/src/main/java/com/music/metadata/MusicMetadataSystemApplication.java b/src/main/java/com/music/metadata/MusicMetadataSystemApplication.java
new file mode 100644
index 0000000..6a02c54
--- /dev/null
+++ b/src/main/java/com/music/metadata/MusicMetadataSystemApplication.java
@@ -0,0 +1,14 @@
+package com.music.metadata;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication(proxyBeanMethods = false)
+@MapperScan("com.music.metadata.infrastructure.mapper")
+public class MusicMetadataSystemApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(MusicMetadataSystemApplication.class, args);
+ }
+}
diff --git a/src/main/java/com/music/metadata/common/api/ApiResponse.java b/src/main/java/com/music/metadata/common/api/ApiResponse.java
new file mode 100644
index 0000000..2976075
--- /dev/null
+++ b/src/main/java/com/music/metadata/common/api/ApiResponse.java
@@ -0,0 +1,59 @@
+package com.music.metadata.common.api;
+
+public class ApiResponse {
+
+ private Integer code;
+ private String message;
+ private T data;
+ private Long timestamp;
+
+ public ApiResponse() {
+ }
+
+ public ApiResponse(Integer code, String message, T data, Long timestamp) {
+ this.code = code;
+ this.message = message;
+ this.data = data;
+ this.timestamp = timestamp;
+ }
+
+ public static ApiResponse success(T data) {
+ return new ApiResponse<>(200, "操作成功", data, System.currentTimeMillis());
+ }
+
+ public static ApiResponse fail(Integer code, String message) {
+ return new ApiResponse<>(code, message, null, System.currentTimeMillis());
+ }
+
+ public Integer getCode() {
+ return code;
+ }
+
+ public void setCode(Integer code) {
+ this.code = code;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public T getData() {
+ return data;
+ }
+
+ public void setData(T data) {
+ this.data = data;
+ }
+
+ public Long getTimestamp() {
+ return timestamp;
+ }
+
+ public void setTimestamp(Long timestamp) {
+ this.timestamp = timestamp;
+ }
+}
diff --git a/src/main/java/com/music/metadata/common/exception/BusinessException.java b/src/main/java/com/music/metadata/common/exception/BusinessException.java
new file mode 100644
index 0000000..1f941c1
--- /dev/null
+++ b/src/main/java/com/music/metadata/common/exception/BusinessException.java
@@ -0,0 +1,20 @@
+package com.music.metadata.common.exception;
+
+public class BusinessException extends RuntimeException {
+
+ private final Integer code;
+
+ public BusinessException(String message) {
+ super(message);
+ this.code = 400;
+ }
+
+ public BusinessException(Integer code, String message) {
+ super(message);
+ this.code = code;
+ }
+
+ public Integer getCode() {
+ return code;
+ }
+}
diff --git a/src/main/java/com/music/metadata/common/handler/GlobalExceptionHandler.java b/src/main/java/com/music/metadata/common/handler/GlobalExceptionHandler.java
new file mode 100644
index 0000000..ae4561b
--- /dev/null
+++ b/src/main/java/com/music/metadata/common/handler/GlobalExceptionHandler.java
@@ -0,0 +1,25 @@
+package com.music.metadata.common.handler;
+
+import com.music.metadata.common.api.ApiResponse;
+import com.music.metadata.common.exception.BusinessException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+@RestControllerAdvice
+public class GlobalExceptionHandler {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(GlobalExceptionHandler.class);
+
+ @ExceptionHandler(BusinessException.class)
+ public ApiResponse handleBusinessException(BusinessException ex) {
+ return ApiResponse.fail(ex.getCode(), ex.getMessage());
+ }
+
+ @ExceptionHandler(Exception.class)
+ public ApiResponse handleException(Exception ex) {
+ LOGGER.error("System exception", ex);
+ return ApiResponse.fail(500, "系统异常,请稍后重试");
+ }
+}
diff --git a/src/main/java/com/music/metadata/infrastructure/entity/FailFileEntity.java b/src/main/java/com/music/metadata/infrastructure/entity/FailFileEntity.java
new file mode 100644
index 0000000..5b69160
--- /dev/null
+++ b/src/main/java/com/music/metadata/infrastructure/entity/FailFileEntity.java
@@ -0,0 +1,156 @@
+package com.music.metadata.infrastructure.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+@TableName("t_fail_file")
+public class FailFileEntity implements Serializable {
+
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ @TableField("file_process_id")
+ private Long fileProcessId;
+
+ @TableField("file_hash")
+ private String fileHash;
+
+ @TableField("source_file_path")
+ private String sourceFilePath;
+
+ @TableField("file_name")
+ private String fileName;
+
+ @TableField("fail_type")
+ private String failType;
+
+ @TableField("fail_detail")
+ private String failDetail;
+
+ @TableField("raw_metadata")
+ private String rawMetadata;
+
+ @TableField("edit_metadata")
+ private String editMetadata;
+
+ @TableField("status")
+ private String status;
+
+ @TableField("created_at")
+ private LocalDateTime createdAt;
+
+ @TableField("updated_at")
+ private LocalDateTime updatedAt;
+
+ @TableField("resolved_at")
+ private LocalDateTime resolvedAt;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Long getFileProcessId() {
+ return fileProcessId;
+ }
+
+ public void setFileProcessId(Long fileProcessId) {
+ this.fileProcessId = fileProcessId;
+ }
+
+ public String getFileHash() {
+ return fileHash;
+ }
+
+ public void setFileHash(String fileHash) {
+ this.fileHash = fileHash;
+ }
+
+ public String getSourceFilePath() {
+ return sourceFilePath;
+ }
+
+ public void setSourceFilePath(String sourceFilePath) {
+ this.sourceFilePath = sourceFilePath;
+ }
+
+ public String getFileName() {
+ return fileName;
+ }
+
+ public void setFileName(String fileName) {
+ this.fileName = fileName;
+ }
+
+ public String getFailType() {
+ return failType;
+ }
+
+ public void setFailType(String failType) {
+ this.failType = failType;
+ }
+
+ public String getFailDetail() {
+ return failDetail;
+ }
+
+ public void setFailDetail(String failDetail) {
+ this.failDetail = failDetail;
+ }
+
+ public String getRawMetadata() {
+ return rawMetadata;
+ }
+
+ public void setRawMetadata(String rawMetadata) {
+ this.rawMetadata = rawMetadata;
+ }
+
+ public String getEditMetadata() {
+ return editMetadata;
+ }
+
+ public void setEditMetadata(String editMetadata) {
+ this.editMetadata = editMetadata;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ public LocalDateTime getCreatedAt() {
+ return createdAt;
+ }
+
+ public void setCreatedAt(LocalDateTime createdAt) {
+ this.createdAt = createdAt;
+ }
+
+ public LocalDateTime getUpdatedAt() {
+ return updatedAt;
+ }
+
+ public void setUpdatedAt(LocalDateTime updatedAt) {
+ this.updatedAt = updatedAt;
+ }
+
+ public LocalDateTime getResolvedAt() {
+ return resolvedAt;
+ }
+
+ public void setResolvedAt(LocalDateTime resolvedAt) {
+ this.resolvedAt = resolvedAt;
+ }
+}
diff --git a/src/main/java/com/music/metadata/infrastructure/entity/FileProcessEntity.java b/src/main/java/com/music/metadata/infrastructure/entity/FileProcessEntity.java
new file mode 100644
index 0000000..75363c5
--- /dev/null
+++ b/src/main/java/com/music/metadata/infrastructure/entity/FileProcessEntity.java
@@ -0,0 +1,167 @@
+package com.music.metadata.infrastructure.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+@TableName("t_file_process")
+public class FileProcessEntity implements Serializable {
+
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ @TableField("file_hash")
+ private String fileHash;
+
+ @TableField("source_file_path")
+ private String sourceFilePath;
+
+ @TableField("source_file_name")
+ private String sourceFileName;
+
+ @TableField("file_extension")
+ private String fileExtension;
+
+ @TableField("file_size")
+ private Long fileSize;
+
+ @TableField("audio_duration")
+ private Integer audioDuration;
+
+ @TableField("raw_metadata")
+ private String rawMetadata;
+
+ @TableField("process_status")
+ private String processStatus;
+
+ @TableField("fail_reason")
+ private String failReason;
+
+ @TableField("target_file_path")
+ private String targetFilePath;
+
+ @TableField("task_id")
+ private Long taskId;
+
+ @TableField("created_at")
+ private LocalDateTime createdAt;
+
+ @TableField("updated_at")
+ private LocalDateTime updatedAt;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getFileHash() {
+ return fileHash;
+ }
+
+ public void setFileHash(String fileHash) {
+ this.fileHash = fileHash;
+ }
+
+ public String getSourceFilePath() {
+ return sourceFilePath;
+ }
+
+ public void setSourceFilePath(String sourceFilePath) {
+ this.sourceFilePath = sourceFilePath;
+ }
+
+ public String getSourceFileName() {
+ return sourceFileName;
+ }
+
+ public void setSourceFileName(String sourceFileName) {
+ this.sourceFileName = sourceFileName;
+ }
+
+ public String getFileExtension() {
+ return fileExtension;
+ }
+
+ public void setFileExtension(String fileExtension) {
+ this.fileExtension = fileExtension;
+ }
+
+ public Long getFileSize() {
+ return fileSize;
+ }
+
+ public void setFileSize(Long fileSize) {
+ this.fileSize = fileSize;
+ }
+
+ public Integer getAudioDuration() {
+ return audioDuration;
+ }
+
+ public void setAudioDuration(Integer audioDuration) {
+ this.audioDuration = audioDuration;
+ }
+
+ public String getRawMetadata() {
+ return rawMetadata;
+ }
+
+ public void setRawMetadata(String rawMetadata) {
+ this.rawMetadata = rawMetadata;
+ }
+
+ public String getProcessStatus() {
+ return processStatus;
+ }
+
+ public void setProcessStatus(String processStatus) {
+ this.processStatus = processStatus;
+ }
+
+ public String getFailReason() {
+ return failReason;
+ }
+
+ public void setFailReason(String failReason) {
+ this.failReason = failReason;
+ }
+
+ public String getTargetFilePath() {
+ return targetFilePath;
+ }
+
+ public void setTargetFilePath(String targetFilePath) {
+ this.targetFilePath = targetFilePath;
+ }
+
+ public Long getTaskId() {
+ return taskId;
+ }
+
+ public void setTaskId(Long taskId) {
+ this.taskId = taskId;
+ }
+
+ public LocalDateTime getCreatedAt() {
+ return createdAt;
+ }
+
+ public void setCreatedAt(LocalDateTime createdAt) {
+ this.createdAt = createdAt;
+ }
+
+ public LocalDateTime getUpdatedAt() {
+ return updatedAt;
+ }
+
+ public void setUpdatedAt(LocalDateTime updatedAt) {
+ this.updatedAt = updatedAt;
+ }
+}
diff --git a/src/main/java/com/music/metadata/infrastructure/entity/ProcessTaskEntity.java b/src/main/java/com/music/metadata/infrastructure/entity/ProcessTaskEntity.java
new file mode 100644
index 0000000..71b2613
--- /dev/null
+++ b/src/main/java/com/music/metadata/infrastructure/entity/ProcessTaskEntity.java
@@ -0,0 +1,167 @@
+package com.music.metadata.infrastructure.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+@TableName("t_process_task")
+public class ProcessTaskEntity implements Serializable {
+
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ @TableField("task_name")
+ private String taskName;
+
+ @TableField("task_type")
+ private String taskType;
+
+ @TableField("source_path")
+ private String sourcePath;
+
+ @TableField("total_file_count")
+ private Integer totalFileCount;
+
+ @TableField("processed_count")
+ private Integer processedCount;
+
+ @TableField("success_count")
+ private Integer successCount;
+
+ @TableField("fail_count")
+ private Integer failCount;
+
+ @TableField("duplicate_count")
+ private Integer duplicateCount;
+
+ @TableField("task_status")
+ private String taskStatus;
+
+ @TableField("start_time")
+ private LocalDateTime startTime;
+
+ @TableField("end_time")
+ private LocalDateTime endTime;
+
+ @TableField("created_by")
+ private String createdBy;
+
+ @TableField("remark")
+ private String remark;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getTaskName() {
+ return taskName;
+ }
+
+ public void setTaskName(String taskName) {
+ this.taskName = taskName;
+ }
+
+ public String getTaskType() {
+ return taskType;
+ }
+
+ public void setTaskType(String taskType) {
+ this.taskType = taskType;
+ }
+
+ public String getSourcePath() {
+ return sourcePath;
+ }
+
+ public void setSourcePath(String sourcePath) {
+ this.sourcePath = sourcePath;
+ }
+
+ public Integer getTotalFileCount() {
+ return totalFileCount;
+ }
+
+ public void setTotalFileCount(Integer totalFileCount) {
+ this.totalFileCount = totalFileCount;
+ }
+
+ public Integer getProcessedCount() {
+ return processedCount;
+ }
+
+ public void setProcessedCount(Integer processedCount) {
+ this.processedCount = processedCount;
+ }
+
+ public Integer getSuccessCount() {
+ return successCount;
+ }
+
+ public void setSuccessCount(Integer successCount) {
+ this.successCount = successCount;
+ }
+
+ public Integer getFailCount() {
+ return failCount;
+ }
+
+ public void setFailCount(Integer failCount) {
+ this.failCount = failCount;
+ }
+
+ public Integer getDuplicateCount() {
+ return duplicateCount;
+ }
+
+ public void setDuplicateCount(Integer duplicateCount) {
+ this.duplicateCount = duplicateCount;
+ }
+
+ public String getTaskStatus() {
+ return taskStatus;
+ }
+
+ public void setTaskStatus(String taskStatus) {
+ this.taskStatus = taskStatus;
+ }
+
+ public LocalDateTime getStartTime() {
+ return startTime;
+ }
+
+ public void setStartTime(LocalDateTime startTime) {
+ this.startTime = startTime;
+ }
+
+ public LocalDateTime getEndTime() {
+ return endTime;
+ }
+
+ public void setEndTime(LocalDateTime endTime) {
+ this.endTime = endTime;
+ }
+
+ public String getCreatedBy() {
+ return createdBy;
+ }
+
+ public void setCreatedBy(String createdBy) {
+ this.createdBy = createdBy;
+ }
+
+ public String getRemark() {
+ return remark;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+}
diff --git a/src/main/java/com/music/metadata/infrastructure/entity/SystemConfigEntity.java b/src/main/java/com/music/metadata/infrastructure/entity/SystemConfigEntity.java
new file mode 100644
index 0000000..8c4fa7f
--- /dev/null
+++ b/src/main/java/com/music/metadata/infrastructure/entity/SystemConfigEntity.java
@@ -0,0 +1,101 @@
+package com.music.metadata.infrastructure.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+@TableName("t_system_config")
+public class SystemConfigEntity implements Serializable {
+
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ @TableField("config_key")
+ private String configKey;
+
+ @TableField("config_value")
+ private String configValue;
+
+ @TableField("config_name")
+ private String configName;
+
+ @TableField("config_desc")
+ private String configDesc;
+
+ @TableField("is_editable")
+ private Integer isEditable;
+
+ @TableField("created_at")
+ private LocalDateTime createdAt;
+
+ @TableField("updated_at")
+ private LocalDateTime updatedAt;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getConfigKey() {
+ return configKey;
+ }
+
+ public void setConfigKey(String configKey) {
+ this.configKey = configKey;
+ }
+
+ public String getConfigValue() {
+ return configValue;
+ }
+
+ public void setConfigValue(String configValue) {
+ this.configValue = configValue;
+ }
+
+ public String getConfigName() {
+ return configName;
+ }
+
+ public void setConfigName(String configName) {
+ this.configName = configName;
+ }
+
+ public String getConfigDesc() {
+ return configDesc;
+ }
+
+ public void setConfigDesc(String configDesc) {
+ this.configDesc = configDesc;
+ }
+
+ public Integer getIsEditable() {
+ return isEditable;
+ }
+
+ public void setIsEditable(Integer isEditable) {
+ this.isEditable = isEditable;
+ }
+
+ public LocalDateTime getCreatedAt() {
+ return createdAt;
+ }
+
+ public void setCreatedAt(LocalDateTime createdAt) {
+ this.createdAt = createdAt;
+ }
+
+ public LocalDateTime getUpdatedAt() {
+ return updatedAt;
+ }
+
+ public void setUpdatedAt(LocalDateTime updatedAt) {
+ this.updatedAt = updatedAt;
+ }
+}
diff --git a/src/main/java/com/music/metadata/infrastructure/mapper/FailFileMapper.java b/src/main/java/com/music/metadata/infrastructure/mapper/FailFileMapper.java
new file mode 100644
index 0000000..1c45888
--- /dev/null
+++ b/src/main/java/com/music/metadata/infrastructure/mapper/FailFileMapper.java
@@ -0,0 +1,9 @@
+package com.music.metadata.infrastructure.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.music.metadata.infrastructure.entity.FailFileEntity;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface FailFileMapper extends BaseMapper {
+}
diff --git a/src/main/java/com/music/metadata/infrastructure/mapper/FileProcessMapper.java b/src/main/java/com/music/metadata/infrastructure/mapper/FileProcessMapper.java
new file mode 100644
index 0000000..8601dc3
--- /dev/null
+++ b/src/main/java/com/music/metadata/infrastructure/mapper/FileProcessMapper.java
@@ -0,0 +1,9 @@
+package com.music.metadata.infrastructure.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.music.metadata.infrastructure.entity.FileProcessEntity;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface FileProcessMapper extends BaseMapper {
+}
diff --git a/src/main/java/com/music/metadata/infrastructure/mapper/ProcessTaskMapper.java b/src/main/java/com/music/metadata/infrastructure/mapper/ProcessTaskMapper.java
new file mode 100644
index 0000000..522f30d
--- /dev/null
+++ b/src/main/java/com/music/metadata/infrastructure/mapper/ProcessTaskMapper.java
@@ -0,0 +1,9 @@
+package com.music.metadata.infrastructure.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.music.metadata.infrastructure.entity.ProcessTaskEntity;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface ProcessTaskMapper extends BaseMapper {
+}
diff --git a/src/main/java/com/music/metadata/infrastructure/mapper/SystemConfigMapper.java b/src/main/java/com/music/metadata/infrastructure/mapper/SystemConfigMapper.java
new file mode 100644
index 0000000..495ff4a
--- /dev/null
+++ b/src/main/java/com/music/metadata/infrastructure/mapper/SystemConfigMapper.java
@@ -0,0 +1,9 @@
+package com.music.metadata.infrastructure.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.music.metadata.infrastructure.entity.SystemConfigEntity;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface SystemConfigMapper extends BaseMapper {
+}
diff --git a/src/main/java/com/music/metadata/service/FailFileService.java b/src/main/java/com/music/metadata/service/FailFileService.java
new file mode 100644
index 0000000..3a7cd43
--- /dev/null
+++ b/src/main/java/com/music/metadata/service/FailFileService.java
@@ -0,0 +1,19 @@
+package com.music.metadata.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.music.metadata.infrastructure.entity.FailFileEntity;
+
+import java.util.List;
+
+public interface FailFileService extends IService {
+
+ boolean create(FailFileEntity entity);
+
+ boolean update(FailFileEntity entity);
+
+ boolean deleteById(Long id);
+
+ FailFileEntity findById(Long id);
+
+ List findAll();
+}
diff --git a/src/main/java/com/music/metadata/service/FileProcessService.java b/src/main/java/com/music/metadata/service/FileProcessService.java
new file mode 100644
index 0000000..0f4d92e
--- /dev/null
+++ b/src/main/java/com/music/metadata/service/FileProcessService.java
@@ -0,0 +1,19 @@
+package com.music.metadata.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.music.metadata.infrastructure.entity.FileProcessEntity;
+
+import java.util.List;
+
+public interface FileProcessService extends IService {
+
+ boolean create(FileProcessEntity entity);
+
+ boolean update(FileProcessEntity entity);
+
+ boolean deleteById(Long id);
+
+ FileProcessEntity findById(Long id);
+
+ List findAll();
+}
diff --git a/src/main/java/com/music/metadata/service/ProcessTaskService.java b/src/main/java/com/music/metadata/service/ProcessTaskService.java
new file mode 100644
index 0000000..0df59bd
--- /dev/null
+++ b/src/main/java/com/music/metadata/service/ProcessTaskService.java
@@ -0,0 +1,19 @@
+package com.music.metadata.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.music.metadata.infrastructure.entity.ProcessTaskEntity;
+
+import java.util.List;
+
+public interface ProcessTaskService extends IService {
+
+ boolean create(ProcessTaskEntity entity);
+
+ boolean update(ProcessTaskEntity entity);
+
+ boolean deleteById(Long id);
+
+ ProcessTaskEntity findById(Long id);
+
+ List findAll();
+}
diff --git a/src/main/java/com/music/metadata/service/SystemConfigService.java b/src/main/java/com/music/metadata/service/SystemConfigService.java
new file mode 100644
index 0000000..cba3c6a
--- /dev/null
+++ b/src/main/java/com/music/metadata/service/SystemConfigService.java
@@ -0,0 +1,19 @@
+package com.music.metadata.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.music.metadata.infrastructure.entity.SystemConfigEntity;
+
+import java.util.List;
+
+public interface SystemConfigService extends IService {
+
+ boolean create(SystemConfigEntity entity);
+
+ boolean update(SystemConfigEntity entity);
+
+ boolean deleteById(Long id);
+
+ SystemConfigEntity findById(Long id);
+
+ List findAll();
+}
diff --git a/src/main/java/com/music/metadata/service/impl/FailFileServiceImpl.java b/src/main/java/com/music/metadata/service/impl/FailFileServiceImpl.java
new file mode 100644
index 0000000..5855d2c
--- /dev/null
+++ b/src/main/java/com/music/metadata/service/impl/FailFileServiceImpl.java
@@ -0,0 +1,38 @@
+package com.music.metadata.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.music.metadata.infrastructure.entity.FailFileEntity;
+import com.music.metadata.infrastructure.mapper.FailFileMapper;
+import com.music.metadata.service.FailFileService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class FailFileServiceImpl extends ServiceImpl implements FailFileService {
+
+ @Override
+ public boolean create(FailFileEntity entity) {
+ return this.save(entity);
+ }
+
+ @Override
+ public boolean update(FailFileEntity entity) {
+ return this.updateById(entity);
+ }
+
+ @Override
+ public boolean deleteById(Long id) {
+ return this.removeById(id);
+ }
+
+ @Override
+ public FailFileEntity findById(Long id) {
+ return this.getById(id);
+ }
+
+ @Override
+ public List findAll() {
+ return this.list();
+ }
+}
diff --git a/src/main/java/com/music/metadata/service/impl/FileProcessServiceImpl.java b/src/main/java/com/music/metadata/service/impl/FileProcessServiceImpl.java
new file mode 100644
index 0000000..b88ed5e
--- /dev/null
+++ b/src/main/java/com/music/metadata/service/impl/FileProcessServiceImpl.java
@@ -0,0 +1,38 @@
+package com.music.metadata.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.music.metadata.infrastructure.entity.FileProcessEntity;
+import com.music.metadata.infrastructure.mapper.FileProcessMapper;
+import com.music.metadata.service.FileProcessService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class FileProcessServiceImpl extends ServiceImpl implements FileProcessService {
+
+ @Override
+ public boolean create(FileProcessEntity entity) {
+ return this.save(entity);
+ }
+
+ @Override
+ public boolean update(FileProcessEntity entity) {
+ return this.updateById(entity);
+ }
+
+ @Override
+ public boolean deleteById(Long id) {
+ return this.removeById(id);
+ }
+
+ @Override
+ public FileProcessEntity findById(Long id) {
+ return this.getById(id);
+ }
+
+ @Override
+ public List findAll() {
+ return this.list();
+ }
+}
diff --git a/src/main/java/com/music/metadata/service/impl/ProcessTaskServiceImpl.java b/src/main/java/com/music/metadata/service/impl/ProcessTaskServiceImpl.java
new file mode 100644
index 0000000..cc88261
--- /dev/null
+++ b/src/main/java/com/music/metadata/service/impl/ProcessTaskServiceImpl.java
@@ -0,0 +1,38 @@
+package com.music.metadata.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.music.metadata.infrastructure.entity.ProcessTaskEntity;
+import com.music.metadata.infrastructure.mapper.ProcessTaskMapper;
+import com.music.metadata.service.ProcessTaskService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class ProcessTaskServiceImpl extends ServiceImpl implements ProcessTaskService {
+
+ @Override
+ public boolean create(ProcessTaskEntity entity) {
+ return this.save(entity);
+ }
+
+ @Override
+ public boolean update(ProcessTaskEntity entity) {
+ return this.updateById(entity);
+ }
+
+ @Override
+ public boolean deleteById(Long id) {
+ return this.removeById(id);
+ }
+
+ @Override
+ public ProcessTaskEntity findById(Long id) {
+ return this.getById(id);
+ }
+
+ @Override
+ public List findAll() {
+ return this.list();
+ }
+}
diff --git a/src/main/java/com/music/metadata/service/impl/SystemConfigServiceImpl.java b/src/main/java/com/music/metadata/service/impl/SystemConfigServiceImpl.java
new file mode 100644
index 0000000..4193456
--- /dev/null
+++ b/src/main/java/com/music/metadata/service/impl/SystemConfigServiceImpl.java
@@ -0,0 +1,38 @@
+package com.music.metadata.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.music.metadata.infrastructure.entity.SystemConfigEntity;
+import com.music.metadata.infrastructure.mapper.SystemConfigMapper;
+import com.music.metadata.service.SystemConfigService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class SystemConfigServiceImpl extends ServiceImpl implements SystemConfigService {
+
+ @Override
+ public boolean create(SystemConfigEntity entity) {
+ return this.save(entity);
+ }
+
+ @Override
+ public boolean update(SystemConfigEntity entity) {
+ return this.updateById(entity);
+ }
+
+ @Override
+ public boolean deleteById(Long id) {
+ return this.removeById(id);
+ }
+
+ @Override
+ public SystemConfigEntity findById(Long id) {
+ return this.getById(id);
+ }
+
+ @Override
+ public List findAll() {
+ return this.list();
+ }
+}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
new file mode 100644
index 0000000..ad78b6f
--- /dev/null
+++ b/src/main/resources/application.yml
@@ -0,0 +1,34 @@
+server:
+ port: 8080
+
+spring:
+ application:
+ name: music-metadata-system
+ datasource:
+ driver-class-name: org.h2.Driver
+ url: jdbc:h2:file:./data/music_metadata_db;MODE=MYSQL;AUTO_SERVER=TRUE;DATABASE_TO_LOWER=TRUE
+ username: sa
+ password:
+ h2:
+ console:
+ enabled: true
+ path: /h2-console
+ sql:
+ init:
+ mode: always
+ schema-locations: classpath:schema.sql
+
+mybatis-plus:
+ configuration:
+ map-underscore-to-camel-case: true
+ log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+ global-config:
+ db-config:
+ id-type: auto
+
+logging:
+ level:
+ root: INFO
+ com.music.metadata: DEBUG
+ com.baomidou.mybatisplus: INFO
+ org.springframework.jdbc.datasource.init: INFO
diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql
new file mode 100644
index 0000000..2e66501
--- /dev/null
+++ b/src/main/resources/schema.sql
@@ -0,0 +1,65 @@
+CREATE TABLE IF NOT EXISTS t_process_task (
+ id BIGINT AUTO_INCREMENT PRIMARY KEY,
+ task_name VARCHAR(100) NOT NULL,
+ task_type VARCHAR(20) NOT NULL,
+ source_path VARCHAR(1000),
+ total_file_count INT NOT NULL,
+ processed_count INT NOT NULL,
+ success_count INT NOT NULL,
+ fail_count INT NOT NULL,
+ duplicate_count INT NOT NULL,
+ task_status VARCHAR(20) NOT NULL,
+ start_time DATETIME NOT NULL,
+ end_time DATETIME,
+ created_by VARCHAR(50) NOT NULL,
+ remark VARCHAR(500)
+);
+
+CREATE TABLE IF NOT EXISTS t_file_process (
+ id BIGINT AUTO_INCREMENT PRIMARY KEY,
+ file_hash VARCHAR(64) NOT NULL,
+ source_file_path VARCHAR(1000) NOT NULL,
+ source_file_name VARCHAR(200) NOT NULL,
+ file_extension VARCHAR(10) NOT NULL,
+ file_size BIGINT NOT NULL,
+ audio_duration INT,
+ raw_metadata TEXT NOT NULL,
+ process_status VARCHAR(20) NOT NULL,
+ fail_reason TEXT,
+ target_file_path VARCHAR(1000),
+ task_id BIGINT NOT NULL,
+ created_at DATETIME NOT NULL,
+ updated_at DATETIME NOT NULL,
+ CONSTRAINT uk_t_file_process_file_hash UNIQUE (file_hash),
+ CONSTRAINT fk_t_file_process_task_id FOREIGN KEY (task_id) REFERENCES t_process_task (id)
+);
+
+CREATE TABLE IF NOT EXISTS t_fail_file (
+ id BIGINT AUTO_INCREMENT PRIMARY KEY,
+ file_process_id BIGINT NOT NULL,
+ file_hash VARCHAR(64) NOT NULL,
+ source_file_path VARCHAR(1000) NOT NULL,
+ file_name VARCHAR(200) NOT NULL,
+ fail_type VARCHAR(50) NOT NULL,
+ fail_detail TEXT NOT NULL,
+ raw_metadata TEXT NOT NULL,
+ edit_metadata TEXT,
+ status VARCHAR(20) NOT NULL,
+ created_at DATETIME NOT NULL,
+ updated_at DATETIME NOT NULL,
+ resolved_at DATETIME,
+ CONSTRAINT uk_t_fail_file_file_hash UNIQUE (file_hash),
+ CONSTRAINT fk_t_fail_file_file_process_id FOREIGN KEY (file_process_id) REFERENCES t_file_process (id)
+);
+
+CREATE TABLE IF NOT EXISTS t_system_config (
+ id BIGINT AUTO_INCREMENT PRIMARY KEY,
+ config_key VARCHAR(100) NOT NULL,
+ config_value TEXT,
+ config_name VARCHAR(100) NOT NULL,
+ config_desc VARCHAR(500),
+ is_editable TINYINT NOT NULL,
+ created_at DATETIME NOT NULL,
+ updated_at DATETIME NOT NULL,
+ CONSTRAINT uk_t_system_config_config_key UNIQUE (config_key)
+);