27 changed files with 671 additions and 198 deletions
			
			
		| @ -0,0 +1,106 @@ | ||||
| package com.ruoyi.web.controller.common; | ||||
| 
 | ||||
| import java.util.List; | ||||
| import javax.servlet.http.HttpServletResponse; | ||||
| 
 | ||||
| import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | ||||
| import org.springframework.security.access.prepost.PreAuthorize; | ||||
| import org.springframework.beans.factory.annotation.Autowired; | ||||
| import org.springframework.web.bind.annotation.GetMapping; | ||||
| import org.springframework.web.bind.annotation.PostMapping; | ||||
| import org.springframework.web.bind.annotation.PutMapping; | ||||
| import org.springframework.web.bind.annotation.DeleteMapping; | ||||
| import org.springframework.web.bind.annotation.PathVariable; | ||||
| import org.springframework.web.bind.annotation.RequestBody; | ||||
| import org.springframework.web.bind.annotation.RequestMapping; | ||||
| import org.springframework.web.bind.annotation.RestController; | ||||
| import com.ruoyi.common.annotation.Log; | ||||
| import com.ruoyi.common.core.controller.BaseController; | ||||
| import com.ruoyi.common.core.domain.AjaxResult; | ||||
| import com.ruoyi.common.enums.BusinessType; | ||||
| import com.ruoyi.system.domain.FileInfo; | ||||
| import com.ruoyi.system.service.IFileInfoService; | ||||
| import com.ruoyi.common.utils.poi.ExcelUtil; | ||||
| import com.ruoyi.common.core.page.TableDataInfo; | ||||
| 
 | ||||
| /** | ||||
|  * 附件信息Controller | ||||
|  * | ||||
|  * @author ruoyi | ||||
|  * @date 2025-01-16 | ||||
|  */ | ||||
| @RestController | ||||
| @RequestMapping("/system/fileInfo") | ||||
| public class FileInfoController extends BaseController | ||||
| { | ||||
|     @Autowired | ||||
|     private IFileInfoService fileInfoService; | ||||
| 
 | ||||
|     /** | ||||
|      * 查询附件信息列表 | ||||
|      */ | ||||
|     @PreAuthorize("@ss.hasPermi('system:fileInfo:list')") | ||||
|     @GetMapping("/list") | ||||
|     public TableDataInfo list(FileInfo fileInfo) | ||||
|     { | ||||
|         startPage(); | ||||
|         List<FileInfo> list = fileInfoService.list(new QueryWrapper<FileInfo>()); | ||||
|         return getDataTable(list); | ||||
|     } | ||||
| 
 | ||||
| //    /**
 | ||||
| //     * 导出附件信息列表
 | ||||
| //     */
 | ||||
| //    @PreAuthorize("@ss.hasPermi('system:fileInfo:export')")
 | ||||
| //    @Log(title = "附件信息", businessType = BusinessType.EXPORT)
 | ||||
| //    @PostMapping("/export")
 | ||||
| //    public void export(HttpServletResponse response, FileInfo fileInfo)
 | ||||
| //    {
 | ||||
| //        List<FileInfo> list = fileInfoService.selectFileInfoList(fileInfo);
 | ||||
| //        ExcelUtil<FileInfo> util = new ExcelUtil<FileInfo>(FileInfo.class);
 | ||||
| //        util.exportExcel(response, list, "附件信息数据");
 | ||||
| //    }
 | ||||
| 
 | ||||
|     /** | ||||
|      * 获取附件信息详细信息 | ||||
|      */ | ||||
|     @PreAuthorize("@ss.hasPermi('system:fileInfo:query')") | ||||
|     @GetMapping(value = "/{id}") | ||||
|     public AjaxResult getInfo(@PathVariable("id") Long id) | ||||
|     { | ||||
|         return success(fileInfoService.getById(id)); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 新增附件信息 | ||||
|      */ | ||||
|     @PreAuthorize("@ss.hasPermi('system:fileInfo:add')") | ||||
|     @Log(title = "附件信息", businessType = BusinessType.INSERT) | ||||
|     @PostMapping | ||||
|     public AjaxResult add(@RequestBody FileInfo fileInfo) | ||||
|     { | ||||
|         return toAjax(fileInfoService.save(fileInfo)); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 修改附件信息 | ||||
|      */ | ||||
|     @PreAuthorize("@ss.hasPermi('system:fileInfo:edit')") | ||||
|     @Log(title = "附件信息", businessType = BusinessType.UPDATE) | ||||
|     @PutMapping | ||||
|     public AjaxResult edit(@RequestBody FileInfo fileInfo) | ||||
|     { | ||||
|         return toAjax(fileInfoService.updateById(fileInfo)); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 删除附件信息 | ||||
|      */ | ||||
|     @PreAuthorize("@ss.hasPermi('system:fileInfo:remove')") | ||||
|     @Log(title = "附件信息", businessType = BusinessType.DELETE) | ||||
| 	@DeleteMapping("/{ids}") | ||||
|     public AjaxResult remove(@PathVariable List<Long> ids) | ||||
|     { | ||||
|         return toAjax(fileInfoService.removeByIds(ids)); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,54 @@ | ||||
| package com.ruoyi.web.controller.common; | ||||
| 
 | ||||
| import com.ruoyi.common.utils.MinioUtils; | ||||
| import org.springframework.beans.factory.annotation.Autowired; | ||||
| import org.springframework.http.ResponseEntity; | ||||
| import org.springframework.web.bind.annotation.*; | ||||
| import org.springframework.web.multipart.MultipartFile; | ||||
| 
 | ||||
| import java.io.InputStream; | ||||
| 
 | ||||
| @RestController | ||||
| @RequestMapping("/minio") | ||||
| public class MinioController { | ||||
| 
 | ||||
| 	@Autowired | ||||
| 	private MinioUtils minioUtils; | ||||
| 
 | ||||
| 	/** | ||||
| 	 * 上传文件 | ||||
| 	 */ | ||||
| 	@PostMapping("/upload") | ||||
| 	public String  uploadFile(@RequestParam("file") MultipartFile file) { | ||||
| 		String objectName = "uploads/" + System.currentTimeMillis() + "_" + file.getOriginalFilename(); | ||||
| 
 | ||||
| 		try (InputStream inputStream = file.getInputStream()) { | ||||
| 			minioUtils.uploadFile( objectName, inputStream, file.getSize(), file.getContentType()); | ||||
| 		} catch (Exception e) { | ||||
| 			throw new RuntimeException("文件上传失败", e); | ||||
| 		} | ||||
| 
 | ||||
| 		return minioUtils.generateShortUrl(objectName); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * 下载文件 | ||||
| 	 */ | ||||
| 	@GetMapping("/download") | ||||
| 	public ResponseEntity<byte[]> downloadFile(@RequestParam("fileName") String fileName) { | ||||
| 		try { | ||||
| 			InputStream inputStream = minioUtils.downloadFile(fileName); | ||||
| 			return ResponseEntity.ok(inputStream.readAllBytes()); | ||||
| 		} catch (Exception e) { | ||||
| 			return ResponseEntity.badRequest().body(e.getMessage().getBytes()); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * 获取存储桶中的文件列表 | ||||
| 	 */ | ||||
| 	@GetMapping("/listBuckets") | ||||
| 	public ResponseEntity<?> listBuckets() { | ||||
| 		return ResponseEntity.ok(minioUtils.listBuckets()); | ||||
| 	} | ||||
| } | ||||
| @ -1,44 +0,0 @@ | ||||
| package com.ruoyi.system.controller; | ||||
| 
 | ||||
| import com.ruoyi.common.core.domain.AjaxResult; | ||||
| import com.ruoyi.system.domain.FileInfo; | ||||
| import com.ruoyi.system.service.IFileService; | ||||
| import com.ruoyi.system.utils.FileUploadUtil; | ||||
| import org.springframework.beans.factory.annotation.Autowired; | ||||
| import org.springframework.web.bind.annotation.*; | ||||
| import org.springframework.web.multipart.MultipartFile; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| import java.util.Date; | ||||
| 
 | ||||
| @RestController | ||||
| @RequestMapping("/system/file") | ||||
| public class FileInfoController { | ||||
| 
 | ||||
| 	@Autowired | ||||
| 	private FileUploadUtil fileUploadUtil; | ||||
| 
 | ||||
| 	@Autowired | ||||
| 	private IFileService fileService; | ||||
| 
 | ||||
| 	/** | ||||
| 	 * 文件上传接口 | ||||
| 	 */ | ||||
| 	@PostMapping("/upload") | ||||
| 	public AjaxResult uploadFile(@RequestParam("file") MultipartFile file) throws IOException { | ||||
| 		// 上传文件并获取访问 URL
 | ||||
| 		String fileUrl = fileUploadUtil.uploadFile(file); | ||||
| 		return AjaxResult.success("文件上传成功", fileUrl); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * 保存文件信息接口 | ||||
| 	 */ | ||||
| 	@PostMapping("/save") | ||||
| 	public AjaxResult saveFileRecord(@RequestBody FileInfo fileInfo) { | ||||
| 		fileInfo.setCreateTime(new Date()); | ||||
| 		fileService.saveFileRecord(fileInfo); | ||||
| 		return AjaxResult.success("文件信息保存成功"); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| @ -0,0 +1,87 @@ | ||||
| package com.ruoyi.common.utils; | ||||
| 
 | ||||
| import io.minio.*; | ||||
| import io.minio.http.Method; | ||||
| import io.minio.messages.Bucket; | ||||
| import org.springframework.beans.factory.annotation.Autowired; | ||||
| import org.springframework.beans.factory.annotation.Value; | ||||
| import org.springframework.stereotype.Component; | ||||
| import org.springframework.web.multipart.MultipartFile; | ||||
| 
 | ||||
| import java.io.InputStream; | ||||
| import java.util.List; | ||||
| 
 | ||||
| @Component | ||||
| public class MinioUtils { | ||||
| 
 | ||||
| 	@Autowired | ||||
| 	private MinioClient minioClient; | ||||
| 
 | ||||
| 	@Value("${minio.bucketName}") | ||||
| 	private String bucketName; | ||||
| 
 | ||||
| 	@Value("${minio.endpoint}") | ||||
| 	private String endpoint; | ||||
| 
 | ||||
| 	/** | ||||
| 	 * 上传文件 | ||||
| 	 */ | ||||
| 	public void uploadFile(String objectName, InputStream fileInputStream, long size, String contentType) throws Exception { | ||||
| 		minioClient.putObject( | ||||
| 				PutObjectArgs.builder() | ||||
| 						.bucket(bucketName) | ||||
| 						.object(objectName) | ||||
| 						.stream(fileInputStream, size, -1) | ||||
| 						.contentType(contentType) | ||||
| 						.build() | ||||
| 		); | ||||
| 	} | ||||
| 
 | ||||
| 	public String generateShortUrl(String objectName) { | ||||
| 		// 返回自定义短链接地址
 | ||||
| 		return endpoint + "/" +bucketName + "/" + objectName; | ||||
| 	} | ||||
| 
 | ||||
| 	public String generatePresignedUrl(String objectName) { | ||||
| 		try { | ||||
| 			return minioClient.getPresignedObjectUrl( | ||||
| 					GetPresignedObjectUrlArgs.builder() | ||||
| 							.bucket(bucketName) | ||||
| 							.object(objectName) | ||||
| 							.expiry(3600) // 有效期1小时
 | ||||
| 							.build() | ||||
| 			); | ||||
| 		} catch (Exception e) { | ||||
| 			throw new RuntimeException("Failed to generate presigned URL", e); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 
 | ||||
| 	/** | ||||
| 	 * 下载文件 | ||||
| 	 */ | ||||
| 	public InputStream downloadFile(String objectName) { | ||||
| 		try { | ||||
| 			return minioClient.getObject( | ||||
| 					GetObjectArgs.builder() | ||||
| 							.bucket(bucketName) | ||||
| 							.object(objectName) | ||||
| 							.build() | ||||
| 			); | ||||
| 		} catch (Exception e) { | ||||
| 			throw new RuntimeException("文件下载失败:" + e.getMessage()); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * 列出存储桶中的所有文件 | ||||
| 	 */ | ||||
| 	public List<Bucket> listBuckets() { | ||||
| 		try { | ||||
| 			return minioClient.listBuckets(); | ||||
| 		} catch (Exception e) { | ||||
| 			throw new RuntimeException("获取存储桶列表失败:" + e.getMessage()); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| @ -0,0 +1,27 @@ | ||||
| package com.ruoyi.framework.config; | ||||
| 
 | ||||
| import io.minio.MinioClient; | ||||
| import org.springframework.beans.factory.annotation.Value; | ||||
| import org.springframework.context.annotation.Bean; | ||||
| import org.springframework.context.annotation.Configuration; | ||||
| 
 | ||||
| @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(); | ||||
| 	} | ||||
| } | ||||
| @ -0,0 +1,90 @@ | ||||
| package com.ruoyi.system.domain; | ||||
| 
 | ||||
| import com.baomidou.mybatisplus.annotation.IdType; | ||||
| import com.baomidou.mybatisplus.annotation.TableId; | ||||
| import com.baomidou.mybatisplus.annotation.TableName; | ||||
| import com.ruoyi.common.annotation.Excel; | ||||
| import com.ruoyi.common.core.domain.BaseEntity; | ||||
| import lombok.Data; | ||||
| import org.apache.commons.lang3.builder.ToStringBuilder; | ||||
| import org.apache.commons.lang3.builder.ToStringStyle; | ||||
| 
 | ||||
| /** | ||||
|  * 用户审核日志对象 user_audit_log | ||||
|  * | ||||
|  * @author ruoyi | ||||
|  * @date 2025-01-16 | ||||
|  */ | ||||
| @TableName("user_audit_log") | ||||
| @Data | ||||
| public class UserAuditLog extends BaseEntity | ||||
| 		{ | ||||
| private static final long serialVersionUID = 1L; | ||||
| 
 | ||||
| 		/** 主键 */ | ||||
| 			@TableId(value = "id",type = IdType.AUTO) | ||||
| 		private Long id; | ||||
| 
 | ||||
| 		/** 用户id */ | ||||
| 				@Excel(name = "用户id") | ||||
| 		private Long userId; | ||||
| 
 | ||||
| 		/** 驳回内容 */ | ||||
| 				@Excel(name = "驳回内容") | ||||
| 		private String content; | ||||
| 
 | ||||
| 		/** 审批状态 */ | ||||
| 				@Excel(name = "审批状态") | ||||
| 		private String status; | ||||
| 
 | ||||
| 		public void setId(Long id) | ||||
| 		{ | ||||
| 			this.id = id; | ||||
| 		} | ||||
| 
 | ||||
| 		public Long getId() | ||||
| 		{ | ||||
| 			return id; | ||||
| 		} | ||||
| 		public void setUserId(Long userId) | ||||
| 		{ | ||||
| 			this.userId = userId; | ||||
| 		} | ||||
| 
 | ||||
| 		public Long getUserId() | ||||
| 		{ | ||||
| 			return userId; | ||||
| 		} | ||||
| 		public void setContent(String content) | ||||
| 		{ | ||||
| 			this.content = content; | ||||
| 		} | ||||
| 
 | ||||
| 		public String getContent() | ||||
| 		{ | ||||
| 			return content; | ||||
| 		} | ||||
| 		public void setStatus(String status) | ||||
| 		{ | ||||
| 			this.status = status; | ||||
| 		} | ||||
| 
 | ||||
| 		public String getStatus() | ||||
| 		{ | ||||
| 			return status; | ||||
| 		} | ||||
| 
 | ||||
| @Override | ||||
| public String toString() { | ||||
| 	return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) | ||||
| 		.append("id", getId()) | ||||
| 		.append("userId", getUserId()) | ||||
| 		.append("content", getContent()) | ||||
| 		.append("status", getStatus()) | ||||
| 		.append("createBy", getCreateBy()) | ||||
| 		.append("createTime", getCreateTime()) | ||||
| 		.append("updateBy", getUpdateBy()) | ||||
| 		.append("updateTime", getUpdateTime()) | ||||
| 			.toString(); | ||||
| } | ||||
| } | ||||
| @ -0,0 +1,14 @@ | ||||
| package com.ruoyi.system.mapper; | ||||
| 
 | ||||
| import java.util.List; | ||||
| import com.baomidou.mybatisplus.core.mapper.BaseMapper; | ||||
| import com.ruoyi.system.domain.FileInfo; | ||||
| 
 | ||||
| /** | ||||
|  * 附件信息Mapper接口 | ||||
|  * | ||||
|  * @author ruoyi | ||||
|  * @date 2025-01-16 | ||||
|  */ | ||||
| public interface FileInfoMapper extends BaseMapper<FileInfo> { | ||||
| } | ||||
| @ -1,9 +0,0 @@ | ||||
| package com.ruoyi.system.mapper; | ||||
| 
 | ||||
| import com.baomidou.mybatisplus.core.mapper.BaseMapper; | ||||
| import com.ruoyi.system.domain.FileInfo; | ||||
| import org.apache.ibatis.annotations.Mapper; | ||||
| 
 | ||||
| @Mapper | ||||
| public interface FileMapper extends BaseMapper<FileInfo> { | ||||
| } | ||||
| @ -0,0 +1,14 @@ | ||||
| package com.ruoyi.system.mapper; | ||||
| 
 | ||||
| import java.util.List; | ||||
| import com.baomidou.mybatisplus.core.mapper.BaseMapper; | ||||
| import com.ruoyi.system.domain.UserAuditLog; | ||||
| 
 | ||||
| /** | ||||
|  * 用户审核日志Mapper接口 | ||||
|  * | ||||
|  * @author ruoyi | ||||
|  * @date 2025-01-16 | ||||
|  */ | ||||
| public interface UserAuditLogMapper extends BaseMapper<UserAuditLog> { | ||||
| } | ||||
| @ -0,0 +1,14 @@ | ||||
| package com.ruoyi.system.service; | ||||
| 
 | ||||
| import java.util.List; | ||||
| import com.ruoyi.system.domain.FileInfo; | ||||
| import com.baomidou.mybatisplus.extension.service.IService; | ||||
| 
 | ||||
| /** | ||||
|  * 附件信息Service接口 | ||||
|  * | ||||
|  * @author ruoyi | ||||
|  * @date 2025-01-16 | ||||
|  */ | ||||
| public interface IFileInfoService extends IService<FileInfo> { | ||||
| } | ||||
| @ -1,7 +0,0 @@ | ||||
| package com.ruoyi.system.service; | ||||
| 
 | ||||
| import com.ruoyi.system.domain.FileInfo; | ||||
| 
 | ||||
| public interface IFileService { | ||||
| 	void saveFileRecord(FileInfo fileInfo); | ||||
| } | ||||
| @ -0,0 +1,14 @@ | ||||
| package com.ruoyi.system.service; | ||||
| 
 | ||||
| import java.util.List; | ||||
| import com.ruoyi.system.domain.UserAuditLog; | ||||
| import com.baomidou.mybatisplus.extension.service.IService; | ||||
| 
 | ||||
| /** | ||||
|  * 用户审核日志Service接口 | ||||
|  * | ||||
|  * @author ruoyi | ||||
|  * @date 2025-01-16 | ||||
|  */ | ||||
| public interface IUserAuditLogService extends IService<UserAuditLog> { | ||||
| } | ||||
| @ -0,0 +1,18 @@ | ||||
| package com.ruoyi.system.service.impl; | ||||
| 
 | ||||
| import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | ||||
| import org.springframework.beans.factory.annotation.Autowired; | ||||
| import org.springframework.stereotype.Service; | ||||
| import com.ruoyi.system.mapper.FileInfoMapper; | ||||
| import com.ruoyi.system.domain.FileInfo; | ||||
| import com.ruoyi.system.service.IFileInfoService; | ||||
| 
 | ||||
| /** | ||||
|  * 附件信息Service业务层处理 | ||||
|  * | ||||
|  * @author ruoyi | ||||
|  * @date 2025-01-16 | ||||
|  */ | ||||
| @Service | ||||
| public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> implements IFileInfoService { | ||||
| } | ||||
| @ -1,19 +0,0 @@ | ||||
| package com.ruoyi.system.service.impl; | ||||
| 
 | ||||
| import com.ruoyi.system.domain.FileInfo; | ||||
| import com.ruoyi.system.mapper.FileMapper; | ||||
| import com.ruoyi.system.service.IFileService; | ||||
| import org.springframework.beans.factory.annotation.Autowired; | ||||
| import org.springframework.stereotype.Service; | ||||
| 
 | ||||
| @Service | ||||
| public class FileServiceImpl implements IFileService { | ||||
| 
 | ||||
| 	@Autowired | ||||
| 	private FileMapper fileMapper; | ||||
| 
 | ||||
| 	@Override | ||||
| 	public void saveFileRecord(FileInfo fileInfo) { | ||||
| 		fileMapper.insert(fileInfo); | ||||
| 	} | ||||
| } | ||||
| @ -0,0 +1,19 @@ | ||||
| package com.ruoyi.system.service.impl; | ||||
| 
 | ||||
| import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | ||||
| import org.springframework.beans.factory.annotation.Autowired; | ||||
| import org.springframework.stereotype.Service; | ||||
| import com.ruoyi.system.mapper.UserAuditLogMapper; | ||||
| import com.ruoyi.system.domain.UserAuditLog; | ||||
| import com.ruoyi.system.service.IUserAuditLogService; | ||||
| 
 | ||||
| /** | ||||
|  * 用户审核日志Service业务层处理 | ||||
|  * | ||||
|  * @author ruoyi | ||||
|  * @date 2025-01-16 | ||||
|  */ | ||||
| @Service | ||||
| public class UserAuditLogServiceImpl extends ServiceImpl<UserAuditLogMapper, UserAuditLog> implements IUserAuditLogService { | ||||
| 
 | ||||
| } | ||||
					Loading…
					
					
				
		Reference in new issue