common.ts 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. // import { CryptoJS } from './crypto-js.min.js';
  2. import { CryptoJS } from './crypto-js.min.js';
  3. let loading = false;
  4. let count = 0;
  5. /** 请求弹窗开启 */
  6. export const showLoading = function (title = '') {
  7. if (!loading) {
  8. uni.showLoading({
  9. title: title || '',
  10. mask: true,
  11. });
  12. loading = true;
  13. }
  14. count += 1;
  15. };
  16. /** 请求弹窗关闭 */
  17. export const hideLoading = function () {
  18. let timer = setTimeout(() => {
  19. // 在下一次tick中如果没有新的loading进来(count === 1) 则关闭loading (消除多接口同步或者异步的loading闪屏)
  20. if (count === 1 && loading) {
  21. uni.hideLoading();
  22. loading = false;
  23. }
  24. count -= 1;
  25. clearTimeout(timer);
  26. timer = null;
  27. }, 0);
  28. };
  29. /** 提示消息 */
  30. export const showToast = function (msg: string, fn = () => {}, duration = 1500) {
  31. let timer = null;
  32. uni.showToast({
  33. title: msg,
  34. mask: true,
  35. icon: 'none',
  36. duration: duration,
  37. });
  38. if (fn) {
  39. timer = setTimeout(() => {
  40. fn();
  41. timer = null;
  42. }, duration);
  43. }
  44. };
  45. /** 提示信息 */
  46. export const showModal = function (content: string, callBack = () => {}, data: any = {}) {
  47. uni.showModal({
  48. content: content,
  49. title: data.title || '',
  50. confirmText: data.confirmText || '确定',
  51. confirmColor: data.confirmColor || '',
  52. cancelColor: data.cancelColor || '',
  53. cancelText: data.cancelText || '',
  54. showCancel: data.cancelText ? true : false,
  55. success: (res) => {
  56. if (res.confirm && callBack instanceof Function) {
  57. callBack();
  58. }
  59. if (!res.confirm && data.callBack instanceof Function) {
  60. data.callBack();
  61. }
  62. },
  63. });
  64. };
  65. /** 是否为空 */
  66. export const isEmpty = function (obj) {
  67. if (obj == undefined || obj == null || obj == '') {
  68. return true;
  69. } else if (obj instanceof Array) {
  70. return obj.length <= 0;
  71. } else if (obj instanceof Object) {
  72. return Object.keys(obj).length <= 0;
  73. }
  74. return false;
  75. };
  76. /** 是否不为空 */
  77. export const isNotEmpty = function (obj) {
  78. return !isEmpty(obj);
  79. };
  80. /** 判断是否为JSON */
  81. export const isJSON = function (str) {
  82. /** JSON.stringify */
  83. if (typeof str == 'string') {
  84. try {
  85. var obj = JSON.parse(str);
  86. if (typeof obj == 'object' && obj) {
  87. return true;
  88. } else {
  89. return false;
  90. }
  91. } catch (e) {
  92. return false;
  93. }
  94. }
  95. };
  96. export const stringify = function (str) {
  97. return escape(JSON.stringify(str));
  98. };
  99. /** des加密 */
  100. export const desEncrypt = function (message, key) {
  101. let keyHex = CryptoJS.enc.Utf8.parse(key);
  102. let encrypted = CryptoJS.DES.encrypt(message, keyHex, {
  103. mode: CryptoJS.mode.ECB,
  104. padding: CryptoJS.pad.Pkcs7,
  105. });
  106. return encrypted.toString();
  107. };
  108. /** des ECB解密str:秘钥串;key:秘钥;exportType:输出方式; */
  109. export const desDecrypt = function (str, key, exportType) {
  110. let keyHex = CryptoJS.enc.Utf8.parse(key);
  111. let decrypted = CryptoJS.DES.decrypt(
  112. exportType == 'hex'
  113. ? {
  114. ciphertext: CryptoJS.enc.Hex.parse(str),
  115. }
  116. : str,
  117. keyHex,
  118. {
  119. mode: CryptoJS.mode.ECB,
  120. padding: CryptoJS.pad.Pkcs7,
  121. }
  122. );
  123. return decrypted.toString(CryptoJS.enc.Utf8);
  124. };
  125. /** 数组转化成对象,方便使用 */
  126. export const turnToMap = (list) => {
  127. let map = {};
  128. list.map((item) => {
  129. map[item.routePath] = JSON.parse(item.infoJson || '{}');
  130. });
  131. return map;
  132. };
  133. /**
  134. * 页面跳转 封装使用不同的微信页面跳转方法
  135. * @param {string} toUrl 跳转路由
  136. * @param {string} skipWay 跳转方法(
  137. navigateTo : 保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面。使用 wx.navigateBack 可以返回到原页面。小程序中页面栈最多十层
  138. switchTab : 跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面
  139. reLaunch : 关闭所有页面,打开到应用内的某个页面
  140. redirectTo : 关闭当前页面,跳转到应用内的某个页面。但是不允许跳转到 tabbar 页面。
  141. )
  142. * @param {string} data
  143. */
  144. export const goToUrl = function (toUrl, data: any = { skipWay: 'navigateTo', data: '' }) {
  145. var menu = [];
  146. let num = toUrl.indexOf('?') || 0; // 参数下标
  147. let key = toUrl.substr(num == -1 ? toUrl.length : num, toUrl.length); // 获取地址带参
  148. let url = toUrl.substr(0, num == -1 ? toUrl.length : num); // 获取地址除去带的参数
  149. if (uni.getStorageSync('menuList')) {
  150. menu = uni.getStorageSync('menuList');
  151. }
  152. menu = menu.filter((item) => item.MenuName == 'DiyMenu');
  153. if (isNotEmpty(menu) && isNotEmpty(menu[0])) {
  154. var diyMenu = menu[0];
  155. diyMenu.Children.forEach(function (val, index) {
  156. var FromUrl = val.FromUrl;
  157. var ToDiyUrl = val.ToUrl;
  158. if (url == FromUrl) {
  159. url = ToDiyUrl;
  160. }
  161. });
  162. }
  163. // 判断是否是传data.data (data.data代表页面值)
  164. if (isNotEmpty(data.data)) {
  165. if (data.data.indexOf('?') == -1) {
  166. url = url + '?' + data.data;
  167. } else {
  168. url = url + data.data;
  169. }
  170. }
  171. // 判断是否是地址带参
  172. if (isNotEmpty(key)) {
  173. // 判断是否有http跳转
  174. if (key.indexOf('url=') >= 0) {
  175. let url_ = key.substr(key.indexOf('url=') + 4);
  176. // 传入的url未转码 则转码 已转码 则不处理
  177. if (url_ == decodeURIComponent(url_)) {
  178. url_ = encodeURIComponent(url_);
  179. }
  180. key = key.substr(0, key.indexOf('url=') + 4) + url_;
  181. }
  182. url = url + key;
  183. }
  184. // 使用微信那种跳转方法
  185. let way = data.skipWay || 'navigateTo';
  186. uni[way]({
  187. url: url,
  188. success: () => {
  189. // loadSysAppPageMessage(url);
  190. },
  191. });
  192. };
  193. /** 返回上delta级,并修改上delta级页面数据,默认会调用refresh方法刷新页面数据 */
  194. export const navigateBack = function (delta, key = '', value = '') {
  195. let pages = getCurrentPages();
  196. let goPage = pages[pages.length - (delta + 1)] as any;
  197. if (isNotEmpty(key)) {
  198. // goPage.setData({
  199. // [key]: value,
  200. // });
  201. }
  202. uni.navigateBack({
  203. delta: delta,
  204. });
  205. // if (typeof goPage.refresh == 'function') {
  206. // goPage.refresh();
  207. // }
  208. };
  209. /** 日期格式化 */
  210. export const dateFormat = function (date) {
  211. const weekArr = ['日', '一', '二', '三', '四', '五', '六'];
  212. let year = date.getFullYear();
  213. let month = formatNumber(date.getMonth() + 1);
  214. let day = formatNumber(date.getDate());
  215. let week = weekArr[date.getDay()];
  216. let hour = formatNumber(date.getHours());
  217. let min = formatNumber(date.getMinutes());
  218. let sec = formatNumber(date.getSeconds());
  219. return {
  220. regDate: `${year}年${month}月${day}日 星期${week}`,
  221. date: `${year}${month}${day}`,
  222. formatYear: `${year}-${month}-${day}`,
  223. formatMon: `${month}-${day}`,
  224. formatMon_C: `${month}月${day}日`,
  225. formatTime: `${year}-${month}-${day} ${hour}:${min}:${sec}`,
  226. week: `星期${week}`,
  227. day: day,
  228. year: year,
  229. time: `${hour}${min}`,
  230. };
  231. };
  232. /** 日期补足两位 */
  233. export const formatNumber = function (n) {
  234. n = n.toString();
  235. return n[1] ? n : '0' + n;
  236. };
  237. /** 对象合并 忽略未定义的值 */
  238. export const mergeObject = function (A, B) {
  239. let res = {};
  240. Object.keys({ ...A, ...B }).map((key) => {
  241. res[key] = B[key] || A[key];
  242. });
  243. return res;
  244. };
  245. /** 根据经纬度计算距离,单位 :千米 */
  246. export const getDistance = function (la1, lo1, la2, lo2) {
  247. var La1 = (la1 * Math.PI) / 180.0;
  248. var La2 = (la2 * Math.PI) / 180.0;
  249. var La3 = La1 - La2;
  250. var Lb3 = (lo1 * Math.PI) / 180.0 - (lo2 * Math.PI) / 180.0;
  251. var s: any =
  252. 2 *
  253. Math.asin(
  254. Math.sqrt(
  255. Math.pow(Math.sin(La3 / 2), 2) +
  256. Math.cos(La1) * Math.cos(La2) * Math.pow(Math.sin(Lb3 / 2), 2)
  257. )
  258. );
  259. s = s * 6378.137; //地球半径
  260. s = Math.round(s * 10000) / 10000;
  261. s = s.toFixed(2);
  262. return s;
  263. };
  264. /** 休眠 */
  265. export const sleep = (val = 100) => {
  266. try {
  267. val = Number(val);
  268. return new Promise((resolve) => {
  269. let timer = setTimeout(() => {
  270. resolve(true);
  271. clearTimeout(timer);
  272. timer = null;
  273. }, val);
  274. });
  275. } catch (error) {}
  276. };