diff --git a/pom.xml b/pom.xml index 6f815ab..1c6ccd6 100644 --- a/pom.xml +++ b/pom.xml @@ -125,6 +125,13 @@ spring-boot-starter-test test + + + org.dromara.x-file-storage + x-file-storage-spring + 2.3.0 + + diff --git a/src/main/java/com/yupi/springbootinit/controller/FileController.java b/src/main/java/com/yupi/springbootinit/controller/FileController.java new file mode 100644 index 0000000..5618df2 --- /dev/null +++ b/src/main/java/com/yupi/springbootinit/controller/FileController.java @@ -0,0 +1,33 @@ +package com.yupi.springbootinit.controller; + +/* + * @author: ziin + * @date: 2025/8/25 13:36 + */ + +import com.yupi.springbootinit.common.BaseResponse; +import com.yupi.springbootinit.common.ResultUtils; +import com.yupi.springbootinit.service.ServerAiLogService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; + +@RestController +@RequestMapping("/log") +@Slf4j +@CrossOrigin +public class FileController { + + @Resource + private ServerAiLogService serverAiLogService; + + @PostMapping("upload") + public BaseResponse upload(@RequestParam("file") MultipartFile file, + @RequestParam Long tenantId, + @RequestParam Long userId) { + return ResultUtils.success(serverAiLogService.saveLog(file,tenantId,userId)); + + } +} diff --git a/src/main/java/com/yupi/springbootinit/mapper/ServerAiLogMapper.java b/src/main/java/com/yupi/springbootinit/mapper/ServerAiLogMapper.java new file mode 100644 index 0000000..f5aee03 --- /dev/null +++ b/src/main/java/com/yupi/springbootinit/mapper/ServerAiLogMapper.java @@ -0,0 +1,12 @@ +package com.yupi.springbootinit.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yupi.springbootinit.model.entity.ServerAiLog; + +/* +* @author: ziin +* @date: 2025/8/25 13:37 +*/ + +public interface ServerAiLogMapper extends BaseMapper { +} \ No newline at end of file diff --git a/src/main/java/com/yupi/springbootinit/model/dto/file/FileDTO.java b/src/main/java/com/yupi/springbootinit/model/dto/file/FileDTO.java new file mode 100644 index 0000000..30945c2 --- /dev/null +++ b/src/main/java/com/yupi/springbootinit/model/dto/file/FileDTO.java @@ -0,0 +1,32 @@ +package com.yupi.springbootinit.model.dto.file; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.web.multipart.MultipartFile; + +/* + * @author: ziin + * @date: 2025/8/25 14:32 + */ +@Data +public class FileDTO { + /** + * 日志租户 + */ + @TableField(value = "log_tenant_id") + @ApiModelProperty(value="日志租户") + private Long logTenantId; + + /** + * 用户 Id + */ + @TableField(value = "log_user_id") + @ApiModelProperty(value="用户 Id") + private Long logUserId; + + @ApiModelProperty(value="日志文件") + private MultipartFile file; +} diff --git a/src/main/java/com/yupi/springbootinit/model/entity/ServerAiLog.java b/src/main/java/com/yupi/springbootinit/model/entity/ServerAiLog.java new file mode 100644 index 0000000..2706e6e --- /dev/null +++ b/src/main/java/com/yupi/springbootinit/model/entity/ServerAiLog.java @@ -0,0 +1,71 @@ +package com.yupi.springbootinit.model.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 io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.Date; +import lombok.Data; + +/* +* @author: ziin +* @date: 2025/8/25 13:37 +*/ + +@ApiModel(description="server_ai_log") +@Data +@TableName(value = "server_ai_log") +public class ServerAiLog { + /** + * 日志主键 + */ + @TableId(value = "log_id", type = IdType.AUTO) + @ApiModelProperty(value="日志主键") + private Long logId; + + /** + * 日志主键 + */ + @TableField(value = "log_name") + @ApiModelProperty(value="日志主键") + private String logName; + + /** + * 日志路径 + */ + @TableField(value = "log_file_path") + @ApiModelProperty(value="日志路径") + private String logFilePath; + + /** + * 日志租户 + */ + @TableField(value = "log_tenant_id") + @ApiModelProperty(value="日志租户") + private Long logTenantId; + + /** + * 用户 Id + */ + @TableField(value = "log_user_id") + @ApiModelProperty(value="用户 Id") + private Long logUserId; + + @TableField(value = "creator") + @ApiModelProperty(value="") + private String creator; + + @TableField(value = "create_time") + @ApiModelProperty(value="") + private Date createTime; + + @TableField(value = "updater") + @ApiModelProperty(value="") + private String updater; + + @TableField(value = "update_time") + @ApiModelProperty(value="") + private Date updateTime; +} \ No newline at end of file diff --git a/src/main/java/com/yupi/springbootinit/service/ServerAiLogService.java b/src/main/java/com/yupi/springbootinit/service/ServerAiLogService.java new file mode 100644 index 0000000..4583f0c --- /dev/null +++ b/src/main/java/com/yupi/springbootinit/service/ServerAiLogService.java @@ -0,0 +1,15 @@ +package com.yupi.springbootinit.service; + +import com.yupi.springbootinit.model.entity.ServerAiLog; +import com.baomidou.mybatisplus.extension.service.IService; +import org.springframework.web.multipart.MultipartFile; +/* +* @author: ziin +* @date: 2025/8/25 13:37 +*/ + +public interface ServerAiLogService extends IService{ + + + Boolean saveLog(MultipartFile file, Long tenantId, Long userId); +} diff --git a/src/main/java/com/yupi/springbootinit/service/impl/ServerAiLogServiceImpl.java b/src/main/java/com/yupi/springbootinit/service/impl/ServerAiLogServiceImpl.java new file mode 100644 index 0000000..c479d85 --- /dev/null +++ b/src/main/java/com/yupi/springbootinit/service/impl/ServerAiLogServiceImpl.java @@ -0,0 +1,70 @@ +package com.yupi.springbootinit.service.impl; + +import com.yupi.springbootinit.common.ErrorCode; +import com.yupi.springbootinit.exception.BusinessException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.time.LocalDateTime; +import java.util.List; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yupi.springbootinit.mapper.ServerAiLogMapper; +import com.yupi.springbootinit.model.entity.ServerAiLog; +import com.yupi.springbootinit.service.ServerAiLogService; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +/* +* @author: ziin +* @date: 2025/8/25 13:37 +*/ + +@Service +@Slf4j +public class ServerAiLogServiceImpl extends ServiceImpl implements ServerAiLogService{ + + @Resource + private ServerAiLogMapper serverAiLogMapper; + + @Value("${ai_log_path}") + private String basePath; + + @Override + public Boolean saveLog(MultipartFile file, Long tenantId, Long userId) { + + if (file.isEmpty()) { + throw new BusinessException(ErrorCode.SYSTEM_ERROR,"上传文件为空"); + } + Path dir = Paths.get(basePath, tenantId.toString(), userId.toString()); + if (!Files.exists(dir)) { + try { + Files.createDirectories(dir); + } catch (IOException e) { + throw new BusinessException(ErrorCode.SYSTEM_ERROR,"创建目录失败"); + } + } + String originalFilename = file.getOriginalFilename(); + Path target = dir.resolve(originalFilename); + try { + Files.copy(file.getInputStream(), target, StandardCopyOption.REPLACE_EXISTING); + log.info("文件名{},文件上传路径{},",originalFilename,target); + } catch (IOException e) { + throw new BusinessException(ErrorCode.SYSTEM_ERROR,"保存文件失败"); + } + ServerAiLog log = new ServerAiLog(); + log.setLogName(originalFilename); + log.setLogFilePath(target.toString()); + log.setLogTenantId(tenantId); + log.setLogUserId(userId); + log.setCreator(String.valueOf(userId)); // 可替换为当前登录用户 + return serverAiLogMapper.insert(log) == 1; + + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 70858ec..1ec2cbc 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -109,4 +109,4 @@ sa-token: md5: salt: (-FhqvXO,wMz -ai_log_path: /test/ai_log/ \ No newline at end of file +ai_log_path: /test/ai_log \ No newline at end of file diff --git a/src/main/resources/mapper/ServerAiLogMapper.xml b/src/main/resources/mapper/ServerAiLogMapper.xml new file mode 100644 index 0000000..8bce4af --- /dev/null +++ b/src/main/resources/mapper/ServerAiLogMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + log_id, log_name, log_file_path, log_tenant_id, log_user_id, creator, create_time, + updater, update_time + + \ No newline at end of file diff --git a/src/test/java/com/yupi/springbootinit/MainApplicationTests.java b/src/test/java/com/yupi/springbootinit/MainApplicationTests.java index c1133bf..ddb130b 100644 --- a/src/test/java/com/yupi/springbootinit/MainApplicationTests.java +++ b/src/test/java/com/yupi/springbootinit/MainApplicationTests.java @@ -10,7 +10,8 @@ import org.springframework.boot.test.context.SpringBootTest; * @from 编程导航知识星球 */ @SpringBootTest -class MainApplicationTests { +class +MainApplicationTests { @Test void contextLoads() {