之前申请了个微信公众号,完成了一些小功能后,就一直没怎么玩了,由于今年下半年开始,和女票住一起了,开销骤增,于是决定开始记录下每田的开支情况,统计我们的消费习惯。

选择一个记账工具

其实在刚开始工作那会儿,也记过一段时间的帐,当时的做法是直接在一个纸质日历上,用笔写下当天的花销。到月底,再统计各类别和总的开销。这种方式可以说是非常原始了,至少有以下几个问题:

  • 首先不美观,一本制作精良的台历,用笔在上面写写画画的,美感顿无。
  • 统计困难,月底还要一个一个用计算器算,非常麻烦。
  • 记账体验不好,虽说我也算是爱洁人士,但有时要记账时,笔又不知道跑哪去了。于是当天就没法记。

由于以上几个问题,我没记几个月就放弃了这个很美好的习惯,然后,就没有然后了。。。

现在既然记账的事又重新提上日程,所以当女票郑重的在一个纸质笔记本上记下第一笔帐时,我就觉得这样不靠谱,开始寻找其他记账方式。首先想到的是用记账app,说到这种记账方式,可以选择的范围就很多了,各家各户,xxx记,xxx帐啥的,琳琅满目,简直逼死困难选择户,虽说各大厂家都在吹嘘自家的产品如何强大如何贴心,但对于我来说,只需要一个核心功能:记账 + 统计,所以那些自带理财、新闻、信息流,各种看似全,然并卵的app,没用几分钟就卸载了。后来又看到有部分记账的微信小程序,使用了下,也还行,符合用完即走的理念,但对于这种小程序,有的不是界面太丑,就是没法满足分类统计。其实还有一个比较重要的原因,那就是不知道哪天万一开发者跑路,数据全没,那就坑爹了。后来找到一个腾讯系的记账工具,可以直接在公众号里完成记账。受此启发,我也在自己的公众号上做了一个类似的功能。

使用公众号来记账

我记账的思路很简单,比如今天吃饭,花了10块,那么我直接给公众号发送消息:吃饭10,即完成记账,公众号返回成功消息,并分类为餐饮;发送消息:地铁4,完成记账,返回消息,并分类为交通。要统计的话,直接点击公众号返回的消息,即可查看当月消费,以及各个分类的具体消费占比。

要完成这些功能,基本可以归结为以下几个问题:

  1. 用户系统,即每个人都有自己的账单,不同用户的账单是不同的
  2. 理解用户的输入,比如输入吃饭22,要能区分这条账单是属于餐饮,而不是交通;对于不能理解的分类,不能记录,并要返回提示消息
  3. 统计月份消费总额和各分类消费占比

对于第一个问题,很简单,用户给公众号发消息时,公众号后台可以获得该用户的一个 id,这个 id 是由微信生成,具有唯一性。公众号就是根据这个id,来给用户回复消息的。

第二个问题看起来比较复杂,这涉及到一个语义理解和分类的问题,用官方话说,属于自然语言处理范畴。对于记账这个简单功能,其实可以简化,再粗暴点,直接用枚举。对于我这个弱鸡,当然怎么简单怎么来,我选择先用枚举。。。

第三个问题,也简单,直接从数据库中查该用户的数据,返回,前端用绘图工具画个折线图、饼图完事。对于这个问题,在最开始,我想的是用户输入“统计”,微信返回当月消费总额的文本消息,这样虽然简单,但不直观,也不简洁,有输入成本,因此改为:当用户每记录一笔账时,返回一条图文类型的消息,当然没有图,当点击时,直接跳转到图形统计页面。正好我有个云服务器和公网域名,可以直接写页面。

有了思路,实现起来也不复杂,三下两下就做完了,这里就不上代码了,效果如下图: 记账效果 账单统计

代码放在了 github 上,有兴趣的朋友也可以关注公众号体验下 公众号

总结

首先不用说,统计界面丑我承认,但基本的功能还是满足的,后面应该会加入账单的详情列表。现在只有综合统计,看不到每天的消费记录。第二个就是分类不智能,输入吃饭、地铁、打车、房租等还能分分类,如果输入唱歌、大保健等就扑街了。毕竟只是枚举分类。。。另外就是后台的数据存储,设计初期,建了三张表,一个用户表、一个消费分类表,一个账单表。其实在用户不多、且访问量不大时,一张账单表就可以。如果记录多,用户多,分类也多,就得考虑分表了。

PS

开发过程中,遇到一个手残操作事故:在mv一个文件时,本意时想做个备份,结果按tab键,直接mv成一个已经存在的文件,于是这个文件很安静的就被覆盖了。。。覆盖那一刻,简直一万头艹泥马飞过。查了下,没有办法恢复,老老实实重写吧。然后把mv、cp等命令,果断做了个alias,这样再如果出现覆盖等情况,就会出现是否确认操作的提示了。