location.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. /** 用戶位置信息 */
  2. import {
  3. getUserRegion
  4. } from '@/api/system'
  5. // import store from '@/store'
  6. /** 用戶手机定位 */
  7. let mLocation = {
  8. lat: null,
  9. lng: null
  10. }
  11. /** 用户地址回调 */
  12. let callFunction = null
  13. export async function mGetPosition() {
  14. let getCurPages = getCurrentPages()
  15. let getRoute = getCurPages.length > 0 ? getCurPages[0].route : ''
  16. const client_hash = uni.getStorageSync('client_hash')
  17. if (mLocation.lat && mLocation.lng) {
  18. return mLocation
  19. }
  20. if (!client_hash && getRoute == 'pages/page/login/index') {
  21. return null
  22. }
  23. // mLocation = getObj
  24. mLocation.lat = getObj.latitude
  25. mLocation.lng = getObj.longitude
  26. return mLocation
  27. }
  28. /** 腾讯地图定位 */
  29. // 初始化或更新用户位置信息缓存
  30. let positionType = null
  31. let retryNum = 1
  32. export function getPosition(callFn) {
  33. if (callFn) {
  34. callFunction = callFn
  35. }
  36. mGetPosition().then(res => {
  37. showPosition()
  38. })
  39. }
  40. function showPosition() {
  41. if (retryNum > 6) return false
  42. let userRegion = uni.getStorageSync('userRegion')
  43. let intervalTime = 30 * 60 * 1000 // 默认半小时过期
  44. // 判断是否已存在位置信息缓存
  45. if (userRegion) {
  46. userRegion = JSON.parse(userRegion)
  47. // 获取后台返回的有效时间间隔
  48. let timesTamp = new Date().getTime()
  49. if (userRegion.expire * 1000 > timesTamp) {
  50. intervalTime = userRegion.expire * 1000 - timesTamp
  51. retryNum = 1
  52. } else {
  53. intervalTime = 10000
  54. retryNum++
  55. }
  56. }
  57. if (mLocation.lat && mLocation.lng) {
  58. positionType = 'mobile'
  59. if (userRegion) {
  60. // 当前时间大于等于过期时间(超过有效时间间隔后)重新请求接口更新缓存
  61. if (callFunction) {
  62. callFunction(userRegion)
  63. }
  64. callFunction = null
  65. setTimeout(() => {
  66. fetchPosition(mLocation)
  67. }, intervalTime)
  68. } else {
  69. // 页面首次渲染请求接口设置缓存
  70. fetchPosition(mLocation)
  71. }
  72. }
  73. }
  74. // 根据用户经纬度请求用户位置信息
  75. function fetchPosition(position) {
  76. if (!position.lat && !position.lng) {
  77. console.error('获取经纬度失败!')
  78. return false
  79. }
  80. uni.setStorageSync('miscPosition', JSON.stringify(position))
  81. let params = {
  82. lng_lat_type: positionType,
  83. lat: position.lat,
  84. lng: position.lng
  85. }
  86. getUserRegion(params).then(res => {
  87. if (res.status === 'success') {
  88. // 设置或更新用户位置信息缓存
  89. if (callFunction) {
  90. callFunction(res.data)
  91. }
  92. callFunction = null
  93. uni.setStorageSync('userRegion', JSON.stringify(res.data))
  94. // 提交用户位置信息状态
  95. // store.commit('FETCH_USER_REGION', res.data)
  96. showPosition()
  97. }
  98. })
  99. }
  100. export default {
  101. mLocation,
  102. mGetPosition,
  103. getPosition
  104. }