分类 工作 下的文章

App 开发外包注意事项有哪些之一(转载自知乎)


接触过上万名创业者,开发上线过超过30款App,没有比我更适合回答这个问题的了。。
本文对想做好一款App项目的人来说这是一篇价值百万的回答!因为这是我们花了几百万试错成本试出来的经验!



在我们从事app开发行业以来每天都会收到大量客户的咨询。其中有创业者,公司的项目经理等等。前后2年左右的时间接触了上万名想做App的客户。发现80%的客户都容易犯一些致命的错误。

◆以为做个软件很简单,所以描述需求的时候及其模糊。

◆ 急着想要报价,在自己对需求不确定的时候就要报价。然后就按这个报价开始做。

◆不知道自己要什么,想做个商城说要做的是淘宝。

◆ 网站和手机App区别搞不清楚。要做手机App却说自己要做网站。

◆ 以为所有软件都有模板,而且模板都很便宜。

◆缺乏耐心,不明白也从未想过自己要做的东西有多复杂。

◆自己不知道要做的东西的具体功能,要靠开发商来猜。而且还这时候就要报价。



事实告诉我们,这些问题一定会导致以下结果。


◆ 项目做出来跟自己想的完全不一样。

◆根据一项国外的专业数据统计机构调查,在外包项目中,有52%的项目经理因为项目失控/失败而被迫离职/降职/开除。

◆ 项目上线的时候漏洞百出,反复修修补补解决不了问题。后面必须重做。(滴滴打车当年的外包就遇到了这种情况,找外包做的一塌糊涂。做出来没用过一次就直接报废重做)

◆ 误把自己都不确定需求时得到的不靠谱报价当做真实报价去开始做预算,导致后期资金预算跟不上继而导致项目失控/破产。



我们经常遇到客户第一次跟我们咨询的时候说,以前找的某某软件公司太坑爹。做的东西象一坨屎,仔细一问就发现。原来他自己在项目开工之前自己对自己的需求是完全不清楚和不确定的。就这样稀里糊涂就开工了,以为开发商会帮他完善剩余东西。实际这些客户告诉我遇到过的开发商没有一家会去帮他们中途完善。

原因很简单,需求想的越仔细开发成本越高。一般根据需求的细化程度,成本差出来几倍到几十倍都很正常。10万接的项目,真要扣细节100万的工资成本都不够。这也是一般客户们平时问报价的时候,不同的开发商报价会差出来这么多倍的原因。并不是仅仅是贵和便宜。根本原因是大家对需求的理解完全是不一样的。客户自己不清楚就没人会清楚了。


负责任的外包公司会仔细的问你需求细节,不负责任的外包公司上来就给你报价。


人总是有惰性的,一旦要想事情和要思考的时候都懒的思考。所以客户们一般反而会讨厌这种有耐心的会仔细问需求的开发商。反而喜欢这种什么都不问其实不知道你要做什么,但是先报个超低价吸引祝其入坑的开发商。最后带来的结果一般就是我们前面提到的那种情况,项目直接失败。或者中途被黑心开发商宰一把,中途狠狠加价(原来1万能做的功能中途要5万)。因为你已经选了他了,要么做到一半放弃,要么按他的继续加钱。大部分人都不想前面投入一半的预付款打水漂,而又不知道加这么一个功能到底会加多少钱。这时候已经没法再去选其他的开发商试了。所以会选择做下去。。。


我见过的最常见的例子,就是很多人上来就问做一个APP多少钱?或者问做一个简单的APP多少钱?或者说我要做个类似美团/淘宝/京东/滴滴打车。。。一样的APP多少钱?

第一种:问做一个APP多少钱?

其实你问这个问题就好像你到4S店问,一辆车要多少钱?车有10万的家用轿车也有1000万的超跑。车根据用途(轿车,越野,跑车,赛车,公交也是车),配置,引擎,装置不一样,价格和成本是天差地别。同理,你来问APP也是一样的。必须表达清楚自己要的是什么样的APP,用于什么场景,APP解决什么问题,怎么解决(具体需要哪些功能)。就来问价格,不亚于你去问汽车4S店,我就是要一辆车,你告诉我价格就行了。别人肯定会拿你当傻子。因为你踏马没告诉人家你到底要什么车啊魂淡!!!


如果你只问我做一个APP多少钱? 我只能告诉你,几百块到几个亿,都有可能。


第二种:我要做一个简单的APP,多少钱?

每个人对简单的定义是不一样的。你说的简单具体是简单到什么程度,你又具体是要做什么东西的,很多人觉得微信也挺简单的。。。建议你每次问的时候都说清楚具体功能。




第三种:我要做个类似美团/淘宝/京东/滴滴打车。。。一样的APP多少钱?

一般这么问的创业者有个特点,很多说不清楚自己要的是什么。可能只是看中了比如滴滴打车的地图功能,但是描述的时候说的是跟滴滴打车类似。而滴滴打车的地图功能本身实际只占了滴滴整个软件系统功能的百分之一都不到。同理,有的是看中了美团的团购部分,说自己要做的是美团。有的看到京东有在线支付,就说自己要的是京东。如果你直接这么问,我其实完全不明白你想要的是你举得例子里面的具体什么功能。因为不可能完全仿一个美团/淘宝/京东/滴滴打车。。。


为什么不能是完全仿做?你看到的貌似简单的美团/淘宝/京东/滴滴打车/微信......这样的APP,每个的软件研发成本都是过千万,乃至几亿的(特别是复杂的后台)。因为这些大公司APP的细节的复杂程度和后台的复杂程度超乎你的想象。现在所谓的很多软件仿京东,微信之类的,网上说能给你开发微信京东之类的公司,可以说真正能做的功能不到微信京东的百分之一。举几个具体的例子。比如就说最基本的注册登录,可能就分为邮箱注册登录,微信授权登录,QQ授权登录,微博授权登录,短信验证码注册登录,密码找回又分为邮箱找回和短信找回。这里就罗列了7种情况,你做一种还是做7种开发成本可能就差了7倍或者更高。


又比如搜索功能,最简单的搜索功能可能开发一下就是几个小时的事情,但是这种搜索可能在几千个,几万个商品数据的时候还能正常运行。但是如果商品数据有几百万条,这时候肯定会崩溃。而不仅仅是商品数据会起到影响,比如你搜索功能是支持模糊搜索(即输入的关键词可以有偏差)还是精准搜索。模糊搜索能模糊到什么程度,讲究都是很大的。淘宝京东这样大平台的搜索功能,很多大公司光一个搜索功能就是需要十几个人的开发小组常年去进行开发和优化,养这些人的成本一年就是几百万上千万。你现在就可以打开淘宝的搜索功能仔细看看它有多少细节(高级搜索,地域,价位筛选,搜索结果排序等等等等)。感兴趣的可以自己去查查这些上市公司的财报。每个季度在软件开发上的成本都是几千万到几个亿不等。大公司一定是招自己有需要的人,如果不需要肯定不会招这么多人。由于篇幅有限,更详细的原因和要注意的地方不做详述。


这里贴上滴滴打车的招聘广告,感兴趣的可以看看滴滴打车背后的技术团队有多少人。

仅3月份在招的技术职位就多大上百个。平均年薪都在20到40万之间。

滴滴打车招聘职位

现在诸位能理解为什么很怕这些问题了吗? 因为创业者的确是明明确确的告诉我,要做一个淘宝/京东/滴滴打车类似的APP,但是这种APP的成本是天文数字。你可能要的只是其中一部分功能,或者只是想模仿他的运营模式。



有些人可能会觉得,这是大公司所以才需要。我创业初期需要考虑的这么细吗?很明确的告诉你,非常需要。

等到错误发生了你再去解决,所要付出的成本是非常巨大或者会直接导致失败。

大公司不仅仅是因为他是大公司才做得细,是因为他做得细才能成为大公司。

而且你不考虑没人会替你考虑。不要寄希望于你在网上找的这些软件公司,他们只会告诉你这件事很简单,你快来吧,来了就能发大财,互联网人傻钱多。你不说清楚自己的APP具体需要的是哪些功能,最后吃亏的一定是你自己。因为你在不清楚自己要做的东西具体是什么样子的时候,你找的软件公司就更加不知道。


你寄希望于他们给你去思考细节,他们只会给你偷换概念,偷工减料。因为这样做就可以给你的报价更低增加你选他的概率。



之前有个真实的例子,一个客户跟个不负责任的开发商只说了有注册登录,而没和他说过要做找回密码,开发商也没有提醒他。而最后软件就是没有找回密码的。如果各位看官不想自己也遇到这样的情况而被坑,就请想清楚自己App尽量多的细节。


比如一个购物车功能包括,加入购物车,从购物车移除,添加/减少购物车内某个商品的数量,直接输入数字修改商品的数量,批量付款。这些功能里面你说了一个很多开发商就只会做一个,大部分开发商不会考虑其他的。而一般创业者会觉得,淘宝有啊,一般都有啊你为什么没做?(创业者看到的一般都是那种大公司很成熟的产品),你要知道,淘宝的开发成本是亿级别的。而且经过了很多年的迭代和更新。


阿里巴巴集团2015年Q3季度财报显示,2015年第三季度产品开发开支为人民币32.25亿元(约合5.07亿美元),占营收的15%。你没看错,一个季度32亿的开发成本。一年就是一百多亿。


大部分情况下细节方面你不和开发商提,一般就没有。如果别人会替你考虑的越全面,那么开发成本一定会很高。

这里我列举三大块最影响APP软件质量和成本的东西。希望大家一定要记在心里!!!方便找合适的开发商和掌控项目质量。


1.功能的开发方式

现在市场上存在的几种开发方式如下:


a.web网页加壳生成APP

web网页加壳生成APP的开发方式,先花几百块钱买个现成的手机网站模板,在加壳打包一个APP只需要5分钟,但是做出来的效果很差,耗流量,浏览体验极差,访问速度慢等等。部分开发商利用客户不懂,把这种5分钟速成的东西,当成原生态开发的APP去欺骗创业者。卖几千到几万的价格。而创业者很多时候还自以为捡了便宜(问了十几家这家最便宜)。


b.Web网页+原生态混编(网页部分占80%以上)

混编方式的APP效果比第一种稍好。但是如果要做出接近原生态的效果,需要不断的优化和改版,花的钱不比原生态少。而如果不对网页和系统优化,只是简单的拼凑。那么做出来的效果和web加壳的差不多.


c.HTML5开发

成本大概是原生态APP的50%到30%,也是比较接近原生开发能达到效果的一种方式。但受到很多限制。各大平台兼容性还不足,相对来说还处于过渡期,同时比较耗系统资源。在低配的手机上更卡。手机淘宝的APP目前就是HTML5+原生态混编的,相对来说在很多低配的手机上还是比较卡的。最近优化了很多,但是早期的表现很不尽人意。Facebook和京东都尝试过HTML5,同时也吃了不成熟的亏。HTML5的未来或许是美好的,但是这期间的试错成本小公司不一定承受得起。


d.原生态开发

是目前最常用和最成熟的方式。越重视细节成本越高。一般根据具体功能要求一个APP的开发成本从几千块到几千万不等。


2.功能的实现方式(功能的复杂程度和用户量)

比如上面说到的搜索功能,具体对搜索功能的要求成本会让成本差出来几万倍。不仅仅是搜索,再举几个例子。比如微信里面的聊天,分为文字,图片聊天,录音的语言聊天,语音及时对讲,视频聊天。

语音及时对讲和视频聊天只简单提一提。这些都是开发成本要用百万级和千万级来计算的东西。微信和QQ乃至现在自己的语言对讲和视频聊天都是有很多问题的,比如同时多人聊天会有很大的回声,电流,杂音。不是腾讯不知道,是知道了但是很难解决。

这里具体讲比如录音发送,一般来说我们听一段60秒的音乐是1M左右。而微信的一段60秒的语音压缩到了几十K,来保证发送和接收时的速度。同时还做了语音降噪(减少周围的噪音)等等。而如果这些不去考虑,只是简单的发送一段语音。两者之间的开发成本相差几倍到几百倍很正常。同样的,你的APP做出来你会发现,消息发送很慢,很耗流量等等。


3.APP在手机上的兼容性

相信各位在用手机APP的时候,特别是安卓手机。肯定发现有些APP会闪退,卡死之类的情况。这个就是因为APP的一部分功能在这台手机上不兼容或有bug。这些问题非常多而且很难解决。你只是一个用户的时候感觉不会那么强烈,因为你用的大部分都是大公司开发的很成熟的产品。但是你自己作为创业者的时候就必须要考虑了。因为没有人想自己的APP开发出来,10个手机上8个闪退。但是事实又的确如此。很多几十万成本开发出来的APP到处都是闪退。

兼容性是非常影响成本的(会对成本造成上下几倍到几百倍不等的成本)。仅安卓而言。安卓手机全世界有一万多种机型,各种不同的手机品牌,分辨率,操作系统版本号,都对程序的兼容性有影响。很多时候做兼容性调试的成本还要大于软件的开发成本,真要做到主流手机兼容,光买测试的手机就要花几十万去买。一个APP如果开发出来,不做兼容性调试开发。和做兼容性调试开发,成本也是会差出来N倍的。

另外在说说模板,很多时候一些项目如果有成熟的模板解决方案能节省很大的成本。

但是模板也一样价格存在巨大的差异。同样的一个商城模板可能价格也上下差出来几十倍,原因也是因为细节功能完全不一样,可能功能差了十几倍。如果你在买之前不仔细观察细节功能,那么一定会出现买了后大呼坑爹的情况。这个系统可能整个流程都是残缺的,更不要提你拿这个残缺的系统去运营了。

另外不是所有APP都有模板,一般来说只有商城相关的APP的模板比较多。而且模板有成熟不成熟的区别,真正成熟的模板开发成本和时间是巨大的,一个公司不可能同时有很多好的模板。因为数量多,必定不精。开发一个好的模板的成本已经巨大了,同时还搞多个,则说明每个模板上投入的成本和精力不会太多。


3月30日更新几个app外包开发常见的几个坑。

----------------------------------------------------------------------------------------------------------------------------------

常见坑一:

客户问外包公司你们有什么知名案例吗? 外包公司说有啊,美团,大众点评,携程,一号店(说出一个一二线,或者是三线有一定知名度app的例子)是我们做的/是我们的案例。

这种情况下90%是偷换概念或者纯骗。不管你找的这家公司是真有几百个人的大公司还是只有几个人的小公司。


实际情况是,任何你但凡听说过小有名气的App,基本都是互联网公司自己招人做的 不太可能是找外包。你可以在百度搜索任何一家你听说过的app名字或者互联网公司名字+招聘2个字,都能看到他们长期在招聘大量的程序员工程师,同时公司长期备有几十到几百,甚至上千人的技术团队。


即使真的找外包,可能是最早创业初期的第一期找的外包,但是他们后来出名的那个系统跟最初找外包做的,已经完全不是一回事了不是一个东西了,业务代码已经完全不一样 。


外包做的东西就是前期低成本试错的一个东西,很可能一次都没用过就直接报废。滴滴打车之前最早就是找的外包开发的,但是基本没正式用过就直接报废了自己招人重新做。但是这家外包公司可能在N年后滴滴打车牛逼了后会跳出来跟客户说:滴滴打车是我客户案例,滴滴打车是我做的。利用的就是偷换概念和客户不懂不会较真。滴滴打车当前找他们做并不是因为他们牛逼,而是滴滴打车可能也被他们坑了。


还有的是,有些外包公司在这个很出名的App公司团队初创的时候,跟这个团队的创始人吹过牛逼,也只是吹过一点牛逼而已,可能并没有实际合作项目。然后这个外包公司N年后发现当年一起吹过牛逼的那小伙做成功了,这时候他跳出来说 XX是我客户,XXApp是我们客户案例。。


还有一种情况就是, 比如很大的互联网公司,比如携程或者大众点评或者一号店,他们平时开发的时候也会有忙不过来的时候 ,偶尔会找些外包公司进行一部分的人员外包,要几个技术员过来帮忙干几个月临时的杂活。一般都是打杂接触点边缘化的没有技术含量的东西,根本接触不到核心部分业务代码。 但是这时候外包公司又会说,大众点评是我们做的。都是偷换概念,显得自己牛逼。


还有的就是一点关系也扯不上, 强行欺骗来增强客户信任。揭穿了就算了。


其实你可以做个简单的实验,你在百度或者其他任何平台公司找app外包开发公司的时候,会遇到N家官网上有大众点评,或者在家点点,携程,美团之类的app是他的客户案例的,或者是他们的业务人员亲口跟你吹这样的牛逼。

其实这些被合作的互联网公司并不知道自己被合作了,以前有个梗是说吃了一次肯德基就是肯德基的战略合作伙伴了,加了一次油就是中石化的战略合作伙伴了。 而在app外包领域里真的这么干的公司非常多,不说小的,甚至大量已经上市的外包公司也吹这样的牛逼。偷换概念乐此不疲。


常见坑二:

外包公司给你的合同一定要仔细看,很多时候被骗的客户自己公司是有法务的但是也一样被骗。因为你的法务和律师根本看不懂那些看似专业的技术词语。所以并不知道他是在扯淡还是合理的。由其是在验收标准和开发要求的这几大块上。基本如果甲方公司没有懂技术的,哪怕有专业的法务也太容易被骗。


一般体现在合同里对需求描述的不详细或者压根合同里就没有提到需求,只说要做个某某app,多少钱什么时候交付。 这样的合同其实压根没有一点卵用,你们之间商量的做个某某app只有你们自己口头讨论了需求,但是如果没非常详细的落实在合同里,最后外包公司随便给你个东西也能交付。甚至压根就不是最早你们商量的,因为合同里并没有证据能证明你们要做的到底是什么。

同样的还有开发方式(原生还是混编,H5还是加壳),验收的标准是什么这些如果不提,每一次都是提前被埋下的炸弹,遇到骗子你去法院都白瞎。根本就告不倒人家,就是合法的骗。


一般负责任的公司在合同里都会非常详细的给到一个很长的需求文档,根据项目的大小起码有几十页,里面有各自原型图和需求说明。用到的技术,项目架构,开发方式等等都讲的非常清楚。


这个文档是合同非常重要的附件,里面详细的描述了你们这次项目具体是要做成什么样子。如果没有这个,双方签完合同的时候其实都是蒙逼的。要做什么根本没个界定,到时候胡乱拿个东西交差也是不违反合同的。


这个看似常识的东西其实大部分外行都不知道,我每年都至少见到几十起外包开发被骗是被坑在这个地方的。


甲方如果不重视这个,哪怕被人骗了告到哪去都没用。 因为别人没违反合同。你们的合同压根就是一张废纸。


暂时就更新这么多,app外包坑非常非常深。最好的方式就是甲方自己公司有个懂技术的能参与进来选择开发商和逐步交接。以后有时间在慢慢更新,希望能帮到真正想创业的人。







-----------------------------------------------------------------------------------------------------------------------------------

最近很多朋友问我是否做开发,如果项目开发需求的可以直接私信我或者加微信交流。专精O2O电商和智能物联网方向。

广告前后端流程

最近了解了下广告投放前后端投放流程,一定有一些不严谨的地方,希望各位大大指出。

展示次数和点击次数是反应广告投放具体情况的2个指标。比如google提供的ga,百度,cnzz等提供的统计代码。

展示计数

采用了基于像素的计算方法来记录在发布商上投放的广告展示次数。当某个广告完全展示的时候,一个1x1的像素请求会被发送到我们的ad server上,那么这次的展示就会被记录。即广告的展示计数是通过这个1x1像素图发送请求次数作为展示的数量。如果是ad serving的话,那就是server上广告物料被请求的次数。一些第三方的广告服务器使用302重定向方法来统计展示次数,ad server会记录一次展示。这种基于像素和302重定向方法之间还是有点差异的,具体见报告展示次数差异

(function() {
    var ifr = document.createElement('iframe'),
        c = document.getElementById('c');   //像素容器
    
    ifr.width = '1';
    ifr.height = '1';
    ifr.border = "0";
    ifr.style.display = 'none';
    
    ifr.src = monitorServer.url + '?param1=xxx&param2=xxxx&r=' + Math.random(); //向展示计数服务器发送请求
    
    c.appendChild(ifr);
})();

点击计数

当用户点击广告时,会有一条请求发送给ad server,ad server收到请求后统计一次点击,ad server会向用户发送重定向网址,将用户转到着陆页。

点击计数的方式一般有2种

前端js
302重定向
CURL 直接访问

前端js:

用户从A页面,点击广告的URL,执行了跳转的JS代码,跳转到C页面。

执行了2个步骤:

1.发送点击请求给ad server
2.直接跳转至广告落地页

这种方式没通过ad server,直接跳转过去,如果不在落地页的URL上将广告参数写死,那么无法识别广告信息。

302重定向

1.点击广告,请求跳转至ad server.
2.跳转至落地页

这个时候在请求跳转至ad server的时候,server可将广告参数写入server域名下的cookie,同时server还可以将广告参数拼接在落地页的URL后,落地页便可以完成对应广告活动,广告位信息的读取。

CURL直接访问

<?php 
$url = "http://593668.com"; 
$ch = curl_init(); 
curl_setopt ($ch, CURLOPT_URL, $url); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT,10); 
$dxycontent = curl_exec($ch); 
echo $dxycontent; 
?>

ICP证和ICP备案有什么区别?怎样才是正规的网络公司?

什么是ICP互联网经营许可证?

  ICP互联网经营许可证是指通过互联网,向上网用户有偿提供信息或者网页制作等服务活动。经营性ICP,经营的内容主要是网上广告、代制作网页、有偿提供特定信息内容及其它网上应用服务。国家对经营性ICP实行许可证制度。各公司必须办理ICP许可证。

ICP备案和经营性ICP有何不同?

  简单地说:ICP备案是属于网站的,每个网站均需备案。备案是免费的.
  而ICP经营许可证是属于公司的,是证明本公司利用网站经营,取得合法性收入的证件,和网站没有必然的关系。一个ICP证可以加挂许多网站。
  ICP备案需在信产部的网站www.miitbeian.gov.cn上做登记,不需要额外递交资料,而且是免费的;而ICP经营许可证必须直接在省通管局或信产部递交可行性报告等资料,需要交纳一定的行政费用,受理以后拿到证件.

哪些网站需要ICP备案?

 1. 根据中华人民共和国信息产业部第十二次部务会议审议通过的《非经营性互联网信息服务备案管理办法》精神,在中华人民共和国境内提供非经营性互联网信息服务,应当办理备案!未经备案,不得在中华人民共和国境内从事非经营性互联网信息服务。而对于没有备案的网站将予以罚款或关闭。

2.如果你是一个具有独立域名的非经营性的网站,按照《互联网信息服务管理办法》(国务院292号)的规定令必须办理备案手续。
3.网站备案用户依照注册所在地进行填写。公司填写注册所在地,个人填写户籍所在地。
4.网站只有独立的IP地址,没有域名也需要办理网上备案。只要是能访问到这个网站方式都要备案,所有绑定的域名,二级域名,IP地址都需要登记。
5.网站的网页还没有做好,暂不需要网上备案,但要在网站开通之前(即做好的网站联入互联网上之前)进行备案即可。
6.如果一个人拥有两个网站:www.abc.com/www.abc.cn申请备案,只要这二个网站的主体都是你,你只需提交一个备案申请。
7.个人网站涉及教育的不需要进行前置审批,原因是个人网站无法进行毕业证书的查验工作,告知该用户可直接进行网上备案。
8. 同一用户拥有多个域名,并放在同一服务器上,将只针对主体进行备案,即对网站主办者进行备案,多个域名应在“域名列表”中全部列出。

9.审核需要的时间将按照流程尽快完成审核手续。时间长短由同时报备单位数量多少而决定。您可经常浏览自己的邮箱,如审核通过后会将电子证书发送到您自己的邮箱里。

如何查询企业的ICP证?

  查询企业的ICP经营许可证,可以登陆各省的通信管理局网站,就可以查到你要查询的企业ICP经营许可证是否在其发布的领证单位名单中。

ICP证的单位名称是不是需要跟企业注册名称一致?

  ICP证的单位名称必须要和企业注册名称一致。

为什么要办理经营性ICP许可证?

  根据中华人民共和国国务院令第291号《中华人民共和国电信条例》、第292号《互联网信息服务管理办法》(简称ICP管理办法),国家对提供互联网信息服务的ICP实行许可证制度。
  ICP证是网站经营的许可证,根据国家《互联网信息服务管理办法》规定,经营性网站必须办理ICP证,否则就属于非法经营。
  根据《互联网信息服务管理办法》,违反本办法的规定,未取得经营许可证,擅自从事经营性互联网信息服务,或者超出许可的项目提供服务的,由所在地电信管理机构责令限期改正,有违法所得的,没收违法所得,处违法所得3倍以上5倍以下的罚款;没有违法所得或者违法所得不足5万元的,处10万元以上100万元以下的罚款;情节严重的,责令关闭网站。
  如果不是以互联网增值业务为主,不从事以上互联网增值业务的网站则需要办理ICP备案证,现在备案的时候还要求提供备案人员的身份证,相片等资料。
  经营网页制作的网络公司当然要办理经营性的ICP经营许可证。需要的条件是有5个计算机或者网络,广告相关专业人员的毕业证书,有100万或以上的注册资金的公司,有办公场地,有域名申请证书,有备案证号。现在提供网站建设的服务商,主要分为个人,公司和有ICP经营许可的正规网络公司三种,个人建站,是完全不具备ICP经营许可证和工商税务许可的,普通公司,有通过年检的营业执照、工商税务登记证,组织机构代码证等,是合法的公司,但不具备经营和提供商业网站服务的资质,甚至网络公司网站本身也没有经过ICP备案。所以从保障消费者权益、用户维权的角度出发,建议选择公司网站经过备案的,具有ICP经营许可的正规网络公司。
  盈和动力ICP许可证号:桂B2-20100014,盈和动力网站备案号:桂ICP备05003418号-1号

mysql 中 时间和日期函数

一、MySQL 获得当前日期时间 函数

1.1 获得当前日期+时间(date + time)函数:now()

mysql> select now();

now()
2008-08-08 22:20:46

除了 now() 函数能获得当前的日期时间外,MySQL 中还有下面的函数:

current_timestamp()
,current_timestamp
,localtime()
,localtime
,localtimestamp -- (v4.0.6)
,localtimestamp() -- (v4.0.6)

这些日期时间函数,都等同于 now()。鉴于 now() 函数简短易记,建议总是使用 now() 来替代上面列出的函数。

1.2 获得当前日期+时间(date + time)函数:sysdate()

sysdate() 日期时间函数跟 now() 类似,不同之处在于:now() 在执行开始时值就得到了, sysdate() 在函数执行时动态得到值。看下面的例子就明白了:

mysql> select now(), sleep(3), now();

now()sleep(3)now()
2008-08-08 22:28:2102008-08-08 22:28:21

mysql> select sysdate(), sleep(3), sysdate();

sysdate()sleep(3)sysdate()
2008-08-08 22:28:4102008-08-08 22:28:44

可以看到,虽然中途 sleep 3 秒,但 now() 函数两次的时间值是相同的; sysdate() 函数两次得到的时间值相差 3 秒。MySQL Manual 中是这样描述 sysdate() 的:Return the time at which the function executes。

sysdate() 日期时间函数,一般情况下很少用到。

  1. 获得当前日期(date)函数:curdate()

mysql> select curdate();

curdate()
2008-08-08

其中,下面的两个日期函数等同于 curdate():

current_date()
,current_date

  1. 获得当前时间(time)函数:curtime()

mysql> select curtime();

curtime()
22:41:30

其中,下面的两个时间函数等同于 curtime():

current_time()
,current_time

  1. 获得当前 UTC 日期时间函数:utc_date(), utc_time(), utc_timestamp()

mysql> select utc_timestamp(), utc_date(), utc_time(), now()

utc_timestamp()utc_date()utc_time()now()
2008-08-08 14:47:112008-08-0814:47:112008-08-08 22:47:11

因为我国位于东八时区,所以本地时间 = UTC 时间 + 8 小时。UTC 时间在业务涉及多个国家和地区的时候,非常有用。
二、MySQL 日期时间 Extract(选取) 函数。

  1. 选取日期时间的各个部分:日期、时间、年、季度、月、日、小时、分钟、秒、微秒

set @dt = '2008-09-10 07:15:30.123456';

select date(@dt); -- 2008-09-10
select time(@dt); -- 07:15:30.123456
select year(@dt); -- 2008
select quarter(@dt); -- 3
select month(@dt); -- 9
select week(@dt); -- 36
select day(@dt); -- 10
select hour(@dt); -- 7
select minute(@dt); -- 15
select second(@dt); -- 30
select microsecond(@dt); -- 123456

  1. MySQL Extract() 函数,可以上面实现类似的功能:

set @dt = '2008-09-10 07:15:30.123456';

select extract(year from @dt); -- 2008
select extract(quarter from @dt); -- 3
select extract(month from @dt); -- 9
select extract(week from @dt); -- 36
select extract(day from @dt); -- 10
select extract(hour from @dt); -- 7
select extract(minute from @dt); -- 15
select extract(second from @dt); -- 30
select extract(microsecond from @dt); -- 123456

select extract(year_month from @dt); -- 200809
select extract(day_hour from @dt); -- 1007
select extract(day_minute from @dt); -- 100715
select extract(day_second from @dt); -- 10071530
select extract(day_microsecond from @dt); -- 10071530123456
select extract(hour_minute from @dt); -- 715
select extract(hour_second from @dt); -- 71530
select extract(hour_microsecond from @dt); -- 71530123456
select extract(minute_second from @dt); -- 1530
select extract(minute_microsecond from @dt); -- 1530123456
select extract(second_microsecond from @dt); -- 30123456

MySQL Extract() 函数除了没有date(),time() 的功能外,其他功能一应具全。并且还具有选取‘day_microsecond’ 等功能。注意这里不是只选取 day 和 microsecond,而是从日期的 day 部分一直选取到 microsecond 部分。够强悍的吧!

MySQL Extract() 函数唯一不好的地方在于:你需要多敲几次键盘。

  1. MySQL dayof… 函数:dayofweek(), dayofmonth(), dayofyear()

分别返回日期参数,在一周、一月、一年中的位置。

set @dt = '2008-08-08';

select dayofweek(@dt); -- 6
select dayofmonth(@dt); -- 8
select dayofyear(@dt); -- 221

日期 ‘2008-08-08′ 是一周中的第 6 天(1 = Sunday, 2 = Monday, …, 7 = Saturday);一月中的第 8 天;一年中的第 221 天。

  1. MySQL week… 函数:week(), weekofyear(), dayofweek(), weekday(), yearweek()

set @dt = '2008-08-08';

select week(@dt); -- 31
select week(@dt,3); -- 32
select weekofyear(@dt); -- 32

select dayofweek(@dt); -- 6
select weekday(@dt); -- 4

select yearweek(@dt); -- 200831

MySQL week() 函数,可以有两个参数,具体可看手册。 weekofyear() 和 week() 一样,都是计算“某天”是位于一年中的第几周。 weekofyear(@dt) 等价于 week(@dt,3)。

MySQL weekday() 函数和 dayofweek() 类似,都是返回“某天”在一周中的位置。不同点在于参考的标准, weekday:(0 = Monday, 1 = Tuesday, …, 6 = Sunday); dayofweek:(1 = Sunday, 2 = Monday, …, 7 = Saturday)

MySQL yearweek() 函数,返回 year(2008) + week 位置(31)。

  1. MySQL 返回星期和月份名称函数:dayname(), monthname()

set @dt = '2008-08-08';

select dayname(@dt); -- Friday
select monthname(@dt); -- August

思考,如何返回中文的名称呢?

  1. MySQL last_day() 函数:返回月份中的最后一天。

select last_day('2008-02-01'); -- 2008-02-29
select last_day('2008-08-08'); -- 2008-08-31

MySQL last_day() 函数非常有用,比如我想得到当前月份中有多少天,可以这样来计算:

mysql> select now(), day(last_day(now())) as days;

now()days
2008-08-09 11:45:4531

三、MySQL 日期时间计算函数

  1. MySQL 为日期增加一个时间间隔:date_add()

set @dt = now();

select date_add(@dt, interval 1 day); -- add 1 day
select date_add(@dt, interval 1 hour); -- add 1 hour
select date_add(@dt, interval 1 minute); --
select date_add(@dt, interval 1 second);
select date_add(@dt, interval 1 microsecond);
select date_add(@dt, interval 1 week);
select date_add(@dt, interval 1 month);
select date_add(@dt, interval 1 quarter);
select date_add(@dt, interval 1 year);

select date_add(@dt, interval -1 day); -- sub 1 day

MySQL adddate(), addtime()函数,可以用 date_add() 来替代。下面是 date_add() 实现 addtime() 功能示例:

mysql> set @dt = '2008-08-09 12:12:33';

mysql>
mysql> select date_add(@dt, interval '01:15:30' hour_second);

date_add(@dt, interval '01:15:30' hour_second)
2008-08-09 13:28:03

mysql> select date_add(@dt, interval '1 01:15:30' day_second);

date_add(@dt, interval '1 01:15:30' day_second)
2008-08-10 13:28:03

date_add() 函数,分别为 @dt 增加了“1小时 15分 30秒” 和 “1天 1小时 15分 30秒”。建议:总是使用 date_add() 日期时间函数来替代 adddate(), addtime()。

  1. MySQL 为日期减去一个时间间隔:date_sub()

mysql> select date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second);

date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second)
1997-12-30 22:58:59

MySQL date_sub() 日期时间函数 和 date_add() 用法一致,不再赘述。另外,MySQL 中还有两个函数 subdate(), subtime(),建议,用 date_sub() 来替代。

  1. MySQL 另类日期函数:period_add(P,N), period_diff(P1,P2)

函数参数“P” 的格式为“YYYYMM” 或者 “YYMM”,第二个参数“N” 表示增加或减去 N month(月)。

MySQL period_add(P,N):日期加/减去N月。

mysql> select period_add(200808,2), period_add(20080808,-2)

period_add(200808,2)period_add(20080808,-2)
20081020080806

MySQL period_diff(P1,P2):日期 P1-P2,返回 N 个月。

mysql> select period_diff(200808, 200801);

period_diff(200808, 200801)
7

在 MySQL 中,这两个日期函数,一般情况下很少用到。

  1. MySQL 日期、时间相减函数:datediff(date1,date2), timediff(time1,time2)

MySQL datediff(date1,date2):两个日期相减 date1 - date2,返回天数。

select datediff('2008-08-08', '2008-08-01'); -- 7
select datediff('2008-08-01', '2008-08-08'); -- -7

MySQL timediff(time1,time2):两个日期相减 time1 - time2,返回 time 差值。

select timediff('2008-08-08 08:08:08', '2008-08-08 00:00:00'); -- 08:08:08
select timediff('08:08:08', '00:00:00'); -- 08:08:08

注意:timediff(time1,time2) 函数的两个参数类型必须相同。
四、MySQL 日期转换函数、时间转换函数

  1. MySQL (时间、秒)转换函数:time_to_sec(time), sec_to_time(seconds)

select time_to_sec('01:00:05'); -- 3605
select sec_to_time(3605); -- '01:00:05'

  1. MySQL (日期、天数)转换函数:to_days(date), from_days(days)

select to_days('0000-00-00'); -- 0
select to_days('2008-08-08'); -- 733627

select from_days(0); -- '0000-00-00'
select from_days(733627); -- '2008-08-08'

  1. MySQL Str to Date (字符串转换为日期)函数:str_to_date(str, format)

select str_to_date('08/09/2008', '%m/%d/%Y'); -- 2008-08-09
select str_to_date('08/09/08' , '%m/%d/%y'); -- 2008-08-09
select str_to_date('08.09.2008', '%m.%d.%Y'); -- 2008-08-09
select str_to_date('08:09:30', '%h:%i:%s'); -- 08:09:30
select str_to_date('08.09.2008 08:09:30', '%m.%d.%Y %h:%i:%s'); -- 2008-08-09 08:09:30

可以看到,str_to_date(str,format) 转换函数,可以把一些杂乱无章的字符串转换为日期格式。另外,它也可以转换为时间。“format” 可以参看 MySQL 手册。

  1. MySQL Date/Time to Str(日期/时间转换为字符串)函数:date_format(date,format), time_format(time,format)

mysql> select date_format('2008-08-08 22:23:00', '%W %M %Y');

date_format('2008-08-08 22:23:00', '%W %M %Y')
Friday August 2008

mysql> select date_format('2008-08-08 22:23:01', '%Y%m%d%H%i%s');

date_format('2008-08-08 22:23:01', '%Y%m%d%H%i%s')
20080808222301

mysql> select time_format('22:23:01', '%H.%i.%s');

time_format('22:23:01', '%H.%i.%s')
22.23.01

MySQL 日期、时间转换函数:date_format(date,format), time_format(time,format) 能够把一个日期/时间转换成各种各样的字符串格式。它是 str_to_date(str,format) 函数的 一个逆转换。

  1. MySQL 获得国家地区时间格式函数:get_format()

MySQL get_format() 语法:

get_format(date|time|datetime, 'eur'|'usa'|'jis'|'iso'|'internal'

MySQL get_format() 用法的全部示例:

select get_format(date,'usa') ; -- '%m.%d.%Y'
select get_format(date,'jis') ; -- '%Y-%m-%d'
select get_format(date,'iso') ; -- '%Y-%m-%d'
select get_format(date,'eur') ; -- '%d.%m.%Y'
select get_format(date,'internal') ; -- '%Y%m%d'
select get_format(datetime,'usa') ; -- '%Y-%m-%d %H.%i.%s'
select get_format(datetime,'jis') ; -- '%Y-%m-%d %H:%i:%s'
select get_format(datetime,'iso') ; -- '%Y-%m-%d %H:%i:%s'
select get_format(datetime,'eur') ; -- '%Y-%m-%d %H.%i.%s'
select get_format(datetime,'internal') ; -- '%Y%m%d%H%i%s'
select get_format(time,'usa') ; -- '%h:%i:%s %p'
select get_format(time,'jis') ; -- '%H:%i:%s'
select get_format(time,'iso') ; -- '%H:%i:%s'
select get_format(time,'eur') ; -- '%H.%i.%s'
select get_format(time,'internal') ; -- '%H%i%s'

MySQL get_format() 函数在实际中用到机会的比较少。

  1. MySQL 拼凑日期、时间函数:makdedate(year,dayofyear), maketime(hour,minute,second)

select makedate(2001,31); -- '2001-01-31'
select makedate(2001,32); -- '2001-02-01'

select maketime(12,15,30); -- '12:15:30'

五、MySQL 时间戳(Timestamp)函数

  1. MySQL 获得当前时间戳函数:current_timestamp, current_timestamp()

mysql> select current_timestamp, current_timestamp();

current_timestampcurrent_timestamp()
2008-08-09 23:22:242008-08-09 23:22:24
  1. MySQL (Unix 时间戳、日期)转换函数:

unix_timestamp(),
unix_timestamp(date),
from_unixtime(unix_timestamp),
from_unixtime(unix_timestamp,format)

下面是示例:

select unix_timestamp(); -- 1218290027
select unix_timestamp('2008-08-08'); -- 1218124800
select unix_timestamp('2008-08-08 12:30:00'); -- 1218169800

select from_unixtime(1218290027); -- '2008-08-09 21:53:47'
select from_unixtime(1218124800); -- '2008-08-08 00:00:00'
select from_unixtime(1218169800); -- '2008-08-08 12:30:00'

select from_unixtime(1218169800, '%Y %D %M %h:%i:%s %x'); -- '2008 8th August 12:30:00 2008'

  1. MySQL 时间戳(timestamp)转换、增、减函数:

timestamp(date) -- date to timestamp
timestamp(dt,time) -- dt + time
timestampadd(unit,interval,datetime_expr) --
timestampdiff(unit,datetime_expr1,datetime_expr2) --

请看示例部分:

select timestamp('2008-08-08'); -- 2008-08-08 00:00:00
select timestamp('2008-08-08 08:00:00', '01:01:01'); -- 2008-08-08 09:01:01
select timestamp('2008-08-08 08:00:00', '10 01:01:01'); -- 2008-08-18 09:01:01

select timestampadd(day, 1, '2008-08-08 08:00:00'); -- 2008-08-09 08:00:00
select date_add('2008-08-08 08:00:00', interval 1 day); -- 2008-08-09 08:00:00

MySQL timestampadd() 函数类似于 date_add()。

select timestampdiff(year,'2002-05-01','2001-01-01'); -- -1
select timestampdiff(day ,'2002-05-01','2001-01-01'); -- -485
select timestampdiff(hour,'2008-08-08 12:00:00','2008-08-08 00:00:00'); -- -12

select datediff('2008-08-08 12:00:00', '2008-08-01 00:00:00'); -- 7

MySQL timestampdiff() 函数就比 datediff() 功能强多了,datediff() 只能计算两个日期(date)之间相差的天数。
六、MySQL 时区(timezone)转换函数

convert_tz(dt,from_tz,to_tz)

select convert_tz('2008-08-08 12:00:00', '+08:00', '+00:00'); -- 2008-08-08 04:00:00

时区转换也可以通过 date_add, date_sub, timestampadd 来实现。

select date_add('2008-08-08 12:00:00', interval -8 hour); -- 2008-08-08 04:00:00
select date_sub('2008-08-08 12:00:00', interval 8 hour); -- 2008-08-08 04:00:00
select timestampadd(hour, -8, '2008-08-08 12:00:00'); -- 2008-08-08 04:00:00

ProcessMaker 概念

原文在这,有些不好理解,翻译为简体,ProcessMaker实际上是比较适合中国人使用的工作流引擎,工作流引擎的比较将来结合使用经验会有个比较,计划将ProcessMaker结合进Thinkphp。

学习ProcessMaker的第一步,是了解ProcessMaker中使用到的一些名词。基本上,ProcessMaker是与BPMN相容的,许多定义也是与BPMN标准相同,若您使用过BPMN相容的流程工具,下面很多名词与观念应该可以很容易了解。

一 流程定义(Process)

一个流程(Process),可对应到一个业务流程,是一些工作阶段(Task)的集合,这些工作阶段有一个或多个输入与输出,流程的输出可能是一个有形的物品或服务

二 流程实例(Case)

一个桉件(Case),是流程定义的一个实例,一个商业桉件(Business Case)可以说是一个进行中的工作(Word in Progress)。一个桉件就是执行一个流程的过程。一个桉件从开始到结束都使用相同的桉件编号。

三 流程实例变量(Case Variables)

桉件变数是ProcessMaker桉件执行过程中存放资讯的特殊变数,只有在桉件执行的过程中才有效。在动态输入表格(Dynaform)中的每一个栏位,如textboxes, checkboxes, dropdown boxes与grid objects等,都有一个相关的桉件变数,与该栏位名称相同,且会存放使用者在栏位中输入的值。当使用者在Dynaform中按下Submit按钮(或"下一步"连结)后,每个栏位对应的桉件变数就会被建立用来存放输入的值。

四 节点定义(Task)

一个关卡(Task)是一系列有相同目的的工作步骤(Steps)的组合。而关卡的集合形成一个流程。一个关卡(Task)与一个活动(activity)有点不同,一个活动(activity)是一个关卡(Task)的实例。关卡相对与活动就类似流程相对于桉件。 关卡与流程是定义,活动与桉件是实例(实际进行的工作)。

五 动态表格-节点视图(Dynaform)

Dynaform也称为Dynamic Forms,是在ProcessMaker中设计客製的输入表格,用来在桉件执行过程中与使用者互动的界面。Dynaform让使用者以图形化的界面查看与输入资料,在设计上,对任何使用者应该要直觉好用。

六 业务表单(Master Dynaform)

主动态表格用来呈现单笔记录,栏位预设是垂直排列的。 主动态表格是独立的表格,不可以嵌入到其它的表格中。

七 框格(Grid)

框格表格(Grid Form)用来呈现多笔记录,每一笔记录的栏位以水平方向排列,一笔记录一列。Grid form也可以使用特殊的彙整功能,如合计(sum)来进行特定栏位的加总计算。

八 插件(Plugin)

插件用来增加ProcessMaker额外的功能,或客製化界面与资料库。

九 流程图(Process Map)

流程图是商业流程各工作阶段与引导法则(如上个工作阶段到下个工作阶段的条件)的视觉表示法. Admin可以直接从流程图增加新的或修改现有的桉件与引导法则。

十 权限(Permissions)

赋予使用者或群组存取ProcessMaker特定元件(如文件,Dashboard, Case Notes)的法则(rule)。

十一 流程权限(Process Permissions)

流程权限用来给予使与者或群组对桉件或桉件中的物件(如DynaForms, Input Documents and Output Documents)唯读的权限 . 预设只有流程指定的使用者可以开启相关个桉. 为了允许其他使用者可以看到(但不能变更)桉件中的资料, 可以指定流程权限 给这些使用者. 流程权限也提供进阶的控制功能,设定其他使用者可以查看的是某些特定关卡的资讯.

十二 流程总管(Process Supervisor)

一个流程的流程总管有权检视该流程所有的桉件(Cases)。 通常一个组织的经理或部门主管会被指定为某个流程的总管。流程总管可以给定所有个桉读与写的权限。

十三 角色(Roles)

角色包含对ProcessMaker中特定范围,特定功能的权限。基本上ProcessMaker包含三种角色 PROCESSMAKER_ADMIN, PROCESSMAKER_MANAGER和PROCESSMAKER_OPERATOR, 这些角色可以设定存取 ADMIN 选单, Users tab等功能的权限.

十四 步骤(Steps)

一个步骤(Steps)是一个清楚定义的动作(action)。可能是人工的动作或自动化的动作。 一个关卡(Task)由一个或多个步骤所组成。例如: 上传一份文件,填写一个Dynaform, 下载一份PDF or DOC文件。

十五 事件(Events)

流程中多数的动作是由使用者手动执行。但某些动作需要在特定的时间执行. 在ProcessMaker中, 事件(events) 就是在一个工作阶段或一系列的工作阶段开始或结束时才能执行的行动(actions) , 因此事件需要排程器cron做正确的设定. 因为事件与工作阶段的运作紧密相关, 它们只有在工作阶段尚未结束时才能执行. 如果选定的工作已经完成(或这个个桉被暂停/取消或删除),这事件就不会执行.

事件可能是传送邮件讯息或执行一个trigger. 2.0版后增加了第三个事件"条件事件", 条件事件根据特定桉件的状态来执行. 注: 事件必须从第二个关卡以后(含)才能执行。

/* * @Author: your name * @Date: 2016-09-06 00:00:00 * @LastEditTime: 2020-03-17 18:29:35 * @LastEditors: Please set LastEditors * @Description: In User Settings Edit * @FilePath: \htdocs\usr\themes\default\footer.php */