精华内容
下载资源
问答
  • 从事技术类岗位很多。了解这个行业的细小规则和模式。一直觉得没有一家比较好的公司能提供一个能适合这个行业的应用软件。 一直都有一个想法。提供一种更好的应用。能满足不同客户的不同需求。无奈自身纯技术...
  • Spring是一个开源框架,Spring是于2003 兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的...
    
    

        Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架。

    特点:

    1.方便解耦,简化开发
    通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。有了Spring,用户不必再为单实例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。
    2.AOP编程的支持
    通过Spring提供的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。
    3.声明事物的支持
    在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量。
    4.方便程序的测试
    可以用非容器依赖的编程方式进行几乎所有的测试工作,在Spring里,测试不再是昂贵的操作,而是随手可做的事情。例如:Spring对Junit4支持,可以通过注解方便的测试Spring程序。
    5.方便集成各种优秀框架
    Spring不排斥各种优秀的开源框架,相反,Spring可以降低各种框架的使用难度,Spring提供了对各种优秀框架(如Struts,Hibernate、Hessian、Quartz)等的直接支持。
    6.降低Java EE API的使用难度
    Spring对很多难用的Java EE API(如JDBC,JavaMail,远程调用等)提供了一个薄薄的封装层,通过Spring的简易封装,这些Java EE API的使用难度大为降低。
    7.Java 源码是经典学习范例
    Spring的源码设计精妙、结构清晰、匠心独用,处处体现着大师对Java设计模式灵活运用以及对Java技术的高深造诣。Spring框架源码无疑是Java技术的最佳实践范例。如果想在短时间内迅速提高自己的Java技术水平和应用开发水平,学习和研究Spring源码将会使你收到意想不到的效果。
    好处:
    在我们进入细节以前,让我们看一下Spring可以给一个工程带来的一些好处:
    Spring能有效地组织你的中间层对象,无论你是否选择使用了EJB。如果你仅仅使用了Struts或其他的包含了J2EE特有APIs的framework,你会发现Spring关注了遗留下的问题。Spring能消除在许多工程上对Singleton的过多使用。根据我的经验,这是一个主要的问题,它减少了系统的可测试性和面向对象特性。
    Spring能消除使用各种各样格式的属性定制文件的需要,在整个应用和工程中,可通过一种一致的方法来进行配置。曾经感到迷惑,一个特定类要查找迷幻般的属性关键字或系统属性,为此不得不读Javadoc乃至源编码吗?有了Spring,你可很简单地看到类的JavaBean属性。倒置控制的使用(在下面讨论)帮助完成这种简化。
    Spring能通过接口而不是类促进好的编程习惯,减少编程代价到几乎为零。
    Spring被设计为让使用它创建的应用尽可能少的依赖于他的APIs。在Spring应用中的大多数业务对象没有依赖于Spring。
    使用Spring构建的应用程序易于单元测试。
    Spring能使EJB的使用成为一个实现选择,而不是应用架构的必然选择。你能选择用POJOs或local EJBs来实现业务接口,却不会影响调用代码。
    Spring帮助你解决许多问题而无需使用EJB。Spring能提供一种EJB的替换物,它们适于许多web应用。例如,Spring能使用AOP提供声明性事务而不通过使用EJB容器,如果你仅仅需要与单个的数据库打交道,甚至不需要JTA实现。
    Spring为数据存取提供了一致的框架,不论是使用JDBC或O/R mapping产品(如Hibernate)。
    Spring确实使你能通过最简单可行的解决办法解决你的问题。这些特性是有很大价值的。
    总结起来,Spring有如下优点:
    1.低侵入式设计,代码污染极低
    2.独立于各种应用服务器,基于Spring框架的应用,可以真正实现Write Once,Run Anywhere的承诺
    3.Spring的DI机制降低了业务对象替换的复杂性,提高了组件之间的解耦
    4.Spring的AOP支持允许将一些通用任务如安全、事务、日志等进行集中式管理,从而提供了更好的复用
    5.Spring的ORM和DAO提供了与第三方持久层框架的良好整合,并简化了底层的数据库访问
    6.Spring并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部
    简单理解

    一.概念:
    1. spring是开源的轻量级框架

    2 spring核心主要两部分:

    (1)aop:面向切面编程,扩展功能不修改源代码实现,详解【http://www.cnblogs.com/landeanfen/p/4782370.html】

    (2)ioc:控制反转

        比如有一个类,在类里面有方法(不是静态的方法),调用类里面的方法,创建类的对象,使用对象调用方法,创建类对象的过程,需要new出来对象, 把对象的创建不是通过new方式实现,而是交给spring配置创建类对象。

        我用通俗的话给你解释把。首先你不用框架不是每次创建对象都要用关键字“new”呢?对吧。有了spring配置就不用new了,直接拿。举个例子:假如你吃饭,每次你要吃饭时都要自己准备碗和筷子,每次都要自己准备,用了框架后,再 吃饭你只要吃就行了,就不用准备碗和筷子了因为spring已经给你准备好了。这样是不是很方便。     spring主要就是不用你自己创建对象,都配置在配置文件中。如果你写好一个项目,你再a类中创建了b类的方法,c类也创建了b类的方法,如果那天要改b类的类名,你就要在a和c中都改,如果有100个类都用了b类呢?那你不是要改死哦!! 如果用了spring,你只要修改配置文件一个位置就好了,是不是很方便维护呢。所以,小项目用不着spring框架。手打好累。。。
    ioc:控制反转
    
    
    

        ioc的思想最核心的地方在于,资源不由使用资源的双方管理,而由不使用资源的第三方管理,这可以带来很多好处。第一,资源集中管理,实现资源的可配置和易管理。第二,降低了使用资源双方的依赖程度,也就是我们说的耦合度。

    也就是说,甲方要达成某种目的不需要直接依赖乙方,它只需要达到的目的告诉第三方机构就可以了,比如甲方需要一双袜子,而乙方它卖一双袜子,它要把袜子卖出去,并不需要自己去直接找到一个卖家来完成袜子的卖出。它也只需要找第三方,告诉别人我要卖一双袜子。这下好了,甲乙双方进行交易活动,都不需要自己直接去找卖家,相当于程序内部开放接口,卖家由第三方作为参数传入。甲乙互相不依赖,而且只有在进行交易活动的时候,甲才和乙产生联系。反之亦然。这样做什么好处么呢,甲乙可以在对方不真实存在的情况下独立存在,而且保证不交易时候无联系,想交易的时候可以很容易的产生联系。甲乙交易活动不需要双方见面,避免了双方的互不信任造成交易失败的问题。因为交易由第三方来负责联系,而且甲乙都认为第三方可靠。那么交易就能很可靠很灵活的产生和进行了。

    这就是ioc的核心思想。生活中这种例子比比皆是,支付宝在整个淘宝体系里就是庞大的ioc容器,交易双方之外的第三方,提供可靠性可依赖可灵活变更交易方的资源管理中心。另外人事代理也是,雇佣机构和个人之外的第三方。

    
    

    控制反转( Inversion of Control ), 我觉得有必要先了解软件设计的一个重要思想:依赖倒置原则(Dependency Inversion Principle )

    什么是依赖倒置原则?假设我们设计一辆汽车:先设计轮子,然后根据轮子大小设计底盘,接着根据底盘设计车身,最后根据车身设计好整个汽车。这里就出现了一个“依赖”关系:汽车依赖车身,车身依赖底盘,底盘依赖轮子。

    <img src="https://pic4.zhimg.com/50/v2-c68248bb5d9b4d64d22600571e996446_hd.jpg" data-caption="" data-rawwidth="1562" data-rawheight="186" class="origin_image zh-lightbox-thumb" width="1562" data-original="https://pic4.zhimg.com/v2-c68248bb5d9b4d64d22600571e996446_r.jpg">

    这样的设计看起来没问题,但是可维护性却很低。假设设计完工之后,上司却突然说根据市场需求的变动,要我们把车子的轮子设计都改大一码。这下我们就蛋疼了:因为我们是根据轮子的尺寸设计的底盘,轮子的尺寸一改,底盘的设计就得修改;同样因为我们是根据底盘设计的车身,那么车身也得改,同理汽车设计也得改——整个设计几乎都得改!

    我们现在换一种思路。我们先设计汽车的大概样子,然后根据汽车的样子来设计车身,根据车身来设计底盘,最后根据底盘来设计轮子。这时候,依赖关系就倒置过来了:轮子依赖底盘, 底盘依赖车身, 车身依赖汽车。

    <img src="https://pic1.zhimg.com/50/v2-e64bf72c5c04412f626b21753aa9e1a1_hd.jpg" data-caption="" data-rawwidth="1504" data-rawheight="190" class="origin_image zh-lightbox-thumb" width="1504" data-original="https://pic1.zhimg.com/v2-e64bf72c5c04412f626b21753aa9e1a1_r.jpg">

    这时候,上司再说要改动轮子的设计,我们就只需要改动轮子的设计,而不需要动底盘,车身,汽车的设计了。

    这就是依赖倒置原则——把原本的高层建筑依赖底层建筑“倒置”过来,变成底层建筑依赖高层建筑。高层建筑决定需要什么,底层去实现这样的需求,但是高层并不用管底层是怎么实现的。这样就不会出现前面的“牵一发动全身”的情况。

    控制反转(Inversion of Control) 就是依赖倒置原则的一种代码设计的思路。具体采用的方法就是所谓的依赖注入(Dependency Injection)。其实这些概念初次接触都会感到云里雾里的。说穿了,这几种概念的关系大概如下:

    <img src="https://pic1.zhimg.com/50/v2-ee924f8693cff51785ad6637ac5b21c1_hd.jpg" data-caption="" data-rawwidth="1398" data-rawheight="630" class="origin_image zh-lightbox-thumb" width="1398" data-original="https://pic1.zhimg.com/v2-ee924f8693cff51785ad6637ac5b21c1_r.jpg">

    为了理解这几个概念,我们还是用上面汽车的例子。只不过这次换成代码。我们先定义四个Class,车,车身,底盘,轮胎。然后初始化这辆车,最后跑这辆车。代码结构如下:

    <img src="https://pic3.zhimg.com/50/v2-8ec294de7d0f9013788e3fb5c76069ef_hd.jpg" data-caption="" data-rawwidth="512" data-rawheight="717" class="origin_image zh-lightbox-thumb" width="512" data-original="https://pic3.zhimg.com/v2-8ec294de7d0f9013788e3fb5c76069ef_r.jpg">

    这样,就相当于上面第一个例子,上层建筑依赖下层建筑——每一个类的构造函数都直接调用了底层代码的构造函数。假设我们需要改动一下轮胎(Tire)类,把它的尺寸变成动态的,而不是一直都是30。我们需要这样改:

    <img src="https://pic4.zhimg.com/50/v2-64e8b19eeb70d9cf87c27fe4c5c0fc81_hd.jpg" data-caption="" data-rawwidth="534" data-rawheight="154" class="origin_image zh-lightbox-thumb" width="534" data-original="https://pic4.zhimg.com/v2-64e8b19eeb70d9cf87c27fe4c5c0fc81_r.jpg">

    由于我们修改了轮胎的定义,为了让整个程序正常运行,我们需要做以下改动:

    <img src="https://pic1.zhimg.com/50/v2-82e0c12a1b26f7979ed9241e169affda_hd.jpg" data-caption="" data-rawwidth="1186" data-rawheight="1452" class="origin_image zh-lightbox-thumb" width="1186" data-original="https://pic1.zhimg.com/v2-82e0c12a1b26f7979ed9241e169affda_r.jpg">

    由此我们可以看到,仅仅是为了修改轮胎的构造函数,这种设计却需要修改整个上层所有类的构造函数!在软件工程中,这样的设计几乎是不可维护的——在实际工程项目中,有的类可能会是几千个类的底层,如果每次修改这个类,我们都要修改所有以它作为依赖的类,那软件的维护成本就太高了。

    所以我们需要进行控制反转(IoC),及上层控制下层,而不是下层控制着上层。我们用依赖注入(Dependency Injection)这种方式来实现控制反转。所谓依赖注入,就是把底层类作为参数传入上层类,实现上层类对下层类的“控制”。这里我们用构造方法传递的依赖注入方式重新写车类的定义:

    <img src="https://pic1.zhimg.com/50/v2-c920a0540ce0651003a5326f6ef9891d_hd.jpg" data-caption="" data-rawwidth="1338" data-rawheight="1424" class="origin_image zh-lightbox-thumb" width="1338" data-original="https://pic1.zhimg.com/v2-c920a0540ce0651003a5326f6ef9891d_r.jpg">

    这里我们再把轮胎尺寸变成动态的,同样为了让整个系统顺利运行,我们需要做如下修改:

    <img src="https://pic4.zhimg.com/50/v2-99ad2cd809fcb86dd791ff7f65fb1779_hd.jpg" data-caption="" data-rawwidth="1344" data-rawheight="1424" class="origin_image zh-lightbox-thumb" width="1344" data-original="https://pic4.zhimg.com/v2-99ad2cd809fcb86dd791ff7f65fb1779_r.jpg">

    看到没?这里我只需要修改轮胎类就行了,不用修改其他任何上层类。这显然是更容易维护的代码。不仅如此,在实际的工程中,这种设计模式还有利于不同组的协同合作和单元测试:比如开发这四个类的分别是四个不同的组,那么只要定义好了接口,四个不同的组可以同时进行开发而不相互受限制;而对于单元测试,如果我们要写Car类的单元测试,就只需要Mock一下Framework类传入Car就行了,而不用把Framework, Bottom, Tire全部new一遍再来构造Car。

    这里我们是采用的构造函数传入的方式进行的依赖注入。其实还有另外两种方法:Setter传递接口传递。这里就不多讲了,核心思路都是一样的,都是为了实现控制反转

    <img src="https://pic1.zhimg.com/50/v2-861683acac47577c81f2b7493dd05649_hd.jpg" data-caption="" data-rawwidth="924" data-rawheight="298" class="origin_image zh-lightbox-thumb" width="924" data-original="https://pic1.zhimg.com/v2-861683acac47577c81f2b7493dd05649_r.jpg">

    看到这里你应该能理解什么控制反转和依赖注入了。那什么是控制反转容器(IoC Container)呢?其实上面的例子中,对车类进行初始化的那段代码发生的地方,就是控制反转容器。

    <img src="https://pic4.zhimg.com/50/v2-c845802f9187953ed576e0555f76da42_hd.jpg" data-caption="" data-rawwidth="1422" data-rawheight="628" class="origin_image zh-lightbox-thumb" width="1422" data-original="https://pic4.zhimg.com/v2-c845802f9187953ed576e0555f76da42_r.jpg">

    显然你也应该观察到了,因为采用了依赖注入,在初始化的过程中就不可避免的会写大量的new。这里IoC容器就解决了这个问题。这个容器可以自动对你的代码进行初始化,你只需要维护一个Configuration(可以是xml可以是一段代码),而不用每次初始化一辆车都要亲手去写那一大段初始化的代码。这是引入IoC Container的第一个好处。

    IoC Container的第二个好处是:我们在创建实例的时候不需要了解其中的细节。在上面的例子中,我们自己手动创建一个车instance时候,是从底层往上层new的:

    <img src="https://pic2.zhimg.com/50/v2-555b2be7d76e78511a6d6fed3304927f_hd.jpg" data-caption="" data-rawwidth="2430" data-rawheight="168" class="origin_image zh-lightbox-thumb" width="2430" data-original="https://pic2.zhimg.com/v2-555b2be7d76e78511a6d6fed3304927f_r.jpg">

    这个过程中,我们需要了解整个Car/Framework/Bottom/Tire类构造函数是怎么定义的,才能一步一步new/注入。

    而IoC Container在进行这个工作的时候是反过来的,它先从最上层开始往下找依赖关系,到达最底层之后再往上一步一步new(有点像深度优先遍历):

    <img src="https://pic3.zhimg.com/50/v2-24a96669241e81439c636e83976ba152_hd.jpg" data-caption="" data-rawwidth="2522" data-rawheight="354" class="origin_image zh-lightbox-thumb" width="2522" data-original="https://pic3.zhimg.com/v2-24a96669241e81439c636e83976ba152_r.jpg">

    这里IoC Container可以直接隐藏具体的创建实例的细节,在我们来看它就像一个工厂:

    <img src="https://pic2.zhimg.com/50/v2-5ca61395f37cef73c7bbe7808f9ea219_hd.jpg" data-caption="" data-rawwidth="2448" data-rawheight="524" class="origin_image zh-lightbox-thumb" width="2448" data-original="https://pic2.zhimg.com/v2-5ca61395f37cef73c7bbe7808f9ea219_r.jpg">

    我们就像是工厂的客户。我们只需要向工厂请求一个Car实例,然后它就给我们按照Config创建了一个Car实例。我们完全不用管这个Car实例是怎么一步一步被创建出来。

    实际项目中,有的Service Class可能是十年前写的,有几百个类作为它的底层。假设我们新写的一个API需要实例化这个Service,我们总不可能回头去搞清楚这几百个类的构造函数吧?IoC Container的这个特性就很完美的解决了这类问题——因为这个架构要求你在写class的时候需要写相应的Config文件,所以你要初始化很久以前的Service类的时候,前人都已经写好了Config文件,你直接在需要用的地方注入这个Service就可以了。这大大增加了项目的可维护性且降低了开发难度。

    展开全文
  • CocosCreator游戏开发框架(一):是什么 && 为什么

    万次阅读 多人点赞 2019-07-07 17:11:49
    从微信小游戏出生(2018初)到现在,已经使用CocosCreator一年多了(之前做手游主要是cocos2d-x+lua),趁着这段时间有空,想着整理出一个基于CocosCreator游戏开发框架。 这个框架主要是将我在开发过程中觉得好用...

    写在前面


    从微信小游戏出生(2018年初)到现在,已经使用CocosCreator一年多了(之前做手游主要是cocos2d-x+lua),趁着这段时间有空,想着整理出一个基于CocosCreator游戏开发框架

    这个框架主要是将我在开发过程中觉得好用的结构和模式、插件,以及在论坛上和博客上参考大神们的教程和想法(有些是直接拿来用),整合在一起的。一方面想提高开发效率,另一方面大家发现问题及时提出及时讨论,慢慢优化和改进。

    框架工程是否跟游戏工程分开

    在开始之前,因为这个问题纠结了好久。框架工程跟游戏工程分离,框架工程作为一个独立代码库,仅仅作为游戏工程的子模块,这样代码库可以统一管理。

    我上个项目就是这样做的,但是你会发现,把框架模块单独拿出来给下一个项目复用,里面有一些耦合了游戏工程的代码。如果要每个成员在紧张的游戏开发过程中保持清醒,去保持框架模块的独立性,肯定是一个蛋疼的过程。

    后来阅读了两篇文章(关于游戏设计模式的)之后,确定了该框架仅仅作为一个“纯净”的基础框架,每开一个新项目就拷贝过去,然后根据游戏的需求自己去调整。

    两篇文章的链接在下面,有兴趣的可以了解下,不扯远了,准备进入正题!

    【游戏设计模式】之一 序言:架构,性能与游戏

    为什么在游戏开发中我不喜欢用MVC系列模式了




    正文


    目录细分和规划

    如下图:

    • animClip:存放动画文件(.anim)
    • font:存放字体文件
    • prefab:存放不需要动态加载的预制体
    • texture:存放用于贴图资源
    • texture/ui_common:存放公用的ui资源图集文件。
    • texture/ui_module:每个功能/模块单独用到的资源打包后的图集文件,比如main场景单独用到的打包一起,然后mian场景勾选自动释放资源,切换场景时就会自动释放没用的资源(前提是没有被其他的地方引用到)。
    • resources:存放一切需要用于动态加载(cc.load.loadRes)的资源

    为什么有些资源放在resources里面,有些放到外面?

    先看官网的解释:

    总结一下:

    1、resources文件夹中的资源可以跟它外部的其他资源,相互引用,所以放哪,问题不大。
    2、只有放在resources文件夹的资源才能用cc.loader.loadRes动态加载。
    3、构建时,resources文件夹中的所有资源连同它们关联依赖的resources文件夹外部的资源,都会被导出,并且项目中无用的资源将会在构建的过程中自动剔除。
    4、resources文件夹的资源,会增大包体和settings.js的大小,JSON的自动合并策略也将受到影响,无法尽可能将零碎的JSON合并起来。




    框架模块介绍


    # 配置表模块

    直接在现有的插件excel-killer的基础上做了小调整。

    • 相关目录(可以根据需求自己改动,相关文件:packages/excel-killer/panel/index.js)

    plugins-excel/excel:存放excel表

    plugins-excel/excel-ouput: 存放执行插件后的js输出文件

    assets/script/data/config: 执行插件后,会自动把js文件从plugins-excel/excel-ouput拷贝到此目录


    • 如何使用
    let cfgman = require('CfgMan');
    console.log(cfgman[1].name);  // 小明
    



    # 数据模块

    • 目录结构

    IDataModel.ts:数据模块基类,主要功能:读取数据表、读写本地缓存数据、网络数据交互


    • 本地缓存数据接口

    LoadStorage():将该模块的本地缓存数据读取到内存

    Query(sKey: string, defaultValue: any = null):访问指定键名的值

    Set(sKey: string, value: string | number):设置指定键名的值

    Save():保存内存数据到缓存文件


    • 网络数据交互接口

    sendProtocolMsg(msg):发送协议到服务端

    registerListeners():注册网络监听事件,需要在getMessageListeners()定义需要监听的协议和方法

    // AccountModel.ts
    getMessageListeners() {
        return {
            // key:消息名,value:执行函数
            ['G2C_Login']: (msg) => { this.G2C_LoginSuccess(msg) },
        }
    }
    



    # UI模块

    • 目录结构

    UIMng:UI管理器,用于打开、关闭UI

    UIBase:UI界面基类,在这里可以定义一些通用方法,供子类调用或者继承

    UIHelp:UI工具类,封装一系列UI相关的功能方法


    • 如何使用(配合自动化插件)

    1、新建一个场景或者prefab

    2、选中,然后到工具栏:扩展 -> ui-creator

    create-node-tree操作:将prefab节点树的结构自动导出到ts文件(目标文件夹:assets/script/data/autoui)

    export default class auto_notice extends cc.Component {
    const { ccclass } = cc._decorator;
    
    @ccclass
    export default class auto_notice extends cc.Component {
    	notice: cc.Node;
    	background: cc.Node;
    	title: cc.Node;
    	content: cc.Node;
    	btnClose: cc.Node;
    
    	public static URL:string = "db://assets/resources/prefab/notice/notice.prefab"
    
        onLoad () {
    		this.notice = this.node
    		this.background = this.notice.getChildByName("background");
    		this.title = this.notice.getChildByName("title");
    		this.content = this.notice.getChildByName("content");
    		this.btnClose = this.notice.getChildByName("btnClose");
    
        }
    }
    
    

    以后,你想要使用ui节点,就不需要各种getChildByName,或者搞个property在编辑器拖,所有的节点都导出在一个ts文件,然后作为一个组件添加到UI文件中,你只需要this.ui[节点名称]即可访问。

    create-ui-template操作:自动生成UI模板TS文件

    UI模板在packages\ui-creator\core\ui-template.txt中定义。

    3、将第2步create-ui-template操作生成的UI脚本文件,在编辑器拖到prefab的根节点作为组件

    4、UI的基本操作都封装在UIHelp中

    UIHelp.ShowUI(UINotice);    // 打开ui
    UIHelp.CloseUI(UINotice);   // 关闭ui
    UIHelp.SetLabel(this.ui.title, '测试公告标题'); // 修改label节点文本
    

    • TODO

    后续补充关闭UI清除相关无用资源


    • 这里说一下对于UI的一些想法和见解

    1、MVC模式。在框架中,每一个功能创建一个model类继承IDataModel,用于处理数据(配置表、本地数据、网络数据)。新建的prefab就是view,挂载在prefab的脚本组件就是controller,在controller实现功能逻辑。

    2、很多人在用CocosCreator开发时,经常会往节点上挂脚本,往按钮上绑定事件(看过好多github上的项目都是这样)。但我个人是很不建议这样做的,正常的团队开发合作中都是分工明确的,比如你在编辑器中用按钮绑定事件,难道美术修改的时候还要关心代码么。而且任意节点都可以挂脚本,这个真的有点“灾难性”,我要找在这个脚本在哪里用到的时候还要去编辑器一个个找么(可能有其他快速查找的方法,我不知道的,请指点一下)。

    3、所以我是比较支持,能用代码实现的尽量用代码实现,脚本文件能挂在根节点(方便找)的尽量挂在根节点。




    # 网络模块

    数据协议用Protobufjs,网络协议用WebSocket

    • Protobufjs(用的是5.x)

    1、安装nodejs、npm

    2、到新建的cocoscreator工程目录,初始化项目:执行npm init -y

    3、安装protobufjs5.x版本:执行npm install --save-dev protobufjs@5

    4、覆盖原protobuf的loadProtoFile方法

    protobuf原来的loadProtoFile方法:

    ProtoBuf.loadProtoFile = function(filename, callback, builder) {
        if (callback && typeof callback === 'object')
            builder = callback,
            callback = null;
        else if (!callback || typeof callback !== 'function')
            callback = null;
        if (callback)
            return ProtoBuf.Util.fetch(typeof filename === 'string' ? filename : filename["root"]+"/"+filename["file"], function(contents) {
                if (contents === null) {
                    callback(Error("Failed to fetch file"));
                    return;
                }
                try {
                    callback(null, ProtoBuf.loadProto(contents, builder, filename));
                } catch (e) {
                    callback(e);
                }
            });
        var contents = ProtoBuf.Util.fetch(typeof filename === 'object' ? filename["root"]+"/"+filename["file"] : filename);
        return contents === null ? null : ProtoBuf.loadProto(contents, builder, filename);
    };
    

    这里用了ProtoBuf.Util.fetch来读文件,所以需要重写loadProtoFile方法,用cc.loader.loadRes代替Util.fetch方法来读取文件:

    let ProtoBuf = require('protobufjs');
    ProtoBuf.Util.IS_NODE = cc.sys.isNative;
    // 此方法是将ProtoBuf.Util.fetch函数替换成cc.loader.loadRes函数,以解决在微信小游戏中不能使用XHR的问题
    ProtoBuf.loadProtoFile = function(filename, callback, builder) {
        if (callback && typeof callback === 'object')
            builder = callback,
            callback = null;
        else if (!callback || typeof callback !== 'function')
            callback = null;
        if (callback)
            return cc.loader.loadRes(typeof filename === 'string' ? filename : filename["root"]+"/"+filename["file"], function(error, contents) {
                if (contents === null) {
                    callback(Error("Failed to fetch file"));
                    return;
                }
                try {
                    callback(error, ProtoBuf.loadProto(contents, builder, filename));
                } catch (e) {
                    callback(e);
                }
            });
        var contents = cc.loader.loadRes(typeof filename === 'object' ? filename["root"]+"/"+filename["file"] : filename); 
        return contents === null ? null : ProtoBuf.loadProto(contents, builder, filename);
    };
    

    • WebSocket

    CocosCreator已经支持WebSocket,而如果是微信小游戏则用微信提供的WebSocket,具体查看:https://developers.weixin.qq.com/minigame/dev/api/network/websocket/wx.connectSocket.html

    工程中两种都实现了,其中浏览器平台已经测试过可行,并且提供了Nodejs服务端工程。


    • 目录结构

    ProtoBuf.ts:对protobufjs的修改和封装

    ProtoLoader.ts:用于加载proto文件

    Message.ts:proto msg的基类,并将msg缓存起来

    ProtoMessage.ts:插件根据proto文件生成的代码

    Socket.ts:WebSocket/WxSocket的具体实现

    SocketDelegate.ts:Socket代理类,根据具体平台创建socket,提供统一回调接口供具体Socket调用

    Network.ts:网络的逻辑实现,跟用户打交道,连接网络、关闭网络、登录流程、断网、重连都可以在这里处理


    • proto-killer插件

    将proto转成TS代码,在开发中会有编辑器智能提示。




    # 日志模块

    • 增加开关配置,每个大功能可以有一个开关,每个开发人员可以有一个开关,按需定义
    export const LOG_TAG = {
        SOCKET: { desc: 'LOG_SOCKET', isOpen: true },
        TEST: { desc: 'LOG_TEST', isOpen: false },
    }
    

    • 使用
    Log.log(LOG_TAG.SOCKET, 'socketprint');
    Log.warn('warn');
    Log.error('error');
    

    log方法第一个参数为开关分类,warn和error没有,因为我认为一般调试打印用log方法就够了,如果你用warn或error,肯定是需要所有人都知道的。




    # 事件模块

    EventMng.ts:事件分发我偷懒了,直接new一个cc.EventTarget来用,目前没有发现其他问题。




    # 其他

    GameController.ts:游戏全局控制类,比较杂的不知道放哪的可以看看能不能放这里

    GameDataCenter.ts:管理游戏各个模块数据

    global.d.ts:用于扩展基础模块

    utils文件夹:用于存放一些工具类





    最后


    这篇文章讲的主要是框架有什么东西,有些地方为何要这么设计,githu工程点这里

    看完有点懵逼?没关系,下篇文章是:CocosCreator游戏开发框架(二):怎么用

    我会在框架的基础上快速开发一个简单的客户端登陆系统,帮助大家快速上手。

    展开全文
  • 2016最流行的移动Web前端框架

    千次阅读 2017-04-22 22:07:49
    UI 是什么意思 ? 这是百度百科的定义:UI 即 User Interface( 用户界面)的简称。泛指用户的操作界面,UI 设计主要指界面的样式,美观程度。而使用上,对软件的人机交互、操作逻辑、界面美观的整体设计则是同样重要...

    最近,一直在做移动端 web 开发,记录一下使用的前端框架。

    目前使用过两个,一个是 Amaze UI,一个是 WeUI 。

    UI 是什么意思 ?

    这是百度百科的定义:UI 即 User Interface( 用户界面)的简称。泛指用户的操作界面,UI 设计主要指界面的样式,美观程度。而使用上,对软件的人机交互、操作逻辑、界面美观的整体设计则是同样重要的另一个门道。好的 UI 不仅是让软件变得有个性有品味,还要让软件的操作变得舒适、简单、自由,充分体现软件的定位和特点。

    UI 框架又是什么意思 ?

    UI 是用户界面的英文简称,那么 UI 框架又是什么呢?框架又可以理解为模板,UI 框架也就是 UI 模板。这和编程里的封装有些类似,就是说一些 UI 设计的常用效果已经被别人封装成了 UI 框架,你想实现哪个效果只要直接调用就行,不需要太纠结于底层实现。例如:一个提示框。


    以下转自知乎,地址如下: https://zhuanlan.zhihu.com/p/22707913 ,感谢原作者!


    2016年最流行的移动Web前端UI框架

    村长 村长
    7 个月前

    目前,众多互联网公司APP都嵌入了大量的HTML5,移动端的开发越来越重视,HTML5的运用场景也越来越多了。在移动Web开发的过程中,使用合适的移动WEB UI框架可以大大提升我们的开发效率。下面就把2016年最流行的移动Web前端UI框架分享给大家。

    Amaze UI
    Amaze UI是一个轻量级(所有CSS和JS gzip后100kB左右)、Mobile first的前端框架, 基于开源社区流行前端框架编写。
    Amaze UI Github地址:GitHub - amazeui/amazeui: Amaze UI, a mobile-first and modular front-end framework.
    Amaze UI官网:Amaze UI | 中国首个开源 HTML5 跨屏前端框架

    Frozen UI
    Frozen UI 是一个简单易用,轻量快捷,为移动端服务的前端框架,专注于移动web的UI框架,基于腾讯手机QQ规范。
    Frozen UI Github地址:FrozenUI - 专注于移动web的UI框架

    SUI
    SUI是一套基于bootstrap开发的前端组件库,同时她也是一套设计规范。通过SUI,可以非常方便的设计和实现精美的页面。
    SUI官网:sui.taobao.org/

    ZUI
    ZUI是一个开源前端实践方案,帮助你快速构现代跨屏应用。
    ZUI Github地址:GitHub - easysoft/zui: ZUI is an HTML5 front UI framework.

    H-ui
    H-ui前端框架是在bootstrap的思想基础上基于 HTML、CSS、JAVASCRIPT开发的轻量级web前端框架,开源免费,简单灵活,兼容性好,满足大多数中国网站。
    H-ui Github地址:jackying (辉哥) · GitHub

    pure.css
    pure.css 一组小,响应CSS模块,您可以使用在每一个web项目
    pure.css Github地址:GitHub - yahoo/pure: A set of small, responsive CSS modules that you can use in every web project.

    UIkit
    UIkit是YOOtheme团队开发的一款轻量级、模块化的前端框架,可快速构建强大的前端web界面。UIKit使用的变量基于LESS,具有体积小、模块化、可轻松地自定义主题及响应式设计可在多种环境中使用等特点。UIkit中文网为广大国内开发者提供详尽的中文文档、代码实例等,帮助开发者快速掌握并使用这一框架。
    UIkit Github地址:GitHub - uikit/uikit: A lightweight and modular front-end framework for developing fast and powerful web interfaces.

    Bootstrap
    Bootstrap是Twitter推出的一个用于前端开发的开源工具包。它由Twitter的设计师Mark Otto和Jacob Thornton合作开发,是一个CSS/HTML框架。目前,Bootstrap最新版本为3.0 。Bootstrap中文网致力于为广大国内开发者提供详尽的中文文档、代码实例等,助力开发者掌握并使用这一框架。
    Bootstrap中文网:Bootstrap中文网

    拼图
    拼图号称中国版的Bootstrap,优秀的跨屏响应式布局前端开发框架(CSS框架),国内前端框架先驱及领导者,能自动适应电脑、平板、手机等设备,让web前端开发更简单、快速、便捷。
    拼图官网:pintuer.com/

    Plane UI
    Plane UI是一个构建 HTML5 应用的跨终端响应式前端界面框架及解决方案。
    Plane UI Github地址:Plane UI - HTML5 跨终端响应式前端界面框架

    Foundation
    Foundation 5是我们最快、最好的构建。多用的功能来帮助编写代码和学习比以往任何时候都要快。
    Foundation官网:Foundation | The most advanced responsive front-end framework in the world.

    mui
    mui是最接近原生APP体验的高性能框架。
    mui Github地址:GitHub - dcloudio/mui: 最接近原生APP体验的高性能框架

    WeUI
    WeUI是一套同微信原生视觉体验一致的基础样式库,由微信官方设计团队为微信 Web 开发量身设计,可以令用户的使用感知更加统一。包含button、cell、dialog、 progress、 toast、article、icon等各式元素。
    WeUI Github地址:GitHub - weui/weui: A UI library by WeChat official design team, includes the most useful widgets/modules in mobile web applications.

    Arale
    Arale 立足于支付宝的前端需求和国内前端社区,基于Sea.js和spm生态圈,致力发展小而美的前端模块架构,建立了一套从编码测试到部署的开发体系, 是一个开放、简单、易用的前端解决方案。Arale 模块均兼容于 IE6+ 以及 Chrome/Firefox/Safari/Opera 的最新稳定版。
    Arale官网:aralejs.org/

    Semantic UI
    Semantic UI 是一款语义化设计的前端开源框架,其功能强大,使用简单,为设计师和开发师提供可复用的完美设计方案。
    Semantic UI Github地址:GitHub - Semantic-Org/Semantic-UI-pt-br: Semantic dá poder a designers e desenvolvedores através da criação de um vocabulário comum para UI

    Jingle UI
    Jingle UI是一个基于html5、css3开发轻量级的移动webapp 框架,提供一些基本交互方式,常用的组件(scroll,actionsheet,sidemenu,toggle,push2refresh……),帮助您更方便的开发移动应用。
    Jingle UI Github地址:GitHub - shixy/Jingle: Jingle UI是一个基于html5、css3开发轻量级的移动webapp 框架,提供一些基本交互方式,常用的组件(scroll,actionsheet,sidemenu,toggle,push2refresh......),帮助您更方便的开发移动应用。

    CMUI
    CMUI 是一个专攻移动网页的 UI 框架,它提供了丰富的组件和简洁的接口,开箱即用。CMUI 帮助开发者摆脱样式细节和兼容性困扰,从而腾出更多精力投入到业务开发中。
    CMUI Github地址:GitHub - CMUI/CMUI: Lightweight UI solution for mobile web.
    以上是在长期工作中总结出来的移动WEB UI框架资源,大家可以根据自己的业务需求去选择合适的WEB UI框架。在此不评价任何一个框架的好坏,存在就有他的合理性,总有他适合的场景。感谢这些项目的贡献者,感谢开源力量!

    展开全文
  • 一:Vue是什么,怎么理解Vue Vue是一个基于MVVM模式数据驱动页面的框架,它将数据绑定在视图上。属于实现单页面应用的技术。.总结起来的几大特点: (1)简洁 (2) 轻量 (3)快速 (4) 数据驱动 (5) 模块友好...

    一:Vue是什么,怎么理解Vue

    Vue是一个基于MVVM模式数据驱动页面的框架,它将数据绑定在视图上。属于实现单页面应用的技术。.总结起来的几大特点:

    (1) 简洁 (2) 轻量 (3)快速 (4) 数据驱动 (5) 模块友好 (6) 组件化

    vue靠数据驱动双向绑定使我们开发页面更简单,开发者不需要手动的去修改dom。Vue通过数据双向绑定是一切变得更简单。它的数据驱动双向绑定,底层是通过Object.defineProperty() 定义的数据 set、get 函数原理实现。

    2、组件化开发,让项目的可拓展性、移植性更好,代码重用性更高。

    3、单页应用的体验,局部组件更新界面,让用户体验更快速省时。

    单页应用也称为SPA是将所有的活动局限于一个Web页面中,仅在该Web页面初始化时加载相应的HTML、JavaScript 和 CSS。加载完成,页面不在重新加载或跳转,仅仅是里面的组件或模块通过hash,或者history api来进行交互和跳转,并通过ajax拉取数据来实现响应功能,整个应用就一个html,所以叫单页面!

    4、js的代码无形的规范,团队合作开发代码可阅读性更高。

     

     

    二: Vue数据驱动(双向数据绑定)的原理?

    什么是数据驱动

    数据驱动是vue.js最大的特点。在vue.js中,所谓的数据驱动就是当数据发生变化的时候,用户界面发生相应的变化,开发者不需要手动的去修改dom

    比如说我们点击一个button,需要元素的文本进行是和否的切换。jquery中,对于页面的修改我们一般是这样的一个流程,我们对button绑定事件,然后获取文案对应的元素dom对象,然后根据切换修改该dom对象的文案值。

    那么vuejs是如何实现这种数据驱动的呢?

    vue实现数据双向绑定主要是:采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应监听回调。当把一个普通 Javascript 对象传给 Vue 实例来作为它的 data 选项时,Vue 将遍历它的属性,用 Object.defineProperty 将它们转为 getter/setter。用户看不到 getter/setter,但是在内部它们让 Vue 追踪依赖,在属性被访问和修改时通知变化。

    vue的数据双向绑定 将MVVM作为数据绑定的入口,整合Observer,Compile和Watcher三者,通过Observer来监听自己的model的数据变化,通过Compile来解析编译模板指令(vue中是用来解析 {{}}),最终利用watcher搭起observer和Compile之间的通信桥梁,达到数据变化 —>视图更新;视图交互变化(input)—>数据model变更双向绑定效果。

    getter/setter的理解?

    当打印出Vue实例下的data对象里的属性,它的每个属性都有两个相对应的get和set方法,顾名思义,get为取值,set为赋值,正常情况下,我们取值和赋值是用obj.prop的方式,但是这样做有一个问题,我如何知道对象的值改变了?所以就轮到set登场了。你可以把get和set理解为function,当我们调用对象的属性时,我们会进入到get.属性(){...}中,先判断对象是否有这个属性,如果没有,那麽就添加一个name属性,并给它赋值;如果有name属性,那就返回name属性。你可以把get看成一个取值的函数,函数的返回值就是它拿到的值。感觉比较重要的是set属性,当给实例赋值:此时,会进入set name(val){...};形参val就是我赋给name属性的值,在这个函数里,就可以做很多事了,比如双向绑定!因为这个值的每次改变都必须经过set,其他方式是改变不了它的,相当于一个万能的监听器。ES5的对象原型有两个新的属性__defineGetter__和__defineSetter__,专门用来给对象绑定get和set。建议使用下面这种方式,因为是在原型上书写,所以可以继承和重用。

     

     

    三:MVVM框架

    Vue.js的数据驱动就是通过MVVM这种框架来实现的。MVVM框架主要包含3个部分:model、view和 viewmodel。

    Model:指的是数据部分,对应到前端相当于javascript对象

    View:指的是视图部分,对应前端相当于dom

    Viewmodel:就是连接视图与数据的中间件通讯

     

    数据(Model)和视图(View)是不能直接通讯的,而是需要通过ViewModel来实现双方的通讯。当数据变化的时候,viewModel能够监听到这种变化,并及时的通知view做出修改。同样的,当页面有事件触发时,viewMOdel也能够监听到事件,并通知model进行响应。Viewmodel就相当于一个观察者,监控着双方的动作,并及时通知对方进行相应的操作。

     

     

     

    展开全文
  • android主流开发框架

    千次阅读 2019-05-12 13:21:50
    1.IBM华为合作项目0507--5熟悉主流的开发框架.
  • 这种方式在跨部门,跨公司合作的时候经常用到,并且方法的提供者我们通常称为:服务的暴露。 RPC与Socket有什么区别? 通过上面的简单阐述,好像RPC与Socket 好像啊。都是调用远程的方法,都是...
  • Bootstrap 框架 思维导图

    千次阅读 2016-10-16 21:22:12
    BootStrap简介 Bootstrap是Twitter推出的一个用于前端开发的开源工具包。它由Twitter的设计师Mark Otto和Jacob Thornton合作开发,是一个CSS/HTML框架 学习整理思维导图
  • 【菜鸟看框架】——浅谈EF框架

    万次阅读 热门讨论 2015-05-26 10:00:24
     在上一篇博客中说道在合作小组中接触到了很多新的知识,这些新的知识让我感到我们现在还是一只很弱小的菜 鸟,我们根本不知道外面的事物是多么的新鲜,在我们之外还有多少东西是需要我们好好学习的,所以现在...
  • 在华为全联接大会2018上,华为宣布将在3内发展100万AI开发者和合作伙伴,震惊全场! 而华为公司董事,战略Marketing总裁徐文伟并不认为这个目标过于宏大,在华为全联结大会2018第二天的媒体见面会上,他说“一百...
  • camunda bpmn框架溯源

    万次阅读 2020-06-16 16:18:25
    “在过去的几里,我们强烈鼓励合作的结果总是一样的:巨大的惊讶于一个项目是多么富有成效。”当it和业务肩并肩地在战略和操作级别(包括技术流程)定义目标状态流程时,技术流程可以在几天甚至几个小时内变为可执行...
  • 框架的概念与意义

    千次阅读 2017-02-28 14:27:18
    从字面意思理解,框架,就是带的架子,当然这样说有点简单了,它就像你的毛坯房,其实你想要的楼房已经做好了,但目前还不能住人,你想主人或者想要干超市,你还需要装修,你还需要设计里面的小细节,但大的房间结构,你无法...
  • Bootstrap框架-快速上手

    万次阅读 多人点赞 2015-02-15 21:20:36
    什么是 Bootstrap?Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架。由 Twitter 的 Mark Otto 和 Jacob Thornton 合作开发的一套HTML、CSS和JS框架。Bootstrap是基于HTML5和CSS3开发的,它在jQuery的...
  • 它由Twitter的设计师Mark Otto和Jacob Thornton合作开发,是一个CSS/HTML框架。Bootstrap提供了优雅的HTML和CSS规范,它即是由动态CSS语言Less写成。Bootstrap一经推出后颇受欢迎,一直是GitHub上的热门开源项目,...
  • 阿里分布式事务框架GTS开源了!

    万次阅读 多人点赞 2019-01-24 23:27:05
    FESCAR:2019开源基于TXC / GTS的开源项目FESCAR,以便与社区密切合作,共同成长。 更多阅读 史上最简单的 SpringCloud 教程汇总 SpringBoot教程汇总 Java面试题系列汇总 扫一扫,支持下...
  • Axure怎样制作内部框架

    千次阅读 热门讨论 2014-11-25 23:08:05
    最近做项目画原型,由于系统较大,所以原型需要团队合作,那么,怎样统一系统界面呢?做一个母版让大家复用?当然不是,Axure提供了一个内部框架,这样就可以把公共的部分作为首页,其他变化的界面放在内部框架里,...
  • 5套用bootstrap框架写的后台管理模板

    热门讨论 2014-09-17 18:09:27
    它由Twitter的设计师Mark Otto和Jacob Thornton合作开发,是一个CSS/HTML框架。Bootstrap提供了优雅的HTML和CSS规范,它即是由动态CSS语言Less写成。 这是5套用bootstrap框架写的后台管理模板,十分精美。
  • 最近因为项目需要,特地学习摸索了AXURE7.0 的各原始组件及功能。 特地分享如下(查看DEMO时,请将图片类型改成rp后缀): jiashi000001 1.05 huaxia000002 ...2.33
  • PDF.NET 开发框架

    万次阅读 热门讨论 2010-01-24 22:33:00
     本框架是总结多种数据处理框架的优点,去除其复杂性后的轻量级的数据处理,所以可能没有你熟知的下列重量级框架强大的功能。本框架的设计目标是 轻量,快速,通用,易学 ! Hibernate:借鉴了它的ORM...
  • HTML5 PC端框架

    万次阅读 2016-04-27 14:20:10
      1. Bootstrap ...它由Twitter的设计师Mark Otto和Jacob Thornton合作开发,是一个CSS/HTML框架。Bootstrap提供了优雅的HTML和CSS规范,Bootstrap的源代码是使用less编写的;基于jQuery框架开发,并在jQuer
  • Bootstrap前端框架之SuperUI(SuperMgr)

    万次阅读 2016-11-30 09:55:51
    最近一段时间都在学习前端---Bootstrap,今天我们就来说下Bootstrap的一些东西吧!  Bootstrap,来自 Twitter,是目前很受欢迎的前端...是由Twitter的设计师Mark Otto和Jacob Thornton合作开发,是一个CSS/HTML框架。
  • Laravel 框架中对Layer的使用

    千次阅读 2017-12-29 10:33:19
    其实很久前就接触到了 Layer 的使用,当时只是一位讲师的推荐,并且只应用了简单的弹出模块功能 近期发现开源作者一直在进行维护,并且注意到了拥有让人喜欢的LayUI设计风格,感觉之前真的是有点浪费了 不管他人...
  • Google自动编程框架AutoML入门指南

    万次阅读 多人点赞 2017-10-21 23:48:24
    本篇是和Kabuto_hui(ISN国家重点实验室成员)合作修改生成的,感谢Kabuto_hui。更多技术文章请访问,Kabuto_hui的csdn博客()链接:http://blog.csdn.net/kabuto_hui 导读 Google在AI First的战略下,陆续发布...
  • 50个极好的bootstrap 后台框架主题下载

    万次阅读 多人点赞 2016-07-06 18:53:16
    2016免费的50个WORDPRESS博客主题 2016/04/29 30 Apple关注GUI工具包,实物模型和模板免费 2016/03/30 30+免费的商务图标分享下载 2016/03/28 30+ 手机应用程序UI设计PSD素材免费下载 2016/03/28 免费...
  • 架构师之路(39)---IoC框架

    万次阅读 多人点赞 2009-03-08 19:04:00
    我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。 图1:软件系统中耦合的对象 如果我们打开机械式手表的后盖,就会...
  • 视频框架Vitamio学习

    万次阅读 多人点赞 2015-07-05 22:07:09
     VPlayer好像是这个框架的最佳产品,不过看到官网的一些合作伙伴,如果确实是用到这个框架的话,好像也很不错(可以反编译看看,学习学习~)  下面是农名伯伯开发教程实现的产品的源码(下载测试后,可以运行,...
  • TLD学习篇之算法框架

    千次阅读 2016-03-20 10:34:46
    首先,这里已经假设读者已经了解TLD(tracking,learning,detection)是什么,故不做背景介绍,若还不知道这是什么,请自行百度稍微了解,把TLD的源码也下载下来,大概浏览一遍再来观看本系列文章。本系列文章大概...
  • 初见bootstrap,iframe框架简单布局

    万次阅读 2017-08-17 19:13:29
    [1] 它由Twitter的设计师Mark Otto和Jacob Thornton合作开发,是一个CSS/HTML框架。 Bootstrap提供了优雅的HTML和CSS规范,它即是由动态CSS语言Less写成。 Bootstrap一经推出后颇受欢迎,一直是GitHub上的热门开源...
  • 解读:百度计算

    千次阅读 2017-11-14 16:06:00
    计算(Box-Computing)是20098月18日,百度董事长兼首席执行官李彦宏在2009百度技术创新大会上所提出的全新技术概念。 基本概念:用户只要在“搜索”中输入服务需求,系统就能明确识别这种需求,并将该需求...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 167,544
精华内容 67,017
关键字:

年框合作是什么