From 0bf618ca34814ee535c5d39387dc63532b4e726a Mon Sep 17 00:00:00 2001 From: jiangqs <jiangqs> Date: 星期四, 04 五月 2023 16:16:39 +0800 Subject: [PATCH] Merge branch 'master' of ssh://sinata.cn:20202/java/HongRuiTang into master --- ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/member/MemberService.java | 1 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/QwUserDetailDto.java | 14 ruoyi-auth/src/main/java/com/ruoyi/auth/config/QywxInnerConfig.java | 442 ++++++++++++++++++++++ ruoyi-auth/src/main/java/com/ruoyi/auth/utils/RestUtils.java | 104 +++++ ruoyi-modules/ruoyi-job/pom.xml | 25 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/sys/SysUserController.java | 30 + ruoyi-auth/src/main/java/com/ruoyi/auth/controller/QwH5Controller.java | 69 +++ ruoyi-auth/src/main/java/com/ruoyi/auth/service/QywxInnerService.java | 99 ++++ ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/sys/ISysUserService.java | 56 +- ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteUserFallbackFactory.java | 11 ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/SwaggerProvider.java | 6 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteMemberService.java | 1 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/QwH5LoginVo.java | 18 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/Constants.java | 23 + ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/sys/SysUserMapper.java | 32 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/sys/SysUserServiceImpl.java | 72 ++- ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/OauthUrlVo.java | 18 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteUserService.java | 13 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteMemberFallbackFactory.java | 3 ruoyi-auth/src/main/java/com/ruoyi/auth/RuoYiAuthApplication.java | 6 ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java | 44 + ruoyi-auth/pom.xml | 37 + ruoyi-auth/src/main/resources/bootstrap.yml | 14 ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java | 39 + ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/OauthUserVo.java | 20 + 25 files changed, 1,081 insertions(+), 116 deletions(-) diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteMemberService.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteMemberService.java index f1af963..40c9726 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteMemberService.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteMemberService.java @@ -8,6 +8,7 @@ import com.ruoyi.system.api.factory.RemoteUserFallbackFactory; import com.ruoyi.system.api.model.AppMiniLoginDto; import com.ruoyi.system.api.model.AppMiniLoginVo; +import com.ruoyi.system.api.model.QwUserDetailDto; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteUserService.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteUserService.java index 369625c..d1365f3 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteUserService.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteUserService.java @@ -2,8 +2,7 @@ import com.ruoyi.system.api.domain.dto.AppEditUserDto; import com.ruoyi.system.api.domain.poji.config.SysTag; -import com.ruoyi.system.api.model.AppMiniLoginDto; -import com.ruoyi.system.api.model.AppMiniLoginVo; +import com.ruoyi.system.api.model.*; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -15,11 +14,10 @@ import com.ruoyi.common.core.domain.R; import com.ruoyi.system.api.domain.poji.sys.SysUser; import com.ruoyi.system.api.factory.RemoteUserFallbackFactory; -import com.ruoyi.system.api.model.LoginUser; /** * 用户服务 - * + * * @author jqs */ @FeignClient(contextId = "remoteUserService", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteUserFallbackFactory.class) @@ -46,6 +44,13 @@ public R<Boolean> registerUserInfo(@RequestBody SysUser sysUser, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); + /** + * 企业微信H5登录 + * @param qwUserDetail + * @return + */ + @PostMapping("/user/qwH5Login") + public R<QwH5LoginVo> qwH5Login(@RequestBody QwUserDetailDto qwUserDetail); /** diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteMemberFallbackFactory.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteMemberFallbackFactory.java index e0eb4e0..9bdd3de 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteMemberFallbackFactory.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteMemberFallbackFactory.java @@ -10,6 +10,7 @@ import com.ruoyi.system.api.model.AppMiniLoginDto; import com.ruoyi.system.api.model.AppMiniLoginVo; import com.ruoyi.system.api.model.LoginUser; +import com.ruoyi.system.api.model.QwUserDetailDto; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.openfeign.FallbackFactory; @@ -20,7 +21,7 @@ /** * 会员服务 - * + * * @author jqs */ @Component diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteUserFallbackFactory.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteUserFallbackFactory.java index 4cf7aa6..e4261e1 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteUserFallbackFactory.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteUserFallbackFactory.java @@ -2,8 +2,7 @@ import com.ruoyi.system.api.domain.dto.AppEditUserDto; import com.ruoyi.system.api.domain.poji.config.SysTag; -import com.ruoyi.system.api.model.AppMiniLoginDto; -import com.ruoyi.system.api.model.AppMiniLoginVo; +import com.ruoyi.system.api.model.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.openfeign.FallbackFactory; @@ -11,11 +10,10 @@ import com.ruoyi.common.core.domain.R; import com.ruoyi.system.api.RemoteUserService; import com.ruoyi.system.api.domain.poji.sys.SysUser; -import com.ruoyi.system.api.model.LoginUser; /** * 用户服务 - * + * * @author jqs */ @Component @@ -42,6 +40,11 @@ } @Override + public R<QwH5LoginVo> qwH5Login(QwUserDetailDto qwUserDetail) { + return R.fail("用户登录:" + throwable.getMessage()); + } + + @Override public R<SysUser> getSysUser(Long userId) { return R.fail("获取用户失败:" + throwable.getMessage()); } diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/OauthUrlVo.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/OauthUrlVo.java new file mode 100644 index 0000000..4a785cc --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/OauthUrlVo.java @@ -0,0 +1,18 @@ +package com.ruoyi.system.api.model; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class OauthUrlVo { + + @ApiModelProperty("企业微信网页授权链接") + private String oauthUrl; + + public OauthUrlVo(String oauthUrl) { + this.oauthUrl = oauthUrl; + } + + public OauthUrlVo() { + } +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/OauthUserVo.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/OauthUserVo.java new file mode 100644 index 0000000..7e26e9d --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/OauthUserVo.java @@ -0,0 +1,20 @@ +package com.ruoyi.system.api.model; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class OauthUserVo { + + @ApiModelProperty("成员UserID") + private String userid; + + @ApiModelProperty("手机") + private String mobile; + + @ApiModelProperty("token凭证") + private String accessToken; + + @ApiModelProperty("过期时间") + private Long expiresIn; +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/QwH5LoginVo.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/QwH5LoginVo.java new file mode 100644 index 0000000..3037ea6 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/QwH5LoginVo.java @@ -0,0 +1,18 @@ +package com.ruoyi.system.api.model; + +import com.ruoyi.system.api.domain.poji.sys.SysUser; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class QwH5LoginVo { + + @ApiModelProperty("成员UserID") + private String userid; + + @ApiModelProperty("手机") + private String mobile; + + @ApiModelProperty(value = "用户信息") + private SysUser sysUser; +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/QwUserDetailDto.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/QwUserDetailDto.java new file mode 100644 index 0000000..bef1220 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/QwUserDetailDto.java @@ -0,0 +1,14 @@ +package com.ruoyi.system.api.model; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class QwUserDetailDto { + + @ApiModelProperty("成员UserID") + private String userid; + + @ApiModelProperty("手机") + private String mobile; +} diff --git a/ruoyi-auth/pom.xml b/ruoyi-auth/pom.xml index a71af1b..d937912 100644 --- a/ruoyi-auth/pom.xml +++ b/ruoyi-auth/pom.xml @@ -7,53 +7,66 @@ <version>3.6.2</version> </parent> <modelVersion>4.0.0</modelVersion> - + <artifactId>ruoyi-auth</artifactId> - + <description> ruoyi-auth认证授权中心 </description> - + <dependencies> - + <!-- SpringCloud Alibaba Nacos --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> - + <!-- SpringCloud Alibaba Nacos Config --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> - + <!-- SpringCloud Alibaba Sentinel --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> - + <!-- SpringBoot Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> - + <!-- SpringBoot Actuator --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> - + <!-- RuoYi Common Security--> <dependency> <groupId>com.ruoyi</groupId> <artifactId>ruoyi-common-security</artifactId> </dependency> - + + <!-- Swagger UI --> + <dependency> + <groupId>io.springfox</groupId> + <artifactId>springfox-swagger-ui</artifactId> + <version>${swagger.fox.version}</version> + </dependency> + + <!-- RuoYi Common Swagger --> + <dependency> + <groupId>com.ruoyi</groupId> + <artifactId>ruoyi-common-swagger</artifactId> + </dependency> + </dependencies> - + <build> <finalName>${project.artifactId}</finalName> <plugins> @@ -70,5 +83,5 @@ </plugin> </plugins> </build> - + </project> diff --git a/ruoyi-auth/src/main/java/com/ruoyi/auth/RuoYiAuthApplication.java b/ruoyi-auth/src/main/java/com/ruoyi/auth/RuoYiAuthApplication.java index abf65fd..a4a51cc 100644 --- a/ruoyi-auth/src/main/java/com/ruoyi/auth/RuoYiAuthApplication.java +++ b/ruoyi-auth/src/main/java/com/ruoyi/auth/RuoYiAuthApplication.java @@ -1,5 +1,7 @@ package com.ruoyi.auth; +import com.ruoyi.common.security.annotation.EnableCustomConfig; +import com.ruoyi.common.swagger.annotation.EnableCustomSwagger2; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; @@ -7,9 +9,11 @@ /** * 认证授权中心 - * + * * @author jqs */ +@EnableCustomConfig +@EnableCustomSwagger2 @EnableRyFeignClients @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class }) public class RuoYiAuthApplication diff --git a/ruoyi-auth/src/main/java/com/ruoyi/auth/config/QywxInnerConfig.java b/ruoyi-auth/src/main/java/com/ruoyi/auth/config/QywxInnerConfig.java new file mode 100644 index 0000000..b5a7100 --- /dev/null +++ b/ruoyi-auth/src/main/java/com/ruoyi/auth/config/QywxInnerConfig.java @@ -0,0 +1,442 @@ +package com.ruoyi.auth.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Component +@ConfigurationProperties(prefix = "qywx-inner") +public class QywxInnerConfig { + + private String corpId; + + private String agentId; + private String agentSecret; + + + + private String authorizeState; + + private String token; + private String encodingAESKey; + + public String getAuthorizeState() { + return authorizeState; + } + + public void setAuthorizeState(String authorizeState) { + this.authorizeState = authorizeState; + } + + public String getAgentId() { + return agentId; + } + + public void setAgentId(String agentId) { + this.agentId = agentId; + } + + public String getAgentSecret() { + return agentSecret; + } + + public void setAgentSecret(String agentSecret) { + this.agentSecret = agentSecret; + } + + private Integer authType; + private String templateId; + private String approvalFlowId; + + private String baseUrl = "https://qyapi.weixin.qq.com/cgi-bin/"; + + //服务商相关 + private String serviceUrl = baseUrl+"service/"; + private String suiteTokenUrl = serviceUrl+"get_suite_token"; + private String permanentCodeUrl = serviceUrl+"get_permanent_code?suite_access_token=%s"; + + //获取access_token + //https://open.work.weixin.qq.com/api/doc/90000/90135/91039 + private String accessTokenUrl = baseUrl+"gettoken?corpid=%s&corpsecret=%s"; + + //应用管理 + //https://open.work.weixin.qq.com/api/doc/90000/90135/90227 + private String agentGetUrl = baseUrl+"agent/get?access_token=%s&agentid=%s"; + private String agentSetUrl = baseUrl + "agent/set?access_token=%s"; + private String AgentMenuCreateUrl = baseUrl + "menu/create?access_token=%s&agentid=%s"; + private String AgentMenuGetUrl = baseUrl + "menu/get?access_token=%s&agentid=%s"; + private String AgentMenuDeleteUrl = baseUrl + "/menu/delete?access_token=%s&agentid=%s"; + + //身份验证 扫码授权登录 + //https://open.work.weixin.qq.com/api/doc/90000/90135/91019 + private String ssoAuthUrl = "https://open.work.weixin.qq.com/wwopen/sso/qrConnect?appid=%s&agentid=%s&redirect_uri=%s&state=%s"; + //https://open.work.weixin.qq.com/api/doc/90000/90135/91437 + //与H5登录接口一样 + // private String ssoUserInfoUrl = baseUrl+"user/getuserinfo?access_token=%s&code=%s"; + private String ssoUserInfoUrl = baseUrl+"auth/getuserinfo?access_token=%s&code=%s"; + + //公司相关 + //https://open.work.weixin.qq.com/api/doc/90000/90135/90208 + private String departmentUrl = baseUrl+"department/list?access_token=%s"; + //https://open.work.weixin.qq.com/api/doc/90000/90135/90200 + private String userSimplelistUrl = baseUrl+"user/simplelist?access_token=%s&department_id=%s&fetch_child=%s"; + //https://open.work.weixin.qq.com/api/doc/90000/90135/90201 + private String userDetailListUrl = baseUrl+"user/list?access_token=%s&department_id=%s&fetch_child=%s"; + //https://open.work.weixin.qq.com/api/doc/90000/90135/90196 + // 通过userid获取用户信息 + private String userDetailUrl = baseUrl+"user/get?access_token=%s&userid=%s"; + + private String userDetailUrlAuth = baseUrl+ "/auth/getuserdetail?access_token=%s"; + + //客户联系 + //获取配置了客户联系功能的成员列表 https://open.work.weixin.qq.com/api/doc/90000/90135/92571 + private String extContactFollowUserListUrl = baseUrl+"externalcontact/get_follow_user_list?access_token=%s"; + //获取客户列表 https://open.work.weixin.qq.com/api/doc/90000/90135/92113 + private String extContactListUrl = baseUrl+"externalcontact/list?access_token=%s&userid=%s"; + //获取客户详情 https://open.work.weixin.qq.com/api/doc/90000/90135/92114 + private String extContactDetailUrl = baseUrl+"/externalcontact/get?access_token=%s&external_userid=%s&cursor=%s"; + //获取客户群列表 https://open.work.weixin.qq.com/api/doc/90000/90135/92120 + private String extContactGroupchatListUrl = baseUrl+"externalcontact/groupchat/list?access_token=%s"; + //获取客户群详情 https://open.work.weixin.qq.com/api/doc/90000/90135/92122 + private String extContactGroupchatDetailUrl = baseUrl+"externalcontact/groupchat/get?access_token=%s"; + //添加新客户欢迎 https://open.work.weixin.qq.com/api/doc/90000/90135/92137 + private String extcontactSendWelcomeMsgUrl = baseUrl+"externalcontact/send_welcome_msg?access_token=%s"; + //创建企业群发 https://open.work.weixin.qq.com/api/doc/90000/90135/92135 + private String extcontactAddMsgTemplateUrl = baseUrl+"externalcontact/add_msg_template?access_token=%s"; + + //消息推送 + //https://open.work.weixin.qq.com/api/doc/90000/90135/90236 + private String messageSendUrl= baseUrl+"message/send?access_token=%s"; + + //素材管理 + //https://open.work.weixin.qq.com/api/doc/90000/90135/91054 + //type 是 媒体文件类型,分别有图片(image)、语音(voice)、视频(video),普通文件(file) + private String mediaUploadUrl = baseUrl+"media/upload?access_token=%s&type=%s"; + private String mediaUploadimgUrl = baseUrl+"media/uploadimg?access_token=%s"; + private String mediaGetUrl = baseUrl+"media/get?access_token=%s&media_id=%s"; + private String mediaGetJssdkUrl = baseUrl+"media/get/jssdk?access_token=%s&media_id=%s"; + + //审批 + //审批应用 https://work.weixin.qq.com/api/doc/90001/90143/91956 + private String oaCopyTemplateUrl ="oa/approval/copytemplate?access_token=%s"; + private String oaGetTemplateUrl ="/oa/gettemplatedetail?access_token=%s"; + private String oaApplyEventUrl = "oa/applyevent?access_token=%s"; + private String oaGetApprovalUrl ="oa/getapprovaldetail?access_token=%s"; + + //审批流程引擎 https://work.weixin.qq.com/api/doc/90001/90143/93798 + private String openApprovalDataUrl = baseUrl+"corp/getopenapprovaldata?access_token=%s"; + + + // H5应用 + //scope 是 应用授权作用域。企业自建应用固定填写:snsapi_base + // https://open.work.weixin.qq.com/api/doc/90000/90135/91020 + private String oauthUrl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_privateinfo&agentid=%s&state=%s#wechat_redirect"; + //https://open.work.weixin.qq.com/api/doc/90000/90135/91023 + private String oauthUserUrl = baseUrl+"user/getuserinfo?access_token=%s&code=%s"; + + //https://work.weixin.qq.com/api/doc/90000/90136/90506 + private String jsapiTicketUrl = baseUrl+"get_jsapi_ticket?access_token=%s"; + private String jsapiTicketAgentUrl = baseUrl+"ticket/get?access_token=%s&type=agent_config"; + + //家校沟通 + //https://work.weixin.qq.com/api/doc/90000/90135/91638 + private String extContactMessageSendUrl = baseUrl+"externalcontact/message/send?access_token=%s"; + private String extContactSubscribeQrUrl = baseUrl+"externalcontact/get_subscribe_qr_code?access_token=%s"; + + //此oauth与H5oauth一致 https://work.weixin.qq.com/api/doc/90000/90135/91857 + private String schoolOauthUrl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=%s&state=%s#wechat_redirect"; + //https://work.weixin.qq.com/api/doc/90000/90135/91707 + private String schoolOauthUserUrl = baseUrl+"user/getuserinfo?access_token=%s&code=%s"; + + private String schoolUrl = baseUrl+"school/"; + //https://work.weixin.qq.com/api/doc/90000/90135/92337 + private String schoolUserGetUrl = schoolUrl+"user/get?access_token=%s&userid=%s"; + //https://work.weixin.qq.com/api/doc/90000/90135/92343 + private String schoolDepartmentListUrl = schoolUrl+"department/list?access_token=%s&id=%s"; + //https://work.weixin.qq.com/api/doc/90000/90135/92446 + private String schoolUserListUrl = schoolUrl+"user/list?access_token=%s&department_id=%s&fetch_child=%s"; + + //效率工具 + private String calendarAddUrl = baseUrl+"oa/calendar/add?access_token=%s"; + private String calendarDetailUrl = baseUrl+"oa/calendar/get?access_token=%s"; + private String scheduleAddUrl = baseUrl+"oa/schedule/add?access_token=%s"; + private String scheduleListUrl = baseUrl+"oa/schedule/get_by_calendar?access_token=%s"; + private String scheduleDetailUrl = baseUrl+"oa/schedule/get?access_token=%s"; + private String meetingCreateUrl = baseUrl+"meeting/create?access_token=%s"; + private String userMeetingListUrl = baseUrl+"meeting/get_user_meetingid?access_token=%s"; + private String meetingCancelUrl = baseUrl+"meeting/cancel?access_token=%s"; + private String meetingDetailUrl = baseUrl+"meeting/get_info?access_token=%s"; + + //小程序应用 + //小程序登录流程 https://work.weixin.qq.com/api/doc/90000/90136/92426 + //code2Session https://work.weixin.qq.com/api/doc/90000/90136/91507 + private String code2sessionUrl = baseUrl+"miniprogram/jscode2session?access_token=%s&js_code=%s&grant_type=authorization_code"; + + + public String getSuiteTokenUrl() { + return suiteTokenUrl; + } + + + public String getPermanentCodeUrl() { + return permanentCodeUrl; + } + + public String getJsapiTicketUrl() { + return jsapiTicketUrl; + } + + public String getOauthUrl() { + return oauthUrl; + } + + public String getUserSimplelistUrl() { + return userSimplelistUrl; + } + + public String getAccessTokenUrl() { + return accessTokenUrl; + } + + public String getDepartmentUrl() { + return departmentUrl; + } + + public String getUserDetailListUrl() { + return userDetailListUrl; + } + + public String getCorpId() { + return corpId; + } + + + public String getToken() { + return token; + } + + public String getEncodingAESKey() { + return encodingAESKey; + } + + public Integer getAuthType() { + return authType; + } + + public String getUserDetailUrl() { + return userDetailUrl; + } + + public String getUserDetailUrlAuth(){ + return userDetailUrlAuth; + } + + + + public String getOauthUserUrl() { + return oauthUserUrl; + } + + + public String getCode2sessionUrl() { + return code2sessionUrl; + } + + public void setCorpId(String corpId) { + this.corpId = corpId; + } + + + public void setToken(String token) { + this.token = token; + } + + public void setEncodingAESKey(String encodingAESKey) { + this.encodingAESKey = encodingAESKey; + } + + public void setAuthType(Integer authType) { + this.authType = authType; + } + + public String getTemplateId() { + return templateId; + } + + public void setTemplateId(String templateId) { + this.templateId = templateId; + } + + public String getApprovalFlowId() { + return approvalFlowId; + } + + public void setApprovalFlowId(String approvalFlowId) { + this.approvalFlowId = approvalFlowId; + } + + + public String getSsoAuthUrl() { + return ssoAuthUrl; + } + + + public String getJsapiTicketAgentUrl() { + return jsapiTicketAgentUrl; + } + + + public String getExtContactFollowUserListUrl() { + return extContactFollowUserListUrl; + } + + public String getExtContactListUrl() { + return extContactListUrl; + } + + public String getExtContactGroupchatListUrl() { + return extContactGroupchatListUrl; + } + + public String getMessageSendUrl() { + return messageSendUrl; + } + + public String getMediaUploadUrl() { + return mediaUploadUrl; + } + + public String getMediaUploadimgUrl() { + return mediaUploadimgUrl; + } + + public String getMediaGetUrl() { + return mediaGetUrl; + } + + public String getMediaGetJssdkUrl() { + return mediaGetJssdkUrl; + } + + public String getOaCopyTemplateUrl() { + return oaCopyTemplateUrl; + } + + public String getOaGetTemplateUrl() { + return oaGetTemplateUrl; + } + + public String getOaApplyEventUrl() { + return oaApplyEventUrl; + } + + public String getOaGetApprovalUrl() { + return oaGetApprovalUrl; + } + + public String getOpenApprovalDataUrl() { + return openApprovalDataUrl; + } + + public String getSchoolOauthUrl() { + return schoolOauthUrl; + } + + public String getSchoolOauthUserUrl() { + return schoolOauthUserUrl; + } + + public String getSchoolUserGetUrl() { + return schoolUserGetUrl; + } + + public String getSchoolDepartmentListUrl() { + return schoolDepartmentListUrl; + } + + public String getSchoolUserListUrl() { + return schoolUserListUrl; + } + + public String getExtContactMessageSendUrl() { + return extContactMessageSendUrl; + } + public String getExtContactSubscribeQrUrl() { + return extContactSubscribeQrUrl; + } + public String getSsoUserInfoUrl() { + return ssoUserInfoUrl; + } + + public String getAgentGetUrl() { + return agentGetUrl; + } + + public String getAgentSetUrl() { + return agentSetUrl; + } + + public String getAgentMenuCreateUrl() { + return AgentMenuCreateUrl; + } + + public String getAgentMenuGetUrl() { + return AgentMenuGetUrl; + } + + public String getAgentMenuDeleteUrl() { + return AgentMenuDeleteUrl; + } + + public String getExtContactDetailUrl() { + return extContactDetailUrl; + } + + public String getExtcontactSendWelcomeMsgUrl() { + return extcontactSendWelcomeMsgUrl; + } + + public String getExtContactGroupchatDetailUrl() { + return extContactGroupchatDetailUrl; + } + + public String getExtcontactAddMsgTemplateUrl() { + return extcontactAddMsgTemplateUrl; + } + + public String getCalendarAddUrl() { + return calendarAddUrl; + } + + public String getCalendarDetailUrl() { + return calendarDetailUrl; + } + + public String getScheduleAddUrl() { + return scheduleAddUrl; + } + + public String getScheduleListUrl() { + return scheduleListUrl; + } + + public String getScheduleDetailUrl() { + return scheduleDetailUrl; + } + + public String getMeetingCreateUrl() { + return meetingCreateUrl; + } + + public String getUserMeetingListUrl() { + return userMeetingListUrl; + } + + public String getMeetingCancelUrl() { + return meetingCancelUrl; + } + + public String getMeetingDetailUrl() { + return meetingDetailUrl; + } + +} diff --git a/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/QwH5Controller.java b/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/QwH5Controller.java new file mode 100644 index 0000000..9f6ce3e --- /dev/null +++ b/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/QwH5Controller.java @@ -0,0 +1,69 @@ +package com.ruoyi.auth.controller; + +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.auth.service.QywxInnerService; +import com.ruoyi.auth.service.SysLoginService; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.security.service.TokenService; +import com.ruoyi.system.api.model.OauthUrlVo; +import com.ruoyi.system.api.model.OauthUserVo; +import com.ruoyi.system.api.model.QwH5LoginVo; +import com.ruoyi.system.api.model.QwUserDetailDto; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; + +/** + * 企业微信H5应用专用 + */ +@RestController +@Api(value = "企业微信授权信息获取", tags = "企业微信授权信息获取") +public class QwH5Controller { + + @Autowired + private QywxInnerService qywxInnerService; + + @Autowired + private SysLoginService sysLoginService; + + @Autowired + private TokenService tokenService; + + + /** + * 构造网页授权链接 + * @param redirectUri + * @return + * @throws UnsupportedEncodingException + */ + @GetMapping({"/h5/oauthUrl"}) + @ApiOperation("构造网页授权链接") + public R<OauthUrlVo> oauthUrl(@ApiParam(value = "授权重定向地址", required = true) @RequestParam("redirectUri") String redirectUri) throws UnsupportedEncodingException { + // 普通应用 + String oauthRedirectUrl = URLEncoder.encode(redirectUri,"utf-8"); + String oauthUrl = qywxInnerService.getOauthUrl(oauthRedirectUrl); + return R.ok(new OauthUrlVo(oauthUrl)); + } + + + @GetMapping("/h5/oauthUser") + @ApiOperation("通过code获取访问用户登录") + public R<OauthUserVo> oauthUser(@ApiParam(value = "成员授权获取到的code", required = true) @RequestParam("code") String code) throws IOException { + // 通过code获取访问用户敏感信息 + JSONObject result = qywxInnerService.getOauthUser(code); + QwUserDetailDto qwUserDetail = JSONObject.parseObject(result.toJSONString(), QwUserDetailDto.class); + // 1、查数据库获取人员 + QwH5LoginVo qwH5LoginVo = sysLoginService.qwH5Login(qwUserDetail); + // 2、生成Token + return R.ok(tokenService.createQwH5Token(qwH5LoginVo)); + } +} diff --git a/ruoyi-auth/src/main/java/com/ruoyi/auth/service/QywxInnerService.java b/ruoyi-auth/src/main/java/com/ruoyi/auth/service/QywxInnerService.java new file mode 100644 index 0000000..d36e18a --- /dev/null +++ b/ruoyi-auth/src/main/java/com/ruoyi/auth/service/QywxInnerService.java @@ -0,0 +1,99 @@ +package com.ruoyi.auth.service; + +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.auth.config.QywxInnerConfig; +import com.ruoyi.auth.utils.RestUtils; +import com.ruoyi.common.core.constant.Constants; +import com.ruoyi.common.core.exception.ServiceException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class QywxInnerService { + + private final static Logger logger = LoggerFactory.getLogger("QywxInnerService"); + + @Autowired + private QywxInnerConfig qywxInnerConfig; + + + public String getAccessToken(){ + + String corpId = qywxInnerConfig.getCorpId(); + String agentSecret = qywxInnerConfig.getAgentSecret(); + + String accessTokenUrl = String.format(qywxInnerConfig.getAccessTokenUrl(), corpId, agentSecret); + JSONObject response = RestUtils.get(accessTokenUrl); + // 获取错误日志 + if(response.containsKey(Constants.QY_WX_ERR_CODE) && response.getInteger(Constants.QY_WX_ERR_CODE) != 0){ + logger.error(response.toString()); + throw new ServiceException("获取企业微信ACCESS_TOKEN异常"); + } + return response.getString(Constants.QY_WX_ACCESS_TOKEN); + + } + + + //********************************** H5应用 Oauth *************************// + /** + * 构造网页授权链接 + * @param oauthRedirectUrl + * @return + */ + public String getOauthUrl(String oauthRedirectUrl){ +// 应用授权作用域。 +// snsapi_base:静默授权,可获取成员的基础信息(UserId与DeviceId); +// snsapi_userinfo:静默授权,可获取成员的详细信息,但不包含手机、邮箱等敏感信息; +// snsapi_privateinfo:手动授权,可获取成员的详细信息,包含手机、邮箱等敏感信息(已不再支持获取手机号/邮箱)。 + String corpId = qywxInnerConfig.getCorpId(); + String state = qywxInnerConfig.getAuthorizeState(); + String agentId = qywxInnerConfig.getAgentId(); + + // 构造网页授权链接 redirect_uri + return String.format(qywxInnerConfig.getOauthUrl(), corpId, oauthRedirectUrl, agentId, state); + } + + /** + * 获取访问用户身份 + * 获取访问用户敏感信息 + * @param code + * @return + */ + public JSONObject getOauthUser(String code) { + String accessToken = getAccessToken(); + + // 获取访问用户身份 + String getOauthUrl = String.format(qywxInnerConfig.getOauthUserUrl(), accessToken, code); + JSONObject response = RestUtils.get(getOauthUrl); + if(response.containsKey(Constants.QY_WX_ERR_CODE) && response.getInteger(Constants.QY_WX_ERR_CODE) != 0){ + logger.error(response.toString()); + throw new ServiceException("获取企业微信信息异常"); + } + logger.info("----------------userinfo-------------"); + logger.info(response.toString()); + + //获取通讯录用户详情get + String userId = response.getString(Constants.QY_WX_USER_ID); + // 成员票据,最大为512字节,有效期为1800s。 scope为snsapi_privateinfo,获取访问用户敏感信息 + String userTicket = response.getString(Constants.QY_WX_USER_TICKET); + + // 获取用户详情 包含部门信息 + // String url = String.format(qywxInnerConfig.getUserDetailUrl(),accessToken,userId); + // 获取访问用户敏感信息 + String url = String.format(qywxInnerConfig.getUserDetailUrlAuth(), accessToken); + JSONObject json = new JSONObject(); + json.put(Constants.QY_WX_USER_TICKET, userTicket); + JSONObject detailResponse = RestUtils.post(url, json); + //获取错误日志 + if(detailResponse.containsKey(Constants.QY_WX_ERR_CODE) && detailResponse.getInteger(Constants.QY_WX_ERR_CODE) != 0){ + logger.error(detailResponse.toString()); + throw new ServiceException("获取企业微信信息异常"); + } + logger.info("----------------userinfo detail -------------"); + logger.info(detailResponse.toString()); + + return detailResponse; + } +} diff --git a/ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java b/ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java index ba44f73..8f42cb2 100644 --- a/ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java +++ b/ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java @@ -1,8 +1,7 @@ package com.ruoyi.auth.service; import com.ruoyi.system.api.RemoteMemberService; -import com.ruoyi.system.api.model.AppMiniLoginDto; -import com.ruoyi.system.api.model.AppMiniLoginVo; +import com.ruoyi.system.api.model.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.ruoyi.common.core.constant.CacheConstants; @@ -19,11 +18,10 @@ import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.system.api.RemoteUserService; import com.ruoyi.system.api.domain.poji.sys.SysUser; -import com.ruoyi.system.api.model.LoginUser; /** * 登录校验方法 - * + * * @author jqs */ @Component @@ -89,7 +87,7 @@ { throw new ServiceException(userResult.getMsg()); } - + LoginUser userInfo = userResult.getData(); SysUser user = userResult.getData().getSysUser(); if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) @@ -142,6 +140,42 @@ return userInfo; } + + /** + * 企业微信H5登录 + */ + public QwH5LoginVo qwH5Login(QwUserDetailDto qwUserDetail) + { + // 查询用户信息 + R<QwH5LoginVo> userResult = remoteUserService.qwH5Login(qwUserDetail); + if (R.FAIL == userResult.getCode()) + { + throw new ServiceException(userResult.getMsg()); + } + QwH5LoginVo userInfo = userResult.getData(); + SysUser user = userInfo.getSysUser(); + String username = user.getUserName(); + // IP黑名单校验 + String blackStr = Convert.toStr(redisService.getCacheObject(CacheConstants.SYS_LOGIN_BLACKIPLIST)); + if (IpUtils.isMatchedIp(blackStr, IpUtils.getIpAddr())) + { + recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "很遗憾,访问IP已被列入系统黑名单"); + throw new ServiceException("很遗憾,访问IP已被列入系统黑名单"); + } + if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) + { + recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "对不起,您的账号已被删除"); + throw new ServiceException("对不起,您的账号:" + username + " 已被删除"); + } + if (UserStatus.DISABLE.getCode().equals(user.getStatus())) + { + recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "用户已停用,请联系管理员"); + throw new ServiceException("对不起,您的账号:" + username + " 已停用"); + } + recordLogService.recordLogininfor(username, Constants.LOGIN_SUCCESS, "登录成功"); + return userInfo; + } + public void logout(String loginName) { recordLogService.recordLogininfor(loginName, Constants.LOGOUT, "退出成功"); diff --git a/ruoyi-auth/src/main/java/com/ruoyi/auth/utils/RestUtils.java b/ruoyi-auth/src/main/java/com/ruoyi/auth/utils/RestUtils.java new file mode 100644 index 0000000..3e8d329 --- /dev/null +++ b/ruoyi-auth/src/main/java/com/ruoyi/auth/utils/RestUtils.java @@ -0,0 +1,104 @@ +package com.ruoyi.auth.utils; + +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.system.api.model.QwUserDetailDto; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.*; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponentsBuilder; + +import java.io.IOException; +import java.net.URI; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Map; +import java.util.Objects; + +@Configuration +public class RestUtils { + + private static final RestTemplate restTemplate = new RestTemplate(); + + public static JSONObject get(String url, Map<String,String> urlParams){ + return get(urlToUri(url,urlParams)); + } + + //在处理企业微信某些参数时有问题 + public static JSONObject get(String url){ + return get(URI.create(url)); + } + + private static JSONObject get(URI uri){ + ResponseEntity<JSONObject> responseEntity =restTemplate.getForEntity(uri,JSONObject.class); + serverIsRight(responseEntity); // 判断服务器返回状态码 + return responseEntity.getBody(); + } + + public static JSONObject post(String url,Map<String,String> urlParams,JSONObject json){ + //组装url + return post(urlToUri(url,urlParams),json); + } + + public static JSONObject post(String url,JSONObject json){ + //组装urL + return post(URI.create(url),json); + } + + private static JSONObject post(URI uri,JSONObject json){ + //组装url + //设置提交json格式数据 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + HttpEntity<JSONObject> request = new HttpEntity(json, headers); + ResponseEntity<JSONObject> responseEntity = restTemplate.postForEntity(uri,request,JSONObject.class); + serverIsRight(responseEntity); //判断服务器返回状态码 + return responseEntity.getBody(); + } + + private static URI urlToUri(String url,Map<String,String> urlParams){ + //设置提交json格式数据 + UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromHttpUrl(url); + for(Map.Entry<String,String> entry : urlParams.entrySet()) { + uriBuilder.queryParam((String)entry.getKey(), (String) entry.getValue()) ; + } + return uriBuilder.build(true).toUri(); + } + + public static JSONObject upload(String url,MultiValueMap formParams){ + //设置表单提交 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.MULTIPART_FORM_DATA); + HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(formParams, headers); + ResponseEntity<JSONObject> responseEntity = restTemplate.postForEntity(url,request,JSONObject.class); + serverIsRight(responseEntity); //判断服务器返回状态码 + return responseEntity.getBody(); + } + + public static String download(String url,String targetPath) throws IOException { + + ResponseEntity<byte[]> rsp = restTemplate.getForEntity(url, byte[].class); + if(rsp.getStatusCode() != HttpStatus.OK){ + System.out.println("文件下载请求结果状态码:" + rsp.getStatusCode()); + } + // 将下载下来的文件内容保存到本地 + Files.write(Paths.get(targetPath), Objects.requireNonNull(rsp.getBody())); + return targetPath; + + } + + public static byte[] dowload(String url){ + ResponseEntity<byte[]> rsp = restTemplate.getForEntity(url, byte[].class); + return rsp.getBody(); + } + + private static void serverIsRight(ResponseEntity responseEntity){ + if(responseEntity.getStatusCodeValue()==200){ +// System.out.println("服务器请求成功:{}"+responseEntity.getStatusCodeValue()); + }else { + System.out.println("服务器请求异常:{}"+responseEntity.getStatusCodeValue()); + } + } + + +} diff --git a/ruoyi-auth/src/main/resources/bootstrap.yml b/ruoyi-auth/src/main/resources/bootstrap.yml index 7167bfc..9878fc2 100644 --- a/ruoyi-auth/src/main/resources/bootstrap.yml +++ b/ruoyi-auth/src/main/resources/bootstrap.yml @@ -1,9 +1,9 @@ # Tomcat -server: +server: port: 8030 # Spring -spring: +spring: application: # 应用名称 name: ruoyi-auth @@ -23,3 +23,13 @@ # 共享配置 shared-configs: - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + +#自建应用配置 非代开发不需要 具体自建应用配置大家写表里就行 +qywx-inner: + corpId: ww78cbcfad600119af + agentId: 1000005 + agentSecret: 2xMP3DaamA4-zTu6KtsF_y83OSJRXK5UspB8hWKkXmI + authorizeState: HONGRUITANG + suiteSecret: "" + token: "" + encodingAESKey: "" diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/Constants.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/Constants.java index 1f01333..f0caeed 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/Constants.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/Constants.java @@ -2,7 +2,7 @@ /** * 通用常量信息 - * + * * @author jqs */ public class Constants @@ -113,6 +113,27 @@ public static final long CAPTCHA_EXPIRATION = 2; /** + * 企业微信返回码 返回码 + */ + public static final String QY_WX_ERR_CODE = "errcode"; + + /** + * 企业微信返回码 调用接口凭证 + */ + public static final String QY_WX_ACCESS_TOKEN = "access_token"; + + + /** + * 成员UserID + */ + public static final String QY_WX_USER_ID = "userid"; + + /** + * 成员UserID + */ + public static final String QY_WX_USER_TICKET = "user_ticket"; + + /** * 资源映射路径 前缀 */ public static final String RESOURCE_PREFIX = "/profile"; diff --git a/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java b/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java index 4f24165..8214742 100644 --- a/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java +++ b/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java @@ -6,6 +6,8 @@ import javax.servlet.http.HttpServletRequest; import com.ruoyi.system.api.model.AppMiniLoginVo; +import com.ruoyi.system.api.model.OauthUserVo; +import com.ruoyi.system.api.model.QwH5LoginVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.ruoyi.common.core.constant.CacheConstants; @@ -21,7 +23,7 @@ /** * token验证处理 - * + * * @author jqs */ @Component @@ -55,7 +57,7 @@ refreshToken(loginUser); // Jwt存储信息 - Map<String, Object> claimsMap = new HashMap<String, Object>(); + Map<String, Object> claimsMap = new HashMap<>(); claimsMap.put(SecurityConstants.USER_KEY, token); claimsMap.put(SecurityConstants.DETAILS_USER_ID, userId); claimsMap.put(SecurityConstants.DETAILS_USERNAME, userName); @@ -95,6 +97,37 @@ rspMap.put("expires_in", expireTime); rspMap.put("mini_openid", appMiniLoginVo.getMiniOpenid()); return rspMap; + } + + /** + * 创建小程序令牌 + */ + public OauthUserVo createQwH5Token(QwH5LoginVo qwH5LoginVo) + { + LoginUser loginUser = new LoginUser(); + loginUser.setSysUser(qwH5LoginVo.getSysUser()); + String token = IdUtils.fastUUID(); + Long userId = loginUser.getSysUser().getUserId(); + String userName = loginUser.getSysUser().getUserName(); + loginUser.setToken(token); + loginUser.setUserid(userId); + loginUser.setUsername(userName); + loginUser.setIpaddr(IpUtils.getIpAddr()); + refreshToken(loginUser); + + // Jwt存储信息 + Map<String, Object> claimsMap = new HashMap<String, Object>(); + claimsMap.put(SecurityConstants.USER_KEY, token); + claimsMap.put(SecurityConstants.DETAILS_USER_ID, userId); + claimsMap.put(SecurityConstants.DETAILS_USERNAME, userName); + + // 接口返回信息 + OauthUserVo oauthUserVo = new OauthUserVo(); + oauthUserVo.setAccessToken(JwtUtils.createToken(claimsMap)); + oauthUserVo.setExpiresIn(expireTime); + oauthUserVo.setUserid(qwH5LoginVo.getUserid()); + oauthUserVo.setMobile(qwH5LoginVo.getMobile()); + return oauthUserVo; } /** @@ -198,4 +231,4 @@ { return ACCESS_TOKEN + token; } -} \ No newline at end of file +} diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/SwaggerProvider.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/SwaggerProvider.java index 48cee9c..797b5c5 100644 --- a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/SwaggerProvider.java +++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/SwaggerProvider.java @@ -15,7 +15,7 @@ /** * 聚合系统接口 - * + * * @author jqs */ @Component @@ -38,7 +38,7 @@ /** * 聚合其他服务接口 - * + * * @return */ @Override @@ -53,7 +53,7 @@ .contains(routeDefinition.getId())) .forEach(routeDefinition -> routeDefinition.getPredicates().stream() .filter(predicateDefinition -> "Path".equalsIgnoreCase(predicateDefinition.getName())) - .filter(predicateDefinition -> !"ruoyi-auth".equalsIgnoreCase(routeDefinition.getId())) + //.filter(predicateDefinition -> !"ruoyi-auth".equalsIgnoreCase(routeDefinition.getId())) .forEach(predicateDefinition -> resourceList .add(swaggerResource(routeDefinition.getId(), predicateDefinition.getArgs() .get(NameUtils.GENERATED_NAME_PREFIX + "0").replace("/**", SWAGGER2URL))))); diff --git a/ruoyi-modules/ruoyi-job/pom.xml b/ruoyi-modules/ruoyi-job/pom.xml index 14334bf..0cb987b 100644 --- a/ruoyi-modules/ruoyi-job/pom.xml +++ b/ruoyi-modules/ruoyi-job/pom.xml @@ -16,38 +16,39 @@ </description> <dependencies> - + <!-- SpringCloud Alibaba Nacos --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> - + <!-- SpringCloud Alibaba Nacos Config --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> - + <!-- SpringCloud Alibaba Sentinel --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> - + <!-- SpringBoot Actuator --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> - + <!-- Swagger UI --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>${swagger.fox.version}</version> </dependency> - + + <!-- Quartz --> <dependency> <groupId>org.quartz-scheduler</groupId> @@ -59,25 +60,25 @@ </exclusion> </exclusions> </dependency> - + <!-- Mysql Connector --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> - + <!-- RuoYi Common Log --> <dependency> <groupId>com.ruoyi</groupId> <artifactId>ruoyi-common-log</artifactId> </dependency> - + <!-- RuoYi Common Swagger --> <dependency> <groupId>com.ruoyi</groupId> <artifactId>ruoyi-common-swagger</artifactId> </dependency> - + </dependencies> <build> @@ -96,5 +97,5 @@ </plugin> </plugins> </build> - -</project> \ No newline at end of file + +</project> diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/member/MemberService.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/member/MemberService.java index ecd2b11..1f90481 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/member/MemberService.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/member/MemberService.java @@ -38,6 +38,7 @@ */ AppMiniLoginVo getMemberByCode(AppMiniLoginDto appMiniLoginDto); + /** * 获取授权信息 * @param appUserAuthorizeDto diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/sys/SysUserController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/sys/SysUserController.java index 6bd54b0..92a641f 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/sys/SysUserController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/sys/SysUserController.java @@ -1,6 +1,7 @@ package com.ruoyi.system.controller.sys; import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.exception.ServiceException; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.utils.poi.ExcelUtil; import com.ruoyi.common.core.web.controller.BaseController; @@ -16,7 +17,10 @@ import com.ruoyi.system.api.domain.poji.sys.SysDept; import com.ruoyi.system.api.domain.poji.sys.SysRole; import com.ruoyi.system.api.domain.poji.sys.SysUser; +import com.ruoyi.system.api.model.AppMiniLoginVo; import com.ruoyi.system.api.model.LoginUser; +import com.ruoyi.system.api.model.QwH5LoginVo; +import com.ruoyi.system.api.model.QwUserDetailDto; import com.ruoyi.system.service.config.SysTagService; import com.ruoyi.system.service.sys.*; import org.apache.commons.lang3.ArrayUtils; @@ -29,12 +33,13 @@ import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; +import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; /** * 用户信息 - * + * * @author jqs */ @RestController @@ -145,8 +150,29 @@ } /** + * 企业微信H5登录 + * @param qwUserDetail + * @return + */ + @PostMapping("/qwH5Login") + public R<QwH5LoginVo> qwH5Login(@RequestBody QwUserDetailDto qwUserDetail) + { + String mobile = qwUserDetail.getMobile(); + SysUser sysUser = userService.selectUserByPhoneNumber(mobile); + Optional.ofNullable(sysUser).orElseThrow(() -> new ServiceException("登录失败,未查询到用户")); + + // 构造登录返回信息 + QwH5LoginVo qwH5LoginVo = new QwH5LoginVo(); + qwH5LoginVo.setUserid(qwUserDetail.getUserid()); + qwH5LoginVo.setMobile(qwUserDetail.getMobile()); + qwH5LoginVo.setSysUser(sysUser); + return R.ok(qwH5LoginVo); + } + + + /** * 获取用户信息 - * + * * @return 用户信息 */ @GetMapping("getInfo") diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/sys/SysUserMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/sys/SysUserMapper.java index e874e26..281955f 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/sys/SysUserMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/sys/SysUserMapper.java @@ -1,19 +1,21 @@ package com.ruoyi.system.mapper.sys; import java.util.List; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.system.domain.pojo.coupon.Coupon; import org.apache.ibatis.annotations.Param; import com.ruoyi.system.api.domain.poji.sys.SysUser; /** * 用户表 数据层 - * + * * @author jqs */ -public interface SysUserMapper -{ +public interface SysUserMapper extends BaseMapper<SysUser> { /** * 根据条件分页查询用户列表 - * + * * @param sysUser 用户信息 * @return 用户信息集合信息 */ @@ -21,7 +23,7 @@ /** * 根据条件分页查询已配用户角色列表 - * + * * @param user 用户信息 * @return 用户信息集合信息 */ @@ -29,7 +31,7 @@ /** * 根据条件分页查询未分配用户角色列表 - * + * * @param user 用户信息 * @return 用户信息集合信息 */ @@ -37,7 +39,7 @@ /** * 通过用户名查询用户 - * + * * @param userName 用户名 * @return 用户对象信息 */ @@ -45,7 +47,7 @@ /** * 通过用户ID查询用户 - * + * * @param userId 用户ID * @return 用户对象信息 */ @@ -53,7 +55,7 @@ /** * 新增用户信息 - * + * * @param user 用户信息 * @return 结果 */ @@ -61,7 +63,7 @@ /** * 修改用户信息 - * + * * @param user 用户信息 * @return 结果 */ @@ -69,7 +71,7 @@ /** * 修改用户头像 - * + * * @param userName 用户名 * @param avatar 头像地址 * @return 结果 @@ -78,7 +80,7 @@ /** * 重置用户密码 - * + * * @param userName 用户名 * @param password 密码 * @return 结果 @@ -87,7 +89,7 @@ /** * 通过用户ID删除用户 - * + * * @param userId 用户ID * @return 结果 */ @@ -95,7 +97,7 @@ /** * 批量删除用户信息 - * + * * @param userIds 需要删除的用户ID * @return 结果 */ @@ -103,7 +105,7 @@ /** * 校验用户名称是否唯一 - * + * * @param userName 用户名称 * @return 结果 */ diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/sys/SysUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/sys/SysUserServiceImpl.java index 30ca47e..405be71 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/sys/SysUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/sys/SysUserServiceImpl.java @@ -6,8 +6,13 @@ import java.util.stream.Collectors; import javax.validation.Validator; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.system.api.domain.dto.AppEditUserDto; import com.ruoyi.system.api.domain.poji.member.Member; +import com.ruoyi.system.domain.pojo.coupon.Coupon; +import com.ruoyi.system.mapper.coupon.CouponMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -33,14 +38,15 @@ import com.ruoyi.system.mapper.sys.SysUserRoleMapper; import com.ruoyi.system.service.sys.ISysConfigService; import com.ruoyi.system.service.sys.ISysUserService; +import org.springframework.util.ObjectUtils; /** * 用户 业务层处理 - * + * * @author jqs */ @Service -public class SysUserServiceImpl implements ISysUserService +public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> implements ISysUserService { private static final Logger log = LoggerFactory.getLogger(SysUserServiceImpl.class); @@ -67,7 +73,7 @@ /** * 根据条件分页查询用户列表 - * + * * @param user 用户信息 * @return 用户信息集合信息 */ @@ -78,9 +84,21 @@ return userMapper.selectUserList(user); } + @Override + public SysUser selectUserByPhoneNumber(String phoneNumber) { + SysUser sysUser = new SysUser(); + sysUser.setPhonenumber(phoneNumber); + List<SysUser> userList = this.selectUserList(sysUser); + SysUser queryUser = null; + if(!userList.isEmpty()){ + queryUser = userList.get(0); + } + return queryUser; + } + /** * 根据条件分页查询已分配用户角色列表 - * + * * @param user 用户信息 * @return 用户信息集合信息 */ @@ -93,7 +111,7 @@ /** * 根据条件分页查询未分配用户角色列表 - * + * * @param user 用户信息 * @return 用户信息集合信息 */ @@ -106,7 +124,7 @@ /** * 通过用户名查询用户 - * + * * @param userName 用户名 * @return 用户对象信息 */ @@ -118,7 +136,7 @@ /** * 通过用户ID查询用户 - * + * * @param userId 用户ID * @return 用户对象信息 */ @@ -130,7 +148,7 @@ /** * 查询用户所属角色组 - * + * * @param userName 用户名 * @return 结果 */ @@ -147,7 +165,7 @@ /** * 查询用户所属岗位组 - * + * * @param userName 用户名 * @return 结果 */ @@ -164,7 +182,7 @@ /** * 校验用户名称是否唯一 - * + * * @param user 用户信息 * @return 结果 */ @@ -218,7 +236,7 @@ /** * 校验用户是否允许操作 - * + * * @param user 用户信息 */ @Override @@ -232,7 +250,7 @@ /** * 校验用户是否有数据权限 - * + * * @param userId 用户id */ @Override @@ -252,7 +270,7 @@ /** * 新增保存用户信息 - * + * * @param user 用户信息 * @return 结果 */ @@ -271,7 +289,7 @@ /** * 注册用户信息 - * + * * @param user 用户信息 * @return 结果 */ @@ -283,7 +301,7 @@ /** * 修改保存用户信息 - * + * * @param user 用户信息 * @return 结果 */ @@ -305,7 +323,7 @@ /** * 用户授权角色 - * + * * @param userId 用户ID * @param roleIds 角色组 */ @@ -319,7 +337,7 @@ /** * 修改用户状态 - * + * * @param user 用户信息 * @return 结果 */ @@ -331,7 +349,7 @@ /** * 修改用户基本信息 - * + * * @param user 用户信息 * @return 结果 */ @@ -343,7 +361,7 @@ /** * 修改用户头像 - * + * * @param userName 用户名 * @param avatar 头像地址 * @return 结果 @@ -356,7 +374,7 @@ /** * 重置用户密码 - * + * * @param user 用户信息 * @return 结果 */ @@ -368,7 +386,7 @@ /** * 重置用户密码 - * + * * @param userName 用户名 * @param password 密码 * @return 结果 @@ -381,7 +399,7 @@ /** * 新增用户角色信息 - * + * * @param user 用户对象 */ public void insertUserRole(SysUser user) @@ -391,7 +409,7 @@ /** * 新增用户岗位信息 - * + * * @param user 用户对象 */ public void insertUserPost(SysUser user) @@ -414,7 +432,7 @@ /** * 新增用户角色信息 - * + * * @param userId 用户ID * @param roleIds 角色组 */ @@ -437,7 +455,7 @@ /** * 通过用户ID删除用户 - * + * * @param userId 用户ID * @return 结果 */ @@ -454,7 +472,7 @@ /** * 批量删除用户信息 - * + * * @param userIds 需要删除的用户ID * @return 结果 */ @@ -476,7 +494,7 @@ /** * 导入用户数据 - * + * * @param userList 用户数据列表 * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据 * @param operName 操作用户 diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/sys/ISysUserService.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/sys/ISysUserService.java index d2904bb..f71e030 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/sys/ISysUserService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/sys/ISysUserService.java @@ -2,27 +2,35 @@ import java.util.List; +import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.system.api.domain.dto.AppEditUserDto; import com.ruoyi.system.api.domain.poji.sys.SysUser; +import com.ruoyi.system.domain.pojo.coupon.Coupon; /** * 用户 业务层 - * + * * @author jqs */ -public interface ISysUserService +public interface ISysUserService extends IService<SysUser> { /** * 根据条件分页查询用户列表 - * + * * @param user 用户信息 * @return 用户信息集合信息 */ public List<SysUser> selectUserList(SysUser user); /** + * 通过电话号码查询用户 + * + */ + public SysUser selectUserByPhoneNumber(String phonenumber); + + /** * 根据条件分页查询已分配用户角色列表 - * + * * @param user 用户信息 * @return 用户信息集合信息 */ @@ -30,7 +38,7 @@ /** * 根据条件分页查询未分配用户角色列表 - * + * * @param user 用户信息 * @return 用户信息集合信息 */ @@ -38,7 +46,7 @@ /** * 通过用户名查询用户 - * + * * @param userName 用户名 * @return 用户对象信息 */ @@ -46,7 +54,7 @@ /** * 通过用户ID查询用户 - * + * * @param userId 用户ID * @return 用户对象信息 */ @@ -54,7 +62,7 @@ /** * 根据用户ID查询用户所属角色组 - * + * * @param userName 用户名 * @return 结果 */ @@ -62,7 +70,7 @@ /** * 根据用户ID查询用户所属岗位组 - * + * * @param userName 用户名 * @return 结果 */ @@ -70,7 +78,7 @@ /** * 校验用户名称是否唯一 - * + * * @param user 用户信息 * @return 结果 */ @@ -94,21 +102,21 @@ /** * 校验用户是否允许操作 - * + * * @param user 用户信息 */ public void checkUserAllowed(SysUser user); /** * 校验用户是否有数据权限 - * + * * @param userId 用户id */ public void checkUserDataScope(Long userId); /** * 新增用户信息 - * + * * @param user 用户信息 * @return 结果 */ @@ -116,7 +124,7 @@ /** * 注册用户信息 - * + * * @param user 用户信息 * @return 结果 */ @@ -124,7 +132,7 @@ /** * 修改用户信息 - * + * * @param user 用户信息 * @return 结果 */ @@ -132,7 +140,7 @@ /** * 用户授权角色 - * + * * @param userId 用户ID * @param roleIds 角色组 */ @@ -140,7 +148,7 @@ /** * 修改用户状态 - * + * * @param user 用户信息 * @return 结果 */ @@ -148,7 +156,7 @@ /** * 修改用户基本信息 - * + * * @param user 用户信息 * @return 结果 */ @@ -156,7 +164,7 @@ /** * 修改用户头像 - * + * * @param userName 用户名 * @param avatar 头像地址 * @return 结果 @@ -165,7 +173,7 @@ /** * 重置用户密码 - * + * * @param user 用户信息 * @return 结果 */ @@ -173,7 +181,7 @@ /** * 重置用户密码 - * + * * @param userName 用户名 * @param password 密码 * @return 结果 @@ -182,7 +190,7 @@ /** * 通过用户ID删除用户 - * + * * @param userId 用户ID * @return 结果 */ @@ -190,7 +198,7 @@ /** * 批量删除用户信息 - * + * * @param userIds 需要删除的用户ID * @return 结果 */ @@ -198,7 +206,7 @@ /** * 导入用户数据 - * + * * @param userList 用户数据列表 * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据 * @param operName 操作用户 -- Gitblit v1.7.1