加入、退出会议前端能处理
业务类
操作管理
package com.taiji.soa.mobile.api;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.qiniu.rtc.QRTC;
import com.qiniu.rtc.QRTCClient;
import com.qiniu.rtc.model.QRTCResult;
import com.qiniu.rtc.model.RoomParam;
import com.qiniu.rtc.model.RoomResult;
import com.taiji.common.controller.Result;
import com.taiji.common.util.CommonUtil;
import com.taiji.general.entity.user.SysUser;
import com.taiji.general.message.ObjectRestResponse;
import com.taiji.general.utils.httpClient.HttpClientUtil;
import com.taiji.general.vo.UserInfoVo;
import com.taiji.soa.mobile.client.UserFeignClient;
import com.taiji.soa.mobile.constant.MobileCommonConstant;
import com.taiji.soa.mobile.dto.QnimDto;
import com.taiji.soa.mobile.dto.QnimJoinerDto;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
@RestController
@RequestMapping("/api/qnapi")
public class QiniuControllerApi {
@Autowired
private UserFeignClient userFeignClient;
@PostMapping(value = "/qrtc/getRoomToken")
@ResponseBody
public ObjectRestResponse getRoomToken(){
ObjectRestResponse objectRestResponse = new ObjectRestResponse();
QRTCClient client = QRTC.init(MobileCommonConstant.qrtcAccessKey,MobileCommonConstant.qrtcSecretKey,MobileCommonConstant.qrtcAppId);;
try {
String roomName="room_"+ System.currentTimeMillis();
RoomParam roomParam = new RoomParam();
roomParam.setRoomName(roomName);
roomParam.setOpenRoom(true);
roomParam.setAutoCloseTtlS(30);
roomParam.setNoEntreTtlS(3600);
roomParam.setMaxUsers(2);
QRTCResult<RoomResult> roomResult = client.createRoom(roomParam);
String tokenA = client.getRoomToken(roomName, "qrtcA", System.currentTimeMillis() / 1000+3600, "user");
String tokenB = client.getRoomToken(roomName, "qrtcB", System.currentTimeMillis() / 1000+3600, "user");
Map map=new HashMap();
map.put("roomTokenA",tokenA);
map.put("roomTokenB",tokenB);
objectRestResponse.setRel(true);
objectRestResponse.setMessage("success");
objectRestResponse.setData(map);
return objectRestResponse;
}catch (Exception e){
log.error("获取roomtoken失败", e);
throw new RuntimeException();
}
}
@PostMapping(value = "/qrtc/createRoom")
@ResponseBody
public ObjectRestResponse createRoom(@RequestBody QnimJoinerDto qnimJoinerDto){
ObjectRestResponse objectRestResponse = new ObjectRestResponse();
QRTCClient client = QRTC.init(MobileCommonConstant.qrtcAccessKey,MobileCommonConstant.qrtcSecretKey,MobileCommonConstant.qrtcAppId);;
try {
String roomName="room_"+ System.currentTimeMillis();
RoomParam roomParam = new RoomParam();
roomParam.setRoomName(roomName);
roomParam.setOpenRoom(true);
roomParam.setAutoCloseTtlS(30);
roomParam.setNoEntreTtlS(3600);
roomParam.setMaxUsers(20);
QRTCResult<RoomResult> roomResult = client.createRoom(roomParam);
String joinerToken = client.getRoomToken(roomName, qnimJoinerDto.getUserName(), System.currentTimeMillis() / 1000+36000, "user");
Map map=new HashMap();
map.put("roomToken",joinerToken);
map.put("roomName",roomName);
objectRestResponse.setRel(true);
objectRestResponse.setMessage("success");
objectRestResponse.setData(map);
return objectRestResponse;
}catch (Exception e){
log.error("创建七牛云视频房间失败", e);
throw new RuntimeException();
}
}
@PostMapping(value = "/qrtc/addJoiner")
@ResponseBody
public ObjectRestResponse addJoiner(@RequestBody QnimDto qnimDto){
ObjectRestResponse objectRestResponse = new ObjectRestResponse();
QRTCClient client = QRTC.init(MobileCommonConstant.qrtcAccessKey,MobileCommonConstant.qrtcSecretKey,MobileCommonConstant.qrtcAppId);;
try {
List<QnimJoinerDto> joiners=qnimDto.getJoiners();
Boolean flag=false;
QRTCResult<RoomResult> roomResult=client.listUser(qnimDto.getRoomName());
List<RoomResult.UserInfo> users=new ArrayList<>();
if(roomResult!=null){
if(roomResult.getResult()!=null){
if(roomResult.getResult().getUsers()!=null&&roomResult.getResult().getUsers().size()>0){
users=roomResult.getResult().getUsers();
}
}
}
for (QnimJoinerDto joinerDto:joiners) {
for (RoomResult.UserInfo userInfo:users) {
if(userInfo.getUserId().equals(joinerDto.getUserName())){
flag=true;
break;
}
}
if(flag){
continue;
}
String joinerToken = client.getRoomToken(qnimDto.getRoomName(), joinerDto.getUserName(), System.currentTimeMillis() / 1000+36000, "user");
QnimDto sendParam=new QnimDto();
sendParam.setFromUserName(qnimDto.getFromUserName());
sendParam.setToUserId(new Long[]{Long.valueOf(joinerDto.getQnUserId())});
sendParam.setRoomToken(joinerToken);
sendParam.setRoomName(qnimDto.getRoomName());
sendParam.setType(2);
qnimSendMsg(sendParam);
}
objectRestResponse.setRel(true);
objectRestResponse.setMessage("success");
return objectRestResponse;
}catch (Exception e){
log.error("添加参会人员失败", e);
throw new RuntimeException();
}
}
@PostMapping(value = "/qrtc/sendMsg")
@ResponseBody
public ObjectRestResponse qnimSendMsg(@RequestBody QnimDto qnimDto){
try{
ObjectRestResponse objectRestResponse = new ObjectRestResponse();
String url=MobileCommonConstant.qnimApiEndpoint+"/token/login";
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("login_name", qnimDto.getFromUserName());
paramMap.put("password", "taiji_laibin");
Map<String, String> headerMap = new HashMap<String, String>();
headerMap.put("access-token", MobileCommonConstant.qnimAk);
headerMap.put("app_id", MobileCommonConstant.qnimAppId);
String resultStr = HttpClientUtil.doPostJson(url, JSON.toJSONString(paramMap),headerMap);
if (resultStr != null && !resultStr.equals("")) {
JSONObject jsonObject = JSONObject.parseObject(resultStr);
if (jsonObject.getInteger("code") == 200) {
Long userId=jsonObject.getJSONObject("data").getLong("user_id");
Map map = new HashMap<>();
map.put("transaction_id", System.currentTimeMillis());
map.put("type", 1);
map.put("from_user_id", userId);
map.put("targets", qnimDto.getToUserId());
map.put("content_type", 0);
Map contentMap = new HashMap<>();
contentMap.put("roomToken", qnimDto.getRoomToken());
contentMap.put("fromName", qnimDto.getFromUserName());
contentMap.put("roomName", qnimDto.getRoomName());
contentMap.put("type", null!=qnimDto.getType()?qnimDto.getType():1);
String content=JSON.toJSONString(contentMap);
map.put("content", JSON.toJSONString(contentMap));
map.put("ext", JSON.toJSONString(contentMap));
url=MobileCommonConstant.qnimApiEndpoint+"/message/send";
log.info("发送人"+userId);
log.info("接收人"+JSON.toJSONString(qnimDto.getToUserId()));
resultStr = HttpClientUtil.doPostJson(url, JSON.toJSONString(map),headerMap);
JSONObject jsonSend = JSONObject.parseObject(resultStr);
if (jsonSend.getInteger("code") == 200) {
objectRestResponse.setRel(true);
objectRestResponse.setMessage("success");
return objectRestResponse;
}
}else {
url=MobileCommonConstant.qnimApiEndpoint+"/user/register/v2";
Map<String, Object> registerMap = new HashMap<String, Object>();
registerMap.put("username", qnimDto.getFromUserName());
registerMap.put("password", "taiji_laibin");
resultStr = HttpClientUtil.doPostJson(url, JSON.toJSONString(registerMap),headerMap);
JSONObject jsonRegiter = JSONObject.parseObject(resultStr);
if (jsonRegiter.getInteger("code") == 200) {
qnimSendMsg(qnimDto);
}
}
}
objectRestResponse.setRel(false);
objectRestResponse.setMessage("七牛云即时通讯消息发送失败");
return objectRestResponse;
}catch (Exception e){
log.error("七牛云即时通讯消息发送失败", e);
throw new RuntimeException();
}
}
@PostMapping(value = "/qrtc/registerQnUser")
@ResponseBody
public ObjectRestResponse registerQnUser(@RequestBody SysUser user){
try{
ObjectRestResponse objectRestResponse = new ObjectRestResponse();
String url=MobileCommonConstant.qnimApiEndpoint+"/user/register/v2";
Map<String, String> headerMap = new HashMap<String, String>();
headerMap.put("access-token", MobileCommonConstant.qnimAk);
headerMap.put("app_id", MobileCommonConstant.qnimAppId);
Map<String, Object> registerMap = new HashMap<String, Object>();
registerMap.put("username", user.getUserName());
registerMap.put("password", "taiji_laibin");
String resultStr = HttpClientUtil.doPostJson(url, JSON.toJSONString(registerMap),headerMap);
JSONObject jsonRegiter = JSONObject.parseObject(resultStr);
if (jsonRegiter.getInteger("code") == 200) {
Long userId=jsonRegiter.getJSONObject("data").getLong("user_id");
SysUser updateSysUser = new SysUser();
updateSysUser.setId(user.getId());
updateSysUser.setQnUserId(userId);
userFeignClient.registerQnUser(updateSysUser);
objectRestResponse.setRel(true);
Map resMap= new HashMap<String,Object>();
resMap.put("qnUserId",userId);
objectRestResponse.setData(resMap);
objectRestResponse.setMessage("七牛云即时通讯注册用户成功");
return objectRestResponse;
}else {
Result<UserInfoVo> resultUserInfoVo=userFeignClient.getUserByUserId(user.getId());
if (CommonUtil.isResultSuccess(resultUserInfoVo)) {
UserInfoVo userInfoVo = resultUserInfoVo.getData();
if(userInfoVo.getQnUserId()==null){
url=MobileCommonConstant.qnimApiEndpoint+"/token/login";
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("login_name", user.getUserName());
paramMap.put("password", "taiji_laibin");
resultStr = HttpClientUtil.doPostJson(url, JSON.toJSONString(paramMap),headerMap);
if (resultStr != null && !resultStr.equals("")) {
JSONObject jsonObject = JSONObject.parseObject(resultStr);
if (jsonObject.getInteger("code") == 200) {
Long userId = jsonObject.getJSONObject("data").getLong("user_id");
SysUser updateSysUser = new SysUser();
updateSysUser.setId(user.getId());
updateSysUser.setQnUserId(userId);
userFeignClient.registerQnUser(updateSysUser);
objectRestResponse.setRel(true);
Map resMap= new HashMap<String,Object>();
resMap.put("qnUserId",userId);
objectRestResponse.setData(resMap);
objectRestResponse.setMessage("七牛云即时通讯注册用户成功");
return objectRestResponse;
}
}
}
}
}
objectRestResponse.setRel(false);
objectRestResponse.setMessage("七牛云即时通讯注册用户失败");
return objectRestResponse;
}catch (Exception e){
log.error("七牛云即时通讯注册用户失败", e);
throw new RuntimeException();
}
}
}
房间管理
package com.taiji.soa.mobile.biz;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.qiniu.common.QiniuException;
import com.qiniu.rtc.QRTCClient;
import com.qiniu.rtc.model.QRTCResult;
import com.qiniu.rtc.model.RoomParam;
import com.qiniu.rtc.model.RoomResult;
import com.taiji.common.controller.Result;
import com.taiji.common.exception.CommonCodes;
import com.taiji.soa.mobile.entity.RoomAccess;
import io.netty.util.internal.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import javax.annotation.Resource;
import java.util.List;
@Slf4j
@Service
public class WebRTCService {
@Resource
private QRTCClient qrtcClient;
public String getRoomToken(RoomAccess roomAccess) throws Exception {
String roomName = roomAccess.getRoomName();
String permission = roomAccess.getPermission();
String userId = roomAccess.getUserId();
long expireAt = roomAccess.getExpireAt();
log.info("入参信息为:" + roomAccess);
return qrtcClient.getRoomToken(roomName, permission, expireAt, userId);
}
public Result<?> createRoom(RoomParam roomParam) throws QiniuException {
Result<?> activeRoom = activeRoom(StringUtil.EMPTY_STRING, 0, 1);
RoomResult result = (RoomResult) activeRoom.getData();
List<String> rooms = result.getRooms();
if (!ObjectUtils.isEmpty(rooms)) {
boolean anyMatch = rooms.stream().anyMatch(res -> res.equals(roomParam.getRoomName()));
if (anyMatch) {
return Result.fail(CommonCodes.CODE_SERVICE_UNAVAILABLE.getCode(), "创建失败,该房间名称已存在");
}
}
roomParam.setOpenRoom(true);
roomParam.setAutoCloseTtlS(30);
roomParam.setNoEntreTtlS(3600);
roomParam.setMaxUsers(20);
QRTCResult<RoomResult> roomResult = qrtcClient.createRoom(roomParam);
return roomResult.getCode() != 200 ? Result.fail(CommonCodes.CODE_SERVICE_UNAVAILABLE.getCode(), "创建房间失败") : Result.ok(roomResult.getResult());
}
public Result<?> enterRoom(String roomName) throws QiniuException {
QRTCResult<RoomResult> roomResult = qrtcClient.listUser(roomName);
return roomResult.getCode() != 200 ?
Result.fail(CommonCodes.CODE_SERVICE_UNAVAILABLE.getCode(), "获取房间用户失败") : Result.ok(roomResult.getResult());
}
public Result<?> activeRoom(String roomNamePrefix, int offset, int limit) throws QiniuException {
QRTCResult<RoomResult> roomResult = qrtcClient.listActiveRoom(roomNamePrefix, offset, limit);
return roomResult.getCode() != 200 ? Result.fail(CommonCodes.CODE_SERVICE_UNAVAILABLE.getCode()
, "获取活跃用失败") : Result.ok(roomResult.getResult());
}
public Result<?> kickRoom(String roomName, String userId) throws QiniuException {
QRTCResult<RoomResult> roomResult = qrtcClient.kickUser(roomName, userId);
return roomResult.getCode() != 200 ? Result.fail(CommonCodes.CODE_SERVICE_UNAVAILABLE.getCode()
, "踢出用户失败") : Result.ok(roomResult.getResult());
}
public Result<?> removeRoom(String roomName) throws QiniuException {
QRTCResult<RoomResult> roomResult = qrtcClient.deleteRoom(roomName);
return roomResult.getCode() != 200 ? Result.fail(CommonCodes.CODE_SERVICE_UNAVAILABLE.getCode(),
"删除房间失败") : Result.ok(roomResult.getResult());
}
}