zhuliu пре 1 година
родитељ
комит
0aad835860
2 измењених фајлова са 90 додато и 1 уклоњено
  1. 4 1
      src/router/index.js
  2. 86 0
      src/utils/query.js

+ 4 - 1
src/router/index.js

@@ -3,6 +3,8 @@ import VueRouter from 'vue-router'
 import Cookies from 'js-cookie'
 import Permission from '@/utils/permissions'
 
+import {stringifyQuery,parseQuery} from '@/utils/query'
+
 Vue.use(VueRouter)
 
 const originalPush = VueRouter.prototype.push
@@ -587,6 +589,8 @@ const routes = [
 const router = new VueRouter({
   mode: 'history',
   base: '/',
+  stringifyQuery: stringifyQuery, // 序列化query参数
+  parseQuery: parseQuery, // 反序列化query参数
   routes
 })
 
@@ -646,7 +650,6 @@ router.beforeEach((to, from, next) => {
 })
 
 router.afterEach((to, from) => {
-
 });
 
 export default router

+ 86 - 0
src/utils/query.js

@@ -0,0 +1,86 @@
+const encodeReserveRE = /[!'()*]/g
+const encodeReserveReplacer = (c) => '%' + c.charCodeAt(0).toString(16)
+const commaRE = /&2c/g
+
+const encode = (str)=>{
+    return encodeURIComponent(str)
+        .replace(encodeReserveRE,encodeReserveReplacer)
+        .replace(commaRE,',')
+}
+
+const decode = decodeURIComponent
+
+function isBase64(str){
+    if(!str || str.trim() === ''){
+        return false
+    }
+
+    const base64Pattern = /^[A-Za-z0-9+/]*={0,2}$/
+
+    if(!base64Pattern.test(str)){
+        return false
+    }
+
+    try{
+        return btoa(atob(str)) === str
+    }catch(err){
+        return false
+    }
+}
+
+export const stringifyQuery = (obj)=>{
+    const res = obj
+        ? Object.keys(obj).map((key)=>{
+            const val = obj[key]
+            if(val === null || val === undefined){
+                return encode(key)
+            }
+
+            if(Array.isArray(val)){
+                const result = []
+                val.forEach((val2)=>{
+                    if(val === null || val === undefined){
+                        result.push(encode(key))
+                    }else{
+                        result.push(encode(key) + '=' + encode(val2))
+                    }
+                })
+                return result.join('&')
+            }
+            return encode(key) + '=' + encode(val)
+        }).join('&')
+        : null
+    return res ? `?${escape(res)}` : ''
+}
+
+
+export const parseQuery = (query) =>{
+    const res = {}
+
+    query = query.trim().replace(/^(\?|#|&)/,'')
+
+    if(!query){
+        return res
+    }
+
+    // query = isBase64(query) ? decrypt(query) : query
+    try{
+        query = unescape(query)
+    }catch(err){
+        query = query
+    }
+
+    query.split('&').forEach((param)=>{
+        const parts = param.split('=')
+        const key = decode(parts.shift())
+        const val = parts.length>0 ? decode(parts.join('')) : null
+        if(res[key] === undefined){
+            res[key] = val
+        }else if(Array.isArray(res[key])){
+            res[key].push(val)
+        }else{
+            res[key] = [res[key],val]
+        }
+    })
+    return res
+}