Browse Source

:zap: 多公众号切换

Aron 6 years ago
parent
commit
b9cce0d40b

+ 41 - 0
src/main/java/com/ifast/wxmp/aspect/BoundAppIdAspect.java

@@ -0,0 +1,41 @@
+package com.ifast.wxmp.aspect;
+
+import com.ifast.common.utils.HttpContextUtils;
+import com.ifast.wxmp.util.WxMpConfigHolder;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.stereotype.Component;
+
+/**
+ * <pre>
+ * 切 wxmp下的controller,
+ * 将参数appId设绑定为当前的微信SDK处理的公众号,保证微信API调用时,不会错乱
+ * </pre>
+ * <small> 2018/11/22 17:25 | Aron</small>
+ */
+@Aspect
+@Component
+@Slf4j
+public class BoundAppIdAspect {
+
+    @Pointcut("execution(* com.ifast.wxmp.controller.*.*(..))")
+    public void pointCut() {}
+
+    @Around("pointCut()")
+    public Object around(ProceedingJoinPoint point) throws Throwable {
+        String appId = HttpContextUtils.getHttpServletRequest().getParameter("appId");
+        if(StringUtils.isNotBlank(appId)){
+            if(log.isDebugEnabled()){
+                log.debug("WxMpConfigHolder.setCurrentAppId(), appId : {}", appId);
+            }
+            WxMpConfigHolder.setCurrentAppId(appId);
+        }
+        Object result = point.proceed();
+        return result;
+    }
+
+}

+ 13 - 5
src/main/java/com/ifast/wxmp/controller/MpFansController.java

@@ -6,7 +6,9 @@ import com.baomidou.mybatisplus.plugins.Page;
 import com.ifast.common.base.AdminBaseController;
 import com.ifast.common.utils.Result;
 import com.ifast.wxmp.domain.MpFansDO;
+import com.ifast.wxmp.service.MpConfigService;
 import com.ifast.wxmp.service.MpFansService;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
@@ -26,6 +28,8 @@ import java.util.Arrays;
 public class MpFansController extends AdminBaseController {
     @Autowired
     private MpFansService mpFansService;
+    @Autowired
+    private MpConfigService mpConfigService;
 
     @GetMapping()
     @RequiresPermissions("wxmp:mpFans:mpFans")
@@ -36,9 +40,14 @@ public class MpFansController extends AdminBaseController {
     @ResponseBody
     @GetMapping("/list")
     @RequiresPermissions("wxmp:mpFans:mpFans")
-    public Result<Page<MpFansDO>> list(String searchValue) {
+    public Result<Page<MpFansDO>> list(String searchValue, String appId) {
         Wrapper<MpFansDO> wrapper = new EntityWrapper<>();
-        wrapper.like("nickname", searchValue).or().like("openid", searchValue).or().like("subscribeKey", searchValue);
+        wrapper.eq("mpId", mpConfigService.findOneByKv("appId", appId).getId());
+        if (StringUtils.isNotBlank(searchValue)) {
+            wrapper.andNew().like("nickname", searchValue)
+                    .or().like("openid", searchValue)
+                    .or().like("subscribeKey", searchValue);
+        }
         Page<MpFansDO> page = mpFansService.selectPage(getPage(MpFansDO.class), wrapper);
         return Result.ok(page);
     }
@@ -115,11 +124,10 @@ public class MpFansController extends AdminBaseController {
     /**
      * 同步粉丝到服务器,存在即不更新
      */
-    @PostMapping("/sync/wxmp/{appId}")
+    @PostMapping("/sync/wxmp")
     @ResponseBody
     @RequiresPermissions("wxmp:mpFans:sync")
-    public Result<String> syncWxMp(@PathVariable String appId) {
-        appId = null;
+    public Result<String> syncWxMp(String appId) {
         mpFansService.syncWxMp(appId);
         return Result.ok();
     }

+ 0 - 4
src/main/java/com/ifast/wxmp/util/WxMpConfigHolder.java

@@ -42,10 +42,6 @@ public class WxMpConfigHolder implements InitializingBean {
     }
 
     public static WxMpInMemoryConfigStorage getWxMpInMemoryConfigStorage() {
-        // TODO
-
-        currentAppId.set("wxe9679b2e6082d653");
-
         return mpConfigs.get(currentAppId.get());
     }
 

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

@@ -1,6 +1,15 @@
-var prefix = "/wxmp/mpFans"
+var prefix = "/wxmp/mpFans";
+var appId = '';
 $(function () {
-    load();
+
+    appId = $('.currentMpInfo', window.parent.document).attr('data-appid');
+    console.log(appId)
+    if(appId){
+        console.log('mpFans 获取appId:' + appId);
+        load();
+    }else {
+        console.log('mpfans 获取appId为空')
+    }
 });
 
 function load() {
@@ -33,7 +42,8 @@ function load() {
                         // 说明:传入后台的参数包括offset开始索引,limit步长,sort排序列,order:desc或者,以及所有列的键值对
                         pageNumber: params.pageNumber,
                         pageSize: params.pageSize,
-                        searchValue:$('#searchName').val()
+                        searchValue:$('#searchName').val(),
+                        appId:appId
                         // username:$('#searchName').val()
                     };
                 },
@@ -252,7 +262,7 @@ function batchSync() {
             data: {
                 "ids": ids
             },
-            url: prefix + '/sync',
+            url: prefix + '/sync?appId=' + appId,
             success: function (r) {
                 if (r.code == 0) {
                     layer.msg(r.msg);
@@ -275,7 +285,7 @@ function sync(id) {
         btn: ['确定', '取消']
     }, function () {
         $.ajax({
-            url: prefix + "/sync",
+            url: prefix + "/sync?appId=" + appId,
             type: "post",
             data: {
                 'ids': ids
@@ -298,7 +308,7 @@ function syncWxMp() {
         btn: ['确定', '取消']
     }, function () {
         $.ajax({
-            url: prefix + "/sync/wxmp/appId",
+            url: prefix + "/sync/wxmp?appId=" + appId,
             type: "post",
             success: function (r) {
                 if (r.code == 0) {

+ 139 - 10
src/main/resources/static/js/contabs.js

@@ -1,4 +1,5 @@
 
+
 $(function () {
     //计算元素集合的总宽度
     function calSumWidth(elements) {
@@ -8,6 +9,7 @@ $(function () {
         });
         return width;
     }
+
     //滚动到指定选项卡
     function scrollToTab(element) {
         var marginLeftVal = calSumWidth($(element).prevAll()), marginRightVal = calSumWidth($(element).nextAll());
@@ -35,6 +37,7 @@ $(function () {
             marginLeft: 0 - scrollVal + 'px'
         }, "fast");
     }
+
     //查看左侧隐藏的选项卡
     function scrollTabLeft() {
         var marginLeftVal = Math.abs(parseInt($('.page-tabs-content').css('margin-left')));
@@ -66,6 +69,7 @@ $(function () {
             marginLeft: 0 - scrollVal + 'px'
         }, "fast");
     }
+
     //查看右侧隐藏的选项卡
     function scrollTabRight() {
         var marginLeftVal = Math.abs(parseInt($('.page-tabs-content').css('margin-left')));
@@ -105,45 +109,74 @@ $(function () {
         }
     });
 
+
     function menuItem() {
         // 获取标识数据
+        var dataIndex = $(this).data('index');
         var dataUrl = $(this).attr('href'),
-            dataIndex = $(this).data('index'),
             menuName = $.trim($(this).text()),
             flag = true;
-        if (dataUrl == undefined || $.trim(dataUrl).length == 0)return false;
+        if (dataUrl == undefined || $.trim(dataUrl).length == 0) return false;
 
         // 微信公众号菜单时,初始化选择公众号
         var currentMp = $('.currentMp');
-        if(dataUrl.indexOf('/wxmp/') != -1){
+        if (dataUrl.indexOf('/wxmp/') != -1) {
+            console.log('公众号菜单. URL:' + dataUrl);
             currentMp.removeClass('hidden');
-        }else {
-            if(!currentMp.hasClass('hidden')){
+        } else {
+            console.log('非公众号菜单. URL:' + dataUrl);
+            if (!currentMp.hasClass('hidden')) {
                 currentMp.addClass('hidden');
             }
         }
 
-        // 选项卡菜单已存在
+        console.log('选项卡菜单已存在');
         $('.J_menuTab').each(function () {
+            console.log('当前 - ' + $(this).data('id') + ' - ' + dataUrl)
             if ($(this).data('id') == dataUrl) {
+                console.log('处理 - ' + dataUrl);
+                console.log($(this));
+
                 if (!$(this).hasClass('active')) {
                     $(this).addClass('active').siblings('.J_menuTab').removeClass('active');
                     scrollToTab(this);
                     // 显示tab对应的内容区
                     $('.J_mainContent .J_iframe').each(function () {
+                        console.log('当前 iframe - ' + $(this).data('id') + ' - ' + dataUrl)
                         if ($(this).data('id') == dataUrl) {
+                            console.log('处理 iframe - ' + dataUrl);
                             $(this).show().siblings('.J_iframe').hide();
+
+
+                            console.log($(this));
+                            console.log('src:' + $(this).attr('src'))
+
+
                             return false;
                         }
                     });
+                } else {
+                    console.log('TODO 如果是公众号tab && 公众号已经切换,reload');
+                    if (isWxMpUrl(dataUrl) && wxMpHasChange) {
+
+                        $('.J_mainContent .J_iframe').each(function () {
+                            if ($(this).data('id') == dataUrl) {
+                                $(this).show().siblings('.J_iframe').hide();
+                                $(this).attr('src', $(this).attr('src'));
+                            }
+                        });
+                        setCurrentWxMpInfo2Last();
+
+                    }
+
                 }
                 flag = false;
                 return false;
             }
         });
 
-        // 选项卡菜单不存在
         if (flag) {
+            console.log('选项卡菜单不存在')
             var str = '<a href="javascript:;" class="active J_menuTab" data-id="' + dataUrl + '">' + menuName + ' <i class="fa fa-times-circle"></i></a>';
             $('.J_menuTab').removeClass('active');
 
@@ -168,6 +201,83 @@ $(function () {
 
     $('.J_menuItem').on('click', menuItem);
 
+    /**
+     * 是否为公众号URL
+     * @param url
+     * @returns {boolean}
+     */
+    function isWxMpUrl(url) {
+        return url.indexOf('/wxmp/') != -1;
+    }
+
+    /**
+     * 公众号是否切换
+     * @returns {boolean}
+     */
+    function wxMpHasChange() {
+        var currentMpInfo = $('.currentMpInfo');
+        var lastMpInfo = $('.lastMpInfo');
+        console.log('wxMpHasChange: ' + currentMpInfo.attr('data-appid') + ' - ' + lastMpInfo.attr('data-appid'));
+        var hasChange = currentMpInfo.attr('data-appid') != lastMpInfo.attr('data-appid');
+        console.log('hasChange:' + hasChange);
+        return hasChange;
+    }
+
+    function setCurrentWxMpInfo2Last() {
+        var currentMpInfo = $('.currentMpInfo');
+        var lastMpInfo = $('.lastMpInfo');
+
+        lastMpInfo.text(currentMpInfo.text());
+        lastMpInfo.attr('data-appid', currentMpInfo.attr('data-appid'));
+    }
+
+    /**
+     * 切换公众号
+     */
+    $('.dropdown-menu.mpList li a').on('click', function () {
+        var that = $(this);
+        var appId = that.attr('lang');
+        var mpName = that.text();
+
+        console.log('当前appId:' + appId);
+        console.log('当前公众号名称:' + mpName);
+
+        var currentMpInfo = $('.currentMpInfo');
+        var lastMpInfo = $('.lastMpInfo');
+
+        lastMpInfo.text(currentMpInfo.text());
+        lastMpInfo.attr('data-appid', currentMpInfo.attr('data-appid'));
+
+        currentMpInfo.text(mpName);
+        currentMpInfo.attr('data-appid', appId);
+
+        console.log(currentMpInfo);
+
+        // 获取当前激活的选项卡,如果为公众号菜单,则reload
+        var $JMenuItem = $('.J_menuTab.active');
+        console.log($JMenuItem);
+        var dataUrl = $JMenuItem.attr('data-id');
+        if (isWxMpUrl(dataUrl)) {
+            console.log('当前激活的tab为公众号菜单,reload');
+            if (wxMpHasChange()) {
+                $('.J_mainContent .J_iframe').each(function () {
+                    if ($(this).data('id') == dataUrl) {
+                        $(this).show().siblings('.J_iframe').hide();
+                        $(this).attr('src', $(this).attr('src'));
+                    }
+                });
+            } else {
+                console.log('wxMpHasChange: false')
+            }
+        } else {
+            console.log('当前激活的tab非公众号菜单,无需reload');
+
+        }
+
+
+    });
+
+
     // 关闭选项卡菜单
     function closeTab() {
         var closeTabId = $(this).parents('.J_menuTab').data('id');
@@ -251,26 +361,45 @@ $(function () {
     $('.J_menuTabs').on('click', '.J_menuTab i', closeTab);
 
     //关闭其他选项卡
-    function closeOtherTabs(){
+    function closeOtherTabs() {
         $('.page-tabs-content').children("[data-id]").not(":first").not(".active").each(function () {
             $('.J_iframe[data-id="' + $(this).data('id') + '"]').remove();
             $(this).remove();
         });
         $('.page-tabs-content').css("margin-left", "0");
     }
+
     $('.J_tabCloseOther').on('click', closeOtherTabs);
 
     //滚动到已激活的选项卡
-    function showActiveTab(){
+    function showActiveTab() {
         scrollToTab($('.J_menuTab.active'));
     }
+
     $('.J_tabShowActive').on('click', showActiveTab);
 
 
     // 点击选项卡菜单
     function activeTab() {
+
+        console.log('tab click.')
+        var dataUrl = $(this).data('id');
+        if (isWxMpUrl(dataUrl) && wxMpHasChange()) {
+            console.log('公众号已经切换 && 为公众号tab,数据需要reload')
+            $('.J_mainContent .J_iframe').each(function () {
+                if ($(this).data('id') == dataUrl) {
+                    $(this).show().siblings('.J_iframe').hide();
+                    $(this).attr('src', $(this).attr('src'));
+                }
+            });
+
+            // 设置上个公众号信息,防止下次再刷新
+            setCurrentWxMpInfo2Last();
+
+        }
+
         if (!$(this).hasClass('active')) {
-            var currentId = $(this).data('id');
+            var currentId = dataUrl;
             // 显示tab对应的内容区
             $('.J_mainContent .J_iframe').each(function () {
                 if ($(this).data('id') == currentId) {

+ 1 - 15
src/main/resources/templates/index_v1.html

@@ -100,6 +100,7 @@
                     <div class="minimalize-styl-2 hidden text-primary currentMp input-group-btn open">
                         <span class="hidden currentMp"> 当前公众号: </span>
                         <div data-toggle="dropdown" class=" dropdown-toggle inline" aria-expanded="true">
+                            <span class="lastMpInfo hidden">保存切换前的公众号</span>
                             <span class="currentMpInfo">请选择公众号</span><span class="caret"></span>
                         </div>
                         <ul class="dropdown-menu mpList" style="margin-left: 100px;">
@@ -305,21 +306,6 @@
         },
     })
 
-    $('.dropdown-menu.mpList li a').on('click', function () {
-        var that = $(this);
-        var appId = that.attr('lang');
-        var mpName = that.text();
-
-        console.log('当前appId:' + appId);
-        console.log('当前公众号名称:' + mpName);
-
-        var currentMpInfo = $('.currentMpInfo');
-
-        currentMpInfo.text(mpName);
-        currentMpInfo.attr('data-appid', appId);
-        console.log(currentMpInfo);
-
-    })
 
 </script>
 </body>