历时三个月,我发布了一款领取外卖红包小程序

news2024/11/17 1:45:31

近几年,推广外卖红包爆火,各种推广外卖红包的公众号层出不穷。于是,我就在想外卖红包究竟是怎么一回事。就这样,我带着问题开始了关于外卖红包的研究。

在研究的过程中,我开始了解隐藏优惠券、cps等一系列相关的术语。最后,我明白外卖红包其实就是推广分成,外卖平台会对某些店铺设置隐藏奖励,用户通过分享的链接领取红包进行下单后,分享者会获得一定的收入。了解这些后,我便着手如何将这些隐藏的分成让利给下单的用户,因此也就有了下面的小程序。

“天省宝”小程序提供了一键解决今天吃什么难题,外卖红包领取,以及领取红包下单后可获得分成奖励。

代码技术

服务端:使用PHP+MySQL编写服务端接口

前端:使用UniApp开发并封装成微信小程序

界面截图介绍

一、外卖红包

提供美团和饿了么外卖红包领取,下单可获得分成(平台只抽取极少一部分分成,作为开发和日常维护费用)

领取饿了么红包

在这里插入图片描述

领取美团外卖红包

在这里插入图片描述

二、今天吃什么

提供一键解决今天吃什么难题,可随机抽取不同时间段的菜品

在这里插入图片描述

随机抽取菜品,我使用的是定时器setInterval进行多次获取菜品

<template>
<view class="food-top">
    <view class="food-title flex-center">
            今天{{row.time_text && row.time_text != '不限' ? row.time_text: ''}}<text
                    class="ml5">{{formData.name}}</text>{{startLoading ? '!': '?'}}
    </view>

    <view class="food-start">
            <view class="start-text" @click="chooseMenu()">
                    {{buttonText}}
            </view>
    </view>
</view>
<script>
// 声明定时器
var timer = null;
export default {
    components: {},
    data() {
        return {
                buttonText: "开始", // 按钮文字
                row: {
                        cate_id: 0, // 就餐类型id
                        time_text: '', // 就餐类型文字
                },
                // 抽取菜品结果
                formData: {
                        name: '什么'
                },
                cateList: []
        };
    },
    onLoad() {
            this.getList();
    },
    onHide() {
            this.endMenu()
    },
    onUnload() {
            this.endMenu()
    },
    methods: {
            getList() {
                    this.$api.get('/api/food/menuList', this.queryForm).then(res => {

                            this.foodList = res.data.list;
                            this.cateList = res.data.cate_list;
                            this.row = res.data.row;

                    });
            },

            // 选择类型
            selectCate(item) {
                    this.playSound()
                    this.queryForm.cate_id = item.id
                    this.$global.showToast('成功选择“' + item.name + '”类型,请开始选择')

                    this.initMenu()
            },


            // 随机选择菜单
            chooseMenu() {
                    this.playSound()

                    if (this.buttonText == '开始' || this.buttonText == '换一个') {
                            // 开始选择
                            this.startMenu()
                    } else {
                            // 结束选择
                            this.buttonText = '换一个'
                            this.startLoading = true
                            this.endMenu()
                            this.recordMenu()
                    }

            },

            // 记录手动选择结果
            recordMenu() {
                    // menuChoose
                    this.$api.get('/api/food/menuChoose', this.formData).then(res => {
                            // console.log(res.data.length)
                            if (res.data.msg) {
                                    this.$global.showToast(res.data.msg)
                            }
                    });
            },

            // 初始化菜单
            initMenu() {
                    this.buttonText = '开始'
                    this.formData.name = '什么'
                    this.startLoading = false
                    clearInterval(timer)

                    this.getList()
            },

            // 开始选择
            startMenu() {
                    this.buttonText = '停'
                    this.startLoading = false
                    timer = setInterval(() => {
                            let row = this.getRandValue(this.foodList)
                            // console.log(row)
                            this.formData.name = row.name
                    }, 50)
            },

            // 结束选择
            endMenu() {
                    // 记录选择结果 清楚定时
                    clearInterval(timer)
            },

            getRandValue(list = []) {
                    let arr = list
                    let index = Math.floor((Math.random() * arr.length))
                    return arr[index];
            },
    }
};
</script>
</template>

三、我的页面

提供分成提现、收益明细和排行、好友等相关功能

在这里插入图片描述

收益明细页面,展示了最近10天内的收益、累计总收益和近30日的收益

在这里插入图片描述

收益明细的柱状图使用的是echarts官方提供的小程序版本echarts-for-weixin组件。详细代码如下:

<template>
// 2. 页面使用echarts组件
<uni-ec-canvas class="uni-ec-canvas" id="year-canvas" ref="yearCanvas" canvas-id="year-canvas" :ec="ec"></uni-ec-canvas>
</template>
<script>
// 1. 需要引入echarts相关的组件
import uniEcCanvas from '@/pagesMine/components/cloud/uni-ec-canvas/uni-ec-canvas.vue';
import * as echarts from '@/pagesMine/components/cloud/uni-ec-canvas/echarts.min.js';
var chart = null;
export default {
        components: {
            // 注册echarts组件
            uniEcCanvas
        },
        data() {
            return {
                    // 格式化echarts组件为柱状图样式
                    ec: {
                            lazyLoad: true
                    },
                    optionYear: {
                            tooltip: {
                                    trigger: 'axis',
                                    axisPointer: {
                                            // 坐标轴指示器,坐标轴触发有效
                                            type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
                                    }
                            },
                            grid: {
                                    //设置 上下左右距离dom容器距离 控制图标大小
                                    left: '1%',
                                    right: '1%',
                                    bottom: '2%',
                                    top: '8%',
                                    //是否显示刻度标签 true显示
                                    containLabel: true
                            },
                            //直角坐标系配置
                            //设置x轴配置
                            xAxis: {
                                    type: 'category',
                                    axisTick: {
                                            show: false,
                                            alignWithLabel: true
                                    },
                                    nameTextStyle: {
                                            color: '#666666'
                                    },
                                    axisLabel: {
                                            show: true,
                                            interval: 0,
                                            // rotate: 40,
                                            textStyle: {
                                                    color: '#666',
                                                    fontSize: '10',
                                                    fontWeight: 'bold'
                                            }
                                    },
                                    axisLine: {
                                            lineStyle: {
                                                    color: '#666',
                                                    width: 1
                                            }
                                    },
                                    data: ['寿险', '重疾', '意外', '医疗', '年金']
                            },
                            //设置y轴配置
                            yAxis: {
                                    type: 'value',
                                    axisLine: {
                                            show: false //y轴线消失
                                    },
                                    axisLabel: {
                                            show: true,
                                            textStyle: {
                                                    color: '#666',
                                                    fontSize: '10'
                                            }
                                    },

                                    axisTick: {
                                            show: false
                                    }
                            },
                            series: [{
                                    type: 'line',
                                    data: [20, 50, 40, 10, 20],
                                    smooth: true,
                                    areaStyle: {
                                            color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
                                                            offset: 0,
                                                            color: '#6f9989'
                                                    },
                                                    {
                                                            offset: 1,
                                                            color: '#c4d7c7'
                                                    }
                                            ])
                                    },
                                    itemStyle: {
                                            color: '#6f9989',
                                            lineStyle: {
                                                    color: '#6f9989'
                                            }
                                    },
                                    label: {
                                            show: true,
                                            position: 'top',
                                            formatter: params => {
                                                    // console.log(params);
                                                    if (params.data > 0) {
                                                            return params.data;
                                                    } else {
                                                            return '';
                                                    }
                                            },

                                            color: '#666666',
                                            fontStyle: 'PingFang SC',
                                            fontWeight: 'bold',
                                            fontSize: '12'
                                    }
                            }]
                    }
            };
        },
        onLoad(options) {
            this.getIncome();
        },
        methods: {
            // 获取服务端数据 并进行绘图
            getIncome() {
                this.$api.get('/api/person/incomeStatistics', {}).then(
                        res => {
                                this.row = res.data;
                                this.optionYear.xAxis.data = res.data.income_day[0];
                                this.optionYear.series[0].data = res.data.income_day[1];

                                // 获取不到 canvas实例
                                this.$nextTick(() => {
                                        setTimeout(() => {
                                                this.$refs.yearCanvas.init(this.initYearChart);
                                        }, 300);
                                });

                                this.isLoading = false;
                        },
                        rs => {
                                this.isLoading = false;
                        }
                );
            },

            // 绘成柱状图
            initYearChart(canvas, width, height, canvasDpr) {
                // console.log(canvas, width, height, canvasDpr);
                chart = echarts.init(canvas, null, {
                        width: width,
                        height: height,
                        devicePixelRatio: canvasDpr
                });
                canvas.setChart(chart);
                chart.setOption(this.optionYear);
                return chart;
            },
    }
}
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1262300.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UCP通信

一&#xff0c;概括 二 &#xff0c;常用方法 三&#xff0c;实现步骤&#xff08;一发一收&#xff09; 四&#xff0c;案例&#xff08;一发一收&#xff09; &#xff08;1&#xff09;&#xff1a;客户端 &#xff08;2&#xff09;&#xff1a;服务端 &#xff08;3&…

解决:ModuleNotFoundError: No module named ‘PyQt5‘

解决&#xff1a;ModuleNotFoundError: No module named ‘PyQt5’ 文章目录 解决&#xff1a;ModuleNotFoundError: No module named PyQt5背景报错问题报错翻译报错位置代码报错原因解决方法安装PyQt5在PyCharm中配置PyQt5对于新项目对于已有项目 今天的分享就到此结束了 背景…

NX二次开发UF_CURVE_convert_conic_to_gen 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_convert_conic_to_gen Defined in: uf_curve.h int UF_CURVE_convert_conic_to_gen(UF_CURVE_conic_p_t conic_data, UF_CURVE_genconic_t * gen_conic_data ) overview 概…

309.最佳卖股票的时机包含冷冻期

一、题目分析 给定一个整数数组prices&#xff0c;其中第 prices[i] 表示第 i 天的股票价格 。​ 设计一个算法计算出最大利润。在满足以下约束条件下&#xff0c;你可以尽可能地完成更多的交易&#xff08;多次买卖一支股票&#xff09;: 卖出股票后&#xff0c;你无法在第二…

NX二次开发UF_CURVE_convert_conic_to_std 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_convert_conic_to_std Defined in: uf_curve.h int UF_CURVE_convert_conic_to_std(UF_CURVE_genconic_p_t gen_conic_data, UF_CURVE_conic_t * conic_data, logical * se…

python炒股自动化(1),量化交易接口区别

要实现股票量化程序化自动化&#xff0c;就需要券商提供的API接口&#xff0c;重点是个人账户小散户可以申请开通&#xff0c;上手要简单&#xff0c;接口要足够全面&#xff0c;功能完善&#xff0c;首先&#xff0c;第一步就是要找对渠道和方法&#xff0c;这里我们不讨论量化…

关于Unity中字典在Inspector的显示

字典在Inspector的显示 方法一&#xff1a;实现ISerializationCallbackReceiver接口 《unity3D游戏开发第二版》记录 在编辑面板中可以利用序列化监听接口特性对字典进行序列化。 主要继承ISerializationCallbackReceiver接口 实现OnAfterDeserialize() OnBeforeSerialize() …

二十章 多线程

线程简介 在 Java 中&#xff0c;并发机制非常重要。在以往的程序设计中&#xff0c;我们都是一个任务完成后再进行下一个任务&#xff0c;这样下一个任务的开始必须等待前一个任务的结束。Java 语言提供了并发机制&#xff0c;程序员可以在程序中执行多个线程&#xff0c;每一…

上门预约互联网干洗店洗鞋店小程序开发

很多时候可能大家的衣服鞋子需要干洗&#xff0c;但又不想出门送去店里&#xff0c;大家就可以使用手机线上下单预约取货&#xff0c;会有专门的人上门来取衣服&#xff0c;让你能够轻松的进行洗护。 闪站侠洗衣洗鞋小程序&#xff0c;提供了足不出户就能预约人员上门去 衣送洗…

【刷题笔记】匹配字符串||KMP||动图解析||符合思维方式

找出字符串中第一个匹配项的下标 1 题目描述 https://leetcode.cn/problems/find-the-index-of-the-first-occurrence-in-a-string/ 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开…

Swift下如何使用#if条件编译

一、OC使用条件编译 OC中可以使用宏定义&#xff0c;再使用条件编译 #define USER_CUSTOM使用 #if USER_CUSTOM //其他代码 #endif二、Swift使用条件编译 Swift 不像ObjectC一样&#xff0c;通过定义一个变量&#xff0c;然后使用**#if #endif** 方法。swift需要设置一下才能…

SpringBoot错误处理机制(ControllerAdvice+ExceptionHandler自定义错误处理、默认机制源码分析、错误处理实战)

目录 1. SpringBoot自己对错误进行处理1.1 给一个Controller进行错误处理1.2 使用ControllerAdvice统一处理错误 2. 默认机制源码解析3. 错误处理机制实战 1. SpringBoot自己对错误进行处理 1.1 给一个Controller进行错误处理 使用ExceptionHandler&#xff0c;处理一个Conto…

【电源芯片】ZTP7193

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评百大…

销售流程中如何有效开发客户

在销售的海洋中&#xff0c;如何游刃有余地开发客户是一大关键。这需要深入了解你的目标客户&#xff0c;制定一份精细的销售计划&#xff0c;选择最合适的沟通方式&#xff0c;建立信任和信誉&#xff0c;并持续不断地跟进。 每一个潜在的客户都是一颗璀璨的星辰&#xff0c;…

地理坐标系转换

1.EPSG代码 搜索地理坐标系对应的EPSG代码 https://epsg.io/ 常用的地理坐标系EPSG代码&#xff1a; 2. 坐标系转换 转换网址&#xff1a; https://epsg.io/transform &#xff08;1&#xff09;修改 input coordinate system 和 output coordinate system&#xff0c; 可以…

【开源】基于Vue.js的农村物流配送系统的设计和实现

项目编号&#xff1a; S 024 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S024&#xff0c;文末获取源码。} 项目编号&#xff1a;S024&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统登录、注册界面2.2 系统功能2.2…

人工智能学习2(python数据清洗)

编译工具&#xff1a;PyCharm 一.数据清洗 转化数据类型、处理重复数据、处理缺失数据 import pandas as pddf pd.read_csv("/data.csv") df.sample(10) # 用于随机获取数据并返回结果 df.head(10) # 查看前十条数据 df.tail(10) # 查看后十条数据 df.shape …

Zookeeper 实战 | Zookeeper 和Spring Cloud相结合解决分布式锁、服务注册与发现、配置管理

专栏集锦&#xff0c;大佬们可以收藏以备不时之需&#xff1a; Spring Cloud 专栏&#xff1a;http://t.csdnimg.cn/WDmJ9 Python 专栏&#xff1a;http://t.csdnimg.cn/hMwPR Redis 专栏&#xff1a;http://t.csdnimg.cn/Qq0Xc TensorFlow 专栏&#xff1a;http://t.csdni…

Emeya散发的时代之光,似乎正盖过Panamera的余晖

路特斯Emeya的首秀象征着在超豪华汽车领域&#xff0c;纯电与超跑轿车的绝美融合正式拉开序幕。自由与灵感的碰撞&#xff0c;诗意与理想的贯通&#xff0c;汽车工业的性感似乎在Emeya上出现了全新的表达。 但短短不到一周的时间&#xff0c;我们又见到了全新Panamera的首秀。…

四招心理博弈术,让别人不敢欺负你,敬你三分

教你四招心理博弈术&#xff0c;让别人不敢欺负你&#xff0c;无论在职场中还是跟朋友交往中&#xff0c;为什么总是有人敢欺负你呢&#xff0c;是因为你不懂得人性博弈。其本质原因&#xff0c;是你做人没有边界感&#xff0c;或者没有原则&#xff0c;即便你有原则&#xff0…