(7)公众号开发-自定义菜单

公众号开发-被动消息回复

自定义菜单是公众号开发必备功能,公众号用户与后台交互基本都在菜单中完成,自定义菜单可以让公众号下菜单拥有更加丰富的菜单事件,以及菜单功能
本专栏说明以及源码地址:微信开发专栏说明

自定义菜单介绍

自定义菜单在创建时需要注意以下几个内容

  1. 自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单
  2. 一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“…”代替
  3. 创建自定义菜单后,菜单的刷新策略是,在用户进入公众号会话页或公众号profile页时,如果发现上一次拉取菜单的请求在5分钟以前,就会拉取一下菜单,如果菜单有更新,就会刷新客户端的菜单。测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果

这里是微信公众平台官方文档:自定义菜单

数据表设计

自定义菜单需要使用到数据库,将我们的自定义菜单格式保存下来,所有首先我们需要设计数据库,根据官方文档最终设计出如下表

create table weixin.vx_menu
(
    id             bigint auto_increment comment '主键' primary key,
    parent_id      bigint                  null comment '父级id',
    tree_level     varchar(20) default '0' null comment '菜单级别',
    tree_sort      bigint                  null comment '本级排序号(升序)',
    menu_type      varchar(12)             null comment '菜单类型',
    menu_name      char(16)                not null comment '菜单名称',
    menu_key       char(128)               null comment '菜单KEY值,用于消息接口推送,不超过128字节(click等点击类型必须)',
    menu_url       varchar(500)            null comment '用户点击菜单可打开链接(view、miniprogram类型必须)',
    menu_media_id  varchar(64)             null comment '调用新增永久素材接口返回的合法media_id(media_id类型和view_limited类型必须)',
    menu_app_id    varchar(64)             null comment '小程序的appid(miniprogram类型必须)',
    menu_page_path varchar(64)             null comment '小程序的页面路径(miniprogram类型必须)'
);

表格创建完毕后插入几条测试数据方便等一下测试

在这里插入图片描述

代码编写

common包

增加:VxResult

修改:VxParameterConfig、vx.yml

在这里插入图片描述

VxResult

该类用于处理发起请求后收到的返回消息处理

在这里插入图片描述

vx.yml

需要在yml增加创建菜单的请求地址

在这里插入图片描述

VxParameterConfig

增加menuUrl属性并且生成相应的set/get方法

在这里插入图片描述

core包

增加:VxMenu,InitMenuFormBody,MenuType,TreeLevel,VxMenuMapper,VxMenuServiceImpl,VxMenuService,VxMenuMapper.xml

在这里插入图片描述

VxMenu

对应数据库表字段

@Data
@TableName(value = "vx_menu")
public class VxMenu {
    @TableId(type = IdType.AUTO)
    private Long id;
    private Long parentId;
    private TreeLevel treeLevel;
    private Long treeSort;
    private MenuType menuType;
    private String menuName;
    private String menuKey;
    private String menuUrl;
    private String menuMediaId;
    private String menuAppId;
    private String menuPagePath;
}
InitMenuFormBody

发生请求时所需要用到的json格式对象

@Data
public class InitMenuFormBody {
    private String name;
    private String type;
    private String url;
    private String key;
    private List<InitMenuFormBody> sub_button;
}
MenuType和TreeLevel

MenuType:菜单类型的枚举类

TreeLevel:菜单级别枚举类

在这里插入图片描述

VxMenuMapper

这里使用到的是mybatis-plus,需要基础一个通用的Mapper,编写一个selectMenuTree获取树结构的自定义sql

在这里插入图片描述

VxMenuMapper.xml

编写自定义sql利用Mybatisxml映射,生成菜单数结构

在这里插入图片描述

VxMenuService

在这里插入图片描述

VxMenuServiceImpl

编写创建菜单的方法

在这里插入图片描述

启动异步创建菜单

编写以上的类与方法后,我们通过menuService.initMenu();就可以调用方法创建菜单了,但是这显然不够灵活,需要进行改造一下,如果在项目启动后自动初始化菜单那就是最好的了,接下来我们就实现它

LoadVxMenu

编写一个LoadVxMenu的类

  1. 实现CommandLineRunner,重写run方法,这样当项目启动完毕后就会调用run方法
  2. 编写内部类LoadMenuTask,实现Runnable重写run方法,利用while轮询Redis中ACCESS_TOKEN,当获取到ACCESS_TOKEN才会进行初始化菜单的操作
  3. 将来编写好的LoadMenuTask对象传入到CommandLineRunner的run方法中即可

在这里插入图片描述

运行测试

在这里插入图片描述

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

JolyouLu

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

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

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

打赏作者

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

抵扣说明:

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

余额充值