uniapp微信小程序打卡功能的详细实现流程

目录
  • 一、vue后台地图选地点
    • step1| 注册账号并申请Key
    • step2| 设置 JSAPI 安全密钥的脚本标签
    • step3| 地图选点页面demo
  • 二、uniapp微信小程序打卡
    • step1| 获取key
    • step2| manifest.json中配置权限
    • step3| 获取定位地址与经纬度
  • 三、核心流程描述
  • 总结

一、vue后台地图选地点

step1| 注册账号并申请Key

请参考链接注册账号并申请Key 部分

step2| 设置 JSAPI 安全密钥的脚本标签

注意事项: 必须在vue项目index.html中插入该script标签

<script type="text/javascript">
  window._AMapSecurityConfig = {
    securityJsCode:'「您申请的安全密钥」'//「您申请的安全密钥」
  }
</script>

step3| 地图选点页面demo

npm包依赖: npm install --save @amap/amap-jsapi-loader

demo描述 主要实现的 地点搜索 和 地点选取 两个功能点,请结合自己项目修改。

<template>
  <div class="map-demo-container">
    <div id="container" />

    <div class="search-bar">
      <el-input id="tipinput" v-model="kw" placeholder="请输入关键字搜索" clearable />
    </div>

    <div style="margin-top: 10px">
      <el-tag type="primary">地址:{{ location.address }}</el-tag>
      <el-tag type="primary">经纬度:{{ location.lnglat }}</el-tag>
    </div>
  </div>
</template>

<script>
import AMapLoader from '@amap/amap-jsapi-loader';

let mapIns = null;// 地图实例
let marker = null;// 标记点
let geocoder = null;// 地理编码与逆地理编码
let infoWindowIns = null;// 信息窗体实例

export default {
  name: 'map-demo',

  data() {
    return {
      kw: '',
      // 当前选择的地址
      location: {
        address: '',
        lnglat: [],
      }
    }
  },

  mounted() {
    this.initMap();
  },

  methods: {
    // 初始化地图
    initMap() {
      let that = this;

      AMapLoader.load({
        "key": "申请好的Web端开发者Key",// 申请好的Web端开发者Key,首次调用 load 时必填
        "version": "2.0",// 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
        "plugins": ['AMap.ToolBar', 'AMap.Scale', 'AMap.Geocoder', 'AMap.PlaceSearch','AMap.AutoComplete'],// 需要使用的的插件列表,如比例尺'AMap.Scale'等
      }).then((AMap)=>{
        // 实例化地图
        mapIns = new AMap.Map('container', {
          viewMode: '2D', // 默认使用 2D 模式,如果希望使用带有俯仰角的 3D 模式,请设置 viewMode: '3D',
          zoom: 11, //初始化地图层级
          // center: [116.397428, 39.90923], //初始化地图中心点
        });

        // 添加地图控件
        mapIns.addControl(new AMap.ToolBar({
          position: {
            top: '40px',
            right: '40px'
          }
        }));
        mapIns.addControl(new AMap.Scale());

        // 信息窗体
        infoWindowIns = new AMap.InfoWindow({
          anchor: 'top-center',
          content: '',
        });
        mapIns.on('complete', () => {
          console.log('地图图块加载完成后触发');
        })
        mapIns.on('click', (e) => {
          this.kw = '';
          console.log('点击地图触发e', e);

          let lnglat = [e.lnglat.lng, e.lnglat.lat];

          geocoder.getAddress(lnglat, function(status, result) {
            console.log('status-result', status, result)

            if (status === 'complete' && result.info === 'OK') {
              // result为对应的地理位置详细信息

              that.setMarker({
                address: result.regeocode.formattedAddress,
                lnglat,
              })
            }
          })
        })

        // 地理编码与逆地理编码 插件
        geocoder = new AMap.Geocoder({});
        // 输入提示与POI搜索
        var auto = new AMap.AutoComplete({
          input: "tipinput"
        });
        var placeSearch = new AMap.PlaceSearch({
          map: mapIns
        });//构造地点查询类
        auto.on("select", function(e) {
          console.log('select', e);
          // placeSearch.setCity(e.poi.adcode);
          // placeSearch.search(e.poi.name);  //关键字查询查询
          geocoder.getLocation(e.poi.name, function(status, result) {
            console.log('status-result', status, result)
            if (status === 'complete' && result.info === 'OK') {
              // result中对应详细地理坐标信息
              that.setMarker({
                address: e.poi.name,
                lnglat: [result.geocodes[0].location.lng, result.geocodes[0].location.lat],
              })
            }
          })
        });//注册监听,当选中某条记录时会触发
      }).catch(e => {
        throw e;
      })
    },
    // 设置标记
    setMarker({
      address,
      lnglat
    }) {
      // 保存用户当前选择地址信息
      this.location = {
        address,
        lnglat
      }

      // 地图标记和信息窗体
      marker && mapIns.remove(marker);
      marker = new AMap.Marker({
        position: lnglat,
        title: address
      });
      mapIns.add(marker);

      infoWindowIns.setContent(address);
      infoWindowIns.open(mapIns, lnglat);
    }
  }
}
</script>

<style lang="scss" scoped>
#container {
  height: 700px;
}

.map-demo-container {
  position: relative;

  .search-bar {
    position: absolute;
    left: 20px;top: 20px;;
    display: flex;
    align-items: center;
    width: 500px;
  }
}
</style>

二、uniapp微信小程序打卡

step1| 获取key

请参考链接

step2| manifest.json中配置权限

step3| 获取定位地址与经纬度

amap-wx.130.js下载

<script>
import amap from '@/static/js/amap-wx.130.js';

export default {
    // ...其他选项
    methods: {
        getAddress(){
            const _this = this;
            this.amapPlugin = new amap.AMapWX({
                key: '您申请的key'
            });
            uni.showLoading({
                title: '获取信息中'
            });
            // 成功获取位置
            _this.amapPlugin.getRegeo({
                success: (data) => {
                    console.log('当前定位', data);
                    // data包含定位地址与经纬度等信息,请根据自己项目需求写对应逻辑
                    uni.hideLoading();
                },
                // 获取位置失败
                fail: (err) => {
                    console.log(err)
                    uni.showToast({
                        title:"获取位置失败,请重启小程序",
                        icon:"error"
                    })
                }
            });
        }
    }
}

三、核心流程描述

  • 后台打卡活动选点,并保存地址和经纬度,打卡活动还存在一个打卡范围参数
  • 进入小程序打卡页面,获取定位点地址和经纬度
  • 计算 打卡点 和 定位点 距离,比对打卡范围
  • 若距离 > 打卡范围,则不能打卡
  • 若距离 < 打卡范围,则可打卡

该判断结果,用于页面展示那些内容

/**计算两个经纬度距离
* @param lat1 第一个纬度
* @param log1 第一个经度
* @param lat2 第二个维度
* @param log2 第二个经度
* @return 两点距离(单位: m)
*/
getDistance(lat1, lon1, lat2, lon2) {
   var radLat1 = (lat1 * Math.PI) / 180; //将角度换算为弧度
   var radLat2 = (lat2 * Math.PI) / 180; //将角度换算为弧度
   var a = radLat1 - radLat2;
   var b = (lon1 * Math.PI) / 180 - (lon2 * Math.PI) / 180;
   var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
   s = s * 6378137.0; // 取WGS84标准参考椭球中的地球长半径(单位:m)
   // s = Math.round(s * 10000) / 10000; //两点之间距离(保留四位)
   return s; //(单位:m)
},

总结

到此这篇关于uniapp微信小程序打卡功能的文章就介绍到这了,更多相关uniapp微信小程序打卡内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • uniapp开发打包多端应用完整方法指南

    一.uni-app项目介绍 用uni-app开发多端项目,一套代码可同时打包出各端小程序.h5和app,uni-app支持通过 HBuilderX可视化界面 和 vue-cli命令行 两种方式创建项目,下面示例项目采用 HBuilderX可视化界面 的方式创建,cli项目可参考uni文档,大部分流程都是通用的. 项目结构: ├── components 公用组件 ├── libs 公共方法 ├── pages 页面 ├── static 本地静态资源,注意:静态资源只能存放于此 ├── stor

  • 手把手教你写一个uniapp通用页面组件

    目录 前言 需求 开发 初始化页面数据 实现状态栏与底部配置 页面使用 总结 前言 做移动端项目时为了兼容各种手机型号的界面,最好有一个统一的页面组件对样式做统一处理,例如:判断是否显示状态栏,是否显示头部导航,是否空出底部区域等等,本篇会带大家从零到一开发一个 uniapp 的通用页面组件 需求 本次开发的页面,组件,需要完成以下功能 可配置控制是否显示原生导航,显示状态栏,并且也可以控制状态栏颜色 可配置控制是否留出底部固定区域 开发 初始化页面数据 编写页面组件类,获取系统配置,初始化样式

  • uniapp使用高德地图的超详细步骤

    目录 1.项目前准备 2.页面创建引入 3.地图实现js 4.地图实现单点标记 5.地图实现终点与起点标记 6.最后 上代码~ 总结 1.项目前准备 1.1.首先你需要去申请一个属于自己的高德地图key,怎么申请暂不多说需要的去官网看 1.2.链接: 高德地图申请key直通车,点击前往. 有一个uniapp项目. 2.页面创建引入 新建一个uniapp的空白页 使用web-view 渲染html文件页 <web-view src="/hybrid/html/adminr.html"

  • uniapp使用条件编译#ifdef(跨平台设备兼容)

    uni-app 已将常用的组件.JS API 封装到框架中,开发者按照 uni-app 规范开发即可保证多平台兼容,大部分业务均可直接满足. 但每个平台有自己的一些特性,因此会存在一些无法跨平台的情况. 大量写 if else,会造成代码执行性能低下和管理混乱. 编译到不同的工程后二次修改,会让后续升级变的很麻烦. 在 C 语言中,通过 #ifdef.#ifndef的方式,为 windows.mac等不同 os 编译不同的代码. uni-app 参考这个思路,为 uni-app 提供了条件编译手

  • uniapp页面间传参的几种方法实例总结

    目录 前言 一.上级页面 → 下级页面(单向) uni.navigateTo:URL编程式传参 <navigator>标签传参 二.上级页面 ← 下级页面(单向) uni.$on(eventName,callback):监听事件 触发事件 三.上级页面 ↔ 下级页面(双向) 上级页面内代码 总结 前言 在Uniapp中的传参主要分为以下三种类型: 上级页面 → 下级页面(单向)上级页面 ← 下级页面(单向)上级页面 ↔ 下级页面(双向) 本文将围绕这三种传参展开,分享其使用方法以及我使用中所遇

  • uniapp语音识别(讯飞语音)转文字

    常见应用:游戏界面 文字语音.商城导航栏的语音输入搜索框.聊天界面的语音文字输入等. 引自官方 unicloud官方语音: 语音输入接口可使得网页开发人员能快速调用设备的麦克风进行语音输入,而不需要安装额外的浏览器插件.规范不定义底层语音识别引擎的技术架构,浏览器实现可基于语音识别服务器或本地内置语音识别模块. 配置SDK–识别讯飞语音(如果用不了讯飞语音,可换百度语音,自己去看接入文档) 进入项目根目录下的 manifest.json -> App模块配置->speech 勾选 讯飞语音识别

  • uniapp打包安卓App的两种方式(云打包、本地打包)方法详解

    在HBuilder上对APP提供了两种打包方式,云打包和本地打包,下面主要对这两种打包方式做个介绍 两者的区别:云打包相对简单,但是每天最多只能打包五次,而且在高峰期打包时间可能会很长,本地打包相对比较复杂,但是不限制次数,打包时间也短 一. uniapp云打包安卓App: 只需要设置相应参数即可.比较复杂的地方可能就是证书,如果你是测试包,Android的话直接选择共用证书即可,ios则需要申请相应证书,申请证书的具体方法官方也介绍的很清楚了,就不赘述了. 二. uniapp本地打包安卓App

  • uniapp实现h5、app与微信小程序三端pdf文件下载和预览功能

    以下代码兼容三端,app,h5,微信小程序,经过个人测试 手机端有两种方法,使用renderjs或者uniapp的api 两者的区别 使用renderjs的写法,会提示用户是否下载文件,下载完成后用户需要手动点击下载的文件,才会打开文件 使用uniapp的api则可以直接下载并直接预览,不需要用户操作 根据场景需求进行选择即可 <template> <div> <!-- #ifdef APP-PLUS --> <button @click="test.e

  • 使用uniapp打包上架微信小程序完整教程

    首先打开manifest.json下的微信小程序配置 ,勾选所有 点击“发行” 点击发行 这时候就会跳转到微信小程序中,如果没出现以下错误可以跳过此步骤 在本地设置中勾选“不校验合法域名........” 输入版本号和备注后点击上传   在微信小程序官网中点击“版本管理”,下面有个刚刚的开发版本 点击提交审核 填写信息 直接提交会出现以下问题 点击我知道了,再次点击 “更新当前版本的用户隐私协议” 进入后填写以下信息 填写完成后返回再次提交 以上就是使用uniapp打包上架微信小程序完整教程的详

  • uniapp微信小程序打卡功能的详细实现流程

    目录 一.vue后台地图选地点 step1| 注册账号并申请Key step2| 设置 JSAPI 安全密钥的脚本标签 step3| 地图选点页面demo 二.uniapp微信小程序打卡 step1| 获取key step2| manifest.json中配置权限 step3| 获取定位地址与经纬度 三.核心流程描述 总结 一.vue后台地图选地点 step1| 注册账号并申请Key 请参考链接注册账号并申请Key 部分 step2| 设置 JSAPI 安全密钥的脚本标签 注意事项: 必须在vu

  • 微信小程序使用uni-app开发小程序及部分功能实现详解

    目录 一.uni-app 1.简介 2.开发工具 3.新建 uni-app项目 4.把项目运行到微信开发者工具 二.实现tabBar效果 1.创建tabBar页面 2.配置tabBar 三.配置网络请求 1.依照官网提示安装.导入.使用 2.实战 四.uni-app 里面小程序分包 1.创建分包目录 2.在 pages.json 文件中配置 3.创建分包页面 五.公用方法封装 六.搜索功能 1.搜索组件 2.搜索建议实现 3.本地存储 4.过滤器 七.上拉加载.下拉刷新 1.上拉加载 2.下拉刷

  • vue中uni-app 实现小程序登录注册功能

    思路: 1.使用微信的 open-type="getUserInfo" 获取用户信息,将用户信息保存到userinfoDetails对象中去. <button v-else type="primary" class="reserve-btn" open-type="getUserInfo" @getuserinfo="getuserinfo">预约挂号</button> 2.使用 u

  • uni-app微信小程序登录授权的实现

    微信小程序授权是非常简单和常用的功能,但为了方便,还是在此记录一下要点: 首先是需要用到一个授权按钮来触发获取用户信息授权: 关键在于 open-type 为 getUserInfo , 然后有个@getuserinfo的事件,把获取授权接口写到该事件里面去 <button class="sys_btn" open-type="getUserInfo" lang="zh_CN" @getuserinfo="appLoginWx&q

  • 解决uni-app微信小程序input输入框在底部时,键盘弹起页面整体上移问题

    目录 问题描述: 问题分析: 解决思路: 重点在这里!!!我踩坑被折磨很久的一个地方!!!一定要用 px!!! 总结: 问题描述: 最近的做了个客服聊天的功能,遇到一个问题如下:在手机上点击聊天页底部的input框后,键盘弹起同时页面会整体上移,标题栏被顶上去了.如下图: 问题分析: input 获取焦点时会自动调起手机键盘,设置 :adjust-position="true",会导致键盘弹起时页面整体上移 解决思路: 设置使键盘弹起使页面不上移 设置输入框所在盒子为绝对定位 键盘弹起

  • 微信小程序 在线支付功能的实现

    微信小程序 在线支付功能 最近需要在微信小程序中用到在线支付功能,于是看了一下官方的文档,发现要在小程序里实现微信支付还是很方便的,如果你以前开发过服务号下的微信支付,那么你会发现其实小程序里的微信支付和服务号里的开发过程如出一辙,下面我就具体说一下小程序里微信支付的开发流程和注意点. 1.开通微信支付和微信商户号 这个过程就和开通服务号的微信支付过程一样,没有什么可以说的. 2.获得用户的openid 首页我们需要在小程序的客户端js中获取当前用户的openid,通过调用wx.login方法可

  • 微信小程序 五星评价功能的实现

    微信小程序 五星评价功能 话不多说,我们来看一下效果图: 要实现的效果:点击到第几颗星,就要显示到第几颗星, 接下来直接查看源码: <view class="l-evalbox row"> <text class="l-evaltxt">满意度:</text> <view class="l-evalist flex-1" bindtap="chooseicon"> <ico

  • Android中微信小程序支付倒计时功能

    看效果 由于web 经验弱爆- -  一开始我的思路是找事件,但是看了半天API 基本都是点击触摸,通过物理触发- - 我居然忽略了生命周期,生命周期+线程不就完全OK吗- 事实证明,线程还是王道啊,一开始就应该这么搞嘛- 度娘上面也看了很多都是用js写的,but,可能刚做没几天吧,我对js与微信小程序掌握还不够熟练 思路: onLoad:function(options)调用倒计时方法函数 定义线程进行数据动态现实 1. 日期转化成毫秒 2.定义线程动态显示 3.渲染倒计时 1.毫秒转成固定格

  • 微信小程序列表渲染功能之列表下拉刷新及上拉加载的实现方法分析

    本文实例讲述了微信小程序列表渲染功能之列表下拉刷新及上拉加载的实现方法.分享给大家供大家参考,具体如下: 微信小程序为2017年1月9日打下了一个特殊的标签,迅速刷爆了网络和朋友圈,最近我也写了一个demo程序体验一把.微信小程序和vuejs有些像,都是数据驱动视图&单向数据绑定,而其体验要比H5页面好很多,这得益于微信环境的支持以及首次运行时同时加载所有页面的处理.本文将分享微信小程序列表的下拉刷新和上划加载的实践. 效果图 首先来看看程序效果图,以下四张图从左至右依次是:下来刷新动画.下拉刷

  • 微信小程序显示下拉列表功能【附源码下载】

    本文实例讲述了微信小程序显示下拉列表功能.分享给大家供大家参考,具体如下: 1.效果展示 2.关键代码 app.json文件: { "pages":[ "views/views", "views/navigators/navigator1/navigator1", "views/navigators/navigator2/navigator2", "views/navigators/navigator3/naviga

随机推荐