提交 7bd5136f 作者: xiaowang

动态审核

上级 226e4486
...@@ -34,6 +34,8 @@ public class UserAccountSimpleDTO implements Serializable { ...@@ -34,6 +34,8 @@ public class UserAccountSimpleDTO implements Serializable {
private String nickName; private String nickName;
@ApiModelProperty(value = "用户头像") @ApiModelProperty(value = "用户头像")
private String userImg; private String userImg;
@ApiModelProperty(value = "openid")
private String openid;
@ApiModelProperty(value = "用户性别:0未知、1男、2女") @ApiModelProperty(value = "用户性别:0未知、1男、2女")
private Integer userSex; private Integer userSex;
@ApiModelProperty(value = "用户邮箱") @ApiModelProperty(value = "用户邮箱")
......
...@@ -402,7 +402,7 @@ public enum ResultEnum implements BaseErrorInfoInterface { ...@@ -402,7 +402,7 @@ public enum ResultEnum implements BaseErrorInfoInterface {
INDUSTRY_NEWS_TITLE_EXISTS("40200", "文章标题存在"), 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; ...@@ -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.CommentVO;
import com.mmc.csf.release.forum.vo.DynamicVO; import com.mmc.csf.release.forum.vo.DynamicVO;
import com.mmc.csf.release.service.DynamicService; import com.mmc.csf.release.service.DynamicService;
import com.mmc.csf.release.service.WxApiService;
import io.swagger.annotations.*; import io.swagger.annotations.*;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
...@@ -22,30 +21,13 @@ public class DynamicController extends BaseController { ...@@ -22,30 +21,13 @@ public class DynamicController extends BaseController {
@Resource @Resource
private DynamicService dynamicService; private DynamicService dynamicService;
@Resource
private WxApiService wxApiService;
@ApiOperation(value = "动态发布") @ApiOperation(value = "动态发布")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)}) @ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@PostMapping("/publish") @PostMapping("/publish")
public ResultBody publishDynamic(@RequestBody DynamicVO dynamicVO, HttpServletRequest request) { public ResultBody publishDynamic(@RequestBody DynamicVO dynamicVO, HttpServletRequest request) {
return dynamicService.insertDynamic( return dynamicService.insertDynamic(
dynamicVO, this.getUserLoginInfoFromRedis(request).getUserAccountId()); dynamicVO, this.getUserLoginInfoFromRedis(request).getUserAccountId(), request);
}
// @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";
} }
@ApiOperation(value = "点赞或取消点赞") @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; ...@@ -10,7 +10,6 @@ import java.util.List;
/** /**
* @Author LW * @Author LW
*
* @date 2023/5/15 10:29 概要:动态信息数据访问层 * @date 2023/5/15 10:29 概要:动态信息数据访问层
*/ */
@Mapper @Mapper
...@@ -138,8 +137,11 @@ public interface DynamicDAO { ...@@ -138,8 +137,11 @@ public interface DynamicDAO {
/** /**
* 查询动态详情 * 查询动态详情
*
* @param dynamicId * @param dynamicId
* @return * @return
*/ */
ForumDynamicDO getDynamicInfoById(Integer dynamicId); ForumDynamicDO getDynamicInfoById(Integer dynamicId);
List<ForumDynamicDO> firstTwoItemsComment(List<Integer> ids);
} }
...@@ -23,25 +23,45 @@ import java.math.BigDecimal; ...@@ -23,25 +23,45 @@ import java.math.BigDecimal;
@Accessors(chain = true) @Accessors(chain = true)
public class ForumDynamicDO extends BaseDO implements Serializable { public class ForumDynamicDO extends BaseDO implements Serializable {
private static final long serialVersionUID = 570379773690905364L; private static final long serialVersionUID = 570379773690905364L;
/** 版本字段 */ /**
* 版本字段
*/
private Integer version; private Integer version;
/** 发布用户ID */ /**
* 发布用户ID
*/
private Integer userAccountId; private Integer userAccountId;
/** 动态描述 */ /**
* 动态描述
*/
private String description; private String description;
/** 发布动态具体位置 */ /**
* 发布动态具体位置
*/
private String location; private String location;
/** 发布动态纬度 */ /**
* 发布动态纬度
*/
private BigDecimal lat; private BigDecimal lat;
/** 发布动态经度 */ /**
* 发布动态经度
*/
private BigDecimal lon; private BigDecimal lon;
/** 点赞数 */ /**
* 点赞数
*/
private Integer likesCount; private Integer likesCount;
/** 评论数 */ /**
* 评论数
*/
private Integer commentsCount; private Integer commentsCount;
/** 记录父节点id */ /**
* 记录父节点id
*/
private String rootPath; private String rootPath;
private Integer checkStatus;
public ForumDynamicDO(DynamicVO dynamicVO) { public ForumDynamicDO(DynamicVO dynamicVO) {
this.description = dynamicVO.getDescription(); this.description = dynamicVO.getDescription();
this.location = dynamicVO.getLocation(); this.location = dynamicVO.getLocation();
......
...@@ -9,7 +9,6 @@ import javax.servlet.http.HttpServletRequest; ...@@ -9,7 +9,6 @@ import javax.servlet.http.HttpServletRequest;
/** /**
* @Author LW 测试合并 * @Author LW 测试合并
*
* @date 2023/5/15 10:29 概要:动态信息service层 * @date 2023/5/15 10:29 概要:动态信息service层
*/ */
public interface DynamicService { public interface DynamicService {
...@@ -19,7 +18,7 @@ public interface DynamicService { ...@@ -19,7 +18,7 @@ public interface DynamicService {
* @param dynamicVO 动态 * @param dynamicVO 动态
* @return {@link ResultBody} * @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; ...@@ -2,8 +2,6 @@ package com.mmc.csf.release.service;
import com.mmc.csf.common.util.web.ResultBody; import com.mmc.csf.common.util.web.ResultBody;
import java.util.Map;
/** /**
* @Author LW * @Author LW
* @date 2023/7/12 13:44 * @date 2023/7/12 13:44
...@@ -18,8 +16,4 @@ public interface WxApiService { ...@@ -18,8 +16,4 @@ public interface WxApiService {
* @return * @return
*/ */
String getStableAccessToken() throws Exception; 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; ...@@ -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.MediaVO;
import com.mmc.csf.release.forum.vo.UserBaseInfoVO; import com.mmc.csf.release.forum.vo.UserBaseInfoVO;
import com.mmc.csf.release.service.DynamicService; import com.mmc.csf.release.service.DynamicService;
import com.mmc.csf.release.service.WxApiService;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -45,22 +46,38 @@ public class DynamicServiceImpl implements DynamicService { ...@@ -45,22 +46,38 @@ public class DynamicServiceImpl implements DynamicService {
private CommentDAO commentDAO; private CommentDAO commentDAO;
@Autowired @Autowired
private UserAppApi userAppApi; private UserAppApi userAppApi;
@Resource
private WxApiService wxApiService;
@Override @Override
@Transactional(rollbackFor = Exception.class) @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 forumDynamicDO = new ForumDynamicDO(dynamicVO);
forumDynamicDO.setRootPath(null); forumDynamicDO.setRootPath(null);
forumDynamicDO.setUserAccountId(userAccountId); forumDynamicDO.setUserAccountId(userAccountId);
dynamicDAO.insertDynamic(forumDynamicDO);
// 插入动态资源 // 插入动态资源
if (CollectionUtils.isNotEmpty(dynamicVO.getMediaVO())) { if (CollectionUtils.isNotEmpty(dynamicVO.getMediaVO())) {
forumDynamicDO.setCheckStatus(0);
dynamicDAO.insertDynamic(forumDynamicDO);
for (MediaVO mediaVO : dynamicVO.getMediaVO()) { for (MediaVO mediaVO : dynamicVO.getMediaVO()) {
dynamicDAO.insertResource(forumDynamicDO.getId(), mediaVO.getType(), mediaVO.getUrl()); 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 @Override
...@@ -84,6 +101,9 @@ public class DynamicServiceImpl implements DynamicService { ...@@ -84,6 +101,9 @@ public class DynamicServiceImpl implements DynamicService {
if (forumDynamicDO == null) { if (forumDynamicDO == null) {
return ResultBody.error("动态不存在或已删除"); return ResultBody.error("动态不存在或已删除");
} }
// todo openid 需要获取
ResultBody resultBody = wxApiService.msgSecCheck("ohQPS5GV_ulnz4-PeftQlqktGLvw", commentVO.getContent());
if (resultBody.getCode().equals("200")) {
// 新增评论 // 新增评论
ForumDynamicDO comment = new ForumDynamicDO(); ForumDynamicDO comment = new ForumDynamicDO();
comment.setUserAccountId(userAccountId); comment.setUserAccountId(userAccountId);
...@@ -94,6 +114,9 @@ public class DynamicServiceImpl implements DynamicService { ...@@ -94,6 +114,9 @@ public class DynamicServiceImpl implements DynamicService {
// 修改评论数量 // 修改评论数量
dynamicDAO.updateDynamicCommentCount(commentVO.getDynamicId(), forumDynamicDO.getVersion()); dynamicDAO.updateDynamicCommentCount(commentVO.getDynamicId(), forumDynamicDO.getVersion());
return ResultBody.success(); return ResultBody.success();
} else {
return resultBody;
}
} }
@Override @Override
...@@ -181,6 +204,9 @@ public class DynamicServiceImpl implements DynamicService { ...@@ -181,6 +204,9 @@ public class DynamicServiceImpl implements DynamicService {
// 动态id集合 // 动态id集合
List<Integer> ids = List<Integer> ids =
forumDynamicList.stream().map(ForumDynamicDO::getId).collect(Collectors.toList()); 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集合查询图片 // 根据id集合查询图片
List<ForumResourceDO> forumImageList = dynamicDAO.listDynamicPicture(ids); List<ForumResourceDO> forumImageList = dynamicDAO.listDynamicPicture(ids);
Map<Integer, List<ForumResourceDO>> ImageMap = Map<Integer, List<ForumResourceDO>> ImageMap =
...@@ -203,6 +229,7 @@ public class DynamicServiceImpl implements DynamicService { ...@@ -203,6 +229,7 @@ public class DynamicServiceImpl implements DynamicService {
.map( .map(
d -> { d -> {
DynamicVO dynamicVO = d.buildDynamicVO(); DynamicVO dynamicVO = d.buildDynamicVO();
if (ImageMap != null) {
List<ForumResourceDO> forumResourceDOList = ImageMap.get(d.getId()); List<ForumResourceDO> forumResourceDOList = ImageMap.get(d.getId());
if (CollectionUtils.isNotEmpty(forumResourceDOList)) { if (CollectionUtils.isNotEmpty(forumResourceDOList)) {
dynamicVO.setMediaVO( dynamicVO.setMediaVO(
...@@ -210,6 +237,13 @@ public class DynamicServiceImpl implements DynamicService { ...@@ -210,6 +237,13 @@ public class DynamicServiceImpl implements DynamicService {
.map(ForumResourceDO::buildMedia) .map(ForumResourceDO::buildMedia)
.collect(Collectors.toList())); .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 = UserAccountSimpleDTO userAccountSimpleDTO =
userAccountInfoMap.get(d.getUserAccountId()); userAccountInfoMap.get(d.getUserAccountId());
if (userAccountSimpleDTO != null) { if (userAccountSimpleDTO != null) {
......
...@@ -5,7 +5,6 @@ import com.mmc.csf.common.util.web.HttpHelper; ...@@ -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.HttpsRequestUtil;
import com.mmc.csf.common.util.web.ResultBody; import com.mmc.csf.common.util.web.ResultBody;
import com.mmc.csf.common.util.web.ResultEnum; 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.UserSystemConstant;
import com.mmc.csf.release.constant.WxConstant; import com.mmc.csf.release.constant.WxConstant;
import com.mmc.csf.release.service.WxApiService; import com.mmc.csf.release.service.WxApiService;
...@@ -50,34 +49,10 @@ public class WxApiServiceImpl implements WxApiService { ...@@ -50,34 +49,10 @@ public class WxApiServiceImpl implements WxApiService {
param.put("scene", 3); param.put("scene", 3);
param.put("openid", openid); param.put("openid", openid);
String url = "https://api.weixin.qq.com/wxa/msg_sec_check?access_token=" + accessToken; String url = "https://api.weixin.qq.com/wxa/msg_sec_check?access_token=" + accessToken;
if (buildParams(param, url)) { String res = HttpHelper.httpPost(url, param.toString());
return ResultBody.error(ResultEnum.DYNAMIC_SENSITIVE_INFO); JSONObject result = JSONObject.parseObject(res);
} JSONObject resultData = result.getJSONObject(WxConstant.RESULT);
} catch (Exception e) { if (!resultData.get(WxConstant.LABEL).equals(100)) {
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)) {
return ResultBody.error(ResultEnum.DYNAMIC_SENSITIVE_INFO); return ResultBody.error(ResultEnum.DYNAMIC_SENSITIVE_INFO);
} }
} catch (Exception e) { } catch (Exception e) {
...@@ -86,16 +61,6 @@ public class WxApiServiceImpl implements WxApiService { ...@@ -86,16 +61,6 @@ public class WxApiServiceImpl implements WxApiService {
return ResultBody.success(); 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 @Override
public String getStableAccessToken() { public String getStableAccessToken() {
//token有效期为7200s,需要保存起来,先从redis中获取accessToken,没有则请求获取 //token有效期为7200s,需要保存起来,先从redis中获取accessToken,没有则请求获取
...@@ -124,28 +89,4 @@ public class WxApiServiceImpl implements WxApiService { ...@@ -124,28 +89,4 @@ public class WxApiServiceImpl implements WxApiService {
} }
return accessToken; 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 @@ ...@@ -14,8 +14,8 @@
</insert> </insert>
<insert id="insertDynamic" keyProperty="id" useGeneratedKeys="true" <insert id="insertDynamic" keyProperty="id" useGeneratedKeys="true"
parameterType="com.mmc.csf.release.entity.forum.ForumDynamicDO"> parameterType="com.mmc.csf.release.entity.forum.ForumDynamicDO">
INSERT INTO forum_dynamic(user_account_id, description, location, lat, lon, root_path) INSERT INTO forum_dynamic(user_account_id, description, location, lat, lon, root_path, check_status)
VALUES (#{userAccountId}, #{description}, #{location}, #{lat}, #{lon}, #{rootPath}) VALUES (#{userAccountId}, #{description}, #{location}, #{lat}, #{lon}, #{rootPath}, #{checkStatus})
</insert> </insert>
<insert id="insertResource"> <insert id="insertResource">
insert into forum_resource(dynamic_id, resource_url, `type`) insert into forum_resource(dynamic_id, resource_url, `type`)
...@@ -193,4 +193,21 @@ ...@@ -193,4 +193,21 @@
from forum_dynamic from forum_dynamic
where id = #{dynamicId} where id = #{dynamicId}
</select> </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> </mapper>
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论