仿滴滴出行微信小程序

效果图
在这里插入图片描述

目录结构

┣━ api # 存放网络请求相关
┣━ common ●                
          ┣━ constant               //常量
          ┣━ css                    //weui.css
          ┣━ less                   //通用less样式与变量
          ┗━ lib                     //第三方库 qqmap-wx-jssdk.js
┣━ components  ● 抽取出来的组件
               ┣━ addressList.vue            
               ┣━ common-footer.vue                
               ┣━ driver-header.vue           
               ┣━ loading-sprinner.vue        
               ┣━ search-bar.vue              
               ┗━ star.vue               
┣━ pages ● 页面
         ┣━ cars                    //选择车    
         ┣━ cityChoose              //选择城市
         ┣━ destination             //选择目的地
         ┣━ evaluation              //评价    
         ┣━ index                   //主页面
         ┣━ login                   //登录
         ┣━ orderCancel             //订单取消
         ┣━ orderClose              //订单关闭
         ┣━ orderService            //订单服务
         ┣━ orderWhy                //询问原因
         ┣━ starting                //选择出发地点
         ┗━ wait                     //等待
┣━ store ● 存放vuex相关
         ┣━ index.js            
         ┣━ mutation-types.js               
         ┣━ mutations.js           
         ┗━ state.js        
┣━ utils 工具类
┣━ App.vue
┣━ main.js
┗━ static # 静态资源,存放图片

vuex数据

const state = {
  curNavIndex: 0,   //当前头部导航索引
  phone: '',         //登录号码
  curCity: '',      //当前所在的城市
  startPlace: '出发地', //出发地
  startFormattedPlace: '', //更具人性化的描述的出发地
  startPosition: [],        //包含startLatitude和startLongitude
  destination: '你要去哪儿', //目的地
  endPosition: [],      //包含endLatitude和endLongitude
  driver: {},       //司机信息 包含Cartnumber,cart,id,name,stars
  cost: 0       //花费
}

功能详情

头部导航自动滑动
在这里插入图片描述
为了让头部导航点击时能自动滑出,滑动swiper的同时头部导航跟着滑动,在cars页面选中车时回退到index页面时头部导航自动滑动,我在vuex中维护了一个索引值curNavIndex。根据不同的curNavIndex对scroll-view设置不同的scroll-left值。那么如何设置准确的scroll-left值呢?微信小程序无法进行Dom操作,所以无法动态拿到元素宽度。所以我根据头部导航每项的宽度维护了一个数组navOffsetArr

  //两个字宽度+2*margin 也就是 32+10*2 = 52
  const NAV_SMALL_WIDTH = 52;
  //三个字宽度+2*margin 也就是 48+10*2 = 68
  const NAV_BIG_WIDTH = 68;


  this.navOffsetArr = [
        0,
        0,
        NAV_SMALL_WIDTH,
        NAV_SMALL_WIDTH * 2,
        NAV_SMALL_WIDTH * 2 + NAV_BIG_WIDTH,
        NAV_SMALL_WIDTH * 2 + NAV_BIG_WIDTH * 2,
        NAV_SMALL_WIDTH * 3 + NAV_BIG_WIDTH * 2,
        NAV_SMALL_WIDTH * 4 + NAV_BIG_WIDTH * 2
      ]

获取索引值

 computed: {
      ...mapState([
        'curNavIndex'
      ])
    }

watch里监听索引值,当curNavIndex改变时,拿到不同的navScrollLeft值

 watch: {
      curNavIndex(newIndex){
        this.navScrollLeft = this.navOffsetArr[newIndex]
      }
    }

最后将scroll-left与navScrollLeft绑定,从而实现自动滑动

     <scroll-view
        class="nav"
        scroll-x="true"
        scroll-with-animation="true"
        :scroll-left="navScrollLeft">
       
       ......
       ......
       
      </scroll-view>

首页自动保存位置信息

在进入index首页的时候,就会自动将当前城市,当前经纬度,当前地址存入state中作为出发点信息。这里接入了腾讯地图api,还是比较方便的。

  wx.getLocation({
          type: 'gcj02',
          success: (res) => {
            reverseGeocoder(qqmapsdk, res).then(res => {
              this.saveStartPlace(res.result.address)
              this.saveFormattedStartPlace(res.result.formatted_addresses.recommend)
              this.saveCurCity(res.result.address_component.city)
            })
            this.saveStartPosition([res.latitude, res.longitude])
          }
        })

mapMutations

methods: {
  ...mapMutations({
        saveCurNavIndex: 'SET_CUR_NAV_INDEX',
        saveStartPlace: 'SET_START_PLACE',
        saveFormattedStartPlace: 'SET_FORMATTED_START_PLACE',
        saveCurCity: 'SET_CUR_CITY',
        saveStartPosition: 'SET_START_POSITION',
        saveCost: 'SET_COST'
      })
} 

其中reverseGeocoder()就是一个位置转换为地址的函数,是对qqmapsdk.reverseGeocoder()进行了一次封装

function reverseGeocoder(qqmapsdk, {latitude, longitude}) {
  return new Promise((resolve, reject) => {
    qqmapsdk.reverseGeocoder({
      location: {
        latitude: latitude,
        longitude: longitude,
      },
      success: (res) => resolve(res),
      fail: (res) => reject(res)
    })
  })
}

这样当我们进入index首页的时,就可以在Console中就看到数据成功保存到vuex里

在这里插入图片描述

选择出发点

在这里插入图片描述

地图map

 <map class="map-didi"
         id="map-didi"
         :latitude="latitude"
         :longitude="longitude"
         :markers="markers"
         @regionchange="regionChange"
         @begin="begin"
         @end="end"
         show-location
    >
    ...
</map>

初始化地图时将地图中心移动至startPosition,如果startPosition不存在,就将地图中心移动至wx.getLocation()获取的当前位置坐标

 initLocation(){
        if (this.startPosition.length) {
          this.latitude = this.startPosition[0]
          this.longitude = this.startPosition[1]
        } else {
          wx.getLocation({
            type: "gcj02",
            success: (res) => {
              this.longitude = res.longitude
              this.latitude = res.latitude
            }
          })
        }
      }

采用随机数据模拟附近的车,然后添加到this.markers中,车的图标根据curNavIndex动态设置,这样就可以在选择不同的服务时展示不同的车图标

   this.markers = []
        const carNum = getRandomNum(3, 8)
        for (let i = 1; i <= carNum; i++) {
          // 定义一个车对象
          let car = {
            id: 0,
            iconPath: "/static/img/car/cart1.png",
            latitude: 0,
            longitude: 0,
            width: 35,
            height: 15
          }

          //随机值
          const lon_dis = (Math.ceil(Math.random() * 99)) * 0.00012;
          const lat_dis = (Math.ceil(Math.random() * 99)) * 0.00012;

          car.id = 2 + i
          car.latitude = this.latitude + lat_dis
          car.longitude = this.longitude + lon_dis
          car.iconPath = `/static/img/car/cart${this.curNavIndex + 1}.png`
          this.markers.push(car)
        }

地图中心的红色定位图标以及接驾时间的文字是用cover-view包裹cover-image实现

   <cover-view class="center-marker">
        <cover-view class="text-center">最快{{minutes}}分钟接驾</cover-view>
        <cover-image class="inverted-triangle" src="/static/img/triangle-down.png"></cover-image>
        <cover-image class="img-center" src="/static/img/marker2.png"></cover-image>
      </cover-view>

其中inverted-triangle是一个倒三角形图片,因为cover-view无法实现复杂css样式,所以底部的倒三角形效果只能用图片实现。

map这里不推荐使用controls,官方也说明 controls即将废弃,请使用 cover-view

选择目的地

在这里插入图片描述
这里首先获取到state中的curCity,利用qqmapsdk.getSuggestion(),并将其参数region设置为curCity, 就可以进行地址模糊检索。选中地址时,利用qqmapsdk.geocoder()进行地址解析,得到目的地的相关数据,再将数据通过mapMutations存入state中

 computed: {
      ...mapState([
        'curCity'
      ])
    }

模糊检索

 qqmapsdk.getSuggestion({
          keyword: value,
          region: this.curCity,
          success: (res) => {
            this.addresses = res.data
          }
        })

点击地址时,解析地址保存数据

choosePlace(item){
        //item.address详细地址
        //item.title简短语义化地址
        console.log(item)
        qqmapsdk.geocoder({
          address: item.address,
          success: (res) => {
            this.saveEndPosition([res.result.location.lat, res.result.location.lng])
            this.saveDestination(item.title)
            this.goBack()
          },
          fail: (err) => {
            console.log(err)
          }
        })
      }

mapMutations

methods: {
 ...mapMutations({
        saveDestination: 'SET_DESTINATION',
        saveEndPosition: 'SET_END_POSITION'
      })
}   

选择城市

在这里插入图片描述
这里的样式是按照现在的滴滴小程序实现,只要将选中的城市保存在state中的curCity就好了,搜索功能暂未开发。获取城市列表数据用到了腾讯地图的api中的qqmapsdk.getCityList()。这里其实就是数据的过滤与处理,先初始化了一个空对象temp_citys,然后根据城市的拼音的首字母的大写建立key,对应value为一个数组,数组里面包含所有以这个拼音字母开头的城市,最后将temp_citys赋值给this.cityList

 qqmapsdk.getCityList({
        success: (res) => {
          const result = res.result[1]
          let temp_citys = {} //使用temp_citys 避免频繁改动data里面的数据
          for (let i = 0; i < result.length; i++) {
            let key = result[i].pinyin[0].charAt(0).toLocaleUpperCase()
            if (!temp_citys[key]) {
              temp_citys[key] = []
            }
            temp_citys[key].push(result[i].fullname)
          }
          this.cityList = temp_citys
        }
      })

其他的一些页面就不提了,感兴趣的小伙伴可以去看下源码

源码截图:

在这里插入图片描述

说明

如果本项目对您有帮助,欢迎 “点赞,关注” 支持一下 谢谢~

源码获取关注公众号「码农园区」,回复 【uniapp源码】
在这里插入图片描述

  • 26
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 微信小程序仿滴滴 Github是一款基于微信小程序平台设计开发的,仿照滴滴上线的Github服务的应用程序。它能够提供类似Github的代码仓库管理、版本控制、团队协作、代码审核、代码搜索和社区交流等功能,适用于个人开发者和企业内部的开发者团队。 微信小程序仿滴滴 Github的主要功能包括创建代码仓库、代码上传、代码拉取、版本控制、代码审核、团队协作、代码搜索和社区交流等模块。创建代码仓库和代码上传功能帮助用户将代码上传至云端,方便版本控制和团队协作。代码拉取功能能够快速将远程代码拷贝至本地。版本控制功能可以让开发者对代码中的不同版本进行管理,进行代码编辑、修改和批注。代码审核功能可以让团队成员给出反馈意见,保证代码质量和代码风格的一致性。代码搜索功能可以帮助开发者在已有的代码库中快速查找并复用代码。社区交流功能让开发者之间可以进行在线交流。 微信小程序仿滴滴 Github的优势在于提供了一个轻量级的开发平台,使开发者之间可以快速高效地进行团队协作和代码分享。此外,应用程序提供了简单易用的代码管理和版本控制功能,能够减少代码错误和提高代码一致性。在社区交流方面,应用程序还支持丰富的社区交流功能,可以让开发者之间进行公开和私人的交流和协作。 总之,微信小程序仿滴滴 Github是一款优秀的小程序,能够满足开发者团队的代码管理和共享需求。它凭借着丰富的功能和便利性将会有广泛的市场前景。 ### 回答2: 随着互联网技术的不断发展,移动互联网开始成为人们日常生活中不可或缺的一部分。如今,跨城市出行成为了人们日常生活中的重要方面,而滴滴出行成为了市场主导者之一。然而,对于很多小型企业来说,如果想要开发出一款类似于滴滴出行的应用程序,成本和难度是非常高的。 微信小程序作为一种可以在微信平台上开发的应用程序,由于其快速开发、轻量级、便捷快捷等优点,正逐渐被越来越多的开发者所青睐。因此,利用微信小程序仿滴滴出行并开源于GitHub,成为了一个不错的选择。 首先,仿滴滴出行的程序需要具备两个主要功能:一是实现用户与司机的匹配,二是显示行车轨迹和支付功能。这其中涉及的技术有地图定位技术、支付接口和服务器端开发等。同时,仿滴滴出行还需要考虑到美观易用性、用户数据保护等方面的问题。所以,开发一个高质量的微信小程序仿滴滴出行需要有一支专业的团队来完成。 其次,仿滴滴出行的程序需要开源于GitHub。GitHub是全球最大的开源社区平台之一,其开放源代码的理念使得全球的开发者能够共同参与到代码的优化与维护中。开源自己的项目可以让更多人参与其中,能够提升代码的质量和可靠性,提高整体开发效率。通过GitHub,可以吸引更多的开发者前来参与进来,提高项目的可见度和影响力。 总之,微信小程序仿滴滴GitHub是一种实现跨城市出行,降低开发成本的一种方式,但同时也需要考虑到技术难度、美观易用性、用户数据保护等方面的问题,通过开源自己的项目,能够让更多的人参与进来,提高整个项目质量和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦之归途

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值