tools.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462
  1. import {
  2. API_URL,
  3. BASE_URL
  4. } from '@/env'
  5. // #ifdef APP-VUE
  6. import permision from "@/common/permission.js"
  7. // #endif
  8. import { setStorage, getStorage } from "@/util/index.js"
  9. const tools = {
  10. async chooseLocation() {
  11. return new Promise((resolve,reject) => {
  12. uni.chooseLocation({
  13. keyword: '',
  14. success: function (res) {
  15. console.log('位置名称:res.name' + res.name);
  16. console.log('详细地址:res.address' + res.address);
  17. console.log('纬度:res.latitude' + res.latitude);
  18. console.log('经度:res.longitude' + res.longitude);
  19. resolve(res)
  20. }
  21. });
  22. })
  23. },
  24. async getLocation() {
  25. const that = this;
  26. return new Promise((resolve,reject) => {
  27. uni.getLocation({type:'gcj02',geocode: true,success: (data)=> {
  28. let form = {
  29. latitude: data.latitude,
  30. longitude: data.longitude,
  31. };
  32. // const {province, city, district, street, streetNum} = data.address;
  33. // form.address = province + city + district + street + streetNum;
  34. // form.lat = data.latitude + '';
  35. // form.lon = data.longitude + '';
  36. // form.province = province + '';
  37. // form.city = city + '';
  38. // form.county = district + '';
  39. // that.coords({lat:form.lat,lon:form.lon}).then(res => {
  40. // const latitude = res.result[0].x;
  41. // const longitude = res.result[0].y;
  42. // form.lat = latitude;
  43. // form.lon = longitude;
  44. // resolve(form)
  45. // })
  46. resolve(form)
  47. }, fail: (err) => {
  48. console.log(err)
  49. }})
  50. })
  51. },
  52. // 图片处理-上传图片
  53. coords(coords = {lat: '',lon: ''}, loading = true) {
  54. if(loading) {
  55. uni.showLoading({
  56. title: '获取坐标请稍后'
  57. });
  58. }
  59. return new Promise((resolve, reject) => {
  60. uni.request({
  61. url: 'http://api.map.baidu.com/geoconv/v1/?coords=' + coords.lat + ',' + coords.lon + '&from=3&to=5&ak=YB8Sm61mr99t7RyZ2kUWvTAorO8b5dGV' + '&mcode=AB:80:5D:71:E3:31:EC:CA:DE:F1:60:67:13:E2:03:8C:CE:90:6B:1B;uni.UNIF3301E3',
  62. data: {},
  63. header: {
  64. },
  65. success: (res) => {
  66. uni.hideLoading()
  67. // console.log(res.data);
  68. resolve(res.data)
  69. },
  70. fail: (res) => {
  71. uni.hideLoading()
  72. // console.log(res.data);
  73. resolve(res.data)
  74. },
  75. });
  76. })
  77. },
  78. /**
  79. * fn:检测图片协议,主要用于检测海报图片协议。
  80. * param(imgPath): 图片地址。
  81. */
  82. checkImgHttp(imgPath) {
  83. let newPath = '';
  84. let pathArr = imgPath.split('://');
  85. // #ifdef H5
  86. let ishttps = 'https:' == window.location.protocol ? true : false;
  87. ishttps ? (pathArr[0] = 'https') : (pathArr[0] = 'http');
  88. // #endif
  89. // #ifdef MP-WEIXIN
  90. pathArr[0] = 'https'
  91. // #endif
  92. newPath = pathArr.join('://');
  93. return newPath;
  94. },
  95. // 打电话
  96. callPhone(phoneNumber = '') {
  97. let num = phoneNumber.toString()
  98. uni.makePhoneCall({
  99. phoneNumber: num,
  100. fail(err) {
  101. console.log('makePhoneCall出错', err)
  102. },
  103. });
  104. },
  105. // 图片处理-选择图片
  106. async chooseImage(count = 1, type = 'all') {
  107. if(type == 'album'){
  108. let checkPermission = await this.checkAppAlbum();
  109. if (checkPermission) {
  110. return new Promise((resolve, reject) => {
  111. uni.chooseImage({
  112. count: count, //默认9
  113. sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
  114. sourceType: [type], //从相册选择
  115. success: res => {
  116. resolve(res.tempFilePaths);
  117. }
  118. });
  119. }).catch(e => {
  120. reject(e)
  121. })
  122. }
  123. }
  124. else if(type == 'camera'){
  125. return new Promise((resolve, reject) => {
  126. uni.chooseImage({
  127. count: count, //默认9
  128. sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
  129. sourceType: [type], //从相册选择
  130. success: res => {
  131. resolve(res.tempFilePaths);
  132. }
  133. });
  134. }).catch(e => {
  135. reject(e)
  136. })
  137. }else if(type == 'all'){
  138. return new Promise((resolve, reject) => {
  139. uni.chooseImage({
  140. count: count, //默认9
  141. sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
  142. sourceType: ['album', 'camera'], //从相册选择
  143. success: res => {
  144. resolve(res.tempFilePaths);
  145. }
  146. });
  147. }).catch(e => {
  148. reject(e)
  149. })
  150. }
  151. },
  152. // 图片处理-上传图片
  153. uploadImage(url, loading = true) {
  154. let config_url = API_URL;
  155. let api = '/upload_file/upload_img'
  156. if(loading) {
  157. uni.showLoading({
  158. title: '上传中'
  159. });
  160. }
  161. return new Promise((resolve, reject) => {
  162. uni.uploadFile({
  163. url: config_url + api,
  164. filePath: url,
  165. name: 'file',
  166. header: {
  167. token: getStorage('token') || '',
  168. },
  169. success: res => {
  170. res = JSON.parse(res.data);
  171. if (res.code === 1) {
  172. if(loading) {
  173. uni.hideLoading()
  174. uni.showToast({
  175. title: '上传成功',
  176. icon: 'none'
  177. });
  178. }
  179. resolve(res.data.src)
  180. } else {
  181. if(loading) {
  182. uni.hideLoading()
  183. uni.showModal({
  184. title: '上传失败',
  185. content: res.msg
  186. });
  187. }
  188. reject('上传失败')
  189. }
  190. },
  191. fail: err => {
  192. if(loading) {
  193. uni.hideLoading()
  194. uni.showModal({
  195. title: '上传失败',
  196. content: err.msg
  197. });
  198. }
  199. reject(err)
  200. },
  201. });
  202. }).catch(e => {
  203. reject(e)
  204. })
  205. },
  206. // 图片处理-上传图片
  207. uploadImageAll(urls) {
  208. uni.showLoading({
  209. title: '上传中'
  210. });
  211. return new Promise((resolve, reject) => {
  212. // 多图上传
  213. const promiseList = urls.map(url => {
  214. return tools.uploadImage(url, false)
  215. })
  216. Promise.all(promiseList).then(res => {
  217. uni.hideLoading()
  218. uni.showToast({
  219. title: '上传成功',
  220. icon: 'none'
  221. });
  222. resolve(res)
  223. }).catch(err =>{
  224. uni.hideLoading()
  225. uni.showToast({
  226. title: '上传失败',
  227. icon: 'none'
  228. });
  229. })
  230. }).catch(e => {
  231. uni.hideLoading()
  232. reject(e)
  233. })
  234. },
  235. // 图片处理-预览图片
  236. previewImage(urls = [], current = 0) {
  237. uni.previewImage({
  238. urls: urls,
  239. current: current,
  240. indicator: 'default',
  241. loop: true,
  242. fail(err) {
  243. console.log('previewImage出错', urls, err)
  244. },
  245. })
  246. },
  247. // 图片处理-获取图片信息
  248. getImageInfo(src = '') {
  249. return new Promise((resolve, reject) => {
  250. uni.getImageInfo({
  251. src: src,
  252. success: (image) => {
  253. resolve(image)
  254. },
  255. fail(err) {
  256. console.log('getImageInfo出错', src, err)
  257. },
  258. })
  259. }).catch(e => {
  260. reject(e)
  261. })
  262. },
  263. /**
  264. * 格式化时间
  265. */
  266. //时间格式化 天时分秒
  267. format(t) {
  268. let format = {
  269. d: '00',
  270. h: '00',
  271. m: '00',
  272. s: '00',
  273. }
  274. if (t > 0) {
  275. let d = Math.floor(t / 86400)
  276. let h = Math.floor((t / 3600) % 24)
  277. let m = Math.floor((t / 60) % 60)
  278. let s = Math.floor(t % 60)
  279. format.d = d < 10 ? '0' + d : d
  280. format.h = h < 10 ? '0' + h : h
  281. format.m = m < 10 ? '0' + m : m
  282. format.s = s < 10 ? '0' + s : s
  283. }
  284. return format
  285. },
  286. //时间格式化(格式化最大为小时)
  287. formatToHours(t) {
  288. let format = {
  289. d: '00',
  290. h: '00',
  291. m: '00',
  292. s: '00',
  293. }
  294. if (t > 0) {
  295. let h = Math.floor(t / 3600)
  296. let m = Math.floor((t / 60) % 60)
  297. let s = Math.floor(t % 60)
  298. format.h = h < 10 ? '0' + h : h
  299. format.m = m < 10 ? '0' + m : m
  300. format.s = s < 10 ? '0' + s : s
  301. }
  302. return format
  303. },
  304. // 年月日
  305. timestamp(timestamp) {
  306. let date = new Date(timestamp * 1000); //根据时间戳生成的时间对象
  307. let y = date.getFullYear();
  308. let m = date.getMonth() + 1;
  309. let d = date.getDate();
  310. m = m < 10 ? '0' + m : m;
  311. d = d < 10 ? '0' + d : d
  312. let dateText = y + "-" + m + "-" + d
  313. return dateText
  314. },
  315. // 年月日,时分秒
  316. // "YYYY-mm-dd HH:MM"
  317. dateFormat(fmt, date) {
  318. let ret;
  319. const opt = {
  320. "Y+": date.getFullYear().toString(), // 年
  321. "m+": (date.getMonth() + 1).toString(), // 月
  322. "d+": date.getDate().toString(), // 日
  323. "H+": date.getHours().toString(), // 时
  324. "M+": date.getMinutes().toString(), // 分
  325. "S+": date.getSeconds().toString() // 秒
  326. // 有其他格式化字符需求可以继续添加,必须转化成字符串
  327. };
  328. for (let k in opt) {
  329. ret = new RegExp("(" + k + ")").exec(fmt);
  330. if (ret) {
  331. fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
  332. };
  333. };
  334. return fmt;
  335. },
  336. /**
  337. * @fn 时间间隔格式化
  338. * @param {*} startTime 开始时间的时间戳
  339. * @param {*} endTime 结束时间的时间戳
  340. * @return {string} str 返回时间字符串
  341. */
  342. getTimeInterval(startTime, endTime) {
  343. let runTime = parseInt((endTime - startTime) / 1000);
  344. let year = Math.floor(runTime / 86400 / 365);
  345. runTime = runTime % (86400 * 365);
  346. let month = Math.floor(runTime / 86400 / 30);
  347. runTime = runTime % (86400 * 30);
  348. let day = Math.floor(runTime / 86400);
  349. runTime = runTime % 86400;
  350. let hour = Math.floor(runTime / 3600);
  351. runTime = runTime % 3600;
  352. let minute = Math.floor(runTime / 60);
  353. runTime = runTime % 60;
  354. let second = runTime;
  355. let str = '';
  356. if (year > 0) {
  357. str = year + '年';
  358. }
  359. if (year <= 0 && month > 0) {
  360. str = month + '月';
  361. }
  362. if (year <= 0 && month <= 0 && day > 0) {
  363. str = day + '天';
  364. }
  365. if (year <= 0 && month <= 0 && day <= 0 && hour > 0) {
  366. str = hour + '小时';
  367. }
  368. if (year <= 0 && month <= 0 && day <= 0 && hour <= 0 && minute > 0) {
  369. str = minute + '分钟';
  370. }
  371. if (year <= 0 && month <= 0 && day <= 0 && hour <= 0 && minute <= 0 && second > 0) {
  372. str += second + '秒';
  373. }
  374. str += '前';
  375. return str;
  376. },
  377. /**
  378. * @fn 时间间隔格式化
  379. * @param {*} startTime 开始时间的时间戳
  380. * @param {*} endTime 结束时间的时间戳
  381. * @return {string} str 返回时间字符串
  382. */
  383. getDayInterval(startTime, endTime) {
  384. let runTime = parseInt((endTime - startTime)/1000);
  385. //计算出相差天数
  386. var days = Math.floor(runTime / (24 * 3600));
  387. if(days == 0) days = 1;
  388. return days;
  389. },
  390. /**提示框
  391. *title(标题)
  392. *icon(图标): success,loading,none
  393. *duration(延时): 0为不关闭, 毫秒数
  394. *options(其它参数)
  395. */
  396. toast(title, icon = 'none', options) {
  397. uni.showToast({
  398. title: title || '',
  399. icon: icon,
  400. duration: (options && options.duration) || 1500,
  401. image: (options && options.image) || '',
  402. mask: (options && options.mask) || true,
  403. });
  404. },
  405. /**
  406. * app检测获取相册权限
  407. * @return {String} status 1: 有权限。
  408. */
  409. async checkAppAlbum() {
  410. // #ifdef APP-VUE
  411. let status = permision.isIOS ? await permision.requestIOS('album') : await permision.requestAndroid([
  412. 'android.permission.READ_EXTERNAL_STORAGE', 'android.permission.WRITE_EXTERNAL_STORAGE'
  413. ]);
  414. if (status !== 1) {
  415. uni.showModal({
  416. content: '需要相册读写权限',
  417. confirmText: '设置',
  418. success: function(res) {
  419. if (res.confirm) {
  420. permision.gotoAppSetting();
  421. }
  422. }
  423. });
  424. return false
  425. } else {
  426. return true
  427. }
  428. // #endif
  429. // #ifndef APP-VUE
  430. return true
  431. // #endif
  432. },
  433. // 简单处理一下 parse html
  434. parseHtml(htmlStr){
  435. function formatUrl(url){
  436. if(url.indexOf('http') >= 0){
  437. return url
  438. }else{
  439. return BASE_URL + url;
  440. }
  441. }
  442. var newContent= htmlStr.replace(/<img [^>]*src=['"]([^'"]+)[^>]*>/gi,function(match,capture){
  443.   var newStr='<img src="' + formatUrl(capture) + '" alt="" />';
  444.   return newStr;
  445. });
  446. return newContent
  447. }
  448. }
  449. export default tools