微信公众号之灵活自定义菜单显示包含数据库结构设计
前段时间,开发特别着急,所以对于自定义菜单的设置是以代码为基准编写的在,不能实现高可用。现在我将自定义菜单制作成数据表中,通过读取数据库表来进行创建自定义菜单
1、数据库表
package com.ihaidou.entity.db.wechat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import org.hibernate.annotations.UpdateTimestamp;
import javax.persistence.*;
import java.util.Date;
/**
* @Desc: 子菜单Url
* @Author HealerJean
* @Date 2018/6/1 下午5:45.
*/
@Entity
@Table(name="wechat_menu_url")
@Data
@Accessors(chain = true)
public class WeChatMenu {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ApiModelProperty(value = "微信公众号 主键")
private Long wechatBusinessNoId ;
@ApiModelProperty(value = "菜单对应的eventkey")
private String eventkey ;
@ApiModelProperty(value = "view菜单对应的url或者是图片对应的url")
private String url;
@ApiModelProperty("菜单的名字")
private String name; //菜单名字
@ApiModelProperty(value = "包含图片和media以及返回菜单的文字内容")
private String value ; //菜单内容
@Temporal(TemporalType.TIMESTAMP)
@Column(columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP",insertable = true,updatable = false)
private Date cdate;
@UpdateTimestamp
@Temporal(TemporalType.TIMESTAMP)
private Date udate;
@ApiModelProperty(value = "从左到右顺序 , 1 2 3")
private Integer wOrder;
@ApiModelProperty(value = "从上到下顺序")
private Integer hOrder;
@ApiModelProperty(value = "是否底部菜单")
private boolean footMenu;
@ApiModelProperty(value = "菜单类型 1 url类型 ,2 回复文字类型,3 回复图片类型")
private Integer type ;
@ApiModelProperty(value = "1表示作为子菜单,2表示作为其他选项")
private Integer useType ;
@ApiModelProperty(value = "菜单是否删除")
private Integer status ;
}
/**
create table wechat_menu(
id BIGINT(20) not null auto_increment,
wechatBusinessNoId BIGINT(20) default null ,
url varchar(500) default null,
eventkey varchar(100) default null,
name varchar(50) default null,
value varchar(1000) default '',
wOrder int(11) default 0,
hOrder int(11) default 0,
footMenu int(11) default 0 ,
status int(11) default 0,
type int(11) default 0,
useType int(11) default 1 comment '1表示作为子菜单,2表示作为其他选项',
cdate timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
udate timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY key (id));
*/
2、开始创建自定义菜单
@Slf4j
@Service
public class MenuServiceImpl implements MenuService{
@Resource
private WeChatMenuRepository weChatMenuRepository;
@Override
public String byControllerSetMenu(WeChatBusinessNo weChatBusinessNo) {
List<WeChatMenu> weChatMenus = weChatMenuRepository.findByWechatBusinessNoIdAndStatusAndUseType(weChatBusinessNo.getId(),1, 1);
Menu menu = new Menu();
List<BasicButton> menuBasicButton = new ArrayList<>(); //底部菜单
Map<Integer, List<WeChatMenu>> weightMenu = weChatMenus.stream().sorted(Comparator.comparing(WeChatMenu::getWOrder)).collect(Collectors.groupingBy(WeChatMenu::getWOrder));
for(Integer wOrder:weightMenu.keySet()){
BasicButton basicButton = new BasicButton(); //纵向菜单
List<BasicButton> basicButtons = new ArrayList<>();
boolean isOnlyOne = false ; //底部菜单是不是只有一个,false表示不是只有一个 true表示底部菜单只有一个
if(weightMenu.get(wOrder).size()==1){
isOnlyOne = true ;
}
boolean finalIsOnlyOne = isOnlyOne;
weightMenu.get(wOrder).stream().sorted(Comparator.comparing(WeChatMenu::getHOrder)).forEach(
weChatMenu -> {
switch (weChatMenu.getType()){
case 1://1 url类型
ViewButton viewButton = new ViewButton();
viewButton.setName(weChatMenu.getName());
viewButton.setUrl(weChatMenu.getUrl());
viewButton.setType(WechatMenuParams.VIEW);
if(finalIsOnlyOne ==false){
basicButtons.add(viewButton);
}else {
menuBasicButton.add(viewButton);
break; //直接进入下一个
}
break;
case 2://2 回复文字类型
case 3://3 回复图片类型
ClickButton clickButton = new ClickButton();
clickButton.setName(weChatMenu.getName());
clickButton.setKey(weChatMenu.getEventkey());
clickButton.setType(WechatMenuParams.CLICK);
if(finalIsOnlyOne ==false){
basicButtons.add(clickButton);
}else {
menuBasicButton.add(clickButton);
break; //直接进入下一个
} break;
default:
break;
}
//必须保证底部菜单是多个的情况
if(weChatMenu.isFootMenu()==true){
basicButton.setName(weChatMenu.getName());
}
}
);
if(finalIsOnlyOne==false){
basicButton.setSub_button( basicButtons.stream().toArray(BasicButton[]::new));
menuBasicButton.add(basicButton);
}
}
menu.setButton(menuBasicButton.stream().toArray(BasicButton[]::new));
String menuJson = JSONObject.fromObject(menu).toString();
log.info(menuJson);
//此处改为自己想要的结构体,替换即可
String access_token= AccessToakeUtil.getAccessToaken(weChatBusinessNo);
String createMenuUrl = WechatMenuParams.CREATE_MENU_URL+access_token;
String body = SdkHttpHelper.doJsonPost(createMenuUrl,menuJson);
log.info("创建自定义菜单 返回结果"+body);
String result = JSONObject.fromObject(body).getString("errmsg");
if(StringUtils.equals(result,"ok")){
log.info("创建自定义菜单成功");
return result;
}else{
log.error("创建创建自定义菜单失败自定义菜单失败");
}
return "创建失败";
}
}
感兴趣的,欢迎添加博主微信,
哈,博主很乐意和各路好友交流,如果满意,请打赏博主任意金额,感兴趣的在微信转账的时候,备注您的微信或者其他联系方式。添加博主微信哦。
请下方留言吧。可与博主自由讨论哦
支付包 | 微信 | 微信公众号 |
---|---|---|