common.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525
  1. import store from '@/store'
  2. import { mobileReg } from './tools/validate'
  3. import { uploadPic } from '@/api/common'
  4. import CONSTANT from '@/constant/index'
  5. import { parse } from '@/utils/util'
  6. // 判断是mobile 还是pc
  7. export function isMobile() {
  8. // 移动端
  9. if (/(iPhone|iPad|iPod|iOS|Android)/i.test(navigator.userAgent)) {
  10. return true
  11. }
  12. return false
  13. }
  14. // 获取当前连接地址
  15. export function getUrlHref() {
  16. // let comProtocolUrl = window.location.protocol // 协议
  17. // let comHostUrl = window.location.host // 主机
  18. // let url = comProtocolUrl + '//' + comHostUrl
  19. // url = 'http://dev.meijiabang.com'
  20. return CONSTANT.formal
  21. }
  22. /** *
  23. * 跳转到商城
  24. * @parmas jumpUrl 跳转的页面地址
  25. * @parmas attrUrl 用户的头像地址
  26. * @parmas titleName 用户的名字
  27. * @parmas urlEndStr 跳转的页面url需要补充的参数 例'&aaa=111'
  28. */
  29. export function jumpShop(jumpUrl, attrUrl, titleName, urlEndStr) {
  30. }
  31. // 获取小程序地址完整路径
  32. export function getMiniAppUrl(data = {}, isPath = false) {
  33. let getCurPages = getCurrentPages()
  34. if (getCurPages.length == 0) return false
  35. let getCurPagesObj = getCurPages[getCurPages.length - 1]
  36. console.log(getCurPagesObj)
  37. // let getRoute = getCurPagesObj.route + queryData(getCurPagesObj.options)
  38. // let getRoute = getCurPagesObj.route + queryData(data)
  39. let getRoute = getCurPagesObj.route + parse(data)
  40. getRoute = isPath ? `${CONSTANT.formal}/#/${getRoute}` : getRoute
  41. return getRoute
  42. }
  43. // 获取当前时间戳
  44. export function getTimestamp() {
  45. return Date.parse(new Date())
  46. }
  47. // 生成从minNum到maxNum的随机数
  48. export function getRandomNum(minNum, maxNum) {
  49. switch (arguments.length) {
  50. case 1:
  51. return parseInt(Math.random() * minNum + 1, 10)
  52. // eslint-disable-next-line no-unreachable
  53. break
  54. case 2:
  55. return parseInt(Math.random() * (maxNum - minNum + 1) + minNum, 10)
  56. break
  57. default:
  58. return 0
  59. break
  60. }
  61. }
  62. // 节流
  63. export function debounce(fn, time) {
  64. let handle
  65. return function(e) {
  66. // 取消之前的延时调用
  67. clearTimeout(handle)
  68. handle = setTimeout(() => {
  69. fn(e)
  70. }, time || 50)
  71. }
  72. }
  73. // 登录页面公共地址栏参数传递
  74. export function loginParmas(data) {
  75. // eslint-disable-next-line one-var
  76. const query = {},
  77. ownerUserId = data.owner_user_id,
  78. shareUserId = data.share_user_id,
  79. pShareUserId = data.p_share_user_id,
  80. f = data.f
  81. // eslint-disable-next-line camelcase
  82. if (ownerUserId) {
  83. query['owner_user_id'] = ownerUserId
  84. }
  85. if (shareUserId) {
  86. query['share_user_id'] = shareUserId
  87. }
  88. if (pShareUserId) {
  89. query['p_share_user_id'] = pShareUserId
  90. }
  91. if (f) {
  92. query['f'] = f
  93. }
  94. return query
  95. }
  96. /** *
  97. * 根据时间戳获取日期时间
  98. * fmt格式 例:yyyy-MM-dd hh:mm:ss
  99. * status 为 true 时是13位时间
  100. */
  101. export function getFormatDate(time, fmt, status) {
  102. try {
  103. time = status ? time : time * 1000
  104. const now = new Date(time)
  105. return now.Format(fmt)
  106. } catch (e) {
  107. if (window.console) {
  108. console.log(e)
  109. }
  110. }
  111. }
  112. /** *
  113. * 时间格式化
  114. */
  115. // eslint-disable-next-line no-extend-native
  116. Date.prototype.Format = function(fmt = 'yyyy-MM-dd hh:mm:ss') {
  117. const o = {
  118. 'M+': this.getMonth() + 1, // 月份
  119. 'd+': this.getDate(), // 日
  120. 'h+': this.getHours(), // 小时
  121. 'm+': this.getMinutes(), // 分
  122. 's+': this.getSeconds(), // 秒
  123. 'q+': Math.floor((this.getMonth() + 3) / 3), // 季度
  124. S: this.getMilliseconds() // 毫秒
  125. }
  126. if (/(y+)/.test(fmt)) {
  127. fmt = fmt.replace(
  128. RegExp.$1,
  129. (this.getFullYear() + '').substr(4 - RegExp.$1.length)
  130. )
  131. }
  132. for (const k in o) {
  133. if (new RegExp('(' + k + ')').test(fmt)) {
  134. fmt = fmt.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length))
  135. }
  136. }
  137. return fmt
  138. }
  139. /** *
  140. * 根据日期获取时间戳
  141. * @parmas yyyy-MM-dd hh:mm:ss
  142. * @params second true的话获取的时间戳是到秒的
  143. */
  144. // 获取时间戳方法
  145. export function getDataTimestamp(time, second) {
  146. let etime = time || new Date
  147. if (second) {
  148. etime = Date.parse(time) / 1000
  149. } else {
  150. etime = new Date(etime)
  151. etime = etime.getTime()
  152. }
  153. return etime
  154. }
  155. // 判断是否为用户角色类型(个人: true || 企业: false)
  156. export function isPersonRoleType(roleType) {
  157. // 装修公司或材料商
  158. if (roleType === 1 || roleType === 2) {
  159. return false
  160. }
  161. // 其余类型均属于个人
  162. return true
  163. }
  164. /** *
  165. * 是否是微信浏览器
  166. */
  167. export function isWxBrowser() {
  168. let status = false
  169. // #ifdef H5
  170. const ua = window.navigator.userAgent.toLowerCase()
  171. // 通过正则表达式匹配ua中是否含有MicroMessenger字符串
  172. if (ua.match(/MicroMessenger/i) == 'micromessenger') {
  173. status = true
  174. } else {
  175. status = false
  176. }
  177. // #endif
  178. // #ifdef MP-WEIXIN
  179. status = false
  180. // #endif
  181. return status
  182. }
  183. /** *
  184. * 是否是微信小程序
  185. */
  186. export async function isWxMiniapp() {
  187. let status = false
  188. const ua = navigator.userAgent.toLowerCase()
  189. // ios的ua中无miniProgram,但都有MicroMessenger(表示是微信浏览器)
  190. // eslint-disable-next-line
  191. if (ua.match(/MicroMessenger/i) == 'micromessenger') {
  192. await wx.miniProgram.getEnv(function(res) {
  193. if (res.miniprogram) {
  194. status = true
  195. } else {
  196. // 走不在小程序的逻辑
  197. status = false
  198. }
  199. })
  200. } else {
  201. // 走不在小程序的逻辑
  202. status = false
  203. }
  204. return status
  205. }
  206. // 判断是用户角色类型
  207. export function getRoleTypeText(roleType) {
  208. if (roleType === 0) {
  209. return '普通用户'
  210. }
  211. // 装修公司或材料商
  212. if (roleType === 1) {
  213. return '装修公司'
  214. }
  215. if (roleType === 2) {
  216. return '材料商'
  217. }
  218. if (roleType === 3) {
  219. return '设计师'
  220. }
  221. if (roleType === 4) {
  222. return '项目经理/工长'
  223. }
  224. if (roleType === 5) {
  225. return '装修工人'
  226. }
  227. if (roleType === 6) {
  228. return '家居顾问'
  229. }
  230. }
  231. // 判断是用户角色类型
  232. export function getRoleTypeId(roleTypeText) {
  233. if (roleTypeText === '普通用户') {
  234. return 0
  235. }
  236. // 装修公司或材料商
  237. if (roleTypeText === '装修公司') {
  238. return 1
  239. }
  240. if (roleTypeText === '材料商') {
  241. return 2
  242. }
  243. if (roleTypeText === '设计师') {
  244. return 3
  245. }
  246. if (roleTypeText === '项目经理') {
  247. return 4
  248. }
  249. if (roleTypeText === '装修工人') {
  250. return 5
  251. }
  252. if (roleTypeText === '家居顾问') {
  253. return 6
  254. }
  255. }
  256. // 验证手机号码格式
  257. export function verifiPhone(phone) {
  258. if (phone.length != 11) {
  259. return false
  260. }
  261. return mobileReg.test(phone)
  262. }
  263. /** *
  264. * 获取位置距离
  265. * form 开始经纬度数据信息
  266. * to 结束经纬度数据信息
  267. * rule 运费规则
  268. * onlyDistance 是否只需要距离值
  269. */
  270. export function calcDistance(form = null, to = null, rule = {}, onlyDistance = false) {
  271. console.log('我开始计算运费了')
  272. console.log('form', form)
  273. console.log('to', to)
  274. console.log('rule', rule)
  275. if (!form || !to) {
  276. return
  277. }
  278. let lat1 = to.lat || to.latitude,
  279. lng1 = to.lng || to.longitude,
  280. lat2 = form.lat || form.latitude,
  281. lng2 = form.lng || form.longitude
  282. if (lat1 && lng1 && lat2 && lng2) {
  283. // eslint-disable-next-line one-var
  284. lat1 = lat1 * 1
  285. lng1 = lng1 * 1
  286. lat2 = parseFloat(lat2)
  287. lng2 = parseFloat(lng2)
  288. let distance = parseInt(calcDistanceFn(lat1, lng1, lat2, lng2))
  289. // 只需要返回距离的时候
  290. if (onlyDistance) {
  291. return distance
  292. }
  293. // 需要返回具体金额
  294. let freight = (distance - rule.first) * rule.add
  295. console.log('freight', freight)
  296. return freight
  297. } else {
  298. return 0
  299. }
  300. }
  301. // 计算距离 公用方法
  302. export function calcDistanceFn(lat1, lng1, lat2, lng2) {
  303. const f = (((lat1 + lat2) / 2) * Math.PI) / 180.0
  304. const g = (((lat1 - lat2) / 2) * Math.PI) / 180.0
  305. const l = (((lng1 - lng2) / 2) * Math.PI) / 180.0
  306. let sg = Math.sin(g)
  307. let sl = Math.sin(l)
  308. let sf = Math.sin(f)
  309. let s, c, w, r, d, h1, h2
  310. const a = 6378.137 // 取WGS84标准参考椭球中的地球长半径 单位M
  311. const fl = 1 / 298.257
  312. sg = sg * sg
  313. sl = sl * sl
  314. sf = sf * sf
  315. s = sg * (1 - sl) + (1 - sf) * sl
  316. c = (1 - sg) * (1 - sl) + sf * sl
  317. w = Math.atan(Math.sqrt(s / c))
  318. r = Math.sqrt(s * c) / w
  319. d = 2 * w * a
  320. h1 = (3 * r - 1) / 2 / c
  321. h2 = (3 * r + 1) / 2 / s
  322. return d * (1 + fl * (h1 * sf * (1 - sg) - h2 * (1 - sf) * sg))
  323. }
  324. // 对象参数转为url参数
  325. // export function queryData(data, getArr) {
  326. // let queryStr = ''
  327. // let num = 0
  328. // for (const i in data) {
  329. // if (!util.isEmpty(data[i])) {
  330. // if (num === 0) {
  331. // let arr = data[i]
  332. // if (getArr && Array.isArray(arr)) {
  333. // let str = ''
  334. // for (let j = 0; j < arr.length; j++) {
  335. // if (j == 0) {
  336. // str += `${i}[${j}]=${arr[j]}`
  337. // } else {
  338. // str += `&${i}[${j}]=${arr[j]}`
  339. // }
  340. // }
  341. // queryStr += `?${str}`
  342. // } else {
  343. // queryStr += `?${i}=${data[i]}`
  344. // }
  345. // } else {
  346. // let arr = data[i]
  347. // if (getArr && Array.isArray(arr)) {
  348. // let str = ''
  349. // for (let j = 0; j < arr.length; j++) {
  350. // str += `&${i}[${j}]=${arr[j]}`
  351. // }
  352. // queryStr += `${str}`
  353. // } else {
  354. // queryStr += `&${i}=${data[i]}`
  355. // }
  356. // }
  357. // num++
  358. // }
  359. // }
  360. // return queryStr
  361. // }
  362. // 上传图片到服务器
  363. export function upLoadImg(arr) {
  364. let params = {}
  365. if (arr.length === 1) {
  366. params['file[content]'] = arr[0]
  367. } else {
  368. arr.forEach((item, index) => {
  369. params[`file[${index}][content]`] = item
  370. })
  371. }
  372. return new Promise((resolve, reject) => {
  373. if (arr.length) {
  374. uploadPic({
  375. ...params,
  376. relative_path: 1
  377. }).then(res => {
  378. if (res.status === 'success') {
  379. const list = res.data.image_url.reverse()
  380. resolve(list)
  381. } else {
  382. reject(res)
  383. }
  384. })
  385. } else {
  386. resolve(arr)
  387. }
  388. })
  389. }
  390. // weixin base64转图片
  391. export function weixinBase64src(base64data) {
  392. return new Promise((resolve, reject) => {
  393. const [, format, bodyData] = /data:image\/(\w+);base64,(.*)/.exec(base64data) || []
  394. if (!format) {
  395. return (new Error('ERROR_BASE64SRC_PARSE'))
  396. }
  397. const filePath = `${wx.env.USER_DATA_PATH}/temporary_files1111aaccdd996633acv.${format}`
  398. const buffer = wx.base64ToArrayBuffer(bodyData)
  399. uni.getFileSystemManager().writeFile({
  400. filePath,
  401. data: buffer,
  402. encoding: 'binary',
  403. success: function(res) {
  404. resolve(filePath)
  405. },
  406. fail: function(err) {
  407. reject()
  408. console.log(err)
  409. }
  410. })
  411. })
  412. }
  413. // 深拷贝
  414. export function deepCopy(obj) {
  415. if (typeof obj !== 'object') { return }
  416. var str = JSON.stringify(obj)
  417. return JSON.parse(str)
  418. }
  419. // 复制到粘贴板
  420. export function copyText(str) {
  421. let that = this
  422. // #ifdef H5
  423. // 动态创建 textarea 标签
  424. const textarea = document.createElement('textarea')
  425. // 将该 textarea 设为 readonly 防止 iOS 下自动唤起键盘,同时将 textarea 移出可视区域
  426. textarea.readOnly = 'readonly'
  427. textarea.style.position = 'absolute'
  428. textarea.style.left = '-9999upx'
  429. // 将要 copy 的值赋给 textarea 标签的 value 属性
  430. textarea.value = str
  431. // 将 textarea 插入到 body 中
  432. document.body.appendChild(textarea)
  433. // 选中值并复制
  434. textarea.select()
  435. textarea.setSelectionRange(0, textarea.value.length)
  436. const result = document.execCommand('Copy')
  437. if (result) {
  438. that.$msg('复制成功')
  439. }
  440. document.body.removeChild(textarea)
  441. // #endif
  442. // #ifndef H5
  443. uni.setClipboardData({
  444. data: str,
  445. success: function() {
  446. that.$msg('复制成功')
  447. }
  448. })
  449. // #endif
  450. }
  451. // 冒泡排序
  452. export function bubbleSort(array) {
  453. if (Object.prototype.toString.call(array).slice(8, -1) === 'Array') {
  454. var len = array.length,
  455. temp
  456. for (var i = 0; i < len - 1; i++) {
  457. for (var j = len - 1; j >= i; j--) {
  458. if (array[j - 1] && array[j].level < array[j - 1].level) {
  459. temp = array[j]
  460. array[j] = array[j - 1]
  461. array[j - 1] = temp
  462. }
  463. }
  464. }
  465. return array
  466. } else {
  467. return 'array is not an Array!'
  468. }
  469. }
  470. export default {
  471. copyText,
  472. deepCopy,
  473. debounce,
  474. getUrlHref,
  475. jumpShop,
  476. getMiniAppUrl,
  477. getTimestamp,
  478. getRandomNum,
  479. loginParmas,
  480. getFormatDate,
  481. isMobile,
  482. getDataTimestamp,
  483. isPersonRoleType,
  484. isWxBrowser,
  485. isWxMiniapp,
  486. getRoleTypeText,
  487. getRoleTypeId,
  488. verifiPhone,
  489. calcDistance,
  490. upLoadImg,
  491. bubbleSort
  492. }