作任何开发前咱们都要作一个产品的规划,公司通信录虽然看起来很简单,可是这个步骤依然少不了。php
通信录的功能:
1. 后台通信录管理,包括分级、录入、修改、删除;
2. 后台日志查询,包括后台操做记录和前台修改记录;
3. 公司员工微信帐号与通信录绑定;
4. 已绑定帐号可查询;
5. 部门、关键词等查询;
6. 前台已绑定帐号可更新本身信息。前端
前台逻辑图:数据库
数据库的设计segmentfault
员工表:序号、姓名、工号、照片、性别、生日、手机、电话、部门、邮箱、微信号、员工状态数组
部门表:序号、部门名、上级部门序号、部门状态浏览器
日志表:序号、操做内容、操做时间、操做人、操做类别缓存
管理员表:序号、用户名、密码bash
我设计的公司通信录是先人工输入到后台,而后前台进行绑定、查询、更新等操做微信
在开发前咱们先要上传一个文件“base-class.php”,这个文件主要是用来作传递参数的过滤以及格式验证,好比是否邮箱、手机等是否正确输入架构
第一个要开发的模块是部门设置,通常的公司架构都是多层级的,好比总经理-》部门-》小组,所以咱们的部门设置里也要具有多层级的功能。
首先第一个页面部门录入页面,咱们新建一个文件,命名为class_add.php,主要实现功能为添加和修改部门名称及上下级分类。代码以下:
后台页面是须要在浏览器里打开操做的,所以须要有HTML代码部分,通常正规开发都会将数据操做、逻辑操做、网页模板分离,我这里图方便就混排了。
这个页面实现的是两个功能:一是新增部门,二是修改部门,两个是放在同一个页面里的,那么如何判断是新增操做仍是修改操做呢?根据url里是否有传递过来部门的序号即ID号,若是有就是修改,没有就是新增,具体后面会有解释。
命名为class_manager.php,代码以下:
昨天有很多朋友在问如何测试不知道如何绑定帐号,具体步骤是先在后台添加一个员工,而后在微信公众帐号里根据提示将添加的员工信息输入完成绑定,如图添加一个员工:
微信帐号绑定
微信用户的帐号如何与本身网站的用户系统打通,这个是不少人关心的问题,其实很简单,咱们都知道微信用户在关注公众号或者发送消息时都会有一个惟一的OPENID传过来,这个OPENID就是这个用户对应这个公众帐号的惟一身份标示,咱们只要将这个OPENID与本身网站的用户系统一一绑定就能够了。
方法有两种,一是将OPENID做为登录页面或者注册页面的URL参数,当用户点击这个URL时跳转到WAP页面(即本身网站)上进行绑定,另外就是在对话框里进行绑定,我今天介绍的就是在对话框里进行绑定。
首先是检测用户是否绑定了微信号,这里我写了个函数,以下图:
第593行是定义函数的名字为check_user,函数传入的变量为$fromUsername,即微信用户的OPENID。
第598行是经过传入的OPENID为条件,检测在员工数据表中是否存在某条记录的roster_openid等于该OPENID。
第600到609行是返回函数运行的记过,若是有记录的话返回该条数据,若是没有就返回失败。
在用户关注公众帐号时我就判断是否有绑定过帐号,而且根据绑定状况回复不一样的欢迎词,以下图:
当检测到用户关注的事件,调用check_user这个函数,若是返回不是失败则提示使用帮助,不然提示绑定帐号,效果如图:
当用户输入BD字符时进入帐号绑定模式,以下图:
先判断用户是否已经绑定过,绑定过给提醒中断执行。不然进入绑定流程,因为绑定操做须要分多个步骤验证多个条件,而后一并查询数据库,所以咱们要保存每一步的动做和数据,这里使用memcache来保存每一个用户的上一步操做。这里先保存了BD_0标示这是绑定的第一个步骤,提示用户信息为“请输入你的姓名”。
memcache服务的开启请查看《微信公众平台入门到精通》Vol.13,在程序里使用方法为在代码最开头启动memcache,以下图:
保存memcache的方法为:
$mc->set(缓存变量名, 保存的数据, 0, 缓存时间单位秒);
读取memcache的方法为:
$mc->get(缓存变量名);
我在程序的开头加了获取memcache值的代码,每次用户请求时都会从memcache中获取用户上一步的操做和数据。其中$fromUsername."_do"
为用户操做,$fromUsername."_data"
为用户数据,用 $fromUsername
能够保证每一个用户都有独立的缓存变量名。
接下来等用户输入姓名后,接口会收到新的请求,这个时候因为memcache保存过上步标示,所以这里会根据操做缓存的数据判断进入到第二步,$last_do的值是从程序开始就获取memcache值后获取的,以下图:
这里多了一个保存数据的缓存设置,保存了用户提交的姓名数据,同时将操做缓存的值改成了BD_1,而后继续提示用户输入工号。
当用户输入工号后,会进入第三步,以下图:
继续保存数据,将上一步的数据(姓名)与本次数据(工号)合并用“||”分割,同时将操做缓存的值改成了BD_2,而后继续提示用户输入手机号。
当用户输入手机号后,就进入最后一步验证,以下图:
进入最后一步后先清空操做和数据缓存,而后将以前保存的数据$last_do加上本次用户输入内容合并转换成数组,并用list函数分别赋值给$roster_name,$roster_number,$roster_mp。
再进行数据库查询知足用户姓名、工号和手机与输入数据彻底相同而且roster_openid(员工openid)为空的记录,若是有符合条件的记录则更新该记录,将$fromUsername(当前操做用户的openid)保存到roster_openid里,完成绑定。
这个时候咱们输入“help”就会能够进行后续操做了。
PS:“输入exit退出操做”这个也很简单,当用户输入exit的时候程序会清空操做和数据缓存,也就是说全部以前的操做和数据都没有了,即全部操做从新开始,以下图:
这个流程使用了memcache来保存一些临时变量和多步骤操做,除了用来绑定用户帐户外,也适合一些调查问卷或者注册登录操做。
搜索其实就是编辑模式下的关键字自动回复,我这里拿姓名搜索举例,首先咱们要先切换当前模式到姓名搜索,以下图:
这部分代码与帐号绑定的第一步是同样的,咱们用memcache存放当前的操做,这个时候存放操做动做的缓存变量里就标示了当前是在姓名搜索状态下。同时输出提示,请输入员工姓名。
其实这步能够理解为进入网站的二级导航页面,一个网站有首页和各类导航栏目,那么在这个通信录里帮助就是首页,你输入HELP就到了首页,输入XM就到员工查询这个二级栏目,以后除非你输入BM、GH等一些栏目名,其余的操做都默认是在员工栏目下进行。
而后根据提示输入员工名字进行查询,以下图:
从数据库中查找与用户输入一致的记录,若是没有则返回提醒:
若是查询到则返回一个图文消息,这里没有去考虑员工重名的状况,因此查询和返回结果都是只取一条记录的。
前端展示缘由我只取工号、姓名、当前状态、照片等字段返回,查看详情点击阅读原文进入到detail页,把该员工的ID号(不是工号)做为URL参数传递过去,而后再作一次数据库查询将全部字段提取出来展示。
不少人很是好奇ZTalk的公众帐号是如何实现文章查询翻页的,其实原理也很简单,只是把网页上的翻页代码稍微改装一下,而后使用memcache保存每一个用户当前的页码和搜索的关键字就能够了。
在通信录里是用部门查询来示例的,首先依然是进入部门查询这个栏目,以下图:
上面的代码除了保存当前操做状态为部门查询之外,又用另一个memcache的变量保存当前搜索关键字和页码“null || 1”,其中null为当前搜索关键字(由于一开始用户没有输入因此是空的),1表示起始页是第一页,而后输出提示,请输入部门名称。
当用户输入部门名称后,先查询这个部门的ID号,由于在员工表里没有直接存放部门名称而是存放的与部门对应的ID号,以下图:
在这里咱们获取搜索关键字会有两个来源,一个是用户输入的,一个是在翻页时在缓存中保存的,因此先得尝试从缓存里获取用户以前保存的搜索关键字,若是值为null则表示这是第一次搜索,关键字为用户输入的$from_content,不然就使用缓存中保存的关键字,这就是为何可以翻页的关键,咱们利用缓存机制存放了用户以前输入的搜索关键字。
有了搜索关键字而后查询部门表获取部门ID号,获取到后再去查询员工表里该ID下的员工总数,若是总数为0则表示该部门尚未员工直接提示。不然进入到翻页计算和结果返回,以下图:
第一个是设置每页显示的条数,我这里是设置成3条,加上封面消息和尾部翻页提示消息最后显示会是5条。
当前页码是从缓存中获取,$last_data在前面已经使用explode函数以||为分割字符变成数组,$last_data[0]为搜索关键字,$last_data1为页码,根据当前页码计算数据库查询开始的记录指针位置。
查询出结果后进行数据转化,这里作了一个数组方便后面循环输入多图文消息,每一个图文消息其实就4个元素:标题、描述、图片、连接,先直接用搜索关键字+当前页等作一个封面消息,而后循环将数据库查询结果也转化成图文消息的元素。
而后是判断是否有下一页,以下图:
用符合搜索条件的记录总数去除以每页显示数量,ceil是一个向上舍入为最接近的整数的函数,就是ceil(5/4)=2,而不是1.25,这样就知道总页数了,而后判断当前页是否最后一页,若是不是最后一页则将当前页加1而后存放到memcache里,在下次翻页查询时保存数据的这个memcache变量里其实已经变成“搜索关键字||2”。
最后就是输出多图文消息了,以下图:
在微信里显示的效果以下:
可能还有不少人很迷茫,如何输入任何字符查看下一页的呢?我画个流程图可能会比较清楚,看下图:
你们能够看到其实从第二页开始用户输入的字符只是触发程序运行,而不能干涉程序运行的结果,除非输入EXIT,或者HELP这些一级栏目关键字。