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