Browse Source

add(backend) [图文新增]

wangxiao 4 years ago
parent
commit
0826ae60e2

+ 66 - 0
operation-backend/src/main/java/com/idiot/operationbackend/controller/ArticlesController.java

@@ -0,0 +1,66 @@
+package com.idiot.operationbackend.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.idiot.operationbackend.entity.Articles;
+import com.idiot.operationbackend.service.facade.ArticlesService;
+import com.idiot.operationbackend.service.facade.WeChatService;
+import com.idiot.operationbackend.support.JsonResult;
+import com.idiot.operationbackend.util.JwtTokenUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+/**
+ * 图文
+ * @author wang xiao
+ * @date Created in 15:13 2020/9/21
+ */
+
+@RestController
+@RequestMapping
+@Api(value = "ArticlesController", tags ="图文")
+public class ArticlesController {
+
+
+    private final Logger logger = LoggerFactory.getLogger(ArticlesController.class);
+
+    @Autowired
+    private ArticlesService articlesService;
+
+    @Autowired
+    private WeChatService weChatService;
+
+
+    @GetMapping("/{accountId}")
+    @ApiOperation(value = "查询公众号图文")
+    public ResponseEntity<JsonResult<Page<Articles>>> ArticlesPage (@RequestHeader String token,
+                                                                    @PathVariable String accountId,
+                                                                    @RequestParam int page){
+        String userId = JwtTokenUtil.getUserId(token);
+        logger.info("用户:{}查询微信公众号{}图文-------------start",userId,accountId);
+        Page<Articles> materialPage = articlesService.pageArticles(accountId,page);
+        logger.info("用户:{}查询微信公众号{}图文-------------end",userId,accountId);
+        return ResponseEntity.ok(JsonResult.success(materialPage));
+    }
+
+    @PostMapping("/{accountId}")
+    @ApiOperation(value = "新增公众号图文")
+    public ResponseEntity<JsonResult<Boolean>> addArticles (@RequestHeader String token,
+                                                            @PathVariable String accountId,
+                                                            @RequestBody @Valid Articles articles){
+        String userId = JwtTokenUtil.getUserId(token);
+        logger.info("用户:{}新增微信公众号{}图文-------------start",userId,accountId);
+        String wxJson = weChatService.addNews(articles,accountId);
+        Boolean addResult  = articlesService.addArticles(wxJson,articles);
+        logger.info("用户:{}新增微信公众号{}图文-------------end,结果:{}",userId,accountId,addResult);
+        return ResponseEntity.ok(JsonResult.success(addResult));
+    }
+
+
+}

+ 1 - 2
operation-backend/src/main/java/com/idiot/operationbackend/controller/MaterialController.java

@@ -16,7 +16,6 @@ import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.io.File;
 import java.io.IOException;
 import java.time.LocalDateTime;
 import java.util.Arrays;
@@ -45,7 +44,7 @@ public class MaterialController {
 
     @GetMapping("/{accountId}")
     @ApiOperation(value = "查询公众号素材")
-    public ResponseEntity<JsonResult<Page<Material>>> materialList (@RequestHeader String token,
+    public ResponseEntity<JsonResult<Page<Material>>> materialPage (@RequestHeader String token,
                                                           @PathVariable String accountId,
                                                           @RequestParam String type,
                                                           @RequestParam int page){

+ 4 - 4
operation-backend/src/main/java/com/idiot/operationbackend/controller/WeChatController.java

@@ -47,8 +47,6 @@ public class WeChatController {
     private WeChatService weChatService;
 
 
-
-
     @GetMapping("preAuth")
     @ApiOperation(value = "获取预授权码地址,微信认证公众号")
     public ResponseEntity<JsonResult<String>> getPreAuthUrl ()   {
@@ -123,7 +121,8 @@ public class WeChatController {
             boolean ifResult = weChatService.saveOrUpdateWechatAcc(account);
             weChatService.cacheAuthorizerAccessToken(account.getId(),authorizerAccessToken);
             // 重定向到 用户确认中介页面
-            response.sendRedirect(confirmDomain+"?accountId="+account.getId());
+            String param = ifResult?account.getId():null;
+            response.sendRedirect(confirmDomain+"?accountId="+param);
         }catch (Exception e) {
             response.sendRedirect(confirmDomain+"?accountId=");
             logger.error("微信授权回调 ------->失败,authCode is :{},expiresIn:{},error message is :{}",authCode,expiresIn,e.getMessage());
@@ -141,7 +140,8 @@ public class WeChatController {
         boolean ifUpdate = weChatService.confirmAccount(accountId,userId);
         if (ifUpdate){
             logger.error("微信公众号:{}授权,用户:{} 成功确认 ,开始同步用户标签数据",accountId,userId);
-            weChatService.syncAccountUser(accountId);
+            int userCount = weChatService.syncAccountUser(accountId);
+            logger.warn("同步用户数量:{}",userCount);
             weChatService.syncTag(accountId);
         }
 

+ 56 - 8
operation-backend/src/main/java/com/idiot/operationbackend/entity/Articles.java

@@ -3,27 +3,36 @@ package com.idiot.operationbackend.entity;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 
+import javax.validation.constraints.NotEmpty;
+
 /**
  *   图文
  * @author wang xiao
  * @date Created in 10:42 2020/9/21
  */
-@TableName("t_articles")
+@TableName("t_account_articles")
 public class Articles {
 
     @TableId
     private  String id;
 
-    private String imageUrl;
+    private String accountId;
 
-    private String title;
+    @NotEmpty(message = "请选择封面缩略图")
+    private String thumbMediaId;
 
+    @NotEmpty(message = "请填写标题")
+    private String title;
+    @NotEmpty(message = "请填写内容")
     private String content;
-
+    @NotEmpty(message = "请填写内容链接地址")
     private String contentSourceUrl;
 
     private String createTime;
 
+    private Integer showCoverPic;
+
+    private String  mediaId;
 
     public String getId() {
         return id;
@@ -33,12 +42,20 @@ public class Articles {
         this.id = id;
     }
 
-    public String getImageUrl() {
-        return imageUrl;
+    public String getAccountId() {
+        return accountId;
     }
 
-    public void setImageUrl(String imageUrl) {
-        this.imageUrl = imageUrl;
+    public void setAccountId(String accountId) {
+        this.accountId = accountId;
+    }
+
+    public String getThumbMediaId() {
+        return thumbMediaId;
+    }
+
+    public void setThumbMediaId(String thumbMediaId) {
+        this.thumbMediaId = thumbMediaId;
     }
 
     public String getTitle() {
@@ -72,4 +89,35 @@ public class Articles {
     public void setCreateTime(String createTime) {
         this.createTime = createTime;
     }
+
+    public Integer getShowCoverPic() {
+        return showCoverPic;
+    }
+
+    public void setShowCoverPic(Integer showCoverPic) {
+        this.showCoverPic = showCoverPic;
+    }
+
+    public String getMediaId() {
+        return mediaId;
+    }
+
+    public void setMediaId(String mediaId) {
+        this.mediaId = mediaId;
+    }
+
+    @Override
+    public String toString() {
+        return "Articles{" +
+                "id='" + id + '\'' +
+                ", accountId='" + accountId + '\'' +
+                ", thumbMediaId='" + thumbMediaId + '\'' +
+                ", title='" + title + '\'' +
+                ", content='" + content + '\'' +
+                ", contentSourceUrl='" + contentSourceUrl + '\'' +
+                ", createTime='" + createTime + '\'' +
+                ", showCoverPic=" + showCoverPic +
+                ", mediaId='" + mediaId + '\'' +
+                '}';
+    }
 }

+ 22 - 0
operation-backend/src/main/java/com/idiot/operationbackend/service/facade/ArticlesService.java

@@ -1,5 +1,6 @@
 package com.idiot.operationbackend.service.facade;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.idiot.operationbackend.entity.Articles;
 
@@ -8,4 +9,25 @@ import com.idiot.operationbackend.entity.Articles;
  * @date Created in 11:04 2020/9/21
  */
 public interface ArticlesService extends IService<Articles> {
+
+    /**
+     *  查询图文
+     * @author wangxiao
+     * @date 15:24 2020/9/21
+     * @param accountId accountId
+     * @param page page
+     * @return com.baomidou.mybatisplus.extension.plugins.pagination.Page<com.idiot.operationbackend.entity.Articles>
+     */
+    Page<Articles> pageArticles (String accountId,int page);
+
+
+    /**
+     *  新增图文
+     * @author wangxiao
+     * @date 15:48 2020/9/21
+     * @param wxJson wxJson
+     * @param articles articles
+     * @return Boolean
+     */
+    Boolean addArticles(String wxJson,Articles articles);
 }

+ 50 - 40
operation-backend/src/main/java/com/idiot/operationbackend/service/facade/WeChatService.java

@@ -1,6 +1,7 @@
 package com.idiot.operationbackend.service.facade;
 
 import com.idiot.operationbackend.entity.Account;
+import com.idiot.operationbackend.entity.Articles;
 import com.idiot.operationbackend.support.Constants;
 import com.idiot.operationbackend.support.WxInputStreamResource;
 import org.dom4j.Document;
@@ -145,9 +146,8 @@ public interface WeChatService {
    *  同步用户数据
    * @author wangxiao
    * @date 18:51 2020/9/14
-   * @param accountId
-   * @param openIds
-   * @return void
+   * @param accountId accountId
+   * @param openIds openIds
    */
   void syncUserTask(String accountId,List<String> openIds);
 
@@ -157,7 +157,7 @@ public interface WeChatService {
    *  同步用户
    * @author wangxiao
    * @date 14:10 2020/9/14
-   * @param accountId
+   * @param accountId accountId
    * @return int
    */
   int syncAccountUser(String accountId);
@@ -166,8 +166,7 @@ public interface WeChatService {
    *  同步标签信息
    * @author wangxiao
    * @date 20:16 2020/9/14
-   * @param accountId
-   * @return void
+   * @param accountId accountId
    */
   void syncTag(String accountId);
 
@@ -176,8 +175,8 @@ public interface WeChatService {
    * 获取粉丝信息
    * @author wangxiao
    * @date 19:09 2020/9/14
-   * @param accountId
-   * @param openId
+   * @param accountId accountId
+   * @param openId openId
    * @return java.lang.String
    */
   String getFansInfo(String accountId,String openId);
@@ -187,8 +186,8 @@ public interface WeChatService {
    *  微信授权后确认公众号
    * @author wangxiao
    * @date 20:12 2020/9/14
-   * @param accountId
-   * @param userId
+   * @param accountId accountId
+   * @param userId userId
    * @return boolean
    */
   boolean confirmAccount(String accountId,String userId);
@@ -198,7 +197,7 @@ public interface WeChatService {
    *  获取微信用户增减数据
    * @author wangxiao
    * @date 17:57 2020/9/15
-   * @param accountId
+   * @param accountId accountId
    * @param endDate  结束日期
    * @param startDate  开始日期
    * @return java.lang.String
@@ -210,9 +209,9 @@ public interface WeChatService {
    *  查询汇总数据
    * @author wangxiao
    * @date 20:20 2020/9/15
-   * @param accountId
-   * @param startDate
-   * @param endDate
+   * @param accountId accountId
+   * @param startDate startDate
+   * @param endDate endDate
    * @return java.lang.String
    */
   String getFansCumulate(String accountId,String startDate,String endDate);
@@ -222,9 +221,9 @@ public interface WeChatService {
    *  查询图文阅读数据
    * @author wangxiao
    * @date 16:16 2020/9/17
-   * @param accountId
-   * @param startDate
-   * @param endDate
+   * @param accountId accountId
+   * @param startDate startDate
+   * @param endDate endDate
    * @return java.lang.String
    */
   String getArticleSummary(String accountId,String startDate,String endDate );
@@ -233,9 +232,9 @@ public interface WeChatService {
    *  添加备注
    * @author wangxiao
    * @date 19:38 2020/9/17
-   * @param accountId
-   * @param openId
-   * @param remark
+   * @param accountId accountId
+   * @param openId openId
+   * @param remark remark
    * @return java.lang.String
    */
   boolean updateRemark(String accountId,String openId,String remark);
@@ -244,8 +243,8 @@ public interface WeChatService {
    *  创建标签
    * @author wangxiao
    * @date 20:05 2020/9/17
-   * @param accountId
-   * @param tagLabel
+   * @param accountId accountId
+   * @param tagLabel tagLabel
    * @return boolean
    */
   boolean createTag (String accountId,String tagLabel);
@@ -255,9 +254,9 @@ public interface WeChatService {
    *  用户打标签
    * @author wangxiao
    * @date 20:36 2020/9/17
-   * @param accountId
-   * @param openIds
-   * @param wxId
+   * @param accountId accountId
+   * @param openIds openIds
+   * @param wxId wxId
    * @return boolean
    */
   boolean addUserTag(String accountId,List<String> openIds,int wxId);
@@ -267,9 +266,9 @@ public interface WeChatService {
    *  用户移除标签
    * @author wangxiao
    * @date 20:36 2020/9/17
-   * @param accountId
-   * @param openIds
-   * @param wxId
+   * @param accountId accountId
+   * @param openIds openIds
+   * @param wxId wxId
    * @return boolean
    */
   boolean removeUserTag(String accountId,List<String> openIds,int wxId);
@@ -279,9 +278,9 @@ public interface WeChatService {
    *  编辑标签
    * @author wangxiao
    * @date 10:32 2020/9/18
-   * @param accountId
-   * @param wxId
-   * @param name
+   * @param accountId accountId
+   * @param wxId wxId
+   * @param name name
    * @return boolean
    */
   boolean upTag(String accountId,int wxId,String name);
@@ -291,16 +290,27 @@ public interface WeChatService {
      *  上传其他素材
      * @author wangxiao
      * @date 14:20 2020/9/21
-     * @param accountId
-     * @param type
-     * @param resource
-     * @param title
-     * @param introduction
+     * @param accountId accountId
+     * @param type type
+     * @param resource resource
+     * @param title  param
+     * @param introduction introduction
      * @return java.lang.String
      */
    String addMaterial(String accountId, String type, WxInputStreamResource resource, String title, String introduction);
 
 
+   /**
+    *  新增图文素材
+    * @author wangxiao
+    * @date 15:59 2020/9/21
+    * @param articles articles
+    * @param accountId accountId
+    * @return java.lang.String
+    */
+   String addNews (Articles articles,String accountId);
+
+
 
 
 
@@ -308,7 +318,7 @@ public interface WeChatService {
    * 不支持的消息
    * @author wangxiao
    * @date 15:27 2020/7/1
-   * @param param
+   * @param param param
    * @return java.lang.String
    */
   default String unSupportedMessage(Map<String,String> param) {
@@ -321,7 +331,7 @@ public interface WeChatService {
    *  微信消息转换成map(非加密)
    * @author wangxiao
    * @date 14:10 2020/9/11
-   * @param inputStream
+   * @param inputStream inputStream
    * @return java.util.Map<java.lang.String,java.lang.String>
    */
   default Map<String, String> xmlToMap(InputStream inputStream) {
@@ -339,7 +349,7 @@ public interface WeChatService {
    *  微信消息转换成map(非加密)
    * @author wangxiao
    * @date 14:10 2020/9/11
-   * @param data
+   * @param data data
    * @return java.util.Map<java.lang.String,java.lang.String>
    */
   default Map<String, String> xmlToMap(String data) {
@@ -359,7 +369,7 @@ public interface WeChatService {
    *  document 转 map
    * @author wangxiao
    * @date 19:36 2020/9/11
-   * @param document
+   * @param document document
    * @return java.util.Map<java.lang.String,java.lang.String>
    */
   default Map<String,String> parseDocument (Document document) {

+ 30 - 0
operation-backend/src/main/java/com/idiot/operationbackend/service/impl/ArticlesServiceImpl.java

@@ -1,10 +1,18 @@
 package com.idiot.operationbackend.service.impl;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.idiot.operationbackend.entity.Articles;
 import com.idiot.operationbackend.mappers.ArticlesMapper;
 import com.idiot.operationbackend.service.facade.ArticlesService;
 import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import java.util.Objects;
 
 /**
  * @author wang xiao
@@ -13,4 +21,26 @@ import org.springframework.stereotype.Service;
 @Service
 public class ArticlesServiceImpl extends ServiceImpl<ArticlesMapper, Articles>
         implements ArticlesService {
+
+
+    @Override
+    public Page<Articles> pageArticles(String accountId, int page) {
+        Page<Articles> articlesPage = new Page<>(page,10);
+        LambdaQueryWrapper<Articles> queryWrapper = Wrappers.<Articles>lambdaQuery()
+                .eq(Articles::getAccountId,accountId)
+                .orderByDesc(Articles::getCreateTime);
+        return page(articlesPage,queryWrapper);
+    }
+
+
+    @Override
+    public Boolean addArticles(String wxJson, Articles articles) {
+        JSONObject jsonObject = JSON.parseObject(wxJson);
+        if (StringUtils.isEmpty(wxJson) || Objects.isNull(articles)){
+            return false;
+        }
+        String mediaId = jsonObject.getString("media_id");
+        articles.setMediaId(mediaId);
+        return save(articles);
+    }
 }

+ 31 - 6
operation-backend/src/main/java/com/idiot/operationbackend/service/impl/WeChatServiceImpl.java

@@ -9,6 +9,7 @@ import com.idiot.operationbackend.config.PlatformProperties;
 import com.idiot.operationbackend.entity.Account;
 import com.idiot.operationbackend.entity.AccountFans;
 import com.idiot.operationbackend.entity.AccountTag;
+import com.idiot.operationbackend.entity.Articles;
 import com.idiot.operationbackend.handler.SyncUserTask;
 import com.idiot.operationbackend.service.facade.AccountFansService;
 import com.idiot.operationbackend.service.facade.AccountService;
@@ -604,14 +605,38 @@ public class WeChatServiceImpl implements WeChatService, InitializingBean {
             p.put("introduction", introduction);
             data.add("description", p.toString());
         }
-        HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(data,
-                httpHeaders);
+        HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(data,httpHeaders);
         logger.info("微信上传素材,accountId:{},type:{}----start,时间:{}",accountId,type, LocalDateTime.now().toString());
-        String resultJSON = restTemplate.postForObject(requestUrl, requestEntity, String.class);
-        logger.info("微信上传素材,accountId:{},type:{}----end,时间:{},微信返回结果:{}",accountId,type, LocalDateTime.now().toString(),resultJSON);
-        return resultJSON;
+        String resultJson = restTemplate.postForObject(requestUrl, requestEntity, String.class);
+        logger.info("微信上传素材,accountId:{},type:{}----end,时间:{},微信返回结果:{}",accountId,type,
+                LocalDateTime.now().toString(),resultJson);
+        return resultJson;
     }
 
 
-
+    @Override
+    public String addNews(Articles articles, String accountId) {
+        String requestUrl =  "https://api.weixin.qq.com/cgi-bin/material/add_news?access_token=%s";
+        String accessToken = getAuthorizerAccessToken(accountId);
+        requestUrl = String.format(requestUrl,accessToken);
+        MultiValueMap<String,Object> valueMap = new LinkedMultiValueMap<>();
+        JSONArray jsonArray = new JSONArray(1);
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("title",articles.getTitle());
+        jsonObject.put("thumb_media_id",articles.getThumbMediaId());
+        jsonObject.put("show_cover_pic",articles.getShowCoverPic());
+        jsonObject.put("content",articles.getContent());
+        jsonObject.put("content_source_url",articles.getContentSourceUrl());
+        jsonArray.add(jsonObject);
+        valueMap.add("articles",jsonArray.toJSONString());
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.setContentType(MediaType.APPLICATION_JSON);
+        HttpEntity<MultiValueMap<String,Object>> httpEntity = new HttpEntity<>(valueMap,httpHeaders);
+        logger.info("微信上传图文素材,accountId:{},articles:{}----start,时间:{}",accountId,articles.toString(),
+                LocalDateTime.now().toString());
+        String respJson = restTemplate.postForObject(requestUrl,httpEntity,String.class);
+        logger.info("微信上传图文素材,accountId:{},articles:{}----end,时间:{},微信返回:{}",accountId,articles.toString(),
+                LocalDateTime.now().toString(),respJson);
+        return respJson;
+    }
 }

+ 8 - 5
sql/dataBase.sql

@@ -235,15 +235,18 @@ CREATE TABLE `t_account_material`  (
 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '素材' ROW_FORMAT = Dynamic;
 
 -- ----------------------------
--- Table structure for t_articles 图文
+-- Table structure for t_account_articles 图文
 -- ----------------------------
-DROP TABLE IF EXISTS `t_articles`;
-CREATE TABLE `t_articles`  (
+DROP TABLE IF EXISTS `t_account_articles`;
+CREATE TABLE `t_account_articles`  (
   `id` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
-  `image_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '图片地址',
+  `account_id` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '公众号id',
+  `thumb_media_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '缩略图media id',
   `title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '标题',
   `content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '内容',
   `content_source_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '链接地址',
+  `show_cover_pic` int(0) NULL DEFAULT 1 COMMENT '是否显示封面',
   `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
+  `media_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '微信media id',
   PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '图文' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '公众号图文' ROW_FORMAT = Dynamic;