快速搭建美团外卖(第三方)微信小程序(附精选源码32套,涵盖商城团购等)

1、数据请求: \[flyio.js]同时支持浏览器、小程序、Node、Weex的基于Promise的跨平台http请求库。可以让您在多个端上尽可能大限度的实现代码复用

2、css预编译器: \[stylus]-基于Node.js的CSS的预处理框架

3、数据来源:\[EasyMock]-为测试提供模拟数据

4、整体框架: [mpvue](https://github.com/Meituan-Dianping/mpvue)

5、地图:[腾讯地图api](https://developers.weixin.qq.com/miniprogram/dev/api/)

主体页面主要由首页,订单,我的页面组成

tabBar: {
      color: "#272636",
      selectedColor: "#FFD161",
      backgroundColor: "#fff",
      borderStyle: "#a8a8a8",
      list: [
        {
          pagePath: "pages/home/main",
          iconPath: "static/images/home.png",
          selectedIconPath: "static/images/home-selected.png",
          color:"white",
          text: "首页"
        },
        {
          pagePath: "pages/order/main",
          iconPath: "static/images/order.png",
          selectedIconPath: "static/images/order-selected.png",
          text: "订单"
        },
        {
          pagePath: "pages/my/main",
          iconPath: "static/images/my.png",
          selectedIconPath: "static/images/my-selected.png",
          text: "我的"
        }
      ]
    }

首页预览:

首页主要代码:

<template>
   <div class="home">
    <div class="mask" v-show="isHidden" @click="mask1Cancel">
        <sortList></sortList>
        <div class="overall-sort-list">
            <div v-for="(item,index) in sortList" :key="index">
                <div class="overall-sort" @click="sortSelected">{{item.sort}}</div>
            </div> 
        </div>
    </div>
     <sprinner v-if="isShow"></sprinner>
    <search></search>
    <h-swiper></h-swiper>
        <div class="title">
            <div class="line"></div>
            <div class="text">附近商家</div>
            <div class="line"></div>
        </div>
        <div class="select">
            <div class="sort-list">
                <div class="sort" @click="onOverallTag">综合排序{{sortSelected}}
                <image src="/static/images/down.png" style="width:20rpx;height:20rpx;"/></div>
                <div :data-index="0" @click="onTapTag" class="sort " :class="{'sort-active': selected == 0}">销量最高</div>
                <div :data-index="1" @click="onTapTag" class="sort" :class="{'sort-active': selected == 1}">距离最近</div>
                <div class="sort" @click="onFilter">筛选
                    <image src="/static/images/screen.png" style="width:22rpx;height:22rpx;"/>
                </div>
            </div>
        </div>
        <scroll-view>
            <div class="restaurantsList">
                    <div class="restaurants-list" v-for="(item,index) in restaurant" :key="index" @click="toIndex">
                        <div class="restaurants-info-image"><image :src="item.src" class="restaurants-image"/></div>
                        <div class="restaurants-info">
                        <div class="restaurants-info-name">{{item.name}}</div>
                        <div class="restaurants-info-rating">
                             <star :size="24" :score="item.score"></star>
                            <div 
                            class="restaurants-info-rating-sales">月售 {{item.sales}}</div>
                        </div>
                        <div class="restaurants-info-price">
                            起送 {{item.initial_price}}¥ | 配送 {{item.distribution_price}}
                        </div>
                    </div>
                    <div class="restaurants-distribution">
                        <span class="restaurants-distribution-time">{{item.time}} 分钟</span>
                        <span class="restaurants-distribution-distance"> {{item.distance}}</span> 
                      
                    </div>
                    </div>
            </div>
        </scroll-view>
   
   </div>
    
</template>

定位预览效果:

使用微信接口进行定位

 getWXLocation(success, fail, complete) {
        wx.getLocation({
            type: 'gcj02',
            success: success,
            fail: fail,
            complete: complete
        });
    },

获取location参数

getLocationParam(location) {
        if (typeof location == 'string') {
            var locationArr = location.split(',');
            if (locationArr.length === 2) {
                location = {
                    latitude: location.split(',')[0],
                    longitude: location.split(',')[1]
                };
            } else {
                location = {};
            }
        }
        return location;
    },

处理用户参数是否传入坐标进行不同的处理

locationProcess(param, locationsuccess, locationfail, locationcomplete) {
        var that = this;
        locationfail = locationfail || function (res) {
            res.statusCode = ERROR_CONF.WX_ERR_CODE;
            param.fail(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg));
        };
        locationcomplete = locationcomplete || function (res) {
            if (res.statusCode == ERROR_CONF.WX_ERR_CODE) {
                param.complete(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg));
            }
        };
        if (!param.location) {
            that.getWXLocation(locationsuccess, locationfail, locationcomplete);
        } else if (that.checkLocation(param)) {
            var location = Utils.getLocationParam(param.location);
            locationsuccess(location);
        }
    }

POI周边检索

 search(options) {
        var that = this;
        options = options || {};

        Utils.polyfillParam(options);

        if (!Utils.checkKeyword(options)) {
            return;
        }

        var requestParam = {
            keyword: options.keyword,
            orderby: options.orderby || '_distance',
            page_size: options.page_size || 10,
            page_index: options.page_index || 1,
            output: 'json',
            key: that.key
        };

        if (options.address_format) {
            requestParam.address_format = options.address_format;
        }

        if (options.filter) {
            requestParam.filter = options.filter;
        }

        var distance = options.distance || "1000";
        var auto_extend = options.auto_extend || 1;

        var locationsuccess = function (result) {
            requestParam.boundary = "nearby(" + result.latitude + "," + result.longitude + "," + distance + "," + auto_extend +")";
            wx.request(Utils.buildWxRequestConfig(options, {
                url: URL_SEARCH,
                data: requestParam
            }));
        }
        Utils.locationProcess(options, locationsuccess);
    }

sug模糊检索

getSuggestion(options) {
        var that = this;
        options = options || {};
        Utils.polyfillParam(options);

        if (!Utils.checkKeyword(options)) {
            return;
        }

        var requestParam = {
            keyword: options.keyword,
            region: options.region || '全国',
            region_fix: options.region_fix || 0,
            policy: options.policy || 0,
            output: 'json',
            key: that.key
        };
        wx.request(Utils.buildWxRequestConfig(options, {
            url: URL_SUGGESTION,
            data: requestParam
        }));
    }

逆地址解析

reverseGeocoder(options) {
        var that = this;
        options = options || {};
        Utils.polyfillParam(options);
        var requestParam = {
            coord_type: options.coord_type || 5,
            get_poi: options.get_poi || 0,
            output: 'json',
            key: that.key
        };
        if (options.poi_options) {
            requestParam.poi_options = options.poi_options
        }

        var locationsuccess = function (result) {
            requestParam.location = result.latitude + ',' + result.longitude;
            wx.request(Utils.buildWxRequestConfig(options, {
                url: URL_GET_GEOCODER,
                data: requestParam
            }));
        };
        Utils.locationProcess(options, locationsuccess);
    }

地址解析

geocoder(options) {
        var that = this;
        options = options || {};
        Utils.polyfillParam(options);

        if (Utils.checkParamKeyEmpty(options, 'address')) {
            return;
        }

        var requestParam = {
            address: options.address,
            output: 'json',
            key: that.key
        };

        wx.request(Utils.buildWxRequestConfig(options, {
            url: URL_GET_GEOCODER,
            data: requestParam
        }));
    }

获取城市列表

 getCityList(options) {
        var that = this;
        options = options || {};
        Utils.polyfillParam(options);
        var requestParam = {
            output: 'json',
            key: that.key
        };

        wx.request(Utils.buildWxRequestConfig(options, {
            url: URL_CITY_LIST,
            data: requestParam
        }));
    }

获取对应城市ID的区县列表

getDistrictByCityId(options) {
        var that = this;
        options = options || {};
        Utils.polyfillParam(options);

        if (Utils.checkParamKeyEmpty(options, 'id')) {
            return;
        }

        var requestParam = {
            id: options.id || '',
            output: 'json',
            key: that.key
        };

        wx.request(Utils.buildWxRequestConfig(options, {
            url: URL_AREA_LIST,
            data: requestParam
        }));
    }

用于单起点到多终点的路线距离(非直线距离)计算:

支持两种距离计算方式:步行和驾车。

起点到终点最大限制直线距离10公里。

calculateDistance(options) {
        var that = this;
        options = options || {};
        Utils.polyfillParam(options);

        if (Utils.checkParamKeyEmpty(options, 'to')) {
            return;
        }

        var requestParam = {
            mode: options.mode || 'walking',
            to: Utils.location2query(options.to),
            output: 'json',
            key: that.key
        };

        var locationsuccess = function (result) {
            requestParam.from = result.latitude + ',' + result.longitude;
            wx.request(Utils.buildWxRequestConfig(options, {
                url: URL_DISTANCE,
                data: requestParam
            }));
        }
        if (options.from) {
            options.location = options.from;
        }
        
        Utils.locationProcess(options, locationsuccess);
    }

订单页预览

订单页主要代码

<template>
    <div class="order">
        <div class="empty" v-if="isShow">
          <div class="image">
            <image src="/static/images/orderImg.png"/>
          </div>
          <div class="order" @click="toIndex">
             <span class="text">立即下单</span>
          </div>
         
        </div>
      <scroll-view class="container" :scroll-y="true">
        <div class="orderList" v-for="(item,index) in orderList" :key="index">
          <div class="order-title">
            <div class="order-title-restaurantName">
              <span class="name">{{item.name}}</span>
             <span class="iconfont icon-icon icon"></span>
            </div>
            <div class="order-title-state">商家已接单</div>
          </div>
          <div class="order-content">
            <image class="order-content-restaurantImg" :src="item.icon"/>
            <div class="order-content-info">
              <div class="order-content-info-price">¥ {{item.price}}</div>
              <div class="order-content-info-howToDistribute">美团小助手提供服务</div>
            </div>
          </div>
            <div class="order-desc">共{{item.count}}件商品,实付<span style="font-weight:700;">¥ {{item.count*item.price}}</span></div>
          <div class="order-footer">
            <div class="order-footer-orderAgain">再来一单</div>
            <div class="order-footer-goToComment">去评论</div>
          </div>
        </div>
      </scroll-view>
    </div>
</template>

<script>
   import util from '@/utils/util'
export default {
    data() {
        return {
             orderList:[],
             isShow: true
        }
    },
    onShow(){
       
         try {
            var value = wx.getStorageSync('selectFoods')
            if (value) {
              this.isShow = false;
              this.orderList=value;
            }
          } catch (e) {
            console.log(e)
          };

         
    },
    methods: {
      toIndex() {
          wx.switchTab({
            url: '/pages/home/main',
          })
        
      }

    }
}
</script>

<style lang="stylus" scoped>
  .empty
    display flex
    flex-direction column
    justify-content center
    align-items center
    margin-top 25%
    .order
      height 68rpx
      width 240rpx
      background-color #ffd300
      text-align center
      margin-top 40rpx
      line-height 68rpx
      border-radius 5rpx

  .container
    height: 100%
    .orderList
      width 100%
      padding 15rpx
      border 100rpx 0
      border-style solid
      border-color #ECECEC
      .order-title
        width 100%
        height 70rpx
        line-height 70rpx
        border-bottom 1rpx solid #ECECEC
        .order-title-restaurantName
          width 200rpx
          float left
          height 100%
          font-size 30rpx
          .name 
            padding-right 10rpx
          .icon
            color #b4b4b4
        .order-title-state
          width 200rpx
          float right
          color #ffc648
          margin-right -15rpx
          font-size 28rpx
      .order-content
        height 250rpx
        display flex
        align-items center
        .order-content-restaurantImg
          width 125rpx
          height 125rpx
        .order-content-info
          font-size 25rpx
          flex 1
          display flex
          flex-direction column
          .order-content-info-price,.order-content-info-howToDistribute
            height 42rpx
            line-height 42rpx
            margin-left 30rpx
          .order-content-info-price
            color: red
            font-size: 30rpx
      .order-desc
        float right 
        font-size 30rpx
        width 335rpx
        margin-bottom 40rpx
        line-height 30rpx
        margin-right 10rpx
      .order-footer
        width 100%
        height 90rpx
        display flex
        justify-content flex-end
        font-size 28rpx
        .order-footer-goToComment,.order-footer-orderAgain
          margin-top 15rpx
          margin-right: 40rpx
          height 70rpx
          line-height 70rpx
          width 200rpx
          text-align center
          border 1rpx solid #ECECEC
        .order-footer-orderAgain
          margin-right 20rpx
        .order-footer-goToComment
          background #FFD161
        
</style>

最后

精选32套源码目录:

python
复制代码
IT之家小程序版客户端(使用 Mpvue 开发,兼容 Web)ithome-lite-master.zip

mpvue 仿网易严选mpvue-shop-master.zip

mpvue-音乐播放器mpvue-music-master.zip

mpvue性能测试与体验miniweibo-master.zip

mpvue改造的日历.zip

mpvue框架仿滴滴出行didi-master.zip

mpVue高仿美团小程序教程mpvue-meituan-master.zip

uni APP自动更新并安装.vue

uni-app nvue沉浸式状态栏(线性渐变色).vue

uni-app 二维码生成器分享wxqrcode.zip

uni-app 侧边导航分类,适合商品分类页面uni-app-left-navigation-master.zip

uni-app 自定义底部导航栏uni-app-bottom-navigation-master.zip

uni-app全局变量的几种实现方式.zip

uni-app的markdown富文本编辑器插件uniapp-markdown-master.zip

uni-app自定义导航栏title-custom.zip

uniapp聊天实例,支持图片,语音,表情.zip

uniapp选择器,包含一级,二级级联,三级级联uniapp-picker-master.zip

vue-mpvue-ChatRobot聊天机器人vue-mpvue-ChatRobot-master.zip

【小程序】CNode社区mpvue-cnode-master.zip

【插件、图表】7种图表漂亮丰富uniCharts.zip

一款播课类小程序, 基于 mpvue 构建mp-podcast-mpvue-master.zip

云档新版小程序端,基于mpvue开发cloud-doc-v2-master.zip

仿uc浏览器列表.vue

仿扎克新闻mpZAKER-master.zip

仿网易云UImusic播放器mpvue-music-master.zip

仿追书神器的小说阅读器小程序wx-book-master.zip

参照米家APP布局和样式,编写的一款智能家居小程序smart-home-master.zip

商城实例mpvue-xbyjShop-master.zip

基于 mpvue 实现豆瓣电影微信小程序mpvue-douban-master.zip

基于mpvue的优酷mpvue-youku-master.zip

校园助手示例SHUhelper-master.zip

类似mui中的chat(聊天窗口)实现uniapp-chat-master.zip

美团外卖(第三方)开源程序mpvue-master.zip

美食搜索mpvue-FG-master.zip

豆瓣平分mpvue-douban-pingfen-master.zip

顶部tabbar.vue

说明

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

源码获取关注公众号「码农园区」,回复 【uniapp源码】

  • 14
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,由于代码篇幅较长,无法在此一一列出。但是,以下是编写美团外卖微信小程序的大致步骤和一些需要注意的事项: 1. 创建页面和组件:在微信小程序开发工具中创建页面和组件,设计页面布局和样式。 2. 获取用户授权:使用微信登录接口获取用户的微信授权,根据用户的身份和权限展示不同的页面和功能。 3. 商家和商品信息展示:通过接口获取商家和商品的信息,展示在页面中。可以使用组件库来快速构建页面。 4. 购物车和订单管理:通过本地存储和接口调用实现购物车和订单管理功能。可以使用微信支付接口实现订单支付功能。 5. 评价和退款功能:通过接口调用实现用户评价和商家处理退款请求的功能。 6. 系统优化和测试:对代码进行优化,提高系统性能和稳定性。进行系统测试和调试,确保系统的正常运行。 在编写代码的过程中,需要注意以下几个事项: 1. 界面设计和用户体验:美团外卖微信小程序需要考虑到用户体验和界面设计,使系统易于使用和操作。 2. 数据安全和隐私保护:美团外卖微信小程序需要保证用户数据的安全性和隐私保护,避免出现数据泄露和安全漏洞。 3. 接口调用和数据传输:美团外卖微信小程序需要调用多个接口来获取商家和商品信息,需要考虑数据传输的效率和稳定性。 4. 系统性能和稳定性:美团外卖微信小程序需要考虑系统的性能和稳定性,避免出现系统崩溃或运行缓慢的情况。 总之,编写美团外卖微信小程序需要具备一定的开发经验和技能,需要充分了解微信小程序开发框架和相关技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值