feat(后端): 代码提交2

master
rdpnr_puzhi 2025-08-08 16:11:01 +08:00
parent 34795a0ef7
commit b92552f653
27 changed files with 710 additions and 257 deletions

View File

@ -52,6 +52,15 @@ public class DeviceController {
log.info("终端修改请求参数为:{}", JSONUtil.toJsonStr(deviceReq));
return deviceService.update(deviceReq);
}
@ApiOperation(value = "终端查询")
@PostMapping("/query")
public Result<?> queryUser(@RequestBody DeviceReq deviceReq) {
if (Objects.isNull(deviceReq)) {
return Result.errorResult(BaseErrorCode.PARAMS_CHK_ERROR);
}
log.info("终端查询请求参数为:{}", JSONUtil.toJsonStr(deviceReq));
return deviceService.query(deviceReq);
}
@ApiOperation(value = "终端删除")
@PostMapping("/delete")

View File

@ -2,9 +2,7 @@ package com.unisinsight.project.controller;
import cn.hutool.json.JSONUtil;
import com.unisinsight.project.entity.req.DeviceUserMappingReq;
import com.unisinsight.project.entity.req.DeviceUserReq;
import com.unisinsight.project.entity.res.DeviceUserMappingRes;
import com.unisinsight.project.entity.res.ImageRes;
import com.unisinsight.project.exception.BaseErrorCode;
import com.unisinsight.project.exception.Result;
import com.unisinsight.project.service.DeviceUserMappingService;
@ -54,14 +52,6 @@ public class DeviceUserMappingController {
return deviceUserMappingService.select(deviceUserMappingReq);
}
@ApiOperation(value = "用户登录")
@PostMapping("/login")
public Result<List<ImageRes>> loginUser(@RequestBody DeviceUserReq deviceUserReq) {
if (Objects.isNull(deviceUserReq)) {
return Result.errorResult(BaseErrorCode.PARAMS_CHK_ERROR);
}
log.info("用户登录请求参数为:{}", JSONUtil.toJsonStr(deviceUserReq));
return deviceUserMappingService.loginUser(deviceUserReq);
}
}

View File

@ -1,11 +1,17 @@
package com.unisinsight.project.controller;
import com.unisinsight.project.entity.dao.Image;
import com.unisinsight.project.mapper.ImageMapper;
import com.unisinsight.project.util.DigestUtil;
import io.swagger.annotations.*;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
@ -24,39 +30,45 @@ import java.util.concurrent.ConcurrentHashMap;
@RestController
@RequestMapping("/api/files")
@Api(tags = "文件分片上传接口")
@Slf4j
public class FileChunkController {
// 临时目录,用于存储上传的分片
@Value("${file.upload.temp-dir:${file.upload.temp-dir}/chunked-uploads}")
@Value("${file.upload.temp-dir:${java.io.tmpdir}/chunked-uploads}")
private String tempDir;
// 最终文件存储目录
@Value("${file.upload.dir:${file.upload.dir}/uploads}")
@Value("${file.upload.dir:${user.home}/uploads}")
private String uploadDir;
// 存储每个文件的分片信息
private final Map<String, FileUploadInfo> fileUploadMap = new ConcurrentHashMap<>();
@Resource
private ImageMapper imageMapper;
/**
*
*
* @param chunk
* @param fileId
*
* @param chunk
* @param fileId
* @param chunkNumber (1)
* @param totalChunks
* @param fileName
* @param totalSize
* @param fileName
* @param totalSize
* @return
*/
@PostMapping("/upload-chunk")
@ApiOperation(value = "上传文件分片", notes = "上传单个文件分片,当所有分片上传完成后自动合并文件")
@ApiImplicitParams({
@ApiImplicitParam(name = "chunk", value = "文件分片", required = true, dataType = "__File", paramType = "form"),
@ApiImplicitParam(name = "fileId", value = "文件唯一标识符", required = true, dataType = "String", paramType = "query"),
@ApiImplicitParam(name = "chunkNumber", value = "当前分片编号(从1开始)", required = true, dataType = "int", paramType = "query"),
@ApiImplicitParam(name = "totalChunks", value = "总分片数", required = true, dataType = "int", paramType = "query"),
@ApiImplicitParam(name = "fileName", value = "原始文件名", required = true, dataType = "String", paramType = "query"),
@ApiImplicitParam(name = "totalSize", value = "文件总大小", required = true, dataType = "long", paramType = "query")
@ApiImplicitParam(name = "chunk_size", value = "文件分片大小", required = true, dataType = "int", paramType = "query"),
@ApiImplicitParam(name = "chunk_md5", value = "文件分片md5", required = true, dataType = "String", paramType = "query"),
@ApiImplicitParam(name = "file_id", value = "文件唯一标识符", required = true, dataType = "String", paramType = "query"),
@ApiImplicitParam(name = "shard_index", value = "当前分片编号(从1开始)", required = true, dataType = "int", paramType = "query"),
@ApiImplicitParam(name = "shard_total", value = "总分片数", required = true, dataType = "int", paramType = "query"),
@ApiImplicitParam(name = "file_name", value = "原始文件名", required = true, dataType = "String", paramType = "query"),
@ApiImplicitParam(name = "file_size", value = "文件总大小", required = true, dataType = "long", paramType = "query")
})
@ApiResponses({
@ApiResponse(code = 200, message = "上传成功"),
@ -64,31 +76,40 @@ public class FileChunkController {
})
public ResponseEntity<Map<String, Object>> uploadChunk(
@RequestParam("chunk") MultipartFile chunk,
@RequestParam("fileId") String fileId,
@RequestParam("chunkNumber") int chunkNumber,
@RequestParam("totalChunks") int totalChunks,
@RequestParam("fileName") String fileName,
@RequestParam("totalSize") long totalSize) {
@RequestParam("chunk_size") int chunkSize,
@RequestParam("chunk_md5") String chunkMd5,
@RequestParam("file_id") String fileId,
@RequestParam("shard_index") int chunkNumber,
@RequestParam("shard_total") int totalChunks,
@RequestParam("file_name") String fileName,
@RequestParam("file_size") long totalSize) {
Map<String, Object> response = new HashMap<>();
try {
String md5 = DigestUtil.encryptMd5(chunk.getBytes());
if (!chunkMd5.equals(md5)) {
log.info("分片文件md5校验失败,chunkMd5:{},md5:{}", chunkMd5, md5);
throw new RuntimeException("分片文件md5校验失败");
}
// 创建临时目录
Path fileTempDir = Paths.get(tempDir, fileId);
if (!Files.exists(fileTempDir)) {
Files.createDirectories(fileTempDir);
}
log.info("创建临时目录: {}", fileTempDir);
log.info("上传分片文件: {}", fileName);
// 保存分片文件
String chunkFileName = String.format("%05d.part", chunkNumber);
log.info("保存分片文件: {}", chunkFileName);
Path chunkFilePath = fileTempDir.resolve(chunkFileName);
chunk.transferTo(chunkFilePath);
// 更新文件上传信息
FileUploadInfo uploadInfo = fileUploadMap.computeIfAbsent(fileId,
id -> new FileUploadInfo(id, fileName, totalChunks, totalSize));
FileUploadInfo uploadInfo = fileUploadMap.computeIfAbsent(fileId,
id -> new FileUploadInfo(id, fileName, totalChunks, totalSize));
uploadInfo.addUploadedChunk(chunkNumber);
// log.info("更新文件上传信息: {}", JSONUtil.toJsonStr(uploadInfo));
// 检查是否所有分片都已上传
if (uploadInfo.isUploadComplete()) {
// 合并文件
@ -96,19 +117,32 @@ public class FileChunkController {
if (!Files.exists(finalDir)) {
Files.createDirectories(finalDir);
}
log.info("合并文件: {}", finalDir);
Path finalFilePath = finalDir.resolve(fileName);
log.info("合并所有分片文件: {}", finalFilePath.getFileName());
mergeChunks(fileId, finalFilePath, totalChunks);
// 清理临时文件
log.info("清理临时文件: {}", fileId);
cleanupTempFiles(fileId);
// 从上传映射中移除
fileUploadMap.remove(fileId);
response.put("status", "completed");
response.put("message", "文件上传并合并完成");
response.put("filePath", finalFilePath.toString());
Image image = new Image();
image.setImageName(fileName);
image.setStoragePath(uploadDir);
image.setImageStatus(1);
int insert = imageMapper.insert(image);
log.info("镜像新增insert:{}", insert);
if (insert == 1) {
response.put("status", "completed");
response.put("message", "文件上传并合并完成");
response.put("filePath", finalFilePath.toString());
} else {
throw new RuntimeException("文件上传失败");
}
} else {
response.put("status", "uploading");
response.put("message", "分片上传成功");
@ -121,14 +155,22 @@ public class FileChunkController {
} catch (Exception e) {
response.put("success", false);
response.put("status", "error");
response.put("message", "上传失败: " + e.getMessage());
log.info("上次失败清理临时文件: {}", fileId);
try {
cleanupTempFiles(fileId);
cleanUploadFile(fileName);
} catch (IOException ex) {
log.error("清理临时文件失败,fileId:{}, {}", fileId, ex.getMessage(), ex);
}
return ResponseEntity.status(500).body(response);
}
}
/**
*
*
*
* @param fileId
* @return
*/
@ -136,7 +178,7 @@ public class FileChunkController {
@ApiOperation("查询文件上传状态")
public ResponseEntity<Map<String, Object>> getUploadStatus(@PathVariable String fileId) {
Map<String, Object> response = new HashMap<>();
FileUploadInfo uploadInfo = fileUploadMap.get(fileId);
if (uploadInfo == null) {
// 检查文件是否已经完成上传并合并
@ -160,32 +202,32 @@ public class FileChunkController {
response.put("totalChunks", uploadInfo.getTotalChunks());
response.put("progress", (double) uploadInfo.getUploadedChunks().size() / uploadInfo.getTotalChunks());
}
response.put("success", true);
return ResponseEntity.ok(response);
}
/**
*
*
* @param fileId
* @param outputPath
*
* @param fileId
* @param outputPath
* @param totalChunks
* @throws IOException IO
*/
private void mergeChunks(String fileId, Path outputPath, int totalChunks) throws IOException {
try (OutputStream outputStream = Files.newOutputStream(outputPath)) {
Path fileTempDir = Paths.get(tempDir, fileId);
// 按顺序合并分片
for (int i = 1; i <= totalChunks; i++) {
String chunkFileName = String.format("%05d.part", i);
Path chunkPath = fileTempDir.resolve(chunkFileName);
if (!Files.exists(chunkPath)) {
throw new IOException("缺少分片文件: " + chunkFileName);
}
// 将分片内容追加到输出文件
Files.copy(chunkPath, outputStream);
}
@ -194,7 +236,7 @@ public class FileChunkController {
/**
*
*
*
* @param fileId
* @throws IOException IO
*/
@ -203,15 +245,34 @@ public class FileChunkController {
if (Files.exists(fileTempDir)) {
// 递归删除临时目录及其内容
Files.walk(fileTempDir)
.sorted(Comparator.reverseOrder())
.map(Path::toFile)
.forEach(File::delete);
.sorted(Comparator.reverseOrder())
.map(Path::toFile)
.forEach(File::delete);
}
}
/**
*
*
* @param fileName
* @throws IOException IO
*/
private void cleanUploadFile(String fileName) throws IOException {
Path filePath = Paths.get(uploadDir, fileName);
if (Files.exists(filePath)) {
// 删除文件
Files.delete(filePath);
log.info("已删除文件: {}", filePath);
} else {
log.warn("文件不存在,无需删除: {}", filePath);
}
}
/**
*
*/
@Data
private static class FileUploadInfo {
private final String fileId;
private final String fileName;
@ -235,30 +296,6 @@ public class FileChunkController {
return uploadedChunks.size() == totalChunks;
}
public String getFileId() {
return fileId;
}
public String getFileName() {
return fileName;
}
public int getTotalChunks() {
return totalChunks;
}
public long getTotalSize() {
return totalSize;
}
public Set<Integer> getUploadedChunks() {
return uploadedChunks;
}
}
@GetMapping("/test")
@ApiOperation("测试")
public ResponseEntity<String> getUploadStatus() {
return ResponseEntity.ok("ok");
}
}

View File

@ -1,6 +1,7 @@
package com.unisinsight.project.controller;
import cn.hutool.json.JSONUtil;
import com.unisinsight.project.entity.req.DeleteIdReq;
import com.unisinsight.project.entity.req.ImageReq;
import com.unisinsight.project.entity.res.ImageRes;
import com.unisinsight.project.entity.res.PageResult;
@ -42,4 +43,15 @@ public class ImageController {
return imageService.selectPage(imageReq);
}
@ApiOperation(value = "镜像删除")
@PostMapping("/delete")
public Result<?> deleteUser(@RequestBody DeleteIdReq deleteIdReq) {
if (Objects.isNull(deleteIdReq)) {
return Result.errorResult(BaseErrorCode.PARAMS_CHK_ERROR);
}
log.info("镜像删除请求参数为:{}", JSONUtil.toJsonStr(deleteIdReq));
return imageService.delete(deleteIdReq);
}
}

View File

@ -2,21 +2,22 @@ package com.unisinsight.project.controller;
import cn.hutool.json.JSONUtil;
import com.unisinsight.project.entity.req.DeleteIdReq;
import com.unisinsight.project.entity.req.DeviceUserReq;
import com.unisinsight.project.entity.req.UserReq;
import com.unisinsight.project.entity.res.ImageRes;
import com.unisinsight.project.entity.res.PageResult;
import com.unisinsight.project.entity.res.UserRes;
import com.unisinsight.project.exception.BaseErrorCode;
import com.unisinsight.project.exception.Result;
import com.unisinsight.project.service.DeviceUserMappingService;
import com.unisinsight.project.service.UserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
import java.util.Objects;
/**
@ -34,6 +35,9 @@ public class UserController {
@Resource
private UserService userService;
@Resource
private DeviceUserMappingService deviceUserMappingService;
@ApiOperation(value = "用户新增")
@PostMapping("/add")
public Result<?> insertUser(@RequestBody UserReq userReq) {
@ -54,6 +58,16 @@ public class UserController {
return userService.update(userReq);
}
@ApiOperation(value = "用户查询")
@PostMapping("/query")
public Result<?> queryUser(@RequestBody UserReq userReq) {
if (Objects.isNull(userReq)) {
return Result.errorResult(BaseErrorCode.PARAMS_CHK_ERROR);
}
log.info("用户查询请求参数为:{}", JSONUtil.toJsonStr(userReq));
return userService.query(userReq);
}
@ApiOperation(value = "用户删除")
@PostMapping("/delete")
public Result<?> deleteUser(@RequestBody DeleteIdReq deleteIdReq) {
@ -74,5 +88,30 @@ public class UserController {
return userService.selectPageUser(userReq);
}
@ApiOperation(value = "用户认证")
@PostMapping("/auth")
public Result<List<ImageRes>> authentication(@RequestParam("deviceId") String deviceId) {
if (Objects.isNull(deviceId)) {
return Result.errorResult(BaseErrorCode.PARAMS_CHK_ERROR);
}
log.info("用户认证请求参数为:{}", deviceId);
return Result.successResult();
}
@ApiOperation(value = "用户登录")
@PostMapping("/login")
public Result<?> loginUser(@RequestParam("deviceId") String deviceId,
@RequestParam("username") String username,
@RequestParam("password") String password) {
if (Objects.isNull(deviceId) || Objects.isNull(username) || Objects.isNull(password)) {
return Result.errorResult(BaseErrorCode.PARAMS_CHK_ERROR);
}
log.info("用户登录请求参数为,deviceId:{},username:{},password:{}", deviceId, username, password);
DeviceUserReq deviceUserReq = new DeviceUserReq();
deviceUserReq.setDeviceId(deviceId);
deviceUserReq.setUserName(username);
deviceUserReq.setPassword(password);
return deviceUserMappingService.loginUser(deviceUserReq);
}
}

View File

@ -32,7 +32,7 @@ public class Image implements Serializable {
private Integer imageType;
/**
*
* : 1-2-
*/
@TableField(value = "image_status")
private Integer imageStatus;

View File

@ -13,6 +13,6 @@ import lombok.Data;
@Data
public class DeleteIdReq {
@ApiModelProperty(value = "id", dataType = "Long")
public Long id;
@ApiModelProperty(value = "id")
private Long id;
}

View File

@ -24,7 +24,7 @@ public class DeviceUserReq {
/**
*
*/
@ApiModelProperty(value = "用户名", dataType = "String")
@ApiModelProperty(value = "用户名")
@JsonProperty("user_name")
private String userName;
@ -32,7 +32,7 @@ public class DeviceUserReq {
/**
*
*/
@ApiModelProperty(value = "密码", dataType = "String")
@ApiModelProperty(value = "密码")
@JsonProperty("password")
private String password;

View File

@ -37,9 +37,9 @@ public class ImageReq implements Serializable {
private Integer imageType;
/**
*
* : 1-2-
*/
@ApiModelProperty("镜像状态")
@ApiModelProperty("镜像状态: 1-成功, 2-失败")
@JsonProperty("image_status")
private Integer imageStatus;
@ -75,7 +75,7 @@ public class ImageReq implements Serializable {
/**
*
*/
@ApiModelProperty(value = "查询页", notes = "分页查询时再传", dataType = "Integer")
@ApiModelProperty(value = "查询页", notes = "分页查询时再传")
@JsonProperty("page_num")
private Integer pageNum;
@ -83,7 +83,7 @@ public class ImageReq implements Serializable {
/**
*
*/
@ApiModelProperty(value = "每页数量", notes = "分页查询时再传", dataType = "Integer")
@ApiModelProperty(value = "每页数量", notes = "分页查询时再传")
@JsonProperty("page_size")
private Integer pageSize;

View File

@ -55,14 +55,14 @@ public class UserDeviceGroupReq implements Serializable {
/**
*
*/
@ApiModelProperty(value = "查询页", notes = "分页查询时再传", dataType = "Integer")
@ApiModelProperty(value = "查询页", notes = "分页查询时再传")
@JsonProperty("page_num")
private Integer pageNum;
/**
*
*/
@ApiModelProperty(value = "每页数量", notes = "分页查询时再传", dataType = "Integer")
@ApiModelProperty(value = "每页数量", notes = "分页查询时再传")
@JsonProperty("page_size")
private Integer pageSize;

View File

@ -113,7 +113,7 @@ public class UserReq implements Serializable {
/**
*
*/
@ApiModelProperty(value = "查询页", notes = "分页查询时再传", dataType = "Integer")
@ApiModelProperty(value = "查询页", notes = "分页查询时再传")
@JsonProperty("page_num")
private Integer pageNum;
@ -121,7 +121,7 @@ public class UserReq implements Serializable {
/**
*
*/
@ApiModelProperty(value = "每页数量", notes = "分页查询时再传", dataType = "Integer")
@ApiModelProperty(value = "每页数量", notes = "分页查询时再传")
@JsonProperty("page_size")
private Integer pageSize;

View File

@ -39,7 +39,7 @@ public class ImageRes implements Serializable {
/**
*
*/
@ApiModelProperty("镜像状态")
@ApiModelProperty("镜像状态: 1-成功, 2-失败")
@JsonProperty("image_status")
private Integer imageStatus;

View File

@ -3,6 +3,7 @@ package com.unisinsight.project.entity.res;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ -19,40 +20,42 @@ import java.util.List;
public class PageResult<T1> {
// 当前页码
@ApiModelProperty("当前页码")
private long current;
@JsonProperty("page_num")
private long pageNum;
// 每页记录数
@ApiModelProperty("每页记录数")
private long size;
@ApiModelProperty("每页条数")
@JsonProperty("page_size")
private long pageSize;
// 总记录数
@ApiModelProperty("总记录数")
@ApiModelProperty("总数")
private long total;
// 总页数
@ApiModelProperty("总页数")
private long pages;
// 数据列表
@ApiModelProperty("数据列表")
private List<T1> records;
private List<T1> data;
// 转换方法
public static <T, T1> PageResult<T1> convertIPage(IPage<T> page, Class<T1> clazz) {
PageResult<T1> result = new PageResult<>();
result.setCurrent(page.getCurrent());
result.setSize(page.getSize());
result.setPageNum(page.getCurrent());
result.setPageSize(page.getSize());
result.setTotal(page.getTotal());
result.setPages(page.getPages());
List<T1> copyToList = BeanUtil.copyToList(page.getRecords(), clazz);
result.setRecords(copyToList);
result.setData(copyToList);
return result;
}
public static <T, T1> PageResult<T1> convertPage(Page<T> page, Class<T1> clazz) {
PageResult<T1> result = new PageResult<>();
result.setCurrent(page.getCurrent());
result.setSize(page.getSize());
result.setPageNum(page.getCurrent());
result.setPageSize(page.getSize());
result.setTotal(page.getTotal());
result.setPages(page.getPages());
List<T1> copyToList = BeanUtil.copyToList(page.getRecords(), clazz);
result.setRecords(copyToList);
result.setData(copyToList);
return result;
}
}

View File

@ -16,7 +16,7 @@ public class UserRes implements Serializable {
/**
* ID
*/
@ApiModelProperty(value = "ID", dataType = "Long")
@ApiModelProperty(value = "ID")
@JsonProperty("id")
private Long id;
@ -24,7 +24,7 @@ public class UserRes implements Serializable {
/**
* ID
*/
@ApiModelProperty(value = "用户组ID", dataType = "Long")
@ApiModelProperty(value = "用户组ID")
@JsonProperty("user_group_id")
private Long userGroupId;
@ -32,7 +32,7 @@ public class UserRes implements Serializable {
/**
*
*/
@ApiModelProperty(value = "用户名", dataType = "String")
@ApiModelProperty(value = "用户名")
@JsonProperty("user_name")
private String userName;
@ -40,7 +40,7 @@ public class UserRes implements Serializable {
/**
*
*/
@ApiModelProperty(value = "密码", dataType = "String")
@ApiModelProperty(value = "密码")
@JsonProperty("password")
private String password;
@ -48,7 +48,7 @@ public class UserRes implements Serializable {
/**
*
*/
@ApiModelProperty(value = "生日", dataType = "String")
@ApiModelProperty(value = "生日")
@JsonProperty("birthday")
private String birthday;
@ -56,7 +56,7 @@ public class UserRes implements Serializable {
/**
*
*/
@ApiModelProperty(value = "电话", dataType = "String")
@ApiModelProperty(value = "电话")
@JsonProperty("cell_phone")
private String cellPhone;
@ -64,7 +64,7 @@ public class UserRes implements Serializable {
/**
*
*/
@ApiModelProperty(value = "邮箱", dataType = "String")
@ApiModelProperty(value = "邮箱")
@JsonProperty("email")
private String email;
@ -73,7 +73,7 @@ public class UserRes implements Serializable {
*
*/
@ApiModelProperty(value = "性别", dataType = "Integer")
@ApiModelProperty(value = "性别")
@JsonProperty("gender")
private Integer gender;
@ -81,7 +81,7 @@ public class UserRes implements Serializable {
/**
*
*/
@ApiModelProperty(value = "身份证", dataType = "String")
@ApiModelProperty(value = "身份证")
@JsonProperty("identity_no")
private String identityNo;
@ -89,7 +89,7 @@ public class UserRes implements Serializable {
/**
*
*/
@ApiModelProperty(value = "优先级", dataType = "Integer")
@ApiModelProperty(value = "优先级")
@JsonProperty("priority")
private Integer priority;
@ -97,7 +97,7 @@ public class UserRes implements Serializable {
/**
*
*/
@ApiModelProperty(value = "用户类型", dataType = "Integer")
@ApiModelProperty(value = "用户类型")
@JsonProperty("user_type")
private Integer userType;
@ -105,7 +105,7 @@ public class UserRes implements Serializable {
/**
*
*/
@ApiModelProperty(value = "状态", dataType = "Integer")
@ApiModelProperty(value = "状态")
@JsonProperty("status")
private Integer status;

View File

@ -6,7 +6,7 @@ package com.unisinsight.project.exception;
* @date 2020/8/10 19:53
* @since 1.0
*/
public enum BaseErrorCode implements ErrorCode{
public enum BaseErrorCode implements ErrorCode {
INTERNAL_EXCEPTION("00001", "系统内部异常"),
INIT_EXCEPTION("00002", "系统初始化异常"),
UNKNOWN_ERROR("00003", "未知错误"),
@ -46,7 +46,7 @@ public enum BaseErrorCode implements ErrorCode{
HTTP_REQUEST_TIME_OUT("00037", "HTTP请求超时"),
HTTP_ERROR_CODE_400("00038", "HTTP错误码400"),
HTTP_ERROR_CODE_404("00039", "HTTP错误码404"),
HTTP_ERROR_CODE_500("00040", "HTTP错误码500"),
HTTP_ERROR_CODE_500("500", "HTTP错误码500"),
KAFKA_TOPICE_INVALID("00041", "kafka的topic无效"),
KAFKA_MESSAGE_SEND_FAILURE("00042", " kafka消息发送失败"),
DATABASE_ERROR("00043", "数据库错误"),
@ -149,20 +149,20 @@ public enum BaseErrorCode implements ErrorCode{
IPC_TYPE_GET_FAILED("00140", "获取IPC款型失败"),
FORMAT_VALIDATE_ERROR("00141", "%s"),
EXPORT_ERROR("00142", "导出EXCEL失败"),
SUCCESS("0000000000", "处理成功");
SUCCESS("200", "处理成功");
private String errorCode;
private String code;
private String message;
BaseErrorCode(String errorCode, String message) {
this.errorCode = errorCode;
BaseErrorCode(String code, String message) {
this.code = code;
this.message = message;
}
@Override
public String getErrorCode() {
return this.errorCode;
public String getCode() {
return this.code;
}
@Override

View File

@ -1,117 +0,0 @@
package com.unisinsight.project.exception;
/**
* @author zhangmengfei [yf_zhang.mengfei@unisinsight.com]
* @description BizExceptions
* @date 2020/9/2 14:21
* @since 1.0
*/
public class BizException extends RuntimeException {
private int httpStatus = 500;
private String errorCode;
private Object body;
public BizException(String message, Throwable cause, int httpStatus, String errorCode, Object body) {
super(message, cause);
this.httpStatus = httpStatus;
this.errorCode = errorCode;
this.body = body;
}
public BizException(ErrorCode errorCode) {
super(errorCode.getMessage());
this.errorCode = errorCode.getErrorCode();
}
public BizException(ErrorCode errorCode, Object data) {
super(errorCode.getMessage());
this.errorCode = errorCode.getErrorCode();
this.body = data;
}
public BizException(ErrorCode errorCode, Object... params) {
super(String.format(errorCode.getMessage(), params));
this.errorCode = errorCode.getErrorCode();
}
public BizException(ErrorCode errorCode, Throwable cause, Object... params) {
super(String.format(errorCode.getMessage(), params), cause);
this.errorCode = errorCode.getErrorCode();
}
public static <T> BizExceptionBuilder<T> builder() {
return new BizExceptionBuilder();
}
public static BizException of(ErrorCode errorCode) {
return new BizException(errorCode);
}
public static BizException of(ErrorCode errorCode, Object... params) {
return new BizException(errorCode, params);
}
public int getHttpStatus() {
return this.httpStatus;
}
public void setHttpStatus(int httpStatus) {
this.httpStatus = httpStatus;
}
public String getErrorCode() {
return this.errorCode;
}
public void setErrorCode(String errorCode) {
this.errorCode = errorCode;
}
public Object getBody() {
return this.body;
}
public void setBody(Object body) {
this.body = body;
}
public static class BizExceptionBuilder<T> {
private ErrorCode errorCode;
private Object[] params;
private Throwable cause;
private int status;
private T body;
public BizExceptionBuilder() {
}
public BizExceptionBuilder<T> errorCode(ErrorCode errorCode) {
this.errorCode = errorCode;
return this;
}
public BizExceptionBuilder<T> params(Object... params) {
this.params = params;
return this;
}
public BizExceptionBuilder<T> cause(Throwable cause) {
this.cause = cause;
return this;
}
public BizExceptionBuilder<T> status(int status) {
this.status = status;
return this;
}
public BizExceptionBuilder<T> body(T body) {
this.body = body;
return this;
}
public BizException build() {
return new BizException(String.format(this.errorCode.getMessage(), this.params), this.cause, this.status, this.errorCode.getErrorCode(), this.body);
}
}
}

View File

@ -7,7 +7,7 @@ package com.unisinsight.project.exception;
* @since 1.0
*/
public interface ErrorCode {
String getErrorCode();
String getCode();
String getMessage();
}

View File

@ -13,14 +13,14 @@ import lombok.Data;
*/
@Data
@ApiModel("返回结果类")
public class Result<T> implements ErrorCode {
public class Result<T> {
/**
*
*/
@ApiModelProperty("返回码")
@JsonProperty(value = "error_code")
private String errorCode;
@JsonProperty(value = "code")
private String code;
/**
*
@ -40,40 +40,40 @@ public class Result<T> implements ErrorCode {
}
public Result(String errorCode, String message) {
this.errorCode = errorCode;
this.code = errorCode;
this.message = message;
}
public Result(String errorCode, String message, T data) {
this.errorCode = errorCode;
this.code = errorCode;
this.message = message;
this.data = data;
}
public static <T> Result<T> successResult(T data) {
return new Result<>(BaseErrorCode.SUCCESS.getErrorCode(), BaseErrorCode.SUCCESS.getMessage(), data);
return new Result<>(BaseErrorCode.SUCCESS.getCode(), BaseErrorCode.SUCCESS.getMessage(), data);
}
public static <T> Result<T> successResult() {
return new Result<>(BaseErrorCode.SUCCESS.getErrorCode(), BaseErrorCode.SUCCESS.getMessage());
return new Result<>(BaseErrorCode.SUCCESS.getCode(), BaseErrorCode.SUCCESS.getMessage());
}
public static <T> Result<T> errorResult(ErrorCode errorCode) {
return new Result<>(errorCode.getErrorCode(), errorCode.getMessage());
return new Result<>(errorCode.getCode(), errorCode.getMessage());
}
public static <T> Result<T> errorResult(ErrorCode errorCode, T data) {
return new Result<>(errorCode.getErrorCode(), errorCode.getMessage(), data);
return new Result<>(errorCode.getCode(), errorCode.getMessage(), data);
}
public static <T> Result<T> errorResultMessage(ErrorCode errorCode, String message) {
return new Result<>(errorCode.getErrorCode(), message);
return new Result<>(errorCode.getCode(), message);
}
/**
*
*/
public boolean success() {
return BaseErrorCode.SUCCESS.getErrorCode().equals(this.errorCode);
return BaseErrorCode.SUCCESS.getCode().equals(this.code);
}
}

View File

@ -20,4 +20,6 @@ public interface DeviceService extends IService<Device> {
Result<?> delete(DeleteIdReq deleteIdReq);
Result selectPageUser(DeviceReq deviceReq);
Result<?> query(DeviceReq deviceReq);
}

View File

@ -17,5 +17,5 @@ public interface DeviceUserMappingService extends IService<DeviceUserMapping> {
Result select(DeviceUserMappingReq deviceUserMappingReq);
Result loginUser(DeviceUserReq deviceUserReq);
Result<?> loginUser(DeviceUserReq deviceUserReq);
}

View File

@ -2,6 +2,7 @@ package com.unisinsight.project.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.unisinsight.project.entity.dao.Image;
import com.unisinsight.project.entity.req.DeleteIdReq;
import com.unisinsight.project.entity.req.ImageReq;
import com.unisinsight.project.exception.Result;
@ -13,4 +14,6 @@ import com.unisinsight.project.exception.Result;
public interface ImageService extends IService<Image> {
Result selectPage(ImageReq imageReq);
Result<?> delete(DeleteIdReq deleteIdReq);
}

View File

@ -21,4 +21,6 @@ public interface UserService extends IService<User> {
Result<?> delete(DeleteIdReq deleteIdReq);
Result selectPageUser(UserReq userReq);
Result<?> query(UserReq userReq);
}

View File

@ -104,6 +104,20 @@ public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device>
return Result.successResult(convert);
}
}
@Override
public Result<?> query(DeviceReq deviceReq) {
Device device = deviceMapper.selectById(deviceReq.getId());
if (ObjectUtils.isEmpty(device)) {
log.info("查询终端返回为空");
return Result.successResult();
}
DeviceRes deviceRes = BeanUtil.copyProperties(device, DeviceRes.class);
log.info("查询终端返回:{}", JSONUtil.toJsonStr(deviceRes));
return Result.successResult(deviceRes);
}
}

View File

@ -7,9 +7,11 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.unisinsight.project.entity.dao.Image;
import com.unisinsight.project.entity.req.DeleteIdReq;
import com.unisinsight.project.entity.req.ImageReq;
import com.unisinsight.project.entity.res.ImageRes;
import com.unisinsight.project.entity.res.PageResult;
import com.unisinsight.project.exception.BaseErrorCode;
import com.unisinsight.project.exception.Result;
import com.unisinsight.project.mapper.ImageMapper;
import com.unisinsight.project.service.ImageService;
@ -19,6 +21,10 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
/**
* @author rdpnr_puzhi
@ -58,6 +64,44 @@ public class ImageServiceImpl extends ServiceImpl<ImageMapper, Image>
return Result.successResult(convert);
}
}
@Override
public Result<?> delete(DeleteIdReq deleteIdReq) {
Image image = imageMapper.selectById(deleteIdReq.getId());
if (ObjectUtils.isNotEmpty(image)) {
boolean cleanUploadFile = cleanUploadFile(image.getStoragePath(), image.getImageName());
if (cleanUploadFile) {
int deleted = imageMapper.deleteById(deleteIdReq.getId());
log.info("镜像删除insert:{}", deleted);
if (deleted == 1) {
return Result.successResult();
}
}
}
return Result.errorResult(BaseErrorCode.HTTP_ERROR_CODE_500);
}
/**
*
*
* @param fileName
*/
private boolean cleanUploadFile(String uploadDir, String fileName) {
try {
Path filePath = Paths.get(uploadDir, fileName);
if (Files.exists(filePath)) {
// 删除文件
Files.delete(filePath);
log.info("已删除文件: {}", filePath);
return true;
} else {
log.warn("文件不存在,无需删除: {}", filePath);
}
} catch (IOException e) {
log.error("删除文件失败: {}", e.getMessage(), e);
}
return false;
}
}

View File

@ -94,14 +94,26 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User>
IPage<User> userPage = userMapper.selectPage(page, queryWrapper);
log.info("分页查询用户返回:{}", JSONUtil.toJsonStr(userPage));
if (CollectionUtil.isEmpty(userPage.getRecords())){
if (CollectionUtil.isEmpty(userPage.getRecords())) {
log.info("分页查询用户返回为空");
return Result.successResult();
}else {
} else {
PageResult<UserRes> convert = PageResult.convertIPage(userPage, UserRes.class);
return Result.successResult(convert);
}
}
@Override
public Result<?> query(UserReq userReq) {
User user = userMapper.selectById(userReq.getId());
if (ObjectUtils.isEmpty(user)) {
log.info("查询用户返回为空");
return Result.successResult();
}
UserRes userRes = BeanUtil.copyProperties(user, UserRes.class);
log.info("查询用户返回:{}", JSONUtil.toJsonStr(userRes));
return Result.successResult(userRes);
}
}

View File

@ -0,0 +1,171 @@
package com.unisinsight.project.util;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class DigestUtil {
/** 算法名称 */
private static final String ALGORITHM = "DESede";
/** 16进制字母 */
private static final char[] HEX_DIGITS={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
/**
* @param decript
* @return
* SHA1
*/
public final static String SHA1(String decript) {
try {
MessageDigest digest = MessageDigest
.getInstance("SHA-1");
digest.update(decript.getBytes());
byte messageDigest[] = digest.digest();
// Create Hex String
StringBuffer hexString = new StringBuffer();
// 字节数组转换为 十六进制 数
for (int i = 0; i < messageDigest.length; i++) {
String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
if (shaHex.length() < 2) {
hexString.append(0);
}
hexString.append(shaHex);
}
return hexString.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return "";
}
/**
* DES,key 3*8 = 24
* @param src
* @param key
* @return
* @throws Exception
*/
public static String encrypt3DES(String src, String key) {
byte[] keyBytes = key.getBytes();
try {
DESedeKeySpec dks = new DESedeKeySpec(keyBytes);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
SecretKey securekey = keyFactory.generateSecret(dks);
Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, securekey);
byte[] b=cipher.doFinal(src.getBytes());
return StringUtil.byte2hex(b);
} catch (Exception e) {
return null;
}
}
/**
* 3DESECB,key 3*8 = 24
* @param src
* @param key
* @return
* @throws Exception
*/
public static String decrypt3DES(String src, String key) {
byte[] keyBytes = key.getBytes();
try {
//--通过base64,将字符串转成byte数组
byte[] bytesrc = StringUtil.hex2byte(src);
//--解密的key
DESedeKeySpec dks = new DESedeKeySpec(keyBytes);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
SecretKey securekey = keyFactory.generateSecret(dks);
//--Chipher对象解密
Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, securekey);
byte[] retByte = cipher.doFinal(bytesrc);
return new String(retByte);
} catch (Exception e) {
return null;
}
}
/**
*
* Description:md5
* @Create_by:JH
* @Create_date:2014-9-9
* @Last_Edit_By:
* @Edit_Description
* @Create_Version:exinhua 1.0
*/
public static String encryptMd5(String src) {
if(StringUtil.isEmpty(src)) {
return src;
}
try {
byte[] btInput = src.getBytes();
// 获得MD5摘要算法的 MessageDigest 对象
MessageDigest mdInst = MessageDigest.getInstance("MD5");
// 使用指定的字节更新摘要
mdInst.update(btInput);
// 获得密文
byte[] md = mdInst.digest();
// 把密文转换成十六进制的字符串形式
return byteToHexString(md);
} catch (Exception e) {
throw new RuntimeException("error occurated when encrypt", e);
}
}
public static String encryptMd5(byte[] btInput) {
try {
// 获得MD5摘要算法的 MessageDigest 对象
MessageDigest mdInst = MessageDigest.getInstance("MD5");
// 使用指定的字节更新摘要
mdInst.update(btInput);
// 获得密文
byte[] md = mdInst.digest();
// 把密文转换成十六进制的字符串形式
return byteToHexString(md);
} catch (Exception e) {
throw new RuntimeException("error occurated when encrypt", e);
}
}
/**
* sha116
* @param value
* @return
*/
public static String hexSHA1(String value) {
try {
MessageDigest md = MessageDigest.getInstance("SHA-1");
md.update(value.getBytes("utf-8"));
byte[] digest = md.digest();
return byteToHexString(digest);
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}
/**
* 16
* @param bytes
* @return
*/
public static String byteToHexString(byte[] bytes) {
int j = bytes.length;
char[] str = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) {
byte byte0 = bytes[i];
str[k++] = HEX_DIGITS[byte0 >>> 4 & 0xf];
str[k++] = HEX_DIGITS[byte0 & 0xf];
}
return new String(str);
}
}

View File

@ -0,0 +1,232 @@
package com.unisinsight.project.util;
/**
*
*
*/
public class StringUtil {
public static final String[] HEX_ARRAYS = { "0", "1", "2", "3", "4", "5",
"6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
/**
*  valuenulllength0
*
* @param value
* @return
*/
public static boolean isEmpty(String value) {
return value == null || value.length() == 0;
}
/**
* valuenulllength>0
*
* @param value
* @return
*/
public static boolean isNotEmpty(String value) {
return !isEmpty(value);
}
/**
* trim
*
* @param value
* @return
*/
public static String trim(String value) {
if (value == null) {
return null;
}
return value.trim();
}
/**
* byte string to hex string
*
* @param b
* @return
*/
public static String byte2hex(byte[] b) {
if (b == null) {
return null;
}
if (b.length == 0) {
return "";
}
StringBuilder retBuilder = new StringBuilder();
for (int n = 0; n < b.length; ++n) {
retBuilder.append(HEX_ARRAYS[(b[n] & 0xF0) >> 4]);
retBuilder.append(HEX_ARRAYS[b[n] & 0x0F]);
}
return retBuilder.toString();
}
/**
* hex string to byte string
*
* @param str
* @return
*/
public static byte[] hex2byte(String str) {
if (str == null)
return null;
str = str.trim();
int len = str.length();
if ((len == 0) || (len % 2 == 1))
return null;
byte[] b = new byte[len / 2];
byte tmp = 0;
char[] strs = str.toCharArray();
for (int i = 0; i < len; i++) {
byte t = 0;
if (strs[i] >= '0' && strs[i] <= '9') {
t = (byte) (strs[i] - '0');
} else if (strs[i] >= 'A' && strs[i] <= 'F') {
t = (byte) (strs[i] - 'A' + 10);
} else if (strs[i] >= 'a' && strs[i] <= 'f') {
t = (byte) (strs[i] - 'a' + 10);
}
if ((i & 0x1) == 1) {
tmp <<= 4;
tmp += t;
b[i / 2] = tmp;
tmp = 0;
} else {
tmp = t;
}
}
return b;
}
/**
* (10)
*
* @param str
* @return
*/
public static boolean isNumeric(String str) {
if (isEmpty(str)) {
return false;
}
char[] arr = str.toCharArray();
for (char c : arr) {
if (!Character.isDigit(c)) {
return false;
}
}
return true;
}
/**
* (pntn*)
*
* @param source
* @param pn
* @param tn
* @return
*/
public static String mix(String source, int pn, int tn) {
return mix(source, pn, tn, '*');
}
/**
* (pntnmixChar)
*
* @param source
* @param pn
* @param tn
* @param mixChar
* @return
*/
public static String mix(String source, int pn, int tn, char mixChar) {
if (source == null || source.length() <= pn + tn) {
return source;
}
int len = source.length();
StringBuilder tmp = new StringBuilder(source.length());
char[] mobileAs = source.toCharArray();
for (int i = 0; i < pn; i++) {
tmp.append(mobileAs[i]);
}
for (int i = 0; i < len - (pn + tn); i++) {
tmp.append(mixChar);
}
for (int i = len - tn; i < len; i++) {
tmp.append(mobileAs[i]);
}
return tmp.toString();
}
/**
* (2,1)
* @param value
* @return
*/
public static final int getLength(String value) {
if(StringUtil.isEmpty(value)) {
return 0;
}
int len = 0;
for(char c : value.toCharArray()) {
len++;
if(isSbcCase(c)) {
len++;
}
}
return len;
}
/**
*
* @param c
* @return
*/
public static final boolean isDbcCase(char c) {
int k = 0x80;
return c / k == 0 ? true : false;
}
/**
*
* @param c
* @return
*/
public static final boolean isSbcCase(char c) {
return isDbcCase(c);
}
/**
*
* @param value
* @return
*/
public static final boolean isAllDigits(String value) {
if(StringUtil.isEmpty(value)) {
return true;
}
for(char c : value.toCharArray()) {
if(c < '0' || c > '9') {
return false;
}
}
return true;
}
/**
* 0
* 6, 2 ---> 06
* @param data
* @param fillStr
* @param length
* @return
*/
public static String frontFillStr(String data, String fillStr, int length) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < length-data.length(); i++) {
sb.append(fillStr);
}
return sb.append(data).toString();
}
}