Commit e9317bf293167339cc045679bcae16d8ca81d0ef

Authored by YunaiV
2 parents 20b11092 01641cd1

Merge branch 'feature/mall_product_tmp' of https://gitee.com/zhijiantianya/ruoyi…

…-vue-pro into feature/mall_product

# Conflicts:
#	yudao-module-member/yudao-module-member-biz/src/test/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceTest.java
#	yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialUserServiceImpl.java
#	yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/social/SocialUserServiceImplTest.java
Showing 24 changed files with 837 additions and 22 deletions
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java
@@ -118,8 +118,9 @@ public interface ErrorCodeConstants { @@ -118,8 +118,9 @@ public interface ErrorCodeConstants {
118 ErrorCode SOCIAL_USER_AUTH_FAILURE = new ErrorCode(1_002_018_000, "社交授权失败,原因是:{}"); 118 ErrorCode SOCIAL_USER_AUTH_FAILURE = new ErrorCode(1_002_018_000, "社交授权失败,原因是:{}");
119 ErrorCode SOCIAL_USER_UNBIND_NOT_SELF = new ErrorCode(1_002_018_001, "社交解绑失败,非当前用户绑定"); 119 ErrorCode SOCIAL_USER_UNBIND_NOT_SELF = new ErrorCode(1_002_018_001, "社交解绑失败,非当前用户绑定");
120 ErrorCode SOCIAL_USER_NOT_FOUND = new ErrorCode(1_002_018_002, "社交授权失败,找不到对应的用户"); 120 ErrorCode SOCIAL_USER_NOT_FOUND = new ErrorCode(1_002_018_002, "社交授权失败,找不到对应的用户");
121 -  
122 ErrorCode SOCIAL_APP_WEIXIN_MINI_APP_PHONE_CODE_ERROR = new ErrorCode(1_002_018_103, "获得手机号失败"); 121 ErrorCode SOCIAL_APP_WEIXIN_MINI_APP_PHONE_CODE_ERROR = new ErrorCode(1_002_018_103, "获得手机号失败");
  122 + ErrorCode SOCIAL_CLIENT_NOT_EXISTS = new ErrorCode(1_002_018_104, "社交客户端不存在");
  123 + ErrorCode SOCIAL_USER_NOT_EXISTS = new ErrorCode(1_002_018_105, "社交用户不存在");
123 124
124 // ========== 系统敏感词 1-002-019-000 ========= 125 // ========== 系统敏感词 1-002-019-000 =========
125 ErrorCode SENSITIVE_WORD_NOT_EXISTS = new ErrorCode(1_002_019_000, "系统敏感词在所有标签中都不存在"); 126 ErrorCode SENSITIVE_WORD_NOT_EXISTS = new ErrorCode(1_002_019_000, "系统敏感词在所有标签中都不存在");
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialClientController.java 0 → 100644
  1 +package cn.iocoder.yudao.module.system.controller.admin.socail;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  4 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  5 +import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientCreateReqVO;
  6 +import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientPageReqVO;
  7 +import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientRespVO;
  8 +import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientUpdateReqVO;
  9 +import cn.iocoder.yudao.module.system.convert.social.SocialClientConvert;
  10 +import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialClientDO;
  11 +import cn.iocoder.yudao.module.system.service.social.SocialClientService;
  12 +import io.swagger.v3.oas.annotations.Operation;
  13 +import io.swagger.v3.oas.annotations.Parameter;
  14 +import io.swagger.v3.oas.annotations.tags.Tag;
  15 +import org.springframework.security.access.prepost.PreAuthorize;
  16 +import org.springframework.validation.annotation.Validated;
  17 +import org.springframework.web.bind.annotation.*;
  18 +
  19 +import javax.annotation.Resource;
  20 +import javax.validation.Valid;
  21 +
  22 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  23 +
  24 +@Tag(name = "管理后台 - 社交客户端")
  25 +@RestController
  26 +@RequestMapping("/system/social-client")
  27 +@Validated
  28 +public class SocialClientController {
  29 +
  30 + @Resource
  31 + private SocialClientService socialClientService;
  32 +
  33 + @PostMapping("/create")
  34 + @Operation(summary = "创建社交客户端")
  35 + @PreAuthorize("@ss.hasPermission('system:social-client:create')")
  36 + public CommonResult<Long> createSocialClient(@Valid @RequestBody SocialClientCreateReqVO createReqVO) {
  37 + return success(socialClientService.createSocialClient(createReqVO));
  38 + }
  39 +
  40 + @PutMapping("/update")
  41 + @Operation(summary = "更新社交客户端")
  42 + @PreAuthorize("@ss.hasPermission('system:social-client:update')")
  43 + public CommonResult<Boolean> updateSocialClient(@Valid @RequestBody SocialClientUpdateReqVO updateReqVO) {
  44 + socialClientService.updateSocialClient(updateReqVO);
  45 + return success(true);
  46 + }
  47 +
  48 + @DeleteMapping("/delete")
  49 + @Operation(summary = "删除社交客户端")
  50 + @Parameter(name = "id", description = "编号", required = true)
  51 + @PreAuthorize("@ss.hasPermission('system:social-client:delete')")
  52 + public CommonResult<Boolean> deleteSocialClient(@RequestParam("id") Long id) {
  53 + socialClientService.deleteSocialClient(id);
  54 + return success(true);
  55 + }
  56 +
  57 + @GetMapping("/get")
  58 + @Operation(summary = "获得社交客户端")
  59 + @Parameter(name = "id", description = "编号", required = true, example = "1024")
  60 + @PreAuthorize("@ss.hasPermission('system:social-client:query')")
  61 + public CommonResult<SocialClientRespVO> getSocialClient(@RequestParam("id") Long id) {
  62 + SocialClientDO socialClient = socialClientService.getSocialClient(id);
  63 + return success(SocialClientConvert.INSTANCE.convert(socialClient));
  64 + }
  65 +
  66 + @GetMapping("/page")
  67 + @Operation(summary = "获得社交客户端分页")
  68 + @PreAuthorize("@ss.hasPermission('system:social-client:query')")
  69 + public CommonResult<PageResult<SocialClientRespVO>> getSocialClientPage(@Valid SocialClientPageReqVO pageVO) {
  70 + PageResult<SocialClientDO> pageResult = socialClientService.getSocialClientPage(pageVO);
  71 + return success(SocialClientConvert.INSTANCE.convertPage(pageResult));
  72 + }
  73 +
  74 +}
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialUserController.java
@@ -2,18 +2,26 @@ package cn.iocoder.yudao.module.system.controller.admin.socail; @@ -2,18 +2,26 @@ package cn.iocoder.yudao.module.system.controller.admin.socail;
2 2
3 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; 3 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
4 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  5 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 import cn.iocoder.yudao.module.system.controller.admin.socail.vo.SocialUserBindReqVO; 6 import cn.iocoder.yudao.module.system.controller.admin.socail.vo.SocialUserBindReqVO;
6 import cn.iocoder.yudao.module.system.controller.admin.socail.vo.SocialUserUnbindReqVO; 7 import cn.iocoder.yudao.module.system.controller.admin.socail.vo.SocialUserUnbindReqVO;
  8 +import cn.iocoder.yudao.module.system.controller.admin.socail.vo.user.SocialUserPageReqVO;
  9 +import cn.iocoder.yudao.module.system.controller.admin.socail.vo.user.SocialUserRespVO;
  10 +import cn.iocoder.yudao.module.system.controller.admin.socail.vo.user.SocialUserUpdateReqVO;
7 import cn.iocoder.yudao.module.system.convert.social.SocialUserConvert; 11 import cn.iocoder.yudao.module.system.convert.social.SocialUserConvert;
  12 +import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialUserDO;
8 import cn.iocoder.yudao.module.system.service.social.SocialUserService; 13 import cn.iocoder.yudao.module.system.service.social.SocialUserService;
9 -import io.swagger.v3.oas.annotations.tags.Tag;  
10 import io.swagger.v3.oas.annotations.Operation; 14 import io.swagger.v3.oas.annotations.Operation;
  15 +import io.swagger.v3.oas.annotations.Parameter;
  16 +import io.swagger.v3.oas.annotations.tags.Tag;
  17 +import org.springframework.security.access.prepost.PreAuthorize;
11 import org.springframework.validation.annotation.Validated; 18 import org.springframework.validation.annotation.Validated;
12 import org.springframework.web.bind.annotation.*; 19 import org.springframework.web.bind.annotation.*;
13 20
14 import javax.annotation.Resource; 21 import javax.annotation.Resource;
15 import javax.validation.Valid; 22 import javax.validation.Valid;
16 23
  24 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
17 import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; 25 import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
18 26
19 @Tag(name = "管理后台 - 社交用户") 27 @Tag(name = "管理后台 - 社交用户")
@@ -39,4 +47,40 @@ public class SocialUserController { @@ -39,4 +47,40 @@ public class SocialUserController {
39 return CommonResult.success(true); 47 return CommonResult.success(true);
40 } 48 }
41 49
  50 + // ==================== 社交用户 CRUD ====================
  51 +
  52 + @PutMapping("/update")
  53 + @Operation(summary = "更新社交用户")
  54 + @PreAuthorize("@ss.hasPermission('system:social-user:update')")
  55 + public CommonResult<Boolean> updateSocialUser(@Valid @RequestBody SocialUserUpdateReqVO updateReqVO) {
  56 + socialUserService.updateSocialUser(updateReqVO);
  57 + return success(true);
  58 + }
  59 +
  60 + @DeleteMapping("/delete")
  61 + @Operation(summary = "删除社交用户")
  62 + @Parameter(name = "id", description = "编号", required = true)
  63 + @PreAuthorize("@ss.hasPermission('system:social-user:delete')")
  64 + public CommonResult<Boolean> deleteSocialUser(@RequestParam("id") Long id) {
  65 + socialUserService.deleteSocialUser(id);
  66 + return success(true);
  67 + }
  68 +
  69 + @GetMapping("/get")
  70 + @Operation(summary = "获得社交用户")
  71 + @Parameter(name = "id", description = "编号", required = true, example = "1024")
  72 + @PreAuthorize("@ss.hasPermission('system:social-user:query')")
  73 + public CommonResult<SocialUserRespVO> getSocialUser(@RequestParam("id") Long id) {
  74 + SocialUserDO socialUser = socialUserService.getSocialUser(id);
  75 + return success(SocialUserConvert.INSTANCE.convert(socialUser));
  76 + }
  77 +
  78 + @GetMapping("/page")
  79 + @Operation(summary = "获得社交用户分页")
  80 + @PreAuthorize("@ss.hasPermission('system:social-user:query')")
  81 + public CommonResult<PageResult<SocialUserRespVO>> getSocialUserPage(@Valid SocialUserPageReqVO pageVO) {
  82 + PageResult<SocialUserDO> pageResult = socialUserService.getSocialUserPage(pageVO);
  83 + return success(SocialUserConvert.INSTANCE.convertPage(pageResult));
  84 + }
  85 +
42 } 86 }
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/vo/client/SocialClientBaseVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.system.controller.admin.socail.vo.client;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +
  6 +import javax.validation.constraints.NotNull;
  7 +
  8 +/**
  9 + * 社交客户端 Base VO,提供给添加、修改、详细的子 VO 使用
  10 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
  11 + */
  12 +@Data
  13 +public class SocialClientBaseVO {
  14 +
  15 + @Schema(description = "应用名", requiredMode = Schema.RequiredMode.REQUIRED, example = "yudao商城")
  16 + @NotNull(message = "应用名不能为空")
  17 + private String name;
  18 +
  19 + @Schema(description = "社交平台的类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "31")
  20 + @NotNull(message = "社交平台的类型不能为空")
  21 + private Integer socialType;
  22 +
  23 + @Schema(description = "用户类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
  24 + @NotNull(message = "用户类型不能为空")
  25 + private Integer userType;
  26 +
  27 + @Schema(description = "客户端编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "wwd411c69a39ad2e54")
  28 + @NotNull(message = "客户端编号不能为空")
  29 + private String clientId;
  30 +
  31 + @Schema(description = "客户端密钥", requiredMode = Schema.RequiredMode.REQUIRED, example = "1wTb7hYxnpT2TUbIeHGXGo7T0odav1ic10mLdyyATOw")
  32 + @NotNull(message = "客户端密钥不能为空")
  33 + private String clientSecret;
  34 +
  35 + @Schema(description = "授权方的网页应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2000045")
  36 + private String agentId;
  37 +
  38 + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  39 + @NotNull(message = "状态不能为空")
  40 + private Integer status;
  41 +
  42 +}
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/vo/client/SocialClientCreateReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.system.controller.admin.socail.vo.client;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
  6 +import lombok.ToString;
  7 +
  8 +@Schema(description = "管理后台 - 社交客户端创建 Request VO")
  9 +@Data
  10 +@EqualsAndHashCode(callSuper = true)
  11 +@ToString(callSuper = true)
  12 +public class SocialClientCreateReqVO extends SocialClientBaseVO {
  13 +
  14 +}
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/vo/client/SocialClientPageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.system.controller.admin.socail.vo.client;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import io.swagger.v3.oas.annotations.media.Schema;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import lombok.ToString;
  8 +import org.springframework.format.annotation.DateTimeFormat;
  9 +
  10 +import java.time.LocalDateTime;
  11 +
  12 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  13 +
  14 +@Schema(description = "管理后台 - 社交客户端分页 Request VO")
  15 +@Data
  16 +@EqualsAndHashCode(callSuper = true)
  17 +@ToString(callSuper = true)
  18 +public class SocialClientPageReqVO extends PageParam {
  19 +
  20 + @Schema(description = "应用名", example = "yudao商城")
  21 + private String name;
  22 +
  23 + @Schema(description = "社交平台的类型", example = "31")
  24 + private Integer socialType;
  25 +
  26 + @Schema(description = "用户类型", example = "2")
  27 + private Integer userType;
  28 +
  29 + @Schema(description = "客户端编号", example = "145442115")
  30 + private String clientId;
  31 +
  32 + @Schema(description = "客户端密钥", example = "215151515154446")
  33 + private String clientSecret;
  34 +
  35 + @Schema(description = "状态", example = "1")
  36 + private Integer status;
  37 +
  38 + @Schema(description = "创建时间")
  39 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  40 + private LocalDateTime[] createTime;
  41 +
  42 +}
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/vo/client/SocialClientRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.system.controller.admin.socail.vo.client;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
  6 +import lombok.ToString;
  7 +
  8 +import java.time.LocalDateTime;
  9 +
  10 +@Schema(description = "管理后台 - 社交客户端 Response VO")
  11 +@Data
  12 +@EqualsAndHashCode(callSuper = true)
  13 +@ToString(callSuper = true)
  14 +public class SocialClientRespVO extends SocialClientBaseVO {
  15 +
  16 + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "27162")
  17 + private Long id;
  18 +
  19 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
  20 + private LocalDateTime createTime;
  21 +
  22 +}
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/vo/client/SocialClientUpdateReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.system.controller.admin.socail.vo.client;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
  6 +import lombok.ToString;
  7 +
  8 +import javax.validation.constraints.NotNull;
  9 +
  10 +@Schema(description = "管理后台 - 社交客户端更新 Request VO")
  11 +@Data
  12 +@EqualsAndHashCode(callSuper = true)
  13 +@ToString(callSuper = true)
  14 +public class SocialClientUpdateReqVO extends SocialClientBaseVO {
  15 +
  16 + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "27162")
  17 + @NotNull(message = "编号不能为空")
  18 + private Long id;
  19 +
  20 +}
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/vo/user/SocialUserBaseVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.system.controller.admin.socail.vo.user;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +
  6 +import javax.validation.constraints.NotNull;
  7 +
  8 +/**
  9 + * 社交用户 Base VO,提供给添加、修改、详细的子 VO 使用
  10 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
  11 + */
  12 +@Data
  13 +public class SocialUserBaseVO {
  14 +
  15 + @Schema(description = "社交平台的类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "30")
  16 + @NotNull(message = "社交平台的类型不能为空")
  17 + private Integer type;
  18 +
  19 + @Schema(description = "社交 openid", requiredMode = Schema.RequiredMode.REQUIRED, example = "666")
  20 + @NotNull(message = "社交 openid不能为空")
  21 + private String openid;
  22 +
  23 + @Schema(description = "社交 token", example = "666")
  24 + private String token;
  25 +
  26 + @Schema(description = "原始 Token 数据,一般是 JSON 格式", example = "{}")
  27 + private String rawTokenInfo;
  28 +
  29 + @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
  30 + @NotNull(message = "用户昵称不能为空")
  31 + private String nickname;
  32 +
  33 + @Schema(description = "用户头像", example = "https://www.iocoder.cn/xxx.png")
  34 + private String avatar;
  35 +
  36 + @Schema(description = "原始用户数据,一般是 JSON 格式", example = "{}")
  37 + private String rawUserInfo;
  38 +
  39 + @Schema(description = "最后一次的认证 code", example = "666666")
  40 + private String code;
  41 +
  42 + @Schema(description = "最后一次的认证 state", example = "123456")
  43 + private String state;
  44 +
  45 +}
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/vo/user/SocialUserPageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.system.controller.admin.socail.vo.user;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import io.swagger.v3.oas.annotations.media.Schema;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import lombok.ToString;
  8 +import org.springframework.format.annotation.DateTimeFormat;
  9 +
  10 +import java.time.LocalDateTime;
  11 +
  12 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  13 +
  14 +@Schema(description = "管理后台 - 社交用户分页 Request VO")
  15 +@Data
  16 +@EqualsAndHashCode(callSuper = true)
  17 +@ToString(callSuper = true)
  18 +public class SocialUserPageReqVO extends PageParam {
  19 +
  20 + @Schema(description = "社交平台的类型", example = "30")
  21 + private Integer type;
  22 +
  23 + @Schema(description = "用户昵称", example = "李四")
  24 + private String nickname;
  25 +
  26 + @Schema(description = "创建时间")
  27 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  28 + private LocalDateTime[] createTime;
  29 +
  30 +}
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/vo/user/SocialUserRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.system.controller.admin.socail.vo.user;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
  6 +import lombok.ToString;
  7 +
  8 +import java.time.LocalDateTime;
  9 +
  10 +@Schema(description = "管理后台 - 社交用户 Response VO")
  11 +@Data
  12 +@EqualsAndHashCode(callSuper = true)
  13 +@ToString(callSuper = true)
  14 +public class SocialUserRespVO extends SocialUserBaseVO {
  15 +
  16 + @Schema(description = "主键(自增策略)", requiredMode = Schema.RequiredMode.REQUIRED, example = "14569")
  17 + private Long id;
  18 +
  19 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
  20 + private LocalDateTime createTime;
  21 +
  22 +}
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/vo/user/SocialUserUpdateReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.system.controller.admin.socail.vo.user;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
  6 +import lombok.ToString;
  7 +
  8 +import javax.validation.constraints.NotNull;
  9 +
  10 +@Schema(description = "管理后台 - 社交用户更新 Request VO")
  11 +@Data
  12 +@EqualsAndHashCode(callSuper = true)
  13 +@ToString(callSuper = true)
  14 +public class SocialUserUpdateReqVO extends SocialUserBaseVO {
  15 +
  16 + @Schema(description = "主键(自增策略)", requiredMode = Schema.RequiredMode.REQUIRED, example = "14569")
  17 + @NotNull(message = "主键(自增策略)不能为空")
  18 + private Long id;
  19 +
  20 +}
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/social/SocialClientConvert.java
1 package cn.iocoder.yudao.module.system.convert.social; 1 package cn.iocoder.yudao.module.system.convert.social;
2 2
3 import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; 3 import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
  4 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.module.system.api.social.dto.SocialWxJsapiSignatureRespDTO; 5 import cn.iocoder.yudao.module.system.api.social.dto.SocialWxJsapiSignatureRespDTO;
5 import cn.iocoder.yudao.module.system.api.social.dto.SocialWxPhoneNumberInfoRespDTO; 6 import cn.iocoder.yudao.module.system.api.social.dto.SocialWxPhoneNumberInfoRespDTO;
  7 +import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientCreateReqVO;
  8 +import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientRespVO;
  9 +import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientUpdateReqVO;
  10 +import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialClientDO;
6 import me.chanjar.weixin.common.bean.WxJsapiSignature; 11 import me.chanjar.weixin.common.bean.WxJsapiSignature;
7 import org.mapstruct.Mapper; 12 import org.mapstruct.Mapper;
8 import org.mapstruct.factory.Mappers; 13 import org.mapstruct.factory.Mappers;
9 14
  15 +import java.util.List;
  16 +
10 @Mapper 17 @Mapper
11 public interface SocialClientConvert { 18 public interface SocialClientConvert {
12 19
@@ -16,4 +23,16 @@ public interface SocialClientConvert { @@ -16,4 +23,16 @@ public interface SocialClientConvert {
16 23
17 SocialWxPhoneNumberInfoRespDTO convert(WxMaPhoneNumberInfo bean); 24 SocialWxPhoneNumberInfoRespDTO convert(WxMaPhoneNumberInfo bean);
18 25
  26 + SocialClientDO convert(SocialClientCreateReqVO bean);
  27 +
  28 + SocialClientDO convert(SocialClientUpdateReqVO bean);
  29 +
  30 + SocialClientRespVO convert(SocialClientDO bean);
  31 +
  32 + List<SocialClientRespVO> convertList(List<SocialClientDO> list);
  33 +
  34 + PageResult<SocialClientRespVO> convertPage(PageResult<SocialClientDO> page);
  35 +
  36 +
  37 +
19 } 38 }
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/social/SocialUserConvert.java
1 package cn.iocoder.yudao.module.system.convert.social; 1 package cn.iocoder.yudao.module.system.convert.social;
2 2
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
3 import cn.iocoder.yudao.module.system.api.social.dto.SocialUserBindReqDTO; 4 import cn.iocoder.yudao.module.system.api.social.dto.SocialUserBindReqDTO;
4 import cn.iocoder.yudao.module.system.api.social.dto.SocialUserUnbindReqDTO; 5 import cn.iocoder.yudao.module.system.api.social.dto.SocialUserUnbindReqDTO;
5 import cn.iocoder.yudao.module.system.controller.admin.socail.vo.SocialUserBindReqVO; 6 import cn.iocoder.yudao.module.system.controller.admin.socail.vo.SocialUserBindReqVO;
6 import cn.iocoder.yudao.module.system.controller.admin.socail.vo.SocialUserUnbindReqVO; 7 import cn.iocoder.yudao.module.system.controller.admin.socail.vo.SocialUserUnbindReqVO;
  8 +import cn.iocoder.yudao.module.system.controller.admin.socail.vo.user.SocialUserRespVO;
  9 +import cn.iocoder.yudao.module.system.controller.admin.socail.vo.user.SocialUserUpdateReqVO;
  10 +import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialUserDO;
7 import org.mapstruct.Mapper; 11 import org.mapstruct.Mapper;
  12 +import org.mapstruct.Mapping;
8 import org.mapstruct.factory.Mappers; 13 import org.mapstruct.factory.Mappers;
9 14
  15 +import java.util.List;
  16 +
10 @Mapper 17 @Mapper
11 public interface SocialUserConvert { 18 public interface SocialUserConvert {
12 19
13 SocialUserConvert INSTANCE = Mappers.getMapper(SocialUserConvert.class); 20 SocialUserConvert INSTANCE = Mappers.getMapper(SocialUserConvert.class);
14 21
  22 + @Mapping(target = "socialType", source = "reqVO.type")
15 SocialUserBindReqDTO convert(Long userId, Integer userType, SocialUserBindReqVO reqVO); 23 SocialUserBindReqDTO convert(Long userId, Integer userType, SocialUserBindReqVO reqVO);
16 24
17 SocialUserUnbindReqDTO convert(Long userId, Integer userType, SocialUserUnbindReqVO reqVO); 25 SocialUserUnbindReqDTO convert(Long userId, Integer userType, SocialUserUnbindReqVO reqVO);
18 26
  27 + SocialUserDO convert(SocialUserUpdateReqVO bean);
  28 +
  29 + SocialUserRespVO convert(SocialUserDO bean);
  30 +
  31 + List<SocialUserRespVO> convertList(List<SocialUserDO> list);
  32 +
  33 + PageResult<SocialUserRespVO> convertPage(PageResult<SocialUserDO> page);
  34 +
19 } 35 }
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/social/SocialClientDO.java
@@ -64,5 +64,9 @@ public class SocialClientDO extends TenantBaseDO { @@ -64,5 +64,9 @@ public class SocialClientDO extends TenantBaseDO {
64 * 客户端 Secret 64 * 客户端 Secret
65 */ 65 */
66 private String clientSecret; 66 private String clientSecret;
  67 + /**
  68 + * 授权方的网页应用 ID
  69 + */
  70 + private String agentId;
67 71
68 } 72 }
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/social/SocialClientMapper.java
1 package cn.iocoder.yudao.module.system.dal.mysql.social; 1 package cn.iocoder.yudao.module.system.dal.mysql.social;
2 2
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
3 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  6 +import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientPageReqVO;
4 import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialClientDO; 7 import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialClientDO;
5 import org.apache.ibatis.annotations.Mapper; 8 import org.apache.ibatis.annotations.Mapper;
6 9
@@ -12,4 +15,16 @@ public interface SocialClientMapper extends BaseMapperX&lt;SocialClientDO&gt; { @@ -12,4 +15,16 @@ public interface SocialClientMapper extends BaseMapperX&lt;SocialClientDO&gt; {
12 SocialClientDO::getUserType, userType); 15 SocialClientDO::getUserType, userType);
13 } 16 }
14 17
  18 + default PageResult<SocialClientDO> selectPage(SocialClientPageReqVO reqVO) {
  19 + return selectPage(reqVO, new LambdaQueryWrapperX<SocialClientDO>()
  20 + .likeIfPresent(SocialClientDO::getName, reqVO.getName())
  21 + .eqIfPresent(SocialClientDO::getSocialType, reqVO.getSocialType())
  22 + .eqIfPresent(SocialClientDO::getUserType, reqVO.getUserType())
  23 + .eqIfPresent(SocialClientDO::getClientId, reqVO.getClientId())
  24 + .eqIfPresent(SocialClientDO::getClientSecret, reqVO.getClientSecret())
  25 + .eqIfPresent(SocialClientDO::getStatus, reqVO.getStatus())
  26 + .betweenIfPresent(SocialClientDO::getCreateTime, reqVO.getCreateTime())
  27 + .orderByDesc(SocialClientDO::getId));
  28 + }
  29 +
15 } 30 }
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/social/SocialUserMapper.java
1 package cn.iocoder.yudao.module.system.dal.mysql.social; 1 package cn.iocoder.yudao.module.system.dal.mysql.social;
2 2
3 -import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialUserDO; 3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  6 +import cn.iocoder.yudao.module.system.controller.admin.socail.vo.user.SocialUserPageReqVO;
  7 +import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialUserDO;
5 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 8 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
6 -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;  
7 import org.apache.ibatis.annotations.Mapper; 9 import org.apache.ibatis.annotations.Mapper;
8 10
9 -import java.util.Collection;  
10 -import java.util.List;  
11 -  
12 @Mapper 11 @Mapper
13 public interface SocialUserMapper extends BaseMapperX<SocialUserDO> { 12 public interface SocialUserMapper extends BaseMapperX<SocialUserDO> {
14 13
@@ -25,4 +24,12 @@ public interface SocialUserMapper extends BaseMapperX&lt;SocialUserDO&gt; { @@ -25,4 +24,12 @@ public interface SocialUserMapper extends BaseMapperX&lt;SocialUserDO&gt; {
25 .eq(SocialUserDO::getOpenid, openid)); 24 .eq(SocialUserDO::getOpenid, openid));
26 } 25 }
27 26
  27 + default PageResult<SocialUserDO> selectPage(SocialUserPageReqVO reqVO) {
  28 + return selectPage(reqVO, new LambdaQueryWrapperX<SocialUserDO>()
  29 + .eqIfPresent(SocialUserDO::getType, reqVO.getType())
  30 + .likeIfPresent(SocialUserDO::getNickname, reqVO.getNickname())
  31 + .betweenIfPresent(SocialUserDO::getCreateTime, reqVO.getCreateTime())
  32 + .orderByDesc(SocialUserDO::getId));
  33 + }
  34 +
28 } 35 }
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientService.java
1 package cn.iocoder.yudao.module.system.service.social; 1 package cn.iocoder.yudao.module.system.service.social;
2 2
3 import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; 3 import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
  4 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  5 +import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientCreateReqVO;
  6 +import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientPageReqVO;
  7 +import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientUpdateReqVO;
  8 +import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialClientDO;
4 import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; 9 import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum;
5 import com.xingyuv.jushauth.model.AuthUser; 10 import com.xingyuv.jushauth.model.AuthUser;
6 import me.chanjar.weixin.common.bean.WxJsapiSignature; 11 import me.chanjar.weixin.common.bean.WxJsapiSignature;
7 12
  13 +import javax.validation.Valid;
  14 +import java.util.Collection;
  15 +import java.util.List;
  16 +
8 /** 17 /**
9 * 社交应用 Service 接口 18 * 社交应用 Service 接口
10 * 19 *
@@ -55,4 +64,52 @@ public interface SocialClientService { @@ -55,4 +64,52 @@ public interface SocialClientService {
55 */ 64 */
56 WxMaPhoneNumberInfo getWxMaPhoneNumberInfo(Integer userType, String phoneCode); 65 WxMaPhoneNumberInfo getWxMaPhoneNumberInfo(Integer userType, String phoneCode);
57 66
  67 + // =================== 客户端管理 ===================
  68 +
  69 + /**
  70 + * 创建社交客户端
  71 + *
  72 + * @param createReqVO 创建信息
  73 + * @return 编号
  74 + */
  75 + Long createSocialClient(@Valid SocialClientCreateReqVO createReqVO);
  76 +
  77 + /**
  78 + * 更新社交客户端
  79 + *
  80 + * @param updateReqVO 更新信息
  81 + */
  82 + void updateSocialClient(@Valid SocialClientUpdateReqVO updateReqVO);
  83 +
  84 + /**
  85 + * 删除社交客户端
  86 + *
  87 + * @param id 编号
  88 + */
  89 + void deleteSocialClient(Long id);
  90 +
  91 + /**
  92 + * 获得社交客户端
  93 + *
  94 + * @param id 编号
  95 + * @return 社交客户端
  96 + */
  97 + SocialClientDO getSocialClient(Long id);
  98 +
  99 + /**
  100 + * 获得社交客户端列表
  101 + *
  102 + * @param ids 编号
  103 + * @return 社交客户端列表
  104 + */
  105 + List<SocialClientDO> getSocialClientList(Collection<Long> ids);
  106 +
  107 + /**
  108 + * 获得社交客户端分页
  109 + *
  110 + * @param pageReqVO 分页查询
  111 + * @return 社交客户端分页
  112 + */
  113 + PageResult<SocialClientDO> getSocialClientPage(SocialClientPageReqVO pageReqVO);
  114 +
58 } 115 }
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java
@@ -5,12 +5,19 @@ import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl; @@ -5,12 +5,19 @@ import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
5 import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; 5 import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
6 import cn.binarywang.wx.miniapp.config.impl.WxMaRedisBetterConfigImpl; 6 import cn.binarywang.wx.miniapp.config.impl.WxMaRedisBetterConfigImpl;
7 import cn.hutool.core.bean.BeanUtil; 7 import cn.hutool.core.bean.BeanUtil;
  8 +import cn.hutool.core.collection.CollUtil;
  9 +import cn.hutool.core.collection.ListUtil;
8 import cn.hutool.core.lang.Assert; 10 import cn.hutool.core.lang.Assert;
9 import cn.hutool.core.util.ReflectUtil; 11 import cn.hutool.core.util.ReflectUtil;
10 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; 12 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  13 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
11 import cn.iocoder.yudao.framework.common.util.cache.CacheUtils; 14 import cn.iocoder.yudao.framework.common.util.cache.CacheUtils;
12 import cn.iocoder.yudao.framework.common.util.http.HttpUtils; 15 import cn.iocoder.yudao.framework.common.util.http.HttpUtils;
13 import cn.iocoder.yudao.framework.social.core.YudaoAuthRequestFactory; 16 import cn.iocoder.yudao.framework.social.core.YudaoAuthRequestFactory;
  17 +import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientCreateReqVO;
  18 +import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientPageReqVO;
  19 +import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientUpdateReqVO;
  20 +import cn.iocoder.yudao.module.system.convert.social.SocialClientConvert;
14 import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialClientDO; 21 import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialClientDO;
15 import cn.iocoder.yudao.module.system.dal.mysql.social.SocialClientMapper; 22 import cn.iocoder.yudao.module.system.dal.mysql.social.SocialClientMapper;
16 import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; 23 import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum;
@@ -37,12 +44,13 @@ import org.springframework.stereotype.Service; @@ -37,12 +44,13 @@ import org.springframework.stereotype.Service;
37 44
38 import javax.annotation.Resource; 45 import javax.annotation.Resource;
39 import java.time.Duration; 46 import java.time.Duration;
  47 +import java.util.Collection;
  48 +import java.util.List;
40 import java.util.Objects; 49 import java.util.Objects;
41 50
42 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 51 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
43 import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString; 52 import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString;
44 -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.SOCIAL_APP_WEIXIN_MINI_APP_PHONE_CODE_ERROR;  
45 -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.SOCIAL_USER_AUTH_FAILURE; 53 +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
46 54
47 /** 55 /**
48 * 社交应用 Service 实现类 56 * 社交应用 Service 实现类
@@ -151,6 +159,9 @@ public class SocialClientServiceImpl implements SocialClientService { @@ -151,6 +159,9 @@ public class SocialClientServiceImpl implements SocialClientService {
151 // 2.2 修改对应的 clientId + clientSecret 密钥 159 // 2.2 修改对应的 clientId + clientSecret 密钥
152 newAuthConfig.setClientId(client.getClientId()); 160 newAuthConfig.setClientId(client.getClientId());
153 newAuthConfig.setClientSecret(client.getClientSecret()); 161 newAuthConfig.setClientSecret(client.getClientSecret());
  162 + if (client.getAgentId() != null) { // 如果有 agentId 则修改 agentId
  163 + newAuthConfig.setAgentId(client.getAgentId());
  164 + }
154 // 2.3 设置会 request 里,进行后续使用 165 // 2.3 设置会 request 里,进行后续使用
155 ReflectUtil.setFieldValue(request, "config", newAuthConfig); 166 ReflectUtil.setFieldValue(request, "config", newAuthConfig);
156 } 167 }
@@ -255,4 +266,56 @@ public class SocialClientServiceImpl implements SocialClientService { @@ -255,4 +266,56 @@ public class SocialClientServiceImpl implements SocialClientService {
255 return service; 266 return service;
256 } 267 }
257 268
  269 + // =================== 客户端管理 ===================
  270 +
  271 + @Override
  272 + public Long createSocialClient(SocialClientCreateReqVO createReqVO) {
  273 + // 插入
  274 + SocialClientDO socialClient = SocialClientConvert.INSTANCE.convert(createReqVO);
  275 + socialClientMapper.insert(socialClient);
  276 + // 返回
  277 + return socialClient.getId();
  278 + }
  279 +
  280 + @Override
  281 + public void updateSocialClient(SocialClientUpdateReqVO updateReqVO) {
  282 + // 校验存在
  283 + validateSocialClientExists(updateReqVO.getId());
  284 + // 更新
  285 + SocialClientDO updateObj = SocialClientConvert.INSTANCE.convert(updateReqVO);
  286 + socialClientMapper.updateById(updateObj);
  287 + }
  288 +
  289 + @Override
  290 + public void deleteSocialClient(Long id) {
  291 + // 校验存在
  292 + validateSocialClientExists(id);
  293 + // 删除
  294 + socialClientMapper.deleteById(id);
  295 + }
  296 +
  297 + private void validateSocialClientExists(Long id) {
  298 + if (socialClientMapper.selectById(id) == null) {
  299 + throw exception(SOCIAL_CLIENT_NOT_EXISTS);
  300 + }
  301 + }
  302 +
  303 + @Override
  304 + public SocialClientDO getSocialClient(Long id) {
  305 + return socialClientMapper.selectById(id);
  306 + }
  307 +
  308 + @Override
  309 + public List<SocialClientDO> getSocialClientList(Collection<Long> ids) {
  310 + if (CollUtil.isEmpty(ids)) {
  311 + return ListUtil.empty();
  312 + }
  313 + return socialClientMapper.selectBatchIds(ids);
  314 + }
  315 +
  316 + @Override
  317 + public PageResult<SocialClientDO> getSocialClientPage(SocialClientPageReqVO pageReqVO) {
  318 + return socialClientMapper.selectPage(pageReqVO);
  319 + }
  320 +
258 } 321 }
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialUserService.java
1 package cn.iocoder.yudao.module.system.service.social; 1 package cn.iocoder.yudao.module.system.service.social;
2 2
3 import cn.iocoder.yudao.framework.common.exception.ServiceException; 3 import cn.iocoder.yudao.framework.common.exception.ServiceException;
  4 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.module.system.api.social.dto.SocialUserBindReqDTO; 5 import cn.iocoder.yudao.module.system.api.social.dto.SocialUserBindReqDTO;
5 import cn.iocoder.yudao.module.system.api.social.dto.SocialUserRespDTO; 6 import cn.iocoder.yudao.module.system.api.social.dto.SocialUserRespDTO;
  7 +import cn.iocoder.yudao.module.system.controller.admin.socail.vo.user.SocialUserPageReqVO;
  8 +import cn.iocoder.yudao.module.system.controller.admin.socail.vo.user.SocialUserUpdateReqVO;
6 import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialUserDO; 9 import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialUserDO;
7 import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; 10 import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum;
8 11
9 import javax.validation.Valid; 12 import javax.validation.Valid;
  13 +import java.util.Collection;
10 import java.util.List; 14 import java.util.List;
11 15
12 /** 16 /**
@@ -19,7 +23,7 @@ public interface SocialUserService { @@ -19,7 +23,7 @@ public interface SocialUserService {
19 /** 23 /**
20 * 获得指定用户的社交用户列表 24 * 获得指定用户的社交用户列表
21 * 25 *
22 - * @param userId 用户编号 26 + * @param userId 用户编号
23 * @param userType 用户类型 27 * @param userType 用户类型
24 * @return 社交用户列表 28 * @return 社交用户列表
25 */ 29 */
@@ -36,10 +40,10 @@ public interface SocialUserService { @@ -36,10 +40,10 @@ public interface SocialUserService {
36 /** 40 /**
37 * 取消绑定社交用户 41 * 取消绑定社交用户
38 * 42 *
39 - * @param userId 用户编号 43 + * @param userId 用户编号
40 * @param userType 全局用户类型 44 * @param userType 全局用户类型
41 - * @param type 社交平台的类型 {@link SocialTypeEnum}  
42 - * @param openid 社交平台的 openid 45 + * @param type 社交平台的类型 {@link SocialTypeEnum}
  46 + * @param openid 社交平台的 openid
43 */ 47 */
44 void unbindSocialUser(Long userId, Integer userType, Integer type, String openid); 48 void unbindSocialUser(Long userId, Integer userType, Integer type, String openid);
45 49
@@ -49,11 +53,51 @@ public interface SocialUserService { @@ -49,11 +53,51 @@ public interface SocialUserService {
49 * 在认证信息不正确的情况下,也会抛出 {@link ServiceException} 业务异常 53 * 在认证信息不正确的情况下,也会抛出 {@link ServiceException} 业务异常
50 * 54 *
51 * @param userType 用户类型 55 * @param userType 用户类型
52 - * @param type 社交平台的类型  
53 - * @param code 授权码  
54 - * @param state state 56 + * @param type 社交平台的类型
  57 + * @param code 授权码
  58 + * @param state state
55 * @return 社交用户 59 * @return 社交用户
56 */ 60 */
57 SocialUserRespDTO getSocialUser(Integer userType, Integer type, String code, String state); 61 SocialUserRespDTO getSocialUser(Integer userType, Integer type, String code, String state);
58 62
  63 + // ==================== 社交用户 CRUD ====================
  64 +
  65 + /**
  66 + * 更新社交用户
  67 + *
  68 + * @param updateReqVO 更新信息
  69 + */
  70 + void updateSocialUser(@Valid SocialUserUpdateReqVO updateReqVO);
  71 +
  72 + /**
  73 + * 删除社交用户
  74 + *
  75 + * @param id 编号
  76 + */
  77 + void deleteSocialUser(Long id);
  78 +
  79 + /**
  80 + * 获得社交用户
  81 + *
  82 + * @param id 编号
  83 + * @return 社交用户
  84 + */
  85 + SocialUserDO getSocialUser(Long id);
  86 +
  87 + /**
  88 + * 获得社交用户列表
  89 + *
  90 + * @param ids 编号
  91 + * @return 社交用户列表
  92 + */
  93 + List<SocialUserDO> getSocialUserList(Collection<Long> ids);
  94 +
  95 + /**
  96 + * 获得社交用户分页
  97 + *
  98 + * @param pageReqVO 分页查询
  99 + * @return 社交用户分页
  100 + */
  101 + PageResult<SocialUserDO> getSocialUserPage(SocialUserPageReqVO pageReqVO);
  102 +
59 } 103 }
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialUserServiceImpl.java
1 package cn.iocoder.yudao.module.system.service.social; 1 package cn.iocoder.yudao.module.system.service.social;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.collection.ListUtil;
4 import cn.hutool.core.lang.Assert; 5 import cn.hutool.core.lang.Assert;
5 import cn.iocoder.yudao.framework.common.exception.ServiceException; 6 import cn.iocoder.yudao.framework.common.exception.ServiceException;
  7 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 import cn.iocoder.yudao.module.system.api.social.dto.SocialUserBindReqDTO; 8 import cn.iocoder.yudao.module.system.api.social.dto.SocialUserBindReqDTO;
7 import cn.iocoder.yudao.module.system.api.social.dto.SocialUserRespDTO; 9 import cn.iocoder.yudao.module.system.api.social.dto.SocialUserRespDTO;
  10 +import cn.iocoder.yudao.module.system.controller.admin.socail.vo.user.SocialUserPageReqVO;
  11 +import cn.iocoder.yudao.module.system.controller.admin.socail.vo.user.SocialUserUpdateReqVO;
  12 +import cn.iocoder.yudao.module.system.convert.social.SocialUserConvert;
8 import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialUserBindDO; 13 import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialUserBindDO;
9 import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialUserDO; 14 import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialUserDO;
10 import cn.iocoder.yudao.module.system.dal.mysql.social.SocialUserBindMapper; 15 import cn.iocoder.yudao.module.system.dal.mysql.social.SocialUserBindMapper;
@@ -18,14 +23,14 @@ import org.springframework.validation.annotation.Validated; @@ -18,14 +23,14 @@ import org.springframework.validation.annotation.Validated;
18 23
19 import javax.annotation.Resource; 24 import javax.annotation.Resource;
20 import javax.validation.constraints.NotNull; 25 import javax.validation.constraints.NotNull;
  26 +import java.util.Collection;
21 import java.util.Collections; 27 import java.util.Collections;
22 import java.util.List; 28 import java.util.List;
23 29
24 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 30 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
25 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; 31 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
26 import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString; 32 import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString;
27 -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.AUTH_THIRD_LOGIN_NOT_BIND;  
28 -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.SOCIAL_USER_NOT_FOUND; 33 +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
29 34
30 /** 35 /**
31 * 社交用户 Service 实现类 36 * 社交用户 Service 实现类
@@ -113,8 +118,8 @@ public class SocialUserServiceImpl implements SocialUserService { @@ -113,8 +118,8 @@ public class SocialUserServiceImpl implements SocialUserService {
113 * 118 *
114 * @param socialType 社交平台的类型 {@link SocialTypeEnum} 119 * @param socialType 社交平台的类型 {@link SocialTypeEnum}
115 * @param userType 用户类型 120 * @param userType 用户类型
116 - * @param code 授权码  
117 - * @param state state 121 + * @param code 授权码
  122 + * @param state state
118 * @return 授权用户 123 * @return 授权用户
119 */ 124 */
120 @NotNull 125 @NotNull
@@ -146,4 +151,47 @@ public class SocialUserServiceImpl implements SocialUserService { @@ -146,4 +151,47 @@ public class SocialUserServiceImpl implements SocialUserService {
146 return socialUser; 151 return socialUser;
147 } 152 }
148 153
  154 + // ==================== 社交用户 CRUD ====================
  155 +
  156 + @Override
  157 + public void updateSocialUser(SocialUserUpdateReqVO updateReqVO) {
  158 + // 校验存在
  159 + validateSocialUserExists(updateReqVO.getId());
  160 + // 更新
  161 + SocialUserDO updateObj = SocialUserConvert.INSTANCE.convert(updateReqVO);
  162 + socialUserMapper.updateById(updateObj);
  163 + }
  164 +
  165 + @Override
  166 + public void deleteSocialUser(Long id) {
  167 + // 校验存在
  168 + validateSocialUserExists(id);
  169 + // 删除
  170 + socialUserMapper.deleteById(id);
  171 + }
  172 +
  173 + private void validateSocialUserExists(Long id) {
  174 + if (socialUserMapper.selectById(id) == null) {
  175 + throw exception(SOCIAL_USER_NOT_EXISTS);
  176 + }
  177 + }
  178 +
  179 + @Override
  180 + public SocialUserDO getSocialUser(Long id) {
  181 + return socialUserMapper.selectById(id);
  182 + }
  183 +
  184 + @Override
  185 + public List<SocialUserDO> getSocialUserList(Collection<Long> ids) {
  186 + if (CollUtil.isEmpty(ids)) {
  187 + return ListUtil.empty();
  188 + }
  189 + return socialUserMapper.selectBatchIds(ids);
  190 + }
  191 +
  192 + @Override
  193 + public PageResult<SocialUserDO> getSocialUserPage(SocialUserPageReqVO pageReqVO) {
  194 + return socialUserMapper.selectPage(pageReqVO);
  195 + }
  196 +
149 } 197 }
yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImplTest.java 0 → 100644
  1 +package cn.iocoder.yudao.module.system.service.social;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
  5 +import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientCreateReqVO;
  6 +import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientPageReqVO;
  7 +import cn.iocoder.yudao.module.system.controller.admin.socail.vo.client.SocialClientUpdateReqVO;
  8 +import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialClientDO;
  9 +import cn.iocoder.yudao.module.system.dal.mysql.social.SocialClientMapper;
  10 +import org.junit.jupiter.api.Disabled;
  11 +import org.junit.jupiter.api.Test;
  12 +import org.springframework.context.annotation.Import;
  13 +
  14 +import javax.annotation.Resource;
  15 +
  16 +import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime;
  17 +import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
  18 +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
  19 +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
  20 +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId;
  21 +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
  22 +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.SOCIAL_CLIENT_NOT_EXISTS;
  23 +import static org.junit.jupiter.api.Assertions.*;
  24 +
  25 +/**
  26 + * {@link SocialClientServiceImpl} 的单元测试类
  27 + *
  28 + * @author 芋道源码
  29 + */
  30 +@Import(SocialClientServiceImpl.class)
  31 +public class SocialClientServiceImplTest extends BaseDbUnitTest {
  32 +
  33 + @Resource
  34 + private SocialClientServiceImpl socialClientService;
  35 +
  36 + @Resource
  37 + private SocialClientMapper socialClientMapper;
  38 +
  39 + @Test
  40 + public void testCreateSocialClient_success() {
  41 + // 准备参数
  42 + SocialClientCreateReqVO reqVO = randomPojo(SocialClientCreateReqVO.class);
  43 +
  44 + // 调用
  45 + Long socialClientId = socialClientService.createSocialClient(reqVO);
  46 + // 断言
  47 + assertNotNull(socialClientId);
  48 + // 校验记录的属性是否正确
  49 + SocialClientDO socialClient = socialClientMapper.selectById(socialClientId);
  50 + assertPojoEquals(reqVO, socialClient);
  51 + }
  52 +
  53 + @Test
  54 + public void testUpdateSocialClient_success() {
  55 + // mock 数据
  56 + SocialClientDO dbSocialClient = randomPojo(SocialClientDO.class);
  57 + socialClientMapper.insert(dbSocialClient);// @Sql: 先插入出一条存在的数据
  58 + // 准备参数
  59 + SocialClientUpdateReqVO reqVO = randomPojo(SocialClientUpdateReqVO.class, o -> {
  60 + o.setId(dbSocialClient.getId()); // 设置更新的 ID
  61 + });
  62 +
  63 + // 调用
  64 + socialClientService.updateSocialClient(reqVO);
  65 + // 校验是否更新正确
  66 + SocialClientDO socialClient = socialClientMapper.selectById(reqVO.getId()); // 获取最新的
  67 + assertPojoEquals(reqVO, socialClient);
  68 + }
  69 +
  70 + @Test
  71 + public void testUpdateSocialClient_notExists() {
  72 + // 准备参数
  73 + SocialClientUpdateReqVO reqVO = randomPojo(SocialClientUpdateReqVO.class);
  74 +
  75 + // 调用, 并断言异常
  76 + assertServiceException(() -> socialClientService.updateSocialClient(reqVO), SOCIAL_CLIENT_NOT_EXISTS);
  77 + }
  78 +
  79 + @Test
  80 + public void testDeleteSocialClient_success() {
  81 + // mock 数据
  82 + SocialClientDO dbSocialClient = randomPojo(SocialClientDO.class);
  83 + socialClientMapper.insert(dbSocialClient);// @Sql: 先插入出一条存在的数据
  84 + // 准备参数
  85 + Long id = dbSocialClient.getId();
  86 +
  87 + // 调用
  88 + socialClientService.deleteSocialClient(id);
  89 + // 校验数据不存在了
  90 + assertNull(socialClientMapper.selectById(id));
  91 + }
  92 +
  93 + @Test
  94 + public void testDeleteSocialClient_notExists() {
  95 + // 准备参数
  96 + Long id = randomLongId();
  97 +
  98 + // 调用, 并断言异常
  99 + assertServiceException(() -> socialClientService.deleteSocialClient(id), SOCIAL_CLIENT_NOT_EXISTS);
  100 + }
  101 +
  102 + @Test
  103 + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
  104 + public void testGetSocialClientPage() {
  105 + // mock 数据
  106 + SocialClientDO dbSocialClient = randomPojo(SocialClientDO.class, o -> { // 等会查询到
  107 + o.setName(null);
  108 + o.setSocialType(null);
  109 + o.setUserType(null);
  110 + o.setClientId(null);
  111 + o.setClientSecret(null);
  112 + o.setStatus(null);
  113 + o.setCreateTime(null);
  114 + });
  115 + socialClientMapper.insert(dbSocialClient);
  116 + // 测试 name 不匹配
  117 + socialClientMapper.insert(cloneIgnoreId(dbSocialClient, o -> o.setName(null)));
  118 + // 测试 socialType 不匹配
  119 + socialClientMapper.insert(cloneIgnoreId(dbSocialClient, o -> o.setSocialType(null)));
  120 + // 测试 userType 不匹配
  121 + socialClientMapper.insert(cloneIgnoreId(dbSocialClient, o -> o.setUserType(null)));
  122 + // 测试 clientId 不匹配
  123 + socialClientMapper.insert(cloneIgnoreId(dbSocialClient, o -> o.setClientId(null)));
  124 + // 测试 clientSecret 不匹配
  125 + socialClientMapper.insert(cloneIgnoreId(dbSocialClient, o -> o.setClientSecret(null)));
  126 + // 测试 status 不匹配
  127 + socialClientMapper.insert(cloneIgnoreId(dbSocialClient, o -> o.setStatus(null)));
  128 + // 测试 createTime 不匹配
  129 + socialClientMapper.insert(cloneIgnoreId(dbSocialClient, o -> o.setCreateTime(null)));
  130 + // 准备参数
  131 + SocialClientPageReqVO reqVO = new SocialClientPageReqVO();
  132 + reqVO.setName(null);
  133 + reqVO.setSocialType(null);
  134 + reqVO.setUserType(null);
  135 + reqVO.setClientId(null);
  136 + reqVO.setClientSecret(null);
  137 + reqVO.setStatus(null);
  138 + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
  139 +
  140 + // 调用
  141 + PageResult<SocialClientDO> pageResult = socialClientService.getSocialClientPage(reqVO);
  142 + // 断言
  143 + assertEquals(1, pageResult.getTotal());
  144 + assertEquals(1, pageResult.getList().size());
  145 + assertPojoEquals(dbSocialClient, pageResult.getList().get(0));
  146 + }
  147 +
  148 +}
yudao-module-system/yudao-module-system-biz/src/test/resources/sql/clean.sql
@@ -17,6 +17,7 @@ DELETE FROM &quot;system_sms_template&quot;; @@ -17,6 +17,7 @@ DELETE FROM &quot;system_sms_template&quot;;
17 DELETE FROM "system_sms_log"; 17 DELETE FROM "system_sms_log";
18 DELETE FROM "system_sms_code"; 18 DELETE FROM "system_sms_code";
19 DELETE FROM "system_error_code"; 19 DELETE FROM "system_error_code";
  20 +DELETE FROM "system_social_client";
20 DELETE FROM "system_social_user"; 21 DELETE FROM "system_social_user";
21 DELETE FROM "system_social_user_bind"; 22 DELETE FROM "system_social_user_bind";
22 DELETE FROM "system_tenant"; 23 DELETE FROM "system_tenant";
yudao-module-system/yudao-module-system-biz/src/test/resources/sql/create_tables.sql
@@ -354,8 +354,25 @@ CREATE TABLE IF NOT EXISTS &quot;system_error_code&quot; ( @@ -354,8 +354,25 @@ CREATE TABLE IF NOT EXISTS &quot;system_error_code&quot; (
354 PRIMARY KEY ("id") 354 PRIMARY KEY ("id")
355 ) COMMENT '错误码表'; 355 ) COMMENT '错误码表';
356 356
  357 +CREATE TABLE IF NOT EXISTS "system_social_client" (
  358 + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
  359 + "name" varchar(255) NOT NULL,
  360 + "social_type" int NOT NULL,
  361 + "user_type" int NOT NULL,
  362 + "client_id" varchar(255) NOT NULL,
  363 + "client_secret" varchar(255) NOT NULL,
  364 + "status" int NOT NULL,
  365 + "creator" varchar(64) DEFAULT '',
  366 + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  367 + "updater" varchar(64) DEFAULT '',
  368 + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  369 + "deleted" bit NOT NULL DEFAULT FALSE,
  370 + "tenant_id" bigint NOT NULL,
  371 + PRIMARY KEY ("id")
  372 +) COMMENT '社交客户端表';
  373 +
357 CREATE TABLE IF NOT EXISTS "system_social_user" ( 374 CREATE TABLE IF NOT EXISTS "system_social_user" (
358 - "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, 375 + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
359 "type" tinyint NOT NULL, 376 "type" tinyint NOT NULL,
360 "openid" varchar(64) NOT NULL, 377 "openid" varchar(64) NOT NULL,
361 "token" varchar(256) DEFAULT NULL, 378 "token" varchar(256) DEFAULT NULL,
@@ -374,7 +391,7 @@ CREATE TABLE IF NOT EXISTS &quot;system_social_user&quot; ( @@ -374,7 +391,7 @@ CREATE TABLE IF NOT EXISTS &quot;system_social_user&quot; (
374 ) COMMENT '社交用户'; 391 ) COMMENT '社交用户';
375 392
376 CREATE TABLE IF NOT EXISTS "system_social_user_bind" ( 393 CREATE TABLE IF NOT EXISTS "system_social_user_bind" (
377 - "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, 394 + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
378 "user_id" bigint NOT NULL, 395 "user_id" bigint NOT NULL,
379 "user_type" tinyint NOT NULL, 396 "user_type" tinyint NOT NULL,
380 "social_type" tinyint NOT NULL, 397 "social_type" tinyint NOT NULL,