2018-9-12 微信公众号菜单管理

ps:我还完全是一只非常小非常小的菜鸟,对于程序员还完全没有入门,定位是php全栈工程师

这是我来公司的第一个小任务(这也是我的第一份工作),写微信公众号的菜单管理,要求实现菜单的添加,删除,修改功能,以及页面

我是非常讨厌写页面的,因为我主要学习的还是后端,而且个人更偏向于去处理一些逻辑上的问题,而不是去调试页面,虽然我的逻辑感并不是很好,但这可以锻炼呀,好了废话不多说了,聊聊我这几天写代码的心得把

我只学习过一些很基本的微信公众号的程序,当然不包括菜单功能,所以这是我第一次写,

创建接口

最多创建三个一级菜单,每个一级菜单最多创建五个二级菜单,开发文档上说是一级菜单最多显示四个汉字剩下的用...表示,但其实最多可以显示七个汉字,自定义菜单接口可以实现多种类型按钮,为了上手容易,我决定暂时只写一个type类型

type类型的接口要求url参数必须为正确格式的url地址,创建接口有指定的发送请求的格式,post传值并且传输的数据为json格式,在传输数据的时候我没有用json_encode()函数去将数组转换成json,照理说这样子应该才是正确的处理方式而且也更直观一点,但我并没有这样做而是用字符串将数据拼接起来的,原因是我一开始没注意这是json格式的,后来才发现,再发送post请求创建菜单的过程中,我发现最后一个菜单在创建的时候总是丢失,原因是我在连接字符串的时候,没有将最后一个数据的逗号去掉,没想到微信传送数据的格式这么严格,一般来说最后一个数据的逗号不是可加可不加的嘛就像数组,没想到是在这里出了错总之搞了大半天,创建菜单总算是没问题了,只要数据格式没问题,数据类型没问题,应该是不会有太大问题的

清空接口

一开始在获取接口的时候我用的是get_current_selfmenu_info请求,因为我在创建菜单的时候,是一个一个菜单创建的,而微信的创建菜单无法实现保留原来的菜单的基础上添加菜单,所以每次添加菜单的时候,都要先获取原来的菜单,再将旧菜单与新菜单通过字符串拼接的方式组成一个新的菜单,而get_current_selfmenu_info请求可以获取菜单的开发配置,感觉比get请求获取牛逼一点,其实也没有深究这两者的区别,当时只想以最快的速度完成老板交给我的任务,并没有真正的去了解接口。为什么后来我没有再用这个请求获取菜单了呢,因为我发现我用delete请求清空菜单后(竟然没有请求可以将单个菜单删除,太鸡肋了),菜单清空掉了,但是我用get_current_selfmenu_info获取菜单的时候仍然能获取到清空菜单之前的数据,不清楚是什么原因,总之后来就没有再用过这个请求了(求知欲低下)

生成菜单

后来老板让我写页面,于是我就写了个页面,将添加菜单和清空菜单功能给老板看时,老板要求添加菜单的时候只将添加的菜单显示再表格里,而不是真正的添加到微信公众号里,写一个“生成微信自定义菜单”接口,点击这个按钮的时候才把接口请求上传上去,嗯这么说很有道理,的确应该这么做,于是就开始写js,先将数据传给后台,判断是一级菜单还是二级菜单,再做重名名字长度和菜单个数的判断,如果符合,则拼接成html代码通过ajax返回给前台,前台将html代码添加表格最后,这个不是太难写,接着是生成微信自定义接口,需要把tbody中的所有数据组成数组通过ajax传给后台,但我不怎么熟悉js,所以光是把数据全都获取到并组成数组就研究了半天,然后就是将数组中的数据全部生成菜单,由于生成一级菜单和生成父菜单是原来没有二级菜单的一级菜单的二级菜单和生成父菜单是原来有二级菜单的一级菜单的二级菜单所需的格式是不同的,所以在拼接数据创建菜单的时候需要做很多判断,对我来说有点复杂,总算可以成功创建菜单了,其中出现一个问题,就是每次生成菜单的时候前一次生成的菜单不会消失,是因为在生成菜单之前没有把原来菜单清空。

接着就是解决老板一开始提的需求了,主要还是要我解决菜单的上移下移功能,前面写这个代码的人在移动菜单的时候总是没有办法将菜单移动到自己想要的位置导致谁徐错乱,所以主要还是解决这个问题

我是这么想的,由于我写的生成菜单的代码会将菜单按tr的顺序逐个创建菜单,所以对表格 的tr进行操作,最后生成自定义菜单即可,那就是js的事情了,我的天我真的很讨厌写js,总之这个真的写了很长时间,要判断需要移动的是一级菜单还是二级菜单,如果是一级菜单那移动的时候要将该菜单的二级菜单也跟着一起移动,还要判断该菜单在什么位置,通过重新拼接html代码的方式实现调换位置的效果,二级菜单的移动相对比较好写一点,一级菜单的移动真是写的我头都要大了,总之效果还是写出来了。然后是移除菜单功能,这个好写,将tr remove掉就行,其中判断一下该菜单是否是一级菜单如果是一级菜单则判断该一级菜单下是否存在二级菜单,如果存在则不删除,这个也是通过后台判断的,其实通过前台的tr判断比较好。然后就是修改菜单功能,这个不是太难写,难写的是编辑菜单的时候要把编,一级菜单无法更改父菜单,因为其下可能存在二级菜单所以我直接不允许一级菜单修改其父菜单,二级菜单可以选择父菜单但不允许修改成为一级菜单,如果修改的是一级菜单则不移动tr,直接将tr的内容替换就好,如果是二级菜单则先把原本的tr移除再将新的tr添加进去,编辑的时候还要判断菜单个数重名等一些要求,写完这个我发现新增菜单的功能好像也需要修改,如果按照原来的写法,无法上移下移也无法编辑,这个真的写了挺长时间的,因为新增菜单的时候我无法给它一个id,只有再生成菜单的时候才分配id,没有id的话就无法对tr进行定位,就无法移动和编辑,好吧移动还是可以的,但是无法编辑,因为编辑需要重新定位tr,总之这个问题没有解决,所以再新增菜单的时候直接不给它编辑菜单的功能,只有生成的菜单才有编辑功能,这样子好像操作的逻辑上有点问题,但是我写的功能本来逻辑上就存在着一些漏洞,所以多一两个也无所谓了(态度不端正,不严谨)。

总之这就是我写的第一个功能了,历时一个多礼拜,包括把自己的代码融合到原来的系统中去,还是存在一些问题的,但是对于一个新手来说,真的是有点头秃了,而且我之前也没怎么接触过微信公众号,所以给我这个菜鸟一点掌声把谢谢

存在bug

1.由于在对新增菜单进行判断的时候只是将已经生成了的菜单作为数据源进行判断,所以如果新增多个重名的菜单或超过个数的菜单或长度不符合的菜单时无法判断,索性我在创建每个菜单的时候都判断是否创建成功,如果不成功则报错不继续创建,虽然没有从根本上解决问题,但不会导致致命bug,后续可以继续修改

2.新增菜单没有id,无法编辑,这个后续给它添个id把,二级菜单无法成为一级菜单,这个有点复杂,但是一般也不会有人想把二级菜单修改为一级菜单的把,所以问题不大

猜你喜欢

转载自www.cnblogs.com/zaotu/p/9639372.html