记一次完整手机APP项目的开发

版权声明: https://blog.csdn.net/zhujunxxxxx/article/details/77824049

写在前面

从2015年12月开始到2017年3月在一个创业团队完整参与了一个运动类的手机APP的开发,虽然最后这个项目失败了但是我学到了很多东西,现在已经过去一段时间了可能已经忘记了一部分细节的东西了但是希望通过博客的方式能把我那段时间学习到的东西记录下来,虽然还有整个项目开发过程中的一些波折,但是我还是主要想分享技术,接下来我想写的都是纯干货~

项目背景

运动页是一个体育类的手机APP,拥有IOS客户端,Andriod客户端以及微信H5界面,主要的功能有:创建运动、搜索运动、运动报名、运动浏览、关注、分享、IM聊天、评论留言、在线支付、账户充值等功能,是一个包含社交功能的运动APP,市场上类似的项目有很多,如中羽联、趣运动、球长部落、互动吧等。

项目初始

最开始该项目发起人找到我的时候我还是一名在校的研究生,刚开始给他做的是一个微信公众号的小项目,主要是实现一个简单的赛事报名功能,不过毕竟H5实现的功能不如APP的功能强大,所以在完成这个项目后没多久,老板(下文中简称BOSS)就找到我给我说了他的一个手机APP开发的想法,期间不断的交流他的想法(主要是在做需求分析),而我需要做的就是把BOSS的想法进行评估,然后做出Demo展示,最后在春节前夕定下来了,准备做这么一个APP,其实我对IOS开发是零基础的,只是在以前大学的时候做过andriod的一个项目,不会object-c,不过通过自己学习了一些IOS相关的知识后就开始搭建项目工程了。

运动页

整个项目前期开发只有我和我一个同学,他负责开发IOS客户端,我负责写业务逻辑(包括服务器后台API接口,和IOS上的业务代码),到后期整个项目增加到了5人,有专职的UI以及Android开发。

项目架构

整个项目包含IOS客户端、Andriod客户端、API接口服务器,为了加速项目的开发速度,对于一些需求,如果有比较成熟的方案的话我们都会使用,比如项目中的IM功能,使用了融云IM来实现,当前还有其他的一些特性的开发也使用了第三方的组件,主要有微信SDK、ping++、百度地图等。接下来主要介绍的是API接口服务器端中使用的技术:

  • MySQL 数据库
  • ActiveMQ 消息队列
  • apidoc API接口文档生成
  • ThinkPHP PHP框架
  • xCache 缓存
  • Nginx Web服务器
  • workerman-statistics 分布式统计监控系统

ActiveMQ

Apache ActiveMQ是一个开源的消息队列,主要用于业务之间的解耦,例如用户注册后,向队列中发送一个任务,后台服务器进一步处理:申请融云用户Token值,下载用户授权的微信账号头像文件等,队列中的消息会被一个后台进行处理,每次处理的时候就直接从队列中获取一个任务按照如下流程进行处理
事件处理流程:

Created with Raphaël 2.1.0 开始 process 是否为真? 结束 error yes no

Tip:当process返回true的时候,将会把该事件消息从消息队列中移除

消息队列是一种很常用的解耦方式,能在系统中打通各个模块。

一些问题的解决

API接口安全

在开发整个项目过程中考虑到接口安全,需要对数据进行加密,一种方式是直接使用HTTPS来进行加密,这种方式是比较安全的,但是考虑到性能而且在整个过程中只需要对其中一些隐私数据进行加密传输,于是就采用了参数签名的方式来保证数据被篡改:

function getSign($param, $code, $sign_type = 'MD5'){
        //去除数组中的空值和签名参数(sign/sign_type)
        $param = self::paramFilter($param);
        //按键名升序排列数组
        $param = self::paramSort($param);
        //把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
        $param_str = self::createLinkstring($param);
        //把拼接后的字符串再与安全校验码直接连接起来
        $param_str = $param_str . $code;
        //创建签名字符串
        return self::createSign($param_str, $sign_type);
    }

function createSign($param, $type = 'MD5'){
        $type = strtolower($type);
        if($type == 'md5'){
            return md5($param);
        }
        if ($type == 'sha1') {
            return sha1($param);
        }
        if($type == 'dsa'){
            exit('DSA 签名方法待后续开发,请先使用MD5签名方式');
        }
        exit("接口暂不支持" . $type . "类型的签名方式");
    }

将计算出来的sign作为一个参数发送往服务器,服务在收到请求后按照相同的规则将参数按照相同的参数进行计算得到sign_b,和参数中的sign进行比较,如果不一致则认为参数被篡改,丢弃该请求。

其他思考

虽然项目在开发中没有遇到大量用户的访问一些问题可能没有暴露出来,如高并发的访问如何保证服务的稳定可靠,但是在实际开发中都考虑了这些场景,如对经常从数据库中查询的记录都缓存在内存中,由于时间有限我这里就不展开讲了。

关于开源

由于现在工作原因,现在已经没有时间继续移动端的开发了,所以准备在之后一段时间内把代码整理好进行开源,毕竟项目没有成功,存在或多或少的问题,有技术上的,有项目规划上的。
https://github.com/zhujunxxxxx/SportsPage

项目截图




Figure 1. 运动列表




Figure 2. 运行页详情




Figure 3. 账户




Figure 4. 登录




Figure 5. 个人

猜你喜欢

转载自blog.csdn.net/zhujunxxxxx/article/details/77824049