408249787@qq.com 3 settimane fa
parent
commit
f3a184a125
3 ha cambiato i file con 65 aggiunte e 8 eliminazioni
  1. 34 0
      App.vue
  2. 25 7
      api/ignore/index.js
  3. 6 1
      utils/http.js

+ 34 - 0
App.vue

@@ -1,6 +1,40 @@
 <script>
 import { mapState, mapMutations } from 'vuex';
+import BaseTool from '@/utils/tool';
+
+// 需要登录才能访问的 tabBar 页面路径(首页允许未登录浏览)
+const TAB_NEED_LOGIN = ['/pages/operate/operate', '/pages/middle/middle', '/pages/tidings/tidings', '/pages/my/my'];
+// 免登录可查看的普通页面白名单(扫码查看设备详情等场景)
+const PUBLIC_PAGES = ['/pages/equipment-detail/equipment-detail'];
+
 export default {
+    mixins: [{
+        onShow() {
+            // 全局页面鉴权:未登录时记录来源页面并跳转登录
+            const pages = getCurrentPages();
+            if (!pages || pages.length === 0) return;
+            const page = pages[pages.length - 1];
+            const route = '/' + page.route;
+            // 登录页本身不做鉴权
+            if (route === '/pages/login/login') return;
+            // 首页、白名单页面允许未登录浏览,其他页面需要登录
+            if (route === '/pages/home/home') return;
+            if (PUBLIC_PAGES.indexOf(route) !== -1) return;
+            if (!BaseTool.UserUtil.isLogin()) {
+                // 记录当前页面路径(含参数),登录成功后回跳
+                try {
+                    const opts = page.options || (page.$page && page.$page.options) || {};
+                    const query = Object.keys(opts)
+                        .map(k => k + '=' + encodeURIComponent(opts[k]))
+                        .join('&');
+                    const isTab = TAB_NEED_LOGIN.indexOf(route) !== -1;
+                    uni.setStorageSync('login_back_url', route + (query ? '?' + query : ''));
+                    uni.setStorageSync('login_back_is_tab', isTab);
+                } catch (e) {}
+                uni.navigateTo({ url: '/pages/login/login' });
+            }
+        }
+    }],
     methods: {
         ...mapMutations(['_login', '_userInfo'])
     },

+ 25 - 7
api/ignore/index.js

@@ -89,15 +89,33 @@ export function mobileLogin(data) {
                     success: function () {
                         // 获取词典
                         getDictData().then(response => {
-                            // 登录前由操作拦截/401 记录了来源页(如扫码进入的设备详情),优先回跳,避免用户重新扫码
+                            // 登录前由操作拦截/401 或页面鉴权记录了来源页,优先回跳
                             const backUrl = takeBackUrl();
+                            const backIsTab = uni.getStorageSync('login_back_is_tab');
+                            uni.removeStorageSync('login_back_is_tab');
                             if (backUrl) {
-                                uni.redirectTo({
-                                    url: backUrl,
-                                    fail: function () {
-                                        uni.switchTab({ url: '/pages/tidings/tidings' });
-                                    }
-                                });
+                                if (backIsTab) {
+                                    // tabBar 页面必须用 switchTab,redirectTo 无法跳转
+                                    uni.switchTab({
+                                        url: backUrl.split('?')[0],
+                                        fail: function () {
+                                            uni.switchTab({ url: '/pages/tidings/tidings' });
+                                        }
+                                    });
+                                } else {
+                                    uni.redirectTo({
+                                        url: backUrl,
+                                        fail: function () {
+                                            // redirectTo 失败(可能是 tabBar 页面),降级为 switchTab
+                                            uni.switchTab({
+                                                url: backUrl.split('?')[0],
+                                                fail: function () {
+                                                    uni.switchTab({ url: '/pages/tidings/tidings' });
+                                                }
+                                            });
+                                        }
+                                    });
+                                }
                             } else {
                                 uni.switchTab({ url: '/pages/tidings/tidings' });
                             }

+ 6 - 1
utils/http.js

@@ -7,7 +7,10 @@ let ajaxTimes = 0;
 /**
  * 记录登录前的页面路径,供登录成功后回跳
  * 扫码场景:免登录查看设备详情 → 点操作弹登录 → 登录后应回到原页面继续操作,而不是重新扫码
+ * 同时记录是否为 tabBar 页面,以便回跳时选择正确的导航方法
  */
+const TAB_PAGES = ['/pages/home/home', '/pages/operate/operate', '/pages/middle/middle', '/pages/tidings/tidings', '/pages/my/my'];
+
 const recordBackUrl = () => {
     try {
         const pages = getCurrentPages();
@@ -19,7 +22,9 @@ const recordBackUrl = () => {
         const query = Object.keys(opts)
             .map(k => k + '=' + encodeURIComponent(opts[k]))
             .join('&');
-        uni.setStorageSync('login_back_url', '/' + cur.route + (query ? '?' + query : ''));
+        const route = '/' + cur.route;
+        uni.setStorageSync('login_back_url', route + (query ? '?' + query : ''));
+        uni.setStorageSync('login_back_is_tab', TAB_PAGES.indexOf(route) !== -1);
     } catch (e) {
         // 取不到当前页面时忽略,登录后走默认首页
     }