浏览代码

Merge branch 'master' of http://116.63.33.55/git/light-application

xyg 3 年之前
父节点
当前提交
99af65e7cb

+ 19 - 0
light-application-server/src/main/java/com/jd/lightapplication/controller/SysUserController.java

@@ -4,17 +4,22 @@ package com.jd.lightapplication.controller;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.log.Log;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.jd.lightapplication.common.dto.PassDto;
 import com.jd.lightapplication.common.lang.Const;
 import com.jd.lightapplication.common.lang.R;
+import com.jd.lightapplication.easemob.EasemobComtroller;
+import com.jd.lightapplication.easemob.dto.SetUserAttributeDto;
 import com.jd.lightapplication.model.SysRole;
 import com.jd.lightapplication.model.SysUser;
 import com.jd.lightapplication.model.SysUserRole;
 import com.jd.lightapplication.model.dto.SysUserQueryDto;
 import com.jd.lightapplication.model.dto.SysUserUpdateDto;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
@@ -39,11 +44,15 @@ import java.util.List;
  */
 @RestController
 @RequestMapping("/sys/user")
+@Slf4j
 public class SysUserController extends BaseController {
 
     @Autowired
     BCryptPasswordEncoder passwordEncoder;
 
+    @Autowired
+    EasemobComtroller easemobComtroller;
+
     @GetMapping("/info/{id}")
     @PreAuthorize("hasAuthority('sys:user:list')")
     public R info(@PathVariable("id") Long id) {
@@ -190,6 +199,16 @@ public class SysUserController extends BaseController {
         BeanUtil.copyProperties(sysUserUpdateDto, sysUser);
         sysUser.setUpdated(DateUtil.now());
         sysUserService.updateById(sysUser);
+        //先查出用户数据,再设置环信用户属性
+        sysUser = sysUserService.getById(sysUserUpdateDto.getId());
+        SetUserAttributeDto setUserAttributeDto = new SetUserAttributeDto()
+                .setUsername(sysUser.getPhone())
+                .setNickname(sysUser.getNickName())
+                .setPhone(sysUser.getPhone())
+                .setAvatarurl(sysUser.getHeadImgUrl());
+        JSONObject jsonObject = (JSONObject) easemobComtroller.setUpUserAttribute(setUserAttributeDto).getData();
+        String data = jsonObject.getStr("data");
+        log.debug("设置环信用户属性(data为空表示设置失败)data=" + data);
         return R.success(sysUser);
     }
 

+ 241 - 0
light-application-server/src/main/java/com/jd/lightapplication/easemob/EasemobComtroller.java

@@ -0,0 +1,241 @@
+package com.jd.lightapplication.easemob;
+
+import cn.hutool.core.map.MapBuilder;
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.jd.lightapplication.common.lang.R;
+import com.jd.lightapplication.easemob.dto.*;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+@RestController
+@RequestMapping("/api/easemob")
+@ApiOperation("环信相关接口")
+@AllArgsConstructor
+public class EasemobComtroller {
+
+    private RedisTemplate redisTemplate;
+    private final String EASEMOB_TOKEN = "EASEMOB_TOKEN";//存储环信token的redis的key
+
+    private final String ORG_NAME = "1160220415096727"; //企业的唯一标识,开发者在环信开发者管理后台注册账号之后自动生成的企业 ID。
+    private final String APP_NAME = "light-application";//同一“企业”下“APP”唯一标识,开发者在环信开发者管理后台创建应用时填写的“应用名称”。
+
+    private final String GRANT_TYPE = "client_credentials";//获取token 这里直接写死
+    private final String CLIENT_ID = "YXA6Z1TGzj7dTvmtgQkyTKPnNw";//可在环信后台-->应用管理查看
+    private final String CLIENT_SECRET = "YXA6vOkXod1I_TZ1XWypfr_bKkzYgCM";//可在环信后台-->应用管理查看
+
+    private final String TOKEN_URL = "http://a1.easemob.com/%s/%s/token";//获取token
+    private final String REGISTER_USER_URL = "http://a1.easemob.com/%s/%s/users";//注册用户
+    private final String QUERY_USER_PAGE_URL = "http://a1.easemob.com/%s/%s/users";//分页查询用户
+    private final String CREATE_GROUP_URL = "http://a1.easemob.com/%s/%s/chatgroups";//创建群组
+    private final String QUERY_GROUP_PAGE_URL = "http://a1.easemob.com/%s/%s/chatgroups";//分页查询群组
+    private final String ADD_GROUP_USER_URL = "http://a1.easemob.com/%s/%s/chatgroups/%s/users";//批量添加群组成员
+    private final String SET_USER_ATTRIBUTE_URL = "http://a1.easemob.com/%s/%s/metadata/user/%s";//设置环信用户属性
+    private final String GET_USER_ATTRIBUTE_URL = "http://a1.easemob.com/%s/%s/metadata/user/%s";//获取环信用户属性
+
+    @PostMapping("/getToken")
+    @ApiOperation("获取环信token接口")
+    public R getToken() {
+        //获取环信token,如果redis里面没有。就调方法获取
+        Object easemobTokenObj = redisTemplate.opsForValue().get(EASEMOB_TOKEN);
+        if (easemobTokenObj != null) {
+            return R.success(easemobTokenObj.toString());
+        }
+        //拼接请求路径
+        String tokenUrl = String.format(TOKEN_URL, ORG_NAME, APP_NAME);
+        //封装请求参数
+        Map<Object, Object> params = MapUtil.builder()
+                .put("grant_type", GRANT_TYPE)
+                .put("client_id", CLIENT_ID)
+                .put("client_secret", CLIENT_SECRET)
+                .map();
+        //获取响应参数
+        String result = HttpRequest.post(tokenUrl)
+                .header("Content-Type", "application/json")
+                .header("Accept", "application/json")
+                .body(JSONUtil.parse(params).toString())
+                .execute()
+                .body();
+        JSONObject resultJsonObj = JSONUtil.parseObj(result);
+        String token = resultJsonObj.getStr("access_token");
+        //如果redis里面没有环信的token并且目前获取到了token,把token存到redis里面。有效期为7天
+        if (token != null && redisTemplate.opsForValue().get(EASEMOB_TOKEN) == null) {
+            redisTemplate.opsForValue().set(EASEMOB_TOKEN, token, 7, TimeUnit.DAYS);
+        }
+        return R.success(token);
+    }
+
+    @PostMapping("/registerUser")
+    @ApiOperation("注册环信用户")
+    public R registerUser(EasemobUserAddDto easemobUserAddDto) {
+        //拼接请求路径
+        String tokenUrl = String.format(REGISTER_USER_URL, ORG_NAME, APP_NAME);
+        //封装请求参数
+        Map<Object, Object> params = MapUtil.builder()
+                .put("username", easemobUserAddDto.getUsername())
+                .put("password", easemobUserAddDto.getPassword())
+                .map();
+        return R.success(this.requestEasemobServer(tokenUrl, params, "POST"));
+    }
+
+    @PostMapping("/queryUserPage")
+    @ApiOperation("分页查询环信用户")
+    public R queryUserPage(QueryPageDto queryPageDto) {
+        //拼接请求路径
+        String tokenUrl = String.format(QUERY_USER_PAGE_URL, ORG_NAME, APP_NAME);
+        //封装请求参数
+        Map<Object, Object> params = MapUtil.builder()
+                .put("limit", queryPageDto.getLimit())
+                .put("cursor", queryPageDto.getCursor())
+                .map();
+        return R.success(this.requestEasemobServer(tokenUrl, params, "GET"));
+    }
+
+    @PostMapping("/createGroup")
+    @ApiOperation("创建环信群聊")
+    public R createGroup(CreateGroupDto createGroupDto) {
+        //拼接请求路径
+        String tokenUrl = String.format(CREATE_GROUP_URL, ORG_NAME, APP_NAME);
+        //封装请求参数
+        Map<Object, Object> params = MapUtil.builder()
+                .put("groupname", createGroupDto.getGroupname())
+                .put("desc", createGroupDto.getDesc())
+                .put("ispublic", createGroupDto.getIspublic())
+                .put("maxusers", createGroupDto.getMaxusers())
+                .put("approval", createGroupDto.getApproval())
+                .put("owner", createGroupDto.getOwner())
+                .put("members", createGroupDto.getMembers())
+                .map();
+        return R.success(this.requestEasemobServer(tokenUrl, params, "POST"));
+    }
+
+    @GetMapping("/queryGroupPage")
+    @ApiOperation("分页查询环信应用内的群聊")
+    public R queryGroupPage(QueryPageDto queryPageDto) {
+        //拼接请求路径
+        String tokenUrl = String.format(QUERY_GROUP_PAGE_URL, ORG_NAME, APP_NAME);
+        //封装请求参数
+        Map<Object, Object> params = MapUtil.builder()
+                .put("limit", queryPageDto.getLimit())
+                .put("cursor", queryPageDto.getCursor())
+                .map();
+        return R.success(this.requestEasemobServer(tokenUrl, params, "POST"));
+    }
+
+    @PostMapping("/addGroupUser")
+    @ApiOperation("批量添加群组成员")
+    public R addGroupUser(AddGroupUserDto addGroupUserDto) {
+        //拼接请求路径
+        String tokenUrl = String.format(ADD_GROUP_USER_URL, ORG_NAME, APP_NAME, addGroupUserDto.getChatgroupid());
+        //封装请求参数
+        Map<Object, Object> params = MapUtil.builder()
+                .put("usernames", addGroupUserDto.getUsernames())
+                .map();
+        return R.success(this.requestEasemobServer(tokenUrl, params, "POST"));
+    }
+
+    @PostMapping("/setUpUserAttribute")
+    @ApiOperation("设置环信用户属性")
+    public R setUpUserAttribute(SetUserAttributeDto setUserAttributeDto) {
+        //获取环信token
+        String easemobTokenStr = this.getToken().getData().toString();
+        //拼接请求路径
+        String url = String.format(SET_USER_ATTRIBUTE_URL, ORG_NAME, APP_NAME, setUserAttributeDto.getUsername());
+        //封装请求参数
+        Map<String, Object> params = new HashMap<>();
+        new MapBuilder<>(params)
+                .put("nickname", setUserAttributeDto.getNickname())
+                .put("avatarurl", setUserAttributeDto.getAvatarurl())
+                .put("mail", setUserAttributeDto.getMail())
+                .put("phone", setUserAttributeDto.getPhone())
+                .put("gender", setUserAttributeDto.getGender())
+                .put("birth", setUserAttributeDto.getBirth())
+                .put("sign", setUserAttributeDto.getSign())
+                .put("ext", setUserAttributeDto.getExt())
+                .map();
+        String result = HttpRequest.put(url)
+                .header("Content-Type", "application/x-www-form-urlencoded")
+                .header("Authorization", "Bearer " + easemobTokenStr)
+                .form(params)
+                .execute()
+                .body();
+        JSONObject resultJsonObj = JSONUtil.parseObj(result);
+        return R.success(resultJsonObj);
+    }
+
+    @PostMapping("/getUpUserAttribute/{username}")
+    @ApiOperation("获取环信用户属性")
+    public R getUpUserAttribute(@PathVariable("username") String username) {
+        //拼接请求路径
+        String tokenUrl = String.format(GET_USER_ATTRIBUTE_URL, ORG_NAME, APP_NAME, username);
+        //封装请求参数
+        Map<Object, Object> params = MapUtil.builder()
+                .map();
+        return R.success(this.requestEasemobServer(tokenUrl, params, "GET"));
+    }
+
+    /**
+     * 向环信服务器发起请求,每次都携带最高权限的认证请求头
+     *
+     * @return
+     */
+    private Object requestEasemobServer(String url, Map<Object, Object> params, String method) {
+        //获取环信token
+        String easemobTokenStr = this.getToken().getData().toString();
+        //发送请求到环信服务器
+        String result = null;
+        switch (method) {
+            case "get":
+            case "GET":
+                result = HttpRequest.get(url)
+                        .header("Content-Type", "application/json")
+                        .header("Accept", "application/json")
+                        .header("Authorization", "Bearer " + easemobTokenStr)
+                        .body(JSONUtil.parse(params).toString())
+                        .execute()
+                        .body();
+                break;
+            case "post":
+            case "POST":
+                result = HttpRequest.post(url)
+                        .header("Content-Type", "application/json")
+                        .header("Accept", "application/json")
+                        .header("Authorization", "Bearer " + easemobTokenStr)
+                        .body(JSONUtil.parse(params).toString())
+                        .execute()
+                        .body();
+                break;
+            case "put":
+            case "PUT":
+                result = HttpRequest.put(url)
+                        .header("Content-Type", "application/json")
+                        .header("Accept", "application/json")
+                        .header("Authorization", "Bearer " + easemobTokenStr)
+                        .body(JSONUtil.parse(params).toString())
+                        .execute()
+                        .body();
+                break;
+            case "delete":
+            case "DELETE":
+                result = HttpRequest.delete(url)
+                        .header("Content-Type", "application/json")
+                        .header("Accept", "application/json")
+                        .header("Authorization", "Bearer " + easemobTokenStr)
+                        .body(JSONUtil.parse(params).toString())
+                        .execute()
+                        .body();
+                break;
+        }
+        //格式化响应参数
+        JSONObject resultJsonObj = JSONUtil.parseObj(result);
+        return resultJsonObj;
+    }
+}

+ 2 - 0
light-application-server/src/main/java/com/jd/lightapplication/easemob/dto/EasemobUserAddDto.java

@@ -2,11 +2,13 @@ package com.jd.lightapplication.easemob.dto;
 
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import lombok.experimental.Accessors;
 
 /**
  * 添加环信用户的入参
  */
 @Data
+@Accessors(chain = true)
 public class EasemobUserAddDto {
     @ApiModelProperty("环信用户名称")
     private String username;

+ 2 - 0
light-application-server/src/main/java/com/jd/lightapplication/easemob/dto/SetUserAttributeDto.java

@@ -2,11 +2,13 @@ package com.jd.lightapplication.easemob.dto;
 
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import lombok.experimental.Accessors;
 
 /**
  * 设置用户属性的入参 除了username外,其他属性可任意设置。注意属性和值对应
  */
 @Data
+@Accessors(chain = true)
 public class SetUserAttributeDto {
     @ApiModelProperty("用户id")
     private String username;

+ 18 - 0
light-application-server/src/main/java/com/jd/lightapplication/security/MobileLoginFilter.java

@@ -1,5 +1,6 @@
 package com.jd.lightapplication.security;
 
+import cn.hutool.core.codec.Base64;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.http.HttpUtil;
 import cn.hutool.json.JSONObject;
@@ -7,7 +8,10 @@ import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.jd.lightapplication.common.exception.CaptchaException;
+import com.jd.lightapplication.common.lang.R;
 import com.jd.lightapplication.common.lang.WeChatConfig;
+import com.jd.lightapplication.easemob.EasemobComtroller;
+import com.jd.lightapplication.easemob.dto.EasemobUserAddDto;
 import com.jd.lightapplication.model.SysRole;
 import com.jd.lightapplication.model.SysUser;
 import com.jd.lightapplication.model.SysUserRole;
@@ -41,6 +45,8 @@ public class MobileLoginFilter extends OncePerRequestFilter implements Initializ
     private SysRoleService sysRoleService;
     private SysUserRoleService sysUserRoleService;
 
+    private EasemobComtroller easemobComtroller;
+
     LoginFailureHandler loginFailureHandler;
     private SecurityProperties securityProperties;
     private AuthenticationFailureHandler authenticationFailureHandler;
@@ -131,6 +137,18 @@ public class MobileLoginFilter extends OncePerRequestFilter implements Initializ
         }
         log.debug("手机号登录未找到用户信息," + (result ? "新增用户成功。" : "新增用户失败。") + "phone=" + phone);
         log.debug("手机号登录未找到用户信息," + (result1 ? "新增角色成功。" : "新增角色失败。") + "phone=" + phone);
+
+        //向环信应用注册用户
+        EasemobUserAddDto easemobUserAddDto = new EasemobUserAddDto()
+                .setUsername(sysUser.getPhone())
+                .setPassword(Base64.encode(sysUser.getPhone()));
+        JSONObject jsonObject = (JSONObject) easemobComtroller.registerUser(easemobUserAddDto).getData();
+        String error = jsonObject.getStr("error");
+        if (error != null) {
+            log.warn(error + sysUser);
+        } else {
+            log.info("环信用户注册成功" + sysUser);
+        }
     }
 
     /**