V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
novato
V2EX  ›  分享创造

用一个安卓 app 实验全栈开发

  •  
  •   novato · 2019-09-02 20:46:11 +08:00 · 3390 次点击
    这是一个创建于 1945 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一般所谓“全栈开发”就是前后台一起搞,既然 Android 也是 Linux 内核,那么不是也可以当服务器用吗?但是用常规的后台开发语言 PHP、java、nodejs 之类的都不太合适,把 php-fpm 交叉编译成 arm 版的这个有人做过,nodejs 也有安卓版的,但都是提供一个环境让别人去写后台代码,光这个环境就几十兆了,很笨重还不好用。java 倒是有点靠谱,又是 Android 原生语言。只是不太喜欢 java,感觉表达起来太啰嗦。
    所以我选择用 C++ 做后台,sqlite 做数据库(自己编译的原生版,不是安卓自带的那个),前端用 vuejs 做 spa,通过 ajax + websocket 与本地的 C++后台交互。
    我想写一个商城‘网站’,用户在手机上添加商品,包括价格、文字描述、图片 /视频展示,同一内网中的其它客户端,包括安卓、iphone、PC 端,用浏览器打开这个“运行在安卓”上的商城就可以自助购物,如果直接用微信扫码打开的,就直接用公众号方式支付,如果是在 PC 端打开的,就显示一个二维码,让客户扫码支付。那么这台手机上售出的所有订单和商品信息都存在本地的 sqlite 数据库中,并且可让它支持退款。
    客户付的款到哪里去了?那就要让安卓手机的机主可以直接在 app 上开通自己的微信商户并绑定自己的银行卡,那别人在你手机上买东西的钱就由微信转到你银行卡中了。
    那么就需要解决几个问题:

    1. 对接微信官方小微商户接口(这个可以绑个人银行卡的,不需要公司对公账户)
    2. 上传商品的图片、视频到 http 站点目录,实际上是保存文件到安卓内部存储中,sqlite 存储媒体文件的 url 并与该商品关联。上传的视频文件大小没限制(只要手机容量够大)
    3. 在其它客户端用浏览器播放视频流,现在支持 html5 的浏览器都支持<audio><video>标签,所以没问题。在 http 服务器中加入 range 分段处理即可。就是让客户可以拖动进度条播放那种。
    4. 顺便也加上扫码收款,扫客户的付款码,也可出示收款码让客户扫,直接选商品生成,不用输入金额。而且开通了小微商户别人可用信用卡支付。
      这样线上、线下支付都有了。所谓线上也只是内网的线上,别人没法通过公网访问你的安卓 http 网站(除非在路由器中加 ip 映射)。

    然后这样拍脑袋搞出来的东西是这样的(请不要吐槽界面,我美工比较弱):

    线下收款 商品管理 交易记录 商户信息 商户注册 内网商城 系统消息

    App 下载( 4.2M )

    第 1 条附言  ·  2019-09-03 11:57:00 +08:00

    用wrk压一下看看,在我的一加5t上的结果如下:

    get请求:

    wrk -t10 -c100 -d30s  http://192.168.1.96:12345/
    Running 30s test @ http://192.168.1.96:12345/
    10 threads and 100 connections
    Thread Stats   Avg      Stdev     Max   +/- Stdev
        Latency    24.50ms   54.23ms 664.45ms   97.81%
        Req/Sec   578.20     66.91   787.00     87.00%
    169020 requests in 30.03s, 171.67MB read
    Requests/sec:   5627.78
    Transfer/sec:      5.72MB
    

    post json请求订单查询:

    wrk -t10 -c100 -d30s -s ./post.lua http://192.168.1.96:12345/get_cli_orders
    Running 30s test @ http://192.168.1.96:12345/get_cli_orders
    10 threads and 100 connections
    Thread Stats   Avg      Stdev     Max   +/- Stdev
        Latency    17.13ms    8.25ms 342.00ms   97.62%
        Req/Sec   599.25     45.59     1.06k    87.99%
    178558 requests in 30.03s, 22.14MB read
    Requests/sec:   5945.60
    Transfer/sec:    754.81KB
    

    因为这是用boost asio单线程异步处理的,理论上应该与nodejs单进程的http服务性能差不多。不过对内网商城来说已经够用了。

    4 条回复    2019-09-05 15:04:00 +08:00
    BigDogWang
        1
    BigDogWang  
       2019-09-02 22:34:08 +08:00
    说实话,佩服。像我现在已经没有动力写这种 Demo 了,感觉有点浮躁了
    jerry12547
        2
    jerry12547  
       2019-09-03 15:38:22 +08:00
    有点猛
    hurrytospring
        3
    hurrytospring  
       2019-09-05 10:25:48 +08:00
    没看懂有啥意义,你的服务器运行在安卓上操作的是哪里的数据呢,本地 sqllite ?在端上就可以直接操作啊,为啥再在本地起服务,然后用服务操作。。
    novato
        4
    novato  
    OP
       2019-09-05 15:04:00 +08:00
    @hurrytospring 在端上是可以直接操作,但是不起服务的话,其它浏览器客户端就访问不了。而且 app 的界面是 vuejs 做的,sqlite 读写是用 C++操作的,在界面上点一个按钮就要通过 javascript->java->c++->写入 sqlite ( C 原生编译的),也可以直接 post json 到 C++的 restful 服务操作。实际上两种方式都有用。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2351 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 15:51 · PVG 23:51 · LAX 07:51 · JFK 10:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.