还是找不到000ca目前,正常的wwW000cacom介入地止啊

一只程序汪的自我修养一只程序汪的自我修养一只软狗的日常关注专栏更多最新文章{&debug&:false,&apiRoot&:&&,&paySDK&:&https:\u002F\u002Fpay.zhihu.com\u002Fapi\u002Fjs&,&wechatConfigAPI&:&\u002Fapi\u002Fwechat\u002Fjssdkconfig&,&name&:&production&,&instance&:&column&,&tokens&:{&X-XSRF-TOKEN&:null,&X-UDID&:null,&Authorization&:&oauth c3cef7c66aa9e6a1e3160e20&}}{&database&:{&Post&:{&&:{&title&:&给《未成年人网络保护条例(草案征求意见稿)》的意见稿(转载)&,&author&:&codelover&,&content&:&作者:陈舒璇\u003Cbr\u003E链接:\u003Ca href=\&https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F\& data-editable=\&true\& data-title=\&给《未成年人网络保护条例(草案征求意见稿)》的意见稿 - 二狗的奇趣狗窝 - 知乎专栏\&\u003E给《未成年人网络保护条例(草案征求意见稿)》的意见稿 - 二狗的奇趣狗窝 - 知乎专栏\u003C\u002Fa\u003E\u003Cbr\u003E来源:知乎\u003Cbr\u003E著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。\u003Cbr\u003E\u003Cbr\u003E\u003Cp\u003E阅读完\u003Ca href=\&https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F\& class=\&\& data-editable=\&true\& data-title=\&网瘾即将合法化,绿坝将强奸全部智能设备\&\u003E网瘾即将合法化,绿坝将强奸全部智能设备\u003C\u002Fa\u003E这篇文章后,很多朋友问我意见稿该怎么写,这篇文章,就是我写好的一篇范文,大家可直接拿去用,也可看完稍后的意见稿写作指南后再撰稿。\u003C\u002Fp\u003E\u003Cp\u003E
给《未成年人网络保护条例(草案征求意见稿)》的意见\u003Cbr\u003E\u003Cbr\u003E\u003Cbr\u003E一. 《征求意见稿》第七条
关于网络平台信息审查制度\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E- 第七条 任何组织和个人不得在网络空间制作、发布、传播违反法律、行政法规和部门规章的信息。\u003Cbr\u003E网络信息服务提供者提供网络平台服务的,应当对其所登载的信息进行审查;发现违反法律、行政法规和部门规章的信息的,应当采取措施进行过滤、删除或屏蔽,并向有关主管部门报告。\u003Cbr\u003E\u003Cb\u003E 意见:同意该条例。\u003C\u002Fb\u003E\u003Cbr\u003E\u003Cb\u003E 理由:近年来,大量有关邪教,毒品,以及赌博等等违反法律的信息在互联网泛滥,极易诱导青少年犯罪,危害青少年身心健康。\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cbr\u003E\u003Cbr\u003E\u003Cbr\u003E\u003Cbr\u003E\u003Cbr\u003E二.《征求意见稿》第十一条 关于公益性上网场所的绿色上网软件安装\u003Cbr\u003E\u003Cbr\u003E\u003Cbr\u003E\u003Cbr\u003E - 第十一条 学校、图书馆、文化馆、青少年宫等公益性场所为未成年人提供上网设施的,应当安装未成年人上网保护软件,避免未成年人接触违法信息和不适宜未成年人接触的信息。\u003C\u002Fp\u003E\u003Cp\u003E意见:同意该条例。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E理由:公益性上网设施主体对象面向未成年人,为防止成年人使用并恶意下载违反法律,色情,赌博等不良软件或信息进行破坏,故安装未成年人上网保护软件有必要。\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E建议:强制安装未成年上网保护软件的公益上网设施,须确保设施本身的使用对象完全为未成年人,对面向成年人的上网公益设施不应强制安装。此处应当区别对待,如为未成年单独提供系统账号或独立设备。\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cb\u003E\n此外,公家设施安装的过滤软件、硬件情况采购布置应当进行信息公开。\u003C\u002Fb\u003E\u003Cbr\u003E\u003Cbr\u003E\u003Cp\u003E\u003Cbr\u003E\u003Cbr\u003E 三.《意见征求稿》第十二条
关于智能终端强制安装未成年人保护软件\u003Cbr\u003E\u003Cbr\u003E\u003Cbr\u003E- 第十二条 智能终端产品制造商在产品出厂时、智能终端产品进口商在产品销售前应当在产品上安装未成年人上网保护软件,或者为安装未成年人上网保护软件提供便利并采用显著方式告知用户安装渠道和方法。\u003Cbr\u003E\u003Cbr\u003E\u003Cb\u003E意见:反对该条例。\u003Cbr\u003E\u003Cbr\u003E理由:《中华人民共和国消费者权益保护法》(以下简称《消法》)第二章第九条规定,消费者有权自主选择提供商品或者服务的经营者,自主选择商品品种或者服务方式,自主决定购买或者不购买任何一种商品、接受或者不接受任何一项服务。对比《未成年人网络保护条例》(以下简称《条例》)第二章第十二条,若在个人产品中强制安装未成年人上网保护软件,将侵犯消费者自主选择权,违反《消法》\u003Cbr\u003E\u003Cbr\u003E《消法》第二章第二十六条规定,经营者不得以格式条款、通知、声明、店堂告示等方式,作出排除或者限制消费者权利、减轻或者免除经营者责任、加重消费者责任等对消费者不公平、不合理的规定,不得利用格式条款并借助技术手段强制交易。对比《条例》第二章第十二条,若在个人产品中强制安装未成年人上网保护软件,将构成强制交易,违反《消法》\u003Cbr\u003E\u003Cbr\u003E《中华人民共和国反不正当竞争法》(以下简称《反不正当竞争法》)第二章第十二条规定,经营者销售商品,不得违背购买者的意愿搭售商品或者附加其他不合理的条件。对比《条例》第二章第十二条,若在个人产品中强制安装未成年人上网保护软件,将构成强制搭售商品,违反《反不正当竞争法》\u003Cbr\u003E\u003Cbr\u003E建议:支持未成年保护上网软件研发,但反对全面强制安装,建议对未成年公益性上网场所进行强制安装,其他智能终端设备应自主选择安装。\u003Cbr\u003E\u003Cbr\u003E未成年人上网保护软件的下载渠道应避免与其他软件的捆绑安装(例如下载网游时捆绑下载)或引导下载(例如桌面出现图标,点击后自动下载),消费者应拥有软件下载的自主权。\u003Cbr\u003E\u003Cbr\u003E同时建议软件研发过程应高标准,严要求,避免出现对信息处理失准、过度、过界等现象。同时软件投入市场后,应确保后续维护的可持续性,保护启动、关闭、更新、卸载等功能的可靠性,与最新标准相适应,保护用户合法权益。\u003C\u002Fb\u003E\u003Cbr\u003E\u003Cbr\u003E\u003Cbr\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E四.《意见征求稿》第十九条 关于对未成年进行网络使用教育的相关事宜\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cbr\u003E\u003Cbr\u003E- 第十九条 家庭、学校应当教育、引导未成年人正确使用网络,预防和干预未成年人沉迷网络。对于有沉迷网络倾向的未成年学生,学校应当指导其监护人开展家庭教育,配合家庭、社区及其他机构进行教育和引导。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E\u003Cb\u003E意见:反对该条例。\u003Cbr\u003E\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E理由:未成年人沉迷网络,本质并非“精神疾病”,而是由家庭本身教育失职与未成年人自身心理问题所导致的一种现象,因此在教育、引导、干预和预防未成年人正确使用网络的过程中,应该由父母,孩子,与第三方正规心理咨询机构进行合作,学校作为普通的教育机构由于不具备专业资质,无权直接开展以上活动,但应提供相关场地,经费,并组织具有专业资质的机构进行引导活动的开展。\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E 建议:在教育、引导、预防和干预未成年沉迷网络的过程中,应由专业人士进行介入工作。关于专业人士的资质要求应包括但不限于:取得国家二级咨询证书,接受过岗前培训,具备其他相关资质。\u003C\u002Fb\u003E\u003Cbr\u003E\u003Cbr\u003E\u003Cbr\u003E五.《意见征求稿》第二十条 关于未成年人网络成瘾的干预与矫治\u003Cbr\u003E\u003Cbr\u003E\u003Cbr\u003E- 第二十条 教育、卫生计生等部门依据各自职责,组织开展预防未成年人沉迷网络的教育,对未成年人网络成瘾实施干预和矫治。\u003Cbr\u003E\u003Cbr\u003E县级以上人民政府及其教育行政部门应当为中小学校配备专门教师或提高教师专业水平,增强对未成年人沉迷网络的早期识别和干预能力,并可以通过购买服务等方式提供预防和干预未成年人沉迷网络的教育或服务。\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E国务院卫生计生部门会同有关部门推动出台网络成瘾的本土化预测和诊断测评系统,制定诊断、治疗规范。\u003Cbr\u003E\u003Cbr\u003E\u003Cb\u003E 意见:反对该条例。\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E理由:沉迷网络作为一种源于家庭教育与未成年本身心理问题所导致的一种现象,本质上并非精神疾病此结论在医学界已得到证实,故我们不支持国务院卫生计生部门推出“网络成瘾的本土化预测和诊断测评系统”。\u003Cbr\u003E\u003Cbr\u003E 同时县级以上人民政府及其教育行政部门为中小学校配备的专门教师,不具备合格心理咨询师的专业资格,根据《无照经营查处取缔办法》第二条,任何单位和个人不得违反法律、法规的规定,从事无照经营。因此教师群体在没有获取相关心理咨询师从业资格前,无权通过购买服务等方式用于提供预防和干预未成年人沉迷网络的教育和服务。\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E 并且根据《中华人民共和国精神卫生法》第二十三条,学校中设立的心理健康教师,属于心理咨询人员,故不得从事心理治疗或者精神障碍的诊断、治疗。故教师无权对已沉迷网络的未成年人提供心理治疗服务。\u003Cbr\u003E\u003Cbr\u003E建议:对为未成年人提供心理治疗,咨询的机构,应进行严格审查,确保机构具备心理咨询,治疗的相关从业资格。\u003C\u002Fb\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E六.《意见征求稿》第二十一条 关于未成年人保护的相关事宜\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E- 第二十一条 任何组织和个人不得通过网络以文字、图片、音视频等形式威胁、侮辱、攻击、伤害未成年人。\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cbr\u003E未成年人的监护人、学校及其他组织和个人,发现未成年人遭受前款网络欺凌侵害的,应当及时采取措施予以救助,必要时向公安机关或其他有关部门举报,接到举报的单位应及时受理。\u003Cbr\u003E\u003Cbr\u003E\u003Cbr\u003E\u003Cb\u003E意见:反对该条例。\u003Cbr\u003E\u003Cbr\u003E理由:表意不明,未详细说明何种网络上出现的文字,图片,音视频等算作对未成年人的威胁,侮辱,攻击或伤害。\u003Cbr\u003E\u003Cbr\u003E建议:侮辱攻击应当作详细解释,条例内容需要细化,同时条例的执行过程需要严格落实,结合各基层单位实际情况做出适度修改,执行过程中应当给予基层单位所需物资与经费。 \u003C\u002Fb\u003E\u003Cbr\u003E\u003Cbr\u003E\u003Cbr\u003E七.《意见征求稿》第二十三条
关于网游防沉迷机制的设计\u003Cbr\u003E\u003Cbr\u003E- \u003Cbr\u003E第二十三条 网络游戏服务提供者应当建立、完善预防未成年人沉迷网络游戏的游戏规则,对可能诱发未成年人沉迷网络游戏的游戏规则进行技术改造。\u003Cbr\u003E\u003Cbr\u003E
网络游戏服务提供者应当按照国家有关规定和标准,采取技术措施,禁止未成年人接触不适宜其接触的游戏或游戏功能,限制未成年人连续使用游戏的时间和单日累计使用游戏的时间,禁止未成年人在每日的0:00至8:00期间使用网络游戏服务。\u003Cbr\u003E\u003Cbr\u003E\u003Cb\u003E意见:反对该条例。\u003Cbr\u003E\u003Cbr\u003E理由:表意不明。条例中未说明何种游戏规则可能会诱发未成年人沉迷网络游戏,同时也未规定技术改造的具体内容是什么。\u003Cbr\u003E\u003Cbr\u003E 同时,条例中对未成年人不适宜接触的游戏或游戏功能也没有详细说明,条例过于模糊。\u003Cbr\u003E\u003Cbr\u003E 其次,该条例从技术层面实现难度过大,投入成本过高,故应适度调整并修改。\u003C\u002Fb\u003E\u003Cbr\u003E\u003Cbr\u003E\u003Cbr\u003E此文作为意见稿范文,欢迎大家转发点赞,让更多的人看到,引起社会对此次事件更大的关注。\u003Cbr\u003E\u003Cbr\u003E只有我们自己重视起来,团结起来,才能赢得最后的胜利。\u003Cbr\u003E\u003Cbr\u003E稍后发布意见稿写作指南。 \u003Cbr\u003E\u003Cbr\u003E\u003Cbr\u003E附:意见稿发送方式主要有两种\u003Cbr\u003E\u003Cbr\u003E\u003Cb\u003E一、\u003C\u002Fb\u003E通过信函方式将意见寄至:北京市东城区朝阳门内大街225号国家互联网信息办公室政策法规局,邮编:100010,并在信封上注明“征求意见”。\n
\u003Cbr\u003E\u003Cbr\u003E\u003Cb\u003E二、\u003C\u002Fb\u003E通过电子邮件方式发送至:law@cac.gov.cn&,&updated&:new Date(&T05:21:53.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:5,&likeCount&:94,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&sourceUrl&:&&,&publishedTime&:&T13:21:53+08:00&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&url&:&\u002Fp\u002F&,&titleImage&:&https:\u002F\u002Fpic4.zhimg.com\u002Fv2-b677f7dfb1cf17ae3d022babdea174a8_r.jpg&,&summary&:&&,&href&:&\u002Fapi\u002Fposts\u002F&,&meta&:{&previous&:null,&next&:null},&snapshotUrl&:&&,&commentsCount&:5,&likesCount&:94},&&:{&title&:&58HouseSearch项目迁移到asp.net core&,&author&:&codelover&,&content&:&\u003Ch3\u003E前言\u003C\u002Fh3\u003E\u003Cp\u003E\u003Ca href=\&https:\u002F\u002Fgithub.com\u002Fliguobao\u002F58HouseSearch\& data-editable=\&true\& data-title=\&58HouseSearch\&\u003E58HouseSearch\u003C\u002Fa\u003E这个项目原本是基于ASP.NET MVC 4写的,开发环境是Windows+VS2015,发布平台是linux+mono+jexus,这样看来整个项目基本已经满足跨平台的需求。\u003C\u002Fp\u003E\u003Cp\u003E这样一来,本来我是没什么动力去做迁移的,好好的东西闲着没事干才迁移呢。\u003C\u002Fp\u003E\u003Cp\u003E不过,这不国庆了么?穷人不是在家穷游天下么?所以…真的有点闲着没事干了。\u003C\u002Fp\u003E\u003Ch3\u003E迁移可行性探讨\u003C\u002Fh3\u003E\u003Cp\u003E项目迁移前,我们还是先来讨论一下迁移可行性。为嘛要进行可行性探讨呢?原因是.NET CORE是一个跨平台的框架,和上一代的.NET存在不兼容。\u003C\u002Fp\u003E\u003Cp\u003E个人总结一下,迁移的主要的问题在于:代码不兼容、类库不兼容、严重依赖Windows API或者COM组件等。\u003C\u002Fp\u003E\u003Ch4\u003E代码不兼容\u003C\u002Fh4\u003E\u003Cp\u003E代码不兼容其实不算麻烦。毕竟代码是活的,你我也是活的,不就是一个改字罢了。花点时间慢慢改,总是能搞掂的。\u003C\u002Fp\u003E\u003Ch4\u003E类库不兼容\u003C\u002Fh4\u003E\u003Cp\u003E要不就弃用,要不就找替代品。\u003C\u002Fp\u003E\u003Ch4\u003E严重依赖Windows API或者COM组件\u003C\u002Fh4\u003E\u003Cp\u003E额?找替代品,找不到可用替代品的话。放弃吧,这个项目别考虑迁移了。\u003C\u002Fp\u003E\u003Cp\u003E这个故事告诉我们,做跨平台项目的时候,少点用系统API或者组建。\u003C\u002Fp\u003E\u003Cp\u003E回到58HouseSearch项目上面。\u003C\u002Fp\u003E\u003Cp\u003E这个项目的代码基本都是我写的,所以重写代码没什么问题。\u003Cbr\u003E依赖的类库有下面几个:\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E\u003Cp\u003E\u003Ca href=\&https:\u002F\u002Fgithub.com\u002FFlorianRappl\u002FAngleSharp\& data-editable=\&true\& data-title=\&AngleSharp\&\u003EAngleSharp\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E\u003Ca href=\&http:\u002F\u002Fwww.newtonsoft.com\u002Fjson\& data-editable=\&true\& data-title=\&Newtonsoft.Json\&\u003ENewtonsoft.Json\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E\u003Ca href=\&http:\u002F\u002Flogging.apache.org\u002Flog4net\u002F\& data-editable=\&true\& data-title=\&log4net\&\u003Elog4net\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003EAngleSharp是用来解析HTML的类库,用linq的方式来操作HTML,用起来实在爽快。\u003C\u002Fp\u003E\u003Cp\u003E如果这货在.net core上不能跑,我应该立马放弃了。\u003Cbr\u003E不过,这个实在给力…\u003C\u002Fp\u003E\u003Cimg src=\&v2-b2faf8d58cc5d.png\& data-rawwidth=\&963\& data-rawheight=\&411\&\u003E\u003Cbr\u003E\u003Cp\u003ENewtonsoft.Json\u003C\u002Fp\u003E\u003Cp\u003E在这个项目里面主要是用来记录PV数据的,非核心功能,可有可无。不过看了下nuget上的介绍,也是支持.net core的。\u003C\u002Fp\u003E\u003Cp\u003E剩下log4net…嗯,并不支持log4net。不过这个就更加是非核心内容了,直接丢了。\u003Cbr\u003EPS:考虑后期加入Nlog替代log4net。\u003C\u002Fp\u003E\u003Cp\u003E至于依赖Windows API之类的,在这个项目里面基本没有,所以略过…\u003C\u002Fp\u003E\u003Ch3\u003E准备工作\u003C\u002Fh3\u003E\u003Cul\u003E\u003Cli\u003E\u003Ca href=\&https:\u002F\u002Fwww.visualstudio.com\u002Fdownloads\u002F\& data-editable=\&true\& data-title=\&Visual Studio Community 2015 with Update 3 – Free\&\u003EVisual Studio Community 2015 with Update 3 – Free\u003C\u002Fa\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Ca href=\&https:\u002F\u002Fwww.microsoft.com\u002Fnet\u002Fdownload\& data-editable=\&true\& data-title=\&.NET Core SDK\&\u003E.NET Core SDK\u003C\u002Fa\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Ca href=\&https:\u002F\u002Fwww.microsoft.com\u002Fnet\u002Fdownload\& data-editable=\&true\& data-title=\&.NET Core\&\u003E.NET Core\u003C\u002Fa\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Ca href=\&https:\u002F\u002Fgo.microsoft.com\u002Ffwlink\u002F?LinkId=827546\& data-editable=\&true\& data-title=\&.NET Core 1.0.1 - VS 2015 Tooling Preview 2\&\u003E.NET Core 1.0.1 - VS 2015 Tooling Preview 2\u003C\u002Fa\u003E\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E友情提示:\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003EVisual Studio Community 2015 with Update 3 下载镜像来安装。\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003Cp\u003E错误操作如下:\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cimg src=\&v2-28dd66f6827a8aeb64bb.png\& data-rawwidth=\&1590\& data-rawheight=\&694\&\u003E\u003Cbr\u003E\u003Cp\u003E正确打开方式:\u003C\u002Fp\u003E\u003Cimg src=\&v2-e664a3ea7ec79870bc04.png\& data-rawwidth=\&1494\& data-rawheight=\&688\&\u003E\u003Cimg src=\&v2-d29dbd74c8baab93dc583.png\& data-rawwidth=\&1448\& data-rawheight=\&710\&\u003E\u003Cbr\u003E\u003Col\u003E\u003Cli\u003E\u003Cp\u003E安装.NET Core SDK和.NET Core之后再安装.NET Core 1.0.1 - VS 2015 Tooling Preview 2\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E安装.NET Core 1.0.1 - VS 2015 Tooling Preview 2 这货的可能会报错0x80072f8a未指定的错误\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003Cp\u003E解决方案见下图:\u003C\u002Fp\u003E\u003Cimg src=\&v2-fe07e9d60c2bbd7023727.png\& data-rawwidth=\&433\& data-rawheight=\&274\&\u003E\u003Cbr\u003E\u003Cp\u003E详细见链接:\u003Ca href=\&http:\u002F\u002Fwww.cnblogs.com\u002FJiaoWoWeiZai\u002Fp\u002F5892255.html\& data-editable=\&true\& data-title=\&安装DotNetCore.1.0.1-VS2015Tools.Preview2.0.2出现0x80072f8a未指定的错误\& class=\&\&\u003E安装DotNetCore.1.0.1-VS2015Tools.Preview2.0.2出现0x80072f8a未指定的错误\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cp\u003E上面都弄好之后,理论上在VS2O15-新建项目里面可以看到ASP.NET CORE的模板了。\u003C\u002Fp\u003E\u003Cp\u003E如下图:\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cimg src=\&v2-6aad1e93a03b64ccada20e.png\& data-rawwidth=\&955\& data-rawheight=\&660\&\u003E\u003Cbr\u003E\u003Ch3\u003E项目迁移\u003C\u002Fh3\u003E\u003Ch4\u003E新建空白ASP.NET CORE项目\u003C\u002Fh4\u003E\u003Cp\u003E新建好了之后如下图:\u003C\u002Fp\u003E\u003Cimg src=\&v2-d6eaa6a180c8e3.png\& data-rawwidth=\&1593\& data-rawheight=\&817\&\u003E\u003Cbr\u003E\u003Ch4\u003ENuget获取引用\u003C\u002Fh4\u003E\u003Cp\u003E\u003Ca href=\&https:\u002F\u002Fwww.nuget.org\u002Fpackages\u002FAngleSharp\u002F\& data-editable=\&true\& data-title=\&NuGet Gallery\&\u003ENuGet Gallery\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Ca href=\&https:\u002F\u002Fwww.nuget.org\u002Fpackages\u002FNewtonsoft.Json\& data-editable=\&true\& data-title=\&NuGet Gallery\&\u003ENuGet Gallery\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Ch4\u003E添加Controllers文件夹\u003C\u002Fh4\u003E\u003Cp\u003E然后把之前项目的Controllers拷贝过来,改掉命名空间,去掉无用代码,添加相应引用。\u003C\u002Fp\u003E\u003Ch4\u003E添加Views文件夹\u003C\u002Fh4\u003E\u003Cp\u003E本项目直接把之前项目的Views拷贝过来是完全没有问题的。\u003C\u002Fp\u003E\u003Ch4\u003E静态文件处理\u003C\u002Fh4\u003E\u003Cp\u003Easp.net core MVC中的文件结构和asp.net mvc的文件结构略有不同。\u003C\u002Fp\u003E\u003Cp\u003Easp.net core MVC在view中“IMG\u002FLittle\u002FPaleGreen.png”对应的文件对应于“项目路径\u002Fwebroot\u002FIMG\u002FLittle\u002FPaleGreen.png”;\u003C\u002Fp\u003E\u003Cp\u003E而asp.net mvc中,对应路径为“项目\u002FIMG\u002FLittle\u002FPaleGreen.png”。\u003C\u002Fp\u003E\u003Cp\u003E因而,我们的所有静态文件都应该放到:webroot文件夹下。\u003C\u002Fp\u003E\u003Cp\u003E上面的都做完了之后,项目结构如下:\u003C\u002Fp\u003E\u003Cimg src=\&v2-c26c2fa7ef8b6f1fe1c74cfd.png\& data-rawwidth=\&810\& data-rawheight=\&448\&\u003E\u003Cbr\u003E\u003Cp\u003E接下来就是改代码了。\u003C\u002Fp\u003E\u003Ch3\u003E代码迁移\u003C\u002Fh3\u003E\u003Ch4\u003EStartup.cs添加MVC1\u003C\u002Fh4\u003E\u003Ccode lang=\&csharp\&\u003Epublic class Startup\n{\n
\u002F\u002F This method gets called by the runtime. Use this method to add services to the container.\n
\u002F\u002F For more information on how to configure your application, visit http:\u002F\u002Fgo.microsoft.com\u002Ffwlink\u002F?LinkID=398940\n
public void ConfigureServices(IServiceCollection services)\n
\u002F\u002F添加MVC框架\n
services.AddMvc();\n\n
\u002F\u002F This method gets called by the runtime. Use this method to configure the HTTP request pipeline.\n
public void Configure(IApplicationBuilder app, IHostingEnvironment env,\n
ILoggerFactory loggerFactory)\n
loggerFactory.AddConsole();\n\n
if (env.IsDevelopment())\n
app.UseDeveloperExceptionPage();\n
\u002F\u002F启用静态文件中间件\n
app.UseStaticFiles();\n
\u002F\u002F启动MVC路由\n
app.UseMvcWithDefaultRoute();\n
\u002F\u002F设置默认页面\n
app.UseMvc(routes =&\n
routes.MapRoute(\n
name: \&default\&,\n
template: \&{controller=House}\u002F{action=Index}\u002F{id?}\&); \n
}\n}\n\u003C\u002Fcode\u003E\u003Ch4\u003E改写GetHTMLByURL方法\u003C\u002Fh4\u003E\u003Cp\u003E之前的方法:\u003C\u002Fp\u003E\u003Cimg src=\&v2-8d6bb396f8925c3bad1d.png\& data-rawwidth=\&1281\& data-rawheight=\&669\&\u003E\u003Cbr\u003E\u003Cp\u003E.net core重写了HttpWebRequest,变成了WebRequest,所以上面的代码废了。\u003C\u002Fp\u003E\u003Cp\u003E重写如下:\u003C\u002Fp\u003E\u003Ccode lang=\&csharp\&\u003Epublic static string GetHTMLByURL(string Url, string type = \&UTF-8\&)\n{\n
Url = Url.ToLower();\n\n
System.Net.WebRequest wReq = System.Net.WebRequest.Create(Url);\n
\u002F\u002F Get the response instance.\n
System.Net.WebResponse wResp = wReq.GetResponseAsync().R\n
System.IO.Stream respStream = wResp.GetResponseStream();\n
using (System.IO.StreamReader reader = new System.IO.\n
StreamReader(respStream, Encoding.GetEncoding(type)))\n
return reader.ReadToEnd();\n
catch (System.Exception ex)\n
return string.E\n
}\n\n}\n\u003C\u002Fcode\u003E\u003Ch4\u003E改写Controller代码\u003C\u002Fh4\u003E\u003Cp\u003E嗯,换了命名空间,别的一句都没改直接拉过来了…略过。\u003C\u002Fp\u003E\u003Ch3\u003E发布到ubuntu\u003C\u002Fh3\u003E\u003Cp\u003E\u003Ca href=\&https:\u002F\u002Fwww.microsoft.com\u002Fnet\u002Fcore#ubuntu\& data-editable=\&true\& data-title=\&Install for Ubuntu 14.04, 16.04 & Linux Mint 17\& class=\&\&\u003EInstall for Ubuntu 14.04, 16.04 & Linux Mint 17\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cp\u003E第一步\u003C\u002Fp\u003E\u003Ccode lang=\&text\&\u003E\u002F\u002FUbuntu 14.04 \u002F Linux Mint 17\nsudo sh -c 'echo \&deb [arch=amd64] https:\u002F\u002Fapt-mo.trafficmanager.net\u002Frepos\u002Fdotnet-release\u002F trusty main\& & \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fdotnetdev.list'\nsudo apt-key adv --keyserver apt-mo.trafficmanager.net --recv-keys 417A0893\nsudo apt-get update\n\n\n\u002F\u002FUbuntu 16.04\nsudo sh -c 'echo \&deb [arch=amd64] https:\u002F\u002Fapt-mo.trafficmanager.net\u002Frepos\u002Fdotnet-release\u002F xenial main\& & \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fdotnetdev.list'\nsudo apt-key adv --keyserver apt-mo.trafficmanager.net --recv-keys 417A0893\nsudo apt-get update\n\u003C\u002Fcode\u003E\u003Cp\u003E第二步\u003C\u002Fp\u003E\u003Ccode lang=\&text\&\u003Esudo apt-get install dotnet-dev-1.0.0-preview2-003131\n\u003C\u002Fcode\u003E\u003Cp\u003E安装好了之后,输入 dotnet -v 应该能看到版本信息,如下图:\u003C\u002Fp\u003E\u003Cimg src=\&v2-c375c00fc14bdd5e4aab88ede4446426.png\& data-rawwidth=\&689\& data-rawheight=\&330\&\u003E\u003Cbr\u003E\u003Cp\u003E这样的下,一句完成了ubuntu 运行asp.net core的环境搭建了。\u003C\u002Fp\u003E\u003Ch3\u003Eproject.json里面隐藏的坑\u003C\u002Fh3\u003E\u003Ch4\u003Edependencies\u003C\u002Fh4\u003E\u003Cp\u003ENET Core 1.0.1 - VS 2015 Tooling Preview 2模板的asp.net core 版本和ubuntu 的asp.net core 版本不一致。\u003C\u002Fp\u003E\u003Cp\u003E根据微软爸给的教程,我们在ubuntu上安装的.NET Core 1.0.0,见上图。\u003C\u002Fp\u003E\u003Cp\u003E然而我们创建项目的模板是.NET Core 1.0.1,见下图:\u003C\u002Fp\u003E\u003Cimg src=\&v2-90516e9afc99ecd7e17a11f.png\& data-rawwidth=\&758\& data-rawheight=\&253\&\u003E\u003Cbr\u003E\u003Cp\u003E怎么办?要不升级ubuntu的asp.net core,要不降级。\u003C\u002Fp\u003E\u003Cp\u003E由于没找到.NET Core 1.0.1 ubuntu的安装包,所以我选择了降级到.NET Core 1.0.0.\u003C\u002Fp\u003E\u003Cp\u003E其中需要把Microsoft.NETCore.App version 、Microsoft.AspNetCore.Server.Kestrel、Microsoft.AspNetCore.Mvc 这三个节点都改成“1.0.0”。如下:\u003C\u002Fp\u003E\u003Ccode lang=\&text\&\u003E\&dependencies\&: {\n
\&Microsoft.NETCore.App\&: {\n
\&version\&: \&1.0.1\&,\n
\&type\&: \&platform\&\n
\&Microsoft.AspNetCore.Diagnostics\&: \&1.0.0\&,\n
\&Microsoft.AspNetCore.Server.IISIntegration\&: \&1.0.0\&,\n
\&Microsoft.AspNetCore.Server.Kestrel\&: \&1.0.1\&,\n
\&Microsoft.Extensions.Logging.Console\&: \&1.0.0\&,\n
\&Microsoft.AspNetCore.Mvc\&: \&1.0.1\&,\n
\&Microsoft.AspNetCore.StaticFiles\&: \&1.0.0\&,\n
\&Newtonsoft.Json\&: \&9.0.1\&,\n
\&AngleSharp\&: \&0.9.8.1\&\n},\n\u003C\u002Fcode\u003E\u003Ch4\u003EpublishOptions\u003C\u002Fh4\u003E\u003Cp\u003E发布输出包括Views文件夹\u003C\u002Fp\u003E\u003Ccode lang=\&text\&\u003E\&publishOptions\&: {\n
\&include\&: [\n
\&wwwroot\&,\n
\&web.config\&,\n
\&Views\&\n
]\n},\n\u003C\u002Fcode\u003E\u003Ch4\u003Eruntimes\u003C\u002Fh4\u003E\u003Cp\u003Eruntimes 配置为模板运行平台。\u003Cbr\u003E详细见链接:\u003Ca href=\&https:\u002F\u002Fdocs.nuget.org\u002Fndocs\u002Fschema\u002Fproject.json\& data-editable=\&true\& data-title=\&Project.Json\&\u003EProject.Json\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Ccode lang=\&text\&\u003E\&runtimes\&: { \&ubuntu.14.04-x64\&: {} }\n\u003C\u002Fcode\u003E\u003Cp\u003E上面都弄好之后,跑一下看\u003C\u002Fp\u003E\u003Ccode lang=\&text\&\u003Edotnet restore\n\ndotnet run\n\u003C\u002Fcode\u003E\u003Cp\u003E来个请求看看:\u003C\u002Fp\u003E\u003Cimg src=\&v2-f039a37b6adb12fbe14271.png\& data-rawwidth=\&882\& data-rawheight=\&604\&\u003E\u003Cbr\u003E\u003Ch3\u003Ejexus转发\u002F反向代理\u003C\u002Fh3\u003E\u003Cp\u003E\u003Ca href=\&http:\u002F\u002Fwww.cnblogs.com\u002Fgaobing\u002Fp\u002F5663012.html\& data-editable=\&true\& data-title=\&ASP.NET Core “完整发布,自带运行时” 到jexus\& class=\&\&\u003EASP.NET Core “完整发布,自带运行时” 到jexus\u003C\u002Fa\u003E\u003C\u002Fp\u003E&,&updated&:new Date(&T17:01:20.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:0,&likeCount&:20,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&sourceUrl&:&&,&publishedTime&:&T01:01:20+08:00&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&url&:&\u002Fp\u002F&,&titleImage&:&https:\u002F\u002Fpic1.zhimg.com\u002Fv2-d5a6ca2d007e77d9d996_r.jpg&,&summary&:&&,&href&:&\u002Fapi\u002Fposts\u002F&,&meta&:{&previous&:null,&next&:null},&snapshotUrl&:&&,&commentsCount&:0,&likesCount&:20},&&:{&title&:&使用require.js编写模块化JS&,&author&:&codelover&,&content&:&\u003Ch3\u003E写在前面\u003C\u002Fh3\u003E\u003Cp\u003E最早接触javascript的时候,javascript代码直接扔在script标签里面就完事了。\u003C\u002Fp\u003E\u003Cp\u003E反正代码不多,交互简单,逻辑不难,和HTML混在一起也未尝不可。\u003C\u002Fp\u003E\u003Cp\u003E后来交互越来越复杂,代码越多越多了,我们就开始把JS代码独立到了单独的JS文件中。\u003C\u002Fp\u003E\u003Cp\u003E公共的库引用在前,自己的逻辑代码引用在后,全局变量定义在HTML内部,在独立JS文件中直接使用变量就好。\u003C\u002Fp\u003E\u003Cp\u003E我们会经常看到下面这种代码:\u003C\u002Fp\u003E\u003Ccode lang=\&cfm\&\u003E  &script src=\&1.js\&&&\u002Fscript&\n  &script src=\&2.js\&&&\u002Fscript&\n  &script src=\&3.js\&&&\u002Fscript&\n  &script src=\&4.js\&&&\u002Fscript&\n  &script src=\&5.js\&&&\u002Fscript&\n  &script src=\&6.js\&&&\u002Fscript&\n\u003C\u002Fcode\u003E\u003Cp\u003E通过script标签顺序去js管理依赖关系。\u003C\u002Fp\u003E\u003Cp\u003E阮一峰老师在\u003Ca href=\&http:\u002F\u002Fwww.ruanyifeng.com\u002Fblog\u002F\u002Frequire_js.html\& data-editable=\&true\& data-title=\&Javascript模块化编程(三):require.js的用法\&\u003EJavascript模块化编程(三):require.js的用法\u003C\u002Fa\u003E\u003Cbr\u003E一文中总结了这样写法的缺点:\u003C\u002Fp\u003E\u003Cp\u003E首先,加载的时候,浏览器会停止网页渲染,加载文件越多,网页失去响应的时间就会越长;\u003C\u002Fp\u003E\u003Cp\u003E其次,由于js文件之间存在依赖关系,因此必须严格保证加载顺序(比如上例的1.js要在2.js的前面),依赖性最大的模块一定要放到最后加载.\u003C\u002Fp\u003E\u003Cp\u003E当依赖关系很复杂的时候,代码的编写和维护都会变得困难。\u003C\u002Fp\u003E\u003Cp\u003E而requirejs的诞生便是为了解决这个问题。\u003C\u002Fp\u003E\u003Ch3\u003E\u003Ca href=\&http:\u002F\u002Fcodelover.link\u002F\u002F22\u002Fjavascript_requirejs_rf_code\u002F#requirejs\& class=\&\& data-editable=\&true\& data-title=\&使用requirejs编写模块化代码\&\u003E使用requirejs编写模块化代码\u003C\u002Fa\u003E\u003Ca href=\&http:\u002F\u002Frequirejs.org\u002Fdocs\u002Fdownload.html\& data-editable=\&true\& data-title=\&requirejs\&\u003Erequirejs\u003C\u002Fa\u003E\u003C\u002Fh3\u003E\u003Cp\u003E在\u003Ca href=\&http:\u002F\u002Frequirejs.org\u002Fdocs\u002Fdownload.html\& data-editable=\&true\& data-title=\&官网\&\u003E官网\u003C\u002Fa\u003E把requirejs 下载回来之后。使用一般的方法引入:\u003C\u002Fp\u003E\u003Ccode lang=\&text\&\u003E&script src=\&js\u002Frequire.js\&&&\u002Fscript&\n\u003C\u002Fcode\u003E\u003Cp\u003E但是这样的方法,还是可能在加载require.js的时候导致网页失去响应。解决方案一般有两种:\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003E\u003Cp\u003E把上面的代码放到网页底部\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E使用异步的方法加载,如下:\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003Ccode lang=\&text\&\u003E&script src=\&js\u002Frequire.js\& defer async=\&true\& &&\u002Fscript&\n\u003C\u002Fcode\u003E\u003Cp\u003E\u003Ca href=\&http:\u002F\u002Fwww.w3school.com.cn\u002Fhtml5\u002Fatt_script_async.asp\& data-editable=\&true\& data-title=\&async属性\&\u003Easync属性\u003C\u002Fa\u003E 表明这个文件需要异步加载,避免网页失去响应。\u003C\u002Fp\u003E\u003Cp\u003E不过IE下不支持这个属性,只支持defer,所以可以把defer也写上。\u003C\u002Fp\u003E\u003Ch3\u003E\u003Ca href=\&http:\u002F\u002Fcodelover.link\u002F\u002F22\u002Fjavascript_requirejs_rf_code\u002F#%E5%8A%A0%E8%BD%BD%E4%B8%BB%E6%A8%A1%E5%9D%97\& class=\&\& data-editable=\&true\& data-title=\&使用requirejs编写模块化代码\&\u003E使用requirejs编写模块化代码\u003C\u002Fa\u003E加载主模块\u003C\u002Fh3\u003E\u003Cp\u003E在上一步,我们已经引入了require了,那么require怎么知道我们究竟要加载什么东西呢?答案是使用data-main属性。\u003Cbr\u003E假设我们的主模块为js\u002Fhome.js,引入代码应该如下:\u003C\u002Fp\u003E\u003Ccode lang=\&text\&\u003E &script src=\&js\u002Frequire.js\& data-main=\&js\u002Fhome\&&&\u002Fscript&\n\u002F\u002Frequire.js默认文件后缀为js,所以home.js可以写成home。\n\u003C\u002Fcode\u003E\u003Cp\u003E接下来我使用\u003Ca href=\&https:\u002F\u002Fgithub.com\u002Fliguobao\u002F58HouseSearch\& data-editable=\&true\& data-title=\&58HouseSearch\&\u003E58HouseSearch\u003C\u002Fa\u003E 的代码来讲解一下require的使用。\u003C\u002Fp\u003E\u003Cp\u003E在此项目里面,重构前大概就是JS变量漫天飞,js文件里面各种函数到处乱放。一开始用起来还没什么,后来加入了更多功能的时候,JS代码维护起来就疼不欲生了。因此托了个小伙伴帮忙使用模块化思想重构了一下JS代码。\u003C\u002Fp\u003E\u003Cp\u003E上面说了,我们首先需要创建我们的模块,在这个项目里面,主模块叫home.js。\u003C\u002Fp\u003E\u003Cp\u003Ehome.js中我们需要配置一下require.config.\u003C\u002Fp\u003E\u003Ccode lang=\&text\&\u003Erequire.config({\n
baseUrl: '\u002FDomainJS\u002F',\n
paths: {\n
jquery: \&lib\u002Fjquery-1.11.3.min\&,\n
\&AMUI\&: \&lib\u002Famazeui.2.7.1.min\&,\n
\&jquery.range\&: \&lib\u002Fjquery.range\&,\n
\&es5\&: \&lib\u002Fes5\&,\n
\&mapController\&: \&mapController\&,\n
\&addToolbar\&: \&addToolbar\&,\n
\&addToolbar\&: {\n
deps: [\&jquery\&]\n
\&jquery.range\&: {\n
deps: [\&jquery\&]\n
}\n});\n\u003C\u002Fcode\u003E\u003Cp\u003E在这里我主要配置了一下baseURL(所有模块的查找根路径),paths(名称映射),shim(\u003Cbr\u003E为那些没有使用define()来声明依赖关系、设置模块的”浏览器全局变量注入”型脚本做依赖和导出配置。)\u003C\u002Fp\u003E\u003Cp\u003E关于require.config的详细内容可以看下下面这些文章:\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003E\u003Ca href=\&https:\u002F\u002Fsegmentfault.com\u002Fa\u002F1665\& data-editable=\&true\& data-title=\&RequireJS进阶:配置文件的学习\&\u003ERequireJS进阶:配置文件的学习\u003C\u002Fa\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Ca href=\&https:\u002F\u002Fsegmentfault.com\u002Fa\u002F3806\& data-editable=\&true\& data-title=\&RequireJS进阶:模块的优化及配置的详解\&\u003ERequireJS进阶:模块的优化及配置的详解\u003C\u002Fa\u003E\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003Cp\u003E配置做完了,我们也可以开始真正写我们的逻辑代码了,我们使用require来加载我们需要的库。\u003Cbr\u003E代码如下:\u003C\u002Fp\u003E\u003Ccode lang=\&text\&\u003Erequire(['domready!', 'jquery', 'AMUI', 'mapController', 'city', 'commuteGo'], \n\nfunction (doc, $, AMUI, mapController, city, commuteGo) {\n
city.initAllCityInfo();\n
mapController.init();\n\n
$(\&input[name='locationType']\&).bind('click', \n
mapController.locationMethodOnChange)\n\n
$(\&input[name='vehicle']\&).bind('click', commuteGo.go)\n\n
$('#Get58Data').bind('click', function(e) {\n
e.preventDefault();\n\n
mapController.Get58DataClick();\n
e.stopPropagation();\n
$.ajax({\n
type: \&post\&,\n
url: \&..\u002FCommom\u002FGetPVCount\&,\n
data: { },\n
success: function (result)\n
if (result.IsSuccess){\n
$(\&#lblPVCount\&).text(result.PVCount);\n
$(\&#lblPVCount\&).text(0);\n
console.log(result.Error);\n
$('#search-offcanvas').offCanvas({ effect: 'overlay' });\n\n
$(\&.amap-sug-result\&).css(\&z-index\&, 9999);\n})\n\u003C\u002Fcode\u003E\u003Cp\u003E忽略function里面的具体逻辑,加载如下:\u003C\u002Fp\u003E\u003Ccode lang=\&text\&\u003Erequire(['domready!', 'jquery', 'AMUI', 'mapController', 'city', 'commuteGo'], \nfunction (doc, $, AMUI, mapController, city, commuteGo){\n\n\u002F\u002Ftodo\n\n});\n\u003C\u002Fcode\u003E\u003Cp\u003E第一个参数为一个数组,表示所依赖的模块,此处为[‘domready!’, ‘jquery’, ‘AMUI’, ‘mapController’, ‘city’, ‘commuteGo’];\u003C\u002Fp\u003E\u003Cp\u003E第二个参数为回调函数,当前面指定的模块都全部加载成功之后,便调用此函数。加载的模块会以参数形式传入此函数,从而在回调函数内部就可以使用这些模块啦。\u003C\u002Fp\u003E\u003Cp\u003Erequire()异步加载所需模块的时候,此时浏览器并不会失去响应;当前面的模块加载成功之后,执行回调函数才会运行我们的逻辑代码,因此解决了依赖性问题。\u003C\u002Fp\u003E\u003Cp\u003E讲完了模块加载,我们下面讲一下模块编写。\u003C\u002Fp\u003E\u003Ch3\u003E\u003Ca href=\&http:\u002F\u002Fcodelover.link\u002F\u002F22\u002Fjavascript_requirejs_rf_code\u002F#AMD%E6%A8%A1%E5%9D%97%E7%BC%96%E5%86%99\& class=\&\& data-editable=\&true\& data-title=\&使用requirejs编写模块化代码\&\u003E使用requirejs编写模块化代码\u003C\u002Fa\u003EAMD模块编写\u003C\u002Fh3\u003E\u003Cp\u003Erequire.js加载的模块的采用的AMD规范。所以我们的模块必须按照AMD的规定来写。\u003C\u002Fp\u003E\u003Cp\u003E关于AMD规范详情可以看这个文章:\u003Ca href=\&http:\u002F\u002Fwww.ruanyifeng.com\u002Fblog\u002F\u002Fasynchronous_module_definition.html\& data-editable=\&true\& data-title=\&Javascript模块化编程(二):AMD规范\&\u003EJavascript模块化编程(二):AMD规范\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cp\u003E模块有两个情况,不依赖其他模块和依赖其他模块。\u003C\u002Fp\u003E\u003Ch4\u003E\u003Ca href=\&http:\u002F\u002Fcodelover.link\u002F\u002F22\u002Fjavascript_requirejs_rf_code\u002F#%E4%B8%8D%E4%BE%9D%E8%B5%96%E5%85%B6%E4%BB%96%E6%A8%A1%E5%9D%97\& class=\&\& data-editable=\&true\& data-title=\&使用requirejs编写模块化代码\&\u003E使用requirejs编写模块化代码\u003C\u002Fa\u003E不依赖其他模块\u003C\u002Fh4\u003E\u003Cp\u003E直接define定义,使用function回调。\u003C\u002Fp\u003E\u003Cp\u003E\u003Ca href=\&https:\u002F\u002Fgithub.com\u002Fliguobao\u002F58HouseSearch\u002Fblob\u002Fmaster\u002F58HouseSearch\u002FDomainJS\u002Fhelper.js\& data-editable=\&true\& data-title=\&58HouseSearch\u002FDomainJS\u002Fhelper.js\&\u003E58HouseSearch\u002FDomainJS\u002Fhelper.j\u003C\u002Fa\u003Es\u003C\u002Fp\u003E\u003Ccode lang=\&text\&\u003Edefine(function () {\n\n
\u002F\u002F获取URL中的参数\n
var getQueryString=
function (name) {\n
var reg = new RegExp(\&(^|&)\& + name + \&=([^&]*)(&|$)\&);\n
var r = window.location.search.substr(1).match(reg);\n
if (r != null) return unescape(r[2]);\n
return {\n
getQueryString: getQueryString,\n
};\n})\n\u003C\u002Fcode\u003E\u003Ch4\u003E\u003Ca href=\&http:\u002F\u002Fcodelover.link\u002F\u002F22\u002Fjavascript_requirejs_rf_code\u002F#%E4%BE%9D%E8%B5%96%E5%85%B6%E4%BB%96%E6%A8%A1%E5%9D%97\& class=\&\& data-editable=\&true\& data-title=\&使用requirejs编写模块化代码\&\u003E使用requirejs编写模块化代码\u003C\u002Fa\u003E依赖其他模块\u003C\u002Fh4\u003E\u003Cp\u003Edefine中如同require一样,用数组表明需要加载的模块,function回调。\u003C\u002Fp\u003E\u003Cp\u003E\u003Ca href=\&https:\u002F\u002Fgithub.com\u002Fliguobao\u002F58HouseSearch\u002Fblob\u002Fmaster\u002F58HouseSearch\u002FDomainJS\u002Fmarker.js\& data-editable=\&true\& data-title=\&58HouseSearch\u002FDomainJS\u002Fmarker.js\& class=\&\&\u003E58HouseSearch\u002FDomainJS\u002Fmarker.js\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Ccode lang=\&text\&\u003Edefine(['mapSignleton', 'city', 'transfer'], \nfunction(mapSignleton, city, transfer) {\n
var _map = mapSignleton.\n
var _workMarker =\n
var _markerArray = [];\n
var load = function(x, y, locationName) {\n
_workMarker = new AMap.Marker({\n
map: _map,\n
title: locationName,\n
icon: 'http:\u002F\u002Fwebapi.amap.com\u002Ftheme\u002Fv1.3\u002Fmarkers\u002Fn\u002Fmark_r.png',\n
position: [x, y]\n
var add = function(address, rent, href, markBG) {\n
new AMap.Geocoder({\n
city: city.name,\n
radius: 1000\n
}).getLocation(address, function(status, result) {\n\n
if (status === \&complete\& && result.info === 'OK') {\n
var geocode = result.geocodes[0];\n
var rentMarker = new AMap.Marker({\n
map: _map,\n
title: address,\n
icon: markBG ? 'IMG\u002FLittle\u002F' +\n
markBG : 'http:\u002F\u002Fwebapi.amap.com\u002Ftheme\u002Fv1.3\u002Fmarkers\u002Fn\u002Fmark_b.png',\n
position: [geocode.location.getLng(), geocode.location.getLat()]\n
_markerArray.push(rentMarker);\n\n
rentMarker.content = \&&div&&a target = '_blank' href='\& \n
+ href + \&'&房源:\& + address + \&
租金:\& + rent + \&&\u002Fa&&div&\&\n
rentMarker.on('click', function(e) {\n
transfer.add(e, address);\n
var clearArray = function() {\n
if (_markerArray && _markerArray.length & 0) \n
_map.remove(_markerArray);\n
_markerArray = [];\n
var clear = function() {\n
if (_workMarker) {\n
_map.remove(_workMarker);\n
return {\n
load: load,\n
add: add,\n
clearArray: clearArray,\n
clear: clear\n
};\n});\n\u003C\u002Fcode\u003E\u003Cp\u003E这样的话,一个供require调用的模块也就写好了。\u003C\u002Fp\u003E\u003Cp\u003E最后感谢小伙伴\u003Ca href=\&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002Fpiratf\& data-editable=\&true\& data-title=\&Larry Sean\&\u003ELarry Sean\u003C\u002Fa\u003E 帮忙重构代码。\u003C\u002Fp\u003E&,&updated&:new Date(&T14:34:21.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:10,&likeCount&:16,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:true,&rating&:&none&,&sourceUrl&:&&,&publishedTime&:&T22:34:21+08:00&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&url&:&\u002Fp\u002F&,&titleImage&:&https:\u002F\u002Fpic1.zhimg.com\u002Fv2-1a5bdf8b50e0acefcee089d6ae3633a3_r.jpg&,&summary&:&&,&href&:&\u002Fapi\u002Fposts\u002F&,&meta&:{&previous&:null,&next&:null},&snapshotUrl&:&&,&commentsCount&:10,&likesCount&:16},&&:{&title&:&ASP.NET MVC 微信JS-SDK认证&,&author&:&codelover&,&content&:&\u003Ch3\u003E写在前面\u003C\u002Fh3\u003E\u003Cp\u003E前阵子因为有个项目需要做微信自定义分享功能,因而去研究了下微信JS-SDK相关知识。\u003C\u002Fp\u003E\u003Cp\u003E此文做个简单的记(tu)录(cao)…\u003C\u002Fp\u003E\u003Ch3\u003E\u003Ca href=\&http:\u002F\u002Fcodelover.link\u002F\u002F01\u002Fwebchat_JS_SDK\u002F#%E5%BC%80%E5%A7%8B\& class=\&\& data-editable=\&true\& data-title=\&ASP.NET MVC 微信JS-SDK认证\&\u003EASP.NET MVC 微信JS-SDK认证\u003C\u002Fa\u003E开始\u003C\u002Fh3\u003E\u003Cp\u003E所有的东西都从文档开始:\u003Ca href=\&http:\u002F\u002Fmp.weixin.qq.com\u002Fwiki\u002F11\u002F74ad127cc054f6bec03db.html\& data-editable=\&true\& data-title=\&微信JSSDK说明文档\&\u003E微信JSSDK说明文档\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cp\u003E项目需要用到的是\u003Ca href=\&http:\u002F\u002Fmp.weixin.qq.com\u002Fwiki\u002F11\u002F74ad127cc054f6bec03db.html#.E5.88.86.E4.BA.AB.E6.8E.A5.E5.8F.A3\& data-editable=\&true\& data-title=\&分享接口\&\u003E分享接口\u003C\u002Fa\u003E 不过使用微信JS-SDK之前,需要做JS接口认证。\u003C\u002Fp\u003E\u003Cp\u003E认证如下:\u003C\u002Fp\u003E\u003Cp\u003E步骤一:绑定域名\u003C\u002Fp\u003E\u003Cp\u003E步骤二:引入JS文件\u003C\u002Fp\u003E\u003Cp\u003E步骤三:通过config接口注入权限验证配置\u003C\u002Fp\u003E\u003Cp\u003E步骤四:通过ready接口处理成功验证\u003C\u002Fp\u003E\u003Cp\u003E步骤五:通过error接口处理失败验证\u003C\u002Fp\u003E\u003Cp\u003E步骤一中允许使用域名\u002F子域名,只要xx.com\u002Fxxx.txt或者xx.com\u002Fmp\u002Fxxx.txt能访问就好。域名认证通过之后,此域名下的所有端口的网站都可以使用JS-SDK。\u003C\u002Fp\u003E\u003Cp\u003E步骤二没什么问题,略过。\u003C\u002Fp\u003E\u003Cp\u003E步骤三最磨人,下面单独讲解。\u003C\u002Fp\u003E\u003Ch3\u003E\u003Ca href=\&http:\u002F\u002Fcodelover.link\u002F\u002F01\u002Fwebchat_JS_SDK\u002F#config%E6%8E%A5%E5%8F%A3%E6%B3%A8%E5%85%A5%E6%9D%83%E9%99%90%E9%AA%8C%E8%AF%81%E9%85%8D%E7%BD%AE\& class=\&\& data-editable=\&true\& data-title=\&ASP.NET MVC 微信JS-SDK认证\&\u003EASP.NET MVC 微信JS-SDK认证\u003C\u002Fa\u003Econfig接口注入权限验证配置\u003C\u002Fh3\u003E\u003Cp\u003E先来一段说明:\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cblockquote\u003E所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用\u003Cbr\u003E(同一个url仅需调用一次,对于变化url的SPA的web app可在每次url变化时进行调用,目前Android微信客户端不支持pushState的H5新特性,\u003Cbr\u003E所以使用pushState来实现web app的页面会导致签名失败,此问题会在Android6.2中修复)。\u003C\u002Fblockquote\u003E\u003Ccode lang=\&js\&\u003Ewx.config({\n
debug: true, \u002F\u002F 开启调试模式,调用的所有api的返回值会在客户端alert出来,\n
\u002F\u002F若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。\n
appId: '', \u002F\u002F 必填,公众号的唯一标识\n
timestamp: , \u002F\u002F 必填,生成签名的时间戳\n
nonceStr: '', \u002F\u002F 必填,生成签名的随机串\n
signature: '',\u002F\u002F 必填,签名,见附录1\n
jsApiList: [] \u002F\u002F 必填,需要使用的JS接口列表,所有JS接口列表见附录2\n});\n\u003C\u002Fcode\u003E\u003Cp\u003E看到这里肯定懵逼了,这是都什么鬼…怎么玩啊。\u003C\u002Fp\u003E\u003Cp\u003E提示我们去看附录1…看完之后总结如下:\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003E使用config接口注入权限验证配置,重点是生成合法的signatrue\u003C\u002Fli\u003E\u003Cli\u003E生成signature需要通过appid和secret获取token\u003C\u002Fli\u003E\u003Cli\u003E时间戳和调用接口URL必不可少\u003C\u002Fli\u003E\u003Cli\u003E此操作需要服务端完成,不能使用客户端实现\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003Cp\u003E整个过程变成:\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003E\u003Cp\u003E通过appid和secret获取access_token,接着使用token获取jsapi_ticket;\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E拿到jsapi_ticket之后,把jsapi_ticket、时间戳、随机字符串、接口调用页面URL 拼接成完整字符串,使用sha1算法加密得到signature。\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E最后返回至页面,在wx.config里面填入appid,上一步的时间戳timestamp,上一部的随机字符串、sha1拿到的signature,想要使用的JS接口。\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003Cp\u003E废话少说,直接上代码吧。\u003C\u002Fp\u003E\u003Ch3\u003E\u003Ca href=\&http:\u002F\u002Fcodelover.link\u002F\u002F01\u002Fwebchat_JS_SDK\u002F#%E4%BB%A3%E7%A0%81%E6%97%B6%E9%97%B4\& class=\&\& data-editable=\&true\& data-title=\&ASP.NET MVC 微信JS-SDK认证\&\u003EASP.NET MVC 微信JS-SDK认证\u003C\u002Fa\u003E代码时间\u003C\u002Fh3\u003E\u003Ccode lang=\&csharp\&\u003Epublic class WeiXinController : Controller\n{\n
public static readonly string appid =\n
System.Web.Configuration.WebConfigurationManager.AppSettings[\&wxappid\&];\n\n
public static readonly string secret =\n
System.Web.Configuration.WebConfigurationManager.AppSettings[\&wxsecret\&];\n\n
public static readonly bool isDedug =\n
System.Web.Configuration.WebConfigurationManager.AppSettings[\&IsDebug\&] ==\&true\&;\n\n\n
public static string _ticket = \&\&;\n\n
public static DateTime _lastT\n\n\n
public ActionResult Info(string url,string noncestr)\n
if (string.IsNullOrEmpty(_ticket) || \n
_lastTimestamp == null || (_lastTimestamp - DateTime.Now).Milliseconds & 7200)\n
var resultString = HTTPHelper.GetHTMLByURL(\&https:\u002F\u002Fapi.weixin.qq.com\u002Fcgi-bin\u002Ftoken?grant_type=client_credential&appid=\&\n
+ appid + \&&secret=\& + secret);\n
dynamic resultValue = JsonConvert.DeserializeObject&dynamic&(resultString);\n
if (resultValue == null || resultValue.access_token == null \n
|| resultValue.access_token.Value == null)\n
return Json(new { issuccess = false, \n
error = \&获取token失败\& });\n
var token = resultValue.access_token.V\n\n
resultString = HTTPHelper.GetHTMLByURL\n
(\&https:\u002F\u002Fapi.weixin.qq.com\u002Fcgi-bin\u002Fticket\u002Fgetticket?access_token=\& + \n
token + \&&type=jsapi\&);\n
dynamic ticketValue = JsonConvert.DeserializeObject&dynamic&(resultString);\n
if (ticketValue == null || ticketValue.errcode == null\n
|| ticketValue.errcode.Value != 0 || ticketValue.ticket == null)\n
return Json(new { issuccess = false,\n
error = \&获取ticketValue失败\& });\n
_ticket = ticketValue.ticket.V\n
_lastTimestamp = DateTime.N\n
var timestamp = GetTimeStamp();\n
var hexString = string.Format(\&jsapi_ticket={0}&noncestr={3}&timestamp={1}&url={2}\&,\n
_ticket, timestamp, url,noncestr);\n\n
return Json(new {\n
issuccess = true, \n
sha1value = GetSHA1Value(hexString), \n
timestamp = timestamp, \n
url = url, \n
appid = appid, \n
debug=isDedug,\n
tiket=_ticket\n
var timestamp = GetTimeStamp();\n
var hexString = string.Format(\&jsapi_ticket={0}&noncestr=3456&timestamp={1}&url={2}\&,\n
_ticket, timestamp, url);\n
return Json(new { \n
issuccess = true, sha1value = GetSHA1Value(hexString),\n
timestamp = timestamp, url = url,\n
appid = appid, debug = isDedug,tiket = _ticket\n
private string GetSHA1Value(string sourceString)\n
var hash = SHA1.Create().ComputeHash(Encoding.UTF8.GetBytes(sourceString));\n
return string.Join(\&\&, \n
hash.Select(b =& b.ToString(\&x2\&)).ToArray());\n
private static string GetTimeStamp()\n
TimeSpan ts = DateTime.Now - new DateTime(, 0, 0, 0, 0);\n\n
return Convert.ToInt64(ts.TotalSeconds).ToString();\n\n
}\n\n}\n\n\n\n\npublic class HTTPHelper\n{\n
public static string GetHTMLByURL(string url)\n
string htmlCode = string.E\n
HttpWebRequest webRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);\n
webRequest.Timeout = 30000;\n
webRequest.Method = \&GET\&;\n
webRequest.UserAgent = \&Mozilla\u002F4.0\&;\n
webRequest.Headers.Add(\&Accept-Encoding\&, \&gzip, deflate\&);\n
HttpWebResponse webResponse = (System.Net.HttpWebResponse)webRequest.GetResponse();\n
\u002F\u002F获取目标网站的编码格式\n
string contentype = webResponse.Headers[\&Content-Type\&];\n
Regex regex = new Regex(\&charset\\\\s*=\\\\s*[\\\\W]?\\\\s*([\\\\w-]+)\&, RegexOptions.IgnoreCase);\n
if (webResponse.ContentEncoding.ToLower() == \&gzip\&)\u002F\u002F如果使用了GZip则先解压\n
using (System.IO.Stream streamReceive = webResponse.GetResponseStream())\n
using (var zipStream = new System.IO.Compression.GZipStream(streamReceive, System.IO.Compression.CompressionMode.Decompress))\n
\u002F\u002F匹配编码格式\n
if (regex.IsMatch(contentype))\n
Encoding ending = Encoding.GetEncoding\n
(regex.Match(contentype).Groups[1].Value.Trim());\n
using (StreamReader sr = new System.IO.StreamReader(zipStream, ending))\n
htmlCode = sr.ReadToEnd();\n
using (StreamReader sr = new System.IO.StreamReader(zipStream, Encoding.UTF8))\n
htmlCode = sr.ReadToEnd();\n
using (System.IO.Stream streamReceive = webResponse.GetResponseStream())\n
var encoding = Encoding.D\n
if (contentype.Contains(\&utf\&))\n
encoding = Encoding.UTF8;\n
using (System.IO.StreamReader sr = new System.IO.StreamReader(streamReceive, encoding))\n
htmlCode = sr.ReadToEnd();\n
return htmlC\n
catch (Exception ex)\n
return \&\&;\n
}\n}\n\u003C\u002Fcode\u003E\u003Cp\u003EPS:这里要注意缓存一下_ticket(即access_token),照微信文档说的,access_token两个小时内有效,不需要频繁调用。而且获取access_token的接口有调用次数的限制,如果超过了次数,就不允许调用了。\u003C\u002Fp\u003E\u003Cp\u003EPPS:建议noncestr和URL由前台传入比较适合,使用 var theWebUrl = window.location.href.split(‘#’)[0] 获取URL,noncestr就随意了。\u003C\u002Fp\u003E\u003Cp\u003EPPPS:遇到诡异的invalid signature的时候,首先检查url参数,然后检查noncestr,再不行重启一下程序获取一个新的token回来继续玩。\u003C\u002Fp\u003E\u003Cp\u003EPPPPS:成果在这里,\u003Ca href=\&http:\u002F\u002Fshmfcb.com\u002FRescueSNH48\u002F\& data-editable=\&true\& data-title=\&SNH48解救行动\& class=\&\&\u003ESNH48解救行动\u003C\u002Fa\u003E(流量预警:HTML5游戏,预计获得-15M+流量,非wifi条件祝好运。)微信打开,直接分享或者完成游戏之后分享都可以看到自定义分享内容。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E完整代码:\u003Ca href=\&https:\u002F\u002Fgithub.com\u002Fliguobao\u002FWeixinAPI\& data-editable=\&true\& data-title=\&liguobao\u002FWeixinAPI · GitHub\&\u003Eliguobao\u002FWeixinAPI · GitHub\u003C\u002Fa\u003E(测试前记得把web.config里面的appid和wxsecret改成自己的)\u003C\u002Fp\u003E&,&updated&:new Date(&T01:46:19.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:6,&likeCount&:7,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&sourceUrl&:&&,&publishedTime&:&T09:46:19+08:00&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&url&:&\u002Fp\u002F&,&titleImage&:&https:\u002F\u002Fpic4.zhimg.com\u002Fv2-fed4d03f32cbef16e8ca72fa_r.jpg&,&summary&:&&,&href&:&\u002Fapi\u002Fposts\u002F&,&meta&:{&previous&:null,&next&:null},&snapshotUrl&:&&,&commentsCount&:6,&likesCount&:7},&&:{&title&:&地图搜房下一站?&,&author&:&codelover&,&content&:&\u003Cimg src=\&v2-f33ada67cdac0dc38ecc70.png\& data-rawwidth=\&1284\& data-rawheight=\&781\&\u003E\u003Cbr\u003E\u003Cimg src=\&v2-6a29da0f28acb2ff3bd74dcc.png\& data-rawwidth=\&1478\& data-rawheight=\&839\&\u003E\u003Cbr\u003E\u003Cbr\u003E\u003Cp\u003E\u003Cimg src=\&v2-c2df6e29aef74d1f66a85.png\& data-rawwidth=\&1680\& data-rawheight=\&766\&\u003E下个版本见...\u003C\u002Fp\u003E\u003Cp\u003E\u003Ca href=\&https:\u002F\u002Fgithub.com\u002Fliguobao\u002F58HouseSearch\u002F\&\u003Ehttps:\u002F\u002Fgithub.com\u002Fliguobao\u002F58HouseSearch\u002F\u003C\u002Fa\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Ca href=\&https:\u002F\u002Fgithub.com\u002Fliguobao\u002F58HouseSearch\u002Fissues\u002F28\&\u003Ehttps:\u002F\u002Fgithub.com\u002Fliguobao\u002F58HouseSearch\u002Fissues\u002F28\u003C\u002Fa\u003E\u003C\u002Fp\u003E&,&updated&:new Date(&T04:49:17.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:4,&likeCount&:12,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&sourceUrl&:&&,&publishedTime&:&T12:49:17+08:00&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&url&:&\u002Fp\u002F&,&titleImage&:&https:\u002F\u002Fpic1.zhimg.com\u002Fv2-947bffe7f99b1e_r.jpg&,&summary&:&&,&href&:&\u002Fapi\u002Fposts\u002F&,&meta&:{&previous&:null,&next&:null},&snapshotUrl&:&&,&commentsCount&:4,&likesCount&:12},&&:{&title&:&对,高德地图找租房项目又更新了...&,&author&:&codelover&,&content&:&\u003Cp\u003E嗯,暂停了一个月的\u003Ca href=\&https:\u002F\u002Fgithub.com\u002Fliguobao\u002F58HouseSearch\& class=\&\& data-title=\&58HouseSearch\& data-editable=\&true\&\u003E58HouseSearch\u003C\u002Fa\u003E项目又继续更新了...\u003C\u002Fp\u003E\u003Cp\u003E大概一个多月前的国庆,项目框架已经从ASP.NET MVC 平滑转移到ASP.NET Core了,但是之前线上版本还是用的ASP.NET MVC...\u003C\u002Fp\u003E\u003Cp\u003E为嘛呢?额,因为我懒。\u003C\u002Fp\u003E\u003Cp\u003E很明显上面是开玩笑的。本质是因为项目升级到ASP.NET Core的时候有一些地方没处理好,发布服务器程序没有更新,linux服务器 core版本没有更新等等之类,更加上不是很熟悉core整一套开发流程,更更加上前阵子忙别的事情去了,因而也就放着没管了。\u003C\u002Fp\u003E\u003Cp\u003E然后最近在大(bing)家(mei)的(you)热(ren)情(li)支(wo)持下,所以我又更新了一版。\u003C\u002Fp\u003E\u003Cp\u003E如下图+题图:\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cimg src=\&v2-2d556d51cf163ddf747e.png\& data-rawwidth=\&1898\& data-rawheight=\&846\&\u003E是的,没错。\u003Cp\u003E我把豆瓣租房小组的数据给抓了....\u003C\u002Fp\u003E\u003Cp\u003E他们的讨论是这样的:\u003C\u002Fp\u003E\u003Cimg src=\&v2-563d518d58dab9919c99c.png\& data-rawwidth=\&1663\& data-rawheight=\&782\&\u003E\u003Cbr\u003E\u003Cp\u003E到我这里,数据是这样的:\u003C\u002Fp\u003E\u003Cp\u003E\u003Cimg src=\&v2-010bcadd7cde.png\& data-rawwidth=\&1828\& data-rawheight=\&799\&\u003E这样的:\u003C\u002Fp\u003E\u003Cp\u003E\u003Cimg src=\&v2-1b7fddf079e2da48086c0f.png\& data-rawwidth=\&1856\& data-rawheight=\&800\&\u003E还有这样的:\u003Cimg src=\&v2-e5e62edf4969ade9dd76a6.png\& data-rawwidth=\&1868\& data-rawheight=\&827\&\u003E\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E有些小朋友看下来要提问了:\u003C\u002Fp\u003E\u003Cp\u003E上面不是只有北上广深,别的城市怎么玩?你这家伙是不是看不起我们二三线城市?\u003C\u002Fp\u003E\u003Cp\u003E少年,稍安勿躁。来来来,教你一招降龙十八掌。\u003C\u002Fp\u003E\u003Cp\u003E看到下面这个链接了么?\u003C\u002Fp\u003E\u003Cp\u003E\u003Ca href=\&http:\u002F\u002Fcodelover.link:FDoubanHome?groupID=26926&cityname=%E5%8C%97%E4%BA%AC\& data-title=\&http:\u002F\u002Fcodelover.link:FDoubanHome?groupID=26926&cityname=北京\& class=\&\& data-editable=\&true\&\u003Ehttp:\u002F\u002Fcodelover.link:FDoubanHome?groupID=26926&cityname=北京\u003C\u002Fa\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003EQ:这破链接不就是只有\u003Ca href=\&https:\u002F\u002Fwww.douban.com\u002Fgroup\u002F2Fdiscussion\& class=\&\& data-title=\&“北京租房豆瓣”\& data-editable=\&true\&\u003E“北京租房豆瓣”\u003C\u002Fa\u003E的数据么?\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003EA:这破网站,哪里的租房小组数据都能看。\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003EPS:看到groupID和cityname了么?玄机在这里。\u003C\u002Fp\u003E\u003Cp\u003E这是\u003Ca href=\&https:\u002F\u002Fwww.douban.com\u002Fgroup\u002FXMhouse\u002F\& data-title=\&厦门租房小组\& class=\&\& data-editable=\&true\&\u003E厦门租房小组\u003C\u002Fa\u003E链接:\u003Ca href=\&https:\u002F\u002Fwww.douban.com\u002Fgroup\u002FXMhouse\u002F\& data-title=\&(https:\u002F\u002Fwww.douban.com\u002Fgroup\u002FXMhouse\u002F)\& class=\&\& data-editable=\&true\&\u003Ehttps:\u002F\u002Fwww.douban.com\u002Fgroup\u002FXMhouse\u002F\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cp\u003E那么,我们只需要把\u003C\u002Fp\u003E\u003Cp\u003E\u003Ca href=\&http:\u002F\u002Fcodelover.link:FDoubanHome?groupID=26926&cityname=%E5%8C%97%E4%BA%AC\& data-title=\&http:\u002F\u002Fcodelover.link:FDoubanHome?groupID=26926&cityname=北京\& class=\&\& data-editable=\&true\&\u003Ehttp:\u002F\u002Fcodelover.link:FDoubanHome?groupID=26926&cityname=北京\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cp\u003E这个链接里面的“26926”换成“XMhouse”,“北京”换成“厦门”,得到:\u003C\u002Fp\u003E\u003Cp\u003E\u003Ca href=\&http:\u002F\u002Fcodelover.link:FDoubanHome?groupID=XMhouse&cityname=%E5%8E%A6%E9%97%A8\& class=\&\& data-title=\&http:\u002F\u002Fcodelover.link:FDoubanHome?groupID=XMhouse&cityname=厦门\& data-editable=\&true\&\u003Ehttp:\u002F\u002Fcodelover.link:FDoubanHome?groupID=XMhouse&cityname=厦门\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cp\u003E如下,华丽丽的厦门租房小组数据便呈现在地图上了。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cimg src=\&v2-a5b2e6bf093fb90986a9.png\& data-rawwidth=\&1804\& data-rawheight=\&813\&\u003E同理,\u003C\u002Fp\u003E\u003Cp\u003E武汉:\u003Ca href=\&http:\u002F\u002Fcodelover.link:FDoubanHome?groupID=352552&cityname=%E6%AD%A6%E6%B1%89\& class=\&\& data-title=\&http:\u002F\u002Fcodelover.link:FDoubanHome?groupID=352552&cityname=武汉\& data-editable=\&true\&\u003Ehttp:\u002F\u002Fcodelover.link:FDoubanHome?groupID=352552&cityname=武汉\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cp\u003E长沙:\u003Ca href=\&http:\u002F\u002Fcodelover.link:FDoubanHome?groupID=cszf&cityname=%E9%95%BF%E6%B2%99\& class=\&\& data-editable=\&true\& data-title=\&http:\u002F\u002Fcodelover.link:FDoubanHome?groupID=cszf&cityname=长沙\&\u003Ehttp:\u002F\u002Fcodelover.link:FDoubanHome?groupID=cszf&cityname=长沙\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cp\u003E成都:\u003Ca href=\&http:\u002F\u002Fcodelover.link:FDoubanHome?groupID=343477&cityname=%E6%88%90%E9%83%BD\& class=\&\& data-editable=\&true\& data-title=\&http:\u002F\u002Fcodelover.link:FDoubanHome?groupID=343477&cityname=成都\&\u003Ehttp:\u002F\u002Fcodelover.link:FDoubanHome?groupID=343477&cityname=成都\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cp\u003E杭州:\u003Ca href=\&http:\u002F\u002Fcodelover.link:FDoubanHome?groupID=HZhome&cityname=%E6%9D%AD%E5%B7%9E\& class=\&\& data-editable=\&true\& data-title=\&http:\u002F\u002Fcodelover.link:FDoubanHome?groupID=HZhome&cityname=杭州\&\u003Ehttp:\u002F\u002Fcodelover.link:FDoubanHome?groupID=HZhome&cityname=杭州\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cp\u003EPS:默认实时抓取豆瓣小组讨论前5页,总计 5 * 25 = 125条数据,需要更多数据的可以在URL追加PageCount参数,格式如下为:\u003Ca href=\&http:\u002F\u002Fcodelover.link:FDoubanHomehttp:\u002F\u002Fcodelover.link:FDoubanHome?groupID=HZhome&cityname=%E6%9D%AD%E5%B7%9E&PageCount=10?groupID=HZhome&cityname=%E6%9D%AD%E5%B7%9E\& class=\&\& data-editable=\&true\& data-title=\&http:\u002F\u002Fcodelover.link:FDoubanHome?groupID=HZhome&cityname=杭州&PageCount=10\&\u003Ehttp:\u002F\u002Fcodelover.link:FDoubanHome?groupID=HZhome&cityname=杭州&PageCount=10\u003C\u002Fa\u003E(抓取前10页)\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E最后附上各种地址:\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E\u003Ca href=\&http:\u002F\u002Fcodelover.link:FDoubanHome?groupID=26926&cityname=%E5%8C%97%E4%BA%AC\& data-title=\&http:\u002F\u002Fcodelover.link:FDoubanHome?groupID=26926&cityname=北京\& class=\&\& data-editable=\&true\&\u003Ehttp:\u002F\u002Fcodelover.link:FDoubanHome?groupID=26926&cityname=北京\u003C\u002Fa\u003E\u003Cbr\u003E\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E\u003Ca href=\&http:\u002F\u002Fcodelover.link:FDoubanHome?groupID=shanghaizufang&cityname=%E4%B8%8A%E6%B5%B7\& class=\&\& data-editable=\&true\& data-title=\&http:\u002F\u002Fcodelover.link:FDoubanHome?groupID=shanghaizufang&cityname=上海\&\u003Ehttp:\u002F\u002Fcodelover.link:FDoubanHome?groupID=shanghaizufang&cityname=上海\u003C\u002Fa\u003E\u003Cbr\u003E\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E\u003Ca href=\&http:\u002F\u002Fcodelover.link:FDoubanHome?groupID=gz020&cityname=%E5%B9%BF%E5%B7%9E\& class=\&\& data-editable=\&true\& data-title=\&http:\u002F\u002Fcodelover.link:FDoubanHome?groupID=gz020&cityname=广州\&\u003Ehttp:\u002F\u002Fcodelover.link:FDoubanHome?groupID=gz020&cityname=广州\u003C\u002Fa\u003E\u003Cbr\u003E\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E\u003Ca href=\&http:\u002F\u002Fcodelover.link:FDoubanHome?groupID=szzf&cityname=%E6%B7%B1%E5%9C%B3\& class=\&\& data-editable=\&true\& data-title=\&http:\u002F\u002Fcodelover.link:FDoubanHome?groupID=szzf&cityname=深圳\&\u003Ehttp:\u002F\u002Fcodelover.link:FDoubanHome?groupID=szzf&cityname=深圳\u003C\u002Fa\u003E\u003Cbr\u003E\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E\u003Ca href=\&http:\u002F\u002Fcodelover.link:FDoubanHome?groupID=XMhouse&cityname=%E5%8E%A6%E9%97%A8\& class=\&\& data-title=\&http:\u002F\u002Fcodelover.link:FDoubanHome?groupID=XMhouse&cityname=厦门\& data-editable=\&true\&\u003Ehttp:\u002F\u002Fcodelover.link:FDoubanHome?groupID=XMhouse&cityname=厦门\u003C\u002Fa\u003E\u003Cbr\u003E\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Ca href=\&http:\u002F\u002Fcodelover.link:FDoubanHome?groupID=352552&cityname=%E6%AD%A6%E6%B1%89\& class=\&\& data-title=\&http:\u002F\u002Fcodelover.link:FDoubanHome?groupID=352552&cityname=武汉\& data-editable=\&true\&\u003E\u003Cb\u003Ehttp:\u002F\u002Fcodelover.link:FDoubanHome?groupID=352552&cityname=武汉\u003C\u002Fb\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Ca href=\&http:\u002F\u002Fcodelover.link:FDoubanHome?groupID=cszf&cityname=%E9%95%BF%E6%B2%99\& class=\&\& data-editable=\&true\& data-title=\&http:\u002F\u002Fcodelover.link:FDoubanHome?groupID=cszf&cityname=长沙\&\u003E\u003Cb\u003Ehttp:\u002F\u002Fcodelover.link:FDoubanHome?groupID=cszf&cityname=长沙\u003C\u002Fb\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Ca href=\&http:\u002F\u002Fcodelover.link:FDoubanHome?groupID=343477&cityname=%E6%88%90%E9%83%BD\& class=\&\& data-editable=\&true\& data-title=\&http:\u002F\u002Fcodelover.link:FDoubanHome?groupID=343477&cityname=成都\&\u003E\u003Cb\u003Ehttp:\u002F\u002Fcodelover.link:FDoubanHome?groupID=343477&cityname=成都\u003C\u002Fb\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E\u003Ca href=\&http:\u002F\u002Fcodelover.link:FDoubanHome?groupID=HZhome&cityname=%E6%9D%AD%E5%B7%9E\& class=\&\& data-editable=\&true\& data-title=\&http:\u002F\u002Fcodelover.link:FDoubanHome?groupID=HZhome&cityname=杭州\&\u003Ehttp:\u002F\u002Fcodelover.link:FDoubanHome?groupID=HZhome&cityname=杭州\u003C\u002Fa\u003E\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003EGithub源码地址:\u003Ca href=\&https:\u002F\u002Flink.zhihu.com\u002F?target=https%3A\u002F\u002Fgithub.com\u002Fliguobao\u002F58HouseSearch\& class=\&\& data-editable=\&true\& data-title=\&https:\u002F\u002Fgithub.com\u002Fliguobao\u002F58HouseSearch\&\u003Ehttps:\u002F\u002Fgithub.com\u002Fliguobao\u002F58HouseSearch\u003C\u002Fa\u003E(欢迎Star)\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003EPS:\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E 由于没有引入分词,有些奇怪标题小组讨论可能没办法正常在地图定位,这个版本直接忽略它们吧.\u003C\u002Fli\u003E\u003Cli\u003E同上,因而没有做价格区间标记。不过大多价格在标题里面能看到...\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cbr\u003E\u003Cp\u003E\u003Cb\u003E尾声:\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E使用期间有什么建议或者遇到什么bug之类的话,邮件啦。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E彩蛋:\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E据说这个辣鸡项目来了个产品小姐姐和前端小哥哥哦,有什么需求评论见呀。\u003C\u002Fp\u003E\u003Cp\u003E日常感谢衣衣姐(\u003Ca href=\&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002F4cdfec4c94efd7515875\& data-hash=\&4cdfec4c94efd7515875\& class=\&member_mention\& data-hovercard=\&p$b$4cdfec4c94efd7515875\&\u003E@余蕙芷\u003C\u002Fa\u003E )的重构代码(强迫症伤不起...)。\u003C\u002Fp\u003E&,&updated&:new Date(&T12:08:39.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:6,&likeCount&:37,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&sourceUrl&:&&,&publishedTime&:&T20:08:39+08:00&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&url&:&\u002Fp\u002F&,&titleImage&:&https:\u002F\u002Fpic3.zhimg.com\u002Fv2-d5211a94fdc1d21defaa78b_r.jpg&,&summary&:&&,&href&:&\u002Fapi\u002Fposts\u002F&,&meta&:{&previous&:null,&next&:null},&snapshotUrl&:&&,&commentsCount&:6,&likesCount&:37},&&:{&title&:&手把手教你用.NET Core写爬虫&,&author&:&codelover&,&content&:&\u003Ch3\u003E写在前面\u003C\u002Fh3\u003E\u003Cp\u003E自从上一个项目\u003Ca href=\&https:\u002F\u002Fgithub.com\u002Fliguobao\u002F58HouseSearch\& data-editable=\&true\& data-title=\&58HouseSearch\&\u003E58HouseSearch\u003C\u002Fa\u003E从.NET迁移到.NET core之后,磕磕碰碰磨蹭了一个月才正式上线到新版本。\u003Cbr\u003E然后最近又开了个新坑,搞了个\u003Ca href=\&http:\u002F\u002Fcodelover.win\u002F\& data-editable=\&true\& data-title=\&Dy2018Crawler\&\u003EDy2018Crawler\u003C\u002Fa\u003E用来爬dy2018电影天堂上面的电影资源。这里也借机简单介绍一下如何基于.NET Core写一个爬虫。\u003Cbr\u003EPS:如有偏错,敬请指明...\u003Cbr\u003EPPS:该去电影院还是多去电影院,毕竟美人良时可无价。\u003C\u002Fp\u003E\u003Ch3\u003E准备工作(.NET Core准备)\u003C\u002Fh3\u003E\u003Cp\u003E首先,肯定是先安装.NET Core咯。下载及安装教程在这里:\u003Ca href=\&https:\u002F\u002Fwww.microsoft.com\u002Fnet\u002Fcore\& data-editable=\&true\& data-title=\&.NET - Powerful Open Source Development\&\u003E.NET - Powerful Open Source Development\u003C\u002Fa\u003E。无论你是Windows、linux还是mac,统统可以玩。\u003C\u002Fp\u003E\u003Cp\u003E我这里的环境是:Windows10 + VS2015 community updata3 + .NET Core 1.1.0 SDK + .NET Core 1.0.1 tools Preview 2.\u003C\u002Fp\u003E\u003Cp\u003E理论上,只需要安装一下 .NET Core 1.1.0 SDK 即可开发.NET Core程序,至于用什么工具写代码都无关紧要了。\u003C\u002Fp\u003E\u003Cp\u003E安装好以上工具之后,在VS2015的新建项目就可以看到.NET Core的模板了。如下图:\u003C\u002Fp\u003E\u003Cimg src=\&v2-eddb6c1ed0f9dc.png\& data-rawwidth=\&800\& data-rawheight=\&555\&\u003E\u003Cbr\u003E\u003Cp\u003E为了简单起见,我们创建的时候,直接选择VS .NET Core tools自带的模板。\u003C\u002Fp\u003E\u003Ch3\u003E一个爬虫的自我修养\u003C\u002Fh3\u003E\u003Ch4\u003E分析网页\u003C\u002Fh4\u003E\u003Cp\u003E写爬虫之前,我们首先要先去了解一下即将要爬取的网页数据组成。\u003C\u002Fp\u003E\u003Cp\u003E具体到网页的话,便是分析我们要抓取的数据在HTML里面是用什么标签抑或有什么样的标记,然后使用这个标记把数据从HTML中提取出来。在我这里的话,用的更多的是HTML标签的ID和CSS属性。\u003C\u002Fp\u003E\u003Cp\u003E以本文章想要爬取的dy2018.com为例,简单描述一下这个过程。dy2018.com主页如下图:\u003C\u002Fp\u003E\u003Cimg src=\&v2-4fe20eb1c93ecc74c6a54700.png\& data-rawwidth=\&1350\& data-rawheight=\&915\&\u003E\u003Cbr\u003E\u003Cp\u003E在chrome里面,按F12进入开发者模式,接着如下图使用鼠标选择对应页面数据,然后去分析页面HTML组成。\u003C\u002Fp\u003E\u003Cimg src=\&v2-e73d8d0cad0.png\& data-rawwidth=\&1679\& data-rawheight=\&916\&\u003E\u003Cbr\u003E\u003Cp\u003E接着我们开始分析页面数据:\u003C\}

我要回帖

更多关于 www.cabet88.com 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信