urlQuery.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  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. // 保留query的原逻辑赋值,使用substring去除第一位的?
  66. formatQuery += uni.$u.queryParams({
  67. query: encodeURIComponent(strQuery),
  68. ...query,
  69. }).substring(1);
  70. return formatQuery;
  71. }
  72. /**
  73. * 把一个已经加密好的字符串 query=encodeURIComponent(value) 解密成 对象
  74. * @param {string} strQuery 已经加密好的字符串 query=encodeURIComponent(value)
  75. */
  76. decode(strQuery) {
  77. if (strQuery == null) {
  78. warn('解密参数没有传递,你知道?', true);
  79. return {};
  80. }
  81. let jsonQuery = strQuery;
  82. if (strQuery.constructor === Object) { // 如果是对象 看能不能满足要求
  83. jsonQuery = strQuery.query;
  84. if (jsonQuery == null) {
  85. warn('当前解密参数不满足编码规则');
  86. return {};
  87. }
  88. jsonQuery = `query=${jsonQuery}`;
  89. }
  90. let decode = {};
  91. // query 长这个样 query=encodeURIComponent(value)
  92. const decodeStr = decodeURIComponent(jsonQuery);
  93. const { query } = this.parse(decodeStr); // 转成 json 获取到正真的json字符串
  94. if (query == null) {
  95. warn('当前解密参数不满足编码规则');
  96. } else {
  97. try {
  98. decode = JSON.parse(query);
  99. } catch (error) {
  100. warn('当前解密参数不满足编码规则');
  101. }
  102. }
  103. return decode;
  104. }
  105. queryGet(query) {
  106. // 直接给原query参数进行重新赋值操作,以确保decode方法无误
  107. query = { query: JSON.stringify(query) };
  108. const { encodeURI } = Global.Router.CONFIG; // 获取到路由配置
  109. let [decode, historyObj, strQuery] = [query, query, ''];
  110. switch (encodeURI) {
  111. case true: { // 加密模式
  112. decode = this.decode(query);
  113. strQuery = this.encode(decode);
  114. historyObj = {
  115. query: encodeURIComponent(JSON.stringify(decode)),
  116. };
  117. break;
  118. }
  119. case false: { // 不加密模式
  120. strQuery = this.stringify(query);
  121. break;
  122. }
  123. default: {
  124. err('未知参数模式,请检查 \'encodeURI\'', true);
  125. }
  126. }
  127. return { strQuery, historyObj, decode };
  128. }
  129. /**
  130. * 对需要传递的参数进行加密解密
  131. * @param {Object|String} query get为false 必须为 Object 类型
  132. * @param {String} get 是取值 还是通过api传值
  133. */
  134. transfer(query = {}) {
  135. const { encodeURI } = Global.Router.CONFIG; // 获取到路由配置
  136. switch (encodeURI) {
  137. case true: {
  138. // 加密模式
  139. return this.encode(query, false);
  140. }
  141. case false: {
  142. // 不加密模式
  143. return this.stringify(query);
  144. }
  145. default: {
  146. err('未知参数模式,请检查 \'encodeURI\' ', true);
  147. }
  148. }
  149. }
  150. }
  151. export default ParseQuery;