业务模式的重要性

都2021年了,最近几年似乎都没怎么写博客了,即使是写博客,也几乎都是记录一些工作上的事情。我从来都没有在博客中提到,我已经结婚了,并且已经有了个可爱的狗子
最近一段时间有一些想法,当然想法主要是在反省自己,记录下来吧。

前阵子在见了一个客户,就叫他雷总吧,30 几岁已经开劳斯莱斯库里南,跟他大概聊了一个多小时,发现能赚这么多钱,真的是有原因的。
早的时候在曹大公众号看到过一篇文章,大概意思就是,所有生意都是流量的转化,在雷总这里真是体现的淋漓尽致。他每个月花10W请一个团队帮他在网上做 SEO,获取流量。流量到加客户微信,了解到需要的产品,给客户报价。可以说就是微商的模式,只不过卖的产品是二手奢侈品,每个产品磨损、成色、年份不一样,所以价格没法统一。他的毛利能做到 10%,算是我了解的同行里面毛利率最高的一个。

业务模式

在这里面,我认为雷总业务模式做得非常好。其他同行业务模式,大多数都是咸鱼找客户、开店等客户上门、网上卖。加到好友以后,客户需要什么,自己去同行里面找,这样一个人需要解决流量、客服、销售、售后、发货等问题。
雷总不是这样,他是请团队解决流量问题,然后又专门客服销售团队,一旦客户需要买一件货,他们是知道这件货同行之间大概什么价格能拿,立即就能给报价。如果客户需要卖一件货,他们要求公司每一个人都要对这件货进行报价(划重点,要考的)。成交以后再有专门的人负责出库发货等环节,并且他们出货是直接批量打包出给大平台、更大的商家,不是像其他人一样一件一件出货。
为什么雷总这样的模式非常好,因为几乎杜绝了一个人完成整个业务链,不会培养出一个孙猴子、一个吕布这样单兵作战能力特别强的人,需要大家协同合作才能完成交易。这样就员工就不会轻易离开自己单干。如果一个人的销售额能达到 20% 以上,一旦这个员工离职,那么意味着公司销售额也要骤减 20%。但是雷总不存在这个问题,任何一个环节的人离开,都不会对整个业务链产生骤减的影响,可以很容易补上这个岗位。业务流程化,每个人都只是这个流程下一个环节而已,这样还有另一个好处,每个人犯错的空间有限,我只负责自己的事情,一定会对眼下的事情越来越熟悉,在我熟悉的领域,犯错的几乎一定是越来越小。通过制定规则,规范化各个流程来规避人为犯错的风险,减小犯错的空间

唯一有难度的,是对行情的把控,比如19年全套绿水鬼现在什么价格?这类行情信息时在员工脑海中,需要不断交易,才能强化记忆知道现在行情,都是经验。那么怎样让人快速学习?前面说的,每个人都需要对回收的产品进行报价,这就是雷总的方式。这样的业务模式才能长久下去,雷总作为老板,他居然是一个不懂行情,不懂鉴定的人,完全靠管理能力,他在这中间做的就是三件事情,1. 解决流量问题。 2. 搭建团队。 3. 找到出货渠道。这里面他都是直接批量整,SEO 获取大量的流量,出货不像其他同行一件一件卖,直接批量打包给大商家。批量打包是有好处的,首先价格稳定,不存在对方资金不够收不起货。其次几乎不会存在售后,因为大商家也需要跟你长期合作,在一些小细节上不会太过计较。

更重要的是,这个模式可复制,这个才是最可怕的。雷总做了一家子公司,做另一个品类的业务,模式还是同一套,只不过换了一个方式获取流量,跟原先百度 SEO 获取流量的方式岔开,不冲突,从零开始搭建的团队,第一个月就实现盈利。

在跟其他客户聊天的过程中,也了解到雷总刚起步的时候一些事情。早期时候雷总是在找人合作解决行情问题,但是发现几个合作方相应都不够及时,所以终止合作,最终肯定是找到了其他解决办法。包括雷总自己也说,他们试过了抖音等很多其他渠道投广告获取流量,后来发现效果都不是最好的。我相信在解决这些流量、行情、出货渠道等问题的过程中,一定尝试了很多办法,最终打磨出来现在这一套方式。

回头我们看这里面,构建一个坚实稳定的业务模式,在每一个环节粗略的解决,必须解决,然后再去不断优化环节,找到性价比最低的解决方式,最后是复制。

复制

因为我最近发现一个思考问题的角度可以从复制开始,所以我要把复制单独拎出来说。因为想着规模化,才有扩大收益的可能性。雷总之前想布局淘宝作为一个销售渠道的,二手产品太多了,随随便便几千个 SKU,都需要上传到淘宝店,一个人一天只能传 30 件,于是雷总找了不少兼职来上传。一下子就把长尾流量打开了。那我们手头的工作也是一样,有哪些事情是可以复制的?哪些事情是不可复制的。越是不可复制的事情,越是有价值。

反过来看,为什么我没有赚到钱?一直以来做的事情都不具有赚钱的可能性。什么具有可能性?首先是可复制,怎样才能长久赚钱,我认为是一个坚实稳定的业务模式。
比如做外贸独立站是可复制并且天花板很高。做淘宝京东店也是一样。这类生意,是否可以大量进货且大量出货?二手奢侈品是不可能大量进货大量出货的。抽纸、大米、矿泉水是可以大量进货(生产)大量出货的。所以这类生意赚大钱的可能性更大。

在努力的人就不丢人

罗老师昨天直播了,三个小时,抖音官方说卖了1.1个亿。人生中第一次守着看网红直播一血就奉献给了罗老师。网上有很多人在吹罗老师堕落了,我觉得并不是,不管罗老师欠了多少钱,只要他现在是在努力奋斗,在做实事,就是好的。更何况罗老师欠钱也不是花天酒地啊,都是用在锤子上。

罗老师能卖这么多,归根结底还是他这些年来沉淀下来的力量积攒在这一天爆发,他下一次直播一定不会是这样的数据。我们一个普通人去直播,也一定没有他的千万分之一的数据,原因就是没有影响力嘛。微博上看到很多人说也要去直播啥啥的。都是只见贼偷金,不见贼挨打。每一项成绩背后都有无数的努力啊。罗老师作为第一代网红,积攒的粉丝几百万,知道他的人几千万

欠钱丢不丢人得看是怎么欠的。别人给借钱给你,投资也好,借贷也好,可以说都是信任,最少是信任你的还款能力,可如果把这份信任用来花天酒地,做一些见不得光的勾当,不管最后换没换去,在我看来都不光彩。

前天我现在在的这家公司,所谓的董事长给我们开会,说建行有一笔1-10亿的授信可以给到我们的客户,但是需要我们提供客户的资金流水。董事长开心的说这个事情一旦谈成,客户一定就会来刷单,刷单我们抽点的基数就大了。听完我就觉得很反感,我挺不喜欢这种行为的。这点我觉得我跟我老婆的观点是挺像的,我们都非常不喜欢哪些作恶的人。「恶」不仅仅是说杀人放火,实际上有很多恶就在身边发生,可我们却习以为常。比如抖音上那些打着老农手工面条,实际上却是极其批量生产的三无产品。比如某搜索引擎现在还有一些特殊的推广账号,用来推广黑五类产品。比如那些搬运来搬运去的自媒体搬运工。他们都是在作恶。当然,存在即合理,就好像有人为此买单,说明市场需求存在,你不做总有人做。但我想说的是,我们自己内心要有正念,要有一些坚守。什么能做,什么不能做,自己有一杆秤。

Nginx+Lua进行访问控制

背景

前阵子帮朋友做了个服务端,用来给他APP做一些基本的注册、付费等功能。但是他APP被盗版了,话说这盗版也是厉害,有时候注册量远远高于正版注册量,昨天盗版一天注册6000人,正版才2000人。于是乎服务器扛不住了,注册接口超时,客户端自动发起重连,又超时,又重连,如此往复,最后正常用户都没法访问了。

处理方案

要保证现有客户的能正常使用,还要限制盗版,那必须得知道盗版跟正版有啥区别了,检查过后,发现盗版应用在接口中有一个参数跟正版不一致。那当然得从参数上做限制。
两个方案:

  1. PHP接收到数据后,判断然后剔除。
  2. 使用Lua在Nginx层直接剔除

不用看,当然能在Web服务剔除最好了。为啥呢?如果在应用层提出,一样会进入PHPFPM消耗资源。

具体实施

安装Lua过程不表,可以参考https://segmentfault.com/a/1190000018641801

lua_need_request_body on;
location ~ \.php {
    access_by_lua '
        local uri = ngx.var.request_uri
        if string.find(uri,"/api/register") ~= nil then
            local body = ngx.req.get_body_data()    
            if string.find(body,"20200101") or string.find(body,"20200102") or string.find(body,"9.9.9") or string.find(body,"8.8.8") then
                ngx.exit(ngx.HTTP_NOT_FOUND)
            end
        end
    ';
    # 接着往下继续执行php,正常请求
}

这里提一个点access_by_lua用来进行访问控制,之前一直用content_by_lua_block,匹配成功以后,就不会继续执行php了。一定要用access_by_lua

网上是这么说的

access_by_lua 在请求访问阶段处理,用于访问控制,适用于 http、server、location、location if

content_by_lua 是内容处理器,接受请求并输出响应,适用于 location、location if

https://github.com/openresty/lua-nginx-module


2020年04月08日简单优化一下。随着盗版越来越多,盗版的关键字丢数组里

lua_need_request_body on;
location / {  
  access_by_lua '
    local uri = ngx.var.request_uri
    if string.find(uri,"/api/register") ~= nil then
        local body = ngx.req.get_body_data()
        local denyList = {"20200101","20200102","9.9.9","8.8.8"}
        for i = 1,#denyList do
            if string.find(body,denyList[i]) then
                ngx.header.content_type = "application/json";
                ngx.say(\'{"toast":"您正在使用盗版软件"}\');       
                ngx.exit(ngx.HTTP_OK);
            end
        end
    end
';
}  

细心的朋友会发现,上面的for循环中,i是从1开始的,没毛病,在很多语言中长度是从0开始,但是在lua里面,长度居然是从1开始。


2020年04月10日在优化一波,将所有处理失败的请求全部记录下来

在处理这个功能的时候,发现一个神奇的bug

在lua中,比如匹配8.8.8里面的居然会匹配成任意字符,也就是说,8d8c8也会被匹配成功,导致有一部分用户被误判。需要用%p来表示

将错误信息,写入文件中。

file = io.open("/tmp/lua.txt", "a")
io.output(file)
io.write(date)
io.write(body)
io.close(file)

以下是将lua脚本单独放在一个文件中的完整代码

lua_need_request_body on;
access_by_lua_file /usr/local/nginx/conf/lua.lua
local uri = ngx.var.request_uri
    if string.find(uri,"/api/register") ~= nil then
        local body = ngx.req.get_body_data()
        local denyList = {"20200101","20200102","9%p9%p9"}
        for i = 1,#denyList do
            if string.find(body,denyList[i]) ~= nil then
            local time = os.date("%Y-%m-%d %H:%M:%S")
                    local date = os.date("%Y-%m-%d")
                    local fileName = "/tmp/lua"..date..".txt"
            file = io.open(fileName, "a")
          io.output(file)
          io.write(time)
          io.write(body)
          io.write("\n")
          io.close(file)
                    ngx.header.content_type = "application/json";
          ngx.say(\'{"toast":"您正在使用盗版软件"}\');       
          ngx.exit(ngx.HTTP_OK);
            end
        end
    end

Git常用命令

项目中SVN用的比较多,最近用Git也只是一直停留在commit,push。记录一下用过的命令。

回滚整个版本库到指定版本

#先查看指定版本的版本号
git log
git reset --hard commit-id
git reset --hard 82bb80c9ea80b35377ac018f86dfc220670e9699

回滚部分文件到指定版本

git checkout commit-id  files
git checkout 82bb80c9ea80b35377ac018f86dfc220670e9699 app/Http/Controllers/Controller.php

解决冲突

最烦人的事情就是冲突了

git status #查看冲突文件
git mergetool #通过合并工具来查看冲突内容
git commit -a #合并完成以后,提交全部内容,保存退出
git push


image-20200408152238192

查看某个版本改变的内容

git show commit-id

下面显示的是本次修改的部分。

查看当前分支

git branch

查看所有分支

git branch -a

切换分支

git checkout 分支名称

合并分支

先切换到需要合并的分支git checkout master,例如主分支master,然后执行git merge dev

[root@VM_0_3_centos]git checkout master

M   storage/framework/sessions/M2bI0IwKicSqIu9685MlhlQx7yK0VTU6ut5wYL2M

切换到分支 'master'

[root@VM_0_3_centos]# git merge dev

更新 d5bd4d4..d4e81ca

Fast-forward

 readme.md | 143 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------

 1 file changed, 107 insertions(+), 36 deletions(-)


放弃本地修改

# 下载远程仓库最新内容,不做合并,相当于强制覆盖本地
git fetch --all  
# 指令把 HEAD 指向 master 最新版本
git reset --hard origin/master