瀏覽代碼

feat: user cert

shc 1 年之前
父節點
當前提交
4ef2a72474

+ 31 - 0
doc/db/28sys_user_cert.sql

@@ -0,0 +1,31 @@
+USE `cnbg_20240511_001`;
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for sys_user_cert
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_user_cert`;
+CREATE TABLE `sys_user_cert`
+(
+    `user_id`     BIGINT UNSIGNED AUTO_INCREMENT     NOT NULL COMMENT '用户ID',
+    `cert_type`   VARCHAR(8)                         NOT NULL COMMENT '证书类型',
+    `file_id`     BIGINT UNSIGNED                    NOT NULL COMMENT '证书上传ID',
+    `create_by`   VARCHAR(32)                        NOT NULL COMMENT '创建人',
+    `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL COMMENT '创建时间',
+    PRIMARY KEY `pk_id` (`user_id`)
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4
+  COLLATE = utf8mb4_general_ci
+  ROW_FORMAT = DYNAMIC COMMENT ='用户证书';
+
+
+-- ----------------------------
+-- Records of sys_user_cert
+-- ----------------------------
+BEGIN;
+COMMIT;
+
+
+SET FOREIGN_KEY_CHECKS = 1;

+ 17 - 1
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/dto/SysUserDTO.java

@@ -5,12 +5,15 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 
 import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.List;
 
 @NoArgsConstructor(access = AccessLevel.NONE)
 public final class SysUserDTO {
 
     @Data
-    public static class OnPltUserAgreementSign{
+    public static class OnPltUserAgreementSign {
 
         @NotBlank(message = "协议名称必填")
         private String agreementName;
@@ -19,4 +22,17 @@ public final class SysUserDTO {
         private String agreementVersion;
 
     }
+
+    @Data
+    public static class OnCertificateCreate {
+
+        @NotNull(message = "用户ID必填")
+        private Integer userId;
+
+        @NotBlank(message = "证书类型必填")
+        private String type;
+
+        @NotEmpty(message = "文件ID必填")
+        private List<Integer> fileIds;
+    }
 }

+ 70 - 63
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/SysFile.java

@@ -1,12 +1,13 @@
 package com.qunzhixinxi.hnqz.admin.api.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableLogic;
-import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
-import lombok.EqualsAndHashCode;
 
+import java.io.Serializable;
 import java.time.LocalDateTime;
 
 /**
@@ -16,66 +17,72 @@ import java.time.LocalDateTime;
  * @date 2019-06-18 17:18:42
  */
 @Data
-@EqualsAndHashCode(callSuper = true)
-public class SysFile extends Model<SysFile> {
-
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * 编号
-	 */
-	@TableId(type = IdType.AUTO)
-	private Long id;
-
-	/**
-	 * 文件名
-	 */
-	private String fileName;
-
-	/**
-	 * 原文件名
-	 */
-	private String original;
-
-	/**
-	 * 容器名称
-	 */
-	private String bucketName;
-
-	/**
-	 * 文件类型
-	 */
-	private String type;
-
-	/**
-	 * 文件大小
-	 */
-	private Long fileSize;
-
-	/**
-	 * 上传人
-	 */
-	private String createUser;
-
-	/**
-	 * 上传时间
-	 */
-	private LocalDateTime createTime;
-
-	/**
-	 * 更新人
-	 */
-	private String updateUser;
-
-	/**
-	 * 更新时间
-	 */
-	private LocalDateTime updateTime;
-
-	/**
-	 * 删除标识:1-删除,0-正常
-	 */
-	@TableLogic
-	private Integer delFlag;
+@TableName(value = "sys_file")
+public class SysFile implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 编号
+     */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 文件名
+     */
+    private String fileName;
+
+    /**
+     * 原文件名
+     */
+    private String original;
+
+    /**
+     * 容器名称
+     */
+    private String bucketName;
+
+    /**
+     * 文件类型
+     */
+    private String type;
+
+    /**
+     * 文件大小
+     */
+    private Long fileSize;
+
+    /**
+     * 上传人
+     */
+    private String createUser;
+
+    /**
+     * 上传时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新人
+     */
+    private String updateUser;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 删除标识:1-删除,0-正常
+     */
+    @TableLogic
+    private Integer delFlag;
+
+    /**
+     * 文件路径
+     */
+    @TableField(value = "file_path")
+    private String path;
 
 }

+ 32 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/SysUserCertificate.java

@@ -0,0 +1,32 @@
+package com.qunzhixinxi.hnqz.admin.api.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 lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * @author jimmy
+ * @date 13/07/2024 11:13
+ */
+@Data
+@TableName(value = "sys_user_cert")
+public final class SysUserCertificate implements Serializable {
+    private static final long serialVersionUID = -8452923730701856808L;
+
+    @TableId(type = IdType.AUTO)
+    private Integer userId;
+
+    @TableField(value = "cert_type")
+    private String type;
+
+    private Integer fileId;
+
+    private String createBy;
+
+    private LocalDateTime createTime;
+}

+ 19 - 1
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/SysUserController.java

@@ -12,6 +12,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.pig4cloud.plugin.excel.annotation.RequestExcel;
+import com.qunzhixinxi.hnqz.admin.api.dto.SysUserDTO;
 import com.qunzhixinxi.hnqz.admin.api.dto.UserDTO;
 import com.qunzhixinxi.hnqz.admin.api.dto.UserInfo;
 import com.qunzhixinxi.hnqz.admin.api.dto.UserPwd;
@@ -28,6 +29,7 @@ import com.qunzhixinxi.hnqz.admin.api.dto.CommonUserDTO;
 import com.qunzhixinxi.hnqz.admin.api.model.input.UserCertificationInput;
 import com.qunzhixinxi.hnqz.admin.api.model.excel.CommonUserExcelModel;
 import com.qunzhixinxi.hnqz.admin.api.constant.enums.DelEnum;
+import com.qunzhixinxi.hnqz.admin.manager.SysUserManager;
 import com.qunzhixinxi.hnqz.admin.mapper.SysCsmUserRelationMapper;
 import com.qunzhixinxi.hnqz.admin.mapper.SysUserMapper;
 import com.qunzhixinxi.hnqz.admin.mapper.SysUserRoleMapper;
@@ -93,6 +95,7 @@ public class SysUserController {
     private final WmPlatformQuizTestResultService platformQuizTestResultService;
     private final SysCsmUserRelationMapper sysCsmUserRelationMapper;
     private final SysAreaEntityService areaEntityService;
+    private final SysUserManager userManager;
 
     private boolean isZbOrDbUsers(Integer[] roles) {
 
@@ -133,7 +136,7 @@ public class SysUserController {
     @SysLog("用户管理-认证")
     @GetMapping("/getAuthInfo")
     public R<?> getAuthInfo(UserCertificationInput input) {
-        //参数校验
+        // 参数校验
         return userService.getAuthInfo(input);
     }
 
@@ -1235,4 +1238,19 @@ public class SysUserController {
         return R.ok(userAreaTree);
     }
 
+    @SysLog(value = "创建用户证书记录")
+    @PostMapping(value = "/cert/create")
+    public R<Boolean> createUserCertificate(@Validated @RequestBody SysUserDTO.OnCertificateCreate resource) {
+
+        return R.ok(userManager.createUserCertificate(resource, SecurityUtils.getUser()));
+
+    }
+
+    @GetMapping(value = "/cert/details/{user_id}")
+    public R<List<Map<String, Object>>> listUserCertificates(@PathVariable(value = "user_id") Integer userId) {
+
+        return R.ok(userManager.listUserCertificates(userId));
+
+    }
+
 }

+ 83 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/manager/SysUserManager.java

@@ -0,0 +1,83 @@
+package com.qunzhixinxi.hnqz.admin.manager;
+
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.qunzhixinxi.hnqz.admin.api.dto.SysUserDTO;
+import com.qunzhixinxi.hnqz.admin.api.entity.SysFile;
+import com.qunzhixinxi.hnqz.admin.api.entity.SysUserCertificate;
+import com.qunzhixinxi.hnqz.admin.service.SysFileService;
+import com.qunzhixinxi.hnqz.admin.service.SysUserCertificateService;
+import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * 用户管理
+ *
+ * @author jimmy
+ * @date 13/07/2024 11:11
+ */
+@Slf4j
+@Service
+@AllArgsConstructor
+public class SysUserManager {
+
+    private final SysFileService fileService;
+    private final SysUserCertificateService userCertificateService;
+
+
+    /**
+     * 创建用户证书
+     *
+     * @param resource 证书信息
+     * @param user     操作人
+     * @return 创建结果
+     */
+    public Boolean createUserCertificate(SysUserDTO.OnCertificateCreate resource, HnqzUser user) {
+
+
+        return userCertificateService.createUserCertificate(resource, user);
+    }
+
+    /**
+     * 获取用户ID
+     *
+     * @param userId 用户ID
+     * @return 用户证书信息
+     */
+    public List<Map<String, Object>> listUserCertificates(Integer userId) {
+        List<SysUserCertificate> certificates = userCertificateService.list(Wrappers.<SysUserCertificate>lambdaQuery().eq(SysUserCertificate::getUserId, userId));
+
+
+        if (CollUtil.isEmpty(certificates)) {
+            return Collections.emptyList();
+        }
+
+        Set<Integer> fileIds = certificates.stream().mapToInt(SysUserCertificate::getFileId).boxed().collect(Collectors.toSet());
+
+        Map<Long, SysFile> idToFileMap = fileService.listByIds(fileIds).stream().collect(Collectors.toMap(SysFile::getId, Function.identity()));
+
+
+        return certificates.stream().map(cert -> {
+            Map<String, Object> map = new HashMap<>(6);
+            map.put("userId", cert.getUserId());
+            Integer fileId = cert.getFileId();
+            map.put("fileId", fileId);
+            map.put("file", idToFileMap.get(fileId));
+            map.put("type", cert.getType());
+            map.put("createTime", cert.getCreateTime());
+            map.put("createBy", cert.getCreateBy());
+            return map;
+        }).collect(Collectors.toList());
+
+    }
+}

+ 15 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/SysUserCertificateMapper.java

@@ -0,0 +1,15 @@
+package com.qunzhixinxi.hnqz.admin.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qunzhixinxi.hnqz.admin.api.entity.SysUserCertificate;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 用户证明mapper
+ *
+ * @author jimmy
+ * @date 13/07/2024 11:15
+ */
+@Mapper
+public interface SysUserCertificateMapper extends BaseMapper<SysUserCertificate> {
+}

+ 24 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/SysUserCertificateService.java

@@ -0,0 +1,24 @@
+package com.qunzhixinxi.hnqz.admin.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qunzhixinxi.hnqz.admin.api.dto.SysUserDTO;
+import com.qunzhixinxi.hnqz.admin.api.entity.SysUserCertificate;
+import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
+
+/**
+ * 用户证明服务
+ *
+ * @author jimmy
+ * @date 13/07/2024 11:16
+ */
+public interface SysUserCertificateService extends IService<SysUserCertificate> {
+
+    /**
+     * 保存用户证书
+     *
+     * @param resource 证书信息
+     * @param user     操作人
+     * @return 保存结果
+     */
+    Boolean createUserCertificate(SysUserDTO.OnCertificateCreate resource, HnqzUser user);
+}

+ 12 - 10
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/SysFileServiceImpl.java

@@ -60,19 +60,18 @@ public class SysFileServiceImpl extends ServiceImpl<SysFileMapper, SysFile> impl
     public R<Map<String, String>> uploadFile(MultipartFile file) {
 
         // 判断是否有重名的操作
-
-
         String fileName = IdUtil.simpleUUID() + StrPool.DOT + FileUtil.extName(file.getOriginalFilename());
         Map<String, String> resultMap = new HashMap<>(5);
         resultMap.put("bucketName", ossProperties.getBucketName());
         resultMap.put("orgFileName", file.getOriginalFilename());
         resultMap.put("fileName", DateTimeFormatter.ofPattern(DatePattern.PURE_DATE_PATTERN).format(LocalDateTime.now()) + File.separator + fileName);
-        resultMap.put("url", String.format("/admin/sys-file/%s/%s", ossProperties.getBucketName(), fileName));
+        String url = String.format("/admin/sys-file/%s/%s", ossProperties.getBucketName(), fileName);
+        resultMap.put("url", url);
 
         try {
             minioTemplate.putObject(ossProperties.getBucketName(), fileName, file.getInputStream());
             // 文件管理数据记录,收集管理追踪文件
-            SysFile sysFile = fileLog(file, fileName);
+            SysFile sysFile = fileLog(file, fileName, url);
             resultMap.put("fileId", String.valueOf(sysFile.getId()));
 
         } catch (Exception e) {
@@ -96,12 +95,13 @@ public class SysFileServiceImpl extends ServiceImpl<SysFileMapper, SysFile> impl
         Map<String, String> resultMap = new HashMap<>(4);
         resultMap.put("bucketName", ossProperties.getBucketName());
         resultMap.put("fileName", fileName);
-        resultMap.put("url", upmsConfig.getClientUrl() + String.format("/admin/sys-file/%s/%s", ossProperties.getBucketName(), fileName));
+        String url = upmsConfig.getClientUrl() + String.format("/admin/sys-file/%s/%s", ossProperties.getBucketName(), fileName);
+        resultMap.put("url", url);
 
         try {
             minioTemplate.putObject(ossProperties.getBucketName(), fileName, file.getInputStream());
             // 文件管理数据记录,收集管理追踪文件
-            fileLog(file, fileName);
+            fileLog(file, fileName, url);
         } catch (Exception e) {
             log.error("上传失败", e);
             return R.failed(e.getLocalizedMessage());
@@ -126,12 +126,13 @@ public class SysFileServiceImpl extends ServiceImpl<SysFileMapper, SysFile> impl
         Map<String, String> resultMap = new HashMap<>(4);
         resultMap.put("bucketName", ossProperties.getBucketName());
         resultMap.put("fileName", fileName);
-        resultMap.put("url", upmsConfig.getClientUrl() + String.format("/admin/sys-file/%s/%s", ossProperties.getBucketName(), fileName));
+        String url = upmsConfig.getClientUrl() + String.format("/admin/sys-file/%s/%s", ossProperties.getBucketName(), fileName);
+        resultMap.put("url", url);
 
         try {
             minioTemplate.putObject(ossProperties.getBucketName(), fileName, file.getInputStream());
             // 文件管理数据记录,收集管理追踪文件
-            fileLog(file, fileName);
+            fileLog(file, fileName, url);
         } catch (Exception e) {
             log.error("上传失败", e);
             return R.failed(e.getLocalizedMessage());
@@ -206,7 +207,7 @@ public class SysFileServiceImpl extends ServiceImpl<SysFileMapper, SysFile> impl
      * @param file     上传文件格式
      * @param fileName 文件名
      */
-    private SysFile fileLog(MultipartFile file, String fileName) {
+    private SysFile fileLog(MultipartFile file, String fileName, String url) {
         SysFile sysFile = new SysFile();
         // 原文件名
         String original = file.getOriginalFilename();
@@ -215,6 +216,7 @@ public class SysFileServiceImpl extends ServiceImpl<SysFileMapper, SysFile> impl
         sysFile.setFileSize(file.getSize());
         sysFile.setType(FileUtil.extName(original));
         sysFile.setBucketName(ossProperties.getBucketName());
+        sysFile.setPath(url);
         if (null != SecurityUtils.getUser()) {
             sysFile.setCreateUser(SecurityUtils.getUser().getUsername());
         }
@@ -234,7 +236,7 @@ public class SysFileServiceImpl extends ServiceImpl<SysFileMapper, SysFile> impl
         try {
             minioTemplate.putObject(ossProperties.getBucketName(), fileName, inputStream);
             // 文件管理数据记录,收集管理追踪文件
-            //fileLog(file, fileName);
+            // fileLog(file, fileName);
             return String.format("/admin/sys-file/%s/%s", ossProperties.getBucketName(), fileName);
         } catch (Exception e) {
             log.error("上传失败", e);

+ 66 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/SysUserCertificateServiceImpl.java

@@ -0,0 +1,66 @@
+package com.qunzhixinxi.hnqz.admin.service.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qunzhixinxi.hnqz.admin.api.dto.SysUserDTO;
+import com.qunzhixinxi.hnqz.admin.api.entity.SysUserCertificate;
+import com.qunzhixinxi.hnqz.admin.mapper.SysUserCertificateMapper;
+import com.qunzhixinxi.hnqz.admin.service.SysUserCertificateService;
+import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 用户证明服务实现
+ *
+ * @author jimmy
+ * @date 13/07/2024 11:17
+ */
+@Slf4j
+@Service
+@AllArgsConstructor
+public class SysUserCertificateServiceImpl extends ServiceImpl<SysUserCertificateMapper, SysUserCertificate> implements SysUserCertificateService {
+
+
+    /**
+     * 保存用户证书
+     *
+     * @param resource 证书信息
+     * @param user     操作人
+     * @return 保存结果
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean createUserCertificate(SysUserDTO.OnCertificateCreate resource, HnqzUser user) {
+
+        String type = resource.getType();
+        Integer userId = resource.getUserId();
+        LocalDateTime now = LocalDateTime.now();
+        String operator = user.getUsername();
+
+        // 删除历史
+        this.remove(Wrappers.<SysUserCertificate>lambdaQuery()
+                .eq(SysUserCertificate::getType, type)
+                .eq(SysUserCertificate::getUserId, userId));
+
+
+        List<SysUserCertificate> collect = resource.getFileIds().stream().map(fid -> {
+            SysUserCertificate certificate = new SysUserCertificate();
+            certificate.setUserId(userId);
+            certificate.setType(type);
+            certificate.setFileId(fid);
+            certificate.setCreateBy(operator);
+            certificate.setCreateTime(now);
+            return certificate;
+        }).collect(Collectors.toList());
+
+
+        return this.saveBatch(collect);
+    }
+}