
12年电商经验,8年IT项目管理经验,曾就职于中国第一家上市的B2C电商公司麦考林,擅长电商业务模式规划以及大型电商系统架构。创立闪酷&酷客多小程序
为你揭露2018微信公开课pro的12个重点 1月15日,微信公开课Pro版现场,微信又为我们带来了一些重磅消息,小程序依旧是本次微信公开课Pro的绝对重点。小编为大家整理了公开课的12个重点,带大家直观了解公开课的核心内容。 1.微信重视小程序,未来小程序能够“让信息无处不在,随时可以访问到” 微信想要做一个更更大更具有优势的平台,让信息无处不在,随时可以访问成为一种信息技术的组织形式。 现在小程序可能只是通过扫描一个二维码,将来可能是通过眼镜或者感应就可以立即打开小程序,“这是真正能够做到所见即所得的事情,我们看到任何的事物可以立即打开小程序” 2. 去中心化:在微信的生态里,让用户自己找到有价值的服务,让用户自己选择,而不是中心化的平台推给用户。 微信只是一个提供服务的平台,微信希望让更有价值的服务自己能够浮现出来被用户找到,“我们也希望是一个“去中心化”的平台,我们把选择的权力交给用户自己来做。” 3. 小程序的入口:二维码和搜索,未来小程序是希望用户自己选择,会产生大量搜索习惯,微信通过开放搜一搜培养用户搜索习惯 与去年相比,微信最大的差别就是在于有“搜一搜”功能,虽然用户使用率在目前看来并不高,但搜一搜依旧是一个对微信十分重要的功能,“是能够搜到小程序的数据或者搜到小程序提供的服务,所以在未来,我们希望有更多的线上小程序的触达是通过搜索这样一个能力做到的。” 4. 不止于线上,正探索线下生活,线上与线下应用场景完美融合。 “最早的时候我们希望互联网能够帮助人们把生活搬到线上,更多的进行线上生活,包括这几年共享经济、智慧零售的发展,看起来都是把我们的生活引导到一个方向,就是线上生活。所以我们下一步在微信里,可能会去做跟线上相反的另外一个事情,就是探索线下这样一个事情。” 5. 小程序更加丰富了APP的用户场景,非常容易推广与用户触达。 “我们并不认为小程序是要来取代App的,相反小程序是要去丰富APP的很多场景。”小程序并是不APP的替代产物,而是一个对APP功能补全的一个选择,在许多场景里小程序能帮助用户获得更好的体验。 6. 不是用完即走,而是走了再回来,所以开放更多的用户返场入口。 “用完即走的本质是任何一个工具都是帮助用户完成一个任务,越高的效率越好。所以用完即走和用户再回来,其实并不矛盾”只有用户在使用工具时获得更高效更愉快的体验时,才会再一次使用这个工具,小程序就是这样的存在,尽可能的高效率帮助用户完成所需,他才会继续回来使用小程序。 7. 小程序日活1.7亿 覆盖一二三四行业,目前一二线和三四线城市覆盖占比各占50%。 “目前日使用小程序用户数达1.7亿,有一半用户分布于一线城市和二线城市,让我们可喜的是,三线城市和四线及以下城市的使用也很广泛。” 8.小程序已经上线58万,小程序开发从业人员100万。 “小游戏全面兼容和支持H5游戏,未来将面向企业开发者和个人开发者开放。小游戏也将作为H5游戏升级的平台,提供更便捷的访问入口,更强大的功能模块,与更简单的开发流程,展现去中心化、有规则、依靠关系链的游戏开放生态,为开发者提供更丰饶的发展土壤” 微信呼吁更多开发者加入小程序的开发行业,并降低开发门槛,优化开发功能,让更多开发者能够轻松完成小程序开发,整个小程序生态已经开始变得活跃起来。 9. 小程序丰富使用场景,给予零售场景赋能、营销赋能、社交赋能,完成购物、会员、社交的用户使用场景。 “2018年我们希望能做一些新的尝试,我认为探索线下的精彩生活,这是我们下一步想要尝试的一个方向。” 微信未来的方向将会着重于线下场景的交互,让用户在更多更丰富的场景上使用小程序获得更好的体验。 10. 95%的电商平台接入小程序,并且小程序产生受到用户欢迎的新场景-内容电商。 “95%的平台电商已接入小程序,如京东/拼多多/蘑菇街等,小程序建立了新的购物习惯;微信中的新场景——内容电商受到欢迎。” 越来越多的电商加入了小程序的行列,小程序已经卷起了新的购物习惯风潮,内容电商将在未来收到欢迎。 11. 生活服务和政务民生的小程序给予用户便捷的体验,提高用户体验。 “生活类服务小程序让用户马上得到,即点即用,提供了无限可能性,民生类小程序也让用户可以多办事,少跑腿。” 生活类小程序极大程度上方便了用户,各类生活小程序让用户可以在微信内就可以完成许多服务需要。 12. 小程序加载速度比H5有20%-30%的提升,用户打开速度更快,用户使用快感更强。 “小程序一年以来52周涵盖32次发布能力,共计100多项。降低门槛、充实能力、场景流量、提高转化、交易变现是核心关键词。在提高转化上,平均而言,小程序加载速度比H5至少有20%-30%的提升。” 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
2017年3月21日讯:备受瞩目的中国县域连锁药店发展峰会正式在武汉举行,酷客多小程序新零售O2O商城系统CEO郝宪玮作为峰会的特邀嘉宾,与各界医药服务商共赴中国县域连锁药店发展峰会,参与探讨农村和基层民众的健康问题,携手推动农村和基层健康领域的基本公共服务均等化。 与此,酷客多小程序期望与众多医药服务商一起合作,为医药行业向新零售转型提供互联网技术服务,助力医药行业从传统药店向智慧药店转型,推动大健康行业互联网时代产品服务模式的变革,共同创造未来全新的大健康产品,为身边的人带去健康关怀,为人类提供健康服务,使得医药企业在O2O领域迈出重要一步! 作为中国县域连锁药店发展峰会的特邀代表酷客多,是国内首家微信小程序互联网技术服务商,公司研发实力雄厚,其中90%为研发人员,可以更全面地帮助各大企业拥有专属的微信小程序新零售O2O商城系统,抢占流量红利、稳圈忠粉、快速变现,并且酷客多小程序新零售O2O商城系统具有快速构建、操作便捷、低成本、功能丰富、自主推广、获客便利、完善的购物流程等诸多优势,曾服务过大润发飞牛网、母婴之家,海航等几百家知名企业,协助企业以最低的成本,快速建立自己微信小程序商城和新零售O2O商城系统,为消费者提供更好的购物体验。酷客多将拥有100多个营销插件满足线下各种营销场景,为企业主营销和销售提供全生命周期管理。 未来酷客多也将会更加专注医药行业向“互联网+”新零售的转型,帮助医药服务商顺利打通线上线下服务渠道,提供一体化的小程序新零售商城解决方案,由内而外融入到互联网,逐步迈向新零售O2O领域,酷客多在小程序新零售O2O商城系统服务方面,优势都非常明显。 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
商户和企业主的又一次福音!酷客多小程序新零售o2o商城系统酷爱用户,为了追求极致的用户体验,没日没夜地沉浸于新功能的开发,经过一番努力,新功能终于上线啦! 此次版本迭代,在原有功能基础上做了大幅提升,板块明了,操作简单。这次功能,知道你们都很着急,闲话不说,咱们,开八! 此次版本主要新增了新增优惠券、模板切换、营销插件快捷入口三个模块 1、优惠券 通过前台页面点击进入到“领券中心”,就会出现领券中心的页面,领取相关优惠券。 新增优惠券模板,可以促进客户转化,轻松提高客单价 在这里可以对优惠券进行创建和管理 点击“添加优惠券”,输入优惠券的信息,可以创建优惠券 创建完成的优惠券可以在“编辑”中对优惠券的部分参数进行修改,也可以使优惠券失效 点击“领取明细”可以看到每一份优惠券的领取情况和适用情况 2、自由切换模板 可以帮助商户随时切换想要的模板 点击“首页模板”,即可切换想要的模板。需要注意的是切换后的首页模板数据会清空,需要重新添加首页数据 3、营销插件便捷入口 这对商户来说也是非常有帮助的,能够快速找到自己想要的功能,提高工作效率。 有了这些新功能,不仅能促进客户转化,提高客单价,还可以帮助客户迅速切换到想要的模板,快速找到所需的功能,再也不用浪费时间找各个入口了。 酷客多小程序新零售o2o商城系统最新V1.0.9版本,请至酷客多后台“店铺管理-下载小程序代码”下载最新代码,并通过开发者工具上传最新代码,然后提交给微信审核!如果您有任何问题,请与酷客多联系。 酷客多是国内首家微信小程序互联网技术服务商,公司研发实力雄厚,其中90%为研发人员,可以更全面地帮助各大企业拥有专属的微信小程序新零售O2O商城系统,抢占流量红利、稳圈忠粉、快速变现,曾服务过大润发飞牛网、母婴之家,海航等几百家知名企业,协助企业以最低的成本,快速建立自己微信小程序商城和新零售O2O商城系统,为消费者提供更好的购物体验。酷客多将拥有100多个营销插件满足线下各种营销场景,为企业主营销和销售提供全生命周期管理。 未来酷客多将会更加专注企业向“互联网+”新零售的转型,帮助线下企业顺利打通线上线下服务渠道,提供一体化的小程序新零售商城解决方案,由内而外融入到互联网,逐步迈向新零售O2O领域。因此无论是对于传统企业还是众多电商,酷客多在小程序新零售O2O商城系统服务方面,优势都非常明显。 酷客多小程序期望与众多本地化服务商一起合作,为本地化企业向新零售转型提供互联网技术服务。 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
我就不在普及小程序是什么东西了,随便一下度娘,随便翻下朋友圈你就秒懂了。我这里就用张小龙同学的话言简意赅的来解释: 小程序是一种不需要下载安装即可使用的应用,它实现了应用「触手可及」的梦想,用户扫一扫或者搜一下即可打开应用。也体现了「用完即走」的理念,用户不用关心是否安装太多应用的问题。应用将无处不在,随时可用,但又无需安装卸载。 看了这句话的人,可能大概明白了「小程序」这个产品要做什么,它提供的能力是什么。 早在2014腾讯全球合作伙伴大会上该团队就提出,要把微信打造成为一种无处不在的生活方式,在其追赶目标的路上联合更多第三方入驻平台是必然选择。 微信去中心化、碎片化、场景化三大特征,致使微信团队想要完成当初的理想,必然要抛弃中心控制的思维模式,构建生态吸引万千商家为主力军,共同服务几亿用户才是解决之道。 微信小程序的前景是显而易见的,这个大趋势这个大家心里都清楚,有节奏感的跟着这波趋势走不会错。但是如果想要开发一款自己的微信小程序商城,就绝对离不开一款功能强大的微信小程序商城系统。 通过网络搜索发现,闪酷是国内第一家发布微信小程序商城系统的互联网技术服务商,其研发的小程序商城系统「酷客多」,了解后确实不错。 大言不惭的说,不过当然也欢迎来拍砖,因为「酷客多」同时满足了两种人群的需求:完全不懂技术的小白和希望提高效率的程序猿。正因如此,这款微笑小程序商城系统才会在微信小程序还在公测阶段就能迅速在业内普及开来。接下来为大家深入分析一下「酷客多」的各种功能和优势。 1、快速建构,操作便捷: 零技术门槛,傻瓜式操作,只需扫二维码、无需下载即可运用程序。“阉割”APP,无需iOS及安卓应用开发,更高于H5用户体验。 简单来说,就是它相当于把需要代码的部分都帮你做好了,任何一个技术或者运营小白,通过「酷客多」就可以把小程序的每个模块搭建出来。无论是导航,菜单、按钮、列表……直接拖拽,选取功能模块就可以完成,所想即所得,非常省事。 2、低成本,节开支,易开发,便维护: 全SaaS端存储,数据安全有保障,支持Https加密传输,省去服务器和技术开发支出且维护成本极低。 且代码也可供下载,然后直接对接到小程序的开发工具。专业的程序员还可以进行二次开发,实现更多高级的功能。这样做省去了很多技术上的麻烦,为开发者提供了便利。 3、模版引擎自主定制: 弹性伸缩功能,根据自己产品特色自主设计、装修、选择功能等程序管理,电商模板居多。 「酷客多」为开发及运营者提供了大量的模板,可根据自己类目,产品特色自主选择,还有各种精美的案例。如果有喜欢的模板,可以直接点击套用,修改自己需要的内容即可。目前以各类电商模板居多,其他类别还在持续更新中。 4、功能强大完善的前端购物流程及后端管理体系: 拥有产品展示、下单、支付、营销、充值、会员体系、产品管理、订单管理等功能,一套简易便捷的购物管理流程,满足生意买卖需求; 「酷客多」强大的后台管理,可以实现动态数据绑定,这对小程序开发及运营者来说又是一个非常方便的功能。众所周知,微信小程序和App几乎是一样的。开发或运营者在后台直接进行修改操作,就可以让数据随时更新。这个功能极大简化了电商们和其他开发者们对数据的更新和管理的过程。 5、丰富的营销活动: 提供抽奖、打折、秒杀、团购、积分、红包、优惠券等工具,让营销服务多元化; 「酷客多」多元化的营销功能满足运营者的活动需求,精准的粉丝运营,新颖的活动运营,使你的营销不再赤裸裸,让你的老客实时“粘着你”。 6、分享推广,获客便利: 一键微信群、朋友圈,轻松将用户引导至自己的小程序,快速利用「酷客多」的微信小程序撬动流量金矿,实现快速推广,红利变现,高效转化。 「酷客多」的部分功能还在完善,但它确实是一款功能非常强大的微信小程序商城系统。一定是不懂技术不懂编程和希望省时省事的程序猿们的福音。也希望能让各位少走弯路,在最短的时间内开发符合规范的小程序。不要输在起跑线上,一起占领小程序大市场! 专业的开发培训课程预告(可预报名加入我们的team) 基于「酷客多」涉水小程序死磕的深度,作为小程序早期的研究者,充分为不懂技术的小白们考虑,推出了一套微信小程序开发培训课程。从最基本的操作方法到后期对接小程序后台,都有非常详细的教学和解析。 实时关注「闪酷」的官方微信公众号shankusoft,我们也在实时发布微信小程序开发技巧,全面剖析小程序。近期也将开放课程的报名入口。如果需要学习小程序开发的朋友欢迎围观。 「酷客多」微信小程序商城系统已开放内测通道,限邀请100名行业内外朋友报名一起内测。 点击以下链接赶紧免费体验下咯! http://g.eqxiu.com/s/3yIa9P0P 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
上一篇我们简单介绍了一下微信小程序的IDE(微信小程序购物商城系统开发系列-工具篇),相信大家都已经蠢蠢欲试建立一个自己的小程序,去完成一个独立的商城网站。 先别着急我们一步步来,先尝试下写一个自己的小demo. 这一篇文章我们主要的是介绍一下小程序的一些目录结构,以及一些语法,为我们后面的微信小程序商城系统做铺垫。 首先我们来了解下小程序的目录结构 Pages 我们新建的一些页面将保存在这个文件夹下面,每一个小程序页面是由同路径下同名的四个不同后缀文件的组成,如:index.js、index.wxml、index.wxss、index.json。.js后缀的文件是脚本文件,.json后缀的文件是配置文件,.wxss后缀的是样式表文件,.wxml后缀的文件是页面结构文件。 Utils 我们写的一些公共的工具js可以放里面。 app.js 是小程序的脚本代码。我们可以在这个文件中监听并处理小程序的生命周期函数、声明全局变量。调用框架提供的丰富的 API,如本例的同步存储及同步读取本地数据。 app.json 是对整个小程序的全局配置。我们可以在这个文件中配置小程序是由哪些页面组成,配置小程序的窗口背景色,配置导航条样式,配置默认标题。 { "pages":[ "pages/index/index", "pages/logs/logs" ], "window":{ "backgroundTextStyle":"light", "navigationBarBackgroundColor": "#fff", "navigationBarTitleText": "WeChat", "navigationBarTextStyle":"black" } } 注:app.json中是对整个小程序的全局设置,当然每个页面也有自己的json文件。每个页面下的json文件只能对window 进行设置,所以页面json文件下只需写入window的配置即可 { "backgroundTextStyle":"light", "navigationBarBackgroundColor": "#fff", "navigationBarTitleText": "WeChat", "navigationBarTextStyle":"black" } app.wxss 是整个小程序的公共样式表。我们可以在页面组件的 class 属性上直接使用 app.wxss 中声明的样式规则。 每个页面中也可以定义自己的wxss。Wxss也就是微信所提供的css样式表,里面的写法几乎和css差不多。不过他支持的选择器相对比较少。在写的时候我们以前的一些项目的css 基本可以拿过来用,不过除了下面这些选择器外,你使用了其他的选择器,可能使整个页面报错! Index.whtml wxml后缀的文件夹也就是微信小程序提供给我们的页面结构文档,就相当于我们以前的web页面的html 差不多,只不过他自定义了一些自己的标签。 接下来我们就新建一个页面来尝试下 在pages 下新建页面test 注意新建的.js,.json,.xml,.wxss。和page 下定义的 test文件夹名称保持一致,微信微信小程序会自动读取这些文件,并生成小程序实例。 首先我们要在app.json下配置好我们刚新建的页面 注意:页面配置先后的顺序,在实际操作中发现,第一个配置的为首页。 配置好后我们就可以编写我们的页面代码。 大家可以看到,我们在app.json 页面可以直接配置当前页面的一些window属性 Wxml 中我们可以编写一些我们页面展示的结构,也就是我们以前写html一样。这中间我们使用到了 <view> 标签,他就相当于我们以前用的div 差不多。 Wxss 大家看到是不是和我们以前写的css 差不多。这边是个我们之前定义的 .box 加一个样式。 test.js 是页面的脚本文件,在这个文件中我们可以监听并处理页面的生命周期函数、获取小程序实例,声明并处理数据,响应页面交互事件等。 这边我们使用bintap给view绑一个点击事件然后再弹出一个提示框。 注意:这边js的写法和我们以前的写法完全一样,只不过这里面不能使用window对象和document对象,同样的也不能使用jquery ,zepto等框架,因为这些框架中会使用到window和document 对象。 好啦!今天只是给大家简单介绍下小程序的目录结构和简单的使用了下,下一节我们会来开始我们商城系统的编写。 版权声明:本系列文章基于“闪酷SAAS微信小程序商城系统【酷客多】”归纳整理,可自由转发,但需要保留知识产权,否则保留追究法律程序权利。 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
微信小程序开放公测以来,一夜之间在各种技术社区中就火起来啦。对于它 估计大家都不陌生了,对于它未来的价值就不再赘述,简单一句话:可以把小程序简单理解为一个新的操作系统、新的生态,未来大部分应用场景都将给予微信小程序进行研发。基于对它的敬畏以及便于大家快速上手,特整理微信小程序商城开发系列,未来将持续增加微信小程序技术文章,让大家可全面了解如何快速开发微信小程序商城。 本篇文章主要介绍微信小程序官方提供的开发工具,俗话说:欲工善其身,必先利其器。 小程序开发文档地址https://mp.weixin.qq.com/debug/wxadoc/dev/index.html 首先我们需要获取一下微信小程序提供给我们的代码编辑器 工具获取地址: https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/devtools.html?t=20161107 下载地址我们可以根据我们电脑系统下载对应的版本 下载安装包后直接双击打开按照流程完成安装 安装好后在桌面会有一个<微信web开发者工具> 这个就是微信小程序所提供的编辑器 下面我们就一步一步的来创建一个微信小程序 打开工具你会发现工具的使用需要通过微信扫描登录才可使用 扫码登录之后我们就可以选择我们需要建立的项目类型 这个我们选择新建一个本地的小程序项目 点击添加项目 这边依次填写你的APPID,项目名称以及你所建的项目的目录 目前已经开始公测 小程序的注册范围为企业,政府,媒体,和其他组织,也就是说个人是没有办法注册的,所以这个不在注册范围之内的可以选择无APPID来进行开发 已经有的可以登录https://mp.weixin.qq.com 后台,在设置中查看到小程序的APPID 完成上面步骤添加完项目后,我们就可以进入到编辑器的界面 编辑器主要分为三个模块,编辑,调试,项目。 编辑:主要功能相当于我们代码编辑器的功能。 调试:这个类型于我们Goole浏览器的控制台一样 项目:这个地方主要执行的是发布代码和预览的地方 做前端的同行们应该都很容易上手这个就相当于,将我们以前web开发的编辑器,调试工具集成到一个环境中来。还是比较好理解的。 在调试界面可以看到这个就类似于我们使用Goole浏览器开发H5网站时差不多。是不是找回点熟悉的味道啦! 在调试界面我们可以手动进行编译。(这边我们也可以在项目模块设置自动监听文件变化编译文件的) 手动清除缓存,查看控制台日志,网络请求…..等等。 接下来就是我们的项目模块,项目模块比较简洁。 这边可以执行项目的上传,和预览,以及整个IDE一些简单的配置。 这边需要注意的是这个上传代码需要管理员才能进行上传,当然没有没有AppID是上传不了的啦。由于现在是公测阶段,我们上传的代码也不能真正的让用户看到只有开发者可以看到。 另外下面这个预览功能可能是我觉得是整个IDE的唯一亮点。大家知道我们以前在做H5网站最头疼的就是在浏览器的模拟器上,一切正常可是到真是的手机上看就有各种兼容性问题。这个功能可以你在做完一个页面可以马上上传上去通过扫码来进行预览。 这边需要注意的预览只能是在登录了和当前IDE相同微信号的手机上。其他手机通过微信扫码将不能进行预览。 好啦今天先介绍微信IDE,下一章节我们会一步步的来实现我们的小程序 版权声明:本系列文章基于“闪酷SAAS微信小程序商城系统【酷客多】”归纳整理,可自由转发,但需要保留知识产权,否则保留追究法律程序权利。 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
闪酷信息技术(上海)有限公司一直致力于为品牌企业提供电子商务软件及其服务,为其拓展电商渠道保驾护航。上海闪酷依据多年的行业经验和技术积累,与中国 最大的B2C商城达成战略合作,为其2万多家品牌供应商提供软件服务,以便丰富京东开放平台应用市场,提升供应商软件使用体验,闪酷期望通过此平台,为中 国各行业20000家品牌企业提供好用易用的电子商务软件系统及服务,闪酷将继续在电子商务行业软件深耕,以便提供更好的电子商务软件服务。 基于京东开放平台而开发的闪酷订单实时交易系统 已经上线,一经推出即被市场认可,成为市场上的一枝独秀。 闪酷订单实时交易系统,实现了店铺的基本统计功能,以便运营人员实时了解店铺运营状况。 应用地址: http://fw.jd.com/ser/detail.action?serviceCode=FW_GOODS-4803 闪酷实时订单交易系统,实现了店铺的基本统计功能,以便运营人员实时了解店铺运营状况。 时间段包括今天、昨天、本周、最近三个月、定期查询 统计维度主要有会员统计、订单统计、产品统计等功能 闪酷实时订单系统,你身边的运营助手,简单易用高效,将成为你运营不可或缺的工具,将伴随京东卖家大展宏图。 您用的顺心,闪酷做的开心 来自:http://www.hello36.com/NewVis/NewsDetail.aspx?title=51&id=1249 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
在中国做电商,物流、IT系统可以说是核心的两大块。决定用户体验的关键,也主要集中在这两块。 每次的天猫“双11”,购物前,各位“亲”会抱怨提交订单无法付款;付款后,又发现迟迟收不到包裹。快的话,圣诞节能收到,慢的要到元旦节。物流不给力,可以自建。IT系统怎么办呢?尤其是对于准备进军电商的传统企业,如何“又好又快”的解决这个问题? 闪酷,就是这样一家企业——为企业提供电子商务系统解决方案。包括网站的架设,ERP系统、CRM客户管理系统、移动端的App开发等。创始人郝宪伟原来是麦考林的前端高级架构师,再之前是在台湾东森集团工作,其它的创始人均来自易迅、携程等技术高层。 闪酷服务的对象主要是准备进军电商的传统企业,行业有家纺、服装等。传统企业由于自身的限制,往往又没有这方面的人才储备。所以要在短时间内搭建一个完整 的电商平台显得相当困难,尤其对那些身处二、三线城市的品牌企业。开发人才对他们来说更为匮乏。外包给闪酷这样的方案解决商,或许是一个好选择。不仅比自 己做少花钱,也省时间。并且外包的做出来还更加专业。 虽然刚上线一年,闪酷已经为一些大中型企业提供电商系统解决方案,例如家纺行业的紫罗兰。闪酷会结合紫罗兰所在行业的特点,为他们提供专业的电商服 务:除了前端网站的搭建,还有ERP的服务,而ERP的质量直接决定了用户下单后传到仓储的速度。另外,闪酷还会协助紫罗兰的电商部门管理在天猫、京东上 的旗舰店,以及CRM管理。和老牌的电子商务解决方案公司ShopEx相比,闪酷有自己的特点:主要是行业前十名的企业。而ShopEx主要服务大型企 业,其次是一些淘品牌。这也是闪酷的生存空间所在。 郝宪伟说,今年闪酷的客户大约会有50家。其中主要是传统企业。郝称今年会把精力专注在前端的搭建和ERP,以后会逐渐转向移动端开放和后台仓储系统。闪酷的成本主要来自人力,因为一个是典型的人才密集型行业。 目前,也有一些和闪酷的模式类似的企业。例如ShopEx、富勒。并且这两个企业的规模都比闪酷大的多。闪酷还需要努力奔跑。 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
在FreeBSD主机上执行PHP页面报以下错误,Fatal error: Call to undefined function session_start() ,应该是在没有安装扩展,于是: 在操作系统上执行以下步骤: 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
在电子商务网站中,由于网站图片请求数过多,导致首页加载速度较慢,通过图片延迟加载机制,让用户访问页面的时候,只加载当前屏幕所见内容的图片,从而减少用户请求数量,提升用户体验。 使用步骤: 1.引入Jquery类库和延迟加载类库:http://files.cnblogs.com/ywqu/Jquery%E5%BB%B6%E8%BF%9F%E5%8A%A0%E8%BD%BD.rar 2.首先给图片img加属性original,并对其赋值为图片路径 3.在页面加以下代码 <script language="javascript" type="text/javascript"> $(function () { $("img[original]").lazyload({ placeholder: "../Images/Default/grey.gif", effect: "fadeIn" }); }); </script> 4.最终效果 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
tfs2010使用了有半年了,仅仅局限于源代码的控管,scrum开发框架和文档管理,至于版本流的管理还没有真正涉及。记得之前使用IBM 的CC CQ,开发版本 UAT版本 上线版本之间切换自如。TFS应该也提供类似的功能:分支和合并。看具体操作 1. 右击项目 2.分支对话框 3.开始生成分支项目 4.分支项目迁入到TFS 5.TFS项目层次结构 这样就产生一个分支项目,可以针对不同的版本流进行修改。 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
在团队开发中,离开不开版本控制工具,比如TFS,SVN,CSV等,小型团队可以选用SVN,最近在开发PHP项目,由于几个人一块开发,于是再次用上了SVN,用zend studio 连接SVN。 步骤如下: 1.在线安装SVN客户端 地址:Eclipse update site URL: http://subclipse.tigris.org/update_1.6.x 2.项目签入到SVN服务器 注:图片顺序为操作顺序 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
第一次用mysql,在插入数据时,竟然报这样的错误,#1054 - Unknown column 'id' in 'field list' 看似字段id不存在于表中,于是找了好一会原因,结果是字段id前面多了一个空格,去掉空格就可以正常运行了。 当时用mysql-gui-tools-5.0-r17-win32.msi见的表结构。很悲剧!~ 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
Internal Server Error The server encountered an internal error or misconfiguration and was unable to complete your request. Please contact the server administrator, admin@example.com and inform them of the time the error occurred, and anything you might have done that may have caused the error. More information about this error may be available in the server error log. 原因是发现ZendServer\etc\ZendEnablerConf.xml中的开头是一段乱码, 将其改成以“<?xml”开头,重启下apache即可 ZendServer界面如下: 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
Unable to find resource ''XXXXX 说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: NVelocity.Exception.ResourceNotFoundException: Unable to find resource 'XXXXt.htm'源错误: 行 62: VelocityContext velocityContext = new VelocityContext(modelTable); 行 63: VelocityEngine velocityEngine = ctx.GetObject("VelocityEngine") as VelocityEngine;行 64: string mergedTemplate = VelocityEngineUtils.MergeTemplateIntoString(velocityEngine, "PersonList.htm", Encoding.UTF8.WebName, modelTable); 行 65: string data=velocityEngine.GetTemplate("TemplatePage", Encoding.UTF8.WebName).Data.ToString(); 行 66: Response.Write(data); 源文件: f:\XXXX\GerateHTML.aspx.cs 行: 64 解决办法:把文件的生成操作改为“嵌入的资源” 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
1、简介 今天在看MVC3时,又不小心看到的了IIS 7.5 express(之前看到过测试版),于是决定试用一下此款号称比VS内建服务器(Cassini) 强大的web server tool,官方说明如下: IIS 7.5 Express 兼具 IIS 7.5 的强大功能与轻型 Web 服务器(例如 ASP.NET 开发服务器,也称为“Cassini”)的便利,可以增强在 Windows 上开发和测试 Web 应用程序的能力。 Microsoft WebMatrix 中包含 IIS 7.5 Express,这套集成工具可以让 Windows 上的 Web 应用程序开发工作变得简单、顺畅。 IIS 7.5 Express 也可与 Visual Studio 2010 一起使用,功能强大足以代替 Cassini。 使用 IIS 7.5 Express 的好处包括: · 在生产服务器上运行的同一 Web 服务器现在可以在开发计算机上使用。 · 在无需管理员特权的情况下,可以完成大多数任务。 · IIS 7.5 Express 在 Windows XP 和所有更高版本的 Windows 上运行。 · 多位用户可在相同的计算机上独立工作。 下载地址: http://www.microsoft.com/downloads/zh-cn/details.aspx?FamilyID=abc59783-89de-4adc-b770-0a720bb21deb 2、安装 双击即可进行安装 3、运行 在安装目录下,启动IIS 使之运行。 输入网址 即可以访问默认网页 在请求IIS上网站的过程中,控制台即时显示request详细信息 启动后在右下角出现以下标志: 右击 IIS Express, 选择[显示所有应用程序],如下所示 4、总结 IIS Express使构建,开发和测试更加容易,IIS express支持所有的Asp.net版本,不管Asp.net web form程序还是Asp.net MVC程序。大家可以选择性地在项目中使用。 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
一、Smooth Streaming简介 为了丰富网站内容,在现有的网站中,加入少许视频,是很多网站遇到的事情,流媒体服务器高昂的价格以及,让很多网站望而却步,如何在现有的基础上优化视频播放呢,针对IIS微软推出了一块视频加速软件, Smooth Streaming 下载地址:http://www.iis.net/download/SmoothStreaming,对于不熟悉视频的朋友,可能比较陌生,接下来让我们了解一下这款产品。 IIS Smooth Streaming - 是Internet 信使服务 (IIS) 7.0的一个扩展,它能提供流畅的视频流媒体,并且可以根据客户端的网络带宽和CPU的执行能力的改变,随时的调整视频质量。 IIS Smooth Streaming允许Microsoft Silverlight客户端的自适应视频流媒体Live活动。使用HTTP分发Live活动,为现有的HTTP网络带来的更贴近用户和Web广播的 HD(720p+)真实选择的优势.使用基于HTTP分发Live活动的更多好处就是,现有的HTTP架构也同样为Live活动提供更多有用的东西。 最 流行的Web广播,内容提供商和内容分发网络(CDNs)所关心的,是他们需要在网络流媒体资源上投入多大的精力。使用主要的HTTP网络,一般是他们流 网络的10到20倍大,他们可以充分发挥他们的主要网络的优势,并且不必担心最大网络能力和Live活动的用户人数限制。 Smooth Streaming - IIS 7.0的测试版,允许搭建一个Web服务器作为Live Smooth Streaming服务器,其内容可以从完成分发示例的基于Silverlight的客户端,虚拟的Live Smooth Streaming编码获得。本文档涵盖了以下的场景: · 安装IIS Live Smooth Streaming · 部署IIS Live Smooth Streaming 二、安装IIS Smooth Streaming 安装IIS Smooth Streaming ,下面的先决条件必须全部满足: · 必须在Windows Server 2008或者Windows Vista SP1上运行IIS 7.0 · 使用IIS Manager的界面管理IIS Smooth Streaming,IIS管理控制台必须安装。你可以在Server Manage中安装Web Server(IIS)的IIS管理控制台角色服务。 · 下面的选项对安装IIS Live Smooth Streaming - 测试版有帮助: · Web Platform Installer 2.0 Beta · Web Platform Installer 1.0 · Windows Installer files (Windows Server 2008 or Windows Vista SP1操作系统的32-bit 和 64-bit 版本) 条件满足后,直接安装就可以。 三、部署IIS Smooth Streaming 安装完成后,在IIS中多一栏媒体服务 针对以上各项进行设置 2.1 比特率限制 设置媒体格式,默认支持微软大部分媒体格式 也可通过以下方式 添加其他媒体格式 2.2 平滑流式处理 2.3 实时平滑流处理 使用此IIS 扩展插件后,客户应该会明显感觉视频更加流畅了。 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
1.按姓氏笔画排序:Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as 2.数据库加密:select encrypt('原始密码')select pwdencrypt('原始密码')select pwdcompare('原始密码','加密后密码') = 1--相同;否则不相同 encrypt('原始密码')select pwdencrypt('原始密码')select pwdcompare('原始密码','加密后密码') = 1--相同;否则不相同 3.取回表中字段:declare @list varchar(1000),@sql nvarchar(1000) select @list=@list+','+b.name from sysobjects a,syscolumns b where a.id=b.id and a.name='表A'set @sql='select '+right(@list,len(@list)-1)+' from 表A' exec (@sql) 4.查看硬盘分区:EXEC master..xp_fixeddrives 5.比较A,B表是否相等:if (select checksum_agg(binary_checksum(*)) from A) = (select checksum_agg(binary_checksum(*)) from B)print '相等'elseprint '不相等' 6.杀掉所有的事件探察器进程:DECLARE hcforeach CURSOR GLOBAL FOR SELECT 'kill '+RTRIM(spid) FROM master.dbo.sysprocessesWHERE program_name IN('SQL profiler',N'SQL 事件探查器')EXEC sp_msforeach_worker '?' 7.记录搜索:开头到N条记录Select Top N * From 表-------------------------------N到M条记录(要有主索引ID)Select Top M-N * From 表 Where ID in (Select Top M ID From 表) Order by ID Desc----------------------------------N到结尾记录Select Top N * From 表 Order by ID Desc 8.如何修改数据库的名称:sp_renamedb 'old_name', 'new_name' 9:获取当前数据库中的所有用户表select Name from sysobjects where xtype='u' and status>=0 10:获取某一个表的所有字段select name from syscolumns where id=object_id('表名') 11:查看与某一个表相关的视图、存储过程、函数select a.* from sysobjects a, syscomments b where a.id = b.id and b.text like '%表名%' 12:查看当前数据库中所有存储过程select name as 存储过程名称 from sysobjects where xtype='P' 13:查询用户创建的所有数据库select * from master..sysdatabases D where sid not in(select sid from master..syslogins where name='sa')或者select dbid, name AS DB_NAME from master..sysdatabases where sid <> 0x01 14:查询某一个表的字段和数据类型select column_name,data_type from information_schema.columnswhere table_name = '表名' [n].[标题]:Select * From TableName Order By CustomerName [n].[标题]:Select * From TableName Order By CustomerName 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
每次部署UAT或者版本新上线,都需要不断链接不同的服务器:Web Server 、DB Server、JOB Server、SearcheEngine Server.用系统自带的远程桌面链接,总是不断的切换链接,很是麻烦,于是找了多款远程桌面工具,感觉Remote Desktop Organizer 还是蛮适合一般需求的,下载地址如下:http://www.appmazing.com/remote-desktop-organizer/ 如果没有很特殊的要求,这些功能满够用的了。 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
上一章说到向上领导,那接下来我们要说到怎么向上领导,向上领导的一些法则,我相信如果你做到以下几点,在公司你一定是最棒的,一定很快上升到更高的职位。 法则一:极佳的自我领导。 很多人喜欢去领导别人做决定,但很少人管理你的决定。所以这导致你的领导并不成功,只是用职位在领导,说到这里呢,我想借用世界第一领导力大师曾教导过我们:领导力的五个阶梯: 1、 用职务在领导;(这也是最低层的领导)。 2、 关系你的领导;(这主要靠关系,这个时候呢,如果一旦关系不好,领导也是失去效力) 3、 取得战功; 4、 培养人才;(复制是一个培养领导人的领导人,能达到这一层的领导人算是很厉害的领导人了) 5、 人格魅力。(这是最牛的人,像毛**这样人就是达到这一点了) 那自我管理包括哪些内容呢: 1、情绪。如果一个领导管不好自己的情绪,那他就不是一个好的领导。 2、时间。我们都知道成功不是短跑,可以说是马拉松。没有一个企业家是随随便便成功的,道理我们都懂,那你是如何安排你的时间的呢?有人调查过一个在工作的时间,有效的时间却不超过3个小时,极少的人却用一天的时间创造出三天的价值。这意味着什么,大部分人对于时间是没有做好规划和利用。有人见过中岛熏先生家里有一个沙漏,里面装的却不是沙子,而且非常大的钻石,有人问他为什么要用钻石,他说:“时间大于钻石”。后来我也经常把这句话挂在嘴边,时间提醒自己时间的保贵。所以管理好你的时间,对于你的成功绝对有很大的帮助。 3、优先顺序。我们要明白哪些事情先做,哪些事情后做。首先每天要做的第一项是:重要不紧急;其次是重要又紧急的事。有些人看到这里肯定会问,为什么要把重要又紧急的事排在后面呢,原因很简单,一般重要的事情都不怎么紧急,如果是很紧急的事情呢,那是因为你事情拖后了,所以才变成紧急的事情了。第三就是不重要但紧急的事情,我想大家一定可以理解这个意思吧,那我就不多解释了。 大多数人都这么认为那些有钱人因为有钱了,所以才有时间做自己想做的事,其实这种观点是错误的,不是因为有钱才有时间,那是因为把事情做好了才有钱,你没有把你的时间管理好,所以你没有钱,你把很多时间花在不重要不紧急的事情上,比如每天聊QQ,玩游戏等等这些没有产值的事情上。所以在这里我建议大家每天列出你不应该做的事,比如:不应该聊QQ,不应该玩游戏等等。 4、管理你的能量。在你能量最好的时候把最重要的事做完,很多人一回到家就看看电视,玩玩电脑,不知不觉两个小时过去了,这时候就不想学习了,也不想看书了,原因就是你把你的能量用在了看电视,玩电脑上面,所以能量消耗完了,就不想学了,也该睡觉了。我建议每天列出6个最重要的事情,然后一件件的把它完成,比如我列出来的是学习、锻炼、沟通等待。 5、管理你的思考。有时候1分钟的思考比呆1小时更重要,但也要看时间,场合,最好找一个安静的地方,我大部分时间是在睡觉前。每天都需要思考,今天的所作所为,明天要做的事,为什么我没有成功?我怎么样才能成功?我在哪方面还需要加强?每天都做最有产值的事情,这样你离成功就更近了。 6、管理你的说话。每个领导都喜欢行动,不喜欢别人讲废话,所以在领导面前要讲有价值的话,要简明扼要,如果你讲的话没有价值,那就保持沉默。 7、管理你的生活。1)你的感情会对你的事业成功与否带来很大的影响,看看你的另一伴是给你能量的人,还是拿走能量的人,这一点很重要;2)家庭关系。很多人的成功都是来自家庭的动力,所以要管理好你的家庭关系,这也很重要。 这是我整理出来的一些小小的内容,希望这些能对大家带来帮助。 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. Exception Details: NHibernate.MappingException: No persister for: U_SHOP.Entity.Domain.AddressSource Error: Line 30: public long InsertAddress(Entity.Domain.Address ad)Line 31: {Line 32: long result=Convert.ToInt64(Session.Save(ad));Line 33: Session.Flush();Line 34: return result; Source File: G:\U-Shop\Code\U-SHOP.DAL.SQLServerImpl\AddressBookSqlDAO.cs Line: 32 解决方案: XML文件的默认生成操作为“内容”,需要修改为“嵌入的资源”生成 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
为什么叫“360度全方位沟通”,怎么理解呢,有些人听到这个名字可能有点疑问,我们可以理解为“360度全方位领导”,因为沟通也就是领导力,也就是说服力。有些人说我是基层员工,谈领导对我来说太遥远,但事事不是这样。大部分人都会遇到这样一个状况:大部分人在公司里都有领导,大部分都有同事,而且大部分大部分时间都处在这个里面,所以别的主管也是和你同一阶层,也有自己的属下。其实360度领导讲的就是你处在任何一层次都是在领导,但大部分都有一个迷失,我一定要有一个职位才能领导,你给我一个经理,或者主管才能叫到他们,那在这里我们还可以用另外一句话来表示:“领导力就是影响力”,世界第一名的领导力大师约翰—麦斯威尔说:“你看一个人有没有领导就是看他在这个团队的影响力。”所以领导力不代表职称,真正有领导力的不代表职位是很高的。 那接下来我们说怎么在团队里展示你的影响力? 首先,我们先说向上领导,很多人没听过,所以这也是最难的。 如何向上领导,就是要影响他,最简单的方式就是:用领导的角度去思考。领导有一种思考模式,以大局为重。很多人在中间层待久了就不想做了,觉得没有前途了,为什么会这样呢,因为这些人都陷入职位的迷失,他们认为他们就在这个中间层了,职位升不上去了,这种想法是错误的,因为中间层的领导可以对核心层有很大的影响力。那如何影响你的领导 1、 跟关键人物建立关系,不是拍马屁,要懂得和直属领导沟通,做为一个领导最主要的是沟通能力。 2、 以团队合作的角度来定义成功(以团队合作的成功作为成功的指标)。 3、 在中间层怎么样获得成就感。自立于持续的沟通,沟通的方式有很多种,例如:直接讲,发短信,email,小纸条,写卡片 4、 在中间层位置可以持续获得经验。 5、 将团队的成功看得比个人成功还要重要。公司的利益大于部门的利益;部门的利益大于组员的利益;组员的利益大于个人的利益。 最后跟大家说一个领导的精髓:帮助团队获得胜利比你在哪个位置更重要。 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
云计算将是一场改变IT 格局的划时代变革,几乎所有重量级跨国IT 巨头从不同领域和角度开始在“云计算”领域扎根,这个阵营的主力包括Amazon、Google、IBM、Microsoft、VMware、Cisco、Intel、AMD、Oracle、SAP、HP、Dell、Citrix、 Red hat、Novell、Yahoo 等等。据不完全统计,美国硅谷目前已约有150 家涉及“云计算”的企业,新的商业模式层出不穷。“云计算”领域成为跨国IT 巨头未来“决斗”的主战场。 为了应对这场战争,每个企业都有自己的“云计划”“云战略”,但焦点只有一个,那就是服务。 争夺云计算市场,需要争模式、争技术、争安全、争客户,但归根结底争的是服务,这点从云计算的几个典型模式中就能看出来。IAAS——基础设施即服务,PAAS——平台即服务,SAAS——软件即服务,三个模式最终的落脚点都在服务上。所以说,服务是云计算争夺战的核心。 拿微软的云来说,如果要用一个词来解说那就是“服务”。微软云的特质和核心是对“服务”的超级重视,这种服务的思想与许多国际软件公司更注重服务方面、提高公司品质不谋而合。通过ITaaS即IT即服务概念的提出,对云计算概念进行了整合。因为概念最终要变成实施方案,ITaaS由有机的三部分组成,即基础设施即服务(IaaS),平台即服务(PaaS)和软件即服务(SaaS),上面的切分其实是相互配合的三个层次。IaaS侧重与硬件和底层管理控制工作,而PaaS则是驾驭硬件的厂商支撑部分,微软可以通过自己成套的强力的开发工具相配合,SaaS是针对用户的最终应用,这也是用户最关心的问题。正是有了上面三者的密切配合和扎根服务,微软的云吸引了大批客户与其实现共赢。 Google为公众提供云计算服务已经数年,成就了一个世界顶级互联网公司内部人士总结Google云计算服务的经验法宝,其中最重要的也就是优质的服务。 VMware也一样,今年9月份,VMware公司在VMworld 2010大会上发布了一系列战略和一整套新产品,以满足用户的应用需求为目标,推动向以服务为中心的关系转变并实现更加快速的需求响应,帮助企业和政府机构实现从IT即成本中心到IT即服务模式的超越。 不光这三家公司,其它众多云计算公司也一样重视服务。有些云计算供应商做出了提供更高等级服务的承诺,以示与其他行业竞争对手的不同。比如Rackspace提供更高等级云服务SLA,从而展开与云计算业内的巨头Amazon公司的竞争。 以上这些无一不说明,服务是云计算竞争的核心,服务将成为云计算时代战争的焦点。 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
2010年将是中国云计算元年,这是关注中国云计算者的一个共识。虽然云计算至今还没有一个统一的概念,Gartner资深分析师Ben Pring也认为:“云计算就像法国大餐一样正被人们津津乐道。但几乎每个人对云计算的定义都有不同之处“,但是云计算凭借其无可比拟的优势--通过网络实时订购或者按使用量付费(pay-per-use)的服务模式,正在逐步走下云端步入企业管理的实际应用层面。 云计算的基本原理是,通过使计算分布在大量的分布式计算机上,而非本地计算机或远程服务器中,企业数据中心的运行将更与互联网相似。这使得企业能够将资源切换到需要的应用上,根据需求访问计算机和存储系统。 云计算就是一种通过互联网向终端用户提供计算服务的模式。通过这个服务企业客户不用考虑自己买软硬件,而是像使用电一样,用多少付多少费,不存在一次性的投入,也很大程度上避免了资源浪费和耗能。 云将所有的计算资源集中起来,并由软件实现自动管理,无需人为参与。这使得应用提供者无需为繁琐的细节而烦恼,能够更加专注于自己的业务,有利于创新和降低成本。云计算提供了最可靠、最安全的数据存储中心,用户不用再担心数据丢失、病毒入侵等麻烦。同时云计算对用户端的设备要求最低,使用起来也最方便。此外,云计算可以轻松实现不同设备间的数据与应用共享。更重要的是云计算为我们使用网络提供了几乎无限多的可能。云计算拥有以下特点: l 虚拟化和自动化 l 服务器,存储介质,网络等资源都可以随时替换 l 所有的资源都由云端统一管理 l 高度的伸缩性以满足业务需求 l 集中于将服务传递给业务 虚拟化是云计算的基础,典型的云计算技术特征可分为虚拟化技术、分布式技术、并行计算/分布式计算、XaaS、WEB X.0、数据存储、网络技术和其它技术等。云计算的平台包括三类服务:软件基础实施即服务IaaS、平台即服务PaaS、软件即服务SaaS,而这三类服务的基础则是虚拟化平台,其关系结构如下图1所示: 图1 云计算技术服务模式图 Spring Board与VMware在2010年9月完成了一份在线调查,整个亚太区大约有7000个机构接受了这份调查,其中也包括中国的3000家机构。调查表明有66%的人都认为虚拟化的基础设施是第一必要条件。第二就是安全性及隔离性,包括数据的隔离性和进程的数据性。云计算包括私有云和公共云,在中国,大多数的企业和决策者主要关注私有云,调查发现,73%的机构都认为私有云是更为重要的。 在构建私有云平台上,微软已经迈出了关键的第一步,今年11月早些时候,微软发布了Hyper-V Cloud,该云计算解决方案主要面向那些希望拥有自己的私有云的用户,这个解决方案为硬件厂商提供了指南,同时也提供了部署私有云的软件套件。 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
Asp.net中的AdRotator是一个非常有用的随机显示广告的控件,不足的地方是,每次用户刷心页面,广告随机一次,哪有没有办法页面不刷新,广告每隔一段时间自动翻转呢?答案是肯定的,而且用jquery 很容易实现,接下来我们看一下如何来实现以上说的效果。 1、新建网站 新建一个网站或者在已有的网站中做添加以下文件和文件夹 新增四张图片和Ad.xml文件,供AdRotator控件调用。 2、完善Ad.xml文件 撰写广告XML代码,如下图所示: <?xml version="1.0" encoding="utf-8" ?> <Advertisements> <Ad> <ImageUrl>001.jpg</ImageUrl> <NavigateUrl>ywqu.cnblogs.com</NavigateUrl> <AlternateText>灵动生活</AlternateText> <Impressions>30</Impressions> <Keyword>森森购物</Keyword> </Ad> <Ad> <ImageUrl>002.jpg</ImageUrl> <NavigateUrl>ywqu.cnblogs.com</NavigateUrl> <AlternateText>灵动生活</AlternateText> <Impressions>30</Impressions> <Keyword>森森购物</Keyword> </Ad> <Ad> <ImageUrl>003.jpg</ImageUrl> <NavigateUrl>ywqu.cnblogs.com</NavigateUrl> <AlternateText>灵动生活</AlternateText> <Impressions>30</Impressions> <Keyword>森森购物</Keyword> </Ad> <Ad> <ImageUrl>004.jpg</ImageUrl> <NavigateUrl>ywqu.cnblogs.com</NavigateUrl> <AlternateText>灵动生活</AlternateText> <Impressions>30</Impressions> <Keyword>森森购物</Keyword> </Ad> </Advertisements> 3、添加AdRotator控件 向页面AdRotatorDemo.aspx添加AdRotator控件,代码如下: <div> <asp:AdRotator ID="AdRotator1" runat="server" AdvertisementFile="~/Images/AD/Ad.xml" KeywordFilter="森森购物" /> </div> 分析: AdvertisementFile:引用广告XML文件 KeywordFilter:通过此属性过滤广告,对应XML文件中的keyword属性,这样不同的页面可以使用此属性过滤一些广告内容。 4、Jquery轮转图片 使用jquery使AdRotator控件中的图片轮转起来,代码如下: <script src="Scripts/jquery-1.4.1.js" type="text/javascript"></script> <script type="text/javascript"> $(document).ready(function () { setInterval(function () { $("#AdRotator1").load(location.href + " #AdRotator1", "" + Math.random() + ""); }, 3000); }); </script> 分析:在以上代码中我们使用了setInterval function,也调用了jQuery load() api,以达到每3秒钟更新一次数据。 引用:Load(function) 在每一个匹配元素的load事件中绑定一个处理函数。如果绑定给window对象,则会在所有内容加载后触发,包括窗口,框架,对象和图像。如果绑定在元素上,则当元素的内容加载完毕后触发。注意:只有当在这个元素完全加载完之前绑定load的处理函数,才会在他加载完后触发。如果之后再绑定就永远不会触发了。所以不要在$(document).ready()里绑定load事件,因为jQuery会在所有DOM加载完成后再绑定load事件。 为了验证是否刷心页面,在页面上加了一个时间标志。 最终运行效果如下: 有以上图可以知,整个页面并没有刷心。可以自由地每隔3秒钟轮转一次。 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
Jquery图片滚动插件—BxCarousel BxCarousel是一个具有众多配置且易用的Jquery图片滚动插件,特征主要有: Ø 可以指定显示的元素数 Ø 可以指定每次滚动元素数 Ø 自动播放模式 Ø 前一张/后一张按钮控制图片流动 下面我看两个BxCarousel的Demo 1、 DEMO One 控制左右滚动 Jquery代码 $(document).ready(function(){ $('#example1').bxCarousel({ display_num: 4, move: 2, prev_image: 'images/icon_arrow_left.png', next_image: 'images/icon_arrow_right.png', margin: 10 }); }); 解释: display_num:显示元素的数量,此处显示4张图片 move:单击左右控制键时,移动的元素个数,此处为移动2张图片 prev_image:上一元素按钮图片 next_image:下一元素按钮图片 margin:图片之间的间隙,此处为10px HTML代码 <ul id="example1"> <li><img src="images/pic_one.png" width="107" height="107" alt="Pic One" /></li> <li><img src="images/pic_two.png" width="107" height="107" alt="Pic Two" /></li> <li><img src="images/pic_three.png" width="107" height="107" alt="Pic Three" /></li> <li><img src="images/pic_four.png" width="107" height="107" alt="Pic Four" /></li> <li><img src="images/pic_five.png" width="107" height="107" alt="Pic Five" /></li> <li><img src="images/pic_six.png" width="107" height="107" alt="Pic Six" /></li> <li><img src="images/pic_seven.png" width="107" height="107" alt="Pic Seven" /></li> </ul> 2、 Demo Two 自动滚动效果 Jquery代码如下: 解释: display_num:显示元素的数量,此处显示3张图片 move:单击左右控制键时,移动的元素个数,此处为移动1张图片 auto:自动滚动效果 controls:是否显示左右控制按钮,此处为false,表示不显示左右控制按钮 margin:图片之间的间隙,此处为10px 3、 BxCarousel使用和配置 首先HTML代码需要符合以下格式 Jquery代码需要符合以下格式 下载地址:http://bxcarousel.com/js/jquery.bxcarousel.min.js 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
当有大量的内容或者图片需要在你的网站或者BLOG上展示的时候,以幻灯片滑动的方式是一个不错的选择,这种效果常用于公司网站或者个人BLOG。常听有人说jquery 比较难学,只要你感兴趣,实现幻灯片效果还是蛮有乐趣的,下面的Jquery 幻灯片教程将引领你进入Jquery插件开发的喜悦中,希望对大家有帮助。 1、 jQuery Easy Slides v1.1 在所有的Jquery幻灯片插件中,Jquery easy sildes算是最容易使用的一个。 2、 The Piecemaker XML Gallery 非常酷的具有3D效果的jquery 插件,有详细的制作方法,有兴趣的朋友可以研究一下它的源代码。不用Flash也可以实现那么炫耀的效果,没有想到吧。 3、 Create Beautiful jQuery Slider Tutorial 这篇教程详细地介绍了如何开发一个漂亮的jquery图片幻灯片效果,包括图片名称和简短描述 4、 Create a Simple Slideshow Using MooTools Thumbnails and Captions 使用Mootools创建幻灯片效果已经非常常见和效果也非常棒,主要分为四步: 第一步,布置幻灯片放映的布局; 第二步,给幻灯片添加事件控制; 第三步,给幻灯片一个统一的样式类; 第四步,添加图片缩略图和标题。 5、 Query Blinds Slideshow using CSS Sprites 使用CSS Sprints创建的百叶窗效果 6、 Create a Quick MooTools Slideshow with Preloading Images 此教程展示了如何是用MooTools创建简单的幻灯片效果,也展示了如何预加载图片,从而使幻灯片效果看起来更高雅和避免页面加载时图片混乱。 7、 Advanced jQuery background image slideshow 一个切换背景图片的幻灯片效果 8、 Colorful Sliders With jQuery & CSS3 使用Jquery和CSS3创建的Colorful Silders 9、 Coin Slider 非常独特的幻灯片效果,国内很多网站有使用这种效果,特别是视频网站,很绚丽的。 10、 JCoverflip 当图片很多的时候,使用此插件会达到比较好的用户体验,一些门户网站有使用此种效果的。 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
鉴于上篇文章中提到的Json优点:易读性、可扩展性和操作方便,接下来我们实现一个简单的例子Demo,场景是:查询商品信息;实现过程:Web程序通过Jquery调用WebService,Web Service返回Json对象,成功调用后,对返回的JSon结果进行处理,下面我们看一下具体实现过程: 1、 首先创建一个Aap.net web 应用程序,如下图: 2、 添加实体类Product.cs到工程中,并且序列化,代码如下 [Serializable] public class Product { public long ProductId { get; set; } public string ProductName { get; set; } public decimal Price { get; set; } public int Stock { get; set; } } 3、 添加数据类ProductData.cs类到工程中,此类主要完成数据的查询操作,代码如下所示: public class ProductData { private List<Product> productList = new List<Product>() { new Product(){ProductId=1,ProductName="笔记本", Price=10000M, Stock=10}, new Product(){ProductId=2,ProductName="格子绒长袖衬衫", Price=90M, Stock=20}, new Product(){ProductId=3,ProductName="纯棉长袖T恤", Price=99M, Stock=40}, new Product(){ProductId=4,ProductName="炫彩T恤", Price=67M, Stock=30}, new Product(){ProductId=5,ProductName="直筒裤男牛仔裤", Price=100M, Stock=20}, new Product(){ProductId=6,ProductName="[无印严选]纯色V领长袖T恤", Price=67M, Stock=50}, new Product(){ProductId=7,ProductName="英伦学院派马夹", Price=44M, Stock=40}, new Product(){ProductId=8,ProductName="纯棉连帽宽松卫衣", Price=66M, Stock=30}, new Product(){ProductId=9,ProductName="纯棉多口袋工装裤", Price=80M, Stock=990}, new Product(){ProductId=10,ProductName="假两件长袖T恤", Price=89M, Stock=30}, }; /// <summary> /// 查询所有商品 /// </summary> /// <returns>所有商品</returns> public List<Product> GetProducts() { return productList; } /// <summary> /// 根据商品Id查询商品 /// </summary> /// <param name="id">商品编号</param> /// <returns>商品</returns> public Product GetProductById(long id) { return productList.FirstOrDefault(p => p.ProductId == id); } /// <summary> /// 根据商品名称查询商品 /// </summary> /// <param name="id">商品名称</param> /// <returns>商品</returns> public List<Product> GetProductByName(string name) { return productList.Where(p => p.ProductName == name).ToList(); } 4、 添加ASP.NET Web Service 到工程中,命名为ProductServic.asmx,如下图: 此Web Service调用ProductData类,完成数据查询操作,具体代码如下: /// <summary> /// Summary description for ProductService /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. [System.Web.Script.Services.ScriptService] public class ProductService : System.Web.Services.WebService { private ProductData dataSource { get { return new ProductData(); } } /// <summary> /// Get the Products /// </summary> /// <returns></returns> [WebMethod] [ScriptMethod(ResponseFormat=ResponseFormat.Json,UseHttpGet=true)] public List<Product> GetProducts() { return dataSource.GetProducts(); } /// <summary> /// 根据商品Id查询商品 /// </summary> /// <param name="object">商品编号</param> /// <returns>商品</returns> [WebMethod] [ScriptMethod(ResponseFormat=ResponseFormat.Json,UseHttpGet=true)] public Product GetProductById(object id) { Product p = null; if (id!=null) { int productId = 0; int.TryParse(id.ToString(),out productId); p = dataSource.GetProductById(productId); } return p; } /// <summary> /// 根据商品名称查询商品 /// </summary> /// <param name="id">商品名称</param> /// <returns>商品</returns> [WebMethod] [ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)] public List<Product> GetProductById(string name) { return dataSource.GetProductByName(name); } } } 注: Ø 引用命名空间:System.Web.Script.Services.ScriptService Ø 给方法添加注解:[ScriptMethod(ResponseFormat = TheResponseFormat, UseHttpGet = true/false)] ResponseFormat:方法要返回的类型,一般为Json或者XML UseHttpGet:true表示“Get”可以访问此方法 5、 在Defualt.aspx页面引用Jquery类库 引用Google网络jquery 类库http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.js 或者本地类库<script src="Scripts/jquery-1.4.1.js" type="text/javascript"></script> 6、 在Defualt.aspx页添加如下HTML代码: <div id="listContainer" class="container"> <div id="title"> Product List</div> <table id="productList"> <thead> </thead> <tbody> </tbody> </table> </div> Jquery会动态向id=ProductList的Table中添加查询到的数据 7、 在Defualt.aspx页添加如下样式代码: <style type="text/css"> body { font-family: Verdana,Arial; } .container { width: auto; padding: 1.5em; margin: 1em; } .container #title { font-size: 2em; width: 100%; border-bottom: groove 0.5em blue; } #productList { width: 100%; border-collapse: collapse; } #productList td { padding: 1em; border-style: solid; border-width: 1px; border-color: Blue; margin: 0; } thead td { background-color: Yellow; } tbody tr:hover { background-color: #aaa; } </style> 8、 使用Jquery的Ajax方法调用Web Service中方法,代码如下: $(document).ready(function () { // Get Product list $.ajax({ type: "GET", contentType: "application/json; charset=utf-8", url: "ProductService.asmx/GetProducts", dataType: "json", success: insertCallback, error: errorCallback }); function insertCallback(result) { $("#productList").find("tr:gt(0)").remove(); if (result["d"].length > 0) { $('#productList > thead:last').append('<tr><td>商品名称</td><td>价格</td><td>库存量</td></tr>'); } for (var i = 0; i < result["d"].length; i++) { var product = eval(result["d"][i]); $('#productList > tbody:last').append('<tr onclick="ShowDetail(' + product.ProductId + ')"><td>' + product.ProductName + '</td><td>' + product.Price + '</td><td>' + product.Stock + '</td></tr>'); } } function errorCallback(XMLHttpRequest, textStatus, errorThrown) { alert(errorThrown + ':' + textStatus); } 注: $.ajax方法有以下属性: Type: HTTP请求方法,在做查询操作时,经常用Get方法 contentType:在请求头部的类型,由于Web Service返回Json对象,此处值为:application/json; charset=utf-8 url:请求的URL地址 dataTyep:定义返回的类型 Success:调用成功时,要执行的方法 error:调用失败是,要执行的方法 9、 执行程序,效果如下: 至此,使用Jquery查询Web Service返回的JSon对象已经完成 源代码下载地址:http://files.cnblogs.com/ywqu/JsonWebService.rar 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,非常适合于服务器与 JavaScript 的交互。相比XML,他更易于人阅读和编写,它是JavaScript的一个子集。 JSON采用完全独立于语言的文本格式,可以在流行的语言中使用,比如C# Java C++ VB。这些特性使JSON成为理想的数据交换语言。 一、Json的构建结构 1. “键/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),记录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。 2. 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。 这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。 二、JSon具体表现形式 1、对象是一个无序的“‘键/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。 2、数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。 3、值(value)可以是双引号括起来的字符(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套。 4、字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。 字符串(string)与C或者Java的字符串非常相似。 5、数值(number)也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。 三、JSon在Net中应用 JSON.Net类库(http://json.codeplex.com/)提供了转化实体类为Json格式数据的能力,即序列化和反序列化,同样提供了JSON To Linq的功能,下面是实例代码: Product product = new Product(); product.Name = "Apple"; product.Expiry = new DateTime(2008, 12, 28); product.Price = 3.99M; product.Sizes = new string[] { "Small", "Medium", "Large" }; //序列化为JSON格式数据 string output = JsonConvert.SerializeObject(product); //{ // "Name": "Apple", // "Expiry": "\/Date(1230375600000+1300)\/", // "Price": 3.99, // "Sizes": [ // "Small", // "Medium", // "Large" // ] //} //反序列化为实体类对象 Product deserializedProduct = JsonConvert.DeserializeObject<Product>(output); 参考: http://www.json.org/ http://baike.baidu.com/view/136475.htm?fr=ala0_1_1 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
系统默认情况下,使用Tab按键切换页面元素的焦点,有没有想过回车键Enter也可以实现这种功能,并且具有良好的用户体验。接下来我们使用Jquery实现回车键Enter切换焦点,此代码在常用浏览器IE7, IE8, Firefox 3, Chrome 2 和 Safari 4测试通过。 使用的开发工具是微软VS2010+Jquery框架。 实现步骤如下 1、 首先引用Jquery类库 <script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"></script> 2、 Javascript代码 <script type="text/javascript"> $(function () { $('input:text:first').focus(); var $inp = $('input:text'); $inp.bind('keydown', function (e) { var key = e.which; if (key == 13) { e.preventDefault(); var nxtIdx = $inp.index(this) + 1; $(":input:text:eq(" + nxtIdx + ")").focus(); } }); }); </script> 分析: $('input:text:first').focus(); 页面初始化时,焦点定位第一个文本框内 var $inp = $('input:text'); 取的type=文本框的元素集合 $inp.bind('keydown', function (e) {} 给文本框集合绑定'keydown'事件 var key = e.which; 取的当前按下的键值 比如Enter的键值=13 e.preventDefault(); 可以阻止它的默认行为的发生而发生其他的事情,在这里我们组织PostBack发生,而是切换焦点。另外一个相近的方法是stopPropagation,它起到阻止js事件冒泡的作用。 事件代理用到了两个在JavaSciprt事件中常被忽略的特性:事件冒泡以及目标元素。当一个元素上的事件被触发的时候,比如说鼠标点击了一个按钮,同样的事件将会在那个元素的所有祖先元素中被触发。这一过程被称为事件冒泡;这个事件从原始元素开始一直冒泡到DOM树的最上层。对任何一个事件来说,其目标元素都是原始元素,在我们的这个例子中也就是按钮。目标元素它在我们的事件对象中以属性的形式出现。使用事件代理的话我们可以把事件处理器添加到一个元素上,等待事件从它的子级元素里冒泡上来,并且可以很方便地判断出这个事件是从哪个元素开始的。 var nxtIdx = $inp.index(this) + 1; 取的元素集合inp中的下一个元素索引 $(":input:text:eq(" + nxtIdx + ")").focus(); 定位焦点到集合的下一个元素 3.、HTML代码 <div> <asp:TextBox ID="txt1" runat="server" /><br /> <asp:TextBox ID="txt2" runat="server" /><br /> <asp:TextBox ID="txt3" runat="server" /><br /> <asp:TextBox ID="txt4" runat="server" /><br /> </div> 分析:页面上存放四个文本框 3、 运行程序 那页面中如果有TextArea 元素,我们如何使用Enter切换焦点呢,办法是有的,如下充分运用了Jquery的一些特性。 4、 HTML代码 <div> <asp:TextBox ID="tb1" runat="server" class="cls" /><br /> <asp:TextBox ID="tb2" runat="server" class="cls" /><br /> <asp:TextBox ID="tb3" TextMode="MultiLine" runat="server" class="cls" /><br /> <asp:TextBox ID="tb4" runat="server" class="cls" /><br /> </div> 分析: 页面中所以的TextBox 引用Class=”cls”,便于后期的对页面元素的Jquery查询。 5、 Javascript代码 <script type="text/javascript"> $(function () { $('input:text:first').focus(); var $inp = $('.cls'); $inp.bind('keydown', function (e) { var key = e.which; if (key == 13) { e.preventDefault(); var nxtIdx = $inp.index(this) + 1; $(".cls:eq(" + nxtIdx + ")").focus(); } }); }); </script> 分析: var $inp = $('.cls'); 取的样式为cls的所有元素 赋值给变量inp 6、 运行效果 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
上一篇文章,我们简单地完成了新闻内容的展示功能(Asp.net MVC2.0系列文章-显示列表和详细页面操作),此篇文章,我们使用Asp.net MVC2.0实现新闻记录的编辑和删除功能。 创建View视图NewsEdit和NewsDelete 创建新闻首页,用来显示新闻列表。 在Views/News目录下,单击右键,选择Add->View,修改相关配置如下图所示 NewsEdit View NewsDelete View 在生成的HTML代码中,进行相关展示方面的修改。主要代码如下: <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> <h2>新闻编辑-</h2> <% using (Html.BeginForm()) {%> <%: Html.ValidationSummary(true) %> <fieldset> <legend>Fields</legend> <div class="editor-label" style="display:none;"> <%: Html.LabelFor(model => model.Id) %> </div> <div class="editor-field" style="display:none;"> <%: Html.TextBoxFor(model => model.Id)%> <%: Html.ValidationMessageFor(model => model.Id) %> </div> <div class="editor-label"> <%: Html.LabelFor(model => model.Title) %> </div> <div class="editor-field"> <%: Html.TextBoxFor(model => model.Title) %> <%: Html.ValidationMessageFor(model => model.Title) %> </div> <div class="editor-label"> <%: Html.LabelFor(model => model.CreateTime)%> </div> <div class="editor-field"> <%: Html.TextBoxFor(model => model.CreateTime,new { @class = "date" }) %> <%: Html.ValidationMessageFor(model => model.CreateTime) %> </div> <div class="editor-label"> <%: Html.LabelFor(model => model.Content) %> </div> <div class="editor-field"> <%: Html.EditorFor(model => model.Content) %> <%: Html.ValidationMessageFor(model => model.Content) %> </div> <p> <input type="submit" value="Save" /> </p> </fieldset> <% } %> <div> <%: Html.ActionLink("Back to List", "Index") %> </div> </asp:Content> 新闻编辑页面HTML代码。 隐藏style="display:none;" 新闻编号Id 给日期文本框加Class=”Date”属性:new { @class = "date" },从而当用户点击日期文本框时,显示日历控件,供用户选择日期。详情,请参照文章: Asp.net MVC2.0系列文章-添加操作. 删除页面NewsDelete.aspx主要代码如下: <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> <h2>删除新闻</h2> <h3>确认要删除此条记录吗?</h3> <fieldset> <legend>Fields</legend> <div class="display-label">编号:</div> <div class="display-field"><%: Model.Id %></div> <div class="display-label">标题:</div> <div class="display-field"><%: Model.Title %></div> <div class="display-label">创建时间:</div> <div class="display-field"><%: String.Format("{0:g}", Model.CreateTime) %></div> <div class="display-label">新闻内容</div> <div class="display-field"><%: Model.Content %></div> </fieldset> <% using (Html.BeginForm()) { %> <p> <input type="submit" value="Delete" /> | <%: Html.ActionLink("Back to List", "Index") %> </p> <% } %> </asp:Content> 修改Controller文件 在Controllers/News文件下 修改NewsEdit.aspx页面所对应的的Action方法NewsEdit,以使NewsEdit.aspx页面初始化数据,此处未读读取数据库,而是从静态变脸集合中读取相对应的记录。 NewsEdit.asp所对应的 Action 代码如下: //编辑页面初始化方法 // GET: /News/Edit/5 public ActionResult NewsEdit(int id) { THelperMVC.Models.News.NewsModel news = newsList[id]; return View(news); } [HttpPost] //点击编辑按钮时,触发的方法 public ActionResult Edit(int id, FormCollection collection) { try { // TODO: 添加更新业务逻辑 return RedirectToAction("Index"); } catch { return View(); } } NewsDelete.Aspx所对应的Action方法,如下 // GET: /News/Delete/5 /// <summary> /// 页面初始化时,触发的方法 /// </summary> /// <param name="id">URL中的参数Id值</param> /// <returns>新闻实体对象</returns> public ActionResult NewsDelete(int id) { THelperMVC.Models.News.NewsModel news = newsList[id]; return View(news); } // POST: /News/Delete/5 [HttpPost] //点击【删除】按钮时触发的方法 public ActionResult Delete(int id, FormCollection collection) { try { // TODO: 添加删除业务逻辑 return RedirectToAction("Index"); } catch { return View(); } } 根据URL传过来的参数(即新闻编号Id),从全局静态变量中寻找NewsModel实体,从而初始化新闻删除页面。 最后修改新闻页Index.aspx中的Edit连接,如下图所示: 此时,点击新闻页Index.aspx超链接,会寻找NewsController文件夹下的NewsEdit方法或者NewsDelete方法,从而初始化Views/News/NewsEdit.aspx页面或者Views/News/NewsDelete.aspx页面, 程序运行效果 按下Ctrl+F5运行程序,如下图所示: 点击上图中的【News】超链接,跳转到新闻列表页面,如下图所示: 点击【Edit】超链接,会跳转到相应记录的编辑页面,如下图所示: 点击【Delete】超链接,会跳转到相应记录的删除页面,如下图所示: 总结 至此,使用Asp,net MVC2.0框架完成了简单的增查改删操作。接下来,在时间允许的情况下,会对MVC2.0框架原理进行一些总结,还望园子里德朋友指点。 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
上一篇文章,我们简单地完成了新闻的添加操作(Asp.net MVC2.0系列文章-添加操作)此篇文章,我们使用Asp.net MVC2.0实现新闻清单的展示和新闻详细页面。 创建View视图Index和NewsDetails 创建新闻首页,用来显示新闻列表。 在Views/News目录下,单击右键,选择Add->View,修改相关配置如下图所示 在生成的HTML代码中,进行相关展示方面的修改。主要代码如下: <% foreach (var item in Model) { %> <tr> <td> <%: Html.ActionLink("Edit", "NewsEdit", new { id=item.Id }) %> | <%: Html.ActionLink("Details", "NewsDetails", new { id=item.Id })%> | <%: Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ })%> </td> <td> <%: item.Title %> </td> <td> <%: String.Format("{0:g}", item.CreateTime) %> </td> <td> <%: item.Content %> </td> </tr> <% } %> 使用Foreach循环遍历新闻List中的记录。 <%: Html.ActionLink("Details", "NewsDetails", new { id=item.Id })%> 此连接URL会寻找当前Controller下的NewsDetails Action方法,以新闻编号Id为参数进行传值。 同样的方法创建新闻详细页面视图NewsDetails.asp 生成的核心代码如下: <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> <h2>详细内容</h2> <fieldset> <legend>新闻</legend> <div class="display-label">标题</div> <div class="display-field"><%: Model.Title %></div> <div class="display-label">创建时间</div> <div class="display-field"><%: String.Format("{0:g}", Model.CreateTime) %></div> <div class="display-label">新闻内容</div> <div class="display-field"><%: Model.Content %></div> </fieldset> <p> <%: Html.ActionLink("Edit", "NewsEdit", new { id=Model.Id }) %> | <%: Html.ActionLink("Back to List", "Index") %> </p> </asp:Content> <%: Html.ActionLink("Edit", "NewsEdit", new { id=Model.Id }) %> | 此连接会跳转到新闻编辑页面,同样以新闻编号Id传值。 修改Controller文件 在Controllers/News文件下 修改Action Name=Index的方法,以使Index.aspx页面初始化数据,此处未读读取数据库,而是伪造了一些数据,且放到静态变量中: public static List<THelperMVC.Models.News.NewsModel> newsList; Index Action 代码如下: public ActionResult Index() { newsList= new List<THelperMVC.Models.News.NewsModel>(); for (int i = 0; i < 10; i++) { THelperMVC.Models.News.NewsModel news=new THelperMVC.Models.News.NewsModel(); news.Id = i; news.Title = "Title" + i.ToString(); news.CreateTime = System.DateTime.Now; news.Content = "Content 新?闻?内¨²容¨Y" + i.ToString(); newsList.Add(news); } return View(newsList); } 使用For循环生成10条新闻记录。 修改NewsDetails.Aspx所对应的Action方法,如下 // GET: /News/Details/5 public ActionResult NewsDetails(int id) { THelperMVC.Models.News.NewsModel news=newsList[id]; return View(news); } 根据URL传过来的参数(即新闻编号Id),从全局静态变量中寻找NewsModel实体,从而初始化新闻详细页面。 最后修改母版页中的,News连接,如下图所示: 此时,点击首页的News超链接,会寻找NewsController文件夹下的Index方法,从而初始化Views/News/Index.aspx页面。 程序运行效果 按下Ctrl+F5运行程序,如下图所示: 点击上图中的【News】超链接,跳转到新闻列表页面,如下图所示: 点击Details超链接,会跳转到相应记录的详细页面,如下图所示: 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
此篇文章,我们将实现MVC2.0的添加操作,主要包括Model的创建、View的Edit操作和Control的Create操作。 创建数据模型Model 数据模型主要包括数据信息、验证规则以及业务逻辑。 创建Model的方式有多种,可以使用微软的ADO.NET Entity Data Model,也可以使用第三方工具生成实体对象,对于比较简单的实体,我们可以手工添加,此处就是手动敲上去的。 分析:此处定义了新闻实体对象的的一些属性,在每个Property上都存在一些注解,比如字段Title上RequiredAttribute,表明Title栏位是必填字段,如果不填写会显示错误信息”请输入标题!” DataTypeAttribute属性表明此字段的数据类型为文本类型,它是个枚举类型集合,如下: Member name Description Custom Represents a custom data type. DateTime Represents an instant in time, expressed as a date and time of day. Date Represents a date value. Time Represents a time value. Duration Represents a continuous time during which an object exists. PhoneNumber Represents a phone number value. Currency Represents a currency value. Text Represents text that is displayed. Html Represents an HTML file. MultilineText Represents multi-line text. EmailAddress Represents an e-mail address. Password Represent a password value. Url Represents a URL value. ImageUrl Represents a URL to an image. 这些类型,可以分别试试,看看最终效果什么样子的。 DisplayNameAttribute属性表明了此字段要文字说明。 创建View视图 MVC提供了生成View的向导工具,很方便的,如下图流程步骤: 我们在View文件夹下,新建一个新文件夹,命名为News 右击News文件夹,选择Add->Add View功能菜单,出现如下界面: 在View name栏位,我可以给此视图修改名称,比如AddNews, 选中Create a strongly-typed view 栏位,选择刚才定义的实体类Model,并选择View content栏位为Create操作。 其他栏位默认值就OK 最终效果如下图所示: 单击【Add】按钮,即可添加AddNews.aspx视图成功。此文件的核心代码如下所示: <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> <h2> 添¬¨ª加¨®新?闻?</h2> <% using (Html.BeginForm()) {%> <%: Html.ValidationSummary(true) %> <fieldset> <legend>新?闻?</legend> <div class="editor-label"> <%: Html.LabelFor(model => model.Title) %> </div> <div class="editor-field"> <%: Html.TextBoxFor(model => model.Title) %> <%: Html.ValidationMessageFor(model => model.Title) %> </div> <div class="editor-label"> <%: Html.LabelFor(model => model.CreateTime) %> </div> <div class="editor-field"> <%: Html.TextBoxFor(model => model.CreateTime, new { @class = "date" })%> <%: Html.ValidationMessageFor(model => model.CreateTime) %> </div> <div class="editor-label"> <%: Html.LabelFor(model => model.Content) %> </div> <div class="editor-field"> <%: Html.EditorFor(model => model.Content) %> <%: Html.ValidationMessageFor(model => model.Content) %> </div> <p> <input type="submit" value="添¬¨ª加¨®" /> </p> </fieldset> <% } %> <div> <%: Html.ActionLink("Back to List", "Index","Home") %> </div> </asp:Content> 分析: 在日期文本框中,新增加属性new { @class = "date" }),此Class属性是为了稍后的日历控件的显示。要使日期文本框显示日期控件,可以使用Jquery UI,方法是: 1/、Jquery UI官方网站http://www.jqueryUI.com下载最新的 UI类库 2、添加日历控件的CSS文件和JS文件到项目中,如下图 3、在母版页面Site.Master中添加JS的引用,以及页面初始化时绑定日历控件到文本框,代码如下: <link href="http://www.cnblogs.com/Content/jquery.ui.all.css" rel="stylesheet" type="text/css" /> <script src="http://www.cnblogs.com/Scripts/jquery-1.4.1.min.js" type="text/javascript"></script> <script src="http://www.cnblogs.com/Scripts/jquery-ui-1.8.2.custom.min.js" type="text/javascript"></script> <script type="text/javascript"> $(document).ready(function () { $("input:text.date").datepicker( { dateFormat: "yy-mm-dd" }); }); </script> 到此,日历栏位的文本框就可以显示日历控件了,稍后看效果图。 创建Controller文件 在Controllers文件夹下,新增News文件夹; 单击右键,选择Add->Controller,显示如下界面 重命名Controller Name栏位为NewsController,同时选择下方的复选框,最终效果如下图: 单击【Add】按钮,自动产生Controller中的一些方法,这时候对Controller中的方法做一些修改,即可完成添加新闻页面初始化的方法,以及添加新闻功能,代码如下: // GET: /News/Create //完成页面初始化 public ActionResult AddNews() { return View(); } // // POST: /News/Create //完成添加按钮事件 [HttpPost] public ActionResult AddNews(THelperMVC.Models.News.AddNewsModel news) { if (ModelState.IsValid) { newsService.AddNews(); return RedirectToAction("index", "Home"); } else { ModelState.AddModelError("", "请?输º?入¨?合?法¤¡§的Ì?信?息¡é!ê?"); } return View(news); } 至此,MVC的各个层次都已经创建完,让我们看看最终的效果吧。 程序效果图 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
安装VS2010 首先安装VS2010,安装过程请参考文章: http://www.cnblogs.com/ywqu/archive/2010/01/27/1657450.html。 创建第一个MVC2.0程序 新建一个asp.net MVC2.0网站程序,如下图: 提示是否新建单元测试工程,选择创建Unit Test Project MVC2.0网站结构图 默认新建一个Asp.net MVC2.0网站程序,结构图如下所示 Content文件夹:存放CSS样式文件 Controllers文件夹:存放控制器文件,文件名称以Controller结尾 Model文件夹:存放数据模型以及业务逻辑和规则,文件名称以Models结尾 Scripts文件夹:存放Javascript文件,VS2010整合了Jquery,所以此文件夹下有Jquery类库 View文件夹:存放视图文件。 MvcAppDemo.Tests是默认的单元测试工程。 网站运行结果 运行默认的网站,如下图所示: 首页: About页面 注册页面 登录页面 在此登录页面中,如果不输入任何信息,点击【Log On】按钮,会触发非空验证。 总结 此篇文章只是让初学者对 MVC2.0网站有个大概的印象,学习和创建MVC2.0网站应用程序并不是想象的那么苦难,不妨动手试一试。接下来文章,我们就使用MVC2.0的新特性创建一些实例。 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
使用微软VS工具开发Web应用程序主要有两种方式:一种是常用的创建Asp.net Web Forms,另外一种就是今天着重介绍的Asp.net MVC. Web Forms有两部分组成:Aspx檔以及后台代码aspx.cs文件。 Web Forms优点是: HTML接口与业务逻辑分开 丰富的服务器控件,加速了开发速度 数据绑定技术 基于事件的程序模型 用户控件和第三方控件技术 什么是Asp.net MVC? ASP.NET MVC Framework是微软在ASP.NET中所添加的一组类别库,这组类库可以使用Model-View-Controller的设计模式来开发ASP.NET的应用程序 Model:包括数据、验证规则、数据访问和业务逻辑等应用程序信息。 View:封装了应用程序的表示层,是呈现给使用者看的信息。 Controller:包括控制流逻辑,控制信息流和应用程序的执行。接受来自用户的指令与数据,并将Model与View做整合的控制器,当服务器接到对ASP.NET MVC应用程序的要求时,服务器(IIS)会先使用UrlRoutingModule(ASP.NET Routing的 HTTP 模块),由它来解析是否有包含ASP.NET MVC应用程序的URL,若有,则会产生一个MvcRouteHandler对象,这个对象会装载执行的必要信息,并且会呼叫包含在URL中的Controller的Execute方法来执行工作。 Web应用程序MVC化的优点有: 更易操作HTML标记 更方便地与Jquery整合,实现Ajax技术 创建SEO友好的URLS 驱动式开发更容易 Asp.net MVC发展史 ASP.NET MVC Framework的第一个版本于2009年3月17日释出RTM版本,新的MVC 2.0也已在2010年3月11日释出供.NET Framework 3.5版本使用的RTM版本,MVC2.0在Visual Studio 2010已有集成。接下来的一系列文章使用的工具就是VS2010 MVC2.0 Asp.net MVC2.0新特性 MVC2.0的新特性主要有: Areas:允许组织多个逻辑层,便于团队开发。 UI Helpers:可以使用strongly-typed helpers修改和展示数据,更易于维护旧有程序,从而提供高开发效率。 服务器端验证:可以使用声明式注解定义模型的验证规则。 客户端验证:自动产生基于模型验证的客户端验证。 参考资料 http://aspnet.codeplex.com/wikipage?title=MVC&referringTitle=Home http://www.asp.net/(S(m4vhrxrb1md4rg451u0b1445))/mvc/whatisaspmvc 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
一、软件简介 当你想做屏幕录像和录制声音时,还苦于需要付费购买录像软件吗?有没有想过有一款免费的屏幕录像软件可以使用,答案是确定的,在这里我向大家推荐一块免费屏幕录像软件:Community Clips Recorder。这款软件主要提供了屏幕操作过程的录制以及声音的录制,然后上传到视频网站,这样就可以分享、查看、讨论你录制的视频,起到传播知识的目的。 二、软件安装 对这个软件有了简单的了解之后,那么我们看一下他是如何安装的,其实很简单,步骤如下: 1、 首先到这个地址下载软件:http://go.microsoft.com/fwlink/?LinkId=117503 2、 双击安装进入如下界面 点击【Next】进入如下界面 在以上界面选择【I Agree】,然后点击【Next】,进入如下界面 在此以上界面中选择文件安装路径以及软件使用者,这里选择的【Everyone】.点击【Next】进入以下界面 在以上界面中询问是否愿意加入微软【Office Labs Usage Metrics】,默然选中,点击【Next】进入以下界面 在以上界面中提示【是否自动更新Community Clips软件】,默认选中,点击【Next】进入以下确认安装界面,如下 点击【Next】进入安装过程 安装完此软件,会继续安装Windows Media Ecoder9 Series软件,用来录制视频,如下图 安装完毕,进入如下界面: 点击【Close】按钮,即安装完毕。 三、软件使用 启动Community Clips软件之后,会在右下角有一标志,如下图: 右击图标出现下界面 点击【Start Recording(Windows+Alt+R)】或者快捷键Windows+Alt+R即可开始录制视频,当录制视频的过程中,点击右下角有一标志,弹出如下界面: 点击【Stop Recording(Windows+Alt+T )】或者快捷键Windows+Alt+T即可停止录制视频。 录制效果请参考:http://technet.microsoft.com/zh-cn/ee803754.aspx 四、Community Clips使用技巧 那么在录制视频的过程中,我们应该注意哪些事项,才可以录制高清晰高质量的视频呢? 1、视频时间不要太长 录制的视频内容不要太多,时间也不要太长,建议2-4分钟,这样视频观看者就可以重放视频,或者根据视频内容练习操作。 2、关闭其他无关的应用程序 在录制的过程中,弹出任何软件(比如Mail客户端、即时通讯工具等)都有可能需要重新录制视频, 更重要的是,Community Clips软件比较耗CPU,所以在录制的过程中建议关闭其他无关的应用程序。 3、重置屏幕分辨率 在录制视频之前,建议把分辨率调整为1024x768。 4、保持录制房间清净 在录制视频之前,建议把手机调整为静音,同时把门窗关好,防止在录制的过程中出现意想不到的噪音,越安静录制的效果越流程。 5、给视频起个符合内容的名字 给视频起一个响亮而又符合内容的名字是很有必要的,名字越清楚 越符合视频内容,浏览者通过搜索引擎搜索到的机会越大,视频被关注的程度就越大。另外在上传到视频网站的时候,给视频多个关键字或者标签Tags。让浏览者更容易找到你的视频。 6、上传视频到网站 录制好的视频可以上传到各大视频网站,或者与微软合作网站(后期补充网址),让你的知识传遍世界。 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
VS2010已经发布几天时间了,一些新的特性特别引人注目,比如: l 性能的稳定和提升,表现在WPF GUI和WPF文本呈现。 l Windows Azure Tools模板。 l 多显示器支持,输出窗口,类图窗口,代码定义窗口等提供辅助信息的窗口放置在副显示器中。 l 对并行计算开发的大量支持。 l 包含了SharePoint的项目模板和调试支持。 l 用于Silverlight和WPF的拖放绑定支持。 l C++ IDE的增强:通过简单的拖放操作,就能生成稳健的Windows窗体应用程序。 l 通过并行安装以向后兼容.NET 3.5。 l F#语言的支持,JavaScript智能感知引擎等等。 除去以上特性,创建自定义SQL Rule也有所变化。本文就如何在VS2010中创建SQL Rule进行说明 。 1. 什么是Visual Studio Database Edition以及特性。 Visual Studio Database Edition(以下简称VSDB)是针对典型的数据库开发任务而设计的,可以对原有数据库反向工程,添加表,存储过程和其他数据库项目,而且有选择性地将修改部署到目标数据库中。他的主要特性有: 1.1模型对比(Schema Compare) 在项目的维护和升级期间,至少需要维护产品数据库(正在正式运营的数据库)、测试数据库、开发数据库这三个数据库,那开发数据库结构变更后,如何同步到其他两个数据库上呢?模型对比功能可以很好地解决此问题。如果开发数据库结构变更,可以通过选择菜单的Data → Schema Compare → Filter中选择Different Objects, Missing Objects or New Objects来过滤列表。这个过滤可以使我们快速地看到哪些修改需要更新到目标数据库中。然后我们可以保存修改脚本到一个文件中,并在T-SQL编辑器或者直接将修改精写入到目标数据库。 1.2数据对比(Data Compare) 用来比较两个数据库的表或者视图中数据是否相同,可进行比较的前提是数据库名称一致、表具有相同的主键、唯一索引或唯一约束。比较完后可以对修改保存到目标数据库或者脚本。这个特性可以将产品数据库的数据导入到开发数据库或者测试数据库,以便于开发和测试。 1.3数据生成计划(Data Generation Plans) 在项目中,开发团队每周至少一次提交版本到测试环境,测试人员针对新的数据结构如何快速生成测试基础数据呢? 数据生成计划会解决此问题。在数据生成计划计划中,我们要定义生成数据的表、每一个表要生成的记录行数和要插入数据的类型。数字类型比较容易生成,针对特殊的数据比如Email、电话号码可以通过正则表达式RegEx完成。 1.4重构(Refactor) 主要用来重命名数据库对象,比如数据库名称,表名称,视图名称。当要重命名的对象改变后,对此对象的引用都会相应地改变。 2. 如何自定义SQL Rule 随着时代的进步及其全球化,企业业务越来越复杂,造成软件项目也越来越庞大,软件开发再也不是单枪匹马的时代,靠一两个人是完成不了任务的,软件工厂模式是一个趋势,软件工厂生产线是一个方向,软件的生成就可以像普通的产品一样,流转过整个生产线后,已经定型并被客户部署上线。庞大的生产线,庞大的队伍,各式各样的编程习惯,如何保证生产线的效率和软件产品质量,无规矩不成方圆,代码编写规范是其中很重要的一个规矩,数据库命名规范也是代码编写规范里面比较重要的组成部分,VSDB可以很好地解决这个问题,强制要求开发人员按照数据库规范来对数据库对象命名。接下来让我们看看如何解决这个问题。 2.1生成强命名类 调用命令行程序(路径=系统盘:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\) sn.exe -k FRIMLEC.text.snk 然后把创建好的FRIMLEC.text.snk加入的工程中。设置参见下图(选中工程右键--Properties--Signning) 提示:使用强名称对程序集进行签名将向包含程序集清单的文件添加公钥加密。强名称签名帮助验证名称的唯一性,避免名称欺骗,并在解析引用时向调用方提供唯一标识。但是,任何信任级别都不会与一个强名称关联。 2.2引入类库 using Microsoft.Data.Schema.Extensibility; using Microsoft.Data.Schema.SchemaModel; using Microsoft.Data.Schema.SchemaModel.Abstract; using Microsoft.Data.Schema.ScriptDom.Sql; using Microsoft.Data.Schema.Sql.SchemaModel.SqlServer; using Microsoft.Data.Schema.Sql.SqlDsp; using Microsoft.Data.Schema.StaticCodeAnalysis; 2.3定义类 定义了一些类的属性(attributes)。 DatabaseSchemaProviderCompatibility允许用户指定Sql Rule所要应用的SqlDatabase类型,这里使用的是标准SqlDatabase。 DataRuleAttirbute用来指定name, id, description等其他规则属性。 SupportedElementTypeAttribute,此属性用来指定要验证的数据库对象,此处要验证的是表字段。 2.4构造函数 public MyStylePrefixedTable() : base( "SqlRule", "DD0002", "All columns must be in form xxxx_xxxxxxxx", "All columns must be in form xxxx_xxxxxxxx where the part befor the _ is table code, and part after is descriptivename", "", "MyStylePrefixedTable") { } 定义一些列的命名规则,即4个字母的表名_字段名。 2.5新建资源文件 所有传到DataRuleAttribute里面的字符串都需要添加到以上资源文件中。填写资源文件如下图: 2.6创建常量类 此处的ResourceBaseName就是资源文件的表名。 2.7重写Analyze方法 public override IList<DataRuleProblem> Analyze(DataRuleSetting ruleSetting, DataRuleExecutionContext context { List<DataRuleProblem> problems = new List<DataRuleProblem>(); IList<string> nameParts = context.ModelElement.Name.Parts; IDatabaseColumn column = context.ModelElement as IDatabaseColumn; if (column == null) return null; if (nameParts.Count == 3) { if (!Regex.Match(nameParts[2], @"^w{4}_w*").Success) { string message = string.Format( "Column {0} of table {1}.{2} must have the form pref_columnname.", nameParts[2], nameParts[0], nameParts[1]); DataRuleProblem p = new DataRuleProblem(this, message, context.ModelElement); p.Severity = DataRuleProblemSeverity.Error; problems.Add(p); } } return problems; } 2.8注册Sql Rule copy "$(TargetDir)$(TargetName)$(TargetExt)" "$(ProgramFiles)Microsoft Visual Studio 10.0VSTSDBExtensions$(TargetName)$(TargetExt)" /y copy "$(ProjectDir)$(TargetName).Extensions.xml" "$(ProgramFiles)Microsoft Visual Studio 10.0VSTSDBExtensions$(TargetName).Extensions.xml" /y "C:Program FilesMicrosoft SDKsWindowsv7.0ABinNETFX 4.0 Toolsgacutil.exe" /if "$(ProgramFiles)Microsoft Visual Studio 10.0VSTSDBExtensions$(TargetName)$(TargetExt)" 拷贝到Build Events->Pre-build event中,然后编译类库,生成相应的DLL文件,供其项目调用。 至此,在VS2010中定制数据库命名规则的功能完成,再也不用担心开发人员不按照规则开发了,如果出现不按照规则的命名,脚本编译不能通过,并且有提示。 3. 总结 相信VS2010的这些新的特性,以及一些新的开发技巧能够快速提高开发人员的工作效率。对VS2010新版本感兴趣的朋友,可以通过该地址下载:http://www.microsoft.com/visualstudio/zh-cn/products/2010/default.mspx 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
1 什么是设计模式 设计模式是对在软件设计过程中重复出现的问题提出了一种比较好的解决方案。正如一位专家所说:设计模式是对程序设计人员经常遇到的设计问题的可再现的解决方案(The Smalltalk Companion)。GOF设计模式通常被认为是其他设计模式的基础,随着业务复杂度的增大,会不断涌现新的设计模式,而这些新的设计模式一般会以GOF模式理论为参照。 2 为什么要学习设计模式 从个人职业规划来考虑。一位软件开发工程师随着编码量的增加,开发经验的增加,软件理论理解的加深,会不由自主地想一些方法或者捷径,来提高自己的生产率,而不是面对重复的问题做相同的工作,当你有这种想法的时候,就需要开始学习设计模式,设计模式会给你一些比较好的解决方案,不但解决了问题也提升了自己的能力,同时也是迈向软件设计师和架构师的过度阶段。 从软件架构的角度来考虑。经济的快速发展造就了业务越来越复杂,那么如何使软件适应这种复杂的业务变化,在软件设计和架构时,适当地使用设计模式可以解决此问题,也要注意不要过度使用设计模式,否则会使系统变的更加复杂。设计模式也是代码重构的依据和工具,建议在代码的重构时,尽量融入设计模式。 3 设计模式原则 使用设计模式的根本原因是适用变化,提高代码复用率,使软件更具有可维护性和可扩展性。需要遵循以下几个原则:单一职责原色、开放封闭原则(Open Closed Principal)、依赖倒置原则、里氏代换原则。 3.1单一职责原则 就一个类而言,应该只有一个引起他变化的原因。如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会消弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破会。 3.2开放封闭原则 软件实体(类、模块、函数等)应该可以扩展,但不可以修改。也就是说对扩展是开放的,对修改是封闭的。一般来说,面对需求,对程序的改动是通过添加新代码进行的,而不是更改现有代码。 3.3依赖倒置原则 抽象不应该以来细节,细节应该依赖抽象,也就是提倡的“面对接口编程,而不是面对实现编程”。也可以这样理解:高层模块不应该依赖底层模块,两个都应该抽象;抽象不应该依赖细节,细节应该依赖抽象。 3.4里氏代换原则 子类必须能够替换掉他们的父类型。也就是说,在软件开发过程中,子类替换掉父类,程序的功能行为没有变化。只有当子类可以替换掉父类,软件单位的功能不受到影响时,父类才能真正被复用,而子类也可以在父类的基础上增加新的行为。 4 设计模式四个基本要素 设计模式使人们可以更加简单方便地复用成功的设计和体系结构,将已证实的技术表述成设计模式也会使新加入的系统开发者更加容易理解其设计思路。设计模式的基本要素包括模式名称、问题、解决方案和效果。 4.1模式名称 一个助记名称,用来描述设计模式、解决方案和效果。设计模式允许在较高的抽象层次上进行设计。基于一个模式词汇表,开发团队之间可以讨论模式并在编写文档时使用它们。模式名称可以帮助我们思考,便于团队成员交流设计思想及设计结果。找到合适的模式名称也是设计模式编目工作的难点之一。 4.2问题 问题主要描述在何时使用设计模式。它解释了设计问题和问题存在的前因后果、特定的设计问题和怎样用对象表示算法等。通常情况下,模式必须满足的一系列先决条件是问题。 4.3解决方案 解决方案描述了设计的组成成分、它们之间的相互关系及各自的职责和协作方式。因为模式就像一个模板,可应用于多种不同场合,所以解决方案并不描述一个特定具体的设计或实现,而是提供设计问题的抽象描述和怎样用一个具有一般意义的元素组合(类或对象组合)来解决这个问题。 4.4效果 描述了模式应用的效果及使用模式权衡的问题。尽管描述设计决策时,并不是总提到模式效果,但它们对于评价设计选择和理解使用模式的代价及优势具有重要意义。软件效果大多关注对时间和空间的衡量,它们也表述了语言和实现问题。因为复用是面向对象设计的要素之一,所以模式效果包括它对系统灵活性、扩充性或可移植性的影响,显式地列出这些效果对理解和评价这些模式很有帮助。 5 设计模式分类 设计模式主要分为创建性模式( Creational Patterns)、结构性模式(Structural Patterns)、行为性模式(Behavioral Patterns)。 5.1创建性模式( Creational Patterns) 5.1.1 Net设计模式实例之简单工厂模式(Simple Factory Pattern) 简单工厂模式(Simple Factory Pattern)的优点是,工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖 5.1.2 Net设计模式实例之抽象工厂模式(Abstract Factory Pattern) 抽象工厂模式(Abstract Factory Pattern),提供一个创建一系列相关或者相互依赖对象的接口,而无需制定他们的具体类。抽象工厂模式的典型应用就是,使用抽象工厂+反射+配置文件实现数据访问层程序 5.1.3 Net设计模式实例之单例模式( Singleton Pattern) 单例模式(Singleton Pattern),保证一个类只有一个实例,并提供一个访问它的全局访问点。单例模式因为Singleton封装它的唯一实例,它就可以严格地控制客户怎样访问它以及何时访问它。 5.1.4 Net设计模式实例之建造者模式(Builder Pattern) 建造者模式(Builder Pattern),将一个复杂对象的构建与它的表示分离,使的同样的构建过程可以创建不同的表示。建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式时适用的模式 5.1.5 Net设计模式实例之原型模式( Prototype Pattern) 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。Specify the kind of objects to create using a prototypical instance, and create new objects by copying this prototype。 浅复制与深复制区别: 浅复制,被复制的所有变量都还有与原来对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。深复制,把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。 Net命名空间System提供了一个IConeable接口,此接口只有一个方法Clone(),只需要实现这个接口就可以实现原型模式(Prototype Pattern)了 5.2结构性模式(Structural Patterns) 5.2.1 Net设计模式实例之适配器模式(Adapter Pattern) 适配器模式,将一个类装换成客户期望的另外一个接口。Adapter模式统一了不兼容对象的接口,使的原本由于接口不兼容而不能工作的那些类可以一起工作。 5.2.2 Net设计模式实例之桥接模式( Bridge Pattern) 桥接模式(Bridge Pattern),将抽象部分与它的实现部分分离,使的抽象和实现都可以独立地变化。Decouple an abstraction from its implementation so that the two can vary independently.。 什么是聚合/组合: 聚合(Aggregation),当对象A被加入到对象B中,成为对象B的组成部分时,对象B和对象A之间为聚合关系。聚合是关联关系的一种,是较强的关联关系,强调的是整体与部分之间的关系。 5.2.3Net设计模式实例之组合模式(Composite Pattern) 组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。解决整合与部分可以被一致对待问题。 5.2.4 Net设计模式实例之装饰者模式(Decorator Pattern) 装饰模式,给一个对象动态添加额外职责,这些职责需要由用户决定加入的方式和时机。装饰模式提供了“即插即用”的方式,在运行期间决定何时增加何种功能。就增加功能来说,装饰模式比生成子类更加灵活。 5.2.5 Net设计模式实例之外观模式(Façade Pattern) 外观模式,为子系统的一组接口提供一个统一的界面,此模式定义了一个高层接口,这一个高层接口使的子系统更加容易使用。外观模式可以解决层结构分离、降低系统耦合度和为新旧系统交互提供接口功能。 5.2.6 Net设计模式实例之享元模式( Flyweight Pattern) 享元模式(Flyweight Pattern),运用共享技术有效支持大量细粒度的对象。Use sharing to support large numbers of fine-grained objects efficiently. 享元模式可以避免大量非常相似类的开销。在程序设计中有时需要生成大量细粒度的类实例来表示数据。如果发现这些实例除了几个参数外基本伤都是相同的,有时就能够受大幅度第减少需要实例化的类的数量。如果能把这些参数移到类实例外面,在方法调用时将他们传递进来,就可以通过共享大幅度地减少单个实例的数目。 享元对象的内部状态与外部状态: 内部状态,在享元对象的内部并且不会随环境改变而改变的共享部分。 外部状态,随环境改变而改变的,不可以共享的状态。 5.2.7 Net设计模式实例之代理模式(Proxy Pattern) 代理模式(Proxy Pattern)对其他对象提供一种代理以控制对这个对象的访问。 5.3行为性模式(Behavioral Patterns) Net设计模式实例之职责链模式(Chain Of Responsibility) 后期补此节 5.3.1Net设计模式实例之命令模式(Command Pattern) 命令模式(Command Pattern)将请求封装为一个对象,从而使你用不同的请求对客户进行参数化,对请求排队或纪录请求日志,以及支持可撤销的操作。当需要有撤销或者恢复操作时,可以考虑使用命令模式. 5.3.2Net设计模式实例之解释器模式(Interpreter Pattern) 解释器模式(Interpreter Pattern),给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象的语法树时,可以考虑使用解释器模式。 5.3.3 Net设计模式实例之迭代器模式(Iterator Pattern) 迭代器模式(Iterator Pattern),提供一种方法顺序访问一个聚合对象中元素,而不暴露改集合对象的内部表示。迭代器模式就是分离了集合对想的遍历行为,抽象出一个迭代器类来负责,这样即可以不暴露集合的内部机构,又可让外部代码透明地访问集合内部的数据. 5.3.4 Net设计模式实例之中介者模式(Mediator Pattern) 中介者模式(Mediator Pattern),定义一个中介对象来封装系列对象之间的交互。中介者使各个对象不需要显示地相互引用,从而使其耦合性松散,而且可以独立地改变他们之间的交互。中介者模式一般应用于一组对象以定义良好但是复杂的方法进行通信的场合,以及想定制一个分布在多个类中的行为,而不想生成太多的子类的场合. 5.3.5 Net设计模式实例之备忘录模式(Memento Pattern) 备忘录模式(Memento Pattern),在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以就该对象恢复到原先保存的状态。 当系统功能比较复杂,而且需要记录历史属性以便当需要时做恢复动作。Originator可以根据保存的Memento信息还原到前一状态。 5.3.6Net设计模式实例之观察者模式(Observer Pattern) 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化的时,会通知所有观察者对象,使他们能够自动更新自己。解决的是“当一个对象的改变需要同时改变其他对象的时候”问题。最后以股票实例进一步阐述了观察者模式。 5.3.7Net设计模式实例之状态模式(State Pattern) 状态模式(State Pattern),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。当一个对象行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了. Net设计模式实例之策略模式(Strategy Pattern) 后期补此节 5.3.8Net设计模式实例之模板方法模式(Template Mothed Pattern) 模板方法模式(Template Method Pattern),定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可以重定义算法的某些特定步骤。模板方法模式把不变行为搬移到超类,从而去除子类中的重复代码,实际上模板方法模式就是提供了一个代码复用平台。 要完成在某一细节上层次一致的一个过程或一系列步骤,但个别步骤在更详细的层次上实现不同时,可以使用模版方法模式解决问题。 5.3.9Net设计模式实例之访问者模式(Visitor Pattern) 访问者模式表示一个作用于某对象结构中的个元素操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 访问者模式的目的是要把处理从数据结构分离出来 6 设计模式总结 Net设计模式系列文章介绍了GOF 23个模式,从模式的设计理念、设计框架、框架的代码介绍了设计模式,并且每个模式配有模式实例,UML设计及其C#代码。使用的设计工具是EA:Enterprise Architect.主要参考的书籍有《Head First 设计模式》《大话设计模式》《Net与设计模式》《C# 3.0 Design Pattern》及其国外一些文章的实例,在此对这些书的作者感谢,在阅读此系列文章之前,建议大家先阅读《UML建模系列文章总结》 至此,Net设计模式实例系列文章已经写完,由于个人能力有限,不免有些问题阐述的不清楚或者不是非常正确,望高手指点。再此感谢 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
前段时间发布了Jquery类库1.4版本,使用者也越来越多,为了方便大家对Jquery的使用,下面列出了一些Jquery使用技巧。比如有禁止右键点击、隐藏搜索文本框文字、在新窗口中打开链接、检测浏览器、预加载图片、页面样式切换、所有列等高、动态控制页面字体大小、获得鼠标指针的X值Y值、验证元素是否为空、替换元素、延迟加载、验证元素是否存在于Jquery集合中、使DIV可点击、克隆对象、使元素居中、计算元素个数、使用Google主机上的Jquery类库、禁用Jquery效果、解决Jquery类库与其他Javascript类库冲突问题。 具体如下: 1. 禁止右键点击 view plaincopy to clipboardprint? 1. $(document).ready(function(){ 2. $(document).bind("contextmenu",function(e){ 3. return false; 4. }); 5. }); 2. 隐藏搜索文本框文字 view plaincopy to clipboardprint? 1. $(document).ready(function() { 2. $("input.text1").val("Enter your search text here"); 3. textFill($('input.text1')); 4. }); 5. 6. function textFill(input){ //input focus text function 7. var originalvalue = input.val(); 8. input.focus( function(){ 9. if( $.trim(input.val()) == originalvalue ){ input.val(''); } 10. }); 11. input.blur( function(){ 12. if( $.trim(input.val()) == '' ){ input.val(originalvalue); } 13. }); 14. } 3. 在新窗口中打开链接 view plaincopy to clipboardprint? 1. $(document).ready(function() { 2. //Example 1: Every link will open in a new window 3. $('a[href^="http://"]').attr("target", "_blank"); 4. 5. //Example 2: Links with the rel="external" attribute will only open in a new window 6. $('a[@rel$='external']').click(function(){ 7. this.target = "_blank"; 8. }); 9. }); 10. // how to use 11. <A href="http://www.opensourcehunter.com" rel=external>open link</A> 4. 检测浏览器 注: 在版本jQuery 1.4中,$.support 替换掉了$.browser 变量。 view plaincopy to clipboardprint? 1. $(document).ready(function() { 2. // Target Firefox 2 and above 3. if ($.browser.mozilla && $.browser.version >= "1.8" ){ 4. // do something 5. } 6. 7. // Target Safari 8. if( $.browser.safari ){ 9. // do something 10. } 11. 12. // Target Chrome 13. if( $.browser.chrome){ 14. // do something 15. } 16. 17. // Target Camino 18. if( $.browser.camino){ 19. // do something 20. } 21. 22. // Target Opera 23. if( $.browser.opera){ 24. // do something 25. } 26. 27. // Target IE6 and below 28. if ($.browser.msie && $.browser.version <= 6 ){ 29. // do something 30. } 31. 32. // Target anything above IE6 33. if ($.browser.msie && $.browser.version > 6){ 34. // do something 35. } 36. }); 5. 预加载图片 view plaincopy to clipboardprint? 1. $(document).ready(function() { 2. jQuery.preloadImages = function() 3. { 4. for(var i = 0; i").attr("src", arguments[i]); 5. } 6. }; 7. // how to use 8. $.preloadImages("image1.jpg"); 9. }); 6. 页面样式切换 view plaincopy to clipboardprint? 1. $(document).ready(function() { 2. $("a.Styleswitcher").click(function() { 3. //swicth the LINK REL attribute with the value in A REL attribute 4. $('link[rel=stylesheet]').attr('href' , $(this).attr('rel')); 5. }); 6. // how to use 7. // place this in your header 8. <LINK href="default.css" type=text/css rel=stylesheet> 9. // the links 10. <A class=Styleswitcher href="#" rel=default.css>Default Theme</A> 11. <A class=Styleswitcher href="#" rel=red.css>Red Theme</A> 12. <A class=Styleswitcher href="#" rel=blue.css>Blue Theme</A> 13. }); 7. 列高度相同 如果使用了两个CSS列,使用此种方式可以是两列的高度相同。 view plaincopy to clipboardprint? 1. $(document).ready(function() { 2. function equalHeight(group) { 3. tallest = 0; 4. group.each(function() { 5. thisHeight = $(this).height(); 6. if(thisHeight > tallest) { 7. tallest = thisHeight; 8. } 9. }); 10. group.height(tallest); 11. } 12. // how to use 13. $(document).ready(function() { 14. equalHeight($(".left")); 15. equalHeight($(".right")); 16. }); 17. }); 8. 动态控制页面字体大小 用户可以改变页面字体大小 view plaincopy to clipboardprint? 1. $(document).ready(function() { 2. // Reset the font size(back to default) 3. var originalFontSize = $('html').css('font-size'); 4. $(".resetFont").click(function(){ 5. $('html').css('font-size', originalFontSize); 6. }); 7. // Increase the font size(bigger font0 8. $(".increaseFont").click(function(){ 9. var currentFontSize = $('html').css('font-size'); 10. var currentFontSizeNum = parseFloat(currentFontSize, 10); 11. var newFontSize = currentFontSizeNum*1.2; 12. $('html').css('font-size', newFontSize); 13. return false; 14. }); 15. // Decrease the font size(smaller font) 16. $(".decreaseFont").click(function(){ 17. var currentFontSize = $('html').css('font-size'); 18. var currentFontSizeNum = parseFloat(currentFontSize, 10); 19. var newFontSize = currentFontSizeNum*0.8; 20. $('html').css('font-size', newFontSize); 21. return false; 22. }); 23. }); 9. 返回页面顶部功能 view plaincopy to clipboardprint? 1. $(document).ready(function() { 2. $('a[href*=#]').click(function() { 3. if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') 4. && location.hostname == this.hostname) { 5. var $target = $(this.hash); 6. $target = $target.length && $target 7. || $('[name=' + this.hash.slice(1) +']'); 8. if ($target.length) { 9. var targetOffset = $target.offset().top; 10. $('html,body') 11. .animate({scrollTop: targetOffset}, 900); 12. return false; 13. } 14. } 15. }); 16. // how to use 17. // place this where you want to scroll to 18. <A name=top></A> 19. // the link 20. <A href="#top">go to top</A> 21. }); 11.获得鼠标指针XY值 view plaincopy to clipboardprint? 1. $(document).ready(function() { 2. $().mousemove(function(e){ 3. //display the x and y axis values inside the div with the id XY 4. $('#XY').html("X Axis : " + e.pageX + " | Y Axis " + e.pageY); 5. }); 6. // how to use 7. <DIV id=XY></DIV> 8. 9. }); 12. 验证元素是否为空 view plaincopy to clipboardprint? 1. $(document).ready(function() { 2. if ($('#id').html()) { 3. // do something 4. } 5. }); 13. 替换元素 view plaincopy to clipboardprint? 1. $(document).ready(function() { 2. $('#id').replaceWith(' 3. <DIV>I have been replaced</DIV> 4. 5. '); 6. }); 14. jQuery延时加载功能 view plaincopy to clipboardprint? 1. $(document).ready(function() { 2. window.setTimeout(function() { 3. // do something 4. }, 1000); 5. }); 15. 移除单词功能 view plaincopy to clipboardprint? 1. $(document).ready(function() { 2. var el = $('#id'); 3. el.html(el.html().replace(/word/ig, "")); 4. }); 16. 验证元素是否存在于Jquery对象集合中 view plaincopy to clipboardprint? 1. $(document).ready(function() { 2. if ($('#id').length) { 3. // do something 4. } 5. }); 17. 使整个DIV可点击 view plaincopy to clipboardprint? 1. $(document).ready(function() { 2. $("div").click(function(){ 3. //get the url from href attribute and launch the url 4. window.location=$(this).find("a").attr("href"); return false; 5. }); 6. // how to use 7. <DIV><A href="index.html">home</A></DIV> 8. 9. }); 18.ID与Class之间转换 当改变Window大小时,在ID与Class之间切换 view plaincopy to clipboardprint? 1. $(document).ready(function() { 2. function checkWindowSize() { 3. if ( $(window).width() > 1200 ) { 4. $('body').addClass('large'); 5. } 6. else { 7. $('body').removeClass('large'); 8. } 9. } 10. $(window).resize(checkWindowSize); 11. }); 19. 克隆对象 view plaincopy to clipboardprint? 1. $(document).ready(function() { 2. var cloned = $('#id').clone(); 3. // how to use 4. <DIV id=id></DIV> 5. 6. }); 20. 使元素居屏幕中间位置 view plaincopy to clipboardprint? 1. $(document).ready(function() { 2. jQuery.fn.center = function () { 3. this.css("position","absolute"); 4. this.css("top", ( $(window).height() - this.height() ) / 2+$(window).scrollTop() + "px"); 5. this.css("left", ( $(window).width() - this.width() ) / 2+$(window).scrollLeft() + "px"); 6. return this; 7. } 8. $("#id").center(); 9. }); 21. 写自己的选择器 view plaincopy to clipboardprint? 1. $(document).ready(function() { 2. $.extend($.expr[':'], { 3. moreThen1000px: function(a) { 4. return $(a).width() > 1000; 5. } 6. }); 7. $('.box:moreThen1000px').click(function() { 8. // creating a simple js alert box 9. alert('The element that you have clicked is over 1000 pixels wide'); 10. }); 11. }); 22. 统计元素个数 view plaincopy to clipboardprint? 1. $(document).ready(function() { 2. $("p").size(); 3. }); 23. 使用自己的 Bullets view plaincopy to clipboardprint? 1. $(document).ready(function() { 2. $("ul").addClass("Replaced"); 3. $("ul > li").prepend("‒ "); 4. // how to use 5. ul.Replaced { list-style : none; } 6. }); 24. 引用Google主机上的Jquery类库 Let Google host the jQuery script for you. This can be done in 2 ways. view plaincopy to clipboardprint? 1. //Example 1 2. <SCRIPT src="http://www.google.com/jsapi"></SCRIPT> 3. <SCRIPT type=text/javascript> 4. google.load("jquery", "1.2.6"); 5. google.setOnLoadCallback(function() { 6. // do something 7. }); 8. </SCRIPT><SCRIPT src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js" type=text/javascript></SCRIPT> 9. 10. // Example 2:(the best and fastest way) 11. <SCRIPT src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js" type=text/javascript></SCRIPT> 25. 禁用Jquery(动画)效果 view plaincopy to clipboardprint? 1. $(document).ready(function() { 2. jQuery.fx.off = true; 3. }); 26. 与其他Javascript类库冲突解决方案 view plaincopy to clipboardprint? 1. $(document).ready(function() { 2. var $jq = jQuery.noConflict(); 3. $jq('#id').show(); 4. }); 英文地址: http://www.opensourcehunter.com/2010/02/27/26-cool-and-usefull-jquery-tips-tricks-solutions/ 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
类比估算法也被称作自上而下的估算,是一种通过比照已完成的类似项目的实际成本,去估算出新项目成本的方法。 类比估算法适合评估一些与历史项目在应用领域、环境和复杂度方面相似的项目。其约束条件在于必须存在类似的具有可比性的软件开发系统,估算结果的精确度依赖于历史项目数据的完整性、准确度以及现行项目与历史项目的近似程度。 采用这个方法的前提是: a. 对以前项目规模和工作量的计量是正确的; b. 至少有一个以前的项目的规模和新项目类似; c. 新项目的开发周期、使用的开发方法、开发工具与以前项目的类似,而且开发人员的技能和经验也不能与原。 类比法的基本步骤是: 1、整理出项目功能列表和实现每个功能的编码行数; 2、标识出每个功能列表与历史项目的相同点和不同点,特别要注意历史项目做得不够的地。 方;(吃一堑,涨一智;避免犯同样的错误) 3、通过步骤1和2得出各个功能的估计值; 4、产生规模估计。 优点: 估计较为准确; 缺点:要依赖于实际经验;必须要有类似的项目可供参考 采用类比法往往还要解决可重用代码的估算问题。估计可重用代码量的最好办法就 是由程序员或系统分析员详细地考查已存在的代码,估算出新项目可重用的代码中需重 新设计 的代码百分比、需重新编码或修改的代码百分比以及需重新测试的代码百分 比。根据这三个百 分比,可用下面的计算公式计算等价新代码行: 等价代码行 = [(重新设计% +重新编码% +重新测试%)/3]× 已有代码行 比如:有10,000行代码,假定35%需要重新设计,55%需要重新编码,75%需要重新测 试, 那么其等价的代码行可以计算为: [(30% + 50% + 70%)/3]×10,000= 5,500 等价代码行。 即:重用这10000代码相当于编写 5500代码行的工作量。 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
有时,一个网站的导航菜单文字不能提供足够的信息,来表达当前菜单按钮的内容,一般的解决办法是使用提示信息ToolTip,那么本文介绍的流动导航菜单Fluid Navigation也可以解决此问题,同时也为网站设计的添加了一些时尚而又动感元素。那么我们应该如何实现流动导航菜单呢? 一、效果图 鼠标滑过Menu,即Show提示信息。 二、实现步骤 1、CSS代码 menuBarHolder { width: 730px; height:45px; background-color:#000; color:#fff; font-family:Arial; font-size:14px; margin-top:20px;} #menuBarHolder ul{ list-style-type:none; display:block;} #container { margin-top:100px;} #menuBar li{ float:left; padding:15px; height:16px; width:50px; border-right:1px solid #ccc; } #menuBar li a{color:#fff; text-decoration:none; letter-spacing:-1px; font-weight:bold;} .menuHover { background-color:#999;} .firstchild { border-left:1px solid #ccc;} .menuInfo { cursor:hand; background-color:#000; color:#fff; width:74px; font-size:11px;height:100px; padding:3px; display:none; position:absolute; margin-left:-15px; margin-top:-15px; -moz-border-radius-bottomright: 5px; -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px; -webkit-border-bottom-right-radius: 5px; -khtml-border-radius-bottomright: 5px; -khtml-border-radius-bottomleft: 5px; border-radius-bottomright: 5px; border-radius-bottomleft: 5px; } menuBarHolder: 菜单Menu的固定容器,宽度=730px。 menuInfo:控制提示信息的展示与否。 2、HTML代码 <div id="menuBarHolder"> <ul id="menuBar"> <li class="firstchild"><a href="javascript:#">Home</a> <div class="menuInfo">I am some text about the home section</div></li> <li><a href="javascript:#">Services</a> <div class="menuInfo">I am some text about the services section</div></li> <li><a href="javascript:#">Clients</a> <div class="menuInfo">I am some text about the clients section</div></li> <li><a href="javascript:#">Portfolio</a> <div class="menuInfo">I am some text about the portfolio section</div></li> <li><a href="javascript:#">About</a> <div class="menuInfo">I am some text about the about section</div></li> <li><a href="javascript:#">Blog</a> <div class="menuInfo">I am some text about the blog section</div></li> <li><a href="javascript:#">Follow</a> <div class="menuInfo">I am some text about the follow section</div></li> <li><a href="javascript:#">Contact</a> <div class="menuInfo">I am some text about the contact section</div></li> </ul> </div> UI LI元素:列表元素。 DIV元素:提示内容信息。 3、Javascript代码 $(document).ready(function() { $('#menuBar li').click(function() { var url = $(this).find('a').attr('href'); document.location.href = url; }); $('#menuBar li').hover(function() { $(this).find('.menuInfo').slideDown(); }, function() { $(this).find('.menuInfo').slideUp(); }); }); click()、 hover():给Li元素绑定单击事件和鼠标滑过事件。 find()函数:搜索所有与指定表达式匹配的元素。这个函数是找出正在处理的元素的后代元素的好方法。 slideDown(speed, [callback]):通过高度变化(向下增大)来动态地显示所有匹配的元素,在显示完成后可选地触发一个回调函数。 slideUp(speed, [callback]):通过高度变化(向上减小)来动态地隐藏所有匹配的元素,在隐藏完成后可选地触发一个回调函数。 演示地址:http://addyosmani.com/resources/fluid-menu/fluid-menu.html 下载地址:http://addyosmani.com/resources/fluid-menu/fluid-menu.zip 参考英文: http://addyosmani.com/blog/fluid-navigation-how-to-create-an-informative-menu-bar-with-jquery-in-just-a-few-minutes/#myPosts 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
现在软件在大多数基于计算机的系统中已成为最昂贵的部分,如果软件成本估算的误差很大,就会使盈利变成亏损。 软件项目估算是一种解决问题的形式,在多数情况下,要解决的问题非常复杂,想一次性整体解决比较困难。因此,对问题进行分解,把其分解成一组较小的接近于最终解决的可控的子问题,再定义它们的特性。 估算技术一般有代码行(LOC)和功能点(FP)估算法,这是两种不同的估算技术,但有许多共同特性。项目计划人员首先给出一个有界的软件范围的叙述,再由此尝试着把软件分解成一些小的可分别独立进行估算的子功能。然后对每一个子功能估算其LOC或FP(即估算变量)。接着,把基线生产率度量用做特定的估算变量,导出子功能的成本或工作量。将子功能的估算进行综合后就能得到整个项目的总估算。 LOC或FP估算技术对于分解所需要的详细程度是不同的。当用LOC作为估算变量时,功能分解是绝对必要的且需要达到很详细的程度。而估算功能点所需要的数据是宏观的量,当把FP当做估算变量时所需要的分解程度可以不很详细。LOC是直接估算的,而FP是通过估计输入、输出、数据文件、查询和外部接口的数目,以及复杂性校正值间接地确定的。除去所用到的估算变量,项目计划人员必须对每一个分解的功能提出一个有代表性的估算值范围。利用历史数据或凭实际经验,计划人员对每个功能分别按乐观的、可能的、悲观的三种情况给出LOC或FP估计值。 为了反映开发特性的影响,应当随时修正平均生产率。 1 LOC(Lines of Code,代码行)估算代码尺寸 把项目划分为若干个功能,分别计算每个功能的代码长度,所有功能代码行之和即项目的代码长度。 LOC估算表包括: 每个功能的代码长度估算值=(乐观值+4*可能值+悲观值)/6 估算工作量=代码总估算长度/估算生产率 估算总成本=日薪*估算工作量 估算行成本=估算总成本/估算代码长度 估算生产率由经验获得 2 FP(功能点)估算代码尺寸 项目的功能点数是几个测量参数(用户输入数、用户输出数、用户查询数、文件数、外部接口数)的功能点之和。 用户输入数:计算每个用户输入,它们向软件提供面向应用的数据。输入应该与查询区分开来,分别计算。 用户输出数:计算每个用户输出,它们向软件提供面向应用的信息。这里,输出是指报表、屏幕、出错信息,等等。一个报表中的单个数据项不单独计算。 用户查询数:一个查询被定义为一次联机输入,它导致软件以联机输出的方式产生实时的响应。每一个不同的查询都要计算。 文件数:计算每个逻辑的主文件(如数据的一个逻辑组合,它可能是某个大型数据库的一部分或是一个独立的文件)。 外部接口数:计算所有机器可读的接口(如磁带或磁盘上的数据文件),利用这些接口可以将信息从一个系统传送到另一个系统。 FP估算表包括: 每个测量参数的估算FP计数=估算值*加权因子 项目估算FP=各参数FP计数之和*复杂度调整因子 估算生产率由经验获得 估算工作量=项目估算FP/估算生产率 估算总成本=日薪*估算工作量 单个FP估算成本=估算总成本/估算FP 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
一、中介者模式简介(Brief Introduction) 中介者模式(Mediator Pattern),定义一个中介对象来封装系列对象之间的交互。中介者使各个对象不需要显示地相互引用,从而使其耦合性松散,而且可以独立地改变他们之间的交互。 Define an object that encapsulates how a set of objects interact. Mediator promotes loose coupling by keeping objects from referring to each other explicitly, and it lets you vary their interaction independently。 中介者减少了各个同事对象的耦合,使得可以独立地改变和复用各个同事对象和中介者类;由于把对想如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到他们之间的交互上来,也就是站在一个更宏伟的角度去考虑系统。 二、解决的问题(What To Solve) 中介者模式一般应用于一组对象以定义良好但是复杂的方法进行通信的场合,以及想定制一个分布在多个类中的行为,而不想生成太多的子类的场合。 三、中介者模式分析(Analysis) 1、中介者模式结构 Mediator类:抽象中介者,定义了同事对象交互的接口。 ConcreteMediator类:具体中介者对象,实现抽象类中的方法,此具体中介者对象需要知道所有具体同事类,并从具体同事接受消息,向具体同事对象发送命令。 Colleague类:抽象同事类。 ConcreteColleague1类,ConcreteColleague2类:具体同事类,实现抽象同事类中的方法。每一个同时类需要知道中介者对象;每个具体同事类只需要了解自己的行为,而不需要了解其他同事类的情况。 2、源代码 1、中介者类Mediator及其具体实现类ConcreteMediator /// <summary> /// The 'Mediator' abstract class /// </summary> abstract class Mediator { public abstract void Send(string message,Colleague colleague); } /// <summary> /// The 'ConcreteMediator' class /// </summary> class ConcreteMediator : Mediator { private ConcreteColleague1 _colleague1; private ConcreteColleague2 _colleague2; public ConcreteColleague1 Colleague1 { set { _colleague1 = value; } } public ConcreteColleague2 Colleague2 { set { _colleague2 = value; } } public override void Send(string message,Colleague colleague) { if (colleague == _colleague1) { _colleague2.Notify(message); } else { _colleague1.Notify(message); } } } 2、抽象同事类Colleague及其实现类ConcreteColleague1、ConcreteColleague2 /// <summary> /// The 'Colleague' abstract class /// </summary> abstract class Colleague { protected Mediator mediator; // Constructor public Colleague(Mediator mediator) { this.mediator = mediator; } } /// <summary> /// A 'ConcreteColleague' class /// </summary> class ConcreteColleague1 : Colleague { // Constructor public ConcreteColleague1(Mediator mediator) : base(mediator) { } public void Send(string message) { mediator.Send(message, this); } public void Notify(string message) { Console.WriteLine("Colleague1 gets message: "+ message); } } /// <summary> /// A 'ConcreteColleague' class /// </summary> class ConcreteColleague2 : Colleague { // Constructor public ConcreteColleague2(Mediator mediator) : base(mediator) { } public void Send(string message) { mediator.Send(message, this); } public void Notify(string message) { Console.WriteLine("Colleague2 gets message: "+ message); } } 3、客户端代码 static void Main(string[] args) { ConcreteMediator m = new ConcreteMediator(); ConcreteColleague1 c1 = new ConcreteColleague1(m); ConcreteColleague2 c2 = new ConcreteColleague2(m); m.Colleague1 = c1; m.Colleague2 = c2; c1.Send("How are you? JamesHao"); c2.Send("Fine, thanks"); // Wait for user Console.ReadKey(); } 3、程序运行结果 四.中介者模式案例分析(Example) 1、场景 实现一个聊天室功能,聊城室就是一个中介者,参与聊天的人就是同事对象,如下图所示 AbstractChatroom类:抽象聊天室类,做为Participant的交互的中介。 Register()方法:会员注册功能;Send()方法:发送消息功能。 Chatroom类:具体聊天室类,实现抽象聊天室类中的方法。 Participant类:参与者类,主要有发送消息Send()功能和接受消息Receive()功能。 Beatle类,NonBeatle类:参与者类的具体实现,实现父类Paticipant类中的方法。 2、代码 1、抽象聊天室类AbstractChatroom及其具体聊天室Chatroom /// <summary> /// The 'Mediator' abstract class /// </summary> abstract class AbstractChatroom { public abstract void Register(Participant participant); public abstract void Send(string from, string to, string message); } /// <summary> /// The 'ConcreteMediator' class /// </summary> class Chatroom : AbstractChatroom { private Dictionary<string, Participant> _participants =new Dictionary<string, Participant>(); public override void Register(Participant participant) { if (!_participants.ContainsValue(participant)) { _participants[participant.Name] = participant; } participant.Chatroom = this; } public override void Send(string from, string to, string message) { Participant participant = _participants[to]; if (participant != null) { participant.Receive(from, message); } } } 2、参与者Participant类及其实现Beatle、NonBeatle /// <summary> /// The 'AbstractColleague' class /// </summary> class Participant { private Chatroom _chatroom; private string _name; // Constructor public Participant(string name) { this._name = name; } // Gets participant name public string Name { get { return _name; } } // Gets chatroom public Chatroom Chatroom { set { _chatroom = value; } get { return _chatroom; } } // Sends message to given participant public void Send(string to, string message) { _chatroom.Send(_name, to, message); } // Receives message from given participant public virtual void Receive(string from, string message) { Console.WriteLine("{0} to {1}: '{2}'",from, Name, message); } } /// <summary> /// A 'ConcreteColleague' class /// </summary> class Beatle : Participant { // Constructor public Beatle(string name) : base(name) { } public override void Receive(string from, string message) { Console.Write("To a Beatle: "); base.Receive(from, message); } } /// <summary> /// A 'ConcreteColleague' class /// </summary> class NonBeatle : Participant { // Constructor public NonBeatle(string name) : base(name) { } public override void Receive(string from, string message) { Console.Write("To a non-Beatle: "); base.Receive(from, message); } } 3、客户端代码 static void Main(string[] args) { // Create chatroom Chatroom chatroom = new Chatroom(); // Create participants and register them Participant George = new Beatle("George"); Participant Paul = new Beatle("Paul"); Participant Ringo = new Beatle("Ringo"); Participant John = new Beatle("John"); Participant Yoko = new NonBeatle("Yoko"); chatroom.Register(George); chatroom.Register(Paul); chatroom.Register(Ringo); chatroom.Register(John); chatroom.Register(Yoko); // Chatting participants Yoko.Send("John", "Hi John!"); Paul.Send("Ringo", "All you need is love"); Ringo.Send("George", "My sweet Lord"); Paul.Send("John", "Can't buy me love"); John.Send("Yoko", "My sweet love"); // Wait for user Console.ReadKey(); } 3、运行结果 五、总结(Summary) 中介者模式(Mediator Pattern),定义一个中介对象来封装系列对象之间的交互。中介者使各个对象不需要显示地相互引用,从而使其耦合性松散,而且可以独立地改变他们之间的交互。中介者模式一般应用于一组对象以定义良好但是复杂的方法进行通信的场合,以及想定制一个分布在多个类中的行为,而不想生成太多的子类的场合。 参考:http://www.dofactory.com/Patterns/PatternMediator.aspx 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
瀑布模型/改进的瀑布模型 虽然瀑布模型仍然存在很多的问题有待解决,但瀑布模型仍然是最基本的和最效的一种可供选择的软件开发生命周期模型.瀑布模型要求软件开发严格按照需求->分析->设计->编码->测试的阶段进行,每一个阶段都可以定义明确的产出物和验证准则.瀑布模型在每一个阶段完成后都可以组织相关的评审和验证,只有在评审通过后才能够进入到下一个阶段. 由于需要对每一个阶段进行验证,瀑布模型要求每一个阶段都有明确的文档产出,对于严格的瀑布模型每一个阶段都不应该重叠,而应该是在评审通过,相关的产出物都已经基线后才能够进入到下一个阶段. 瀑布模型的优点仍然是可以保证整个软件产品较高的质量,保证缺陷能够提前的被发现和解决.采用瀑布模型可以保证系统在整体上的充分把握,使系统具备良好的扩展性和可维护性.但对于前期需求不明确,而又很难短时间明确清楚的项目则很难很好的利用瀑布模型.另外对于中小型的项目,需求设计和开发人员往往在项目开始后就会全部投入到项目中,而不是分阶段投入,因此采用瀑布模型会导致项目人力资源过多的闲置的情况,这也是必须要考虑的问题. 很多人往往会以进度约束而不选择瀑布模型,这往往是一个错误的观点.导致这种情况的一个关键因素往往是概念需求阶段人力不足.因此在概念需求阶段人力能够得到充分保证的情况下,瀑布模型和迭代模型在开发周期上并不会存在太大的差别.反而是很多项目对于迭代或敏捷模型用不好,为了赶进度在前期需求不明确,没有经过一个总体的架构设计情况下就开始编码,后期出现大量的返工而严重影响进度. 架构设计是软件开发中一个重要的关注点.因此在RUP中也提及到软件开发要以架构为核心.因此在架构设计完成后系统会被分为相关的子系统和功能模块.每个功能模块间的接口都可以定义清楚.在这种情况下,当模块B的详细设计做完成后往往就没有必要等到其它模块的详细设计都要完全作完才开始编码,因此在架构设计完成后可以将系统分为多个模块并行开发,每个模块仍然遵循先设计和编码测试的瀑布模型思路.这是瀑布模型的一种最重要的改进思路,也可以说这是一种增量开发的模型. 当一个新系统的开发存在多个完全不相关的独立需求的功能开发的时候,这个时候也可以选择将整个开发过程按独立的需求来分为多个小瀑布进行操作.这种方式的最大问题就是没有一个完全总体的设计,架构设计人员无法在洞悉了所有需求后从系统的可扩展性,复用等方面总体规划. 在项目管理中有一种压缩进度的方法叫赶工,因此瀑布模型的另外改进处就在适当的重叠各个阶段过程,达到资源的有效利用.比如我们通过讨论,会议确定的实现方式就可以开始执导下一个阶段的工作而不一定完全等到相关的交付物文档化出来. 螺旋模型 首先螺旋模型是遵从瀑布模型的.即需求->架构->设计->开发->测试的路线.螺旋模型最大的价值在于整个开发过程是迭代和风险驱动的.通过将瀑布模型的多个阶段转化到多个迭代过程中,以减少项目的风险. 螺旋模型的每一次迭代都包含了以下六个步骤 1.决定目标,替代方案和约束 2.识别和解决项目的风险 3.评估技术方案和替代解决方案 4.开发本次迭代的交付物和验证迭代产出的正确性. 5.计划下一次迭代 6.提交下一次迭代的步骤和方案. 螺旋模型实现了随着项目成本投入不断增加,风险逐渐减小.以帮我我们加强项目的管理和跟踪,在每次迭代结束后都需要对产出物进行评估和验证,当发现无法继续进行下去时可以及早的终止项目. 螺旋模型复杂的地方在于尽责,专心和知识渊博的管理.因为对于每一次迭代我们要制定出清晰的目标,分析出相关的关键风险和计划中可以验证和测试的交付物并不是一件容易的事情. 螺旋模型的每一次迭代只包含了瀑布模型的某一个或两个阶段.如第二次迭代重点是需求,第三次迭代是总体设计和后续设计开发计划等.因此这是和RUP提倡的迭代模型是有区别的,RUP的每一次迭代都会包含需求,设计,开发和测试等各个阶段的活动.RUP迭代的目的在于逐步求精而不是仅仅完成瀑布模型某一阶段的工作. 增量和迭代模型 增量迭代是RUP统一过程常采用的软件开发生命周期模型.增量和迭代有区别但两者又经常一起使用.所以这里要先解释下增量和迭代的概念.假设现在要开发A,B,C,D四个大的业务功能,每个功能都需要开发两周的时间.则对于增量方法而言可以将四个功能分为两次增量来完成,第一个增量完成A,B功能,第二次增量完成C,D功能;而对于迭代开发来将则是分两次迭代来开发,第一次迭代完成A,B,C,D四个基本业务功能但不含复杂的业务逻辑,而第二个功能再逐渐细化补充完整相关的业务逻辑.在第一个月过去后采用增量开始时候A,B全部开发完成而C,D还一点都没有动;而采用迭代开发的时候A,B,C,D四个的基础功能都已经完成. RUP强调的每次迭代都包含了需求,设计和开发,测试等各个过程,而且每次迭代完成后都是一个可以交付的原型.迭代不是并行,在每次迭代过程中仍然要遵循需求->设计->开发的瀑布过程.迭代周期的长度跟项目的周期和规模有很大的关系.小型项目可以一周一次迭代,而对于大型项目则可以2-4周一次迭代.如果项目没有一个很好的架构师,很难规划出每次迭代的内容和要到达的目标,验证相关的交付和产出.因此迭代模型虽然能够很好的满足与用户的交付,需求的变化,但确是一个很难真正用好的模型. 就对风险的消除上,增量和迭代模型都能够很好的控制前期的风险并解决.但迭代模型在这方面更有优势.迭代模型更多的可以从总体方面去系统的思考问题,从最早就可以给出相对完善的框架或原型,后期的每次迭代都是针对上次迭代的逐步精化. 业界比较标准的增量模型往往要求在软件需求规格说明书全部出来后后续的设计开发再进行增量.同时每个增量也可以是独立发布的小版本.由于系统的总体设计往往对一个系统的架构和可扩展性有重大的影响,因此我们推荐的增量最好是在架构设计完成后再开始进行增量,这样可以更好的保证系统的健壮性和可扩展性. 原型法 原型一般都不是单独采用的一种生命周期模型,往往会结合瀑布和增量迭代等方法一起使用.对于螺旋模型就可以理解为瀑布+迭代+原型+风险的一种生命周期模型.对于迭代开发来讲,每一个迭代周期的产出都可以看做是下个阶段要精化的原型.而对于瀑布模型开发来讲,我们在需求阶段也可以进行界面和操作建模,形成DEMO后和用户做进一部的需求沟通和确认. 当你的用户没有信息系统的使用经验,你的系统分析员也没有过多的需求分析和挖掘经验的时候,需求分析和调研过程则更需要是一个启发式的过程.而原型则是这种很好的启发式方法,可以快速的挖掘用户需求并达成需求理解上的一致.否则即使双方都签字认可的需求往往仍然不是客户真正想要的东西. 原型可以分为抛弃型的和不抛弃型的.如果原型仅仅是需求阶段方面和用户沟通画的DEMO,则这种原型一般都建议抛弃掉.而对于迭代开发来将,每次迭代的产出都是可以独立运行和包含基础功能的系统,是后续细化的基础,这类原型一般都不建议抛弃,后期的设计开发也要基于该原型逐渐的进行完善. 快速和敏捷开发 我们一般将快速和敏捷开发做为方法论,而很少将其做为一种软件开发生命周期模型.敏捷的目的是减少繁重和不必要的工件的输出,提高效率.而不是要我们去挑阶段或过程,不是分析设计都还没有做就去做开发.因此对于瀑布,增量迭代或原型我们都可以借鉴敏捷方法论中的一些好的实践,这些实践都是对传统的生命周期模型很好的补充.对于敏捷方法论在此不再做过多的叙述. 关于选择生命周期模型的最后的总结 1.在前期需求明确的情况下尽量采用瀑布模型或改进型的瀑布模型. 2.在用户无信息系统使用经验,需求分析人员技能不足情况下一定要借助原型. 3.在不确定性因素很多,很多东西前面无法计划情况下尽量采用增量迭代和螺旋模型 4.在需求不稳定情况下尽量采用增量迭代模型 5.在资金和成本无法一次到位情况下可以采用增量模型,软件产品分多个版本进行发布 6.对于完全多个独立功能开发可以在需求阶段就分功能并行,但每个功能内都应该遵循瀑布模型 7.对于全新系统的开发必须在总体设计完成后再开始增量或并行. 8.对于编码人员经验较少情况下建议不要采用敏捷或迭代等生命周期模型. 9.增量,迭代和原型可以综合使用,但每一次增量或迭代都必须有明确的交付和出口准则。 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
一、迭代器模式简介(Brief Introduction) 迭代器模式(Iterator Pattern),提供一种方法顺序访问一个聚合对象中元素,而不暴露改集合对象的内部表示。 Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation. 二、解决的问题(What To Solve) 当需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,应该考虑用迭代器模式;当需要对聚集有多种方式遍历时,可以考虑使用迭代器模式。 三、迭代器模式分析(Analysis) 1、迭代器模式结构 Aggragate类:聚集抽象类 并通过CreateIterator()方法创建一个迭代对象。 ConcrateAggregate类:具体实现类,继承于Aggregate抽象类,实现创建迭代对象的方法。 Iterator迭代抽象类:定义一个接口用于访问和遍历集合中的各个元素; First()方法:定位第一个元素 Next()方法:定位下一个元素 IsDone()方法:是否为结尾元素 CurrentItem()方法:定位当前对象 ConcreteIterator具体迭代类:继承于Iterator抽象类,实现父类中的各个方法。 2、源代码 1、聚集抽象类Aggregate及其具体实现类ConcreteAggregate /// <summary> /// The 'Aggregate' abstract class /// </summary> abstract class Aggregate { public abstract Iterator CreateIterator(); } /// <summary> /// The 'ConcreteAggregate' class /// </summary> class ConcreteAggregate : Aggregate { private ArrayList _items = new ArrayList(); public override Iterator CreateIterator() { return new ConcreteIterator(this); } // Gets item count public int Count { get { return _items.Count; } } // Indexer public object this[int index] { get { return _items[index]; } set { _items.Insert(index, value); } } } 2、抽象迭代器类Iterator及其具体迭代器类ConcreteIterator /// <summary> /// The 'Iterator' abstract class /// </summary> abstract class Iterator { public abstract object First(); public abstract object Next(); public abstract bool IsDone(); public abstract object CurrentItem(); } /// <summary> /// The 'ConcreteIterator' class /// </summary> class ConcreteIterator : Iterator { private ConcreteAggregate _aggregate; private int _current = 0; // Constructor public ConcreteIterator(ConcreteAggregate aggregate) { this._aggregate = aggregate; } // Gets first iteration item public override object First() { return _aggregate[0]; } // Gets next iteration item public override object Next() { object ret = null; if (_current < _aggregate.Count - 1) { ret = _aggregate[++_current]; } return ret; } // Gets current iteration item public override object CurrentItem() { return _aggregate[_current]; } // Gets whether iterations are complete public override bool IsDone() { return _current >= _aggregate.Count; } } 3、客户端代码 static void Main(string[] args) { ConcreteAggregate a = new ConcreteAggregate(); a[0] = "Item A"; a[1] = "Item B"; a[2] = "Item C"; a[3] = "Item D"; // Create Iterator and provide aggregate ConcreteIterator i = new ConcreteIterator(a); Console.WriteLine("Iterating over collection:"); object item = i.First(); while (item != null) { Console.WriteLine(item); item = i.Next(); } // Wait for user Console.ReadKey(); } 3、程序运行结果 四.迭代器模式案例分析(Example) 1、场景 遍历一个集合元素,在每次的遍历过程中跳过一些元素,如下图所示 IAbstractCollection类:聚集接口类 并通过CreateIterator()方法创建一个迭代对象。集合元素是Item类. Collection类:具体实现类,继承于IAbstractCollection接口,实现创建迭代对象的方法。 IAbsctractIterator迭代接口类:定义一个接口用于访问和遍历集合中的各个元素; First()方法:定位第一个元素 Next()方法:定位下一个元素 IsDone()方法:是否为结尾元素 CurrentItem()方法:定位当前对象 Iterator具体迭代类:继承于IAbsctractIterator抽象类,实现父类中的各个方法。 2、代码 1、聚集接口IAbstractCollection及其实现类Collection /// <summary> /// A collection item /// </summary> class Item { private string _name; // Constructor public Item(string name) { this._name = name; } // Gets name public string Name { get { return _name; } } } /// <summary> /// The 'Aggregate' interface /// </summary> interface IAbstractCollection { Iterator CreateIterator(); } /// <summary> /// The 'ConcreteAggregate' class /// </summary> class Collection : IAbstractCollection { private ArrayList _items = new ArrayList(); public Iterator CreateIterator() { return new Iterator(this); } // Gets item count public int Count { get { return _items.Count; } } // Indexer public object this[int index] { get { return _items[index]; } set { _items.Add(value); } } } 2、迭代器接口IAbstractIterator及其实现类Iterator /// <summary> /// The 'Iterator' interface /// </summary> interface IAbstractIterator { Item First(); Item Next(); bool IsDone { get; } Item CurrentItem { get; } } /// <summary> /// The 'ConcreteIterator' class /// </summary> class Iterator : IAbstractIterator { private Collection _collection; private int _current = 0; private int _step = 1; // Constructor public Iterator(Collection collection) { this._collection = collection; } // Gets first item public Item First() { _current = 0; return _collection[_current] as Item; } // Gets next item public Item Next() { _current += _step; if (!IsDone) return _collection[_current] as Item; else return null; } // Gets or sets stepsize public int Step { get { return _step; } set { _step = value; } } // Gets current iterator item public Item CurrentItem { get { return _collection[_current] as Item; } } // Gets whether iteration is complete public bool IsDone { get { return _current >= _collection.Count; } } } 3、客户端代码 static void Main(string[] args) { // Build a collection Collection collection = new Collection(); collection[0] = new Item("Item 0"); collection[1] = new Item("Item 1"); collection[2] = new Item("Item 2"); collection[3] = new Item("Item 3"); collection[4] = new Item("Item 4"); collection[5] = new Item("Item 5"); collection[6] = new Item("Item 6"); collection[7] = new Item("Item 7"); collection[8] = new Item("Item 8"); // Create iterator Iterator iterator = new Iterator(collection); // Skip every other item iterator.Step = 2; Console.WriteLine("Iterating over collection:"); for (Item item = iterator.First(); !iterator.IsDone; item = iterator.Next()) { Console.WriteLine(item.Name); } // Wait for user Console.ReadKey(); } 3、运行结果 五、总结(Summary) 迭代器模式(Iterator Pattern),提供一种方法顺序访问一个聚合对象中元素,而不暴露改集合对象的内部表示。迭代器模式就是分离了集合对想的遍历行为,抽象出一个迭代器类来负责,这样即可以不暴露集合的内部机构,又可让外部代码透明地访问集合内部的数据 源代码参考:http://www.dofactory.com/Patterns/PatternIterator.aspx 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
一、解释器模式简介(Brief Introduction) 解释器模式(Interpreter Pattern),给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。使用了解释器模式,可以很容易地改变和扩展文法,因为该模式使用类来表示文法规则,可以使用继承来改变或扩展该文法。也比较容易实现文法,因为定义抽象语法树中各个节点的类的实现大体类似,这些类容易直接编写。 二、解决的问题(What To Solve) 如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子,这样就可以构建一个解释器,该解释器通过解释这些句子来解决问题。 三、解释器模式分析(Analysis) 1、解释器模式结构 AbstractExpression抽象类:声明一个接口,用于执行一个操作。 TerminalExpression类:终结符表达式,实现与文法中的终结符相关的解释操作。 NonterminalExpression类:非终结符表达式,为文法中的非终结符实现解释操作。对文法中每一条规则R1、R2.......RN都需要一个具体的非终结符表达式类。 Context类:包含解释器之外的一些全局信息。 2、源代码 1、抽象表达式AbstractExpression public abstract class AbstractExpression { public abstract void Interpret(Context context); } 2、终结符表达式TerminalExpression public class TerminalExpression:AbstractExpression { public override void Interpret(Context context) { Console.WriteLine("调用终止符表达式Terminal.Interpret()"); } } 3、非终结符表达式NonterminalExpression public class NonterminalExpression:AbstractExpression { public override void Interpret(Context context) { Console.WriteLine("调用非终止符表达式 Nonterminal.Interpret()"); } } 4、上下文类Context public class Context { } 5、客户端代码 static void Main(string[] args) { Context context = new Context(); ArrayList list = new ArrayList(); //填充语法树 list.Add(new TerminalExpression()); list.Add(new NonterminalExpression()); list.Add(new TerminalExpression()); list.Add(new TerminalExpression()); //解析 foreach (AbstractExpression abstractExpression in list) { abstractExpression.Interpret(context); } Console.ReadKey(); } 3、程序运行结果 四.解释器模式案例分析(Example) 1、场景 罗马字符转换为十进制数字,如下图所示 Expression抽象类:抽象表达式,声明一个抽象的解释器操作,这个抽象类为抽象语法树中所有的节点所共享。 ThousandExpression类:用来核对罗马字符中的 M ; HundredExpression类:用来核对罗马字符中的C, CD, D or CM; TenExpression类:用来核对罗马字附中的X, XL, L and XC; OneExpression类:用来核对罗马字附中的I, II, III, IV, V, VI, VI, VII, VIII, IX。 2、代码 1、上下文类Context class Context { private string _input; private int _output; public Context(string input) { this._input = input; } public string Input { get { return _input; } set { _input = value; } } public int Output { get { return _output; } set { _output = value; } } } 2、抽象表达式类Expression abstract class Expression { public void Interpret(Context context) { if (context.Input.Length == 0) return; if (context.Input.StartsWith(Nine())) { context.Output += (9 * Multiplier()); context.Input = context.Input.Substring(2); } else if (context.Input.StartsWith(Four())) { context.Output += (4 * Multiplier()); context.Input = context.Input.Substring(2); } else if (context.Input.StartsWith(Five())) { context.Output += (5 * Multiplier()); context.Input = context.Input.Substring(1); } while (context.Input.StartsWith(One())) { context.Output += (1 * Multiplier()); context.Input = context.Input.Substring(1); } } public abstract string One(); public abstract string Four(); public abstract string Five(); public abstract string Nine(); public abstract int Multiplier(); } 3、终止符表达式类ThousandExpression、HundredExpression、TenExpression等 /// <summary> /// A 'TerminalExpression' class /// <remarks> /// 用来核对罗马字符中的 M /// </remarks> /// </summary> class ThousandExpression : Expression { public override string One() { return "M"; } public override string Four() { return " "; } public override string Five() { return " "; } public override string Nine() { return " "; } public override int Multiplier() { return 1000; } } /// <summary> /// A 'TerminalExpression' class /// <remarks> /// 用来核对罗马字符中的C, CD, D or CM; /// </remarks> /// </summary> class HundredExpression : Expression { public override string One() { return "C"; } public override string Four() { return "CD"; } public override string Five() { return "D"; } public override string Nine() { return "CM"; } public override int Multiplier() { return 100; } } /// <summary> /// A 'TerminalExpression' class /// <remarks> /// 用来核对罗马字附中的X, XL, L and XC /// </remarks> /// </summary> class TenExpression : Expression { public override string One() { return "X"; } public override string Four() { return "XL"; } public override string Five() { return "L"; } public override string Nine() { return "XC"; } public override int Multiplier() { return 10; } } /// <summary> /// A 'TerminalExpression' class /// <remarks> /// 用来核对罗马字附中的I, II, III, IV, V, VI, VI, VII, VIII, IX /// </remarks> /// </summary> class OneExpression : Expression { public override string One() { return "I"; } public override string Four() { return "IV"; } public override string Five() { return "V"; } public override string Nine() { return "IX"; } public override int Multiplier() { return 1; } } 4、客户端代码 static void Main(string[] args) { string roman = "MCMXXVIII"; Context context = new Context(roman); // Build the 'parse tree' List<Expression> tree = new List<Expression>(); tree.Add(new ThousandExpression()); tree.Add(new HundredExpression()); tree.Add(new TenExpression()); tree.Add(new OneExpression()); // Interpret foreach (Expression exp in tree) { exp.Interpret(context); } Console.WriteLine("{0} = {1}",roman, context.Output); Console.ReadKey(); } 3、运行结果 五、总结(Summary) 解释器模式(Interpreter Pattern),给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象的语法树时,可以考虑使用解释器模式。 参考资料:http://www.dofactory.com/Patterns/PatternInterpreter.aspx 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
在网站的设计中,提示信息是非常细微的功能,但是起着非常重要的作用。如果你的网站中提示信息做的比较好,会给浏览者留下非常深刻的印象,同时也会起到非常好的网站宣传效果,下面介绍了30个比较流行提示信息插件jQuery Tooltip Plugin,希望对大家有帮助。 每个插件都配有比较直观的截图,也就不做详细地介绍了,如果大家喜欢某一个插件,点击超链接,自己学习如何使用吧。 1. Dynamic tooltip 2. Popup Bubble 3. jQuery Horizontal Tooltips Menu Tutorials 4. Prototip 5. Coda Popup Bubble 6. Awesomeness 7. TipTip 8. (mb)Tooltip 9. vTip 10. jGrowl 11. jQuery Ajax Tooltip 12. Digg-style post sharing tool with jQuery 13. Input Floating Hint Box 14. Simpletip 15. qTip 16. Orbital Tooltip 17. Inline HTML Tooltip 18. tipsy 19. Easiest jQuery Tooltip Ever 20. BsTip 21. EZPZ Tooltip 22. BeautyTips 23. Tooltip 24. clueTip 25. Creating A Simple Tooltip Using jQuery and CSS 26. BetterTip 27. jTip 28. jqTooltip 29. Pop! 30. Create a Simple CSS + Javascript Tooltip with jQuery 原文地址:http://www.1stwebdesigner.com/resources/stylish-jquery-tooltip-plugins-webdesign/ 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
一、命令模式简介(Brief Introduction) 命令模式(Command Pattern)将请求封装为一个对象,从而使你用不同的请求对客户进行参数化,对请求排队或纪录请求日志,以及支持可撤销的操作。 Encapsulate a request as an object, thereby letting you parameterize clients with different requests, queue or log requests, and support undoable operations 二、解决的问题(What To Solve) 当需要有撤销或者恢复操作时,可以考虑使用命令模式。 三、命令模式分析(Analysis) 1、命令模式结构 Command抽象类:声明一个接口,用于执行操作,declares an interface for executing an operation。 ConcreteCommand实现类:将一个接收者对象绑定到一个动作。调用接收者相应的操作,以实现Execute 。 defines a binding between a Receiver object and an action implements Execute by invoking the corresponding operation(s) on Receiver。 Receiver类:知道如何执行一个请求相关的操作。knows how to perform the operations associated with carrying out the request. Invoker类:要求命令执行一个请求。asks the command to carry out the request 。 2、源代码 1、Command抽象类:声明一个接口,用于执行操作 abstract class Command { protected Receiver receiver; public Command(Receiver receiver) { this.receiver = receiver; } public abstract void Execute(); } 2、ConcreteCommand具体实现类:将一个接收者对象绑定到一个动作 class ConcreteCommand : Command { // Constructor public ConcreteCommand(Receiver receiver) :base(receiver) { } public override void Execute() { receiver.Action(); } } 3、Receiver类:知道如何执行一个请求相关的操作 class Receiver { public void Action() { Console.WriteLine("Called Receiver.Action()"); } } 4、Invoker类:要求命令执行一个请求 class Invoker { private Command _command; public void SetCommand(Command command) { this._command = command; } public void ExecuteCommand() { _command.Execute(); } } 4、客户端代码 static void Main(string[] args) { // Create receiver, command, and invoker Receiver receiver = new Receiver(); Command command = new ConcreteCommand(receiver); Invoker invoker = new Invoker(); // Set and execute command invoker.SetCommand(command); invoker.ExecuteCommand(); Console.ReadKey(); } 3、程序运行结果 四.案例分析(Example) 1、场景 使用命令模式进行计算器计算,可以是加减乘除等运算,可以进行Undo操作和Rodo操作。如下图所示 Command抽象命令类:声明一个接口,用于执行操作。 CalculatorCommand具体实现类:将一个接收者对象绑定到一个动作。调用接收者相应的操作,以实现Execute 。 UnExecute方法:执行Undo操作。 Calculator 类-Operation方法:执行加减乘除操作。 User类:要求命令Calculator执行一个计算请求。 Compute方法:加减乘除等计算操作 Undo方法:撤销操作。Redo方法:重复操作。 2、代码 1、抽象命令类Command及其计算器类CalculatorCommand /// <summary> /// The 'Command' abstract class /// </summary> abstract class Command { public abstract void Execute(); public abstract void UnExecute(); } /// <summary> /// The 'ConcreteCommand' class /// </summary> class CalculatorCommand : Command { private char _operator; private int _operand; private Calculator _calculator; // Constructor public CalculatorCommand(Calculator calculator,char @operator, int operand) { this._calculator = calculator; this._operator = @operator; this._operand = operand; } // Gets operator public char Operator { set { _operator = value; } } // Get operand public int Operand { set { _operand = value; } } // Execute new command public override void Execute() { _calculator.Operation(_operator, _operand); } // Unexecute last command public override void UnExecute() { _calculator.Operation(Undo(_operator), _operand); } // Returns opposite operator for given operator private char Undo(char @operator) { switch (@operator) { case '+': return '-'; case '-': return '+'; case '*': return '/'; case '/': return '*'; default: throw new ArgumentException("@operator"); } } } 2、计算器类Calculator /// <summary> /// The 'Receiver' class /// </summary> class Calculator { private int _curr = 0; public void Operation(char @operator, int operand) { switch (@operator) { case '+': _curr += operand; break; case '-': _curr -= operand; break; case '*': _curr *= operand; break; case '/': _curr /= operand; break; } Console.WriteLine( "Current value = {0,3} (following {1} {2})", _curr, @operator, operand); } } 3、请求类User /// <summary> /// The 'Invoker' class /// </summary> class User { // Initializers private Calculator _calculator = new Calculator(); private List<Command> _commands = new List<Command>(); private int _current = 0; public void Redo(int levels) { Console.WriteLine("\n---- Redo {0} levels ", levels); // Perform redo operations for (int i = 0; i < levels; i++) { if (_current < _commands.Count - 1) { Command command = _commands[_current++]; command.Execute(); } } } public void Undo(int levels) { Console.WriteLine("\n---- Undo {0} levels ", levels); // Perform undo operations for (int i = 0; i < levels; i++) { if (_current > 0) { Command command = _commands[--_current] as Command; command.UnExecute(); } } } public void Compute(char @operator, int operand) { // Create command operation and execute it Command command = new CalculatorCommand( _calculator, @operator, operand); command.Execute(); // Add command to undo list _commands.Add(command); _current++; } 4、客户端代码 static void Main(string[] args) { // Create user and let her compute User user = new User(); // User presses calculator buttons user.Compute('+', 100); user.Compute('-', 50); user.Compute('*', 10); user.Compute('/', 2); // Undo 4 commands user.Undo(4); // Redo 3 commands user.Redo(3); Console.ReadKey(); } 3、程序运行结果 五、总结(Summary) 命令模式(Command Pattern)将请求封装为一个对象,从而使你用不同的请求对客户进行参数化,对请求排队或纪录请求日志,以及支持可撤销的操作。当需要有撤销或者恢复操作时,可以考虑使用命令模式。 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
一、访问者模式简介(Brief Introduction) 表示一个作用于某对象结构中的元素操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作,它把数据结构和作用于结构上的操作之间的耦合性解脱开,使的操作结合可以相对自由地演化。优点是增加新的操作很容易,因为增加一个新的操作就意味着增加一个新的访问者,访问者模式将有关的行为集中到一个访问对象中。 二、解决的问题(What To Solve) 访问者模式的目的是要把处理从数据结构分离出来。如果系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式是个不错的选择,因为访问者模式使的算法操作的增加变的容易。相反,如果系统的数据结构不稳定,易于变化,则此系统就不适合使用访问者模式了。 三、访问者模式分析(Analysis) 1、访问者模式结构 Visitor:为对象结构中Element的每一个子类声明一个Visitor操作。 ConcreteVisitor1、ConcreteVisitor2:具体的访问者,实现父类Visitor的操作。每个操作实现算法的一部分,而该算法片段仍是对应与结构中对象的类。 ObjectStructure:枚举它的元素,可以提供一个高层的接口以允许访问者访问它的元素。 Element:定义一个Accept操作,它以一个访问者为参数。 ConcreteElementA、ConcreteElementB: 具体元素,实现父类Element的方法Accept。 2、源代码 1、访问者抽象类Visitor public abstract class Visitor { public abstract void VisitConcreteElementA(ConcreteElementA concreteElementA); public abstract void VisitConcreteElementB(ConcreteElementB concreteElementB); } 2、具体访问者ConcreteVisitor1、ConcreteVisitor2 public class ConcreteVisitor1 : Visitor { public override void VisitConcreteElementA(ConcreteElementA concreteElementA) { Console.WriteLine("{0}访问{1}",this.GetType().Name,concreteElementA.GetType().Name); } public override void VisitConcreteElementB(ConcreteElementB concreteElementB) { Console.WriteLine("{0}访问{1}", this.GetType().Name, concreteElementB.GetType().Name); } } public class ConcreteVisitor2 : Visitor { public override void VisitConcreteElementA(ConcreteElementA concreteElementA) { Console.WriteLine("{0}访问{1}", this.GetType().Name, concreteElementA.GetType().Name); } public override void VisitConcreteElementB(ConcreteElementB concreteElementB) { Console.WriteLine("{0}访问{1}", this.GetType().Name, concreteElementB.GetType().Name); } 3、定义一个Accept操作,它以一个访问者为参数 public abstract class Element { public abstract void Accept(Visitor visitor); } 4、具体元素ConcreteElementA、ConcreteElementB public class ConcreteElementA : Element { public override void Accept(Visitor visitor) { visitor.VisitConcreteElementA(this); } public void OperationA() { } } public class ConcreteElementB : Element { public override void Accept(Visitor visitor) { visitor.VisitConcreteElementB(this); } public void OperationB() { } } 5、对象结构ObjectStructure public class ObjectStructure { IList<Element> elements=new List<Element>(); public void Add(Element e) { elements.Add(e); } public void Remove(Element e) { elements.Remove(e); } public void Accept(Visitor visitor) { foreach (Element e in elements) { e.Accept(visitor); } } } 5、客户端代码 static void Main(string[] args) { ObjectStructure os = new ObjectStructure(); os.Add(new ConcreteElementA()); os.Add(new ConcreteElementB()); ConcreteVisitor1 cv1 = new ConcreteVisitor1(); ConcreteVisitor2 cv2 = new ConcreteVisitor2(); os.Accept(cv1); os.Accept(cv2); Console.Read(); } 3、程序运行结果 四、总结(Summary) 访问者模式表示一个作用于某对象结构中的个元素操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 访问者模式的目的是要把处理从数据结构分离出来 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
最近由于需要一些关于VS2010 Beta2方面的资料,不得不在已经安装了VS2005、VS2008的机器上再装上VS2010 Beta2,在安装的过程中遇到了以下两个问题: l 硬盘空间不足,不得不卸载已经安装好的一些程序。 l 下载的文件不完整,导致安装到一半出错,不得不重新下载文件。 不过,最后还是安装好了,值得注意的是安装完NET Framework 4 Beta 2之后,需要重新启动系统然后继续安装。微软官方对安装环境要求如下: 支持的操作系统: ü Windows XP (x86) with Service Pack 3 - all editions except Starter Edition ü Windows XP (x64) with Service Pack 2 - all editions except Starter Edition ü Windows Vista (x86 & x64) with Service Pack 1 - all editions except Starter Edition ü Windows 7 (x86 and x64) ü Windows Server 2003 (x86 & x64) with Service Pack 2 ü Windows Server 2003 R2 (x86 and x64) ü Windows Server 2008 (x86 and x64) with Service Pack 2 ü Windows Server 2008 R2 (x64) 硬件环境要求: ü Computer that has a 1.6GHz or faster processor ü 1024MB RAM ü 3GB of available hard disk space ü 5400 RPM hard disk drive ü DirectX 9-capable video card that runs at 1280 x 1024 or higher display resolution ü DVD-ROM Drive 安装过程如下: 1、去官方网站下载Microsoft Visual Studio 2010 Ultimate Beta 2 – ISO。下载地址是: http://www.microsoft.com/downloads/details.aspx?FamilyID=dc333ac8-596d-41e3-ba6c-84264e761b81&displaylang=en 2、用虚拟光驱安装ISO文件,会出现图1界面,选择【Install Microsoft Visual Studio 2010】选项,出现图2界面。 图1 图2 3、在图2界面上选择Next,出现图3界面,此时要求:安装之前推出所有的应用程序。 图3 4、在图3界面选择【I have read and accept the license terms】选项,点击Next,出现图4界面,默认需要3.6GB的硬盘空间,我的硬盘空间显然不够,不得不清理一些安装程序,以便安装过程可以继续进行下去。如果选择【Custom】选项,还可以节省一些空间,这里我选择了【Custom】选项,只安装一些需要的功能。 图4 5、在图4界面点击Next,出现图5界面。去除了一些不需要的功能。 图5 6、在图5界面点击Install,出现安装过程界面,如图6。安装完.NET Framework 4 Beta 2之后,需要注意重启,重启之后会继续安装。在安装到Microsoft Visual Studio 2010 Ultimate Beta 2时,提示找不到文件的错误,可能是下载文件过程中出现了问题,重新下载一次文件后继续安装就可以了。 图6 7、隔上一段时间,就会安装完毕,如图7. 图7 8、安装完后,启动Microsoft Visual Studio 2010 – ENU,如图8,界面还是满干净漂亮的。 图8 9、接下来显示图9界面,选择默认环境设置。 图9 10、接下来显示图10开始界面,比较简洁大方。 图10 至此,整个VS2010 Beta2的安装过程完毕。接下来就可以尝试VS2010 Beta2给我们带来的新功能了。 版权 作者:灵动生活 郝宪玮 出处:http://www.cnblogs.com/ywqu 如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章, 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。