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

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

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


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


相关文章
|
9月前
|
XML Java Android开发
微信虚拟视频插件安卓,微信虚拟相机替换拍照,java源码分享
完整的相机应用项目包含三个主要文件:主活动实现、布局文件和清单文件。代码实现了相机预览、
|
7月前
|
缓存 小程序 前端开发
商城/点餐/家政类小程序源码合集_微信抖音小程序源码开发从入门到精通实战
本文系统讲解如何利用现有源码快速开发商城、点餐、家政类微信/抖音小程序,涵盖环境搭建、核心功能实现、多平台部署与优化,提供完整技术方案。实战导向,助力开发者高效入门与落地。
|
7月前
|
小程序 PHP 图形学
热门小游戏源码(Python+PHP)下载-微信小程序游戏源码Unity发实战指南​
本文详解如何结合Python、PHP与Unity开发并部署小游戏至微信小程序。涵盖技术选型、Pygame实战、PHP后端对接、Unity转换适配及性能优化,提供从原型到发布的完整指南,助力开发者快速上手并发布游戏。
|
7月前
|
存储 小程序 Java
热门小程序源码合集:微信抖音小程序源码支持PHP/Java/uni-app完整项目实践指南
小程序已成为企业获客与开发者创业的重要载体。本文详解PHP、Java、uni-app三大技术栈在电商、工具、服务类小程序中的源码应用,提供从开发到部署的全流程指南,并分享选型避坑与商业化落地策略,助力开发者高效构建稳定可扩展项目。
|
9月前
|
API 数据安全/隐私保护 开发者
企业微信自动加好友软件,导入手机号批量添加微信好友,python版本源码分享
代码展示了企业微信官方API的合规使用方式,包括获取access_token、查询部门列表和创建用户等功能
|
10月前
|
消息中间件 缓存 小程序
婚恋交友相亲公众号app小程序系统源码「脱单神器」婚恋平台全套代码 - 支持快速二次开发
这是一套基于SpringBoot + Vue3开发的婚恋交友系统,支持微信公众号、Uniapp小程序和APP端。系统包含实名认证、智能匹配、视频相亲、会员体系等功能,适用于婚恋社交平台和相亲交友应用。后端采用SpringBoot 3.x与MyBatis-Plus,前端使用Vue3与Uniapp,支持快速部署和二次开发。适合技术团队或有经验的个人创业者使用。
696 8
|
9月前
|
小程序 Java 关系型数据库
圈子系统公众号app小程序系统源码圈子系统带即时通讯 多级圈子系统源码 兴趣小组系统开源 私密圈子系统代码 会员制社区系统
本圈子系统解决方案提供即时通讯、多级圈子、兴趣小组、私密社区及会员制管理功能。支持开源与商业方案,推荐ThinkSNS+、EasyClub及OpenFire等系统,并提供前后端技术选型建议,助力快速搭建社交平台。
538 0
|
小程序 Java 关系型数据库
weixin116大学生就业平台微信小程序+ssm(文档+源码)_kaic
本文介绍了一款大学生就业平台微信小程序的开发过程,涵盖开发环境、系统设计、实现与测试等方面。该小程序基于微信平台特性,采用MYSQL数据库存储数据,确保系统稳定与安全,同时满足学生、企业和管理员不同权限用户的功能需求。通过简化操作流程,实现了招聘信息查看、简历投递等实用功能,旨在为用户提供便捷高效的求职体验,符合“操作简单,功能实用”的设计理念。
|
小程序 Java 关系型数据库
weixin163基于微信小程序的校园二手交易平台系统设计与开发ssm(文档+源码)_kaic
本文介绍了一款基于微信小程序的校园二手物品交易平台的开发与实现。该平台采用Java语言开发服务端,使用MySQL数据库进行数据存储,前端以微信小程序为载体,支持管理员和学生两种角色操作。管理员可管理用户、商品分类及信息、交易记录等,而学生则能注册登录、发布购买商品、参与交流论坛等。系统设计注重交互性和安全性,通过SSM框架优化开发流程,确保高效稳定运行,满足用户便捷交易的需求,推动校园资源共享与循环利用。
|
小程序 关系型数据库 Java
weixin168“返家乡”高校暑期社会实践微信小程序设计与开发ssm(文档+源码)_kaic
本文探讨高校暑期社会实践微信小程序的开发与应用,旨在通过信息化手段提升活动管理效率。借助微信小程序技术、SSM框架及MySQL数据库,实现信息共享、流程规范和操作便捷。系统涵盖需求分析、可行性研究、设计实现等环节,确保技术可行、操作简便且经济合理。最终,该小程序可优化活动发布、学生信息管理和心得交流等功能,降低管理成本并提高工作效率。
下一篇
开通oss服务