微信小程序也可以实现定位打卡/签到打卡了(附源码)

简介: 本篇文章带你实现实时定位功能:包括实时定位监听、定位权限判断、经纬度间距计算、判断当前位置是否在目的地的范围区间。

主要应用场景包括但不限于:定位打卡。


1、在 package.json 文件中添加导入文件


"dependencies": {
  "@rattan/location":"1.0.2",
},

2、代码示例


<template>
  <view class="page-content">
  <view style="padding-top: 200rpx;">
  </view>
  <view style="margin: 20rpx;padding: 10rpx;background: #FFFFFF;">
    <view style="padding: 20rpx;color: 666666;">
    <view style="color: #000000;">
      1、当前经纬度:
    </view>
    <view style="margin-left: 20rpx;">
      经度:{{cData.curPos.lon}}
    </view>
    <view style="margin-left: 20rpx;">
      纬度:{{cData.curPos.lat}}
    </view>
    <view style="padding: 20rpx;color: #000000;">
      2、目的地经纬度:
    </view>
    <view style="margin-left: 20rpx;">
      经度:{{cData.desPos.lon}}
    </view>
    <view style="margin-left: 20rpx;">
      纬度:{{cData.desPos.lat}}
    </view>
    </view>
    <view style="padding: 20rpx;color: 666666;">
    <view style="color: #000000;">
      3、设定{{cData.rangeMeter}}米属于范围区间内:
    </view>
    <view style="margin-left: 20rpx;">
      距离目的地:{{cData.curDis}}米
    </view>
    <view style="margin-left: 20rpx;">
      {{cInRangeStr}}
    </view>
    </view>
    <view style="padding: 20rpx;">
    <view v-if="cNOLocationTips.length > 0" style="color: #000000;">
      4、未权限提示:
    </view>
    <view v-for="(item,index) in cNOLocationTips" :key="index">
      <view class="auth-tips" style="margin-left: 20rpx;">
      {{item}}
      </view>
    </view>
    </view>
  </view>
  </view>
</template>
<script>
  import func from "@rattan/location/func.js"
  import zmLoc from "@rattan/location/index.js"
  export default {
  components: {
  },
  data() {
    return {
    cData: { // 自定义判断字段
      curPos: { // 当前经纬度定位
      lat: 24.46667,
      lon: 118.184761,
      },
      desPos: { // 目的地经纬度
      lat: 24.490107,
      lon: 118.184861,
      },
      curDis: 10000, //与目标距离  单位:米
      rangeMeter: 1000, //范围区间,单位:米
      isInRange: false, //是否在打卡范围内
      // ------ 定位启闭状态 ------
      isLocationMobileSystem: true, // 手机系统
      isLocationWechatApp: true, // 微信app,如果手机系统定位关闭,那么微信app定位也是关闭状态
      isLocationByMiniProgram: true, // 微信小程序
    },
    }
  },
  computed: {
    // 定位没有打开提示文案
    cNOLocationTips() {
    let _arr = []
    if (this.cData.isLocationMobileSystem == false) {
      _arr.push("* 请打开手机和微信应用定位服务")
    } else if (this.cData.isLocationMobileSystem == true &&
      this.cData.isLocationWechatApp == false) {
      _arr.push("* 请打开微信应用定位服务")
    }
    if (this.cData.isLocationByMiniProgram == false) {
      _arr.push(
      "* 请打开小程序定位服务,点击右上角···,点击设置"
      )
    }
    return _arr
    },
    // 是否进入区间范围提示
    cInRangeStr() {
    return this.cData.isInRange ? "已进入范围区间" : "未进入范围区间";
    },
  },
  onLoad(options) {
    this.addMonitor()
  },
  onUnload(options) {
    this.removeMonitor()
  },
  onShow(options) {
    this.openPosition();
  },
  onHide(options) {
    this.closePosition();
  },
  methods: {
    // 开启定位
    openPosition() {
    const systemInfo = uni.getSystemInfoSync()
    // 模拟器没有这两个字段,设置默认打开
    if (systemInfo.locationEnabled != undefined &&
      systemInfo.locationAuthorized != undefined) {
      // 手机系统定位开关
      this.cData.isLocationMobileSystem = systemInfo.locationEnabled;
      // 微信app定位开关,如果手机系统定位关闭,那么微信app定位也会一起关闭
      this.cData.isLocationWechatApp = systemInfo.locationAuthorized
      console.log("手机系统定位开关:", this.cData.isLocationMobileSystem)
      console.log("微信应用定位开关:", this.cData.isLocationWechatApp)
    }
    zmLoc.zmStartMonitor()
    },
    // 关闭定位
    closePosition() {
    zmLoc.zmEndMonitor();
    },
    // 添加监听
    addMonitor() {
    let that = this;
    // 定位监听 - 成功回调
    uni.$on('iAuthorityOpen', (res) => {
      console.log("小程序定位开关:", res)
      if (that.cData.isLocationByMiniProgram != res) {
      that.cData.isLocationByMiniProgram = res;
      }
    })
    // 定位监听 - 成功回调
    uni.$on('iLocationSuc', (res) => {
      console.log('iLocationSuc:', JSON.stringify(res))
      if (!that.$u.test.isEmpty(res)) {
      that.cData.curPos = {
        lat: res?.latitude,
        lon: res?.longitude,
      }
      }
      if (!that.$u.test.isEmpty(that.cData.desPos) &&
      !that.$u.test.isEmpty(that.cData.curPos)) {
      that.checkDistanceAndRange()
      } else {
      console.log("======没有返回经纬度对象")
      that.cData.isInRange = false;
      }
    })
    // 定位监听 - 失败回调
    uni.$on('iLocationErr', (e) => {
      console.log("iLocationErr_e:", JSON.stringify(e));
    })
    },
    // 移除监听
    removeMonitor() {
    zmLoc.zmEndMonitor();
    // 结束定位监听
    uni.$off('iAuthorityOpen');
    uni.$off('iLocationSuc');
    uni.$off('iLocationErr');
    },
    // 计算距离和是否在打卡区间
    checkDistanceAndRange() {
    // 单位:米
    this.cData.curDis = (func.zmCalcuDistance(
      this.cData.curPos.lat,
      this.cData.curPos.lon,
      this.cData.desPos.lat,
      this.cData.desPos.lon) * 1000).toFixed(1)
    console.log("curDis:", this.cData.curPos.lat, ",", this.cData.curPos.lon)
    console.log("desDis:", this.cData.desPos.lat, ",", this.cData.desPos.lon)
    console.log("距离:", JSON.stringify(this.cData.curDis), "米")
    this.cData.isInRange = this.cData.curDis <= this.cData.rangeMeter ? true : false;
    },
  },
  }
</script>
<style lang="scss" scoped>
  .page-content {
  width: 100%;
  height: 100%;
  background: #F5F9FC;
  .auth-tips {
    padding-bottom: 12rpx;
    width: 100%;
    text-align: left;
    font-size: 24rpx;
    color: #FF0000;
  }
  }
</style>


源码/demo展示:


1、gitee:https://gitee.com/chenzm_186/demo-real-time-location-mini

2、csdn:https://download.csdn.net/download/weixin_38633659/85436545


相关文章
|
1月前
|
Android开发 开发者 Python
手撸了一个全自动微信清粉小工具(源码详解)
微信清理僵尸粉工具利用Python和`uiautomator2`库,通过模拟转账操作自动检测并标记微信好友列表中被删除、被拉黑或账号存在问题的“僵尸粉”。工具支持开启调试模式、自动打开微信、获取好友信息、判断好友状态、管理标签等功能,最终将检测结果记录到文件中,便于用户管理和清理好友列表。此工具适用于Android设备,已在OPPO Reno4 Pro上测试成功。
87 5
|
4天前
|
开发框架 小程序 前端开发
圈子社交app前端+后端源码,uniapp社交兴趣圈子开发,框架php圈子小程序安装搭建
本文介绍了圈子社交APP的源码获取、分析与定制,PHP实现的圈子框架设计及代码编写,以及圈子小程序的安装搭建。涵盖环境配置、数据库设计、前后端开发与接口对接等内容,确保平台的安全性、性能和功能完整性。通过详细指导,帮助开发者快速搭建稳定可靠的圈子社交平台。
|
11天前
|
移动开发 小程序 前端开发
几千怎么部署搭建校园服务平台,校园圈子论坛系统小程序搭建,校园系统源码,多种功能一体的综合性校园平台
校园圈子论坛是一款集交友、二手市场、聊天等多功能于一体的校园社交平台,支持App、小程序和H5三端交付。学生可处理闲置物品、结识新朋友,通过算法匹配兴趣相投的用户。平台提供分享邀请机制,支持自动绑定推荐关系,并设有奖励机制。开发过程中需注重数据安全与系统稳定性,确保功能兼容及性能优化。
53 5
|
11天前
|
移动开发 小程序 前端开发
使用php开发圈子系统特点,如何获取圈子系统源码,社交圈子运营以及圈子系统的功能特点,圈子系统,允许二开,免费源码,APP 小程序 H5
开发一个圈子系统(也称为社交网络或社群系统)可以是一个复杂但非常有趣的项目。以下是一些关键特点和步骤,帮助你理解如何开发、获取源码以及运营一个圈子系统。
79 3
|
11天前
|
小程序 安全 网络安全
清晰易懂!陪玩系统源码搭建的核心功能,陪玩小程序、陪玩app的搭建步骤!
陪玩系统源码包含多种约单方式、实时语音互动、直播间与聊天室、大神申请与抢单、动态互动与社交及在线支付与评价等核心功能。搭建步骤包括环境准备、源码上传与解压、数据库配置、域名与SSL证书绑定、伪静态配置及后台管理。注意事项涵盖源码安全性、二次开发、合规性和技术支持。确保平台安全、合规并提供良好用户体验是关键。
|
2月前
|
移动开发 小程序
仿青藤之恋社交交友软件系统源码 即时通讯 聊天 微信小程序 App H5三端通用
仿青藤之恋社交交友软件系统源码 即时通讯 聊天 微信小程序 App H5三端通用
66 3
|
2月前
|
监控 小程序 前端开发
排队免单小程序开发源码案例
“排队免单小程序”旨在通过用户排队行为结合特定规则为用户提供免单或优惠机会,提升用户体验及商家流量。核心功能包括用户注册登录、排队管理、免单规则设置、支付与结算、商家管理和通知提醒等。技术上采用微信小程序开发框架,前后端分离架构,集成微信支付等服务,确保高效安全的数据处理与传输。项目开发过程涵盖需求分析、设计开发、集成测试和上线发布,后期注重数据监控、用户反馈和运营推广,以持续优化用户体验。
|
2月前
|
小程序 前端开发 JavaScript
在线课堂+工具组件小程序uniapp移动端源码
在线课堂+工具组件小程序uniapp移动端源码
43 0
在线课堂+工具组件小程序uniapp移动端源码
|
3月前
|
存储 移动开发 小程序
小程序界面设计软件源码生成器
小程序界面设计软件源码生成器
83 5
|
3月前
|
移动开发 小程序 数据可视化
一招学会DIY官网可视化设计支持导出微擎、UNIAPP、H5、微信小程序源码
一招学会DIY官网可视化设计支持导出微擎、UNIAPP、H5、微信小程序源码
59 2