tool.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416
  1. // #ifdef APP-PLUS
  2. import { chooseSystemMedia } from "@/uni_modules/uni-chooseSystemImage"
  3. // #endif
  4. import verConfig from "../ver.config"
  5. import { t } from "@/locale";
  6. import { getStorage } from './storage'
  7. import { getCurrentInstance } from "vue";
  8. import { useSystemStore } from "@/store";
  9. let useSystem = null;
  10. export const useGlobal = () => {
  11. const { appContext } = getCurrentInstance();
  12. return appContext.config.globalProperties;
  13. }
  14. export const getToken = (token = verConfig.tokenName) => {
  15. // const _token = JSON.parse(uni.getStorageSync(token) || '{}');
  16. // return _token.token || ''
  17. return getStorage(token);
  18. }
  19. export const Toast = (title, duration = 2000, icon = 'none') => new Promise((resolve, reject) => {
  20. uni.showToast({
  21. title,
  22. icon,
  23. duration,
  24. success: (res => resolve(res)),
  25. fail: (err => reject(err))
  26. })
  27. })
  28. export const query = (className, _instance) => new Promise((resolve, reject) => {
  29. let query = uni.createSelectorQuery()
  30. query.select(className).boundingClientRect(res => {
  31. resolve(res)
  32. }).exec()
  33. })
  34. export const Modal = ({ content, title = t('提示'), showCancel = true, cancelText = t('取消'), confirmText = t('确认') }) => new Promise((resolve, reject) => {
  35. uni.showModal({
  36. title,
  37. content,
  38. showCancel,
  39. cancelText,
  40. confirmText,
  41. success: (res => {
  42. if (res.confirm) {
  43. resolve(res.confirm)
  44. } else if (res.cancel) {
  45. reject(res.cancel)
  46. }
  47. }),
  48. fail: (err => {
  49. reject(err)
  50. })
  51. })
  52. })
  53. export const useImg = (url, options = {}) => {
  54. const { baseURL, api } = options;
  55. // if (url && url.charAt(0) === '/') {
  56. // url = url.substring(0, url.length);
  57. // }
  58. if (/^http/.test(url)) {
  59. return url;
  60. }
  61. return api ? ((baseURL || verConfig.newUrl) + api + url) : ((baseURL || verConfig.newUrl) + url);
  62. }
  63. export const systemInfo = () => {
  64. const res = uni.getSystemInfoSync();
  65. return res
  66. }
  67. export const downFile = ({ file_name, file_url, file_path, cattype }) => {
  68. let url = file_url || file_path
  69. // #ifdef APP-PLUS
  70. let dtask = plus.downloader.createDownload(url, {
  71. filename: `file:///storage/emulated/0/lawyerApp/${file_name}${getFileSuffix(url)[1]}`
  72. }, (d, status) => {
  73. if (status == 200) {
  74. Toast('文件下载并保存成功');
  75. } else {
  76. Toast('保存失败')
  77. }
  78. })
  79. plus.io.resolveLocalFileSystemURL('file:///storage/emulated/0/lawyerApp/', entry => {
  80. }, function (error) {
  81. plus.io.requestFileSystem(plus.io.PRIVATE_DOC, fs => {
  82. fs.root.getDirectory('lawyerApp', { create: true }, dirEntry => {
  83. dtask.start();
  84. }, function (err) { });
  85. });
  86. });
  87. // #endif
  88. // #ifdef H5
  89. fetch(url).then(response => {
  90. if (!response.ok) {
  91. throw new Error('网络响应不正常');
  92. }
  93. return response.blob();
  94. }).then(blob => {
  95. const objectUrl = URL.createObjectURL(blob);
  96. const link = document.createElement('a');
  97. link.href = objectUrl;
  98. link.download = file_name;
  99. document.body.appendChild(link);
  100. link.click();
  101. document.body.removeChild(link);
  102. URL.revokeObjectURL(objectUrl);
  103. }).catch(error => {
  104. Toast('下载失败')
  105. });
  106. // #endif
  107. }
  108. export const uploadChooseImage = (sourceType = 'album', count = 1) => new Promise((resolve, reject) => {
  109. // #ifdef APP-PLUS
  110. // if (systemInfo().osName == 'android') {
  111. // uploadSystemMedia('image', count).then(result => {
  112. // resolve(result)
  113. // })
  114. // .catch(err => {
  115. // reject(err)
  116. // })
  117. // return
  118. // }
  119. // #endif
  120. uni.chooseImage({
  121. count,
  122. sizeType: ['compressed'],
  123. sourceType: [sourceType],
  124. success: res => {
  125. console.log('----- uni.chooseImage res -----', JSON.stringify(res))
  126. if (count == 1) {
  127. const tempFilePath = res.tempFilePaths[0];
  128. const tempFile = res.tempFiles[0]
  129. return resolve({ tempFilePath, tempFile, errMsg: res.errMsg })
  130. }
  131. return resolve(res)
  132. },
  133. fail: err => {
  134. Toast(t('上传失败'));
  135. reject(err)
  136. }
  137. })
  138. })
  139. // #ifdef APP-PLUS
  140. export const uploadSystemMedia = (mediaType = 'image', count = 1) => new Promise((resolve, reject) => {
  141. chooseSystemMedia({
  142. count,
  143. pageOrientation: 'auto',
  144. mediaType: [mediaType],
  145. success: res => {
  146. if (count == 1) {
  147. const tempFilePath = res.filePaths[0];
  148. const tempFile = {
  149. path: res.filePaths[0],
  150. size: null
  151. }
  152. return resolve({ tempFilePath, tempFile, errMsg: 'chooseImage:ok' })
  153. }
  154. return resolve(res)
  155. },
  156. fail: err => {
  157. console.log('----- chooseSystemMedia err -----', JSON.stringify(err))
  158. Toast(t('上传失败'));
  159. reject(err)
  160. }
  161. })
  162. })
  163. // #endif
  164. export const uploadChooseVideo = (sourceType = ['album'], camera = 'back', extension = ['mp4', 'avi', 'mov']) => new Promise((resolve, reject) => {
  165. uni.chooseVideo({
  166. extension,
  167. sourceType,
  168. camera,
  169. compressed: true,
  170. success: res => {
  171. // #ifdef H5
  172. const type = res.tempFile.type;
  173. if (!type.includes('video')) return Toast('请上传视频');
  174. // #endif
  175. const screenWidth = systemInfo().screenWidth;
  176. const aspect = res.width / res.height;
  177. const videoWidth = screenWidth + 'rpx'
  178. const videoheight = (screenWidth / aspect) + 'rpx'
  179. resolve({
  180. tempFilePath: res.tempFilePath,
  181. videoWidth, videoheight
  182. })
  183. },
  184. fail: err => {
  185. Toast('上传失败');
  186. reject(err)
  187. }
  188. })
  189. })
  190. export const getFileSuffix = (str) => {
  191. const lastDotIndex = str.lastIndexOf('.');
  192. if (lastDotIndex === -1) {
  193. return '';
  194. }
  195. return [str.substring(0, lastDotIndex), str.substring(lastDotIndex)];
  196. }
  197. export const stringToHex = () => {
  198. let str = (getStorage(verConfig.infoName) || {}).id + '/1'
  199. let hex = '';
  200. for (let i = 0; i < str.length; i++) {
  201. hex += str.charCodeAt(i).toString(16).padStart(2, '0');
  202. }
  203. return `cu${hex}`;
  204. }
  205. var keepDigits = function (number, digital) {
  206. if (digital === void 0) { digital = 2; }
  207. var res = number.toString();
  208. var zeroNum = digital - res.length;
  209. for (var i = 0; i < zeroNum; i++) {
  210. res = "0" + res;
  211. }
  212. return res;
  213. };
  214. export const format = function (time, format) {
  215. if (!time) return
  216. if (format === void 0) { format = "yyyy-MM-dd HH:mm:ss"; }
  217. if (typeof time === "number") {
  218. var len = time.toString().length;
  219. if (len === 10) {
  220. time *= 1000;
  221. }
  222. }
  223. var date = new Date(time);
  224. var formatTypes = {
  225. y: date.getFullYear(),
  226. M: date.getMonth() + 1,
  227. d: date.getDate(),
  228. H: date.getHours(),
  229. m: date.getMinutes(),
  230. s: date.getSeconds()
  231. };
  232. var res = format;
  233. for (var key in formatTypes) {
  234. if (Object.prototype.hasOwnProperty.call(formatTypes, key)) {
  235. var value = formatTypes[key];
  236. res = res.replace(new RegExp(key + "+"), keepDigits(value, 2));
  237. }
  238. }
  239. return res;
  240. };
  241. export const debounce = (func, delay) => {
  242. let timer;
  243. return function (...args) {
  244. clearTimeout(timer);
  245. timer = setTimeout(() => {
  246. func.apply(this, args);
  247. }, delay);
  248. };
  249. }
  250. export const throttle = (func, limit) => {
  251. let lastFunc;
  252. let lastRan;
  253. return function (...args) {
  254. const context = this;
  255. if (!lastRan) {
  256. func.apply(context, args);
  257. lastRan = Date.now();
  258. } else {
  259. clearTimeout(lastFunc);
  260. lastFunc = setTimeout(function () {
  261. if ((Date.now() - lastRan) >= limit) {
  262. func.apply(context, args);
  263. lastRan = Date.now();
  264. }
  265. }, limit - (Date.now() - lastRan));
  266. }
  267. };
  268. }
  269. export const uniappStorage = {
  270. getItem: (key) => {
  271. try {
  272. return uni.getStorageSync(key) || null
  273. } catch (error) {
  274. return null
  275. }
  276. },
  277. setItem: (key, value) => {
  278. try {
  279. uni.setStorageSync(key, value)
  280. } catch (error) { }
  281. }
  282. }
  283. export const openUrl = (url) => {
  284. // #ifdef H5
  285. window.location.href = url;
  286. // #endif
  287. // #ifdef APP
  288. plus.runtime.openURL(url)
  289. // #endif
  290. }
  291. export const refresh = (url) => {
  292. // #ifdef H5
  293. window.location.reload();
  294. // #endif
  295. // #ifdef APP
  296. uni.navigateTo({ url });
  297. // #endif
  298. }
  299. export const converMoney = (money, rate = 1) => {
  300. useSystem = useSystemStore();
  301. const symbol = useSystem.getSymbol;
  302. if (!money) return '0.00';
  303. money = typeof money === 'string' ? (money - 0) : money;
  304. rate = Number(symbol.rate)
  305. const newMoney = (money / rate).toFixed(2);
  306. return `${newMoney}`
  307. }
  308. export const Moneyhtml = (money, flag = false, isConver = true) => {
  309. useSystem = useSystemStore();
  310. const symbol = useSystem.getSymbol;
  311. if (!money) return '0.00';
  312. const price = Number(money).toFixed(2);
  313. let newMoney = price;
  314. if (isConver) newMoney = converMoney(price, symbol.rate)
  315. const arr = newMoney.split('.');
  316. if (flag) return `<span class="price">${arr[0]}</span><span class="decimal">.${arr[1]}</span>`;
  317. return newMoney
  318. }
  319. export const converAboutMoney = (money, symbol, CnyItem) => {
  320. if (!money) return '0.00';
  321. money = typeof money === 'string' ? (money - 0) : money;
  322. let rate = Number(symbol.rate || 1)
  323. const newMoney = (money / rate).toFixed(2);
  324. return {
  325. CnyMoney: (money / (CnyItem?.rate || 1)).toFixed(2),
  326. newMoney
  327. }
  328. }
  329. export const MoneyAbouthtml = (money, flag = false) => {
  330. useSystem = useSystemStore();
  331. const symbol = useSystem.getSymbol;
  332. const rateList = useSystem.getRateList;
  333. const CnyItem = rateList.find(item => item.code === 'CNY');
  334. if (!money) return '0.00';
  335. const price = typeof money === 'string' ? (money - 0) : money;
  336. const { CnyMoney, newMoney } = converAboutMoney(price, symbol, CnyItem);
  337. const cnyArr = CnyMoney.split('.');
  338. const arr = newMoney.split('.');
  339. let html = `<span class="icon">${CnyItem?.symbol}</span><span class="price">${cnyArr[0]}</span><span class="decimal">.${cnyArr[1]}</span>`
  340. let rateHtml = `<span class="icon">${symbol.symbol}</span><span class="price">${arr[0]}</span><span class="decimal">.${arr[1]}</span>`
  341. if (flag) {
  342. if (symbol.code === 'CNY') {
  343. const USDItem = rateList.find(item => item.code === 'USD');
  344. const usdArr = (price / (USDItem?.rate || 1)).toFixed(2).split('.');
  345. rateHtml = `<span class="icon">${USDItem.symbol}</span><span class="price">${usdArr[0]}</span><span class="decimal">.${usdArr[1]}</span>`
  346. }
  347. return `${html}<span class="icon2">&nbsp;≈&nbsp;</span><span class="icon">${rateHtml}`;
  348. };
  349. return `<span class="icon">${CnyItem.symbol}</span>${CnyMoney}<span class="icon2">&nbsp;≈&nbsp;</span><span class="icon">${symbol.symbol}</span>${newMoney}`
  350. }
  351. export const TimeOut = (callback = () => { }, time = 2000) => {
  352. let timer = setTimeout(() => {
  353. callback();
  354. clearTimeout(timer);
  355. }, time)
  356. return timer;
  357. }
  358. export const getDeviceInfo = () => {
  359. return uni.getDeviceInfo();
  360. }
  361. export const getEnterOptions = () => {
  362. return uni.getEnterOptionsSync()
  363. }
  364. export const urlStrToArr = (str = "", separator = ",") => {
  365. return str
  366. .split(separator)
  367. .map((item) => item.trim())
  368. .filter((item) => item);
  369. }
  370. export const openUrlBlank = (url) => {
  371. if (!url || typeof url !== 'string') {
  372. console.error('无效的 URL:', url);
  373. return;
  374. }
  375. // #ifdef H5
  376. window.open(url, '_blank');
  377. // #endif
  378. // #ifdef APP-PLUS
  379. plus.runtime.openURL(url)
  380. // #endif
  381. };