Browse Source

初始化项目

nuyang 2 years ago
commit
eedc1cbb83
100 changed files with 5865 additions and 0 deletions
  1. 13 0
      .gitignore
  2. 43 0
      cloud-application/cloud-admin/cloud-admin-api/pom.xml
  3. 33 0
      cloud-application/cloud-admin/cloud-admin-api/src/main/java/sm/cloud/admin/api/iservice/IAdminUserService.java
  4. 32 0
      cloud-application/cloud-admin/cloud-admin-api/src/main/java/sm/cloud/admin/api/iservice/IClientAccountService.java
  5. 32 0
      cloud-application/cloud-admin/cloud-admin-api/src/main/java/sm/cloud/admin/api/iservice/IClientUnionService.java
  6. 36 0
      cloud-application/cloud-admin/cloud-admin-api/src/main/java/sm/cloud/admin/api/model/dto/AdminDeptDTO.java
  7. 36 0
      cloud-application/cloud-admin/cloud-admin-api/src/main/java/sm/cloud/admin/api/model/dto/AdminMenuDTO.java
  8. 36 0
      cloud-application/cloud-admin/cloud-admin-api/src/main/java/sm/cloud/admin/api/model/dto/AdminRoleDTO.java
  9. 110 0
      cloud-application/cloud-admin/cloud-admin-api/src/main/java/sm/cloud/admin/api/model/dto/AdminTableDTO.java
  10. 36 0
      cloud-application/cloud-admin/cloud-admin-api/src/main/java/sm/cloud/admin/api/model/dto/AdminUserDTO.java
  11. 61 0
      cloud-application/cloud-admin/cloud-admin-api/src/main/java/sm/cloud/admin/api/model/dto/LoginDTO.java
  12. 204 0
      cloud-application/cloud-admin/cloud-admin-api/src/main/java/sm/cloud/admin/api/model/dto/VFormEntityDTO.java
  13. 49 0
      cloud-application/cloud-admin/cloud-admin-api/src/main/java/sm/cloud/admin/api/model/dto/VisitAppointDTO.java
  14. 28 0
      cloud-application/cloud-admin/cloud-admin-api/src/main/java/sm/cloud/admin/api/model/vo/AdminDeptVO.java
  15. 51 0
      cloud-application/cloud-admin/cloud-admin-api/src/main/java/sm/cloud/admin/api/model/vo/AdminMenuVO.java
  16. 28 0
      cloud-application/cloud-admin/cloud-admin-api/src/main/java/sm/cloud/admin/api/model/vo/AdminRoleVO.java
  17. 21 0
      cloud-application/cloud-admin/cloud-admin-api/src/main/java/sm/cloud/admin/api/model/vo/AdminTableVO.java
  18. 24 0
      cloud-application/cloud-admin/cloud-admin-api/src/main/java/sm/cloud/admin/api/model/vo/AdminUserVO.java
  19. 24 0
      cloud-application/cloud-admin/cloud-admin-api/src/main/java/sm/cloud/admin/api/model/vo/ClientAccountVO.java
  20. 24 0
      cloud-application/cloud-admin/cloud-admin-api/src/main/java/sm/cloud/admin/api/model/vo/ClientUnionVO.java
  21. 60 0
      cloud-application/cloud-admin/cloud-admin-api/src/main/java/sm/cloud/admin/api/model/vo/LoginVO.java
  22. 70 0
      cloud-application/cloud-admin/cloud-admin-server/pom.xml
  23. 23 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/AdminApplication.java
  24. 47 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/controller/AdminMenuController.java
  25. 109 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/controller/AdminTableController.java
  26. 89 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/controller/ClientController.java
  27. 54 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/controller/ExcelController.java
  28. 52 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/controller/FileController.java
  29. 70 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/controller/ManagerController.java
  30. 68 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/controller/QrController.java
  31. 163 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/controller/VFormController.java
  32. 57 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/controller/ValidateController.java
  33. 56 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/controller/VisitAppointController.java
  34. 33 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/config/JacksonConfig.java
  35. 41 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/config/Knife4jConfiguration.java
  36. 32 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/config/ThreadPoolConfig.java
  37. 186 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/config/WebMvcConfig.java
  38. 58 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/entity/RestResult.java
  39. 55 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/entity/VFormEntity.java
  40. 73 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/enums/CommonEnum.java
  41. 17 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/enums/StatusCodeEnum.java
  42. 48 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/enums/VisitAppointCodeEnum.java
  43. 17 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/exception/CustomBusinessException.java
  44. 103 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/exception/GlobalException.java
  45. 111 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/interfaces/ICacheService.java
  46. 17 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/interfaces/IPasswordService.java
  47. 43 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/util/CacheInfoUtil.java
  48. 54 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/util/DateConverterUtil.java
  49. 137 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/util/DateUtil.java
  50. 60 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/util/DozerConverterUtil.java
  51. 154 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/util/ExcelUtils.java
  52. 56 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/util/FileDirectory.java
  53. 33 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/util/FileName.java
  54. 39 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/util/FilePath.java
  55. 200 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/util/FileUtil.java
  56. 147 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/util/ImageCode.java
  57. 57 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/util/OrderNoUtil.java
  58. 68 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/util/QrUtil.java
  59. 61 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/util/SnowFlakeUtil.java
  60. 118 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/util/TreeUtil.java
  61. 17 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/util/UUIDUtils.java
  62. 82 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/util/WeChatUtil.java
  63. 69 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/domain/AdminDept.java
  64. 68 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/domain/AdminDict.java
  65. 76 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/domain/AdminMenu.java
  66. 110 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/domain/AdminPermit.java
  67. 73 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/domain/AdminPost.java
  68. 68 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/domain/AdminRole.java
  69. 75 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/domain/AdminTable.java
  70. 77 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/domain/AdminUser.java
  71. 68 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/domain/ClientAccount.java
  72. 103 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/domain/ClientUnion.java
  73. 101 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/domain/VisitAppoint.java
  74. 81 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/domain/VisitAppointTeam.java
  75. 16 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/mapper/IAdminDeptMapper.java
  76. 16 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/mapper/IAdminDictMapper.java
  77. 16 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/mapper/IAdminMenuMapper.java
  78. 16 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/mapper/IAdminPermitMapper.java
  79. 16 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/mapper/IAdminPostMapper.java
  80. 16 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/mapper/IAdminRoleMapper.java
  81. 78 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/mapper/IAdminTableMapper.java
  82. 16 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/mapper/IAdminUserMapper.java
  83. 16 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/mapper/IClientAccountMapper.java
  84. 16 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/mapper/IClientUnionMapper.java
  85. 89 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/mapper/IVFormMapper.java
  86. 16 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/mapper/IVisitAppointMapper.java
  87. 24 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/mapper/IVisitAppointTeamMapper.java
  88. 35 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/repository/AdminDeptRepository.java
  89. 32 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/repository/AdminDictRepository.java
  90. 35 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/repository/AdminMenuRepository.java
  91. 52 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/repository/AdminPermitRepository.java
  92. 36 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/repository/AdminPostRepository.java
  93. 35 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/repository/AdminRoleRepository.java
  94. 94 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/repository/AdminTableRepository.java
  95. 34 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/repository/AdminUserRepository.java
  96. 41 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/repository/ClientAccountRepository.java
  97. 52 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/repository/ClientUnionRepository.java
  98. 85 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/repository/VisitAppointRepository.java
  99. 39 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/repository/VisitAppointTeamRepository.java
  100. 19 0
      cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/manager/Md5PasswordManager.java

+ 13 - 0
.gitignore

@@ -0,0 +1,13 @@
+target/
+pom.xml.tag
+pom.xml.releaseBackup
+pom.xml.versionsBackup
+pom.xml.next
+release.properties
+dependency-reduced-pom.xml
+buildNumber.properties
+.mvn/timing.properties
+# https://github.com/takari/maven-wrapper#usage-without-binary-jar
+.mvn/wrapper/maven-wrapper.jar
+*.idea
+*.iml

+ 43 - 0
cloud-application/cloud-admin/cloud-admin-api/pom.xml

@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>cloud-admin</artifactId>
+        <groupId>com.sm</groupId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>cloud-admin-api</artifactId>
+
+    <dependencies>
+        <!--整合数据库-->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.5.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+            <version>2021.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-loadbalancer</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+        </dependency>
+        <!-- Hystrix -->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
+            <version>2.2.10.RELEASE</version>
+        </dependency>
+    </dependencies>
+
+</project>

+ 33 - 0
cloud-application/cloud-admin/cloud-admin-api/src/main/java/sm/cloud/admin/api/iservice/IAdminUserService.java

@@ -0,0 +1,33 @@
+package sm.cloud.admin.api.iservice;
+
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import sm.cloud.admin.api.model.vo.AdminUserVO;
+
+import java.io.Serializable;
+
+/**
+ * @Author 王彦委
+ * @Description 管理端用户内部方法
+ * @Date 2023-04-12 11:25
+ **/
+@RequestMapping("inner/user")
+@FeignClient(value = "cloud-admin", contextId = "user")
+public interface IAdminUserService {
+
+    /**
+     * <p>
+     * 内部使用-根据序号查询
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-04-12 11:32
+     **/
+    @GetMapping("findById")
+    AdminUserVO.FindByIdVO findById(@RequestParam("id") Serializable id);
+}

+ 32 - 0
cloud-application/cloud-admin/cloud-admin-api/src/main/java/sm/cloud/admin/api/iservice/IClientAccountService.java

@@ -0,0 +1,32 @@
+package sm.cloud.admin.api.iservice;
+
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import sm.cloud.admin.api.model.vo.ClientAccountVO;
+import sm.cloud.admin.api.model.vo.ClientUnionVO;
+
+import java.io.Serializable;
+
+/**
+ * @Author 王彦委
+ * @Description 客户帐号信息内部接口
+ * @Date 2023-04-12 14:36
+ **/
+@RequestMapping("inner/account")
+@FeignClient(value = "cloud-admin", contextId = "account")
+public interface IClientAccountService {
+    /**
+     * <p>
+     * 内部使用-根据序号查询
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-04-12 11:32
+     **/
+    @PostMapping("findById")
+    ClientAccountVO.FindByIdVO findById(@RequestParam("id") Serializable id);
+}

+ 32 - 0
cloud-application/cloud-admin/cloud-admin-api/src/main/java/sm/cloud/admin/api/iservice/IClientUnionService.java

@@ -0,0 +1,32 @@
+package sm.cloud.admin.api.iservice;
+
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import sm.cloud.admin.api.model.vo.ClientUnionVO;
+
+import java.io.Serializable;
+
+/**
+ * @Author 王彦委
+ * @Description 客户端用户信息
+ * @Date 2023-04-12 11:54
+ **/
+@RequestMapping("inner/union")
+@FeignClient(value = "cloud-admin", contextId = "union")
+public interface IClientUnionService {
+
+    /**
+     * <p>
+     * 内部使用-根据序号查询
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-04-12 11:32
+     **/
+    @PostMapping("findById")
+    ClientUnionVO.FindByIdVO findById(@RequestParam("id") Serializable id);
+}

+ 36 - 0
cloud-application/cloud-admin/cloud-admin-api/src/main/java/sm/cloud/admin/api/model/dto/AdminDeptDTO.java

@@ -0,0 +1,36 @@
+package sm.cloud.admin.api.model.dto;
+
+import lombok.Data;
+
+/**
+ * @Author 王彦委
+ * @Description 请求参数
+ * @Date 2023-03-23
+ **/
+@Data
+public class AdminDeptDTO {
+
+    /**
+     * 新增
+     */
+    @Data
+    public static class AddDTO {
+
+    }
+
+    /**
+     * 修改
+     */
+    @Data
+    public static class UpdateByIdDTO {
+
+    }
+
+    /**
+     * 分页
+     */
+    @Data
+    public static class PageDTO {
+
+    }
+}

+ 36 - 0
cloud-application/cloud-admin/cloud-admin-api/src/main/java/sm/cloud/admin/api/model/dto/AdminMenuDTO.java

@@ -0,0 +1,36 @@
+package sm.cloud.admin.api.model.dto;
+
+import lombok.Data;
+
+/**
+ * @Author 王彦委
+ * @Description 请求参数
+ * @Date 2023-03-22
+ **/
+@Data
+public class AdminMenuDTO {
+
+    /**
+     * 新增
+     */
+    @Data
+    public static class AddDTO {
+
+    }
+
+    /**
+     * 修改
+     */
+    @Data
+    public static class UpdateByIdDTO {
+
+    }
+
+    /**
+     * 分页
+     */
+    @Data
+    public static class PageDTO  {
+
+    }
+}

+ 36 - 0
cloud-application/cloud-admin/cloud-admin-api/src/main/java/sm/cloud/admin/api/model/dto/AdminRoleDTO.java

@@ -0,0 +1,36 @@
+package sm.cloud.admin.api.model.dto;
+
+import lombok.Data;
+
+/**
+ * @Author 王彦委
+ * @Description 请求参数
+ * @Date 2023-03-22
+ **/
+@Data
+public class AdminRoleDTO {
+
+    /**
+     * 新增
+     */
+    @Data
+    public static class AddDTO {
+
+    }
+
+    /**
+     * 修改
+     */
+    @Data
+    public static class UpdateByIdDTO {
+
+    }
+
+    /**
+     * 分页
+     */
+    @Data
+    public static class PageDTO {
+
+    }
+}

+ 110 - 0
cloud-application/cloud-admin/cloud-admin-api/src/main/java/sm/cloud/admin/api/model/dto/AdminTableDTO.java

@@ -0,0 +1,110 @@
+package sm.cloud.admin.api.model.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotEmpty;
+import java.util.List;
+
+/**
+ * @Author 王彦委
+ * @Description 请求参数
+ * @Date 2023-02-28
+ **/
+@Data
+public class AdminTableDTO {
+
+    /**
+     * 新增
+     */
+    @Data
+    public static class AddDTO {
+
+        @NotEmpty(message = "表名必填")
+        @ApiModelProperty(value = "表名", required = true)
+        private String tableName;
+
+        @NotEmpty(message = "表名必填")
+        @ApiModelProperty(value = "表名", required = true)
+        private String tableNameCn;
+
+        @NotEmpty(message = "字段必填")
+        @ApiModelProperty(value = "字段", required = true)
+        private List<Field> fieldJson;
+
+        @ApiModelProperty(value = "备注")
+        private String note;
+
+        @ApiModelProperty(value = "可读范围")
+        private String readRange;
+
+        @ApiModelProperty(value = "可写范围")
+        private String writeRange;
+    }
+
+    /**
+     * 实体属性
+     */
+    @Data
+    public static class Field {
+
+        @NotEmpty(message = "字段必填")
+        @ApiModelProperty(value = "字段中文", required = true)
+        private String fieldCn;
+
+        @NotEmpty(message = "字段必填")
+        @ApiModelProperty(value = "字段拼音", required = true)
+        private String field;
+
+        @NotEmpty(message = "字段类型必填")
+        @ApiModelProperty(value = "字段类型-int smallint bigint", required = true)
+        private String type;
+
+        @NotEmpty(message = "字段长度")
+        @Min(value = 0)
+        @ApiModelProperty(value = "字段长度", required = true)
+        private Integer length;
+
+        @ApiModelProperty(value = "是否唯一")
+        private String unique;
+
+        @ApiModelProperty(value = "字段说明")
+        private String comment;
+
+    }
+
+    /**
+     * 修改
+     */
+    @Data
+    public static class UpdateByIdDTO {
+
+        @NotEmpty(message = "序号必填")
+        @ApiModelProperty(value = "序号")
+        private String id;
+
+        @NotEmpty(message = "表名必填")
+        @ApiModelProperty(value = "表名")
+        private String tableName;
+
+        @NotEmpty(message = "表名必填")
+        @ApiModelProperty(value = "表名", required = true)
+        private String tableNameCn;
+
+        @NotEmpty(message = "字段必填")
+        @ApiModelProperty(value = "字段")
+        private List<Field> fieldJson;
+
+        @ApiModelProperty(value = "可读范围")
+        private String readRange;
+
+        @ApiModelProperty(value = "可写范围")
+        private String writeRange;
+
+        @ApiModelProperty(value = "备注")
+        private String note;
+    }
+
+
+}

+ 36 - 0
cloud-application/cloud-admin/cloud-admin-api/src/main/java/sm/cloud/admin/api/model/dto/AdminUserDTO.java

@@ -0,0 +1,36 @@
+package sm.cloud.admin.api.model.dto;
+
+import lombok.Data;
+
+/**
+ * @Author 王彦委
+ * @Description 请求参数
+ * @Date 2023-03-22
+ **/
+@Data
+public class AdminUserDTO {
+
+    /**
+     * 新增
+     */
+    @Data
+    public static class AddDTO {
+
+    }
+
+    /**
+     * 修改
+     */
+    @Data
+    public static class UpdateByIdDTO {
+
+    }
+
+    /**
+     * 分页
+     */
+    @Data
+    public static class PageDTO {
+
+    }
+}

+ 61 - 0
cloud-application/cloud-admin/cloud-admin-api/src/main/java/sm/cloud/admin/api/model/dto/LoginDTO.java

@@ -0,0 +1,61 @@
+package sm.cloud.admin.api.model.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
+/**
+ * @Author 王彦委
+ * @Description 客户端-登录参数
+ * @Date 2023-01-31 16:04
+ **/
+
+@Data
+public class LoginDTO {
+
+    /**
+     * 账号密码登录
+     */
+    @Data
+    public  static class PwdLoginDTO{
+        @NotEmpty(message = "帐号必填")
+        @ApiModelProperty(value = "帐号",required = true)
+        private String username;
+
+        @NotEmpty(message = "密码必填")
+        @ApiModelProperty(value = "密码",required = true)
+        private String password;
+
+        @NotEmpty(message = "图形验证码必填")
+        @ApiModelProperty(value = "图形验证码",required = true)
+        private String imgCode;
+    }
+
+    /**
+     * 手机验证码登录
+     */
+    @Data
+    public static class  PhoneLoginDTO{
+        @NotNull(message = "手机号必填")
+        @ApiModelProperty(value = "手机号",required = true)
+        private String phone;
+
+        @NotNull(message = "验证码必填")
+        @ApiModelProperty(value = "验证码",required = true)
+        private String code;
+    }
+
+    /**
+     * 微信小程序登录
+     */
+    @Data
+    public static class WxMiniLoginDTO{
+        /**
+         * 微信返回的code
+         */
+        private String code;
+    }
+
+}

+ 204 - 0
cloud-application/cloud-admin/cloud-admin-api/src/main/java/sm/cloud/admin/api/model/dto/VFormEntityDTO.java

@@ -0,0 +1,204 @@
+package sm.cloud.admin.api.model.dto;
+
+import com.alibaba.fastjson.JSONObject;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * @Author 王彦委
+ * @Description 表单请求参数
+ * @Date 2023-02-28 16:33
+ **/
+@Data
+public class VFormEntityDTO {
+
+    /**
+     * <p>
+     * 增加请求参数
+     * </p>
+     *
+     * @param
+     * @author 王彦委
+     * @date 2023-02-28 16:33
+     * @return
+     **/
+    @Data
+    public static class AddDTO {
+
+        @NotEmpty(message = "表名必填")
+        @ApiModelProperty(value = "表名", required = true)
+        private String tableName;
+
+        @NotNull(message = "数据必填")
+        @ApiModelProperty(value = "数据", required = true)
+        private JSONObject jsonObject;
+    }
+
+    /**
+     * 数据
+     */
+    @Data
+    public static class VFormData {
+        @NotEmpty(message = "字段")
+        @ApiModelProperty(value = "字段", required = true)
+        private String field;
+
+        @NotEmpty(message = "数据")
+        @ApiModelProperty(value = "数据", required = true)
+        private Object data;
+    }
+
+    /**
+     * 修改
+     */
+    @Data
+    public static class UpdateByIdDTO {
+
+        @NotEmpty(message = "表名必填")
+        @ApiModelProperty(value = "表名")
+        private String tableName;
+
+        @NotEmpty(message = "数据必填")
+        @ApiModelProperty(value = "数据")
+        private JSONObject jsonObject;
+    }
+
+    /**
+     * 动态查询
+     */
+    @Data
+    public static class SelectDTO {
+
+        @NotEmpty(message = "表名必填")
+        @ApiModelProperty(value = "表名")
+        private String tableName;
+
+        @ApiModelProperty(value = "分组列表-用于不同条件查询")
+        private List<Group> groupList;
+
+        @ApiModelProperty(value = "参数列表")
+        private List<Param> paramList;
+
+        @ApiModelProperty(value = "排序列表")
+        private List<Order> orderList;
+    }
+
+    /**
+     * 组
+     */
+    @Data
+    public static class Group {
+        @ApiModelProperty(value = "组名")
+        private String name;
+
+        @ApiModelProperty(value = "条件(or、and)")
+        private String where;
+    }
+
+    /**
+     * 参数
+     */
+    @Data
+    public static class Param {
+        @ApiModelProperty(value = "属性名")
+        private String field;
+
+        @ApiModelProperty(value = "符号( =、>、<、>=、<=)")
+        private String condition;
+
+        @ApiModelProperty(value = "属性值")
+        private String value;
+
+        @ApiModelProperty(value = "条件")
+        private String where;
+
+        @ApiModelProperty(value = "组名")
+        private String groupName;
+
+    }
+
+    /**
+     * 排序
+     */
+    @Data
+    public static class Order {
+        @ApiModelProperty(value = "属性名")
+        private String field;
+
+        @ApiModelProperty(value = "排序  升序-asc 降序-desc")
+        private String sort;
+    }
+
+    /**
+     * 动态分页查询
+     */
+    @Data
+    public static class SelectPageDTO {
+
+        @NotEmpty(message = "表名必填")
+        @ApiModelProperty(value = "表名", required = true)
+        private String tableName;
+
+        @ApiModelProperty(value = "分组列表")
+        private List<Group> groupList;
+
+        @ApiModelProperty(value = "参数列表")
+        private List<Param> paramList;
+
+        @ApiModelProperty(value = "排序列表")
+        private List<Order> orderList;
+
+        @Min(value = 0, message = "页数为数字且不能小于0")
+        @ApiModelProperty(value = "页数")
+        private Integer page;
+
+        @Min(value = 1, message = "行数为数字且不能小于1")
+        @ApiModelProperty(value = "行数")
+        private Integer limit;
+
+    }
+
+    /**
+     * 删除
+     */
+    @Data
+    public static class DeleteByIdDTO {
+        @NotEmpty(message = "序号必填")
+        @ApiModelProperty(value = "序号")
+        private String id;
+
+        @NotEmpty(message = "表名必填")
+        @ApiModelProperty(value = "表名")
+        private String tableName;
+    }
+
+    /**
+     * 级联查询
+     */
+    @Data
+    public static class SelectCascadeDTO {
+        @NotEmpty(message = "表名必填")
+        @ApiModelProperty(value = "表名")
+        private String tableName;
+
+        @ApiModelProperty(value = "上级序号")
+        private CascadeParam param;
+    }
+
+    @Data
+    public static class CascadeParam {
+        @NotEmpty(message = "属性名必填")
+        @ApiModelProperty(value = "属性名")
+        private String field;
+
+        @NotEmpty(message = "属性值必填")
+        @ApiModelProperty(value = "属性值")
+        private String value;
+    }
+
+}

+ 49 - 0
cloud-application/cloud-admin/cloud-admin-api/src/main/java/sm/cloud/admin/api/model/dto/VisitAppointDTO.java

@@ -0,0 +1,49 @@
+package sm.cloud.admin.api.model.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
+
+/*
+ * 功能描述:核销参数
+ * @param null
+ * @Return:
+ * @Author: 努阳
+ * @Date: 2023/5/18 14:27
+ */
+@Data
+public class VisitAppointDTO {
+
+    @ApiModelProperty(value = "预约类型 1.个人 2.企业", required = true)
+    @NotEmpty(message = "请选择预约类型")
+    private String visitAppointType;
+
+    @ApiModelProperty(value = "参观人数")
+    private String attendance;
+
+    @ApiModelProperty(value = "单位类型")
+    private String unitType;
+
+    @ApiModelProperty(value = "单位名称")
+    private String unitName;
+
+    @ApiModelProperty(value = "单位类型描述")
+    private String unitTypeText;
+
+    @ApiModelProperty(value = "带队领导")
+    private String leadership;
+
+    @ApiModelProperty(value = "带队领导职务")
+    private String leadershipPost;
+
+    @ApiModelProperty(value = "联系人")
+    private String contact;
+
+    @ApiModelProperty(value = "联系人电话")
+    private String ContactPhone;
+
+}

+ 28 - 0
cloud-application/cloud-admin/cloud-admin-api/src/main/java/sm/cloud/admin/api/model/vo/AdminDeptVO.java

@@ -0,0 +1,28 @@
+package sm.cloud.admin.api.model.vo;
+
+import lombok.Data;
+
+/**
+* @Author 王彦委
+* @Description 返回结果
+* @Date 2023-03-23
+**/
+@Data
+public class AdminDeptVO {
+
+/**
+* 详情
+*/
+@Data
+public static class SelectByIdVO {
+
+}
+
+/**
+* 分页
+*/
+@Data
+public static class PageVO {
+
+}
+}

+ 51 - 0
cloud-application/cloud-admin/cloud-admin-api/src/main/java/sm/cloud/admin/api/model/vo/AdminMenuVO.java

@@ -0,0 +1,51 @@
+package sm.cloud.admin.api.model.vo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author 王彦委
+ * @Description 返回结果
+ * @Date 2023-03-22
+ **/
+@Data
+public class AdminMenuVO {
+
+
+    /**
+     * 左侧菜单
+     */
+    @Data
+    public static class AdminAuthMenuVO {
+        private Long id;
+
+        @ApiModelProperty(value = "名称")
+        private String name;
+
+        @ApiModelProperty(value = "标题")
+        private String title;
+
+        @ApiModelProperty(value = "路径")
+        private String path;
+
+        @ApiModelProperty(value = "组件")
+        private String component;
+
+        @ApiModelProperty(value = "图标")
+        private String icon;
+
+        @ApiModelProperty(value = "单号")
+        @TableField("formId")
+        private String formId;
+
+        private String pid;
+
+        @ApiModelProperty(value = "子级")
+        private List<AdminAuthMenuVO> children;
+    }
+}

+ 28 - 0
cloud-application/cloud-admin/cloud-admin-api/src/main/java/sm/cloud/admin/api/model/vo/AdminRoleVO.java

@@ -0,0 +1,28 @@
+package sm.cloud.admin.api.model.vo;
+
+import lombok.Data;
+
+/**
+ * @Author 王彦委
+ * @Description 返回结果
+ * @Date 2023-03-22
+ **/
+@Data
+public class AdminRoleVO {
+
+    /**
+     * 详情
+     */
+    @Data
+    public static class SelectByIdVO {
+
+    }
+
+    /**
+     * 分页
+     */
+    @Data
+    public static class PageVO {
+
+    }
+}

+ 21 - 0
cloud-application/cloud-admin/cloud-admin-api/src/main/java/sm/cloud/admin/api/model/vo/AdminTableVO.java

@@ -0,0 +1,21 @@
+package sm.cloud.admin.api.model.vo;
+
+import lombok.Data;
+
+/**
+* @Author 王彦委
+* @Description 返回结果
+* @Date 2023-03-09
+**/
+@Data
+public class AdminTableVO {
+
+/**
+* 详情
+*/
+@Data
+public static class SelectByIdVO {
+
+}
+
+}

+ 24 - 0
cloud-application/cloud-admin/cloud-admin-api/src/main/java/sm/cloud/admin/api/model/vo/AdminUserVO.java

@@ -0,0 +1,24 @@
+package sm.cloud.admin.api.model.vo;
+
+import lombok.Data;
+
+/**
+ * @Author 王彦委
+ * @Description 返回结果
+ * @Date 2023-03-22
+ **/
+@Data
+public class AdminUserVO {
+
+    /**
+     * 详情
+     */
+    @Data
+    public static class FindByIdVO {
+        /**
+         * 角色
+         */
+        private String roleId;
+    }
+
+}

+ 24 - 0
cloud-application/cloud-admin/cloud-admin-api/src/main/java/sm/cloud/admin/api/model/vo/ClientAccountVO.java

@@ -0,0 +1,24 @@
+package sm.cloud.admin.api.model.vo;
+
+import lombok.Data;
+
+/**
+ * @Author 王彦委
+ * @Description 返回结果
+ * @Date 2023-03-22
+ **/
+@Data
+public class ClientAccountVO {
+
+    /**
+     * 详情
+     */
+    @Data
+    public static class FindByIdVO {
+        /**
+         * 联合序号
+         */
+        private String unionId;
+    }
+
+}

+ 24 - 0
cloud-application/cloud-admin/cloud-admin-api/src/main/java/sm/cloud/admin/api/model/vo/ClientUnionVO.java

@@ -0,0 +1,24 @@
+package sm.cloud.admin.api.model.vo;
+
+import lombok.Data;
+
+/**
+ * @Author 王彦委
+ * @Description 返回结果
+ * @Date 2023-03-22
+ **/
+@Data
+public class ClientUnionVO {
+
+    /**
+     * 详情
+     */
+    @Data
+    public static class FindByIdVO {
+        /**
+         * 角色
+         */
+        private String roleId;
+    }
+
+}

+ 60 - 0
cloud-application/cloud-admin/cloud-admin-api/src/main/java/sm/cloud/admin/api/model/vo/LoginVO.java

@@ -0,0 +1,60 @@
+package sm.cloud.admin.api.model.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Author 王彦委
+ * @Description 登录返回结果
+ * @Date 2023-01-31 16:05
+ **/
+@Data
+public class LoginVO {
+
+    /**
+     * 帐号密码登录返回结果
+     */
+    @Data
+    public static class PwdLoginVO {
+        @ApiModelProperty(value = "令牌")
+        private String token;
+
+        @ApiModelProperty(value = "角色")
+        private String roleId;
+    }
+
+    /**
+     * 手机号验证码登录返回结果
+     */
+    @Data
+    public static class PhoneLoginVO {
+        @ApiModelProperty(value = "令牌")
+        private String token;
+    }
+
+    /**
+     * 微信小程序登录
+     */
+    @Data
+    public static class WxMiniLoginVO {
+
+        @ApiModelProperty(value = "令牌")
+        private String token;
+
+        @ApiModelProperty(value = "授权序号")
+        private String authId;
+
+        @ApiModelProperty(value = "角色")
+        private String roleId;
+    }
+
+    /**
+     * 微信小程序登录
+     */
+    @Data
+    public static class WxMpLoginVO {
+
+        @ApiModelProperty(value = "令牌")
+        private String token;
+    }
+}

+ 70 - 0
cloud-application/cloud-admin/cloud-admin-server/pom.xml

@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>cloud-admin</artifactId>
+        <groupId>com.sm</groupId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>cloud-admin-server</artifactId>
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.session</groupId>
+            <artifactId>spring-session-data-redis</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.sm</groupId>
+            <artifactId>cloud-admin-api</artifactId>
+            <version>1.0-SNAPSHOT</version>
+            <scope>compile</scope>
+        </dependency>
+        <!-- Sa-Token 权限认证,在线文档:https://sa-token.cc -->
+        <dependency>
+            <groupId>cn.dev33</groupId>
+            <artifactId>sa-token-spring-boot-starter</artifactId>
+            <version>1.33.0</version>
+        </dependency>
+
+        <!-- Sa-Token 整合 Redis (使用 jackson 序列化方式) -->
+        <dependency>
+            <groupId>cn.dev33</groupId>
+            <artifactId>sa-token-dao-redis-jackson</artifactId>
+            <version>1.33.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.google.zxing</groupId>
+            <artifactId>javase</artifactId>
+            <version>3.2.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>4.1.2</version>
+        </dependency>
+        <dependency>
+            <groupId>org.bouncycastle</groupId>
+            <artifactId>bcprov-jdk16</artifactId>
+            <version>1.46</version>
+        </dependency>
+
+
+    </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 23 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/AdminApplication.java

@@ -0,0 +1,23 @@
+package sm.cloud.admin.server;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
+
+/**
+ * @Author 王彦委
+ * @Description 管理模块
+ * @Date 2023-03-08 17:25
+ **/
+//属性用来设置Session失效的时间,单位是秒,-1表示永不失效。如果配置1小时失效则是60 * 60 * 1
+@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 60*60*24)
+@EnableDiscoveryClient
+@MapperScan(basePackages = "sm.cloud.admin.server.dao.mapper")
+@SpringBootApplication(scanBasePackages = "sm.cloud.admin")
+public class AdminApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(AdminApplication.class, args);
+    }
+}

+ 47 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/controller/AdminMenuController.java

@@ -0,0 +1,47 @@
+package sm.cloud.admin.server.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import sm.cloud.admin.server.core.entity.RestResult;
+import sm.cloud.admin.server.service.AdminMenuService;
+
+import javax.annotation.Resource;
+
+/**
+ * <p>
+ * 前端控制器
+ * </p>
+ *
+ * @author 王彦委
+ * @since 2023-03-22
+ */
+@RestController
+@RequestMapping("/admin-menu")
+@Validated
+@Api(tags = "菜单接口")
+public class AdminMenuController {
+
+    @Resource
+    private AdminMenuService service;
+
+    /**
+     * <p>
+     * 查询用户拥有的菜单
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-01-11 10:35
+     **/
+    @ApiOperation("管理端左侧菜单")
+    @PostMapping(value = "authMenu")
+    public RestResult authMenu() {
+        return RestResult.success(service.adminAuthMenuHandler());
+    }
+
+}

+ 109 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/controller/AdminTableController.java

@@ -0,0 +1,109 @@
+package sm.cloud.admin.server.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import sm.cloud.admin.api.model.dto.AdminTableDTO;
+import sm.cloud.admin.api.model.vo.AdminTableVO;
+import sm.cloud.admin.server.core.entity.RestResult;
+import sm.cloud.admin.server.core.util.DozerConverterUtil;
+import sm.cloud.admin.server.dao.domain.AdminTable;
+import sm.cloud.admin.server.service.AdminTableService;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import javax.validation.constraints.Pattern;
+
+/**
+ * <p>
+ * 前端控制器
+ * </p>
+ *
+ * @author 王彦委
+ * @since 2023-03-09
+ */
+@RestController
+@RequestMapping("/admin-table")
+@Validated
+@Api(tags = "库表管理")
+public class AdminTableController {
+
+    @Resource
+    private AdminTableService service;
+
+
+
+     /**
+     * <p>
+     * 新增
+     * </p>
+     *
+     * @author 王彦委
+     * @date 2023-02-28
+     **/
+    @ApiOperation("新增")
+    @PostMapping(value = "add", consumes = "application/json;utf-8")
+    public RestResult add(@Valid @RequestBody AdminTableDTO.AddDTO addDTO) {
+        return service.addHandler(addDTO) ? RestResult.success() : RestResult.error();
+    }
+
+    /**
+     * <p>
+     * 修改
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-03-09
+     **/
+    @ApiOperation("修改")
+    @PostMapping(value = "updateById", consumes = "application/json;utf-8")
+    public RestResult updateById(@Valid @RequestBody AdminTableDTO.UpdateByIdDTO updateByIdDTO) {
+        return service.updateByIdHandler(updateByIdDTO) ? RestResult.success() : RestResult.error();
+    }
+
+
+    /**
+     * <p>
+     * 查询详情
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-03-09
+     **/
+    @ApiOperation("查询详情")
+    @PostMapping(value = "selectById/{id}")
+    public RestResult<AdminTableVO.SelectByIdVO> selectById(@ApiParam(name = "id", value = "序号", required = true)
+                                                            @Pattern(regexp = "^[0-9]*$", message = "序号只能为数字")
+                                                            @PathVariable String id) {
+        AdminTable entity = service.getById(Long.valueOf(id));
+        return RestResult.success(DozerConverterUtil.map(entity, AdminTableVO.SelectByIdVO.class));
+    }
+
+
+    /**
+     * <p>
+     * 根据序号删除
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-03-09
+     **/
+    @ApiOperation("删除")
+    @PostMapping("deleteById/{id}")
+    public RestResult deleteById(@ApiParam(name = "id", value = "序号", required = true)
+                                 @Pattern(regexp = "^[0-9]*$", message = "序号只能为数字")
+                                 @PathVariable String id) {
+        return service.removeById(Long.valueOf(id)) ? RestResult.success() : RestResult.error();
+    }
+
+
+}

+ 89 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/controller/ClientController.java

@@ -0,0 +1,89 @@
+package sm.cloud.admin.server.controller;
+
+import cn.dev33.satoken.stp.StpUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+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 sm.cloud.admin.api.model.dto.LoginDTO;
+import sm.cloud.admin.api.model.vo.LoginVO;
+import sm.cloud.admin.server.core.entity.RestResult;
+import sm.cloud.admin.server.service.ClientService;
+import sm.cloud.admin.server.service.ManagerService;
+import sm.cloud.admin.server.service.WxMiniLoginService;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+
+/**
+ * @Author 王彦委
+ * @Description 登录接口
+ * @Date 2023-03-22 09:06
+ **/
+@Validated
+@Api(tags = "客户端-登录接口")
+@RequestMapping("client")
+@RestController
+public class ClientController {
+
+    @Resource
+    private ClientService clientService;
+    @Resource
+    private WxMiniLoginService wxMiniLoginService;
+
+    /**
+     * <p>
+     * 管理端-帐号密码登录
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-01-31 16:02
+     **/
+    @ApiOperation(value = "帐号密码登录")
+    @PostMapping(value = "pwdLogin")
+    public RestResult<LoginVO.PwdLoginVO> pwdLogin(@RequestBody @Valid LoginDTO.PwdLoginDTO pwdLoginDTO) {
+        return RestResult.success(clientService.pwdLoginHandler(pwdLoginDTO));
+    }
+
+
+    /**
+     * <p>
+     * 微信小程序登录
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-02-01 11:28
+     **/
+    @ApiOperation(value = "微信小程序登录")
+    @PostMapping(value = "wxMiniLogin")
+    public RestResult wxMiniLogin(@RequestBody @Valid LoginDTO.WxMiniLoginDTO wxMiniLoginDTO) {
+        return RestResult.success(wxMiniLoginService.wxMiniLoginHandler(wxMiniLoginDTO));
+    }
+
+
+    /**
+     * <p>
+     * 管理端-退出管理
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-03-27 10:24
+     **/
+    @ApiOperation(value = "退出接口")
+    @PostMapping(value = "quit")
+    public RestResult quit() {
+        // 当前会话注销登录
+        StpUtil.logout();
+        return RestResult.success();
+    }
+
+}

+ 54 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/controller/ExcelController.java

@@ -0,0 +1,54 @@
+package sm.cloud.admin.server.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+import sm.cloud.admin.server.core.util.ExcelUtils;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * @Author 王彦委
+ * @Description excel接口 参考 https://www.cnblogs.com/cn-mrs/articles/16481052.html
+ * @Date 2023-03-28 17:33
+ **/
+@RequestMapping("excel")
+@RestController
+@Api(tags = "excel接口")
+public class ExcelController {
+
+    /**
+     * <p>
+     * excel 导出
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-03-28 17:42
+     **/
+    @ApiOperation("导出 excel")
+    @PostMapping("export")
+    public void export(HttpServletResponse response) throws Exception {
+        ExcelUtils.export(response, null, "");
+    }
+
+    /**
+     * <p>
+     * excel导入
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-03-28 17:43
+     **/
+    @ApiOperation("导入excel")
+    @PostMapping("import")
+    public void imp(MultipartFile file) throws Exception {
+        ExcelUtils.imp(file);
+    }
+}

+ 52 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/controller/FileController.java

@@ -0,0 +1,52 @@
+package sm.cloud.admin.server.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+import sm.cloud.admin.server.core.entity.RestResult;
+import sm.cloud.admin.server.core.util.FileUtil;
+
+/**
+ * 文件管理
+ */
+@RequestMapping("local")
+@RestController
+@Api(tags = "文件管理")
+public class FileController {
+
+    @Autowired
+    private FileUtil fileUtil;
+
+    /**
+     * 功能描述:文件上传
+     *
+     * @auther: wangyanwei
+     * @date: 2019/4/22 9:33
+     * @param:
+     * @return:
+     */
+    @ApiOperation("doc、excel等文件上传接口")
+    @ResponseBody
+    @PostMapping("fileUpload")
+    public RestResult fileUpload(MultipartFile file) {
+        if (file.isEmpty()) {
+            return RestResult.error("文件内容为空!");
+        }
+        //写入
+        String filePath = fileUtil.writeToDisk(file);
+        return RestResult.success(filePath);
+    }
+
+//    @PostMapping("fileDelete")
+//    @ApiOperation("文件删除")
+    public RestResult fileDelete(String path) {
+        return RestResult.success(fileUtil.deleteFile(path));
+    }
+}
+
+

+ 70 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/controller/ManagerController.java

@@ -0,0 +1,70 @@
+package sm.cloud.admin.server.controller;
+
+import cn.dev33.satoken.stp.StpUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+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 sm.cloud.admin.api.model.dto.LoginDTO;
+import sm.cloud.admin.api.model.vo.LoginVO;
+import sm.cloud.admin.server.core.entity.RestResult;
+import sm.cloud.admin.server.service.ManagerService;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.validation.Valid;
+
+/**
+ * @Author 王彦委
+ * @Description 登录接口
+ * @Date 2023-03-22 09:06
+ **/
+@Validated
+@Api(tags = "管理端-登录接口")
+@RequestMapping("manager")
+@RestController
+public class ManagerController {
+
+    @Resource
+    private ManagerService managerService;
+
+
+    /**
+     * <p>
+     * 管理端-帐号密码登录
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-01-31 16:02
+     **/
+    @ApiOperation(value = "帐号密码登录")
+    @PostMapping(value = "pwdLogin")
+    public RestResult<LoginVO.PwdLoginVO> pwdLogin(@RequestBody @Valid LoginDTO.PwdLoginDTO pwdLoginDTO) {
+        return RestResult.success(managerService.pwdLoginHandler(pwdLoginDTO));
+    }
+
+
+    /**
+     * <p>
+     * 管理端-退出管理
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-03-27 10:24
+     **/
+    @ApiOperation(value = "退出接口")
+    @PostMapping(value = "quit")
+    public RestResult quit() {
+        // 当前会话注销登录
+        StpUtil.logout();
+        return RestResult.success();
+    }
+
+}

+ 68 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/controller/QrController.java

@@ -0,0 +1,68 @@
+package sm.cloud.admin.server.controller;
+
+import cn.hutool.core.codec.Base64;
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.EncodeHintType;
+import com.google.zxing.MultiFormatWriter;
+import com.google.zxing.client.j2se.MatrixToImageWriter;
+import com.google.zxing.common.BitMatrix;
+import com.google.zxing.qrcode.QRCodeWriter;
+import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
+import io.swagger.annotations.Api;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import sm.cloud.admin.server.core.entity.RestResult;
+import sm.cloud.admin.server.core.util.QrUtil;
+
+import javax.imageio.ImageIO;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @Author 王彦委
+ * @Description 二维码接口
+ * @Date 2023-03-28 16:29
+ **/
+@RequestMapping("qr")
+@RestController
+@Api(tags = "二维码接口")
+public class QrController {
+
+    @GetMapping("/create1")
+    public void create1(HttpServletResponse response) throws Exception {
+        String format = "png";
+        String content = "http://www.baidu.com";
+        ServletOutputStream out = response.getOutputStream();
+        Map<EncodeHintType, Object> config = new HashMap<>();
+        config.put(EncodeHintType.CHARACTER_SET, "UTF-8");
+        config.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
+        config.put(EncodeHintType.MARGIN, 0);
+        //二维码宽
+        int width = 200;
+        //二维码高
+        int height = 200;
+        BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, config);
+        MatrixToImageWriter.writeToStream(bitMatrix, format, out);
+        System.out.println("二维码生成完毕,已经输出到页面中。");
+    }
+
+    /**
+     * 生成加密后的二维码字符串 Base64字符串二维码
+     *
+     * @param content 二维码正文
+     * @return base64 编码后的字符串
+     */
+    @GetMapping("/create2")
+    public RestResult create2(String content) {
+        return RestResult.success(QrUtil.createBase64(content));
+    }
+
+}

+ 163 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/controller/VFormController.java

@@ -0,0 +1,163 @@
+package sm.cloud.admin.server.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.validation.annotation.Validated;
+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 sm.cloud.admin.api.model.dto.VFormEntityDTO;
+import sm.cloud.admin.server.core.entity.RestResult;
+import sm.cloud.admin.server.core.exception.CustomBusinessException;
+import sm.cloud.admin.server.dao.repository.AdminDictRepository;
+import sm.cloud.admin.server.service.VFormService;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.validation.Valid;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @Author 王彦委
+ * @Description 首页接口
+ * @Date 2023-02-28 10:59
+ **/
+@Validated
+@RequestMapping("v-form")
+@Api(tags = "表单接口")
+@RestController
+public class VFormController {
+
+    @Resource
+    private VFormService vFormService;
+    @Resource
+    private HttpServletRequest request;
+
+    /**
+     * <p>
+     * 增加
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-01-09 15:34
+     **/
+    @ApiOperation("增加")
+    @PostMapping(value = "add", consumes = "application/json;utf-8")
+    public RestResult add(@Valid @RequestBody VFormEntityDTO.AddDTO addDTO) {
+
+        //接口权限
+        String permission = request.getHeader("X-Permission");
+        if (StringUtils.isBlank(permission)) {
+            return RestResult.error("permission必填!");
+        }
+
+        return vFormService.addEntityHandler(addDTO, permission) ? RestResult.success() : RestResult.error();
+    }
+
+
+    /**
+     * <p>
+     * 修改
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-01-13 11:43
+     **/
+    @ApiOperation("修改")
+    @PostMapping(value = "updateById", consumes = "application/json;utf-8")
+    public RestResult updateById(@Valid @RequestBody VFormEntityDTO.UpdateByIdDTO updateByIdDTO) {
+        //判断序号
+        if (Objects.isNull(updateByIdDTO.getJsonObject().get("id"))) {
+            throw new CustomBusinessException("序号必填");
+        }
+        String permission = request.getHeader("X-Permission");
+        //权限
+        if (StringUtils.isBlank(permission)) {
+            return RestResult.error("permission必填!");
+        }
+
+        return vFormService.updateEntityHandler(updateByIdDTO, permission) ? RestResult.success() : RestResult.error();
+    }
+
+    /**
+     * <p>
+     * 动态查询
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-02-28 16:51
+     **/
+    @ApiOperation("动态查询")
+    @PostMapping(value = "select", consumes = "application/json;utf-8")
+    public RestResult select(@Valid @RequestBody VFormEntityDTO.SelectDTO selectDTO) {
+
+        String permission = request.getHeader("X-Permission");
+        if (StringUtils.isBlank(permission)) {
+            return RestResult.error("permission必填!");
+        }
+        return RestResult.success(vFormService.select(selectDTO, permission));
+    }
+
+    /**
+     * <p>
+     * 动态查询分页
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-02-28 16:51
+     **/
+    @ApiOperation("动态分页查询")
+    @PostMapping(value = "selectPage", consumes = "application/json;utf-8")
+    public RestResult selectPage(@Valid @RequestBody VFormEntityDTO.SelectPageDTO selectPageDTO) {
+        String permission = request.getHeader("X-Permission");
+        return RestResult.success(vFormService.selectPage(selectPageDTO, permission));
+    }
+
+    /**
+     * <p>
+     * 删除
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-03-11 11:18
+     **/
+    @Resource
+    private AdminDictRepository adminDictRepository;
+    @ApiOperation("删除")
+    @PostMapping(value = "deleteById", consumes = "application/json;utf-8")
+    public RestResult deleteById(@Valid @RequestBody VFormEntityDTO.DeleteByIdDTO deleteByIdDTO) {
+        return RestResult.success(vFormService.deleteById(deleteByIdDTO));
+    }
+
+
+    /**
+     * <p>
+     * 级联查询
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-03-11 11:18
+     **/
+    @ApiOperation("查询-级联查询")
+    @PostMapping(value = "selectCascade", consumes = "application/json;utf-8")
+    public RestResult<List<JSONObject>> selectCascade(@Valid @RequestBody VFormEntityDTO.SelectCascadeDTO selectCascadeDTO) {
+        String permission = request.getHeader("X-Permission");
+        return RestResult.success(vFormService.selectCascade(selectCascadeDTO, permission));
+    }
+}

+ 57 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/controller/ValidateController.java

@@ -0,0 +1,57 @@
+package sm.cloud.admin.server.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+import sm.cloud.admin.server.core.entity.RestResult;
+import sm.cloud.admin.server.core.interfaces.ICacheService;
+import sm.cloud.admin.server.core.util.ImageCode;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @Author 王彦委
+ * @Description 验证码
+ * @Date 2023-04-10 11:26
+ **/
+@Validated
+@RequestMapping("validate")
+@Api(tags = "短信验证码接口")
+@RestController
+public class ValidateController {
+
+    @Resource
+    private ICacheService cacheService;
+    /**
+     * <p>
+     * 图形验证码
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-04-10 11:47
+     **/
+    @ApiOperation("图型验证码")
+    @RequestMapping(value = "getImgCode", method = {RequestMethod.GET,RequestMethod.POST})
+    public RestResult getImgValidateCodeByPhone(HttpServletRequest request) {
+        //画图工具类
+        ImageCode imageCode = new ImageCode();
+        //转成base64
+        String base64 = ImageCode.getBase64(imageCode.getImage());
+        //将key和code都保存在redis,时间可以设置短一点没有问题,不要设置太短 60s
+        System.out.println("======>imgCode:" + imageCode.getCode());
+        System.out.println("======>imgCode:" +request.getSession().getId());
+        cacheService.setCache("VALIDATE_CODE_IMAGE_" + request.getSession().getId(), imageCode.getCode(), 60, TimeUnit.SECONDS);
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("imgKey", request.getSession().getId());
+        jsonObject.put("img", "data:image/jpeg;base64," + base64);
+        return RestResult.success(jsonObject);
+    }
+}

+ 56 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/controller/VisitAppointController.java

@@ -0,0 +1,56 @@
+package sm.cloud.admin.server.controller;/**
+ * Created by Intellij IDEA.
+ * User:  nuyang
+ * Date:  2023/4/7
+ */
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.hibernate.validator.constraints.Range;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import sm.cloud.admin.api.model.dto.VisitAppointDTO;
+import sm.cloud.admin.api.model.vo.AdminTableVO;
+import sm.cloud.admin.server.core.entity.RestResult;
+import sm.cloud.admin.server.core.util.DozerConverterUtil;
+import sm.cloud.admin.server.dao.domain.AdminTable;
+import sm.cloud.admin.server.service.VisitAppointService;
+
+import javax.validation.Valid;
+import javax.validation.constraints.Pattern;
+
+/**
+ * @Author: 刘明
+ * @Description:
+ * @Date: 2023/4/7 11:23
+ */
+@Validated
+@Api(tags = "预约接口")
+@RequestMapping("/visit_appoint")
+@RestController
+public class VisitAppointController {
+
+    @Autowired
+    private VisitAppointService service;
+
+    @ApiOperation("查询指定日期剩余的场次数量")
+    @PostMapping(value = "residue/{reservationDate}")
+    public RestResult residue(@ApiParam(name = "reservationDate", value = "序号", required = true)
+                                                            @PathVariable String reservationDate) {
+
+        return RestResult.success(service.doResidue(reservationDate));
+    }
+
+
+    @ApiOperation("核销参观记录接口")
+    @PostMapping(value = "verification", consumes = "application/json;utf-8")
+    public RestResult verification(@Valid @RequestBody VisitAppointDTO visitAppointDTO) {
+
+        service.doVerification(visitAppointDTO);
+        return RestResult.success();
+    }
+
+
+}

+ 33 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/config/JacksonConfig.java

@@ -0,0 +1,33 @@
+package sm.cloud.admin.server.core.config;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+
+/**
+ * @Author 王彦委
+ * @Description 解决前端Long字段精度丢失问题
+ * @Date 21:59 2022/5/21
+ **/
+
+//@Configuration
+public class JacksonConfig {
+    @Bean
+    public ObjectMapper objectMapper() {
+        ObjectMapper objectMapper = new ObjectMapper();
+        SimpleModule simpleModule = new SimpleModule();
+        simpleModule.addSerializer(Long.class, ToStringSerializer.instance)
+                .addSerializer(Long.TYPE, ToStringSerializer.instance);
+        objectMapper.registerModule(simpleModule);
+        //JsonInclude.Include.NON_NULL 属性为NULL 不序列化
+        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+        //JsonInclude.Include.NON_EMPTY 属性为空字符串 不序列化
+//        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
+        return objectMapper;
+    }
+}
+

+ 41 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/config/Knife4jConfiguration.java

@@ -0,0 +1,41 @@
+package sm.cloud.admin.server.core.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.annotation.Order;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;
+
+@Configuration
+@EnableSwagger2WebMvc
+public class Knife4jConfiguration {
+    // 定义分隔符,配置Swagger多包
+    private static final String splitor = ";";
+    @Bean(value = "dockerBean")
+    public Docket dockerBean() {
+        //指定使用Swagger2规范
+        Docket docket=new Docket(DocumentationType.SWAGGER_2)
+                .apiInfo(new ApiInfoBuilder()
+                //描述字段支持Markdown语法
+                .description("# Knife4j RESTful APIs")
+                .termsOfServiceUrl("https://doc.xiaominfo.com/")
+                .contact("xiaoymin@foxmail.com")
+                .version("1.0")
+                .build())
+                //分组名称
+                .groupName("管理服务")
+                .select()
+                //这里指定Controller扫描包路径
+                .apis(RequestHandlerSelectors.basePackage("sm.cloud.admin"))
+                .paths(PathSelectors.any())
+                .build();
+        return docket;
+    }
+
+
+
+}

+ 32 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/config/ThreadPoolConfig.java

@@ -0,0 +1,32 @@
+package sm.cloud.admin.server.core.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.ThreadPoolExecutor;
+
+@Configuration
+@EnableAsync // 允许使用异步方法
+public class ThreadPoolConfig {
+
+    @Bean
+    public Executor threadPoolTaskExecutor() {
+        ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
+        // 设置核心线程数
+        threadPoolTaskExecutor.setCorePoolSize(5);
+        // 设置最大线程数
+        threadPoolTaskExecutor.setMaxPoolSize(5);
+        // 设置工作队列大小
+        threadPoolTaskExecutor.setQueueCapacity(2000);
+        // 设置线程名称前缀
+        threadPoolTaskExecutor.setThreadNamePrefix("threadPoolTaskExecutor-->");
+        // 设置拒绝策略.当工作队列已满,线程数为最大线程数的时候,接收新任务抛出RejectedExecutionException异常
+        threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
+        // 初始化线程池
+        threadPoolTaskExecutor.initialize();
+        return threadPoolTaskExecutor;
+    }
+}

+ 186 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/config/WebMvcConfig.java

@@ -0,0 +1,186 @@
+package sm.cloud.admin.server.core.config;
+
+import cn.dev33.satoken.exception.NotPermissionException;
+import cn.dev33.satoken.interceptor.SaInterceptor;
+import cn.dev33.satoken.router.SaRouter;
+import cn.dev33.satoken.stp.StpUtil;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
+import sm.cloud.admin.server.core.exception.CustomBusinessException;
+import sm.cloud.admin.server.core.interfaces.ICacheService;
+import sm.cloud.admin.server.core.util.CacheInfoUtil;
+import sm.cloud.admin.server.dao.domain.AdminUser;
+import sm.cloud.admin.server.dao.domain.ClientAccount;
+import sm.cloud.admin.server.dao.domain.ClientUnion;
+import sm.cloud.admin.server.dao.repository.AdminUserRepository;
+import sm.cloud.admin.server.dao.repository.ClientAccountRepository;
+import sm.cloud.admin.server.dao.repository.ClientUnionRepository;
+import sm.cloud.admin.server.manager.RoleManager;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 参考:https://blog.csdn.net/z17806289513/article/details/123659224
+ * 放行 knife4j
+ */
+@Slf4j
+@Configuration
+public class WebMvcConfig extends WebMvcConfigurationSupport {
+
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    private ICacheService cacheService;
+    @Resource
+    private ClientUnionRepository unionRepository;
+    @Resource
+    private AdminUserRepository userRepository;
+    @Resource
+    private CacheInfoUtil cacheInfoUtil;
+    @Resource
+    private ClientAccountRepository accountRepository;
+
+    //获取配置文件中图片的路径
+    @Value("${file.imagesPath}")
+    private String mImagesPath;
+
+    @Override
+    public void addResourceHandlers(ResourceHandlerRegistry registry) {
+        registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");
+        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
+
+        //配置图片代理
+        registry.addResourceHandler("/images/**").addResourceLocations(mImagesPath);
+    }
+
+    @Override
+    protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
+        MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter =
+                new MappingJackson2HttpMessageConverter();
+        ObjectMapper objectMapper = new ObjectMapper();
+        SimpleModule simpleModule = new SimpleModule();
+        simpleModule.addSerializer(Long.class, ToStringSerializer.instance)
+                .addSerializer(Long.TYPE, ToStringSerializer.instance);
+        objectMapper.registerModule(simpleModule);
+        //JsonInclude.Include.NON_NULL 属性为NULL 不序列化
+        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+        //JsonInclude.Include.NON_EMPTY 属性为空字符串 不序列化
+//        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
+
+        mappingJackson2HttpMessageConverter.setObjectMapper(objectMapper);
+        converters.add(mappingJackson2HttpMessageConverter);
+        super.configureMessageConverters(converters);
+    }
+
+
+    @Override
+    protected void addInterceptors(InterceptorRegistry registry) {
+        registry.addInterceptor(new SaInterceptor(handler -> {
+            //权限
+            String xPermission = request.getHeader("X-Permission");
+            if (StringUtils.isBlank(xPermission)) {
+                throw new CustomBusinessException("X-Permission必填");
+            }
+            //角色
+            String xRole = request.getHeader("X-Role");
+            SaRouter.match("/**").notMatch(a -> {
+                //放行不需要验证
+                String whiteList = cacheService.getCache(RoleManager.W_PREFIX);
+                if (StringUtils.isBlank(whiteList)) {
+                    return false;
+                }
+                List<String> list = Arrays.asList(whiteList.split(","));
+
+                return list.contains(xPermission.trim());
+            }).notMatch(b -> {
+                //验证是否登录
+                StpUtil.checkLogin();
+                //放行 只需要登录的
+                String whiteList = cacheService.getCache(RoleManager.LOGIN_PREFIX);
+                if (StringUtils.isBlank(whiteList)) {
+                    return false;
+                }
+                List<String> list = Arrays.asList(whiteList.split(","));
+
+                return list.contains(xPermission.trim());
+            }).check(c -> {
+                //缓存中
+                Object roleIdCache = StpUtil.getSession().get("roleId_cache");
+                //角色没有变化
+
+                if ((StringUtils.isNotBlank(xRole) && Objects.nonNull(roleIdCache) && !xRole.equalsIgnoreCase(roleIdCache.toString()))
+                        || (StringUtils.isBlank(xRole) && Objects.nonNull(roleIdCache))
+                        || (StringUtils.isNotBlank(xRole) && Objects.isNull(roleIdCache))) {
+                    String roleIdStr = null;
+                    //对比角色
+                    String loginDevice = StpUtil.getLoginDevice();
+                    if (StringUtils.isNotBlank(loginDevice) && loginDevice.equalsIgnoreCase("manager")) {
+                        AdminUser adminUser = userRepository.getById(StpUtil.getLoginIdAsLong());
+                        roleIdStr = adminUser.getRoleId();
+                    } else {
+                        String unionId = cacheInfoUtil.getUnionId() + "";
+                        if (StringUtils.isBlank(unionId)) {
+                            ClientAccount clientAccount = accountRepository.getById(StpUtil.getLoginIdAsLong());
+                            if (Objects.isNull(clientAccount.getUnionId())) {
+                                throw new CustomBusinessException("用户信息有误!");
+                            }
+                            unionId = clientAccount.getUnionId() + "";
+                        }
+                        ClientUnion clientUnion = unionRepository.getById(unionId);
+                        roleIdStr = clientUnion.getRoleId();
+                    }
+
+                    //与数据库同步
+                    StpUtil.getSession().set("roleId", roleIdStr);
+                    //与使用端同步
+                    if (StringUtils.isNotBlank(xRole)) {
+                        StpUtil.getSession().set("roleId_cache", xRole);
+                    }
+                }
+                //标识
+                boolean hasPermit = false;
+                if (Objects.nonNull(StpUtil.getSession().get("roleId"))) {
+                    String[] roleIdList = StpUtil.getSession().getString("roleId").split(",");
+                    for (int i = 0; i < roleIdList.length; i++) {
+                        String permitList = cacheService.getCache(RoleManager.PREFIX + roleIdList[i]);
+                        if (StringUtils.isNotBlank(permitList) && permitList.contains(xPermission)) {
+                            hasPermit = true;
+                            break;
+                        }
+                    }
+                }
+
+                //没有权限
+                if (!hasPermit) {
+                    throw new NotPermissionException("权限不足");
+                }
+            });
+
+        })).addPathPatterns("/**").excludePathPatterns(
+                "/inner/**",
+                "/images/**",
+                "/**/doc.*",
+                "/**/swagger-ui.*",
+                "/**/swagger-resources",
+                "/**/webjars/**",
+                "/**/v2/api-docs/**");
+        super.addInterceptors(registry);
+    }
+
+
+}

+ 58 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/entity/RestResult.java

@@ -0,0 +1,58 @@
+package sm.cloud.admin.server.core.entity;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import sm.cloud.admin.server.core.enums.StatusCodeEnum;
+
+import java.io.Serializable;
+
+/**
+ * Rest返回结果
+ *
+ * @author Rlax
+ */
+@Data
+public class RestResult<T> implements Serializable {
+
+    private static final long serialVersionUID = 129776277253970021L;
+    @ApiModelProperty(value = "提示信息")
+    private String msg;
+    @ApiModelProperty(value = "程序代码")
+    private Integer code;
+    @ApiModelProperty(value = "返回结果")
+    private T data;
+
+
+    public static <T> RestResult<T> success() {
+        return RestResult.success(StatusCodeEnum.STATUS200.getMsg(), null);
+    }
+
+    public static <T> RestResult<T> success(T data) {
+        return RestResult.success(StatusCodeEnum.STATUS200.getMsg(), data);
+    }
+
+    public static <T> RestResult<T> success(String msg, T data) {
+        RestResult<T> result = new RestResult<>();
+        result.setCode(StatusCodeEnum.STATUS200.getCode());
+        result.setMsg(msg);
+        result.setData(data);
+        return result;
+    }
+
+    public static RestResult error() {
+        return RestResult.error(StatusCodeEnum.STATUS201.getCode(), StatusCodeEnum.STATUS201.getMsg());
+    }
+
+    public static RestResult error(String msg) {
+        return RestResult.error(StatusCodeEnum.STATUS201.getCode(), msg);
+    }
+
+
+    public static RestResult error(Integer code, String msg) {
+        RestResult result = new RestResult();
+        result.setCode(code);
+        result.setMsg(msg);
+        return result;
+    }
+
+}

+ 55 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/entity/VFormEntity.java

@@ -0,0 +1,55 @@
+package sm.cloud.admin.server.core.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import sm.cloud.admin.api.model.dto.VFormEntityDTO;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ * 表
+ * </p>
+ *
+ * @author 王彦委
+ * @since 2023-01-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class VFormEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "序号")
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private Long id;
+
+    @ApiModelProperty(value = "数据",required = true)
+    private List<VFormEntityDTO.VFormData> jsonObject;
+
+
+    @ApiModelProperty(value = "0-正常 1-删除")
+    @TableLogic
+    @TableField(fill = FieldFill.INSERT)
+    private Integer ifDelete;
+
+    @TableField(fill = FieldFill.INSERT)
+    @ApiModelProperty(value = "创建人登录序号")
+    private Long createId;
+
+    @ApiModelProperty(value = "修改时间")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Date updateTime;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+
+
+}

+ 73 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/enums/CommonEnum.java

@@ -0,0 +1,73 @@
+package sm.cloud.admin.server.core.enums;
+
+
+import java.util.Objects;
+
+/**
+ * @Auther: wangyanwei
+ * @Date: 2019/3/30 0030 10:39
+ * @Description: 状态枚举
+ */
+public enum CommonEnum {
+
+    //状态
+    STATUS_DEFAULT(0, "默认"),
+    STATUS_START(1, "启用"),
+    STATUS_STOP(2, "禁用"),
+    DELETED_FALSE(0, "正常"),
+    DELETE_TRUE(1, "删除"),
+    LOGIN_ERROR_TIMES(5, "登录错误次数"),
+    THIRD_WX_OPEN_LOGIN(1,"微信开放平台授权登录"),
+    THIRD_QQ_OPEN_LOGIN(2,"QQ开放平台授权登录"),
+    THIRD_WX_MP_LOGIN(3,"微信公众号登录"),
+    THIRD_WX_MINI_LOGIN(4,"微信小程序登录"),
+    THIRD_PWD_LOGIN(5,"帐号密码登录"),
+    THIRD_PHONE_LOGIN(6,"手机验证码序登录");
+
+
+    private Integer code;
+    private String msg;
+
+    CommonEnum(Integer code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public static String getMsg(Integer code) {
+
+        if (Objects.isNull(code)) {
+            return null;
+        }
+        for (CommonEnum value : CommonEnum.values()) {
+            if (code.equals(value.code)) {
+                return value.msg;
+            }
+        }
+        return null;
+    }
+
+    public Integer getCode() {
+        return code;
+    }
+
+    /**
+     * @Author: 王彦委
+     * @Description: 判断给定的值是否包含其中
+     * @Date: 11:28 2020/5/1 0001
+     */
+    public static boolean contain(Integer code) {
+        if (Objects.isNull(code)) {
+            return false;
+        }
+        for (CommonEnum value : CommonEnum.values()) {
+            if (code.equals(value.code)) {
+                return true;
+            }
+        }
+        return false;
+    }
+}

+ 17 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/enums/StatusCodeEnum.java

@@ -0,0 +1,17 @@
+package sm.cloud.admin.server.core.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@AllArgsConstructor
+@Getter
+public enum StatusCodeEnum {
+    STATUS200(20000,"操作成功"),
+    STATUS201(201,"操作失败"),
+    STATUS403(403,"无权访问"),
+    STATUS404(404,"请求资源不存在"),
+    STATUS500(500,"系统异常");
+ 
+    private final Integer code;
+    private final String msg;
+}

+ 48 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/enums/VisitAppointCodeEnum.java

@@ -0,0 +1,48 @@
+package sm.cloud.admin.server.core.enums;
+
+
+import java.util.Objects;
+
+
+public enum VisitAppointCodeEnum {
+
+    //状态
+    STATUS_DHX(1, "待核销"),
+    STATUS_DPJ(2, "待评价"),
+    STATUS_WC(3, "已完成"),
+    STATUS_QX(4, "已取消"),
+    STATUS_GQ(5, "已过期");
+
+
+    private Integer code;
+    private String msg;
+
+    VisitAppointCodeEnum(Integer code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public static String getMsg(Integer code) {
+
+        if (Objects.isNull(code)) {
+            return null;
+        }
+        for (VisitAppointCodeEnum value : VisitAppointCodeEnum.values()) {
+            if (code.equals(value.code)) {
+                return value.msg;
+            }
+        }
+        return null;
+    }
+
+    public Integer getCode() {
+        return code;
+    }
+
+
+
+}

+ 17 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/exception/CustomBusinessException.java

@@ -0,0 +1,17 @@
+package sm.cloud.admin.server.core.exception;
+
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * @Author 王彦委
+ * @Description  自定义业务异常类
+ * @Date 22:28 2022/5/14
+ **/
+
+@Slf4j
+public class CustomBusinessException extends RuntimeException{
+    public CustomBusinessException(String message) {
+        super(message);
+    }
+}

+ 103 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/exception/GlobalException.java

@@ -0,0 +1,103 @@
+package sm.cloud.admin.server.core.exception;
+
+import cn.dev33.satoken.exception.NotLoginException;
+
+import cn.dev33.satoken.exception.NotPermissionException;
+import com.fasterxml.jackson.databind.exc.InvalidFormatException;
+import org.springframework.dao.DuplicateKeyException;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.converter.HttpMessageNotReadableException;
+import org.springframework.web.HttpRequestMethodNotSupportedException;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+import sm.cloud.admin.server.core.entity.RestResult;
+
+import javax.validation.ConstraintViolation;
+import javax.validation.ConstraintViolationException;
+import javax.validation.UnexpectedTypeException;
+import javax.validation.ValidationException;
+import java.util.Objects;
+import java.util.Set;
+
+/**
+ * @Author: 王彦委
+ * @Description: 全局异常配置
+ * @Date: 18:01 2020/10/23 0023
+ */
+
+@RestControllerAdvice
+public class GlobalException {
+
+    @ExceptionHandler(ValidationException.class)
+    @ResponseStatus(HttpStatus.OK)
+    public RestResult handleMethodArgumentNotValidException(final ValidationException e) {
+
+        if (e instanceof ConstraintViolationException) {
+            final ConstraintViolationException exs = (ConstraintViolationException) e;
+            final Set<ConstraintViolation<?>> violations = exs.getConstraintViolations();
+            for (final ConstraintViolation<?> item : violations) {
+                // 打印验证不通过的信息
+                return RestResult.error(item.getMessage());
+            }
+        }
+        return RestResult.error("未知验证错误");
+    }
+
+
+    /**
+     * 数据校验全局处理
+     * MethodArgumentNotValidException是@RequestBody和@Validated配合时产生的异常,
+     * 比如在传参时如果前端的json数据里部分缺失@RequestBody修饰的实体类的属性就会产生这个异常。
+     */
+    @ExceptionHandler(value = MethodArgumentNotValidException.class)
+    @ResponseBody
+    public RestResult MethodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
+
+        //获取实体类定义的校验注解字段上的message作为异常信息,@NotBlank(message = "用户密码不能为空!")异常信息即为"用户密码不能为空!"
+        return RestResult.error(Objects.requireNonNull(e.getBindingResult().getFieldError()).getDefaultMessage());
+    }
+
+
+    /**
+     * @return
+     * @Author wang
+     * @Description 自定义业务异常
+     * @Date 17:03 2022/5/15
+     * @Param
+     **/
+    @ExceptionHandler(CustomBusinessException.class)
+    @ResponseBody
+    public RestResult customBusinessExceptionHandler(final CustomBusinessException e) {
+        return RestResult.error(e.getMessage());
+    }
+
+
+    @ExceptionHandler
+    @ResponseBody
+    public RestResult handleException(final Exception e) {
+        if (e instanceof UnexpectedTypeException || e instanceof InvalidFormatException) {
+            return RestResult.error("数据类型有误!");
+        } else if (e instanceof HttpMessageNotReadableException) {
+            return RestResult.error("参数有误!");
+        } else if (e instanceof DuplicateKeyException) {
+            //违反数据唯一约束时产生的错误
+            return RestResult.error("记录已存在,不能重复增加!");
+        }else if(e instanceof NotLoginException){
+            return RestResult.error(401,"令牌无效");
+        } else if (e instanceof HttpRequestMethodNotSupportedException) {
+            return RestResult.error("请求方式有误!");
+        } else if (e instanceof NotLoginException) {
+            return RestResult.error("请先登录");
+        } else if (e instanceof NotPermissionException) {
+            return RestResult.error("权限不足");
+        }
+
+
+        e.printStackTrace();
+        return RestResult.error("服务器异常,请联系管理员!");
+    }
+
+}

+ 111 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/interfaces/ICacheService.java

@@ -0,0 +1,111 @@
+package sm.cloud.admin.server.core.interfaces;
+
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author 王彦委
+ * @version 1.0
+ * @description: 缓存接口
+ * @date 2023/1/8 20:57
+ */
+public interface ICacheService {
+
+    /**
+     * @return
+     * @Author wang
+     * @Description key==value 保存
+     * @Date 20:57 2023/1/8
+     * @Param
+     **/
+
+    void setCache(String key, String value);
+
+    /**
+     * @return
+     * @Author wang
+     * @Description key===value 带有效期
+     * @Date 21:01 2023/1/8
+     * @Param
+     **/
+    void setCache(String key, String value, long timeout, TimeUnit timeUnit);
+
+    /**
+     * @return
+     * @Author wang
+     * @Description 根据key 查询
+     * @Date 21:03 2023/1/8
+     * @Param
+     **/
+
+    String getCache(String key);
+
+    /**
+     * @return
+     * @Author wang
+     * @Description 根据 key 删除
+     * @Date 21:04 2023/1/8
+     * @Param
+     **/
+    void deleteCache(String key);
+
+    /**
+     * <p>
+     * 查询key是否存在
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-01-17 09:50
+     **/
+    boolean hasKey(String key);
+
+
+    /**
+     * <p>
+     * 加入列表
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-04-14 15:44
+     **/
+    void listPush(String key, String value);
+
+    /**
+     * <p>
+     * 加入列表
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-04-14 15:44
+     **/
+    void listPushAll(String key, List<String> value);
+    /**
+     * <p>
+     * 取出
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-04-14 15:46
+     **/
+    String listPop(String key);
+
+    /**
+     * <p>
+     * list长度
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-04-14 15:57
+     **/
+    Long listSize(String key);
+}

+ 17 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/interfaces/IPasswordService.java

@@ -0,0 +1,17 @@
+package sm.cloud.admin.server.core.interfaces;
+
+/**
+ * @Author 王彦委
+ * @Description 密码-加密解决接口
+ * @Date 2023-01-31 17:54
+ **/
+public interface IPasswordService {
+
+    /**
+     * 加密
+     */
+    String encryption(String password,String salt);
+
+
+
+}

+ 43 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/util/CacheInfoUtil.java

@@ -0,0 +1,43 @@
+package sm.cloud.admin.server.core.util;
+
+import cn.dev33.satoken.stp.StpUtil;
+import org.springframework.stereotype.Component;
+import sm.cloud.admin.server.dao.domain.ClientAccount;
+import sm.cloud.admin.server.dao.repository.ClientAccountRepository;
+
+import javax.annotation.Resource;
+import java.util.Objects;
+
+/**
+ * @Author 王彦委
+ * @Description 缓存辅助工具类
+ * @Date 2023-02-02 17:04
+ **/
+@Component
+public class CacheInfoUtil {
+    @Resource
+    private ClientAccountRepository accountRepository;
+
+
+    /**
+     * 获取 unionId
+     */
+    public Long getUnionId() {
+        if (StpUtil.isLogin() && Objects.isNull(StpUtil.getSession().get("unionId"))) {
+            ClientAccount clientAccount = accountRepository.getById(StpUtil.getLoginIdAsLong());
+            if (Objects.nonNull(clientAccount) && Objects.nonNull(clientAccount.getUnionId())) {
+                StpUtil.getSession().set("unionId", clientAccount.getUnionId());
+                return Long.valueOf(clientAccount.getUnionId());
+            }
+        }
+        return Objects.isNull(StpUtil.getSession().get("unionId")) ? null : StpUtil.getSession().getLong("unionId");
+    }
+
+    /**
+     * 获取 userId
+     */
+    public Long getUserId() {
+        return StpUtil.isLogin() ? StpUtil.getLoginIdAsLong() : null;
+    }
+
+}

+ 54 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/util/DateConverterUtil.java

@@ -0,0 +1,54 @@
+package sm.cloud.admin.server.core.util;
+
+import org.apache.commons.lang3.StringUtils;
+import org.dozer.DozerConverter;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+public class DateConverterUtil extends DozerConverter<String, Date> {
+
+    public DateConverterUtil() {
+        super(String.class, Date.class);
+    }
+
+    @Override
+    public String convertFrom(Date source, String destination) {
+        if (null == source) {
+            return "";
+        }
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        destination = formatter.format(source);
+        return destination;
+    }
+
+    @Override
+    public Date convertTo(String source, Date destination) {
+        if (StringUtils.isBlank(source)) {
+            return null;
+        }
+
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+        if (source.length() == 7) {
+            source = source + "-01 00:00:00";
+        } else if (source.length() == 10) { //2021-06-08
+            source = source + " 00:00:00";
+        } else if (source.length() == 13) {
+            source = source + ":00:00";
+        } else if (source.length() == 16) {
+            source = source + ":00";
+        }
+
+        try {
+            destination = formatter.parse(source);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return destination;
+    }
+
+
+
+}

+ 137 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/util/DateUtil.java

@@ -0,0 +1,137 @@
+package sm.cloud.admin.server.core.util;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.TimeZone;
+
+public class DateUtil {
+
+    /**
+     * 年月日
+     */
+    public static SimpleDateFormat yyyy = new SimpleDateFormat("yyyy");
+    public static SimpleDateFormat yyyyMM = new SimpleDateFormat("yyyyMM");
+    public static SimpleDateFormat yyyyMMdd = new SimpleDateFormat("yyyyMMdd");
+    public static SimpleDateFormat yyyyMMddHHmm = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+    public static SimpleDateFormat yyMMdd = new SimpleDateFormat("yyyy-MM-dd");
+    public static SimpleDateFormat yyyyMMddHHMMSS = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+    public static SimpleDateFormat yyyyMMddHHmmss = new SimpleDateFormat("yyyyMMddHHmmss");
+    public static SimpleDateFormat HHmm = new SimpleDateFormat("HH:mm");
+    public static SimpleDateFormat HHmmss = new SimpleDateFormat("HH:mm:ss");
+
+    /**
+     * 把字符串转成日期
+     *
+     * @param dateStr
+     * @return
+     */
+    public static Date getDateFromYyyyMMddHHHHMMSS(String dateStr) {
+        try {
+            yyyyMMddHHMMSS.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
+            return yyyyMMddHHMMSS.parse(dateStr);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * 把字符串转成日期
+     *
+     * @param dateStr
+     * @return
+     */
+    public static Date getDateFromYyyyMMddHHmmss(String dateStr) {
+        try {
+            yyyyMMddHHmmss.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
+            return yyyyMMddHHmmss.parse(dateStr);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * @return
+     * @Author wang
+     * @Description 根据日期,获取字符串 年月日
+     * @Date 21:58 2022/5/19
+     * @Param
+     **/
+
+
+    public static String yyyyMMdd(Date date) {
+        yyyyMMdd.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
+
+        return yyyyMMdd.format(date);
+    }
+
+    /**
+     * 年、月
+     *
+     * @param date
+     * @return
+     */
+    public static String yyyyMM(Date date) {
+        yyyyMMdd.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
+
+        return yyyyMM.format(date);
+    }
+
+    /**
+     * 年
+     *
+     * @param date
+     * @return
+     */
+    public static String yyyy(Date date) {
+
+        yyyy.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
+        return yyyy.format(date);
+    }
+
+    public static String yyMMdd(Date date) {
+        yyMMdd.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
+        return yyMMdd.format(date);
+    }
+
+    public static String yyMMdd1(Date date) {
+        return yyMMdd.format(date);
+    }
+    public static Date getDateFromYyMMdd(String dateStr) {
+        try {
+             yyMMdd.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
+            return yyMMdd.parse(dateStr);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * @return
+     * @Author wang
+     * @Description 根据日期,获取字符串 年月日
+     * @Date 21:58 2022/5/19
+     * @Param
+     **/
+
+
+    public static String yyyyMMddHHmm(Date date) {
+        yyyyMMddHHmm.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
+
+        return yyyyMMddHHmm.format(date);
+    }
+
+
+    public static Date getDateHHmmss(String dateStr) {
+        try {
+            HHmmss.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
+            return HHmmss.parse(dateStr);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+}

+ 60 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/util/DozerConverterUtil.java

@@ -0,0 +1,60 @@
+package sm.cloud.admin.server.core.util;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+import org.dozer.DozerBeanMapper;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * @author Shanks
+ * @date 2020-10-31
+ */
+public class DozerConverterUtil {
+
+    private static final DozerBeanMapper mapper;
+
+    static {
+        mapper = new DozerBeanMapper();
+        mapper.setMappingFiles(Lists.newArrayList("dozer/dozer-mapping.xml"));
+    }
+
+
+    public void copyProperties(Object source, Object destination) {
+        mapper.map(source, destination);
+    }
+
+
+    public static <T> T map(Object source, Class<T> destinationClass) {
+        if (Objects.isNull(source)) {
+            try {
+                return destinationClass.newInstance();
+            } catch (InstantiationException | IllegalAccessException e) {
+                e.printStackTrace();
+            }
+        }
+        return mapper.map(source, destinationClass);
+    }
+
+    public static <T> List<T> map(List<?> sourceList, Class<T> destinationClass) {
+        if (CollectionUtils.isEmpty(sourceList)) {
+            return Lists.newArrayList();
+        }
+        return sourceList.stream()
+                .map(s -> map(s, destinationClass))
+                .collect(Collectors.toList());
+    }
+
+    public static <T> Set<T> map(Set<?> sourceSet, Class<T> destinationClass) {
+        if (CollectionUtils.isEmpty(sourceSet)) {
+            return Sets.newHashSet();
+        }
+        return sourceSet.stream()
+                .map(s ->map(s, destinationClass))
+                .collect(Collectors.toSet());
+    }
+}

+ 154 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/util/ExcelUtils.java

@@ -0,0 +1,154 @@
+package sm.cloud.admin.server.core.util;
+
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.poi.excel.ExcelReader;
+import cn.hutool.poi.excel.ExcelUtil;
+import cn.hutool.poi.excel.ExcelWriter;
+import com.google.common.collect.Lists;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.ClientAnchor;
+import org.apache.poi.ss.usermodel.Drawing;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.springframework.web.multipart.MultipartFile;
+import sun.misc.BASE64Decoder;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.net.URLEncoder;
+import java.util.Base64;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Author 王彦委
+ * @Description excel工具类 参考 https://www.cnblogs.com/cn-mrs/articles/16481052.html
+ * @Date 2023-03-28 17:23
+ **/
+public class ExcelUtils {
+
+    /**
+     * 导出接口
+     */
+    public static void export(HttpServletResponse response, List<Object> dataList, String fileName) throws Exception {
+        // 从数据库查询出所有的数据
+        List<Map<String, Object>> list = Lists.newArrayList();
+        Map<String, Object> map = new HashMap<>();
+        map.put("username", "张三");
+        map.put("img", "");
+        list.add(map);
+        map = new HashMap<>();
+        map.put("username", "李四");
+        map.put("img", "");
+        list.add(map);
+
+        // 通过工具类创建writer 写出到磁盘路径
+//        ExcelWriter writer = ExcelUtil.getWriter(filesUploadPath + "/用户信息.xlsx");
+        // 在内存操作,写出到浏览器
+        ExcelWriter writer = ExcelUtil.getWriter(true);
+        //自定义标题别名
+        writer.addHeaderAlias("username", "用户名");
+        writer.addHeaderAlias("img", "二维码");
+
+
+        // 一次性写出list内的对象到excel,使用默认样式,强制输出标题
+        writer.write(list, true);
+        //base64
+        String img = "iVBORw0KGgoAAAANSUhEUgAAAMgAAADIAQAAAACFI5MzAAAAq0lEQVR42u2YSQ7AIAwD" +
+                "/f9Pp6owSehy76BCF8H0YhmZUMVb00++QTSaP8sRl1jY7FMml5zKlBMe8Ynd24VoXBuQMi0e1yiMOBvcHzKERSq79ZbxKFKJN5" +
+                "/1IpLhnaPCUGCitsOGbzIZ040154gkV2Iq7c7xyBoaWgMeSK61abkHJamzAi" +
+                "/QRK0C0qKUTHqSxwYkkzzuNSyLRDu1lmwsqU1WuUeByf9P6MPkADORTF07SHX+AAAAAElFTkSuQmCC";
+        //普通图片
+//        byte[] bytes = FileUtil.readBytes("d:/sm/file/0.jpg");
+        //base64转图片
+        Base64.Decoder decoder = Base64.getDecoder();
+        byte[] b = decoder.decode(img);
+        for (int i = 0; i < b.length; ++i) {
+            if (b[i] < 0) {// 调整异常数据
+                b[i] += 256;
+            }
+        }
+        for (int i = 0; i < list.size(); i++) {
+            writePic(writer, 1, i+1,b , HSSFWorkbook.PICTURE_TYPE_JPEG);
+        }
+
+        // 设置浏览器响应的格式
+        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
+        fileName = StringUtils.isBlank(fileName) ? URLEncoder.encode("测试信息", "UTF-8") : URLEncoder.encode(fileName, "UTF-8");
+        response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");
+
+        ServletOutputStream out = response.getOutputStream();
+        writer.flush(out, true);
+        out.close();
+        writer.close();
+    }
+
+    /**
+     * @param writer
+     * @param x           单元格x轴坐标
+     * @param y           单元格y轴坐标
+     * @param pictureData 图片二进制数据
+     * @param picType     图片格式
+     */
+    private static void writePic(ExcelWriter writer, int x, int y, byte[] pictureData, int picType) {
+        Sheet sheet = writer.getSheet();
+        Drawing drawingPatriarch = sheet.createDrawingPatriarch();
+
+        //设置图片单元格位置
+        ClientAnchor anchor = drawingPatriarch.createAnchor(0, 0, 0, 0, x, y, x + 1, y + 1);
+        //随单元格改变位置和大小
+        anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE);
+
+        //添加图片
+        int pictureIndex = sheet.getWorkbook().addPicture(pictureData, picType);
+        drawingPatriarch.createPicture(anchor, pictureIndex);
+    }
+
+
+    /**
+     * excel 导入
+     * @param file
+     * @throws Exception
+     */
+
+    public static Boolean imp(MultipartFile file) throws Exception {
+        InputStream inputStream = file.getInputStream();
+        ExcelReader reader = ExcelUtil.getReader(inputStream);
+        // 方式1:(推荐) 通过 javabean的方式读取Excel内的对象,但是要求表头必须是英文,跟javabean的属性要对应起来
+//        List<User> list = reader.readAll(User.class);
+
+        // 方式2:忽略表头的中文,直接读取表的内容 但是是手动的不推荐
+        // List<List<Object>> list = reader.read(1);
+        // List<User> users = CollUtil.newArrayList();
+        // for (List<Object> row : list) {
+        //     User user = new User();
+        //     user.setUsername(row.get(0).toString());
+        //     user.setPassword(row.get(1).toString());
+        //     user.setNickname(row.get(2).toString());
+        //     user.setEmail(row.get(3).toString());
+        //     user.setPhone(row.get(4).toString());
+        //     user.setAddress(row.get(5).toString());
+        //     user.setAvatarUrl(row.get(6).toString());
+        //     users.add(user);
+        // }
+        HashMap<String, String> headerAlias = new HashMap<>(6);
+        headerAlias.put("用户名", "username");
+        headerAlias.put("昵称", "nickname");
+        headerAlias.put("邮箱", "email");
+        headerAlias.put("电话", "phone");
+        headerAlias.put("地址", "address");
+        headerAlias.put("头像", "avatarUrl");
+        reader.setHeaderAlias(headerAlias);
+
+        List<Map> list = reader.readAll(Map.class);
+
+//        System.out.println(list);
+
+        //上传的excel数据,保存到数据库中
+//        userService.saveBatch(list);
+        return true;
+    }
+}

+ 56 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/util/FileDirectory.java

@@ -0,0 +1,56 @@
+package sm.cloud.admin.server.core.util;
+
+import lombok.Data;
+import org.apache.commons.lang3.StringUtils;
+import sm.cloud.admin.server.core.exception.CustomBusinessException;
+
+import java.io.File;
+
+
+/**
+ * @Author 王彦委
+ * @Description 文件夹
+ * @Date 21:42 2022/5/19
+ **/
+
+@Data
+public class FileDirectory {
+
+    private String path;
+    private String name;
+
+    private FileDirectory(String path) {
+        if (StringUtils.isBlank(path)) {
+            throw new CustomBusinessException("文件夹为空");
+        }
+        File file = new File(path);
+        if (file.exists()&& !file.isDirectory()){
+            throw new CustomBusinessException("不是文件夹");
+        }
+        this.path = path;
+    }
+
+    private FileDirectory(String path,String name) {
+        if (StringUtils.isBlank(path)) {
+            throw new CustomBusinessException("文件夹为空");
+        }
+        File file = new File(path);
+        if (file.exists()&& !file.isDirectory()){
+            throw new CustomBusinessException("不是文件夹");
+        }
+        this.path = path;
+    }
+
+    public static FileDirectory builder(String path) {
+        return new FileDirectory(path);
+    }
+
+    public static FileDirectory builder(String path,String name) {
+        return new FileDirectory(path,name);
+    }
+
+
+
+
+
+}

+ 33 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/util/FileName.java

@@ -0,0 +1,33 @@
+package sm.cloud.admin.server.core.util;
+
+import lombok.Data;
+import org.apache.commons.lang3.StringUtils;
+import sm.cloud.admin.server.core.exception.CustomBusinessException;
+
+
+/**
+ * @Author 王彦委
+ * @Description  文件名
+ * @Date 21:42 2022/5/19
+ **/
+
+@Data
+public class FileName {
+
+    private String name;
+
+    private FileName(String name) {
+        if (StringUtils.isBlank(name)) {
+            throw new CustomBusinessException("文件名为空");
+        }
+        this.name = name;
+    }
+
+    public static FileName builder(String name) {
+        return new FileName(name);
+    }
+
+
+
+
+}

+ 39 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/util/FilePath.java

@@ -0,0 +1,39 @@
+package sm.cloud.admin.server.core.util;
+
+import lombok.Data;
+import org.apache.commons.lang3.StringUtils;
+import sm.cloud.admin.server.core.exception.CustomBusinessException;
+
+import java.io.File;
+
+
+/**
+ * @Author 王彦委
+ * @Description  文件路径
+ * @Date 21:42 2022/5/19
+ **/
+
+@Data
+public class FilePath {
+
+    private String path;
+
+    private FilePath(String path) {
+        if (StringUtils.isBlank(path)) {
+            throw new CustomBusinessException("文件路径为空");
+        }
+        File file = new File(path);
+        if (!file.isFile()){
+            throw new CustomBusinessException("不是文件");
+        }
+        this.path = path;
+    }
+
+    public static FilePath builder(String path) {
+        return new FilePath(path);
+    }
+
+
+
+
+}

+ 200 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/util/FileUtil.java

@@ -0,0 +1,200 @@
+package sm.cloud.admin.server.core.util;
+
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.springframework.web.multipart.MultipartFile;
+import sm.cloud.admin.server.core.exception.CustomBusinessException;
+
+import java.io.*;
+import java.util.Date;
+import java.util.Objects;
+
+/**
+ * @Author 王彦委
+ * @Description 文件操作工具类
+ * @Date 21:30 2022/5/19
+ **/
+@Component
+@Slf4j
+public class FileUtil {
+
+
+    @Value("${file.directory}")
+    public String baseDirectory;
+
+    @Value("${file.web.path:images}")
+    public String serverWebPath;
+
+
+    /**
+     * @return
+     * @Author wang
+     * @Description 把文件写入磁盘
+     * @Date 21:31 2022/5/19
+     * @Param
+     **/
+
+
+    public String writeToDisk(MultipartFile file) {
+        //1、获取随机文件名
+        FileName fileName = createFileName(file);
+        //2、执行
+        return writeToDisk(file, fileName);
+    }
+
+    /**
+     * @return
+     * @Author wang
+     * @Description 把文件写入磁盘
+     * @Date 21:31 2022/5/19
+     * @Param
+     **/
+    public String writeToDisk(MultipartFile file, FileName fileName) {
+        //2、获取文件夹路径
+        FileDirectory directory = createDirectory(FileDirectory.builder(baseDirectory));
+        //3、拼接成文件路径
+        String filePath = directory.getPath() + "/" + fileName.getName();
+        try {
+            //写入文件
+            file.transferTo(new File(filePath));
+        } catch (IOException e) {
+            throw new CustomBusinessException("文件上传失败!");
+        }
+        //4、截取相对路径并生成网络路径
+        return serverWebPath + "/" + filePath.substring(filePath.indexOf(directory.getName()));
+    }
+
+
+    /**
+     * @return
+     * @Author wang
+     * @Description 创建文件名
+     * @Date 21:43 2022/5/19
+     * @Param
+     **/
+
+
+    public static FileName createFileName(MultipartFile file) {
+        String fileName = UUIDUtils.random();
+        //得到文件后辍
+        String fileType = Objects.requireNonNull(FilenameUtils.getExtension(file.getOriginalFilename())).toLowerCase();
+        return FileName.builder(fileName + "." + fileType);
+    }
+
+    /**
+     * @return
+     * @Author wang
+     * @Description 创建文件夹
+     * @Date 21:43 2022/5/19
+     * @Param
+     **/
+
+
+    public static FileDirectory createDirectory(FileDirectory baseDirectory) {
+
+        File file = new File(baseDirectory.getPath());
+        //1、判断是否存在
+        if (!file.exists()) {
+            file.mkdirs();
+        }
+        //2、判断文件下面的文件数量,满500个文件,则新建文件夹
+        File[] files = file.listFiles();
+
+        if (Objects.nonNull(files)) {
+            for (int i = 0; i < files.length; i++) {
+                //判断是不是文件夹
+                if (!files[i].isDirectory()) {
+                    continue;
+                }
+                //判断文件夹下面文件数量
+                File[] listFiles = files[i].listFiles();
+                if (Objects.isNull(listFiles) || listFiles.length < 500) {
+                    baseDirectory.setPath(files[i].getAbsolutePath());
+                    baseDirectory.setName(files[i].getName());
+                    return baseDirectory;
+                }
+            }
+        }
+        //3、执行到此,文件夹已满 500或没有文件夹
+        String directoryName = DateUtil.yyyyMMdd(new Date());
+        baseDirectory.setPath(file.getAbsolutePath() + "/" + directoryName);
+        new File(baseDirectory.getPath()).mkdirs();
+        baseDirectory.setName(directoryName);
+        return baseDirectory;
+
+    }
+
+    /**
+     * @Description: 将字符串写入到文件
+     * @Date: 2023/2/1
+     * @Time: 11:14
+     * @Param:
+     * @return:
+     */
+    public String writeToDisk(String content) {
+
+        if (StringUtils.isEmpty(content)) {
+            return null;
+        }
+        //随机生成文件名
+        String newFilenameBase = UUIDUtils.random() + ".html";
+
+        //2、获取文件夹路径
+        FileDirectory directory = createDirectory(FileDirectory.builder(baseDirectory));
+
+        //3、拼接成文件路径
+        String filePath = directory.getPath() + "/" + newFilenameBase;
+        //4.写入文件
+        File newFile = new File(filePath);
+        insertFileTODisk(newFile, content);
+        //5、截取相对路径并生成网络路径
+        return serverWebPath + "/" + filePath.substring(filePath.indexOf(directory.getName()));
+    }
+
+    /**
+     * 写入指定文件
+     *
+     * @param newFile
+     * @param content
+     */
+    public void insertFileTODisk(File newFile, String content) {
+
+        try {
+            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(newFile, true), "UTF-8"));
+            writer.write(content);
+            writer.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+            throw new CustomBusinessException("保存失败");
+        }
+    }
+
+    /**
+     * @Description: 文件删除
+     * @Author: 周雪鹏
+     * @Date: 2023/2/1
+     * @Time: 11:15
+     * @Param: path 使用数据库储存字段
+     * @return:
+     */
+    public boolean deleteFile(String path) {
+        //相对路径替换为磁盘绝对路径
+        String filePath = path.replace(serverWebPath, baseDirectory);
+        File file = new File(filePath);
+        //判断文件是否存在
+        if (!file.exists()) {
+            return false;
+        }
+        log.info("删除文件路径:{}",file.getAbsolutePath());
+        if (file.delete()) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+}

+ 147 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/util/ImageCode.java

@@ -0,0 +1,147 @@
+package sm.cloud.admin.server.core.util;
+
+import cn.hutool.core.codec.Base64;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.imageio.ImageIO;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Random;
+
+/**
+ * 〈一句话功能简述〉<br> 
+ * 〈〉
+ *
+ * @author 1543057945
+ * @create 2019/1/11
+ * @since 1.0.0
+ */
+@Slf4j
+public class ImageCode {
+    //验证码个数
+     private int count=4;
+    //验证码宽度,且设置每个字的宽度
+     private int width=count*50;
+    //验证码高度
+     private int height=50;
+    //图片验证码key
+     private String code="";
+    //bufferedImage
+     private BufferedImage bufferedImage;
+    public ImageCode() {
+    }
+    public ImageCode(int count, int width, int height) {
+        this.count = count;
+        this.width = width;
+        this.height = height;
+    }
+    public int getCount() {
+        return count;
+    }
+    public String getCode() {
+        return code;
+    }
+    public int getWidth() {
+        return width;
+    }
+    public int getHeight() {
+        return height;
+    }
+    public void setCount(int count) {
+        this.count = count;
+        width=this.count*50;
+    }
+
+    public void setWidth(int width) {
+        this.width = width;
+    }
+
+    public void setHeight(int height) {
+        this.height = height;
+    }
+
+    public BufferedImage getImage(){
+        //图片缓冲区
+        BufferedImage image = new BufferedImage(width,height,1);
+        //获得笔
+        Graphics graphics = image.getGraphics();
+        //设置初始画笔为白色
+        graphics.setColor(new Color(255,255,254));
+        //画满整个图,也就是把图片先变为白色
+        graphics.fillRect(0,0,width,height);
+        Random rd=new Random();
+        //设置字体
+        Font font=new Font("宋体",Font.PLAIN,35+rd.nextInt(10));
+        graphics.setFont(font);
+        char[] chars="qweCRYHrtasdfBxy678934VTGopNUFKuighjklzSXEDLOP12cvbnmQAZWJMI50".toCharArray();
+        //画验证码
+        for (int i = 0; i <count ; i++) {
+            String string="";
+            string+=chars[rd.nextInt(chars.length)]+"";
+            graphics.setColor(new Color(rd.nextInt(254),rd.nextInt(254),rd.nextInt(254)));
+            graphics.drawString(string,55*i+rd.nextInt(10),27+rd.nextInt(15));
+            code+=string;
+        }
+        //干扰点
+        for (int i = 0; i <10*count ; i++) {
+            graphics.setFont(new Font("宋体",Font.PLAIN,15));
+            String string=".";
+            graphics.setColor(new Color(rd.nextInt(255),rd.nextInt(255),rd.nextInt(255)));
+            graphics.drawString(string,rd.nextInt(width),rd.nextInt(height));
+        }
+        //干扰线
+        for (int i = 0; i <count+count/2 ; i++) {
+            graphics.setFont(new Font("宋体",Font.PLAIN,10));
+            graphics.setColor(new Color(rd.nextInt(255),rd.nextInt(255),rd.nextInt(255)));
+            graphics.drawLine(rd.nextInt(width),rd.nextInt(height),rd.nextInt(width),rd.nextInt(height));
+        }
+        //归还笔
+        graphics.dispose();
+        //写到流里面需要用到ImageIo
+        //这里做的测试,在本地测试下是否画的是那回事
+        /*try {
+            ImageIO.write(image,"jpg",new FileOutputStream("E:/11.jpg"));
+        } catch (IOException e) {
+            e.printStackTrace();
+        }*/
+        this.bufferedImage=image;
+        return image;
+    }
+    /**
+     *  @author: 执着(zlm)
+     *  @Date: 2020/9/27 23:37
+     *  @Description: 将图片缓冲区转成base64编码
+     */
+    public static String getBase64(BufferedImage image){
+        String base64 = null;
+        try {
+            //输出流
+            ByteArrayOutputStream stream = new ByteArrayOutputStream();
+            ImageIO.write(image, "png", stream);
+            base64 = Base64.encode(stream.toByteArray());
+//            log.info("生成的图片验证码base64:{}",base64);
+            log.info("生成的图片验证码成功");
+        } catch (IOException e) {
+            log.error("生成生成的图片验证码base64失败:{}",e.getMessage());
+            e.printStackTrace();
+        }
+        return base64;
+
+    }
+
+    //测试写入
+//    public static void main(String[] args){
+//        long startend=System.currentTimeMillis();
+//        ImageCode imageCode=new ImageCode();
+//        //默认验证码位数为4,我这里设为5
+//        imageCode.setCount(5);
+//        //得到缓冲区
+//        BufferedImage image = imageCode.getImage();
+//        //得到真实验证码
+//        String code=imageCode.getCode();
+//        long endTime=System.currentTimeMillis();
+//        System.out.println("验证码为:"+code+"\n花费时间为:"+(endTime-startend)+"\n到E盘根目录下看,文件名为11.jpg");
+//    }
+}

+ 57 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/util/OrderNoUtil.java

@@ -0,0 +1,57 @@
+package sm.cloud.admin.server.core.util;
+
+import org.springframework.stereotype.Component;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+@Component
+public class OrderNoUtil {
+    private long lastTimestamp = -1L;
+    private int sequence=1;
+    private final int sequenceMask=999;
+
+    public synchronized String nextId() {
+        String result="";
+        long timestamp = timeGen();
+        if (timestamp < lastTimestamp) {
+            System.err.printf(
+                    "clock is moving backwards. Rejecting requests until %d.", lastTimestamp);
+            throw new RuntimeException(
+                    String.format("Clock moved backwards. Refusing to generate id for %d milliseconds",
+                            lastTimestamp - timestamp));
+        }
+        if (lastTimestamp == timestamp) {
+            sequence = (sequence + 1) % sequenceMask;
+            if (sequence == 0) {
+                timestamp = tilNextMillis(lastTimestamp);
+            }
+        } else {
+            //从0开始
+            sequence = 0;
+        }
+        lastTimestamp=timestamp;
+        Date date1 =new Date(lastTimestamp);
+        SimpleDateFormat sd =new SimpleDateFormat("yyyyMMddHHmmssSSS");
+        String format = sd.format(date1);
+        result=format+sequence;
+        return result;
+    }
+    private long timeGen(){
+        return System.currentTimeMillis();
+    }
+    /**
+     * 等待到下⼀毫秒
+     * @param lastTimestamp
+     * @return
+     */
+    private long tilNextMillis(long lastTimestamp) {
+        long timestamp = timeGen();
+        while (timestamp <= lastTimestamp) {
+            timestamp = timeGen();
+        }
+        return timestamp;
+    }
+
+
+}

+ 68 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/util/QrUtil.java

@@ -0,0 +1,68 @@
+package sm.cloud.admin.server.core.util;
+
+import cn.hutool.core.codec.Base64;
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.EncodeHintType;
+import com.google.zxing.client.j2se.MatrixToImageWriter;
+import com.google.zxing.common.BitMatrix;
+import com.google.zxing.qrcode.QRCodeWriter;
+import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayOutputStream;
+import java.util.HashMap;
+
+/**
+ * @Author 王彦委
+ * @Description 二维码工具类
+ * @Date 2023-03-28 16:55
+ **/
+public class QrUtil {
+
+    //二维码宽
+    private static int width = 200;
+    //二维码高
+    private static int height = 200;
+
+    /**
+     * <p>
+     * 生成base64
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-03-28 16:58
+     **/
+    public static String createBase64(String content) {
+        if (StringUtils.isEmpty(content)) {
+            content = "test";
+        }
+        ByteArrayOutputStream os = new ByteArrayOutputStream();
+        @SuppressWarnings("rawtypes")
+        HashMap<EncodeHintType, Comparable> hints = new HashMap<>();
+        hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); // 指定字符编码为“utf-8”
+        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M); // 指定二维码的纠错等级为中级
+        hints.put(EncodeHintType.MARGIN, 2); // 设置图片的边距
+
+        try {
+            QRCodeWriter writer = new QRCodeWriter();
+            BitMatrix bitMatrix = writer.encode(content, BarcodeFormat.QR_CODE, width, height, hints);
+
+            BufferedImage bufferedImage = MatrixToImageWriter.toBufferedImage(bitMatrix);
+            ImageIO.write(bufferedImage, "png", os);
+            /**
+             * 原生转码前面没有 data:image/png;base64 这些字段,返回给前端是无法被解析,可以让前端加,也可以在下面加上
+             */
+//            return "data:image/jpeg;base64," + Base64.encode(os.toByteArray());
+            return Base64.encode(os.toByteArray());
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return null;
+    }
+}

+ 61 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/util/SnowFlakeUtil.java

@@ -0,0 +1,61 @@
+package sm.cloud.admin.server.core.util;
+
+import cn.hutool.core.lang.Snowflake;
+import org.springframework.stereotype.Component;
+import sm.cloud.admin.server.core.interfaces.ICacheService;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Author 王彦委
+ * @Description 使用雪花算法生成 序号
+ * @Date 2023-04-14 15:02
+ **/
+@Component
+public class SnowFlakeUtil {
+    @Resource
+    private ICacheService cacheService;
+
+    private static Snowflake snowflake = new Snowflake(3, 5);
+
+    private static String snowflakeId = "snowflakeId";
+
+    /**
+     * <p>
+     * 创建序号 每次创建 200个
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-04-14 15:05
+     **/
+    public void createId() {
+        List<String> idList = new ArrayList<>();
+        for (int i = 0; i < 1000; i++) {
+            long id = snowflake.nextId();
+            idList.add(id + "");
+        }
+        cacheService.listPushAll(snowflakeId, idList);
+    }
+
+    /**
+     * <p>
+     * 获取序号
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-04-14 15:52
+     **/
+    public String getSnowflakeId() {
+        if (!cacheService.hasKey(snowflakeId) || cacheService.listSize(snowflakeId).compareTo(20L) < 0) {
+            createId();
+        }
+        return cacheService.listPop(snowflakeId);
+    }
+
+}

+ 118 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/util/TreeUtil.java

@@ -0,0 +1,118 @@
+package sm.cloud.admin.server.core.util;
+
+import lombok.Data;
+import org.apache.commons.collections.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Author 王彦委
+ * @Description 树状结构封装工具
+ * @Date 2022-09-14 11:37
+ **/
+public class TreeUtil {
+
+
+    /**
+     * <p>
+     * 组装树结构
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2022-09-14 11:45
+     **/
+    public static List<Tree> buildTree(List<Tree> treeList) {
+        if (CollectionUtils.isEmpty(treeList)) {
+            return null;
+        }
+        List<Tree> children = new ArrayList<>();
+        for (int i = 0; i < treeList.size(); i++) {
+            if (hasParent(treeList.get(i).getPid(), treeList)) {
+                continue;
+            }
+            treeList.get(i).setChildren(hasChildren(treeList.get(i).getId(), treeList));
+            children.add(treeList.get(i));
+        }
+
+        return children;
+    }
+
+
+    /**
+     * <p>
+     * 查检是否有上级
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2022-09-14 11:41
+     **/
+    public static boolean hasParent(String parentId, List<Tree> treeList) {
+        for (int i = treeList.size() - 1; i >= 0; i--) {
+            if (treeList.get(i).getId().equals(parentId)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * <p>
+     * 查询子集
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2022-09-14 11:43
+     **/
+    public static List<Tree> hasChildren(String id, List<Tree> treeList) {
+        List<Tree> treeChildren = new ArrayList<>();
+        for (int i = 0; i < treeList.size(); i++) {
+            if (null == treeList.get(i).getPid() || !treeList.get(i).getPid().equals(id)) {
+                continue;
+            }
+            treeList.get(i).setChildren(hasChildren(treeList.get(i).getId(), treeList));
+            treeChildren.add(treeList.get(i));
+        }
+        return treeChildren;
+    }
+
+
+    /**
+     * @Author 王彦委
+     * @Description 树结构
+     * @Date 2022-09-14 11:39
+     **/
+    @Data
+    public static class Tree {
+
+        /**
+         * 序号
+         */
+        private String id;
+
+        /**
+         * 名称
+         */
+        private String name;
+        /**
+         * 类型
+         */
+        private String type;
+
+        /**
+         * 上级
+         */
+        private String pid;
+
+        /**
+         * 子集
+         */
+        private List<Tree> children;
+    }
+}

+ 17 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/util/UUIDUtils.java

@@ -0,0 +1,17 @@
+package sm.cloud.admin.server.core.util;
+
+import java.util.UUID;
+
+/**
+ * 生成一个字符串,它表示一个全局通用唯一标示符
+ * @author wulin
+ * @since 2014年4月29日
+ * @version 1.0
+ */
+public class UUIDUtils {
+
+    public static String random() {
+        return UUID.randomUUID().toString().replaceAll("-", "");
+    }
+    
+}

+ 82 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/core/util/WeChatUtil.java

@@ -0,0 +1,82 @@
+package sm.cloud.admin.server.core.util;
+
+import cn.hutool.core.codec.Base64;
+import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.security.AlgorithmParameters;
+import java.security.Security;
+import java.util.Arrays;
+import java.util.HashMap;
+
+/**
+ * @Author dw
+ * @ClassName WeChatUtil
+ * @Description 参考 https://www.cnblogs.com/dw3306/p/13577488.html
+ * @Date 2020/8/28 10:56
+ * @Version 1.0
+ */
+public class WeChatUtil {
+//     private static String APPID = "wx6eba1f76e04fa955";
+     private static String APPID = "wx56b34af78634bb54";
+     private static String APPSECRET = "536baf5a34c93cab40b1a9e7639ce7ba";
+//     private static String APPSECRET = "0fb8a38af8b0ee990e54270b56908829";
+
+
+    public static JSONObject getSessionKeyOrOpenId(String code) {
+        String requestUrl = "https://api.weixin.qq.com/sns/jscode2session";
+        HashMap<String, Object> requestUrlParam = new HashMap<>();
+        //小程序appId
+        requestUrlParam.put("appid", APPID);
+        //小程序secret
+        requestUrlParam.put("secret", APPSECRET);
+        //小程序端返回的code
+        requestUrlParam.put("js_code", code);
+        //默认参数
+        requestUrlParam.put("grant_type", "authorization_code");
+        //发送post请求读取调用微信接口获取openid用户唯一标识
+        String result = HttpUtil.get(requestUrl, requestUrlParam);
+
+        return JSONUtil.parseObj(result);
+    }
+
+    public static JSONObject getUserInfo(String encryptedData, String sessionKey, String iv)   {
+        // 被加密的数据
+        byte[] dataByte = Base64.decode(encryptedData);
+        // 加密秘钥
+        byte[] keyByte = Base64.decode(sessionKey);
+        // 偏移量
+        byte[] ivByte = Base64.decode(iv);
+        try {
+            // 如果密钥不足16位,那么就补足.  这个if 中的内容很重要
+            int base = 16;
+            if (keyByte.length % base != 0) {
+                int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0);
+                byte[] temp = new byte[groups * base];
+                Arrays.fill(temp, (byte) 0);
+                System.arraycopy(keyByte, 0, temp, 0, keyByte.length);
+                keyByte = temp;
+            }
+            // 初始化
+            Security.addProvider(new BouncyCastleProvider());
+            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
+            SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");
+            AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");
+            parameters.init(new IvParameterSpec(ivByte));
+            // 初始化
+            cipher.init(Cipher.DECRYPT_MODE, spec, parameters);
+            byte[] resultByte = cipher.doFinal(dataByte);
+            if (null != resultByte && resultByte.length > 0) {
+                String result = new String(resultByte, "UTF-8");
+                return JSONUtil.parseObj(result);
+            }
+        } catch (Exception e) {
+        }
+        return null;
+    }
+}

+ 69 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/domain/AdminDept.java

@@ -0,0 +1,69 @@
+package sm.cloud.admin.server.dao.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 王彦委
+ * @since 2023-03-23
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("sys_admin_dept")
+@ApiModel(value="AdminDept对象", description="")
+public class AdminDept implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private Long id;
+
+    @ApiModelProperty(value = "创建人")
+    @TableField("createId")
+    private Long createId;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField("createTime")
+    private Date createTime;
+
+    @ApiModelProperty(value = "修改时间")
+    @TableField("updateTime")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "是否删除 0-否 1-是")
+    @TableLogic
+    @TableField(fill = FieldFill.INSERT)
+    private Integer ifDelete;
+
+    @ApiModelProperty(value = "姓名")
+    private String name;
+
+    @ApiModelProperty(value = "父级序号")
+    @TableField("parentId")
+    private Long parentId;
+
+    @ApiModelProperty(value = "租户序号")
+    @TableField("tenantId")
+    private Long tenantId;
+
+    @ApiModelProperty(value = "备注")
+    private String note;
+
+    @ApiModelProperty(value = "状态")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer status;
+
+
+}

+ 68 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/domain/AdminDict.java

@@ -0,0 +1,68 @@
+package sm.cloud.admin.server.dao.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 王彦委
+ * @since 2023-03-24
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("sys_admin_dict")
+@ApiModel(value="AdminDict对象", description="")
+public class AdminDict implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private Long id;
+
+    @ApiModelProperty(value = "名称")
+    private String name;
+
+    @ApiModelProperty(value = "关键字")
+    @TableField("keyWord")
+    private String keyWord;
+
+    @ApiModelProperty(value = "数据")
+    private String data;
+
+    @ApiModelProperty(value = "状态")
+    @TableField(fill = FieldFill.INSERT)
+    private String status;
+
+    @ApiModelProperty(value = "上级序号")
+    private String pid;
+
+    @ApiModelProperty(value = "创建人")
+    @TableField("createId")
+    private Long createId;
+
+    @ApiModelProperty(value = "是否删除 0-否 1-是")
+    @TableLogic
+    @TableField(fill = FieldFill.INSERT)
+    private Integer ifDelete;
+
+    @ApiModelProperty(value = "修改时间")
+    @TableField("updateTime")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField("createTime")
+    private Date createTime;
+
+
+}

+ 76 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/domain/AdminMenu.java

@@ -0,0 +1,76 @@
+package sm.cloud.admin.server.dao.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 王彦委
+ * @since 2023-03-22
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("sys_admin_menu")
+@ApiModel(value="AdminMenu对象", description="")
+public class AdminMenu implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private Long id;
+
+    @ApiModelProperty(value = "名称")
+    private String name;
+
+    @ApiModelProperty(value = "标题")
+    private String title;
+
+    @ApiModelProperty(value = "路径")
+    private String path;
+
+    @ApiModelProperty(value = "组件")
+    private String component;
+
+    @ApiModelProperty(value = "图标")
+    private String icon;
+
+    @ApiModelProperty(value = "单号")
+    @TableField("formId")
+    private String formId;
+
+    private String pid;
+
+    @ApiModelProperty(value = "创建人")
+    @TableField("createId")
+    private Long createId;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField("createTime")
+    private Date createTime;
+
+    @ApiModelProperty(value = "修改时间")
+    @TableField("updateTime")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "是否删除 0-否 1-是")
+    @TableLogic
+    @TableField(fill = FieldFill.INSERT)
+    private Integer ifDelete;
+
+    @TableField(fill = FieldFill.INSERT)
+    private String status;
+
+    @TableField("sort")
+    private Integer sort;
+}

+ 110 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/domain/AdminPermit.java

@@ -0,0 +1,110 @@
+package sm.cloud.admin.server.dao.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author 王彦委
+ * @since 2023-03-17
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("sys_admin_permit")
+@ApiModel(value = "AdminPermit对象", description = "")
+public class AdminPermit implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private Long id;
+
+    @ApiModelProperty(value = "名称")
+    private String name;
+
+    @TableField("setAuth")
+    @ApiModelProperty(value = "是否授权")
+    private Integer setAuth;
+
+    @TableField("dataAuth")
+    @ApiModelProperty(value = "数据控制")
+    private Integer dataAuth;
+
+
+    @ApiModelProperty(value = "标识")
+    @TableField("keyValue")
+    private String keyValue;
+
+    @ApiModelProperty(value = "请求字段")
+    @TableField("requestField")
+    private String requestField;
+
+    @ApiModelProperty(value = "扩展字段")
+    @TableField("extendField")
+    private String extendField;
+
+    @ApiModelProperty(value = "返回字段")
+    @TableField("responseField")
+    private String responseField;
+
+
+    @ApiModelProperty(value = "状态")
+    @TableField(fill = FieldFill.INSERT)
+    private String status;
+
+    @ApiModelProperty(value = "上级序号")
+    private String pid;
+
+    @TableField("afterEnhance")
+    @ApiModelProperty(value = "后置增强")
+    private String afterEnhance;
+
+    @TableField("beforeEnhance")
+    @ApiModelProperty(value = "前置增强")
+    private String beforeEnhance;
+
+
+    @TableField("setTenant")
+    @ApiModelProperty(value = "设置租户")
+    private Integer setTenant;
+
+    @TableField("setDept")
+    @ApiModelProperty(value = "设置部门")
+    private Integer setDept;
+
+    @ApiModelProperty(value = "库表")
+    @TableField("dbTable")
+    private String dbTable;
+
+    @ApiModelProperty(value = "创建人")
+    @TableField("createId")
+    private Long createId;
+
+    @ApiModelProperty(value = "是否删除 0-否 1-是")
+    @TableLogic
+    @TableField(fill = FieldFill.INSERT)
+    private Integer ifDelete;
+
+    @ApiModelProperty(value = "修改时间")
+    @TableField("updateTime")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField("createTime")
+    private Date createTime;
+
+    private String note;
+
+
+}

+ 73 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/domain/AdminPost.java

@@ -0,0 +1,73 @@
+package sm.cloud.admin.server.dao.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 王彦委
+ * @since 2023-03-23
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("sys_admin_post")
+@ApiModel(value="AdminPost对象", description="")
+public class AdminPost implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private Long id;
+
+    @ApiModelProperty(value = "创建人")
+    @TableField("createId")
+    private Long createId;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField("createTime")
+    private Date createTime;
+
+    @ApiModelProperty(value = "修改时间")
+    @TableField("updateTime")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "是否删除 0-否 1-是")
+    @TableLogic
+    @TableField(fill = FieldFill.INSERT)
+    private Integer ifDelete;
+
+    @ApiModelProperty(value = "职位名称")
+    private String name;
+
+    @ApiModelProperty(value = "父d")
+    @TableField("parentId")
+    private Long parentId;
+
+    @ApiModelProperty(value = "租户id")
+    @TableField("tenantId")
+    private Long tenantId;
+
+    @ApiModelProperty(value = "状态")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer status;
+
+    @ApiModelProperty(value = "备注")
+    private String note;
+
+    @ApiModelProperty(value = "部门序号集合,即:当前职位的用户,可以拥有哪些部门的数据权限")
+    @TableField("postDept")
+    private String postDept;
+
+
+}

+ 68 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/domain/AdminRole.java

@@ -0,0 +1,68 @@
+package sm.cloud.admin.server.dao.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 王彦委
+ * @since 2023-03-22
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("sys_admin_role")
+@ApiModel(value="AdminRole对象", description="")
+public class AdminRole implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private Long id;
+
+    @ApiModelProperty(value = "名称")
+    private String name;
+
+    @TableField(fill = FieldFill.INSERT)
+    private String status;
+
+    @ApiModelProperty(value = "角色菜单")
+    @TableField("roleMenu")
+    private String roleMenu;
+
+    @ApiModelProperty(value = "角色字典")
+    @TableField("roleDict")
+    private String roleDict;
+
+    @TableField("rolePermit")
+    private String rolePermit;
+
+    @ApiModelProperty(value = "创建人")
+    @TableField("createId")
+    private Long createId;
+
+    @ApiModelProperty(value = "是否删除 0-否 1-是")
+    @TableLogic
+    @TableField(fill = FieldFill.INSERT)
+    private Integer ifDelete;
+
+    @ApiModelProperty(value = "修改时间")
+    @TableField("updateTime")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField("createTime")
+    private Date createTime;
+
+
+}

+ 75 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/domain/AdminTable.java

@@ -0,0 +1,75 @@
+package sm.cloud.admin.server.dao.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author 王彦委
+ * @since 2023-03-17
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("sys_admin_table")
+@ApiModel(value = "AdminTable对象", description = "")
+public class AdminTable implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "序号")
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private Long id;
+
+    @ApiModelProperty(value = "表名")
+    @TableField("tableName")
+    private String tableName;
+
+    @ApiModelProperty(value = "中文表名")
+    @TableField("tableNameCn")
+    private String tableNameCn;
+
+    @ApiModelProperty(value = "字段")
+    @TableField("fieldJson")
+    private String fieldJson;
+
+    @ApiModelProperty(value = "备注")
+    private String note;
+
+    @TableField("readRange")
+    @ApiModelProperty(value = "可读范围")
+    private String readRange;
+
+    @TableField("writeRange")
+    @ApiModelProperty(value = "可写范围")
+    private String writeRange;
+
+    @ApiModelProperty(value = "创建人")
+    @TableField("createId")
+    private Long createId;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField("createTime")
+    private Date createTime;
+
+    @ApiModelProperty(value = "修改时间")
+    @TableField("updateTime")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "是否删除 0-否 1-是")
+    @TableLogic
+    @TableField(fill = FieldFill.INSERT)
+    private Integer ifDelete;
+
+
+}

+ 77 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/domain/AdminUser.java

@@ -0,0 +1,77 @@
+package sm.cloud.admin.server.dao.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 王彦委
+ * @since 2023-03-22
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("sys_admin_user")
+@ApiModel(value="AdminUser对象", description="")
+public class AdminUser implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private Long id;
+
+    @TableField("userName")
+    private String userName;
+
+    private String password;
+
+    @TableField("realName")
+    private String realName;
+
+    @TableField("postId")
+    private String postId;
+
+    @TableField("roleId")
+    private String roleId;
+
+    @TableField("deptId")
+    private String deptId;
+
+    @TableField("tenantId")
+    private String tenantId;
+
+    @TableField("salt")
+    private String salt;
+
+    @TableField(fill = FieldFill.INSERT)
+    private String status;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField("createTime")
+    private Date createTime;
+
+    @ApiModelProperty(value = "修改时间")
+    @TableField("updateTime")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "创建人")
+    @TableField("createId")
+    private Long createId;
+
+    @ApiModelProperty(value = "是否删除 0-否 1-是")
+    @TableLogic
+    @TableField(fill = FieldFill.INSERT)
+    private Integer ifDelete;
+
+
+}

+ 68 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/domain/ClientAccount.java

@@ -0,0 +1,68 @@
+package sm.cloud.admin.server.dao.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 王彦委
+ * @since 2023-03-30
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("tb_client_account")
+@ApiModel(value="ClientAccount对象", description="")
+public class ClientAccount implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private Long id;
+
+    @ApiModelProperty(value = "创建人")
+    @TableField("createId")
+    private Long createId;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField("createTime")
+    private Date createTime;
+
+    @ApiModelProperty(value = "修改时间")
+    @TableField("updateTime")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "是否删除 0-否 1-是")
+    @TableLogic
+    @TableField(fill = FieldFill.INSERT)
+    private Integer ifDelete;
+
+    @ApiModelProperty(value = "帐号")
+    private String account;
+
+    @ApiModelProperty(value = "密码")
+    private String password;
+
+    @ApiModelProperty(value = "盐值")
+    private String salt;
+
+    @ApiModelProperty(value = "联合序号")
+    @TableField("unionId")
+    private Long unionId;
+
+    @ApiModelProperty(value = "状态")
+    @TableField(fill = FieldFill.INSERT)
+    private String status;
+
+
+}

+ 103 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/domain/ClientUnion.java

@@ -0,0 +1,103 @@
+package sm.cloud.admin.server.dao.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 王彦委
+ * @since 2023-04-03
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("tb_client_union")
+@ApiModel(value="ClientUnion对象", description="")
+public class ClientUnion implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private Long id;
+
+    @ApiModelProperty(value = "手机号")
+    private String phone;
+
+    @ApiModelProperty(value = "角色")
+    @TableField("roleId")
+    private String roleId;
+
+    @ApiModelProperty(value = "部门")
+    @TableField("deptId")
+    private String deptId;
+
+    @ApiModelProperty(value = "职位")
+    @TableField("postId")
+    private String postId;
+
+    @ApiModelProperty(value = "租户")
+    @TableField("tenantId")
+    private Long tenantId;
+
+    @ApiModelProperty(value = "姓名")
+    @TableField("xingMing")
+    private String xingMing;
+
+    @ApiModelProperty(value = "身份证号")
+    @TableField("shenFenZhengHao")
+    private String shenFenZhengHao;
+
+    @ApiModelProperty(value = "省")
+    private String sheng;
+
+    @ApiModelProperty(value = "市")
+    private String shi;
+
+    @ApiModelProperty(value = "县")
+    private String xian;
+
+    @ApiModelProperty(value = "具体地址")
+    @TableField("juTiDiZhi")
+    private String juTiDiZhi;
+
+    @ApiModelProperty(value = "详细地址")
+    @TableField("xiangXiDiZhi")
+    private String xiangXiDiZhi;
+
+    @ApiModelProperty(value = "性别")
+    @TableField("xingBie")
+    private String xingBie;
+
+    @ApiModelProperty(value = "单位名称")
+    @TableField("danWeiMingChen")
+    private String danWeiMingChen;
+
+    @ApiModelProperty(value = "是否删除 0-否 1-是")
+    @TableLogic
+    @TableField(fill = FieldFill.INSERT)
+    private Integer ifDelete;
+
+    @ApiModelProperty(value = "修改时间")
+    @TableField("updateTime")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField("createTime")
+    private Date createTime;
+
+    @ApiModelProperty(value = "创建人")
+    @TableField("createId")
+    private Long createId;
+
+
+}

+ 101 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/domain/VisitAppoint.java

@@ -0,0 +1,101 @@
+package sm.cloud.admin.server.dao.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 王彦委
+ * @since 2023-04-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("tb_visit_appoint")
+@ApiModel(value="VisitAppoint对象", description="")
+public class VisitAppoint implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private Long id;
+
+    @ApiModelProperty(value = "游客名称")
+    @TableField("youKeMingChen")
+    private String youKeMingChen;
+
+    @ApiModelProperty(value = "联系电话")
+    @TableField("lianXiDianHua")
+    private String lianXiDianHua;
+
+    @ApiModelProperty(value = "预约时间")
+    @TableField("yuYueShiJian")
+    private Date yuYueShiJian;
+
+    @ApiModelProperty(value = "身份证号")
+    @TableField("shenFenZhengHao")
+    private String shenFenZhengHao;
+
+    @ApiModelProperty(value = "居住地址")
+    @TableField("jiZhuDiZhi")
+    private String jiZhuDiZhi;
+
+    @ApiModelProperty(value = "参观时间")
+    @TableField("canGuanShiJian")
+    private Date canGuanShiJian;
+
+    @ApiModelProperty(value = "是否删除 0-否 1-是")
+    @TableLogic
+    @TableField(fill = FieldFill.INSERT)
+    private Integer ifDelete;
+
+    @ApiModelProperty(value = "修改时间")
+    @TableField("updateTime")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField("createTime")
+    private Date createTime;
+
+    @ApiModelProperty(value = "创建人")
+    @TableField("createId")
+    private Long createId;
+
+    @ApiModelProperty(value = "人工二维码")
+    @TableField("renGongErWeiMa")
+    private String renGongErWeiMa;
+
+    @ApiModelProperty(value = "自动二维码")
+    @TableField("ziDongErWeiMa")
+    private String ziDongErWeiMa;
+
+    @ApiModelProperty(value = "状态 状态 1.待使用 2.已使用 3.已评价 4.已取消 5.已过期(超过预约时间没有使用的)")
+    @TableField("status")
+    private Integer status;
+
+    @ApiModelProperty(value = "核销方式 1.扫码核销 2.闸机核销 3.扫码自动预约")
+    @TableField("heXiaoFangShi")
+    private Integer heXiaoFangShi;
+
+    @ApiModelProperty(value = "预约类型 1.个人 2.企业")
+    @TableField("visitAppointType")
+    private Integer visitAppointType;
+
+    @ApiModelProperty(value = "团队id")
+    @TableField("teamId")
+    private Long teamId;
+
+
+
+
+}

+ 81 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/domain/VisitAppointTeam.java

@@ -0,0 +1,81 @@
+package sm.cloud.admin.server.dao.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 王彦委
+ * @since 2023-05-18
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("tb_visit_appoint_team")
+@ApiModel(value="VisitAppointTeam对象", description="")
+public class VisitAppointTeam implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private Long id;
+
+    @ApiModelProperty(value = "创建人")
+    @TableField("createId")
+    private Long createId;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField("createTime")
+    private Date createTime;
+
+    @ApiModelProperty(value = "修改时间")
+    @TableField("updateTime")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "是否删除 0-否 1-是")
+    @TableLogic
+    @TableField(fill = FieldFill.INSERT)
+    private Integer ifDelete;
+
+    @ApiModelProperty(value = "参观人数")
+    private Integer attendance;
+
+    @ApiModelProperty(value = "单位类型")
+    @TableField("unitType")
+    private Long unitType;
+
+    @ApiModelProperty(value = "单位名称")
+    @TableField("unitName")
+    private String unitName;
+
+    @ApiModelProperty(value = "单位类型描述")
+    @TableField("unitTypeText")
+    private String unitTypeText;
+
+    @ApiModelProperty(value = "带队领导")
+    private String leadership;
+
+    @ApiModelProperty(value = "带队领导职务")
+    @TableField("leadershipPost")
+    private String leadershipPost;
+
+    @ApiModelProperty(value = "联系人")
+    private String contact;
+
+    @ApiModelProperty(value = "联系人电话")
+    @TableField("ContactPhone")
+    private String ContactPhone;
+
+
+}

+ 16 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/mapper/IAdminDeptMapper.java

@@ -0,0 +1,16 @@
+package sm.cloud.admin.server.dao.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import sm.cloud.admin.server.dao.domain.AdminDept;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 王彦委
+ * @since 2023-03-23
+ */
+public interface IAdminDeptMapper extends BaseMapper<AdminDept> {
+
+}

+ 16 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/mapper/IAdminDictMapper.java

@@ -0,0 +1,16 @@
+package sm.cloud.admin.server.dao.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import sm.cloud.admin.server.dao.domain.AdminDict;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 王彦委
+ * @since 2023-03-24
+ */
+public interface IAdminDictMapper extends BaseMapper<AdminDict> {
+
+}

+ 16 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/mapper/IAdminMenuMapper.java

@@ -0,0 +1,16 @@
+package sm.cloud.admin.server.dao.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import sm.cloud.admin.server.dao.domain.AdminMenu;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 王彦委
+ * @since 2023-03-22
+ */
+public interface IAdminMenuMapper extends BaseMapper<AdminMenu> {
+
+}

+ 16 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/mapper/IAdminPermitMapper.java

@@ -0,0 +1,16 @@
+package sm.cloud.admin.server.dao.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import sm.cloud.admin.server.dao.domain.AdminPermit;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 王彦委
+ * @since 2023-03-17
+ */
+public interface IAdminPermitMapper extends BaseMapper<AdminPermit> {
+
+}

+ 16 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/mapper/IAdminPostMapper.java

@@ -0,0 +1,16 @@
+package sm.cloud.admin.server.dao.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import sm.cloud.admin.server.dao.domain.AdminPost;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 王彦委
+ * @since 2023-03-23
+ */
+public interface IAdminPostMapper extends BaseMapper<AdminPost> {
+
+}

+ 16 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/mapper/IAdminRoleMapper.java

@@ -0,0 +1,16 @@
+package sm.cloud.admin.server.dao.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import sm.cloud.admin.server.dao.domain.AdminRole;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 王彦委
+ * @since 2023-03-22
+ */
+public interface IAdminRoleMapper extends BaseMapper<AdminRole> {
+
+}

+ 78 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/mapper/IAdminTableMapper.java

@@ -0,0 +1,78 @@
+package sm.cloud.admin.server.dao.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+import sm.cloud.admin.api.model.dto.AdminTableDTO;
+import sm.cloud.admin.server.dao.domain.AdminTable;
+
+/**
+ * <p>
+ * Mapper 接口
+ * </p>
+ *
+ * @author 王彦委
+ * @since 2023-02-28
+ */
+public interface IAdminTableMapper extends BaseMapper<AdminTable> {
+
+
+    /**
+     * <p>
+     * 创建 表-字段类型
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-03-02 09:28
+     **/
+    void createEntityTable(@Param("tableInfo") AdminTableDTO.AddDTO addDTO);
+
+    /**
+     * <p>
+     * 修改表名
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-02-28 15:12
+     **/
+    void updateTableName(@Param("oldTableName") String oldTableName, @Param("newTableName") String newTableName);
+
+    /**
+     * <p>
+     * 增加字段
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-03-02 10:18
+     **/
+    void addField(@Param("tableName") String tableName, @Param("field") AdminTableDTO.Field field);
+
+    /**
+     * <p>
+     * 修改字段
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-03-02 10:18
+     **/
+    void updateField(@Param("tableName") String tableName, @Param("field") AdminTableDTO.Field field);
+
+    /**
+     * <p>
+     * 删除字段
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-03-02 10:20
+     **/
+    void delField(@Param("tableName") String tableName, @Param("field") String field);
+}

+ 16 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/mapper/IAdminUserMapper.java

@@ -0,0 +1,16 @@
+package sm.cloud.admin.server.dao.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import sm.cloud.admin.server.dao.domain.AdminUser;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 王彦委
+ * @since 2023-03-22
+ */
+public interface IAdminUserMapper extends BaseMapper<AdminUser> {
+
+}

+ 16 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/mapper/IClientAccountMapper.java

@@ -0,0 +1,16 @@
+package sm.cloud.admin.server.dao.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import sm.cloud.admin.server.dao.domain.ClientAccount;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 王彦委
+ * @since 2023-03-30
+ */
+public interface IClientAccountMapper extends BaseMapper<ClientAccount> {
+
+}

+ 16 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/mapper/IClientUnionMapper.java

@@ -0,0 +1,16 @@
+package sm.cloud.admin.server.dao.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import sm.cloud.admin.server.dao.domain.ClientUnion;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 王彦委
+ * @since 2023-03-30
+ */
+public interface IClientUnionMapper extends BaseMapper<ClientUnion> {
+
+}

+ 89 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/mapper/IVFormMapper.java

@@ -0,0 +1,89 @@
+package sm.cloud.admin.server.dao.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+import sm.cloud.admin.api.model.dto.VFormEntityDTO;
+import sm.cloud.admin.server.core.entity.VFormEntity;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by Intellij IDEA.
+ * User:  nuyang
+ * Date:  2023/2/7
+ */
+public interface IVFormMapper {
+
+    /**
+     * <p>
+     * 增加实体数据
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-02-28 15:49
+     **/
+    Integer insertEntity(@Param("tableName") String tableName, @Param("vFormEntity") VFormEntity vForm);
+
+
+    /**
+     * <p>
+     * 修改
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-03-02 18:00
+     **/
+    int updateEntity(@Param("tableName") String tableName, @Param("vFormEntity") VFormEntity vFormEntity,
+                     @Param("ew") QueryWrapper<Object> queryWrapper);
+
+
+    /**
+     * <p>
+     * 查询
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-02-28 16:59
+     **/
+    @Select("select ${ew.sqlSelect} from ${tableName}  ${ew.customSqlSegment}")
+    List<Map<String, Object>> select(@Param("tableName") String tableName,
+                                     @Param("ew") QueryWrapper<Object> queryWrapper);
+
+    /**
+     * <p>
+     * 查询数量
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-03-01 11:33
+     **/
+    @Select("select count(1) from ${tableName} ${ew.customSqlSegment}")
+    Integer selectCount(@Param("tableName") String tableName, @Param("ew") QueryWrapper<Object> queryWrapper);
+
+
+    /**
+     * <p>
+     * 根据序号删除
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-03-11 11:21
+     **/
+    @Update("update  ${tableName} set if_delete=${id}  ${ew.customSqlSegment}")
+    Integer deleteById(@Param("tableName") String tableName, @Param("id") String id,
+                       @Param("ew") UpdateWrapper<Object> updateWrapper);
+}

+ 16 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/mapper/IVisitAppointMapper.java

@@ -0,0 +1,16 @@
+package sm.cloud.admin.server.dao.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import sm.cloud.admin.server.dao.domain.VisitAppoint;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 王彦委
+ * @since 2023-04-03
+ */
+public interface IVisitAppointMapper extends BaseMapper<VisitAppoint> {
+
+}

+ 24 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/mapper/IVisitAppointTeamMapper.java

@@ -0,0 +1,24 @@
+package sm.cloud.admin.server.dao.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import org.apache.ibatis.annotations.Param;
+import sm.cloud.admin.server.dao.domain.VisitAppointTeam;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 王彦委
+ * @since 2023-03-23
+ */
+public interface IVisitAppointTeamMapper extends BaseMapper<VisitAppointTeam> {
+
+    /*
+    查询当天同一企业预约列表
+     */
+    List<VisitAppointTeam> findListByUnitName(@Param("uninName")String uninName,@Param("appointDate")String appointDate);
+}

+ 35 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/repository/AdminDeptRepository.java

@@ -0,0 +1,35 @@
+package sm.cloud.admin.server.dao.repository;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Repository;
+import sm.cloud.admin.server.dao.domain.AdminDept;
+import sm.cloud.admin.server.dao.mapper.IAdminDeptMapper;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author 王彦委
+ * @since 2023-03-23
+ */
+@Repository
+public class AdminDeptRepository extends ServiceImpl<IAdminDeptMapper, AdminDept> implements IService<AdminDept> {
+
+    /**
+     * <p>
+     * 根据序号查询
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-03-23 11:40
+     **/
+    public List<AdminDept> selectByIds(List<String> roleIdList) {
+        return lambdaQuery().in(AdminDept::getId,roleIdList).list();
+    }
+}

+ 32 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/repository/AdminDictRepository.java

@@ -0,0 +1,32 @@
+package sm.cloud.admin.server.dao.repository;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Repository;
+import sm.cloud.admin.server.dao.domain.AdminDict;
+import sm.cloud.admin.server.dao.domain.VisitAppoint;
+import sm.cloud.admin.server.dao.mapper.IAdminDictMapper;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 王彦委
+ * @since 2023-03-24
+ */
+@Repository
+public class AdminDictRepository extends ServiceImpl<IAdminDictMapper, AdminDict> implements IService<AdminDict> {
+
+
+
+    public AdminDict selectBykeyWord(String keyWord){
+        return lambdaQuery()
+                .eq(AdminDict::getKeyWord,keyWord)
+                .eq(AdminDict::getIfDelete,0)
+                .last("limit 1")
+                .one();
+    }
+
+
+}

+ 35 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/repository/AdminMenuRepository.java

@@ -0,0 +1,35 @@
+package sm.cloud.admin.server.dao.repository;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Repository;
+import sm.cloud.admin.server.dao.domain.AdminMenu;
+import sm.cloud.admin.server.dao.mapper.IAdminMenuMapper;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author 王彦委
+ * @since 2023-03-22
+ */
+@Repository
+public class AdminMenuRepository extends ServiceImpl<IAdminMenuMapper, AdminMenu> implements IService<AdminMenu> {
+
+    /**
+     * <p>
+     * 根据序号查询
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-03-22 15:23
+     **/
+    public List<AdminMenu> selectByIds(List<String> menuIds) {
+        return lambdaQuery().in(AdminMenu::getId,menuIds).orderByAsc(AdminMenu::getSort).list();
+    }
+}

+ 52 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/repository/AdminPermitRepository.java

@@ -0,0 +1,52 @@
+package sm.cloud.admin.server.dao.repository;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Repository;
+import sm.cloud.admin.server.dao.domain.AdminPermit;
+import sm.cloud.admin.server.dao.mapper.IAdminPermitMapper;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author 王彦委
+ * @since 2023-03-17
+ */
+@Repository
+public class AdminPermitRepository extends ServiceImpl<IAdminPermitMapper, AdminPermit> implements IService<AdminPermit> {
+
+    /**
+     * <p>
+     * 根据权限标识查询
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-03-17 11:27
+     **/
+    public AdminPermit selectByPermit(String permission) {
+        return lambdaQuery()
+                .eq(AdminPermit::getKeyValue, permission)
+                .one();
+    }
+
+    /**
+     * <p>
+     *     根据授权查询
+     * </p>
+     * @author 王彦委
+     * @date 2023-04-10 18:18
+     * @param
+     * @return
+     **/
+    public List<AdminPermit> selectByAuth(int auth) {
+        return lambdaQuery()
+                .eq(AdminPermit::getSetAuth, auth)
+                .list();
+    }
+}

+ 36 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/repository/AdminPostRepository.java

@@ -0,0 +1,36 @@
+package sm.cloud.admin.server.dao.repository;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Repository;
+import sm.cloud.admin.server.dao.domain.AdminPost;
+import sm.cloud.admin.server.dao.mapper.IAdminPostMapper;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author 王彦委
+ * @since 2023-03-23
+ */
+@Repository
+public class AdminPostRepository extends ServiceImpl<IAdminPostMapper, AdminPost> implements IService<AdminPost> {
+
+
+    /**
+     * <p>
+     * 根据序号查询
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-03-23 14:37
+     **/
+    public List<AdminPost> selectByIds(List<String> postIdList) {
+        return lambdaQuery().in(AdminPost::getId,postIdList).list();
+    }
+}

+ 35 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/repository/AdminRoleRepository.java

@@ -0,0 +1,35 @@
+package sm.cloud.admin.server.dao.repository;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Repository;
+import sm.cloud.admin.server.dao.domain.AdminRole;
+import sm.cloud.admin.server.dao.mapper.IAdminRoleMapper;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author 王彦委
+ * @since 2023-03-22
+ */
+@Repository
+public class AdminRoleRepository extends ServiceImpl<IAdminRoleMapper, AdminRole> implements IService<AdminRole> {
+
+    /**
+     * <p>
+     * 根据序号查询
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-03-22 15:13
+     **/
+    public List<AdminRole> selectByIds(List<String> idList) {
+        return lambdaQuery().in(AdminRole::getId,idList).list();
+    }
+}

+ 94 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/repository/AdminTableRepository.java

@@ -0,0 +1,94 @@
+package sm.cloud.admin.server.dao.repository;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Repository;
+import sm.cloud.admin.api.model.dto.AdminTableDTO;
+import sm.cloud.admin.server.dao.domain.AdminTable;
+import sm.cloud.admin.server.dao.mapper.IAdminTableMapper;
+
+import javax.annotation.Resource;
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author 王彦委
+ * @since 2023-02-28
+ */
+@Repository
+public class AdminTableRepository extends ServiceImpl<IAdminTableMapper, AdminTable> implements IService<AdminTable> {
+
+    @Resource
+    private IAdminTableMapper adminTableMapper;
+
+
+
+    /**
+     * <p>
+     * 创建表
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-02-28 14:17
+     **/
+    public void createTable(AdminTableDTO.AddDTO addDTO) {
+        //普通表结构
+        adminTableMapper.createEntityTable(addDTO);
+    }
+
+    /**
+     * <p>
+     * 根据表名查询
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-02-28 15:04
+     **/
+    public AdminTable selectByTableName(String tableName) {
+        return lambdaQuery()
+                .eq(AdminTable::getTableName, tableName)
+                .one();
+    }
+
+    /**
+     * <p>
+     * 修改表名
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-02-28 15:19
+     **/
+    public void updateTableName(String oldTableName, String newTableName) {
+        adminTableMapper.updateTableName(oldTableName, newTableName);
+    }
+
+    /**
+     * 增加字段
+     */
+    public void addField(String tableName,AdminTableDTO.Field field){
+        adminTableMapper.addField(tableName, field);
+    }
+
+    /**
+     * 修改字段
+     */
+    public void updateField(String tableName,AdminTableDTO.Field field){
+        adminTableMapper.updateField(tableName, field);
+    }
+
+    /**
+     * 删除字段
+     */
+    public void delField(String tableName,AdminTableDTO.Field field){
+        adminTableMapper.delField(tableName, field.getField());
+    }
+}

+ 34 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/repository/AdminUserRepository.java

@@ -0,0 +1,34 @@
+package sm.cloud.admin.server.dao.repository;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Repository;
+import sm.cloud.admin.server.dao.domain.AdminUser;
+import sm.cloud.admin.server.dao.mapper.IAdminUserMapper;
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author 王彦委
+ * @since 2023-03-22
+ */
+@Repository
+public class AdminUserRepository extends ServiceImpl<IAdminUserMapper, AdminUser> implements IService<AdminUser> {
+
+
+    /**
+     * <p>
+     * 根据用户名查询
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-03-22 09:40
+     **/
+    public AdminUser selectByUserName(String username) {
+        return lambdaQuery().eq(AdminUser::getUserName,username).one();
+    }
+}

+ 41 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/repository/ClientAccountRepository.java

@@ -0,0 +1,41 @@
+package sm.cloud.admin.server.dao.repository;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Repository;
+import sm.cloud.admin.server.dao.domain.ClientAccount;
+import sm.cloud.admin.server.dao.mapper.IClientAccountMapper;
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author 王彦委
+ * @since 2023-03-30
+ */
+@Repository
+public class ClientAccountRepository extends ServiceImpl<IClientAccountMapper, ClientAccount> implements IService<ClientAccount> {
+
+    /**
+     * <p>
+     * 根据帐号查询
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-03-30 17:17
+     **/
+    public ClientAccount selectByUserName(String username) {
+        return lambdaQuery()
+                .eq(ClientAccount::getAccount, username)
+                .one();
+    }
+
+    public ClientAccount selectByUnionId(Long unionId) {
+        return lambdaQuery()
+                .eq(ClientAccount::getUnionId, unionId)
+                .one();
+    }
+}

+ 52 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/repository/ClientUnionRepository.java

@@ -0,0 +1,52 @@
+package sm.cloud.admin.server.dao.repository;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Repository;
+import sm.cloud.admin.server.dao.domain.ClientAccount;
+import sm.cloud.admin.server.dao.domain.ClientUnion;
+import sm.cloud.admin.server.dao.mapper.IClientUnionMapper;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 王彦委
+ * @since 2023-03-30
+ */
+@Repository
+public class ClientUnionRepository extends ServiceImpl<IClientUnionMapper, ClientUnion> implements IService<ClientUnion> {
+
+
+
+    public ClientUnion selectByPhone(String phone) {
+        return lambdaQuery()
+                .eq(ClientUnion::getPhone, phone)
+//                .eq(ClientUnion::getIfDelete, 0)
+                .one();
+    }
+
+    public ClientUnion selectByPhoneAndId(String phone,String id) {
+        return lambdaQuery()
+                .eq(ClientUnion::getPhone, phone)
+                .ne(ClientUnion::getId, id)
+                .one();
+    }
+
+
+    public ClientUnion selectByIdCard(String idCare) {
+        return lambdaQuery()
+                .eq(ClientUnion::getShenFenZhengHao, idCare)
+//                .eq(ClientUnion::getIfDelete, 0)
+                .one();
+    }
+
+    public ClientUnion selectByIdCardAndId(String idCare,String id) {
+        return lambdaQuery()
+                .eq(ClientUnion::getShenFenZhengHao, idCare)
+                .ne(ClientUnion::getId, id)
+                .one();
+    }
+
+}

+ 85 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/repository/VisitAppointRepository.java

@@ -0,0 +1,85 @@
+package sm.cloud.admin.server.dao.repository;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import io.swagger.models.auth.In;
+import org.springframework.stereotype.Repository;
+import sm.cloud.admin.server.dao.domain.VisitAppoint;
+import sm.cloud.admin.server.dao.mapper.IVisitAppointMapper;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author 王彦委
+ * @since 2023-04-03
+ */
+@Repository
+public class VisitAppointRepository extends ServiceImpl<IVisitAppointMapper, VisitAppoint> implements IService<VisitAppoint> {
+
+
+    /**
+     * <p>
+     * 根据预约日期查询个人是否预约
+     * </p>
+     *
+     * @param
+     * @return
+     * @author 王彦委
+     * @date 2023-04-03 17:19
+     **/
+    public VisitAppoint selectByIdAndAppointDate(Long unionId, String appointDate) {
+        return lambdaQuery()
+                .eq(VisitAppoint::getCreateId,unionId)
+                .eq(VisitAppoint::getYuYueShiJian,appointDate)
+                .in(VisitAppoint::getStatus,1,2,3)
+                .eq(VisitAppoint::getVisitAppointType,1)
+
+                .last("limit 1")
+                .one();
+    }
+
+    public String selectByYuYueShiJian(String yuYueShiJian){
+        return lambdaQuery()
+                .eq(VisitAppoint::getYuYueShiJian,yuYueShiJian )
+                .in(VisitAppoint::getStatus,1,2,3)
+                .count().toString();
+    }
+
+    public List selectListByYuYueShiJian(String yuYueShiJian){
+        return lambdaQuery()
+//                .lt(VisitAppoint::getYuYueShiJian,yuYueShiJian )
+                .eq(VisitAppoint::getYuYueShiJian,yuYueShiJian )
+                .eq(VisitAppoint::getStatus,1)
+                .list();
+    }
+
+    /*
+    查询个人预约
+     */
+    public VisitAppoint selectOneByYuYueShiJian(Long unionId,String yuYueShiJian,Integer visitAppointType){
+        return lambdaQuery()
+                .eq(VisitAppoint::getCreateId,unionId)
+                .eq(VisitAppoint::getYuYueShiJian,yuYueShiJian )
+                .in(VisitAppoint::getStatus,1,2,3)
+                .eq(VisitAppoint::getVisitAppointType,visitAppointType)
+                .last("limit 1")
+                .one();
+    }
+
+    /*
+    根据团队ids查询团队预约信息
+     */
+    public List<VisitAppoint> selectListByTeamId(List<String> ids){
+
+        return lambdaQuery()
+                .eq(VisitAppoint::getVisitAppointType,2)
+                .in(VisitAppoint::getTeamId,ids )
+                .list();
+    }
+
+
+}

+ 39 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/dao/repository/VisitAppointTeamRepository.java

@@ -0,0 +1,39 @@
+package sm.cloud.admin.server.dao.repository;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Repository;
+import sm.cloud.admin.server.dao.domain.VisitAppoint;
+import sm.cloud.admin.server.dao.domain.VisitAppointTeam;
+import sm.cloud.admin.server.dao.mapper.IVisitAppointMapper;
+import sm.cloud.admin.server.dao.mapper.IVisitAppointTeamMapper;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author 王彦委
+ * @since 2023-04-03
+ */
+@Repository
+public class VisitAppointTeamRepository extends ServiceImpl<IVisitAppointTeamMapper, VisitAppointTeam> implements IService<VisitAppointTeam> {
+
+    /*
+     * 功能描述:通过企业名查询当天的预约记录
+     * @param unitName
+     * @Return: sm.cloud.admin.server.dao.domain.VisitAppointTeam
+     * @Author: 努阳
+     * @Date: 2023/5/18 15:40
+     */
+    public VisitAppointTeam selectByUnitName(String unitName){
+        return lambdaQuery()
+                .eq(VisitAppointTeam::getUnitName,unitName)
+                .last("limit 1")
+                .one();
+    }
+
+
+}

+ 19 - 0
cloud-application/cloud-admin/cloud-admin-server/src/main/java/sm/cloud/admin/server/manager/Md5PasswordManager.java

@@ -0,0 +1,19 @@
+package sm.cloud.admin.server.manager;
+
+import org.springframework.stereotype.Component;
+import org.springframework.util.DigestUtils;
+import sm.cloud.admin.server.core.interfaces.IPasswordService;
+
+/**
+ * @Author 王彦委
+ * @Description md5方式加解密
+ * @Date 2023-01-31 17:58
+ **/
+@Component
+public class Md5PasswordManager implements IPasswordService {
+    @Override
+    public String encryption(String password,String salt) {
+        return  DigestUtils.md5DigestAsHex((password+salt).getBytes());
+    }
+
+}

Some files were not shown because too many files changed in this diff