Skip to content
  • P
    Projects
  • G
    Groups
  • S
    Snippets
  • Help

肖康 / H5_2.0

  • This project
    • Loading...
  • Sign in
Go to a project
  • Project
  • Repository
  • Issues 0
  • Merge Requests 0
  • Pipelines
  • Wiki
  • Snippets
  • Settings
  • Activity
  • Graph
  • Charts
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
  • Files
  • Commits
  • Branches
  • Tags
  • Contributors
  • Graph
  • Compare
  • Charts
Find file
Normal viewHistoryPermalink
Switch branch/tag
  • H5_2.0
  • node_modules
  • _uni-simple-router@1.5.5@uni-simple-r...
  • helpers
  • urlQuery.js
urlQuery.js 4.86 KB
肖康's avatar
first init
ddbafbda
 
肖康 committed 2 years ago
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
import { Global } from './config';
import { warn, err } from './warn';

const nodeURL = require('query-string');

class ParseQuery {
    get queryName() {
        return nodeURL;
    }

    /**
     * 判断当前这个对象是否为深度对象
     * @param {Object} obj
     */
    isDepthObject(obj) {
        const str = JSON.stringify(obj);
        return str.match(/}/g).length > 1;
    }

    /**
     * 从URL中提取查询字符串
     * @param {String} url
     */
    extract(url) {
        return nodeURL.extract(url);
    }

    /**
     * 把一个 key=value&key1=value 的字符串转成对象
     * @param {string} strQuery key=value&key1=value 类型的字符串
     */
    parse(strQuery) {
        return nodeURL.parse(strQuery);
    }

    /**
     * 把一个对象转成 key=value&key1=value 类型的字符串
     * @param {Object} ObjQuery 符合js标注的对象
     * @param {Boolean} intact 是否在转成的字符串前添加?号
     */
    stringify(ObjQuery, intact = true) {
        const strQuery = nodeURL.stringify(ObjQuery);
        if (intact) {
            return `?${strQuery}`;
        }
        return strQuery;
    }

    /**
     * 把一个对象或者 key=value&key1=value 类型的数据加密成 query=encodeURIComponent(value)
     * @param {Object|String} query 符合js标注的对象 或者 key=value&key1=value 字符串
     * @param {Boolean} intact 是否在转成的字符串前添加?号
     */
    encode(query, intact = true) {
        let [strQuery, formatQuery] = ['', ''];
        if (query == null) {
            warn('加密参数没有传递,你知道?', true);
            return '';
        }
        if (query.constructor === String) { // 字符串 尝试 转成 对象
            strQuery = JSON.stringify(this.parse(query));
        } else if (query.constructor === Object) { // 直接转成字符串对象即可
            if (Object.keys(query).length === 0) {
                warn('当前参数不满足加密规范!');
                return '';
            }
            strQuery = JSON.stringify(query);
        }
        if (intact) {
            formatQuery = '?';
        }
        formatQuery += `query=${encodeURIComponent(strQuery)}`;
        return formatQuery;
    }

    /**
     * 把一个已经加密好的字符串 query=encodeURIComponent(value) 解密成 对象
     * @param {string} strQuery  已经加密好的字符串 query=encodeURIComponent(value)
     */
    decode(strQuery) {
        if (strQuery == null) {
            warn('解密参数没有传递,你知道?', true);
            return {};
        }
        let jsonQuery = strQuery;
        if (strQuery.constructor === Object) { // 如果是对象 看能不能满足要求
            jsonQuery = strQuery.query;
            if (jsonQuery == null) {
                warn('当前解密参数不满足编码规则');
                return {};
            }
            jsonQuery = `query=${jsonQuery}`;
        }
        let decode = {};
        // query 长这个样  query=encodeURIComponent(value)
        const decodeStr = decodeURIComponent(jsonQuery);
        const { query } = this.parse(decodeStr); // 转成 json 获取到正真的json字符串
        if (query == null) {
            warn('当前解密参数不满足编码规则');
        } else {
            try {
                decode = JSON.parse(query);
            } catch (error) {
                warn('当前解密参数不满足编码规则');
            }
        }
        return decode;
    }

    queryGet(query) {
        const { encodeURI } = Global.Router.CONFIG; // 获取到路由配置
        let [decode, historyObj, strQuery] = [query, query, ''];
        switch (encodeURI) {
        case true: { // 加密模式
            decode = this.decode(query);
            strQuery = this.encode(decode);
            historyObj = {
                query: encodeURIComponent(JSON.stringify(decode)),
            };
            break;
        }
        case false: { // 不加密模式
            strQuery = this.stringify(query);
            break;
        }
        default: {
            err('未知参数模式,请检查 \'encodeURI\'', true);
        }
        }
        return { strQuery, historyObj, decode };
    }


    /**
     * 对需要传递的参数进行加密解密
     * @param {Object|String} query get为false 必须为 Object 类型
     * @param {String} get 是取值 还是通过api传值
     */
    transfer(query = {}) {
        const { encodeURI } = Global.Router.CONFIG; // 获取到路由配置
        switch (encodeURI) {
        case true: {
            // 加密模式
            return this.encode(query, false);
        }
        case false: {
            // 不加密模式
            return this.stringify(query);
        }
        default: {
            err('未知参数模式,请检查 \'encodeURI\' ', true);
        }
        }
    }
}

export default ParseQuery;