提交 7bd5136f 作者: xiaowang

动态审核

上级 226e4486
......@@ -34,6 +34,8 @@ public class UserAccountSimpleDTO implements Serializable {
private String nickName;
@ApiModelProperty(value = "用户头像")
private String userImg;
@ApiModelProperty(value = "openid")
private String openid;
@ApiModelProperty(value = "用户性别:0未知、1男、2女")
private Integer userSex;
@ApiModelProperty(value = "用户邮箱")
......
......@@ -402,7 +402,7 @@ public enum ResultEnum implements BaseErrorInfoInterface {
INDUSTRY_NEWS_TITLE_EXISTS("40200", "文章标题存在"),
// 论坛
DYNAMIC_SENSITIVE_INFO("50100", "发布信息涉及敏感信息!");
DYNAMIC_SENSITIVE_INFO("50100", "发布内容涉及敏感信息!");
/**
* 错误码
*
......
......@@ -4,7 +4,6 @@ import com.mmc.csf.common.util.web.ResultBody;
import com.mmc.csf.release.forum.vo.CommentVO;
import com.mmc.csf.release.forum.vo.DynamicVO;
import com.mmc.csf.release.service.DynamicService;
import com.mmc.csf.release.service.WxApiService;
import io.swagger.annotations.*;
import org.springframework.web.bind.annotation.*;
......@@ -22,30 +21,13 @@ public class DynamicController extends BaseController {
@Resource
private DynamicService dynamicService;
@Resource
private WxApiService wxApiService;
@ApiOperation(value = "动态发布")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@PostMapping("/publish")
public ResultBody publishDynamic(@RequestBody DynamicVO dynamicVO, HttpServletRequest request) {
return dynamicService.insertDynamic(
dynamicVO, this.getUserLoginInfoFromRedis(request).getUserAccountId());
}
// @ApiOperation(value = "内容test")
// @ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
// @GetMapping("/test")
// public ResultBody publishDynamic(@RequestParam String content, HttpServletRequest request) {
// return wxApiService.msgSecCheck("ohQPS5Ca4K6mY4Eju6Vsev096SxM", content);
// }
@ApiOperation(value = "test")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@GetMapping("/test/te")
public String publishDynamic(String content) {
System.out.println(content);
return "success";
dynamicVO, this.getUserLoginInfoFromRedis(request).getUserAccountId(), request);
}
@ApiOperation(value = "点赞或取消点赞")
......
package com.mmc.csf.release.controller;
import com.mmc.csf.common.util.web.ResultBody;
import com.mmc.csf.release.service.WxApiService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.Map;
/**
* @Author LW
* @date 2023/7/12 17:32
* 概要:
*/
@Api(tags = {"wx-api"})
@RestController
@RequestMapping("/wechat")
public class WxApiController {
@Resource
WxApiService wxApiService;
/**
* 正确响应微信发送的Token验证,注意 这里是 get请求
*/
@PostMapping("/checkSignature")
@ApiOperation(value = "校验签名")
public String verifyUrl(Map<String, String> params) throws Exception {
return wxApiService.checkSignature(params);
}
@PostMapping("/mediaCheckAsync")
@ApiOperation(value = "媒体资源安全检查")
public ResultBody mediaCheckAsync(String mediaUrl) {
return wxApiService.mediaCheckAsync("ohQPS5Ca4K6mY4Eju6Vsev096SxM", mediaUrl);
}
}
......@@ -10,7 +10,6 @@ import java.util.List;
/**
* @Author LW
*
* @date 2023/5/15 10:29 概要:动态信息数据访问层
*/
@Mapper
......@@ -138,8 +137,11 @@ public interface DynamicDAO {
/**
* 查询动态详情
*
* @param dynamicId
* @return
*/
ForumDynamicDO getDynamicInfoById(Integer dynamicId);
List<ForumDynamicDO> firstTwoItemsComment(List<Integer> ids);
}
......@@ -23,25 +23,45 @@ import java.math.BigDecimal;
@Accessors(chain = true)
public class ForumDynamicDO extends BaseDO implements Serializable {
private static final long serialVersionUID = 570379773690905364L;
/** 版本字段 */
/**
* 版本字段
*/
private Integer version;
/** 发布用户ID */
/**
* 发布用户ID
*/
private Integer userAccountId;
/** 动态描述 */
/**
* 动态描述
*/
private String description;
/** 发布动态具体位置 */
/**
* 发布动态具体位置
*/
private String location;
/** 发布动态纬度 */
/**
* 发布动态纬度
*/
private BigDecimal lat;
/** 发布动态经度 */
/**
* 发布动态经度
*/
private BigDecimal lon;
/** 点赞数 */
/**
* 点赞数
*/
private Integer likesCount;
/** 评论数 */
/**
* 评论数
*/
private Integer commentsCount;
/** 记录父节点id */
/**
* 记录父节点id
*/
private String rootPath;
private Integer checkStatus;
public ForumDynamicDO(DynamicVO dynamicVO) {
this.description = dynamicVO.getDescription();
this.location = dynamicVO.getLocation();
......
......@@ -9,7 +9,6 @@ import javax.servlet.http.HttpServletRequest;
/**
* @Author LW 测试合并
*
* @date 2023/5/15 10:29 概要:动态信息service层
*/
public interface DynamicService {
......@@ -19,7 +18,7 @@ public interface DynamicService {
* @param dynamicVO 动态
* @return {@link ResultBody}
*/
ResultBody insertDynamic(DynamicVO dynamicVO, Integer userAccountId);
ResultBody insertDynamic(DynamicVO dynamicVO, Integer userAccountId, HttpServletRequest request);
/**
* 点赞动态
......
......@@ -2,8 +2,6 @@ package com.mmc.csf.release.service;
import com.mmc.csf.common.util.web.ResultBody;
import java.util.Map;
/**
* @Author LW
* @date 2023/7/12 13:44
......@@ -18,8 +16,4 @@ public interface WxApiService {
* @return
*/
String getStableAccessToken() throws Exception;
String checkSignature(Map<String, String> params) throws Exception;
ResultBody mediaCheckAsync(String openid, String mediaUrl);
}
......@@ -16,6 +16,7 @@ import com.mmc.csf.release.forum.vo.DynamicVO;
import com.mmc.csf.release.forum.vo.MediaVO;
import com.mmc.csf.release.forum.vo.UserBaseInfoVO;
import com.mmc.csf.release.service.DynamicService;
import com.mmc.csf.release.service.WxApiService;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -45,22 +46,38 @@ public class DynamicServiceImpl implements DynamicService {
private CommentDAO commentDAO;
@Autowired
private UserAppApi userAppApi;
@Resource
private WxApiService wxApiService;
@Override
@Transactional(rollbackFor = Exception.class)
public ResultBody insertDynamic(DynamicVO dynamicVO, Integer userAccountId) {
public ResultBody insertDynamic(DynamicVO dynamicVO, Integer userAccountId, HttpServletRequest request) {
// 获取用户openid
// UserAccountSimpleDTO userAccountSimpleDTO = userAppApi.feignGetUserSimpleInfo(userAccountId, request.getHeader(TokenConstant.TOKEN));
// 插入动态基本信息
ForumDynamicDO forumDynamicDO = new ForumDynamicDO(dynamicVO);
forumDynamicDO.setRootPath(null);
forumDynamicDO.setUserAccountId(userAccountId);
dynamicDAO.insertDynamic(forumDynamicDO);
// 插入动态资源
if (CollectionUtils.isNotEmpty(dynamicVO.getMediaVO())) {
forumDynamicDO.setCheckStatus(0);
dynamicDAO.insertDynamic(forumDynamicDO);
for (MediaVO mediaVO : dynamicVO.getMediaVO()) {
dynamicDAO.insertResource(forumDynamicDO.getId(), mediaVO.getType(), mediaVO.getUrl());
}
return ResultBody.success("您的信息通过审核后,即可向其他人展示");
} else {
// todo openid 需要获取
ResultBody resultBody = wxApiService.msgSecCheck("ohQPS5GV_ulnz4-PeftQlqktGLvw", dynamicVO.getDescription());
if (resultBody.getCode().equals("200")) {
forumDynamicDO.setCheckStatus(1);
dynamicDAO.insertDynamic(forumDynamicDO);
} else {
forumDynamicDO.setCheckStatus(2);
dynamicDAO.insertDynamic(forumDynamicDO);
}
return resultBody;
}
return ResultBody.success("动态发布成功");
}
@Override
......@@ -84,6 +101,9 @@ public class DynamicServiceImpl implements DynamicService {
if (forumDynamicDO == null) {
return ResultBody.error("动态不存在或已删除");
}
// todo openid 需要获取
ResultBody resultBody = wxApiService.msgSecCheck("ohQPS5GV_ulnz4-PeftQlqktGLvw", commentVO.getContent());
if (resultBody.getCode().equals("200")) {
// 新增评论
ForumDynamicDO comment = new ForumDynamicDO();
comment.setUserAccountId(userAccountId);
......@@ -94,6 +114,9 @@ public class DynamicServiceImpl implements DynamicService {
// 修改评论数量
dynamicDAO.updateDynamicCommentCount(commentVO.getDynamicId(), forumDynamicDO.getVersion());
return ResultBody.success();
} else {
return resultBody;
}
}
@Override
......@@ -181,6 +204,9 @@ public class DynamicServiceImpl implements DynamicService {
// 动态id集合
List<Integer> ids =
forumDynamicList.stream().map(ForumDynamicDO::getId).collect(Collectors.toList());
// 根据id集合查询评论
List<ForumDynamicDO> commentList = dynamicDAO.firstTwoItemsComment(ids);
Map<String, List<ForumDynamicDO>> commentMap = commentList.stream().collect(Collectors.groupingBy(ForumDynamicDO::getRootPath));
// 根据id集合查询图片
List<ForumResourceDO> forumImageList = dynamicDAO.listDynamicPicture(ids);
Map<Integer, List<ForumResourceDO>> ImageMap =
......@@ -203,6 +229,7 @@ public class DynamicServiceImpl implements DynamicService {
.map(
d -> {
DynamicVO dynamicVO = d.buildDynamicVO();
if (ImageMap != null) {
List<ForumResourceDO> forumResourceDOList = ImageMap.get(d.getId());
if (CollectionUtils.isNotEmpty(forumResourceDOList)) {
dynamicVO.setMediaVO(
......@@ -210,6 +237,13 @@ public class DynamicServiceImpl implements DynamicService {
.map(ForumResourceDO::buildMedia)
.collect(Collectors.toList()));
}
}
if (commentMap != null) {
List<ForumDynamicDO> comment = commentMap.get(d.getId().toString());
if (CollectionUtils.isNotEmpty(comment)) {
dynamicVO.setCommentAndReplyVO(comment.stream().limit(2).map(ForumDynamicDO::buildDynamicVO).collect(Collectors.toList()));
}
}
UserAccountSimpleDTO userAccountSimpleDTO =
userAccountInfoMap.get(d.getUserAccountId());
if (userAccountSimpleDTO != null) {
......
......@@ -5,7 +5,6 @@ import com.mmc.csf.common.util.web.HttpHelper;
import com.mmc.csf.common.util.web.HttpsRequestUtil;
import com.mmc.csf.common.util.web.ResultBody;
import com.mmc.csf.common.util.web.ResultEnum;
import com.mmc.csf.common.util.wx.WXMsgPushUtils;
import com.mmc.csf.release.constant.UserSystemConstant;
import com.mmc.csf.release.constant.WxConstant;
import com.mmc.csf.release.service.WxApiService;
......@@ -50,34 +49,10 @@ public class WxApiServiceImpl implements WxApiService {
param.put("scene", 3);
param.put("openid", openid);
String url = "https://api.weixin.qq.com/wxa/msg_sec_check?access_token=" + accessToken;
if (buildParams(param, url)) {
return ResultBody.error(ResultEnum.DYNAMIC_SENSITIVE_INFO);
}
} catch (Exception e) {
e.printStackTrace();
}
return ResultBody.success();
}
/**
* 图片视频识别
*
* @param openid
* @param mediaUrl
* @return
*/
@Override
public ResultBody mediaCheckAsync(String openid, String mediaUrl) {
try {
String accessToken = this.getStableAccessToken();
JSONObject param = new JSONObject();
param.put("media_url", mediaUrl);
param.put("media_type", 2);
param.put("version", 2);
param.put("scene", 3);
param.put("openid", openid);
String url = "https://api.weixin.qq.com/wxa/media_check_async?access_token=" + accessToken;
if (buildParams(param, url)) {
String res = HttpHelper.httpPost(url, param.toString());
JSONObject result = JSONObject.parseObject(res);
JSONObject resultData = result.getJSONObject(WxConstant.RESULT);
if (!resultData.get(WxConstant.LABEL).equals(100)) {
return ResultBody.error(ResultEnum.DYNAMIC_SENSITIVE_INFO);
}
} catch (Exception e) {
......@@ -86,16 +61,6 @@ public class WxApiServiceImpl implements WxApiService {
return ResultBody.success();
}
private boolean buildParams(JSONObject param, String url) throws Exception {
String res = HttpHelper.httpPost(url, param.toString());
JSONObject result = JSONObject.parseObject(res);
JSONObject resultData = result.getJSONObject(WxConstant.RESULT);
if (!resultData.getString(WxConstant.LABEL).equals(WxConstant.LABEL_DATA)) {
return true;
}
return false;
}
@Override
public String getStableAccessToken() {
//token有效期为7200s,需要保存起来,先从redis中获取accessToken,没有则请求获取
......@@ -124,28 +89,4 @@ public class WxApiServiceImpl implements WxApiService {
}
return accessToken;
}
@Override
public String checkSignature(Map<String, String> params) throws Exception {
// 微信发送的请求中 会有四个参数
// 微信加密签名,signature结合了开发者填写的 token 参数和请求中的 timestamp 参数、nonce参数。
String signature = params.get("signature");
// 随机字符串
String echostr = params.get("echostr");
// 时间戳
String timestamp = params.get("timestamp");
// 随机数
String nonce = params.get("nonce");
// 消息推送配置中的 Token(令牌)
String token = "IUAVKBTMMC";
// 验证
String msgSignature = WXMsgPushUtils.getSHA1(token, timestamp, nonce);
// 验证失败
if (!signature.equals(msgSignature)) {
return "false";
}
// 验证成功 将 echostr 原格式返回 ,即可完成验证
return echostr;
}
}
......@@ -14,8 +14,8 @@
</insert>
<insert id="insertDynamic" keyProperty="id" useGeneratedKeys="true"
parameterType="com.mmc.csf.release.entity.forum.ForumDynamicDO">
INSERT INTO forum_dynamic(user_account_id, description, location, lat, lon, root_path)
VALUES (#{userAccountId}, #{description}, #{location}, #{lat}, #{lon}, #{rootPath})
INSERT INTO forum_dynamic(user_account_id, description, location, lat, lon, root_path, check_status)
VALUES (#{userAccountId}, #{description}, #{location}, #{lat}, #{lon}, #{rootPath}, #{checkStatus})
</insert>
<insert id="insertResource">
insert into forum_resource(dynamic_id, resource_url, `type`)
......@@ -193,4 +193,21 @@
from forum_dynamic
where id = #{dynamicId}
</select>
<select id="firstTwoItemsComment" resultType="com.mmc.csf.release.entity.forum.ForumDynamicDO">
SELECT
id,
user_account_id,
description,
create_time,
root_path
FROM
forum_dynamic
<where>
<foreach collection="list" item="item" separator="," open="root_path IN (" close=")">
#{item}
</foreach>
</where>
ORDER BY
create_time DESC
</select>
</mapper>
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论