urlQuery.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. import { Global } from './config';
  2. import { warn, err } from './warn';
  3. const nodeURL = require('query-string');
  4. class ParseQuery {
  5. get queryName() {
  6. return nodeURL;
  7. }
  8. /**
  9. * 判断当前这个对象是否为深度对象
  10. * @param {Object} obj
  11. */
  12. isDepthObject(obj) {
  13. const str = JSON.stringify(obj);
  14. return str.match(/}/g).length > 1;
  15. }
  16. /**
  17. * 从URL中提取查询字符串
  18. * @param {String} url
  19. */
  20. extract(url) {
  21. return nodeURL.extract(url);
  22. }
  23. /**
  24. * 把一个 key=value&key1=value 的字符串转成对象
  25. * @param {string} strQuery key=value&key1=value 类型的字符串
  26. */
  27. parse(strQuery) {
  28. return nodeURL.parse(strQuery);
  29. }
  30. /**
  31. * 把一个对象转成 key=value&key1=value 类型的字符串
  32. * @param {Object} ObjQuery 符合js标注的对象
  33. * @param {Boolean} intact 是否在转成的字符串前添加?号
  34. */
  35. stringify(ObjQuery, intact = true) {
  36. const strQuery = nodeURL.stringify(ObjQuery);
  37. if (intact) {
  38. return `?${strQuery}`;
  39. }
  40. return strQuery;
  41. }
  42. /**
  43. * 把一个对象或者 key=value&key1=value 类型的数据加密成 query=encodeURIComponent(value)
  44. * @param {Object|String} query 符合js标注的对象 或者 key=value&key1=value 字符串
  45. * @param {Boolean} intact 是否在转成的字符串前添加?号
  46. */
  47. encode(query, intact = true) {
  48. let [strQuery, formatQuery] = ['', ''];
  49. if (query == null) {
  50. warn('加密参数没有传递,你知道?', true);
  51. return '';
  52. }
  53. if (query.constructor === String) { // 字符串 尝试 转成 对象
  54. strQuery = JSON.stringify(this.parse(query));
  55. } else if (query.constructor === Object) { // 直接转成字符串对象即可
  56. if (Object.keys(query).length === 0) {
  57. warn('当前参数不满足加密规范!');
  58. return '';
  59. }
  60. strQuery = JSON.stringify(query);
  61. }
  62. if (intact) {
  63. formatQuery = '?';
  64. }
  65. formatQuery += `query=${encodeURIComponent(strQuery)}`;
  66. return formatQuery;
  67. }
  68. /**
  69. * 把一个已经加密好的字符串 query=encodeURIComponent(value) 解密成 对象
  70. * @param {string} strQuery 已经加密好的字符串 query=encodeURIComponent(value)
  71. */
  72. decode(strQuery) {
  73. if (strQuery == null) {
  74. warn('解密参数没有传递,你知道?', true);
  75. return {};
  76. }
  77. let jsonQuery = strQuery;
  78. if (strQuery.constructor === Object) { // 如果是对象 看能不能满足要求
  79. jsonQuery = strQuery.query;
  80. if (jsonQuery == null) {
  81. warn('当前解密参数不满足编码规则');
  82. return {};
  83. }
  84. jsonQuery = `query=${jsonQuery}`;
  85. }
  86. let decode = {};
  87. // query 长这个样 query=encodeURIComponent(value)
  88. const decodeStr = decodeURIComponent(jsonQuery);
  89. const { query } = this.parse(decodeStr); // 转成 json 获取到正真的json字符串
  90. if (query == null) {
  91. warn('当前解密参数不满足编码规则');
  92. } else {
  93. try {
  94. decode = JSON.parse(query);
  95. } catch (error) {
  96. warn('当前解密参数不满足编码规则');
  97. }
  98. }
  99. return decode;
  100. }
  101. queryGet(query) {
  102. const { encodeURI } = Global.Router.CONFIG; // 获取到路由配置
  103. let [decode, historyObj, strQuery] = [query, query, ''];
  104. switch (encodeURI) {
  105. case true: { // 加密模式
  106. decode = this.decode(query);
  107. strQuery = this.encode(decode);
  108. historyObj = {
  109. query: encodeURIComponent(JSON.stringify(decode)),
  110. };
  111. break;
  112. }
  113. case false: { // 不加密模式
  114. strQuery = this.stringify(query);
  115. break;
  116. }
  117. default: {
  118. err('未知参数模式,请检查 \'encodeURI\'', true);
  119. }
  120. }
  121. return { strQuery, historyObj, decode };
  122. }
  123. /**
  124. * 对需要传递的参数进行加密解密
  125. * @param {Object|String} query get为false 必须为 Object 类型
  126. * @param {String} get 是取值 还是通过api传值
  127. */
  128. transfer(query = {}) {
  129. const { encodeURI } = Global.Router.CONFIG; // 获取到路由配置
  130. switch (encodeURI) {
  131. case true: {
  132. // 加密模式
  133. return this.encode(query, false);
  134. }
  135. case false: {
  136. // 不加密模式
  137. return this.stringify(query);
  138. }
  139. default: {
  140. err('未知参数模式,请检查 \'encodeURI\' ', true);
  141. }
  142. }
  143. }
  144. }
  145. export default ParseQuery;