Crazy hai 6 meses
pai
achega
f41e9eaa53
Modificáronse 26 ficheiros con 1147 adicións e 18 borrados
  1. 6 0
      yudao-module-md/yudao-module-md-biz/pom.xml
  2. 60 5
      yudao-module-md/yudao-module-md-biz/src/main/java/cn/iocoder/yudao/module/md/controller/admin/AcsController.java
  3. 39 0
      yudao-module-md/yudao-module-md-biz/src/main/java/cn/iocoder/yudao/module/md/controller/admin/vo/UserImportExcelVO.java
  4. 24 0
      yudao-module-md/yudao-module-md-biz/src/main/java/cn/iocoder/yudao/module/md/controller/admin/vo/UserImportRespVO.java
  5. 29 0
      yudao-module-md/yudao-module-md-biz/src/main/java/cn/iocoder/yudao/module/md/controller/admin/vo/UserPhotosVO.java
  6. 105 1
      yudao-module-md/yudao-module-md-biz/src/main/java/cn/iocoder/yudao/module/md/service/AcsService.java
  7. 5 0
      yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java
  8. 6 0
      yudao-module-system/yudao-module-system-biz/pom.xml
  9. 97 12
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java
  10. 34 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserPhotosVO.java
  11. 95 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/userPhotoGroup/UserPhotoGroupController.java
  12. 29 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/userPhotoGroup/vo/UserPhotoGroupPageReqVO.java
  13. 31 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/userPhotoGroup/vo/UserPhotoGroupRespVO.java
  14. 21 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/userPhotoGroup/vo/UserPhotoGroupSaveReqVO.java
  15. 95 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/userPhotos/UserPhotosController.java
  16. 28 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/userPhotos/vo/UserPhotosPageReqVO.java
  17. 31 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/userPhotos/vo/UserPhotosRespVO.java
  18. 21 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/userPhotos/vo/UserPhotosSaveReqVO.java
  19. 39 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/userPhotoGroup/UserPhotoGroupDO.java
  20. 39 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/userPhotos/UserPhotosDO.java
  21. 27 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/userPhotoGroup/UserPhotoGroupMapper.java
  22. 28 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/userPhotos/UserPhotosMapper.java
  23. 55 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/userPhotoGroup/UserPhotoGroupService.java
  24. 74 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/userPhotoGroup/UserPhotoGroupServiceImpl.java
  25. 55 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/userPhotos/UserPhotosService.java
  26. 74 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/userPhotos/UserPhotosServiceImpl.java

+ 6 - 0
yudao-module-md/yudao-module-md-biz/pom.xml

@@ -76,6 +76,12 @@
             <scope>system</scope>
             <systemPath>${basedir}/lib/examples.jar</systemPath>
         </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel-core</artifactId>
+            <version>3.3.4</version>
+            <scope>compile</scope>
+        </dependency>
 
         <!-- Test 测试相关 -->
 <!--        <dependency>-->

+ 60 - 5
yudao-module-md/yudao-module-md-biz/src/main/java/cn/iocoder/yudao/module/md/controller/admin/AcsController.java

@@ -1,11 +1,18 @@
 package cn.iocoder.yudao.module.md.controller.admin;
 
+import cn.iocoder.yudao.module.md.controller.admin.vo.UserImportExcelVO;
+import cn.iocoder.yudao.module.md.controller.admin.vo.UserImportRespVO;
+import cn.iocoder.yudao.module.md.controller.admin.vo.UserPhotosVO;
 import cn.iocoder.yudao.module.md.service.AcsService;
 
 import com.google.gson.Gson;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Parameters;
 import org.json.JSONException;
 import org.springframework.web.bind.annotation.*;
 
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
@@ -13,10 +20,19 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 
+import java.io.BufferedOutputStream;
+import java.io.FileInputStream;
 import java.io.UnsupportedEncodingException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.error;
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@@ -34,10 +50,16 @@ public class AcsController {
     //批量添加用户和人脸
     @PostMapping("/batchAddUsersAndFaces")
     @Operation(summary = "批量添加用户和人脸")
-    public CommonResult<String> batchAddUsersAndFaces() throws JSONException {
-
-            return null;
-}
+    @Parameters({
+            @Parameter(name = "file", description = "Excel 文件", required = true),
+            @Parameter(name = "updateSupport", description = "是否支持更新,默认为 false", example = "true")
+    })
+    public CommonResult<UserImportRespVO> importExcel(@RequestParam("file") MultipartFile file,
+                                                      @RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport) throws Exception {
+        List<UserImportExcelVO> list = ExcelUtils.read(file, UserImportExcelVO.class);
+//        return null;
+        return success(acsService.importUserList(list, updateSupport));
+    }
 
 
 
@@ -75,7 +97,7 @@ public class AcsController {
             String result = acsService.getUser(employeeNo);
             Gson gson = new Gson();
             Object results = gson.fromJson(result, Object.class);
-            return success(result);
+            return success(results);
         }else {
             return null;
         }
@@ -170,6 +192,39 @@ public class AcsController {
     }
 
 
+    @PostMapping("/addPhotos")
+    @Operation(summary = "添加照片照片组")
+    public String addPhotos(@RequestPart("photoGroup") UserPhotosVO userPhotosVO ) throws Exception {
+        // 处理压缩包文件
+        if (userPhotosVO.getFile() != null) {
+            Path path = Files.createTempDirectory("photoGroup");
+            try (ZipInputStream zipIn = new ZipInputStream(new FileInputStream(userPhotosVO.getFile()))) {
+                ZipEntry entry = zipIn.getNextEntry();
+                while (entry != null) {
+                    String filePath = Paths.get(path.toString(), entry.getName()).toString();
+                    if (!Files.exists(Paths.get(filePath).getParent())) {
+                        Files.createDirectories(Paths.get(filePath).getParent());
+                    }
+                    try (BufferedOutputStream bos = new BufferedOutputStream(Files.newOutputStream(Paths.get(filePath)))) {
+                        byte[] bytesIn = new byte[4096];
+                        int read = 0;
+                        while ((read = zipIn.read(bytesIn)) != -1) {
+                            bos.write(bytesIn, 0, read);
+                        }
+                    }
+                    zipIn.closeEntry();
+                    entry = zipIn.getNextEntry();
+                }
+            }
+            // 处理解压后的照片
+            // 这里添加处理解压后照片的逻辑
+            // 例如,保存照片到数据库,或者进行人脸检测等操作
+        }
+
+        // 返回成功结果
+        return ("Batch upload successful");
+    }
+
 
 }
 

+ 39 - 0
yudao-module-md/yudao-module-md-biz/src/main/java/cn/iocoder/yudao/module/md/controller/admin/vo/UserImportExcelVO.java

@@ -0,0 +1,39 @@
+package cn.iocoder.yudao.module.md.controller.admin.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * 用户 Excel 导入 VO
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@Accessors(chain = false) // 设置 chain = false,避免用户导入有问题
+public class UserImportExcelVO {
+
+    @ExcelProperty("用户名称")
+    private String name;
+
+    @ExcelProperty("学号")
+    private String employeeNo;
+
+    @ExcelProperty("人脸照片")
+    private String faceURL;
+
+//    @ExcelProperty("手机号码")
+//    private String mobile;
+//
+//    @ExcelProperty(value = "用户性别")
+//    private Integer sex;
+
+
+//    @ExcelProperty(value = "账号状态")
+//    private Integer status;
+
+}

+ 24 - 0
yudao-module-md/yudao-module-md-biz/src/main/java/cn/iocoder/yudao/module/md/controller/admin/vo/UserImportRespVO.java

@@ -0,0 +1,24 @@
+package cn.iocoder.yudao.module.md.controller.admin.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+@Schema(description = "考勤机 - 用户信息人脸导入 Response VO")
+@Data
+@Builder
+public class UserImportRespVO {
+
+    @Schema(description = "创建成功的用户名数组", requiredMode = Schema.RequiredMode.REQUIRED)
+    private List<String> createUsernames;
+
+    @Schema(description = "更新成功的用户名数组", requiredMode = Schema.RequiredMode.REQUIRED)
+    private List<String> updateUsernames;
+
+    @Schema(description = "导入失败的用户集合,key 为用户名,value 为失败原因", requiredMode = Schema.RequiredMode.REQUIRED)
+    private Map<String, String> failureUsernames;
+
+}

+ 29 - 0
yudao-module-md/yudao-module-md-biz/src/main/java/cn/iocoder/yudao/module/md/controller/admin/vo/UserPhotosVO.java

@@ -0,0 +1,29 @@
+package cn.iocoder.yudao.module.md.controller.admin.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.File;
+
+/**
+ * 用户 Excel 导入 VO
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@Accessors(chain = false) //
+public class UserPhotosVO {
+
+    @Schema(description = "用户名称")
+    private String name;
+    @Schema(description = "照片组名称")
+    private String groupName; // 照片组的名称
+    @Schema(description = "压缩包文件")
+    private File File; // 压缩包文件
+
+}

+ 105 - 1
yudao-module-md/yudao-module-md-biz/src/main/java/cn/iocoder/yudao/module/md/service/AcsService.java

@@ -3,13 +3,33 @@ package cn.iocoder.yudao.module.md.service;
 import Acs.*;
 import Commom.osSelect;
 import NetSDKDemo.HCNetSDK;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.iocoder.yudao.framework.common.exception.ServiceException;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils;
+import cn.iocoder.yudao.module.infra.api.config.ConfigApi;
+import cn.iocoder.yudao.module.infra.api.file.FileApi;
+import cn.iocoder.yudao.module.md.controller.admin.vo.UserImportExcelVO;
+import cn.iocoder.yudao.module.md.controller.admin.vo.UserImportRespVO;
 import com.sun.jna.Native;
 import org.json.JSONException;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
+import javax.annotation.Resource;
+import javax.validation.ConstraintViolationException;
 import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
 
 @Service
 public class AcsService {
@@ -23,6 +43,7 @@ public class AcsService {
 //    private HCNetSDK hCNetSDK;
     private int lUserID = -1;
 
+
     /**
      * 初始化 SDK 并登录设备
      */
@@ -152,7 +173,6 @@ public class AcsService {
     }
 
 
-
     /**
      * 搜索用户信息
      * @param userId 用户ID字符串
@@ -166,6 +186,7 @@ public class AcsService {
             return UserManage.searchUserInfo(lUserID);
 
     }
+
 //lsq查单个人的用户信息
     public String getUser(String employeeNo) throws JSONException {
 
@@ -238,5 +259,88 @@ public class AcsService {
     }
 
 
+  //lsq
+    static final String USER_INIT_PASSWORD_KEY = "system.user.init-password";
+    @Resource
+    private FileApi fileApi;
+    @Resource
+    private ConfigApi configApi;
+
+    //导入用户信息与图片
+    @Transactional(rollbackFor = Exception.class) // 添加事务,异常则回滚所有导入
+    public UserImportRespVO importUserList(List<UserImportExcelVO> importUsers, boolean isUpdateSupport) {
+        // 1.1 参数校验
+//        if (CollUtil.isEmpty(importUsers)) {
+//            throw exception(USER_IMPORT_LIST_IS_EMPTY);
+//        }
+//        // 1.2 初始化密码不能为空
+//        String initPassword = configApi.getConfigValueByKey(USER_INIT_PASSWORD_KEY);
+//        if (StrUtil.isEmpty(initPassword)) {
+//            throw exception(USER_IMPORT_INIT_PASSWORD);
+//        }
+
+        // 2. 遍历,逐个创建 or 更新
+        UserImportRespVO respVO = UserImportRespVO.builder().createUsernames(new ArrayList<>())
+                .updateUsernames(new ArrayList<>()).failureUsernames(new LinkedHashMap<>()).build();
+        importUsers.forEach(importUser -> {
+            // 2.1.1 校验字段是否符合要求
+//            try {
+//                ValidationUtils.validate(BeanUtils.toBean(importUser, UserSaveReqVO.class).setPassword(initPassword));
+//            } catch (ConstraintViolationException ex){
+//                respVO.getFailureUsernames().put(importUser.getUsername(), ex.getMessage());
+//                return;
+//            }
+            // 2.1.2 校验,判断是否有不符合的原因
+//            try {
+//                validateUserForCreateOrUpdate(null, null, importUser.getMobile(), importUser.getEmail(),
+//                        importUser.getDeptId(), null);
+//            } catch (ServiceException ex) {
+//                respVO.getFailureUsernames().put(importUser.getUsername(), ex.getMessage());
+//                return;
+//            }
+
+//             2.2.1 判断如果不存在,在进行插入
+//            AdminUserDO existUser = userMapper.selectByUsername(importUser.getUsername());
+//            if (existUser == null) {
+            // 异步添加用户信息
+            CompletableFuture<Void> addUserFuture = CompletableFuture.runAsync(() -> {
+                try {
+                    UserManage.addUserInfo(lUserID, importUser.getEmployeeNo(), importUser.getName());
+
+                } catch (UnsupportedEncodingException | InterruptedException | JSONException e) {
+                    throw new RuntimeException("添加用户信息失败: " + e.getMessage(), e);
+                }
+            });
+
+            // 在用户信息添加成功后添加人脸
+            addUserFuture.thenRun(() -> {
+                try {
+                    FaceManage.addFaceByUrl(lUserID, importUser.getEmployeeNo(), importUser.getFaceURL());
+                    System.out.println("照片路由"+importUser.getFaceURL());
+                } catch (JSONException e) {
+                    throw new RuntimeException("添加人脸失败: " + e.getMessage(), e);
+                }
+            }).exceptionally(ex -> {
+                // 处理异常
+                System.err.println("发生异常: " + ex.getMessage());
+                return null;
+            });
+
+//            }
+//            // 2.2.2 如果存在,判断是否允许更新
+//            if (!isUpdateSupport) {
+//                respVO.getFailureUsernames().put(importUser.getUsername(), USER_USERNAME_EXISTS.getMsg());
+//                return;
+//            }
+//            AdminUserDO updateUser = BeanUtils.toBean(importUser, AdminUserDO.class);
+//            updateUser.setId(existUser.getId());
+//            userMapper.updateById(updateUser);
+//            respVO.getUpdateUsernames().add(importUser.getUsername());
+        });
+        return respVO;
+    }
+
+
+
 
 }

+ 5 - 0
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java

@@ -166,4 +166,9 @@ public interface ErrorCodeConstants {
     ErrorCode USER_ACHIEVEMENT_NOT_EXISTS = new ErrorCode(1_002_029_000, "成果不存在");
     // ========== 学生考勤记录 TODO 补充编号 ==========
     ErrorCode STUDENT_ATTENDANCE_NOT_EXISTS = new ErrorCode(1_002_030_000, "学生考勤记录不存在");
+
+    // ========== 照片组 TODO 补充编号 ==========
+    ErrorCode USER_PHOTO_GROUP_NOT_EXISTS = new ErrorCode(1_002_031_000, "用户照片组不存在");
+    // ========== 照片 TODO 补充编号 ==========
+    ErrorCode USER_PHOTOS_NOT_EXISTS = new ErrorCode(1_002_032_000, "用户照片不存在");
 }

+ 6 - 0
yudao-module-system/yudao-module-system-biz/pom.xml

@@ -124,6 +124,12 @@
             <groupId>cn.iocoder.boot</groupId>
             <artifactId>yudao-common</artifactId>
         </dependency>
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-module-infra-biz</artifactId>
+            <version>2.2.0-jdk8-snapshot</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
 </project>

+ 97 - 12
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java

@@ -7,13 +7,19 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+import cn.iocoder.yudao.module.infra.api.file.FileApi;
+import cn.iocoder.yudao.module.infra.service.file.FileService;
 import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.*;
+import cn.iocoder.yudao.module.system.controller.admin.userPhotoGroup.vo.UserPhotoGroupSaveReqVO;
+import cn.iocoder.yudao.module.system.controller.admin.userPhotos.vo.UserPhotosSaveReqVO;
 import cn.iocoder.yudao.module.system.convert.user.UserConvert;
 import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
 import cn.iocoder.yudao.module.system.enums.common.SexEnum;
 import cn.iocoder.yudao.module.system.service.dept.DeptService;
 import cn.iocoder.yudao.module.system.service.user.AdminUserService;
+import cn.iocoder.yudao.module.system.service.userPhotoGroup.UserPhotoGroupService;
+import cn.iocoder.yudao.module.system.service.userPhotos.UserPhotosService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.Parameters;
@@ -26,13 +32,15 @@ import org.springframework.web.multipart.MultipartFile;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.*;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
 
 import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.error;
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
 
@@ -47,6 +55,18 @@ public class UserController {
     @Resource
     private DeptService deptService;
 
+    //新加的
+    @Resource
+    private UserPhotosService userPhotosService;
+    @Resource
+    private UserPhotoGroupService userPhotoGroupService;
+    @Resource
+    private FileService fileService;
+
+    @Resource
+    private FileApi fileApi;
+
+
     @PostMapping("/create")
     @Operation(summary = "新增用户")
     @PreAuthorize("@ss.hasPermission('system:user:create')")
@@ -54,6 +74,7 @@ public class UserController {
         Long id = userService.createUser(reqVO);
         return success(id);
     }
+
     @PostMapping("/create_teacher")
     @Operation(summary = "新增教师")
     @PreAuthorize("@ss.hasPermission('system:teacher:create')")
@@ -110,6 +131,7 @@ public class UserController {
         return success(new PageResult<>(UserConvert.INSTANCE.convertList(pageResult.getList(), deptMap),
                 pageResult.getTotal()));
     }
+
     //lsq
     @GetMapping("/page0")
     @Operation(summary = "获得老师分页列表")
@@ -143,6 +165,7 @@ public class UserController {
         return success(new PageResult<>(UserConvert.INSTANCE.convertList(pageResult.getList(), deptMap),
                 pageResult.getTotal()));
     }
+
     //lsq
     @GetMapping("/DeptTeacherPage")
     @Operation(summary = "获得工作间教师分页列表")
@@ -185,6 +208,7 @@ public class UserController {
         List<AdminUserDO> deptUser = userService.getDeptUser();
         return success(deptUser);
     }
+
     @GetMapping("/supervisor")
     @Operation(summary = "获得所有导师")
     public CommonResult<List<AdminUserDO>> getSupervisor() {
@@ -203,10 +227,10 @@ public class UserController {
         // 循环处理每个毕业生
         for (AdminUserDO student : pageResult.getList()) {
             // 根据 supervisorId 查询导师信息
-            if (student.getSupervisorId()!=null) {
+            if (student.getSupervisorId() != null) {
                 AdminUserDO supervisorUser = userService.getUser(student.getSupervisorId());
                 String supervisor = supervisorUser.getNickname();
-                String mobile =supervisorUser.getMobile();
+                String mobile = supervisorUser.getMobile();
                 // 赋值给 对应 字段
                 student.setSupervisor(supervisor);
                 student.setSupervisorMobile(mobile);
@@ -229,10 +253,10 @@ public class UserController {
     public CommonResult<PageResult<UserRespVO>> getGraduateStudentTPage(@Valid UserPageReqVO pageReqVO) {
         PageResult<AdminUserDO> pageResult = userService.getGraduateStudentTPage(pageReqVO);
         for (AdminUserDO student : pageResult.getList()) {
-            if (student.getSupervisorId()!=null) {
+            if (student.getSupervisorId() != null) {
                 AdminUserDO supervisorUser = userService.getUser(student.getSupervisorId());
                 String supervisor = supervisorUser.getNickname();
-                String mobile =supervisorUser.getMobile();
+                String mobile = supervisorUser.getMobile();
 
                 student.setSupervisor(supervisor);
                 student.setSupervisorMobile(mobile);
@@ -265,7 +289,7 @@ public class UserController {
     public CommonResult<UserRespVO> getUser(@RequestParam("id") Long id) {
         AdminUserDO user = userService.getUser(id);
         //毕业生专属
-        if (user.getSupervisorId()!=null && Objects.equals(user.getUserType(), "2")) {
+        if (user.getSupervisorId() != null && Objects.equals(user.getUserType(), "2")) {
             AdminUserDO supervisorUser = userService.getUser(user.getSupervisorId());
             String supervisor = supervisorUser.getNickname();
             user.setSupervisor(supervisor);
@@ -321,7 +345,6 @@ public class UserController {
     }
 
 
-
     //毕业生
     @GetMapping("/get-import-GraduateStudentTemplate")
     @Operation(summary = "获得导入用户模板")
@@ -343,5 +366,67 @@ public class UserController {
         ExcelUtils.write(response, "用户导入模板.xls", "用户列表", graduateStudentImportExcelVO.class, list);
     }
 
+    @PostMapping("/addPhotos")
+    @Operation(summary = "增加照片组")
+    public CommonResult<Long> addPhotos(@RequestParam("groupName") String groupName,
+                                        @RequestParam("groupDescription") String groupDescription,
+                                        @RequestParam("file") MultipartFile file) throws Exception {
+        if (!file.getOriginalFilename().endsWith(".zip")) {
+            throw new IllegalArgumentException("上传文件必须是压缩包");
+        }
+        // 创建照片组
+        UserPhotoGroupSaveReqVO createVO = new UserPhotoGroupSaveReqVO();
+        createVO.setGroupName(groupName);
+        createVO.setGroupDescription(groupDescription);
+        Long groupId = userPhotoGroupService.createUserPhotoGroup(createVO);
 
-}
+        // 文件格式检查
+        try (InputStream inputStream = file.getInputStream()) {
+            java.util.zip.ZipInputStream zipStream = new ZipInputStream(inputStream);
+            ZipEntry entry;
+            while ((entry = zipStream.getNextEntry())!= null) {
+                System.out.println("文件格式错误");
+            }
+        }
+
+        // 创建临时目录存放解压后的文件
+        File tempDir = Files.createTempDirectory("photo_group_images").toFile();
+        try (ZipInputStream zipInputStream = new ZipInputStream(file.getInputStream())) {
+            ZipEntry entry;
+            while ((entry = zipInputStream.getNextEntry())!= null) {
+                if (!entry.isDirectory()) {
+                    File newFile = new File(tempDir, entry.getName());
+                    try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(newFile))) {
+                        byte[] buffer = new byte[1024];
+                        int len;
+                        while ((len = zipInputStream.read(buffer)) > 0) {
+                            bos.write(buffer, 0, len);
+                        }
+                    }
+                    System.out.println("到这里");
+                    try {
+                        // 上传文件并获取 URL
+                        String photoUrl = fileApi.createFile(Files.readAllBytes(newFile.toPath()));
+                        System.out.println("照片路径: " + photoUrl);
+                        // 获取新创建的照片组 ID
+                        // 保存照片信息到数据库
+                        UserPhotosSaveReqVO photo = new UserPhotosSaveReqVO();
+                        photo.setPhotoGroupId(groupId);
+                        photo.setPhotoUrl(photoUrl);
+                        userPhotosService.createUserPhotos(photo);
+                    } catch (Exception e) {
+                        throw new RuntimeException("上传照片失败:" + e.getMessage());
+                    }
+                }
+                zipInputStream.closeEntry();
+            }
+        } finally {
+            // 删除临时目录
+            Files.walk(tempDir.toPath())
+                    .sorted(Comparator.reverseOrder())
+                    .map(Path::toFile)
+                    .forEach(File::delete);
+        }
+        return success(groupId);
+    }
+}

+ 34 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserPhotosVO.java

@@ -0,0 +1,34 @@
+package cn.iocoder.yudao.module.system.controller.admin.user.vo.user;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.validation.constraints.NotNull;
+import java.io.File;
+
+/**
+ * 传过来的数据
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@Accessors(chain = false) //
+public class UserPhotosVO {
+
+    @Schema(description = "照片组名称", example = "张三")
+    private String groupName;
+
+    @Schema(description = "照片组简介", example = "随便")
+    private String groupDescription;
+
+    @Schema(description = "文件附件", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "文件附件不能为空")
+    private MultipartFile file;
+
+}

+ 95 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/userPhotoGroup/UserPhotoGroupController.java

@@ -0,0 +1,95 @@
+package cn.iocoder.yudao.module.system.controller.admin.userPhotoGroup;
+
+import org.springframework.web.bind.annotation.*;
+import javax.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+
+import javax.validation.constraints.*;
+import javax.validation.*;
+import javax.servlet.http.*;
+import java.util.*;
+import java.io.IOException;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import cn.iocoder.yudao.module.system.controller.admin.userPhotoGroup.vo.*;
+import cn.iocoder.yudao.module.system.dal.dataobject.userPhotoGroup.UserPhotoGroupDO;
+import cn.iocoder.yudao.module.system.service.userPhotoGroup.UserPhotoGroupService;
+
+@Tag(name = "管理后台 - 用户照片组")
+@RestController
+@RequestMapping("/system/user-photo-group")
+@Validated
+public class UserPhotoGroupController {
+
+    @Resource
+    private UserPhotoGroupService userPhotoGroupService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建用户照片组")
+    @PreAuthorize("@ss.hasPermission('system:user-photo-group:create')")
+    public CommonResult<Long> createUserPhotoGroup(@Valid @RequestBody UserPhotoGroupSaveReqVO createReqVO) {
+        return success(userPhotoGroupService.createUserPhotoGroup(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新用户照片组")
+    @PreAuthorize("@ss.hasPermission('system:user-photo-group:update')")
+    public CommonResult<Boolean> updateUserPhotoGroup(@Valid @RequestBody UserPhotoGroupSaveReqVO updateReqVO) {
+        userPhotoGroupService.updateUserPhotoGroup(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除用户照片组")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('system:user-photo-group:delete')")
+    public CommonResult<Boolean> deleteUserPhotoGroup(@RequestParam("id") Long id) {
+        userPhotoGroupService.deleteUserPhotoGroup(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得用户照片组")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('system:user-photo-group:query')")
+    public CommonResult<UserPhotoGroupRespVO> getUserPhotoGroup(@RequestParam("id") Long id) {
+        UserPhotoGroupDO userPhotoGroup = userPhotoGroupService.getUserPhotoGroup(id);
+        return success(BeanUtils.toBean(userPhotoGroup, UserPhotoGroupRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得用户照片组分页")
+    @PreAuthorize("@ss.hasPermission('system:user-photo-group:query')")
+    public CommonResult<PageResult<UserPhotoGroupRespVO>> getUserPhotoGroupPage(@Valid UserPhotoGroupPageReqVO pageReqVO) {
+        PageResult<UserPhotoGroupDO> pageResult = userPhotoGroupService.getUserPhotoGroupPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, UserPhotoGroupRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出用户照片组 Excel")
+    @PreAuthorize("@ss.hasPermission('system:user-photo-group:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportUserPhotoGroupExcel(@Valid UserPhotoGroupPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<UserPhotoGroupDO> list = userPhotoGroupService.getUserPhotoGroupPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "用户照片组.xls", "数据", UserPhotoGroupRespVO.class,
+                        BeanUtils.toBean(list, UserPhotoGroupRespVO.class));
+    }
+
+}

+ 29 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/userPhotoGroup/vo/UserPhotoGroupPageReqVO.java

@@ -0,0 +1,29 @@
+package cn.iocoder.yudao.module.system.controller.admin.userPhotoGroup.vo;
+
+import lombok.*;
+
+import java.io.File;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 用户照片组分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class UserPhotoGroupPageReqVO extends PageParam {
+
+    @Schema(description = "照片组名称", example = "张三")
+    private String groupName;
+
+    @Schema(description = "照片组简介", example = "随便")
+    private String groupDescription;
+
+    @Schema(description = "压缩包文件")
+    private java.io.File File; // 压缩包文件
+
+}

+ 31 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/userPhotoGroup/vo/UserPhotoGroupRespVO.java

@@ -0,0 +1,31 @@
+package cn.iocoder.yudao.module.system.controller.admin.userPhotoGroup.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 用户照片组 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class UserPhotoGroupRespVO {
+
+    @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "17155")
+    @ExcelProperty("主键")
+    private Long id;
+
+    @Schema(description = "照片组名称", example = "张三")
+    @ExcelProperty("照片组名称")
+    private String groupName;
+
+    @Schema(description = "照片组简介", example = "随便")
+    @ExcelProperty("照片组简介")
+    private String groupDescription;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 21 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/userPhotoGroup/vo/UserPhotoGroupSaveReqVO.java

@@ -0,0 +1,21 @@
+package cn.iocoder.yudao.module.system.controller.admin.userPhotoGroup.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import javax.validation.constraints.*;
+
+@Schema(description = "管理后台 - 用户照片组新增/修改 Request VO")
+@Data
+public class UserPhotoGroupSaveReqVO {
+
+    @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "17155")
+    private Long id;
+
+    @Schema(description = "照片组名称", example = "张三")
+    private String groupName;
+
+    @Schema(description = "照片组简介", example = "随便")
+    private String groupDescription;
+
+}

+ 95 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/userPhotos/UserPhotosController.java

@@ -0,0 +1,95 @@
+package cn.iocoder.yudao.module.system.controller.admin.userPhotos;
+
+import org.springframework.web.bind.annotation.*;
+import javax.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+
+import javax.validation.constraints.*;
+import javax.validation.*;
+import javax.servlet.http.*;
+import java.util.*;
+import java.io.IOException;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import cn.iocoder.yudao.module.system.controller.admin.userPhotos.vo.*;
+import cn.iocoder.yudao.module.system.dal.dataobject.userPhotos.UserPhotosDO;
+import cn.iocoder.yudao.module.system.service.userPhotos.UserPhotosService;
+
+@Tag(name = "管理后台 - 用户照片")
+@RestController
+@RequestMapping("/system/user-photos")
+@Validated
+public class UserPhotosController {
+
+    @Resource
+    private UserPhotosService userPhotosService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建用户照片")
+    @PreAuthorize("@ss.hasPermission('system:user-photos:create')")
+    public CommonResult<Long> createUserPhotos(@Valid @RequestBody UserPhotosSaveReqVO createReqVO) {
+        return success(userPhotosService.createUserPhotos(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新用户照片")
+    @PreAuthorize("@ss.hasPermission('system:user-photos:update')")
+    public CommonResult<Boolean> updateUserPhotos(@Valid @RequestBody UserPhotosSaveReqVO updateReqVO) {
+        userPhotosService.updateUserPhotos(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除用户照片")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('system:user-photos:delete')")
+    public CommonResult<Boolean> deleteUserPhotos(@RequestParam("id") Long id) {
+        userPhotosService.deleteUserPhotos(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得用户照片")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('system:user-photos:query')")
+    public CommonResult<UserPhotosRespVO> getUserPhotos(@RequestParam("id") Long id) {
+        UserPhotosDO userPhotos = userPhotosService.getUserPhotos(id);
+        return success(BeanUtils.toBean(userPhotos, UserPhotosRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得用户照片分页")
+    @PreAuthorize("@ss.hasPermission('system:user-photos:query')")
+    public CommonResult<PageResult<UserPhotosRespVO>> getUserPhotosPage(@Valid UserPhotosPageReqVO pageReqVO) {
+        PageResult<UserPhotosDO> pageResult = userPhotosService.getUserPhotosPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, UserPhotosRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出用户照片 Excel")
+    @PreAuthorize("@ss.hasPermission('system:user-photos:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportUserPhotosExcel(@Valid UserPhotosPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<UserPhotosDO> list = userPhotosService.getUserPhotosPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "用户照片.xls", "数据", UserPhotosRespVO.class,
+                        BeanUtils.toBean(list, UserPhotosRespVO.class));
+    }
+
+}

+ 28 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/userPhotos/vo/UserPhotosPageReqVO.java

@@ -0,0 +1,28 @@
+package cn.iocoder.yudao.module.system.controller.admin.userPhotos.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 用户照片分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class UserPhotosPageReqVO extends PageParam {
+
+    @Schema(description = "照片组id", example = "9150")
+    private String photoGroupId;
+
+    @Schema(description = "照片url", example = "https://www.iocoder.cn")
+    private String photoUrl;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 31 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/userPhotos/vo/UserPhotosRespVO.java

@@ -0,0 +1,31 @@
+package cn.iocoder.yudao.module.system.controller.admin.userPhotos.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 用户照片 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class UserPhotosRespVO {
+
+    @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "10387")
+    @ExcelProperty("主键")
+    private Long id;
+
+    @Schema(description = "照片组id", example = "9150")
+    @ExcelProperty("照片组id")
+    private String photoGroupId;
+
+    @Schema(description = "照片url", example = "https://www.iocoder.cn")
+    @ExcelProperty("照片url")
+    private String photoUrl;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 21 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/userPhotos/vo/UserPhotosSaveReqVO.java

@@ -0,0 +1,21 @@
+package cn.iocoder.yudao.module.system.controller.admin.userPhotos.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import javax.validation.constraints.*;
+
+@Schema(description = "管理后台 - 用户照片新增/修改 Request VO")
+@Data
+public class UserPhotosSaveReqVO {
+
+    @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "10387")
+    private Long id;
+
+    @Schema(description = "照片组id", example = "9150")
+    private Long photoGroupId;
+
+    @Schema(description = "照片url", example = "https://www.iocoder.cn")
+    private String photoUrl;
+
+}

+ 39 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/userPhotoGroup/UserPhotoGroupDO.java

@@ -0,0 +1,39 @@
+package cn.iocoder.yudao.module.system.dal.dataobject.userPhotoGroup;
+
+import lombok.*;
+import java.util.*;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 用户照片组 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("system_users_photo_group")
+@KeySequence("system_users_photo_group_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class UserPhotoGroupDO extends BaseDO {
+
+    /**
+     * 主键
+     */
+    @TableId
+    private Long id;
+    /**
+     * 照片组名称
+     */
+    private String groupName;
+    /**
+     * 照片组简介
+     */
+    private String groupDescription;
+
+}

+ 39 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/userPhotos/UserPhotosDO.java

@@ -0,0 +1,39 @@
+package cn.iocoder.yudao.module.system.dal.dataobject.userPhotos;
+
+import lombok.*;
+import java.util.*;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 用户照片 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("system_user_photos")
+@KeySequence("system_user_photos_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class UserPhotosDO extends BaseDO {
+
+    /**
+     * 主键
+     */
+    @TableId
+    private Long id;
+    /**
+     * 照片组id
+     */
+    private String photoGroupId;
+    /**
+     * 照片url
+     */
+    private String photoUrl;
+
+}

+ 27 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/userPhotoGroup/UserPhotoGroupMapper.java

@@ -0,0 +1,27 @@
+package cn.iocoder.yudao.module.system.dal.mysql.userPhotoGroup;
+
+import java.util.*;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.system.dal.dataobject.userPhotoGroup.UserPhotoGroupDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.iocoder.yudao.module.system.controller.admin.userPhotoGroup.vo.*;
+
+/**
+ * 用户照片组 Mapper
+ *
+ * @author 芋道源码
+ */
+@Mapper
+public interface UserPhotoGroupMapper extends BaseMapperX<UserPhotoGroupDO> {
+
+    default PageResult<UserPhotoGroupDO> selectPage(UserPhotoGroupPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<UserPhotoGroupDO>()
+                .likeIfPresent(UserPhotoGroupDO::getGroupName, reqVO.getGroupName())
+                .eqIfPresent(UserPhotoGroupDO::getGroupDescription, reqVO.getGroupDescription())
+                .orderByDesc(UserPhotoGroupDO::getId));
+    }
+
+}

+ 28 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/userPhotos/UserPhotosMapper.java

@@ -0,0 +1,28 @@
+package cn.iocoder.yudao.module.system.dal.mysql.userPhotos;
+
+import java.util.*;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.system.dal.dataobject.userPhotos.UserPhotosDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.iocoder.yudao.module.system.controller.admin.userPhotos.vo.*;
+
+/**
+ * 用户照片 Mapper
+ *
+ * @author 芋道源码
+ */
+@Mapper
+public interface UserPhotosMapper extends BaseMapperX<UserPhotosDO> {
+
+    default PageResult<UserPhotosDO> selectPage(UserPhotosPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<UserPhotosDO>()
+                .eqIfPresent(UserPhotosDO::getPhotoGroupId, reqVO.getPhotoGroupId())
+                .eqIfPresent(UserPhotosDO::getPhotoUrl, reqVO.getPhotoUrl())
+                .betweenIfPresent(UserPhotosDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(UserPhotosDO::getId));
+    }
+
+}

+ 55 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/userPhotoGroup/UserPhotoGroupService.java

@@ -0,0 +1,55 @@
+package cn.iocoder.yudao.module.system.service.userPhotoGroup;
+
+import java.util.*;
+import javax.validation.*;
+import cn.iocoder.yudao.module.system.controller.admin.userPhotoGroup.vo.*;
+import cn.iocoder.yudao.module.system.dal.dataobject.userPhotoGroup.UserPhotoGroupDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+
+/**
+ * 用户照片组 Service 接口
+ *
+ * @author 芋道源码
+ */
+public interface UserPhotoGroupService {
+
+    /**
+     * 创建用户照片组
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createUserPhotoGroup(@Valid UserPhotoGroupSaveReqVO createReqVO);
+
+    /**
+     * 更新用户照片组
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateUserPhotoGroup(@Valid UserPhotoGroupSaveReqVO updateReqVO);
+
+    /**
+     * 删除用户照片组
+     *
+     * @param id 编号
+     */
+    void deleteUserPhotoGroup(Long id);
+
+    /**
+     * 获得用户照片组
+     *
+     * @param id 编号
+     * @return 用户照片组
+     */
+    UserPhotoGroupDO getUserPhotoGroup(Long id);
+
+    /**
+     * 获得用户照片组分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 用户照片组分页
+     */
+    PageResult<UserPhotoGroupDO> getUserPhotoGroupPage(UserPhotoGroupPageReqVO pageReqVO);
+
+}

+ 74 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/userPhotoGroup/UserPhotoGroupServiceImpl.java

@@ -0,0 +1,74 @@
+package cn.iocoder.yudao.module.system.service.userPhotoGroup;
+
+import org.springframework.stereotype.Service;
+import javax.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import cn.iocoder.yudao.module.system.controller.admin.userPhotoGroup.vo.*;
+import cn.iocoder.yudao.module.system.dal.dataobject.userPhotoGroup.UserPhotoGroupDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+
+import cn.iocoder.yudao.module.system.dal.mysql.userPhotoGroup.UserPhotoGroupMapper;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
+
+/**
+ * 用户照片组 Service 实现类
+ *
+ * @author 芋道源码
+ */
+@Service
+@Validated
+public class UserPhotoGroupServiceImpl implements UserPhotoGroupService {
+
+    @Resource
+    private UserPhotoGroupMapper userPhotoGroupMapper;
+
+    @Override
+    public Long createUserPhotoGroup(UserPhotoGroupSaveReqVO createReqVO) {
+        // 插入
+        UserPhotoGroupDO userPhotoGroup = BeanUtils.toBean(createReqVO, UserPhotoGroupDO.class);
+        userPhotoGroupMapper.insert(userPhotoGroup);
+        // 返回
+        return userPhotoGroup.getId();
+    }
+
+    @Override
+    public void updateUserPhotoGroup(UserPhotoGroupSaveReqVO updateReqVO) {
+        // 校验存在
+        validateUserPhotoGroupExists(updateReqVO.getId());
+        // 更新
+        UserPhotoGroupDO updateObj = BeanUtils.toBean(updateReqVO, UserPhotoGroupDO.class);
+        userPhotoGroupMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteUserPhotoGroup(Long id) {
+        // 校验存在
+        validateUserPhotoGroupExists(id);
+        // 删除
+        userPhotoGroupMapper.deleteById(id);
+    }
+
+    private void validateUserPhotoGroupExists(Long id) {
+        if (userPhotoGroupMapper.selectById(id) == null) {
+            throw exception(USER_PHOTO_GROUP_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public UserPhotoGroupDO getUserPhotoGroup(Long id) {
+        return userPhotoGroupMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<UserPhotoGroupDO> getUserPhotoGroupPage(UserPhotoGroupPageReqVO pageReqVO) {
+        return userPhotoGroupMapper.selectPage(pageReqVO);
+    }
+
+}

+ 55 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/userPhotos/UserPhotosService.java

@@ -0,0 +1,55 @@
+package cn.iocoder.yudao.module.system.service.userPhotos;
+
+import java.util.*;
+import javax.validation.*;
+import cn.iocoder.yudao.module.system.controller.admin.userPhotos.vo.*;
+import cn.iocoder.yudao.module.system.dal.dataobject.userPhotos.UserPhotosDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+
+/**
+ * 用户照片 Service 接口
+ *
+ * @author 芋道源码
+ */
+public interface UserPhotosService {
+
+    /**
+     * 创建用户照片
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createUserPhotos(@Valid UserPhotosSaveReqVO createReqVO);
+
+    /**
+     * 更新用户照片
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateUserPhotos(@Valid UserPhotosSaveReqVO updateReqVO);
+
+    /**
+     * 删除用户照片
+     *
+     * @param id 编号
+     */
+    void deleteUserPhotos(Long id);
+
+    /**
+     * 获得用户照片
+     *
+     * @param id 编号
+     * @return 用户照片
+     */
+    UserPhotosDO getUserPhotos(Long id);
+
+    /**
+     * 获得用户照片分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 用户照片分页
+     */
+    PageResult<UserPhotosDO> getUserPhotosPage(UserPhotosPageReqVO pageReqVO);
+
+}

+ 74 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/userPhotos/UserPhotosServiceImpl.java

@@ -0,0 +1,74 @@
+package cn.iocoder.yudao.module.system.service.userPhotos;
+
+import org.springframework.stereotype.Service;
+import javax.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import cn.iocoder.yudao.module.system.controller.admin.userPhotos.vo.*;
+import cn.iocoder.yudao.module.system.dal.dataobject.userPhotos.UserPhotosDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+
+import cn.iocoder.yudao.module.system.dal.mysql.userPhotos.UserPhotosMapper;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
+
+/**
+ * 用户照片 Service 实现类
+ *
+ * @author 芋道源码
+ */
+@Service
+@Validated
+public class UserPhotosServiceImpl implements UserPhotosService {
+
+    @Resource
+    private UserPhotosMapper userPhotosMapper;
+
+    @Override
+    public Long createUserPhotos(UserPhotosSaveReqVO createReqVO) {
+        // 插入
+        UserPhotosDO userPhotos = BeanUtils.toBean(createReqVO, UserPhotosDO.class);
+        userPhotosMapper.insert(userPhotos);
+        // 返回
+        return userPhotos.getId();
+    }
+
+    @Override
+    public void updateUserPhotos(UserPhotosSaveReqVO updateReqVO) {
+        // 校验存在
+        validateUserPhotosExists(updateReqVO.getId());
+        // 更新
+        UserPhotosDO updateObj = BeanUtils.toBean(updateReqVO, UserPhotosDO.class);
+        userPhotosMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteUserPhotos(Long id) {
+        // 校验存在
+        validateUserPhotosExists(id);
+        // 删除
+        userPhotosMapper.deleteById(id);
+    }
+
+    private void validateUserPhotosExists(Long id) {
+        if (userPhotosMapper.selectById(id) == null) {
+            throw exception(USER_PHOTOS_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public UserPhotosDO getUserPhotos(Long id) {
+        return userPhotosMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<UserPhotosDO> getUserPhotosPage(UserPhotosPageReqVO pageReqVO) {
+        return userPhotosMapper.selectPage(pageReqVO);
+    }
+
+}