Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save winglight/9613322 to your computer and use it in GitHub Desktop.
Save winglight/9613322 to your computer and use it in GitHub Desktop.
三周开发完成后台和Android端APP
三周开发完成后台和Android端APP
------
1. 项目概述
项目本身是一个旅游类的优惠折扣服务,而且限制了是一个省份内的景点门票,暂时还不支持在线支付,最大的优势是省旅游局的支持,号称可以比携程价还低。之前已经有另一家公司完成了一个后台+Android App,但是做得太烂了也不懂运营,最终交到我们公司来重新开发。然而,后台的订单和景点出售门票的过程以及抵用现金券相关的兑换业务仍然继续使用旧平台,同时公司领导还要求所有业务必须通过我们自己的系统,并保留相应的用户数据。
一开始还认为不需要在后台上做多少,只需要转发所有客户端的请求到旧系统中即可,但是随着项目展开才发现,如果这样做了,根本不可能达到保留用户数据的目标,因此必须实现所有后台功能和手机端接口,并且集成旧系统的业务。
2. 业务模型和流程
![enter image description here][1]
数据模型如上图,相对于旧系统的主要实体,主要是加多了一层展示信息和活动信息,这样可以隔离开运营的数据和实际的景点、酒店信息(据说以后会有酒店信息)。
![enter image description here][2]
主要的核心流程就是订单流程,这里本来打算分离外部系统的调用为异步,但是时间上太紧,来不及做这个异步调用的整体设计和开发,好在代价就是最终用户体验上有一点点的等待(大约500毫秒以内),还是可以接受的。
3. 技术框架选择
![enter image description here][3]
项目时间要求三周后就上线(后来客户主动说可以晚一周),包括后台和Android前端,开发人员只有我一个,那就没什么选择了,Play框架+Angularjs是最适合的了,估计比Spring之类的J2EE框架节约了一多半的时间和人手。
4. 后台开发(两周)
因为合同一周没有签,一开始就不能投入太多,领导交代先做和旧系统接口集成的活儿,真的等到合同签下来再开发肯定来不及了,所以我就直接开始做后台部分,然后才发现,什么具体需求都没有,只能靠自己凭空去想,好在前不久刚做了一个手机端展示CMS,直接套用了一部分代码,放上几个菜单,先实现了展示信息的增删改查功能,然后开始做旧系统数据导入功能。
Play集成的Akka可以调度启动异步任务,再加上HTTPclient,ebeans直接读取JSON并保存到本地。
后台最终完成的时候,总共六个模块:“展示信息”、“景点信息”、“活动信息”、“抵用券管理”、“会员管理”、“订单管理”,基本的增删改查功能包括上传图片都很简单,使用angularjs配合Play后台的接口很容易就实现了,但是展示信息为了给运营提供方便,提供了标签(Tag)功能,这个要支持一对多的关系,如何在界面中实现,确实挺棘手,关键是时间太紧,没时间再增加新的界面或弹窗来处理,最后,还是采用了下拉框+增删查按钮的形式解决了这个问题。
另外一个困难的问题是,使用ebeans的时候,发现如果基于Tag查询展示信息的时候,如果使用了OR关键字,那么本来是外链接的Left outer join变成了Left join,结果怎么改都查不出来没有Tag的展示信息,后来才发现网上已经有很多人报告这个问题,但是至今也没解决,最后只好用raw sql实现。
其实整个后台开发最耗时间的就是和旧系统的集成,不知道是什么原因,对方提供的很多接口不是设计上有问题(比如登录、下订单这种接口使用GET),就是本身有bug,让人怀疑他们自己有没有测试使用过这些功能,算下来,接口集成的工作占了后台开发将近一半的时间。
5. 前端Android开发(一周)
后台几乎开发完成的时候,合同终于签下来了,领导说,可以开始做Android端了,我问之前答应增加的一个人手什么时候进来,结果说下周一(这时候是周四上午),等到了下周一的时候,又说,今天可能不行,周二才可以,还好到了11点左右的时候,这个同事主动告诉我可以开工了。
根据手机端的原型图,大约有20个左右的界面,最终做下来有18个Fragment,在我完成所有手机端本地存储和远程访问功能后,基本上一天完成了3个左右的界面,同时还包括和旧系统的集成测试,现在看来还是要归功于新加入的同事比较给力,除了下订单的界面逻辑做的有些乱,其他的展示界面的开发速度还是很快的。
Android端的UI主要使用了一个Activity作为主框架以及导航功能,其他的界面显示都是Fragment,本地存储使用了ormlite,远程访问和远程图片都使用了volley。整个手机端做下来基本上都是体力活,碰到了两个稍微有点麻烦的问题:一个是要求列表和上方的一堆按钮和图片能够一起滚动,网上有些解决方案是重写scrollview,我嫌麻烦,直接把那些控件加到listview的header里面解决;另一个是有些界面的返回希望跳过某个界面,比如订单成功界面可以进入订单详情,但是进了详情之后,点击后退不能进入成功界面,我在activity中统一提供了清除stack的方法解决。
在这个手机端中,最大的收获是,终于完成了大部分的界面和服务的封装,对于另外一个同事来说,只需要照着原型界面做出layout,在代码中只需要调用service中对应的方法就可以获取数据并且填充到界面上就算开发完成一个界面,这在某种程度上,实现了MVC。
> Written with [StackEdit](https://stackedit.io/).
[1]: http://d.pcs.baidu.com/thumbnail/abb7a44641852899bb533b24b0eef183?fid=959748154-250528-508290707268694&time=1395110151&rt=sh&sign=FDTAER-DCb740ccc5511e5e8fedcff06b081203-Q3amGJ7g/6PBJgM4JPqGk6KbhyY=&expires=1h&prisign=unkown&r=650825005&size=c850_u580&quality=100
[2]: http://d.pcs.baidu.com/thumbnail/44c3ca0b2461ce98bbb331484cf4c21f?fid=959748154-250528-641350976615258&time=1395110462&rt=sh&sign=FDTAER-DCb740ccc5511e5e8fedcff06b081203-/sTVfVh88NDpSUW%2bB/ZKvAME5pI=&expires=1h&prisign=unkown&r=560541828&size=c850_u580&quality=100
[3]: http://d.pcs.baidu.com/thumbnail/036c2cfbf57ef9bfa7b9ec9bbc3cb6a8?fid=959748154-250528-716043770584395&time=1395111053&rt=sh&sign=FDTAER-DCb740ccc5511e5e8fedcff06b081203-0uGjFtYJJUofxAmD/faQNd9N8iY=&expires=1h&prisign=unkown&r=378844211&size=c850_u580&quality=100
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment