Explorar o código

:zap: 微信多公众号开发

Aron %!s(int64=6) %!d(string=hai) anos
pai
achega
2e4c59b094
Modificáronse 22 ficheiros con 121 adicións e 37 borrados
  1. 3 1
      src/main/java/com/ifast/common/base/AdminBaseController.java
  2. 2 0
      src/main/java/com/ifast/common/type/EnumErrorCode.java
  3. 14 1
      src/main/java/com/ifast/wxmp/aspect/BoundAppIdAspect.java
  4. 2 1
      src/main/java/com/ifast/wxmp/controller/MpArticleImageController.java
  5. 2 1
      src/main/java/com/ifast/wxmp/controller/MpArticleNewsController.java
  6. 3 2
      src/main/java/com/ifast/wxmp/controller/MpArticleTxtController.java
  7. 7 3
      src/main/java/com/ifast/wxmp/controller/MpMenuController.java
  8. 8 5
      src/main/java/com/ifast/wxmp/controller/mp/WxMenuController.java
  9. 1 1
      src/main/java/com/ifast/wxmp/service/MpMenuService.java
  10. 13 3
      src/main/java/com/ifast/wxmp/service/impl/MpMenuServiceImpl.java
  11. 4 0
      src/main/resources/static/js/appjs/wxmp/mpArticleImage/add.js
  12. 4 0
      src/main/resources/static/js/appjs/wxmp/mpArticleNews/add.js
  13. 11 0
      src/main/resources/static/js/appjs/wxmp/mpArticleTxt/add.js
  14. 1 1
      src/main/resources/static/js/appjs/wxmp/mpConfig/mpConfig.js
  15. 5 6
      src/main/resources/static/js/appjs/wxmp/mpFans/mpFans.js
  16. 15 0
      src/main/resources/static/js/appjs/wxmp/mpMenu/add.js
  17. 7 8
      src/main/resources/static/js/appjs/wxmp/mpMenu/mpMenu.js
  18. 13 4
      src/main/resources/static/js/contabs.js
  19. 1 0
      src/main/resources/templates/wxmp/mpArticleImage/add.html
  20. 1 0
      src/main/resources/templates/wxmp/mpArticleNews/add.html
  21. 1 0
      src/main/resources/templates/wxmp/mpArticleTxt/add.html
  22. 3 0
      src/main/resources/templates/wxmp/mpMenu/add.html

+ 3 - 1
src/main/java/com/ifast/common/base/AdminBaseController.java

@@ -57,7 +57,9 @@ public abstract class AdminBaseController {
         if(StringUtils.isNotBlank(sort)) {
         	page.setOrderByField(sort);
         	String order = HttpContextUtils.getHttpServletRequest().getParameter("order");
-        	if(StringUtils.isNotBlank(order)) page.setAsc("asc".equalsIgnoreCase(order));
+        	if(StringUtils.isNotBlank(order)){
+        	    page.setAsc("asc".equalsIgnoreCase(order));
+            }
         }
         return page;
     }

+ 2 - 0
src/main/java/com/ifast/common/type/EnumErrorCode.java

@@ -49,6 +49,8 @@ public enum EnumErrorCode {
     , apiSmsSendFailed4ContentNull(44101, "短信发送失败")
     , apiSmsCodeInvalid(44110, "短信验证码错误")
 
+    , apiWxMpAppIdError(44200, "appId不合法")
+
     ;
 
     private int code;

+ 14 - 1
src/main/java/com/ifast/wxmp/aspect/BoundAppIdAspect.java

@@ -22,12 +22,18 @@ import org.springframework.stereotype.Component;
 @Slf4j
 public class BoundAppIdAspect {
 
-    @Pointcut("execution(* com.ifast.wxmp.controller.*.*(..))")
+//    @Autowired
+//    private MpConfigService mpConfigService;
+
+    @Pointcut("execution(* com.ifast.wxmp.controller..*.*(..))")
     public void pointCut() {}
 
     @Around("pointCut()")
     public Object around(ProceedingJoinPoint point) throws Throwable {
         String appId = HttpContextUtils.getHttpServletRequest().getParameter("appId");
+
+        checkAppId(appId);
+
         if(StringUtils.isNotBlank(appId)){
             if(log.isDebugEnabled()){
                 log.debug("WxMpConfigHolder.setCurrentAppId(), appId : {}", appId);
@@ -38,4 +44,11 @@ public class BoundAppIdAspect {
         return result;
     }
 
+    private void checkAppId(String appId) {
+//        List<MpConfigDO> mpConfigs = mpConfigService.findByKv("appId", appId);
+//        if(mpConfigs.isEmpty()){
+//            throw new IFastApiException(EnumErrorCode.apiWxMpAppIdError.getCodeStr());
+//        }
+    }
+
 }

+ 2 - 1
src/main/java/com/ifast/wxmp/controller/MpArticleImageController.java

@@ -66,7 +66,8 @@ public class MpArticleImageController extends AdminBaseController {
 	@ResponseBody
 	@PostMapping("/save")
 	@RequiresPermissions("wxmp:mpArticleImage:add")
-	public Result<String> save( MpArticleDO mpArticle){
+	public Result<String> save( MpArticleDO mpArticle, String appId){
+		mpArticle.setMpId(mpConfigService.findOneByKv("appId", appId).getId());
 		mpArticleService.insert(mpArticle);
         return Result.ok();
 	}

+ 2 - 1
src/main/java/com/ifast/wxmp/controller/MpArticleNewsController.java

@@ -65,7 +65,8 @@ public class MpArticleNewsController extends AdminBaseController {
     @ResponseBody
     @PostMapping("/save")
     @RequiresPermissions("wxmp:mpArticleNews:add")
-    public Result<String> save(MpArticleDO mpArticle) {
+    public Result<String> save(MpArticleDO mpArticle, String appId) {
+        mpArticle.setMpId(mpConfigService.findOneByKv("appId", appId).getId());
         mpArticleService.insert(mpArticle);
         return Result.ok();
     }

+ 3 - 2
src/main/java/com/ifast/wxmp/controller/MpArticleTxtController.java

@@ -67,8 +67,9 @@ public class MpArticleTxtController extends AdminBaseController {
 	@ResponseBody
 	@PostMapping("/save")
 	@RequiresPermissions("wxmp:mpArticleTxt:add")
-	public Result<String> save( MpArticleDO mpArticle){
+	public Result<String> save( MpArticleDO mpArticle, String appId){
 	    mpArticle.setCreatedate(new Date());
+		mpArticle.setMpId(mpConfigService.findOneByKv("appId", appId).getId());
 		mpArticleService.insert(mpArticle);
         return Result.ok();
 	}
@@ -78,7 +79,7 @@ public class MpArticleTxtController extends AdminBaseController {
 	@RequestMapping("/update")
 	@RequiresPermissions("wxmp:mpArticleTxt:edit")
 	public Result<String>  update( MpArticleDO mpArticle){
-	    mpArticle.setUpdatedate(new Date());
+		mpArticle.setUpdatedate(new Date());
 		boolean update = mpArticleService.updateById(mpArticle);
 		return update ? Result.ok() : Result.fail();
 	}

+ 7 - 3
src/main/java/com/ifast/wxmp/controller/MpMenuController.java

@@ -8,6 +8,7 @@ import com.ifast.common.base.AdminBaseController;
 import com.ifast.common.domain.Tree;
 import com.ifast.common.utils.Result;
 import com.ifast.wxmp.domain.MpMenuDO;
+import com.ifast.wxmp.service.MpConfigService;
 import com.ifast.wxmp.service.MpMenuService;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -30,6 +31,8 @@ import java.util.Objects;
 public class MpMenuController extends AdminBaseController {
     @Autowired
     private MpMenuService mpMenuService;
+    @Autowired
+    private MpConfigService mpConfigService;
 
     @GetMapping()
     @RequiresPermissions("wxmp:mpMenu:mpMenu")
@@ -40,7 +43,8 @@ public class MpMenuController extends AdminBaseController {
     @ResponseBody
     @GetMapping("/list")
     @RequiresPermissions("wxmp:mpMenu:mpMenu")
-    public List<MpMenuDO> list(MpMenuDO mpMenuDTO) {
+    public List<MpMenuDO> list(MpMenuDO mpMenuDTO, String appId) {
+        mpMenuDTO.setMpid(mpConfigService.findOneByKv("appId", appId).getId());
         Wrapper<MpMenuDO> wrapper = new EntityWrapper<>(mpMenuDTO).orderBy("parentidx, sort");
         List<MpMenuDO> list = mpMenuService.selectList(wrapper);
         return list;
@@ -87,8 +91,8 @@ public class MpMenuController extends AdminBaseController {
     @ResponseBody
     @PostMapping("/save")
     @RequiresPermissions("wxmp:mpMenu:add")
-    public Result<String> save(MpMenuDO mpMenu) {
-        mpMenuService.saveMenu(mpMenu);
+    public Result<String> save(MpMenuDO mpMenu, String appId) {
+        mpMenuService.saveMenu(mpMenu, appId);
         return Result.ok();
     }
 

+ 8 - 5
src/main/java/com/ifast/wxmp/controller/mp/WxMenuController.java

@@ -6,6 +6,7 @@ import com.ifast.common.utils.JSONUtils;
 import com.ifast.common.utils.Result;
 import com.ifast.wxmp.domain.MpMenuDO;
 import com.ifast.wxmp.pojo.type.Const;
+import com.ifast.wxmp.service.MpConfigService;
 import com.ifast.wxmp.service.MpMenuService;
 import com.ifast.wxmp.service.WeixinService;
 import lombok.extern.slf4j.Slf4j;
@@ -15,7 +16,7 @@ import me.chanjar.weixin.common.bean.menu.WxMenuButton;
 import me.chanjar.weixin.common.exception.WxErrorException;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
@@ -39,12 +40,14 @@ public class WxMenuController extends AdminBaseController {
     private WeixinService wxService;
     @Autowired
     private MpMenuService mpMenuService;
+    @Autowired
+    private MpConfigService mpConfigService;
 
-    @RequestMapping("/sync/{appId}")
-    public Result sync(@PathVariable String appId) {
-        log.info("菜单同步");
+    @PostMapping("/sync")
+    public Result sync(String appId) {
 
-        List<WxMenuButton> buttons = mpMenuService.selectList(null).stream().filter(menu -> menu.getParentidx() == 0L).sorted(Comparator.comparing(MpMenuDO::getParentidx).thenComparing(MpMenuDO::getSort)).map(menuDO -> {
+        log.info("菜单同步");
+        List<WxMenuButton> buttons = mpMenuService.findByKv("mpId", mpConfigService.findOneByKv("appId", appId).getId()).stream().filter(menu -> menu.getParentidx() == 0L).sorted(Comparator.comparing(MpMenuDO::getParentidx).thenComparing(MpMenuDO::getSort)).map(menuDO -> {
             // 一级菜单
             WxMenuButton button = new WxMenuButton();
             String menuType = convertMenuType(menuDO.getMenutype());

+ 1 - 1
src/main/java/com/ifast/wxmp/service/MpMenuService.java

@@ -15,5 +15,5 @@ public interface MpMenuService extends CoreService<MpMenuDO> {
 
     Tree<MpMenuDO> getTree();
 
-    void saveMenu(MpMenuDO mpMenu);
+    void saveMenu(MpMenuDO mpMenu, String appId);
 }

+ 13 - 3
src/main/java/com/ifast/wxmp/service/impl/MpMenuServiceImpl.java

@@ -6,10 +6,13 @@ import com.ifast.common.exception.IFastException;
 import com.ifast.common.type.EnumErrorCode;
 import com.ifast.common.utils.BuildTree;
 import com.ifast.wxmp.dao.MpMenuDao;
+import com.ifast.wxmp.domain.MpConfigDO;
 import com.ifast.wxmp.domain.MpMenuDO;
 import com.ifast.wxmp.pojo.type.Const;
+import com.ifast.wxmp.service.MpConfigService;
 import com.ifast.wxmp.service.MpMenuService;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.HashMap;
@@ -33,6 +36,9 @@ public class MpMenuServiceImpl extends CoreServiceImpl<MpMenuDao, MpMenuDO> impl
     private static final int SUB_MENU_SIZE = 5;
     private static final String TEXT_KEY = "TEXT_";
 
+    @Autowired
+    private MpConfigService mpConfigService;
+
     @Override
     public Tree<MpMenuDO> getTree() {
         List<Tree<MpMenuDO>> nodes = baseMapper.selectList(null).stream().map(menu -> {
@@ -50,22 +56,26 @@ public class MpMenuServiceImpl extends CoreServiceImpl<MpMenuDao, MpMenuDO> impl
     }
 
     @Override
-    public void saveMenu(MpMenuDO mpMenu) {
+    public void saveMenu(MpMenuDO mpMenu, String appId) {
         Long parentIdx = mpMenu.getParentidx();
+        MpConfigDO mpConfig = mpConfigService.findOneByKv("appId", appId);
         if(Objects.isNull(parentIdx) || parentIdx.equals(0L)){
-            int count = this.selectCount(convertToEntityWrapper("parentidx", parentIdx));
+            int count = this.selectCount(convertToEntityWrapper("parentidx", parentIdx, "mpId", mpConfig.getId()));
             if(count >= MAIN_MENU_SIZE){
                 log.info("主菜单不能超过3个");
                 throw new IFastException(EnumErrorCode.wxmpMenuSaveMainError.getCodeStr());
             }
         }else{
-            int count = this.selectCount(convertToEntityWrapper("parentidx", parentIdx));
+            int count = this.selectCount(convertToEntityWrapper("parentidx", parentIdx, "mpId", mpConfig.getId()));
             if(count >= SUB_MENU_SIZE){
                 log.info("子菜单不能超过5个");
                 throw new IFastException(EnumErrorCode.wxmpMenuSaveSubError.getCodeStr());
             }
         }
+
+        mpMenu.setMpid(mpConfig.getId());
         insert(mpMenu);
+
         if(Const.MenuKey.TEXT.equals(mpMenu.getMenutype())){
             mpMenu.setMenukey(TEXT_KEY + mpMenu.getId());
             updateById(mpMenu);

+ 4 - 0
src/main/resources/static/js/appjs/wxmp/mpArticleImage/add.js

@@ -9,6 +9,10 @@ $.validator.setDefaults({
 });
 
 function save() {
+
+    // 填充当前公众号的appId
+    $('#appId').val($('.currentMpInfo', window.top.document).attr('data-appid'));
+
     $.ajax({
         cache: true,
         type: "POST",

+ 4 - 0
src/main/resources/static/js/appjs/wxmp/mpArticleNews/add.js

@@ -9,6 +9,10 @@ $.validator.setDefaults({
 });
 
 function save() {
+
+    // 填充当前公众号的appId
+    $('#appId').val($('.currentMpInfo', window.top.document).attr('data-appid'));
+
     $.ajax({
         cache: true,
         type: "POST",

+ 11 - 0
src/main/resources/static/js/appjs/wxmp/mpArticleTxt/add.js

@@ -1,5 +1,12 @@
 $().ready(function () {
     validateRule();
+    var appId = $('.currentMpInfo', window.top.document).attr('data-appid');
+    console.log(appId);
+    if(appId){
+        console.log('articleTxt 获取appId:' + appId);
+    }else {
+        console.log('articleTxt 获取appId为空')
+    }
 });
 
 $.validator.setDefaults({
@@ -9,6 +16,10 @@ $.validator.setDefaults({
 });
 
 function save() {
+
+    // 填充当前公众号的appId
+    $('#appId').val($('.currentMpInfo', window.top.document).attr('data-appid'));
+
     $.ajax({
         cache: true,
         type: "POST",

+ 1 - 1
src/main/resources/static/js/appjs/wxmp/mpConfig/mpConfig.js

@@ -33,7 +33,7 @@ function load() {
                         // 说明:传入后台的参数包括offset开始索引,limit步长,sort排序列,order:desc或者,以及所有列的键值对
                         pageNumber: params.pageNumber,
                         pageSize: params.pageSize,
-                        appId:appId
+                        appId: $('.currentMpInfo', window.parent.document).attr('data-appid')
                         // name:$('#searchName').val(),
                         // username:$('#searchName').val()
                     };

+ 5 - 6
src/main/resources/static/js/appjs/wxmp/mpFans/mpFans.js

@@ -1,8 +1,7 @@
 var prefix = "/wxmp/mpFans";
-var appId = '';
 $(function () {
 
-    appId = $('.currentMpInfo', window.parent.document).attr('data-appid');
+    var appId = $('.currentMpInfo', window.top.document).attr('data-appid');
     console.log(appId)
     if(appId){
         console.log('mpFans 获取appId:' + appId);
@@ -43,7 +42,7 @@ function load() {
                         pageNumber: params.pageNumber,
                         pageSize: params.pageSize,
                         searchValue:$('#searchName').val(),
-                        appId:appId
+                        appId:$('.currentMpInfo', window.top.document).attr('data-appid')
                         // username:$('#searchName').val()
                     };
                 },
@@ -262,7 +261,7 @@ function batchSync() {
             data: {
                 "ids": ids
             },
-            url: prefix + '/sync?appId=' + appId,
+            url: prefix + '/sync?appId=' + $('.currentMpInfo', window.top.document).attr('data-appid'),
             success: function (r) {
                 if (r.code == 0) {
                     layer.msg(r.msg);
@@ -285,7 +284,7 @@ function sync(id) {
         btn: ['确定', '取消']
     }, function () {
         $.ajax({
-            url: prefix + "/sync?appId=" + appId,
+            url: prefix + "/sync?appId=" + $('.currentMpInfo', window.top.document).attr('data-appid'),
             type: "post",
             data: {
                 'ids': ids
@@ -308,7 +307,7 @@ function syncWxMp() {
         btn: ['确定', '取消']
     }, function () {
         $.ajax({
-            url: prefix + "/sync/wxmp?appId=" + appId,
+            url: prefix + "/sync/wxmp?appId=" + $('.currentMpInfo', window.top.document).attr('data-appid'),
             type: "post",
             success: function (r) {
                 if (r.code == 0) {

+ 15 - 0
src/main/resources/static/js/appjs/wxmp/mpMenu/add.js

@@ -1,6 +1,17 @@
+function checkAppId() {
+    var appId = $('.currentMpInfo', window.top.document).attr('data-appid');
+    console.log(appId);
+    if(appId){
+        console.log('mpMenu 获取appId:' + appId);
+    }else {
+        console.log('mpMenu 获取appId为空')
+    }
+}
+
 $().ready(function () {
     validateRule();
     init();
+    checkAppId();
 });
 
 $.validator.setDefaults({
@@ -24,6 +35,10 @@ function initForm(selected) {
 }
 
 function save() {
+
+    // 填充当前公众号的appId
+    $('#appId').val($('.currentMpInfo', window.top.document).attr('data-appid'));
+
     $.ajax({
         cache: true,
         type: "POST",

+ 7 - 8
src/main/resources/static/js/appjs/wxmp/mpMenu/mpMenu.js

@@ -1,13 +1,12 @@
 var prefix = "/wxmp/mpMenu";
-var appId = '';
 $(function () {
 
-    appId = $('.currentMpInfo', window.parent.document).attr('data-appid');
+    var appId = $('.currentMpInfo', window.parent.document).attr('data-appid');
     console.log(appId)
-    if(appId){
+    if (appId) {
         console.log('mpFans 获取appId:' + appId);
         load();
-    }else {
+    } else {
         console.log('mpfans 获取appId为空')
     }
 });
@@ -20,7 +19,7 @@ function load() {
                 code: 'id',
                 parentCode: 'parentidx',
                 type: "GET", // 请求数据的ajax类型
-                url: prefix + '/list', // 请求数据的ajax的url
+                url: prefix + '/list?appId=' + $('.currentMpInfo', window.top.document).attr('data-appid'), // 请求数据的ajax的url
                 ajaxParams: {}, // 请求数据的ajax的data属性
                 expandColumn: '1', // 在哪一列上面显示展开按钮
                 striped: true, // 是否各行渐变色
@@ -136,20 +135,20 @@ function sync() {
     layer.confirm("确认要同步公众号菜单吗?", {
         btn: ['确定', '取消']
     }, function () {
-        $.post("/wx/mp/menu/api/sync?appId=" + appId, function (res) {
+        $.post("/wx/mp/menu/api/sync?appId=" + $('.currentMpInfo', window.top.document).attr('data-appid'), function (res) {
             layer.msg(res.msg);
         });
     });
 }
 
-function add(appId) {
+function add(pId) {
     layer.open({
         type: 2,
         title: '增加',
         maxmin: true,
         shadeClose: false, // 点击遮罩关闭层
         area: ['800px', '520px'],
-        content: prefix + '/add/' + appId
+        content: prefix + '/add/' + pId
     });
 }
 

+ 13 - 4
src/main/resources/static/js/contabs.js

@@ -1,5 +1,3 @@
-
-
 $(function () {
     //计算元素集合的总宽度
     function calSumWidth(elements) {
@@ -126,9 +124,20 @@ $(function () {
 
         // 微信公众号菜单时,初始化选择公众号
         var currentMp = $('.currentMp');
-        if (dataUrl.indexOf('/wxmp/') != -1) {
+        if (isWxMpUrl(dataUrl)) {
             console.log('公众号菜单. URL:' + dataUrl);
             currentMp.removeClass('hidden');
+
+            var currentMpInfo = $('.currentMpInfo');
+            var appId = currentMpInfo.attr('data-appid');
+            if (!appId) {
+                console.log('公众号为空,准备初始化...')
+                var $mpList01 = $(".mpList li:nth-child(1) a");
+                console.log($mpList01);
+                console.log($mpList01.attr('data-appid'));
+                currentMpInfo.text($mpList01.text());
+                currentMpInfo.attr('data-appid', $mpList01.attr('lang'));
+            }
         } else {
             console.log('非公众号菜单. URL:' + dataUrl);
             if (!currentMp.hasClass('hidden')) {
@@ -162,7 +171,7 @@ $(function () {
                         }
                     });
                 } else {
-                    console.log('TODO 如果是公众号tab && 公众号已经切换,reload');
+                    console.log('如果是公众号tab && 公众号已经切换,reload');
                     if (isWxMpUrl(dataUrl) && wxMpHasChange) {
 
                         $('.J_mainContent .J_iframe').each(function () {

+ 1 - 0
src/main/resources/templates/wxmp/mpArticleImage/add.html

@@ -11,6 +11,7 @@
                     <form class="form-horizontal m-t" id="signupForm">
 
                         <input id="msgtype" name="msgtype" class="form-control" type="hidden" value="image" >
+                        <input id="appId" name="appId" type="hidden">
 
                         <div class="form-group">
                             <label class="col-sm-3 control-label">关键字</label>

+ 1 - 0
src/main/resources/templates/wxmp/mpArticleNews/add.html

@@ -11,6 +11,7 @@
                     <form class="form-horizontal m-t" id="signupForm">
 
                         <input id="msgtype" name="msgtype" class="form-control" type="hidden" value="news" >
+                        <input id="appId" name="appId" type="hidden">
                         <div class="form-group">
                             <label class="col-sm-3 control-label">关键字</label>
                             <div class="col-sm-8">

+ 1 - 0
src/main/resources/templates/wxmp/mpArticleTxt/add.html

@@ -11,6 +11,7 @@
                     <form class="form-horizontal m-t" id="signupForm">
 
                         <input id="msgtype" name="msgtype" class="form-control" type="hidden" value="text" >
+                        <input id="appId" name="appId" type="hidden">
 
                         <div class="form-group">
                             <label class="col-sm-3 control-label">关键字</label>

+ 3 - 0
src/main/resources/templates/wxmp/mpMenu/add.html

@@ -9,6 +9,9 @@
             <div class="ibox float-e-margins">
                 <div class="ibox-content">
                     <form class="form-horizontal m-t" id="signupForm">
+
+                        <input id="appId" name="appId" type="hidden">
+
                         <div class="form-group">
                             <label class="col-sm-3 control-label">上级菜单</label>
                             <div class="col-sm-8">