在是中国餐饮业最好的时代,也是竞争最激烈的时代:
一方面,2018 年已突破 4 万亿元,年增长率 10%,门店数量十年增长 10 倍;市场上一半消费者为 90 后,在外就餐成为日常花销,前景可观;
另一方面,行业高度分散竞争激烈,行业数字化程度低,从业者对微信点餐功能认知单一,容易错失点餐前后的多样化智慧能力。
但餐饮市场依然有佼佼者,因为熟稔数字化时代的玩法而尝到甜头——有的两三年内开上千家连锁,笼络上千万忠实会员,有的找到新的垂直餐饮场景发力。
他们是怎么做到的?用了什么工具,什么策略?
从 6 大头部餐饮品牌(西贝莜面村、望湘园、古茗茶饮、阿甘锅盔、湊湊火锅、阿香米线),打造的「智慧餐饮案例」也许能给从业者经营的启发。
< class="pgc-img">>龙山合创智慧餐饮
(长按上图,识别点餐系统进入了解详情)
6大品牌案例亮点抢先预告
< class="pgc-img">>(品牌排名不分先后)
01 门店引流难:
通过微信朋友圈 LBS 广告投放精准获客
< class="pgc-img">>(点击图片,进入查看智慧餐饮系统样本)
痛点:传统获取流量方式,如传单和户外广告,成本高,不精准,转化效果不理想。
策略:通过 LBS 广告引流,精准触达门店会员和附近顾客:
· 时间精准:周一到周四的上午 10-11点,下午 3-4 点,触达率最高。
· 范围精准:新店 3-5 公里之内投放大力度优惠拉新,老店投放新品、活动给既有会员。
· 标签精准:喜欢火锅和茶饮的产品,年轻,未婚,女性用户。
☉ 效果:会员复购率达到30%。
02 客单价提升难:
会员管理数据,驱动餐品推荐
< class="pgc-img">>(点击图片,进入智慧餐饮系统主页展示)
痛点:顾客消费能力固定,常规提升单价营销容易引起顾客反感。
策略:智慧推荐,给顾客提供合适的菜品:
· 桌型套餐:根据不同桌型人数,推荐搭配好的套餐,稳定客单价。
< class="pgc-img">>· 加餐提醒:湘菜重口,点餐时自动提醒点主食饮料。
· 宝宝餐选项:提供会员免费宝宝套餐,稳住爱吃湘菜但也考虑健康家长顾客。
☉ 效果:套餐购买率提升了 8 倍,家庭顾客占比从 0.8%上升到 14.8%。
< class="pgc-img">>03 会员沉淀难:
微信点餐+公众号,让会员沉淀更自然
< class="pgc-img">>(点击图片,进入智慧餐饮系统展示样本)
痛点:围餐复购率偏低,客户缺乏成为会员的动力;
策略:服务环节每一步都与公众号关联,形成自然地客户沉淀:
· 排号——未到店即可先关注公众号排队,现场等位时可以选择预点餐(还能呼叫取餐)
< class="pgc-img">>· 点餐——在座位上扫描桌上二维码,直接点餐。
< class="pgc-img">>· 评价——用餐完毕后,引导关注公众号,留下餐品反馈。
· 外卖/外带——不堂食的顾客,可通过外卖系统,或者外带服务点餐。(还能对美团、饿了么等平台)
< class="pgc-img">>☉ 效果:三年会员总数突破 2000 万人,有大批家庭粉丝。
< class="pgc-img">>04 门店坪效低:
使用微信点餐,优化前端人力
啊
< class="pgc-img">>(点击图片,进入智慧餐饮系统主页展示)
痛点:餐饮业人员、租金成本占了大头,但减少人员投入,容易降低服务质量。
策略:通过微信点餐,减少前端人力投入,同时提升顾客点餐的自主性:
· 顾客引导:门店物料+店员话术+优惠内容多维度吸引使用;
< class="pgc-img">>· 店员引导:线上课程结合线下面授,通过考核验收学习成果。
☉ 效果:上线 28 天,客单价提升 40%、营业额提升15%,每家店减少三分之一人力,店员兼顾收银和制饼,成为品牌独特景观。
< class="pgc-img">>05 供应链管理复杂:
通过微信点餐数据指导销售、采购计划
< class="pgc-img">>(点击图片,进入智慧餐饮系统主页展示)
痛点: 凭经验预估原料容易造成浪费,增加门店成本。
策略:通过前端数据制定销售计划,优化门店采购量:
· 千元用量:针对杯子等无品类区隔的原材料,按照1000元除以平均客单价进行数量预估;
· 单杯销量:针对水果等有品类区隔的原材料,按照品类具体销量和成分,拆分出水果等食品原材料的需求量。
☉ 效果:门店利用率有效提升,以淡奶油为例,利用率从 60% 提升到 80%。
< class="pgc-img">>06 新场景拓展不易:
寻找垂直「小外卖」场景,因地制「码」
服务商:两个国内领先的某 SaaS,聚合支付头部服务商。
新增场景:相对封闭,自带配送能力的餐饮场所,如医院、高铁车厢。
策略:因地制码,让二维码变成具体地理位置坐标,实现小场景送餐可能性。
< class="pgc-img">>☉ 效果:目前已有多家三甲医院、北京上海高铁线路用上了微信点餐。
「智慧餐饮案例」是龙山合创信息技术有限公司团队为从业者打造的数字化解决方案合集,内容涵盖不同餐饮业态的痛点、案例以及经营巧思,致力于为餐饮业数字化提供新视角。
更详细内容,请识别下方二维码了解:
< class="pgc-img">>如果您和您的品牌对于数字化餐饮有困惑,请联系我们,将会有专门工作人员为你解答。
电话:15274399666(微信同号)
龙山合创信息技术有限公司
活动期间面向全国餐饮老板 免费体验使用3个月
使用舒服才再收费,不舒服不收取费用 体验期间,提供云打印机,扫码餐牌等物料
即将恢复原价,观望是商机最大的敌人。
机遇转瞬即逝,商机不等人!!!
—《END》—
<>力分享最实用的营销策划案例,希望对你的生意有所启发,对你的经商思维有所帮助!
现在,不少餐饮门店都在使用微信营销,想利用微信平台达到产品宣传,品牌推广的目的。可是实际上,真正收到微信营销效果的餐饮店可谓是少之又少。问题出在哪里。给大家分析一个失败的餐饮微信营销案例,或者会对大家有所启发。
< class="pgc-img">>许多线下实体门店都在试水微信营销,店里面都会在显眼的地方摆上自己的二维码,一般都展示的的扫二维码有惊喜或者有礼品的字样。那天笔者跟朋友几个人去一家新开的拉面馆吃饭,正巧也碰到开业活动,扫二维码关注微信转发到朋友圈就送一瓶饮料。
活动本身还是不错的,我们进门按照服务员的引导先关注了微信,然后转发到了自己的朋友圈。接下来就开始进门排队了,有一个人来负责检查你是不是关注了微信,还有转发的时间是不是当天。这点出了点小插曲,本来我关注和转发就是几分钟前的事,店员一开始没看清就不承认,搞得我心情非常的不爽。
我就跟店员说:下面就是我同事刚转发的,你看看时间。随后他又仔细看了看不好意思的确认了一下,然后很抱歉的说了几句,其实我想说,你检查的即使发现问题,也不要太过于强硬的说给我,本来我吃面也是要花钱的,送饮料也没多少钱,而且容易给我留下一个不太好的印象。其实那几天吃面很多人都是拿了优惠券的,现在多不多我就不知道了,反正后面我没去。
< class="pgc-img">>顺利的点了餐然后就是领饮料,落座吃饭。实话讲,面做的还是不错的,只是过程让我觉得第一次去就不是很舒服,我是不会去第二次了。关注他们的微信其实也就是每天发一条老套的广告,还有也就是一些搬运文章,对想去吃饭的人影响并不大。后来同去的人都是吃完就取消关注了,如果活动还有就第二天重新关注再换取一瓶饮料。
这个小小的例子我深有体会:微信营销并非是做做表面功夫,必须要深入实际生活才能发现问题。
一、让顾客成为会员是第一步
拉面馆做的这次开店活动,本来是有机会把很多第一次来吃饭的人转化为会员的,但是它没有这个意思,只是简单的用优惠政策让人吃了一碗面,才十四块钱。如果转化为会员你就给它发一张虚拟会员卡,以后消费都可以满多少元打折就很方便了,因为这不用身上带着很多卡,只要结账的时候看一下就行,非常方便。
二、餐饮不能太小气
哪怕人家是第一次去吃饭,顾客耍点小机灵,也不要当面去说。因为你送他一瓶饮料其实成本并不高,但是每天他都要去消费就会把成本弥补回来。如果他推荐朋友去又能后期让你赚到很多钱,小小恩惠会让他得意,而且觉得店家大方,这样你就赢得了他对你的肯定。
三、后期维护不可少
活动结束会有很多人取消关注,那么如果刚开始做微信公共平台营销,一定从第一天开始起,就要维护每天关注我们的用户,分享这些天活动的情况,也可以征集客户吃饭的图片,每天推送,做一些互动。还可以借助第三方的服务平台来做会员管理和微商城等服务,通过定时推出订餐服务:快捷、速度、价钱适中。
让新客户想吃就能马上订餐,微商城上提供客户点餐率比较高的菜单,这样基本可以减少用户的选择时间,更快的达成下单,采用到付的方式减少流程,简单方便,这些工作只要有专人负责即可,订餐体系一定要独立快速,保证送餐质量,长久服务必能带来回报。
四、定期发布新品,让新老客户都有惊喜
餐饮竞争确实很激烈,如果长期不研发新的菜品或者服务,定然会走到一个瓶颈。保留老精品做好做细致,新品也必须有更新,这样才能满足人们对店家的期待。而且新品可以通过预约试吃等方式来进行,老用户可以凭借会员卡积分来半价体验新品,新会员可以享受打折优惠,这样通过试吃和优惠让新品得到更多人品尝,通过后期反馈和改进口味,得到好的经验效果。
总结:餐饮微信营销要走的路还很长,微信营销只是一个辅助工具,想要做好微信营销的关键还是餐饮业自身的两大硬功夫,一是菜品口感硬,二是服务质量硬,在这两样的基础上再去进行营销才是王道。
◆没有营销,只有人性。
◆商家与客户之间,信任与价值的事情。
end
如果觉得文章有帮助,欢迎分享给你的朋友或同事,也许能帮到他们。
关注我的头条号,每天学习最新商业知识,精心整理餐饮行业资料512套(包含管理、营销、促销、制度、培训等),篇幅有限,需要资源的私信小编, 发送“餐饮营销”4个字 免费赠送
领取方式:
1.首先请在评论区留下您对本文的评论 (精品资源一个评论一个名额领取!)
2.右上角点击【关注】,关注实体店活动方案!
3.私信发送 餐饮营销 4个字!
><>< class="pgc-img">>构
前后端分离:
< class="pgc-img">>< class="pgc-img">>< class="pgc-img">>补充:
- setting.xml 文件的作用:settings.xml是maven的全局配置文件。而pom.xml文件是所在项目的局部配置。Settings.xml中包含类似本地仓储位置、修改远程仓储服务器、认证信息等配置。
- maven的作用:借助Maven,可将jar包仅仅保存在“仓库”中,有需要该文件时,就引用该文件接口,不需要复制文件过来占用空间。
注:这个“仓库”应该就是本地安装maven的目录下的Repository的文件夹
分布式锁
线程锁:当某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该代码段。线程锁只在同一JVM中有效,因为线程锁的实现在根本上是依靠线程之间共享内存实现的。如synchronized
进程锁:为了控制同一操作系统中多个进程访问某个共享资源。
分布式锁:当多个进程不在同一个系统中,用分布式锁控制多个进程对资源的访问。
分布式锁一般有三种实现方式:
- 数据库乐观锁;
- 基于Redis的分布式锁;
- 基于ZooKeeper的分布式锁。
乐观锁的实现:使用版本标识来确定读到的数据与提交时的数据是否一致。提交后修改版本标识,不一致时可以采取丢弃和再次尝试的策略。
分布式锁基于Redis的实现:(本系统锁才用的)
基本命令:
- SETNX(SET if Not exist):当且仅当 key 不存在,将 key 的值设为 value ,并返回1;若给定的 key 已经存在,则 SETNX 不做任何动作,并返回0。
- GETSET:将给定 key 的值设为 value ,并返回 key 的旧值。先根据key获取到旧的value,再set新的value。
- EXPIRE 为给定 key 设置生存时间,当 key 过期时,它会被自动删除。
加锁方式:
这里的jedis是Java对Redis的集成
jedis.set(String key, String value, String nxxx, String expx, int time)
错误的加锁方式1:
如果程序在执行完setnx()之后突然崩溃,导致锁没有设置过期时间。那么将会发生死锁。
Long result=jedis.setnx(Key, value); if (result==1) { // 若在这里程序突然崩溃,则无法设置过期时间,将发生死锁 jedis.expire(Key, expireTime); }
错误的加锁方式2:
分布式锁才用(Key,过期时间)的方式,如果锁存在,那么获取它的过期时间,如果锁的确已经过期了,那么获得锁,并且设置新的过期时间
错误分析:不同的客户端之间需要同步好时间。
long expires=System.currentTimeMillis() + expireTime; String expiresStr=String.valueOf(expires); // 如果当前锁不存在,返回加锁成功 if (jedis.setnx(lockKey, expiresStr)==1) { return true; } // 如果锁存在,获取锁的过期时间 String currentValueStr=jedis.get(lockKey); if (currentValueStr !=null && Long.parseLong(currentValueStr) < System.currentTimeMillis()) { // 锁已过期,获取上一个锁的过期时间,并设置现在锁的过期时间 String oldValueStr=jedis.getSet(lockKey, expiresStr); if (oldValueStr !=null && oldValueStr.equals(currentValueStr)) { // 考虑多线程并发的情况,只有一个线程的设置值和当前值相同,它才有权利加锁 return true; } } // 其他情况,一律返回加锁失败 return false;
解锁:判断锁的拥有者后可以使用 jedis.del(lockKey) 来释放锁。
分布式锁基于Zookeeper的实现
Zookeeper简介:Zookeeper提供一个多层级的节点命名空间(节点称为znode),每个节点都用一个以斜杠(/)分隔的路径表示,而且每个节点都有父节点(根节点除外)。
例如,/foo/doo这个表示一个znode,它的父节点为/foo,父父节点为/,而/为根节点没有父节点。
client不论连接到哪个Server,展示给它都是同一个视图,这是zookeeper最重要的性能。
Zookeeper 的核心是原子广播,这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议。Zab协议有两种模式,它们分别是恢复模式(选主)和广播模式(同步)。当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和 leader的状态同步以后,恢复模式就结束了。状态同步保证了leader和Server具有相同的系统状态。
为了保证事务的顺序一致性,zookeeper采用了递增的事务id号(zxid)来标识事务,实现中zxid是一个64位的数字。
Zookeeper的分布式锁原理
获取分布式锁的流程:
- 在获取分布式锁的时候在locker节点(locker节点是Zookeeper的指定节点)下创建临时顺序节点,释放锁的时候删除该临时节点。
- 客户端调用createNode方法在locker下创建临时顺序节点,然后调用getChildren(“locker”)来获取locker下面的所有子节点,注意此时不用设置任何Watcher。
- 客户端获取到所有的子节点path之后,如果发现自己创建的子节点序号最小,那么就认为该客户端获取到了锁。
- 如果发现自己创建的节点并非locker所有子节点中最小的,说明自己还没有获取到锁,此时客户端需要找到比自己小的那个节点,然后对其调用exist()方法,同时对其注册事件监听器。
- 之后,让这个被关注的节点删除,则客户端的Watcher会收到相应通知,此时再次判断自己创建的节点是否是locker子节点中序号最小的,如果是则获取到了锁,如果不是则重复以上步骤继续获取到比自己小的一个节点并注册监听。
我的解释:
A在Locker下创建了Node_n —>循环 ( 每次获取Locker下的所有子节点 —> 对这些节点按节点自增号排序顺序 —> 判断自己创建的Node_n是否是第一个节点 —> 如果是则获得了分布式锁 —> 如果不是监听上一个节点Node_n-1 等它释放掉分布式锁。)
@ControllerAdvice处理全局异常
Mybatis注解方式的使用:
@insert 用注解方式写SQL语句
分布式系统的下的Session
1、分布式系统:多节点,节点发送数据交互,不共享主内存,但通过网络发送消息合作。
分布式:不同功能模块的节点
集群:相同功能的节点
2、Session 与token
服务端在HTTP头里设置SessionID而客户端将其保存在cookie
而使用Token时需要手动在HTTP头里设置,服务器收到请求后取出cookie进行验证。
都是一个用户一个标志
3、分布式系统中的Session问题:
高并发:通过设计保证系统能够同时并行处理很多请求。
当高并发量的请求到达服务端的时候通过负载均衡的方式分发到集群中的某个服务器,这样就有可能导致同一个用户的多次请求被分发到集群的不同服务器上,就会出现取不到session数据的情况。
根据访问不同的URL,负载到不同的服务器上去
三台机器,A1部署类目,A2部署商品,A3部署单服务
通用方案:用Redis保存Session信息,服务器需要时都去找Redis要。登录时保存好key-value,登出时让他失效
垂直扩展:IP哈希 IP的哈希值相同的访问同一台服务器
session的一致性:只要用户不重启浏览器,每次http短连接请求,理论上服务端都能定位到session,保持会话。
Redis作为分布式锁
高并发:通过设计保证系统能够同时并行处理很多请求。(系统学习并发知识,可以在Java知音公众号回复“多线程聚合”)
同步:Java中的同步指的是通过人为的控制和调度,保证共享资源的多线程访问成为线程安全。
线程的Block状态:
a.调用join()和sleep()方法,sleep()时间结束或被打断
b.wait(),使该线程处于等待池,直到notify()/notifyAll():不释放资源
此外,在runnable状态的线程是处于被调度的线程,Thread类中的yield方法可以让一个running状态的线程转入runnable。
Q:为什么wait,notify和notifyAll必须与synchronized一起使用?Obj.wait()、Obj.notify必须在synchronized(Obj){…}语句块内。
A:wait就是说线程在获取对象锁后,主动释放对象锁,同时本线程休眠。
Q:Synchronized:
A:Synchronized就是非公平锁,它无法保证等待的线程获取锁的顺序。
公平和非公平锁的队列都基于锁内部维护的一个双向链表,表结点Node的值就是每一个请求当前锁的线程。公平锁则在于每次都是依次从队首取值。
ReentrantLock重入性:
重入锁可以看这两篇文章,都比较简单
https://www.jianshu.com/p/587a4559442b
https://www.jianshu.com/p/1c52f17efaab
Spring + Redis缓存的两个重要注解:
- @cacheable 只会执行一次,当标记在一个方法上时表示该方法是支持缓存的,Spring会在其被调用后将其返回值缓存起来,以保证下次利用同样的参数来执行该方法时可以直接从缓存中获取结果。
- @cacheput:与@Cacheable不同的是使用@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。
对数据库加锁(乐观锁 与 悲观锁)
悲观锁依赖数据库实现:
select * from account where name=”Erica” for update
这条sql 语句锁定了account 表中所有符合检索条件(name=”Erica”)的记录,使该记录在修改期间其它线程不得占有。
代码层加锁:
String hql="from TUser as user where user.name='Erica'"; Query query=session.createQuery(hql); query.setLockMode("user",LockMode.UPGRADE); //加锁 List userList=query.list();//执行查询,获取数据
其它
@Data 类似于自动生成了Getter()、Setter()、ToString()等方法。
JAVA1.8的新特性StreamAPI:Collectors中提供了将流中的元素累积到汇聚结果的各种方式
List<Menu> menus=Menu.getMenus.stream().collect(Collectors.toList())
For - each 写法:
for each语句是java5新增,在遍历数组、集合的时候,for each拥有不错的性能。
public static void main(String[] args) { String[] names={"beibei", "jingjing"}; for (String name : names) { System.out.println(name); } }
for each虽然能遍历数组或者集合,但是只能用来遍历,无法在遍历的过程中对数组或者集合进行修改。
BindingResult:一个@Valid的参数后必须紧挨着一个BindingResult 参数,否则spring会在校验不通过时直接抛出异常。
@Data public class OrderForm { @NotEmpty(message="姓名必填") private String name; }
后台:
@RequestMapping("save") public String save( @Valid OrderForm order,BindingResult result) { // if(result.hasErrors()){ List<ObjectError> ls=result.getAllErrors(); for (int i=0; i < ls.size(); i++) { log.error("参数不正确,OrderForm={}", order); throw new SellException( ………… , result.getFeildError.getDefaultMessage() ) System.out.println("error:"+ls.get(i)); } } return "adduser"; }
result.getFeildError.getDefaultMessage()可抛出“姓名必填” 的异常。
4、List转为Map
public class Apple { private Integer id; private String name; private BigDecimal money; private Integer num; }
List<Apple> appleList=new ArrayList<>();//存放apple对象集合 Apple apple1=new Apple(1,"苹果1",new BigDecimal("3.25"),10); Apple apple12=new Apple(1,"苹果2",new BigDecimal("1.35"),20); Apple apple2=new Apple(2,"香蕉",new BigDecimal("2.89"),30); Apple apple3=new Apple(3,"荔枝",new BigDecimal("9.99"),40); appleList.add(apple1); appleList.add(apple12); appleList.add(apple2); appleList.add(apple3);
Map<Integer, Apple> appleMap=appleList.stream().collect(Collectors.toMap(Apple::getId, a -> a,(k1,k2)->k1));
5、Collection的子类:List、Set
< class="pgc-img">>List:ArrayList、linkedList 、Vector
List:有序容器,允许null元素,允许重复元素
Set:元素是无序的,不允许元素
最流行的是基于 HashMap 实现的 HashSet,由hashCode()和equals()保证元素的唯一性。
可以用set帮助去掉List中的重复元素,set的构造方法的参数可以是List,构造后是一个去重的set。
HashMap的补充:它不是Collection下的
Map可以使用containsKey()/containsValue()来检查其中是否含有某个key/value。
HashMap会利用对象的hashCode来快速找到key。
插入过程:通过一个hash函数确定Entry的插入位置index=hash(key),但是数组的长度有限,可能会发生index冲突,当发生了冲突时,会使用头插法,即为新来的Entry指向旧的Entry,成为一个链表。
每次插入时依次遍历它的index下的单链表,如果存在Key一致的节点,那么直接替换,并且返回新的值。
但是单链表不会一直增加元素,当元素个数超过8个时,会尝试将单链表转化为红黑树存储。
为何加载因子默认为0.75?(0.75开始扩容)
答:通过源码里的javadoc注释看到,元素在哈希表中分布的桶频率服从参数为0.5的泊松分布。
源码地址:
>https://github.com/923310233/wxOrder