2021-02-27

国内首个单针接种的新冠疫苗来了!白岩松专访陈薇院士答疑|陈薇|中国工程院|新冠肺炎

  我国首个腺病毒载体新冠疫苗25日获批附条件上市,这也是全球第一个进入临床的新冠疫苗,历时一年多的研发。疫苗的安全性怎么样?公众又该如何选择?白岩松新媒体直播节目《白·问》第二期,对话中国工程院院士陈薇,就研发疫苗过程等问题进行分析解答。

  单针接种新冠疫苗年产能或达5亿。

  Q:国内首个单针接种的新冠疫苗什么时候可以接种?

  中国工程院院士 陈薇:其实我们的疫苗在去年6月份已经被批准应急使用,对特定人群,特别是一些极端环境下的人群,我们做了一定规模的接种。现在获批附条件上市以后,我们觉得在中国,包括全球范围内,能够有更多的人,更快地可以接种到这款疫苗,当然前提是在自行同意和个人自愿的条件下,我觉得对我们来说又是前进了一大步。 

  Q:腺病毒载体新冠疫苗附条件上市后产能可以达到多少剂?

  陈薇:我们做的是基因工程疫苗,基因工程疫苗最大的特点就是能够快速化的生产。我们现在这个产能,年产能在今年能达到5个亿是没有问题的。还有一个前提,我们因为是打一针,5亿剂相当于是5亿人的接种,不是2.5亿人的接种,这是另外一个概念。

  疫苗是防治传染病的重要科技手段,比如新冠疫苗就是防控新冠病毒最主要的一种科技手段。对于我们研发疫苗的人来说,疫苗最大的作用就是防止重症,这在理论上叫无重症、无死亡。所以如果一款疫苗能够减少重症的发病率,就能减少死亡率,我个人觉得这是一个最关键的数据。我们在巴基斯坦做了18000多人的临床研究,重症保护率能够达到全部保护,也就是说重症都是出现在安慰剂组,疫苗组一个都没有。在全球更大范围的临床研究中,我们的重症保护率能达到90%以上,我觉得这是特别可喜的数据。我想从生命至上的理念来说,疫苗第一个要关注的就是对重症的阻断,或者是能够更少的人得重症,第二个才是它在减少感染方面的作用。


  Q:疫苗附条件上市的时候,它的有效率是多少?

  陈薇:疫苗是最关键的数据,所以看你在这个重症保护率上的数据,这是第一点要关注的。现在我们在巴基斯坦重症保护率能达到全部保护,巴基斯坦我们做了一万八千多人(的观察),在所有人里面我们重症保护率能达到90%以上,这是可喜的一个数据。

  到现在为止,我们接种的人群包括一种极端环境下的人群,没有发现跟疫苗相关的严重不良反应,也没有发现跟其他疫苗有不一样的特别特殊的不良反应。

  Q:疫苗的安全性如何?

  陈薇:到现在为止,我们接种的人群包括一种极端环境下的人群,没有发现跟疫苗相关的严重不良反应,也没有发现跟其他疫苗有不一样的特别特殊的不良反应。

  打完一针疫苗6个月后再打一针增强型,可以有10倍、20倍免疫反应的增高。

  Q:作为第一个接种者,当时接种是冒险还是自信?

  中国工程院院士 陈薇:两种情况应该都有。铱关于自信。我们的腺病毒载体疫苗对很多人来说会觉得比较新,但对于我们来说却是个成熟的技术平台。因为2014年我们用这样的平台做成过埃博拉疫苗,而且一直在用,对此我有自信。而关于冒险。2月29日,当时武汉在封城状态,大家会有比较多对病毒蔓延的惧怕情绪。而践行临床,如果连我自己都不敢用的话,怎么能招聘到志愿者来进行我们正规的科学临床研究?所以我当时带领团队的人接种了这一针,既积累了前期的安全性数据,也给半个多月以后参加全球第一个新冠疫苗临床研究的志愿者们勇气。 

  2月29日凌晨4点多疫苗才到武汉,早上9点多我们在党旗下接种了疫苗,在这个过程中,我们签了知情同意书,包括比较规范的临床记录表等等。我记得特别清楚地是,当天下午,春兰副总理还来到我们的科研基地,晚上我们在忙关于核酸检测,应收尽收的工作,那一天非常非常忙,我几乎把疫苗接种这件事情忘了。另外有一个比较特别的例子,就是同一天跟我一起接种的一位博士叫迟象阳,她在一周前做了母亲,母子都平安健康。这也是一个相对个体的数据在支撑和反应疫苗的接种情况。


  Q:国内首个单针接种的新冠疫苗附条件上市后,还有哪些后续工作?

  中国工程院院士 陈薇:附条件上市,对疫苗研发来说是一个阶段性成果的体现。这款疫苗涉及近5万人的临床试验,并不是随机入组。比如在某个年龄段,男女性别的配比,年龄段的配比,包括身体条件的配比,这些人都是具有一定代表性的。但是一旦扩大使用范围以后,个体之间都有差异,每个人所处的环境,甚至情绪各方面都会有所不同。所以附条件上市以后,还要继续跟踪疫苗接种的一系列问题。包括为什么叫附条件,其实是留下很多"作业",尤其是对于疫苗的全程观察,特别是安全性的观察,我们不能掉以轻心,这个现在是首要的。所以,在国家对于安全性不良反应数据收集的同时,我们也会针对性做一些更细致的安全性观察。 

  Q:陈薇团队所研发的疫苗的有效性如何?

  陈薇:到目前为止6个月的数据是有的,是支撑可以做6个月的,6个月期间你可以不用接种。如果6个月以后疫情还没有结束怎么办,我们也做了6个月以后的加强,发现加强以后再打一针,可以有10倍、20倍的免疫反应的增高。

  去年4月12日,在武汉二期临床已经放开了年龄上限,当时最年长的志愿者84岁,成功产生新冠抗体。

  Q:陈薇团队所研发的疫苗是否有可能更快地普及整个人群?

  陈薇:其实在2020年4月12日我们在全球第一个上二期临床的时候,就放开了年龄的上限。当时最年长的志愿者是熊先生,他是84岁,因为我是随机双盲的,后来揭盲的时候他的抗体是阳性,给大家很大的信心。6到18岁的临床我们已经做完了,现在还没批准6到18岁,但是数据做完了,6到18岁的安全性数据我们是有的。

  中国疫苗研发在世界上位于第一方阵,毋庸置疑。

  Q:从世界的角度来看,我们现在疫苗研发到底达到了怎样的水准?

  陈薇:第一方阵,毋庸置疑,这是没有几个国家能做到的。所以,刚才说了既不夜郎自大,也绝不妄自菲薄,学习别人更多的长处,做更好、更安全的疫苗,但是在这过程中我们一定要有自信。

原文转载:http://tech.shaoqun.com/a/357767.html

跨境电商:https://www.ikjzd.com/

灰色清关:https://www.ikjzd.com/w/1409

imgur:https://www.ikjzd.com/w/156


我国首个腺病毒载体新冠疫苗25日获批附条件上市,这也是全球第一个进入临床的新冠疫苗,历时一年多的研发。疫苗的安全性怎么样?公众又该如何选择?白岩松新媒体直播节目《白·问》第二期,对话中国工程院院士陈薇,就研发疫苗过程等问题进行分析解答。  单针接种新冠疫苗年产能或达5亿。  Q:国内首个单针接种的新冠疫苗什么时候可以接种?  中国工程院院士陈薇:其实我们的疫苗在去年6月份已经被批准应急使
徐家骏:https://www.ikjzd.com/w/1803
首信易:https://www.ikjzd.com/w/1841
tradekey:https://www.ikjzd.com/w/1630
备战2016!快速启动亚马逊:https://www.kjyunke.com/courses/62
真提气!国内多家企业下发关于声援华为的通知,福州中院判定iPhone在中国禁售 :https://www.ikjzd.com/home/12961
亚马逊无货源真的能玩吗?深度详解:https://www.ikjzd.com/home/18016

直播电商数据分析,薇娅李佳琦“一坑难求”,2021年做直播带货,还来得及吗?

直播电商数据分析,薇娅李佳琦"一坑难求",2021年做直播带货,还来得及吗?

短视频、直播数据实时监测采集接口,请查看文档: TiToData

免责声明:本文档仅供学习与参考,请勿用于非法用途!否则一切后果自负。

回顾2020年,电商直播是一个绕不开的词。
 
距商务部统计,仅2020年前11个月,全国就有超过2千万场电商直播。明星、总裁、政府官员,各界斜杠主播纷纷开始带货。房子、车子、黄金、火箭,直播间内的货品池也越发突破想象。
 
全民带货、万物可播的风潮下,行业经历了迅猛成长和快速变化。
 
罗振宇在2021跨年演讲中提到,"线上世界的残酷只有线上世界的人懂"。从野蛮生长到加速淘汰、步入正轨,电商直播行业在刚刚过去的一年中发生了哪些事?到底什么样的品牌和商家才适合做直播?未来,又有哪些新兴赛道有机会借由直播爆发?
 
基于各平台消费数据,结合针对品牌、机构和专家的调研,CBNData发布《2020电商直播生态报告》,回溯2020年的直播战场,并对2021年的行业风向做出预判。

2020电商直播行业回顾:
红人出圈、新玩家入局、直播成电商重要渠道
疫情出现反复的当下,去年此时全民宅家的情景还历历在目。2020年初,移动互联网迎来存量时代后的首次高速增长,电商直播行业的用户数量和市场规模全面爆发。
 
以抖音、快手为代表的内容平台,以微信为代表的社交平台纷纷入局,引起各圈层消费者的关注,资本和供应链也向直播行业聚拢,电商直播产业链迅速建立。
 
image.png

图片来源:CBNData《2020电商直播生态报告》
 
2020年下半年,电商直播已成为重要、常规的电商渠道。
根据ECdataway数据威的数据,直播在电商渠道中的重要度尤以美容护理、服装鞋包、珠宝/首饰三大类目为甚。在这三个行业中,直播引导消费金额在大盘整体消费金额中的比例达到整体平均值的2倍。

image.png

图片来源:CBNData《2020电商直播生态报告》
 
电商直播创造的互动式消费场景,提升了购买效率,也提升了消费者的购物体验。直播消费者从追求低价逐渐过渡为追求品质。报告显示,2020年淘宝直播客单价不断提升,服装、美妆、珠宝等直播体量更大的类目涨幅更高。

image.png

图片来源:CBNData《2020电商直播生态报告》

2020年,人社部对带货主播这一职业给出新定义:互联网营销师。带货主播作为新型职业被官方认可的同时,也对从业人员的专业水准提出了新的要求。
 
首先,直播平台业态更开放,为中小主播也带来了前景和机会。报告显示,在淘宝直播、抖音、快手三大平台,肩部主播、腰部主播逐渐成为中坚力量。三农主播、银发主播等小众主播也能发挥强劲带货力。
 
image.png

图片来源:CBNData《2020电商直播生态报告》
 
其次,位于第一梯队的主播逐渐向全品类、全链路发展。薇娅背后的谦寻,衣哥背后的星诚传媒,罗永浩背后的交个朋友,雪梨背后的宸帆,建立直播基地或孵化主播/品牌矩阵,以提升直播业务规模,加强供应链能力。

各行各业跨界主播的加入,也为烈火烹油的电商直播行业更添一分热度。

从疫情期间为地方特产代言的政府官员,到亲身上阵的企业家和总裁,明星和短视频达人,用财经作家吴晓波的话来说,"2020年,不做直播,等于白过。"
 
千万粉丝量级的短视频达人如大狼狗郑建鹏与言真夫妇、衣哥等,凭借短视频中成功的人设打造,吸引到了精准的粉丝群体和品牌方的注意,利用品牌专场直播的形式,一跃进入头部带货主播行列。近期,大狼狗夫妇的LG专场直播销售额突破3亿,成功打破抖音记录。

image.png

图片来源:抖音电商商家助手

以往"高不可攀"的总裁纷纷从幕后走到台前,亲身上阵直播卖货,也成为2020年电商直播的一抹亮色。

有些总裁是在年初疫情期间入局,有些总裁则开启了常态化直播,其中,董明珠和梁建章更是开启全国巡回直播,为各自所在的企业和行业提振信心。
image.png

图片来源:CBNData《2020电商直播生态报告》

但要论跨界主播中最吸引眼球的,无疑还是明星。

2020年,红人和明星的壁垒逐渐消融,超头部主播李佳琦、薇娅频上热搜,获得综艺影视邀约,而明星进入直播间,也成为了常规的宣传手段。报告显示,仅在薇娅直播间,每个月至少就有7场直播有明星嘉宾坐客。
 
这种"明星X主播"的模式展现出了十足的吸金力。还是以薇娅直播间为例,报告显示,其有明星嘉宾坐镇的直播场次,场均带货金额约为平时的1.3倍。

image.png

图片来源:CBNData《2020电商直播生态报告》

不少明星也开始将直播带货当作正式副业,并发展出了不同模式。尽管部分明星直播翻车、刷单等负面事件曾在2020年引起了广泛讨论,但从长远来看,明星入局直播可以达到双赢的效果。
 
交个朋友科技创始人黄贺曾对CBNData消费站表示,明星稳定直播可以吸引更多粉丝和潜在关注者,也能塑造自身可信赖的形象。

以交个朋友为代表的MCN机构,以聚划算为代表的平台,都在发力建设明星主播矩阵,为明星提供选品和供应链服务,明星则为机构和平台吸引来更多关注度。聚划算直播明星矩阵已经集齐刘涛、景甜、闫学晶、肖央等明星,其中,刘涛在2020年屡屡创造单场破亿的带货记录,成为明星主播中的佼佼者。

image.png

图片来源:CBNData《2020电商直播生态报告》

电商直播场域拓展
细分赛道涌现新机会
根据淘宝直播数据,近90%淘系一级类目均已涉足直播。广阔的货品池内,只有更高品质、更具性价比、更细分的产品,才能突出重围。
 
以留香珠、洗衣凝珠、DHA/核桃油以及猫/狗保健品为例,这四个脱胎于日用、母婴、宠物行业的新兴品类,通过电商直播找到了新的增长点。
 
image.png

图片来源:CBNData《2020电商直播生态报告》
 
在CBNData针对品牌的调研中,小众品牌通过直播崛起的案例也不在少数。
 
2020天猫双11,挪威保健品牌Noromega的第一波预售成交额就超过了去年整个双11大促的总和。值得一提的是,Noromega在2019、2020天猫双11均是海豹油类目第一的品牌。2020年,Noromega通过"店铺自播+外部红人"的双重直播打法,触达新兴消费人群,完成大幅增长。

image.png
 
复旦大学管理学院市场营销系副教授肖莉提到,品牌建设的过程是从品牌认知、品牌联想、品牌感知,最后到品牌共鸣的逐渐升华的过程。电商平台上,传统图文形式展示商品的信息有限,对新品牌来说,直播是消费者教育和品牌沟通非常好的渠道。

直播流量红利也向更高门槛的行业打开大门。

2020年,以支付宝为代表的平台,以招商银行为代表的金融机构纷纷开启财经直播,在专业的财经MCN如CBNData的助力下,触达更广泛的投资群体。

image.png

图片来源:CBNData《2020电商直播生态报告》
 
具体到商品品类上,报告提出了电商直播的三大潜力市场:本地生活、他消费和银发族。从消费者端来说,男性用户和银发族群体的增长潜力还有待挖掘。而从商家端来说,主打本地生活产品的新零售直播或将成为电商直播的一大增长空间。
 
2020天猫双11吸引超200万实体商家参与,新零售智库曾提出,"直播+线下=90%新增量",随着直播向线下消费场景进一步渗透,本地生活市场未来可期。

image.png

图片来源:CBNData《2020电商直播生态报告》
 
2021电商直播5大趋势预测
 
基于对2020年电商直播消费数据的回顾,加上针对品牌、机构、学者的调研,业内各方普遍认为,电商直播将长期向好并在稳定中继续发展,报告对行业未来趋势提出了如下5点预测:

品牌直播公式:从"X+直播"到"直播+X"
**
无论是在营销端还是销售端,未来,电商直播将继续赋能品牌。
 
店铺自播+红人直播的双轮驱动模式被广泛运用后,以微信为首的社交平台、以淘宝为首的电商平台也开始布局私域运营手段,帮助商家更好地圈住品牌粉丝,提升粉丝忠诚度和复购率。

全平台自播+红人直播+私域沉淀,将成为电商直播时代品牌的标配运营手段。
 
品牌追求长效ROI模式
**
当直播大盘整体走高、直播成为品牌必备的运营手段时,直播的长效价值就超出了即时的转化数据。从品牌端来说,一味追求单场直播转化效果的短效ROI模式,将在未来转变为拆解店铺流量结构、提升直播长尾效应的长效ROI模式。
**
直播间流量溢出,"播品牌"加速涌现

随着供应链效率和直播间流量的自然溢出,直播带"货"自然转变为直播带"品牌",未来,无论新老品牌,都能从直播间内找到新的增长点。

直播"出海"红利期即将到来

2020年末,TikTok与沃尔玛的一场合作拉开了海外直播带货的序幕。海外社交媒体电商化、电商媒体社交化,已成大势所趋,但无论是平台建设、货品生态还是主播专业度上,海外直播带货行业仍处于初级阶段,"出海"潜力值得挖掘。

监管越发完善,推动业态良性发展

2020年末尾,辛巴的"假燕窝"事件为电商直播行业蒙上一层阴影,假货、刷单、虚假宣传等乱象背后,是行业在监管未及的情况下高速发展带来的龃龉。
 
以罗永浩为例,头部主播受到更大关注,也应该更积极发挥示范作用。罗永浩直播间一款"假羊毛衫"被发现后,交个朋友给予三倍赔付,并成立质控实验室、与第三方专业检测机构合作,完善直播间商品质量管控体系。
 
国家各部门多措并举,各直播平台也及时作出响应,一齐推动业态良性、健康发展。









原文转载:http://www.shaoqun.com/a/591581.html

跨境电商:https://www.ikjzd.com/

雨果:https://www.ikjzd.com/w/1307

海维:https://www.ikjzd.com/w/1891


直播电商数据分析,薇娅李佳琦"一坑难求",2021年做直播带货,还来得及吗?短视频、直播数据实时监测采集接口,请查看文档:TiToData免责声明:本文档仅供学习与参考,请勿用于非法用途!否则一切后果自负。回顾2020年,电商直播是一个绕不开的词。距商务部统计,仅2020年前11个月,全国就有超过2千万场电商直播。明星、总裁、政府官员,各界斜杠主播纷纷开始带货。房子、车子、黄金、火箭,直播间内的货
自贸区跨境通网站:https://www.ikjzd.com/w/1329
巴克莱:https://www.ikjzd.com/w/2775
rfq:https://www.ikjzd.com/w/251
让人又爱又恨亚马逊卖家的"黑帽玩法"是如何另辟蹊径的?:https://www.ikjzd.com/home/118206
寂寞少妇口述:分居寂寞难耐我移情已婚同学:http://lady.shaoqun.com/m/a/70308.html
贝佐斯前妻承诺捐出一半以上财产超180亿美元!:https://www.ikjzd.com/home/96462

Java | zuul 1.x 是如何实现请求转发的

zuul 1.x 是如何实现请求转发的

文档写的再好,也不如源码写的好
源码地址:
GitHub: https://github.com/Netflix/zuul
Gitee: https://gitee.com/github_mirror_plus/zuul


目录
  • 简介
  • 实现逻辑
  • 源码
    • 基于 Servlet 的请求转发
    • ZuulServlet 核心代码
    • ZuulRunner 核心代码
    • RequestContext 核心代码
    • FilterProcessor 核心代码
    • 在官方示例中,提供了两个简单的 Route 的 ZuulFilter 实现
  • 总结
  • 参考


简介

官方简介,其实你要看这篇,说明你知道 zuul

Zuul is an edge service that provides dynamic routing, monitoring, resiliency, security, and more. Please view the wiki for usage, information, HOWTO, etc https://github.com/Netflix/zuul/wiki

Here are some links to help you learn more about the Zuul Project. Feel free to PR to add any other info, presentations, etc.

实现逻辑

上一篇文章 Go | Go 结合 Consul 实现动态反向代理 里面简单的实现了一个反向代理,并简述了一下步骤,这里复述一下

根据代理的描述一共分成几个步骤:

  1. 代理接收到客户端的请求,复制了原来的请求对象
  2. 根据一些规则,修改新请求的请求指向
  3. 把新请求发送到根据服务器端,并接收到服务器端返回的响应
  4. 将上一步的响应根据需求处理一下,然后返回给客户端

源码

注意:这里的源码指的是 1.x 分支的代码

基于 Servlet 的请求转发

在一开始学习 Java Web 时,Servlet 是一个绕不过去的坎,zuul 也是基于 Servlet 实现的,在源码

<?

在这里需要重点关注下 com.netflix.zuul.http.ZuulServlet 和 com.netflix.zuul.context.ContextLifecycleFilter

ZuulServlet 核心代码

代码在 com.netflix.zuul.http.ZuulServlet

下面的代码中省略了一部分,在这个过程中主要做了以下几件事

  1. 将 将原始的 Request,Response 保存在 ThreadLocal 中,方便以后处理。因为 Tomcat 等 Servlet 容器默认使用了一个请求一个线程处理的方式,所以存在 ThreadLocal 即可在以后的处理流程中方便处理
  2. 执行前置过滤器 preRoute()
  3. 执行转发中过滤器 route()
  4. 执行后置过滤器 postRoute()

其中转发的关键就在 route() 方法

public class ZuulServlet extends HttpServlet { private ZuulRunner zuulRunner; @Override public void service(javax.servlet.ServletRequest servletRequest, javax.servlet.ServletResponse servletResponse) throws ServletException, IOException {  try {   // 这一步是将原始的 Request,Response 保存在 ThreadLocal 中   init((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse);   RequestContext context = RequestContext.getCurrentContext();   context.setZuulEngineRan();   try {    // 前置处理    preRoute();   } catch (ZuulException e) {    error(e);    postRoute();    return;   }   try {    // 转发中处理    route();   } catch (ZuulException e) {    error(e);    postRoute();    return;   }   try {    // 后置处理    postRoute();   } catch (ZuulException e) {    // 异常处理    error(e);    return;   }  } catch (Throwable e) {   error(new ZuulException(e, 500, "UNHANDLED_EXCEPTION_" + e.getClass().getName()));  } finally {   RequestContext.getCurrentContext().unset();  } } void postRoute() throws ZuulException {  zuulRunner.postRoute(); } void route() throws ZuulException {  zuulRunner.route(); } void preRoute() throws ZuulException {  zuulRunner.preRoute(); } void init(HttpServletRequest servletRequest, HttpServletResponse servletResponse) {  zuulRunner.init(servletRequest, servletResponse); } void error(ZuulException e) {  RequestContext.getCurrentContext().setThrowable(e);  zuulRunner.error(); }}

ZuulRunner 核心代码

从上面的代码可以看出转发的关键在于 ZuulServlet#route(), 而 ZuulServlet#route() 在于 zuulRunner.route()

ZuulRunner 主要功能

  1. init 将 Request 和 Response 保存到 RequestContext.getCurrentContext(), 这里面就是上面提到的 ThreadLocal 的处理类
  2. 调用下 FilterProcessor.getInstance().route()
public class ZuulRunner { private boolean bufferRequests; public ZuulRunner() {  this.bufferRequests = true; } public ZuulRunner(boolean bufferRequests) {  this.bufferRequests = bufferRequests; } public void init(HttpServletRequest servletRequest, HttpServletResponse servletResponse) {  RequestContext ctx = RequestContext.getCurrentContext();  if (bufferRequests) {   ctx.setRequest(new HttpServletRequestWrapper(servletRequest));  } else {   ctx.setRequest(servletRequest);  }  ctx.setResponse(new HttpServletResponseWrapper(servletResponse)); } public void route() throws ZuulException {  FilterProcessor.getInstance().route(); }}

RequestContext 核心代码

主要是 ThreadLocal 和 copy

public class RequestContext extends ConcurrentHashMap<String, Object> { private static final Logger LOG = LoggerFactory.getLogger(RequestContext.class); protected static Class<? extends RequestContext> contextClass = RequestContext.class; private static RequestContext testContext = null; protected static final ThreadLocal<? extends RequestContext> threadLocal = new ThreadLocal<RequestContext>() {  @Override  protected RequestContext initialValue() {   try {    return contextClass.newInstance();   } catch (Throwable e) {    throw new RuntimeException(e);   }  } }; /**  * sets the "responseBody" value as a String. This is the response sent back to the client.  *  * @param body  */ public void setResponseBody(String body) {  set("responseBody", body); } /**  * Use this instead of response.setStatusCode()  *  * @param nStatusCode  */ public void setResponseStatusCode(int nStatusCode) {  getResponse().setStatus(nStatusCode);  set("responseStatusCode", nStatusCode); } /**  * Mkaes a copy of the RequestContext. This is used for debugging.  *  * @return  */ public RequestContext copy() {  RequestContext copy = new RequestContext();  // 这里省略了一部分代码,意思就是把原来的 request 深度复制一份  return copy; }}

FilterProcessor 核心代码

主要逻辑就是找到对应 type 的 List<ZuulFilter> 并执行 runFilter()

public class FilterProcessor { static FilterProcessor INSTANCE = new FilterProcessor(); /**  * @return the singleton FilterProcessor  */ public static FilterProcessor getInstance() {  return INSTANCE; } /**  * Runs all "route" filters. These filters route calls to an origin.  *  * @throws ZuulException if an exception occurs.  */ public void route() throws ZuulException {  try {   runFilters("route");  } catch (ZuulException e) {   throw e;  } catch (Throwable e) {   throw new ZuulException(e, 500, "UNCAUGHT_EXCEPTION_IN_ROUTE_FILTER_" + e.getClass().getName());  } } /**  * runs all filters of the filterType sType/ Use this method within filters to run custom filters by type  *  * @param sType the filterType.  * @return  * @throws Throwable throws up an arbitrary exception  */ public Object runFilters(String sType) throws Throwable {  if (RequestContext.getCurrentContext().debugRouting()) {   Debug.addRoutingDebug("Invoking {" + sType + "} type filters");  }  boolean bResult = false;  List<ZuulFilter> list = FilterLoader.getInstance().getFiltersByType(sType);  if (list != null) {   for (int i = 0; i < list.size(); i++) {    ZuulFilter zuulFilter = list.get(i);    Object result = processZuulFilter(zuulFilter);    if (result != null && result instanceof Boolean) {     bResult |= ((Boolean) result);    }   }  }  return bResult; } /**  * Processes an individual ZuulFilter. This method adds Debug information. Any uncaught Thowables are caught by this method and converted to a ZuulException with a 500 status code.  *  * @param filter  * @return the return value for that filter  * @throws ZuulException  */ public Object processZuulFilter(ZuulFilter filter) throws ZuulException {  RequestContext ctx = RequestContext.getCurrentContext();  boolean bDebug = ctx.debugRouting();  final String metricPrefix = "zuul.filter-";  long execTime = 0;  String filterName = "";  try {   long ltime = System.currentTimeMillis();   filterName = filter.getClass().getSimpleName();      RequestContext copy = null;   Object o = null;   Throwable t = null;   if (bDebug) {    Debug.addRoutingDebug("Filter " + filter.filterType() + " " + filter.filterOrder() + " " + filterName);    copy = ctx.copy();   }      ZuulFilterResult result = filter.runFilter();   ExecutionStatus s = result.getStatus();   execTime = System.currentTimeMillis() - ltime;   switch (s) {    case FAILED:     t = result.getException();     ctx.addFilterExecutionSummary(filterName, ExecutionStatus.FAILED.name(), execTime);     break;    case SUCCESS:     o = result.getResult();     ctx.addFilterExecutionSummary(filterName, ExecutionStatus.SUCCESS.name(), execTime);     if (bDebug) {      Debug.addRoutingDebug("Filter {" + filterName + " TYPE:" + filter.filterType() + " ORDER:" + filter.filterOrder() + "} Execution time = " + execTime + "ms");      Debug.compareContextState(filterName, copy);     }     break;    default:     break;   }      if (t != null) throw t;   usageNotifier.notify(filter, s);   return o;  } catch (Throwable e) {   if (bDebug) {    Debug.addRoutingDebug("Running Filter failed " + filterName + " type:" + filter.filterType() + " order:" + filter.filterOrder() + " " + e.getMessage());   }   usageNotifier.notify(filter, ExecutionStatus.FAILED);   if (e instanceof ZuulException) {    throw (ZuulException) e;   } else {    ZuulException ex = new ZuulException(e, "Filter threw Exception", 500, filter.filterType() + ":" + filterName);    ctx.addFilterExecutionSummary(filterName, ExecutionStatus.FAILED.name(), execTime);    throw ex;   }  } } /**  * Publishes a counter metric for each filter on each use.  */ public static class BasicFilterUsageNotifier implements FilterUsageNotifier {  private static final String METRIC_PREFIX = "zuul.filter-";  @Override  public void notify(ZuulFilter filter, ExecutionStatus status) {   DynamicCounter.increment(METRIC_PREFIX + filter.getClass().getSimpleName(), "status", status.name(), "filtertype", filter.filterType());  } }}

通过上面的代码中,可以看到得到简单的流程图

zuul

在官方示例中,提供了两个简单的 Route 的 ZuulFilter 实现

SimpleHostRoutingFilter.groovy

在这个示例中,在 Filter 实现中将请求复制并转发到目标服务,这个是简单的逻辑

class SimpleHostRoutingFilter extends ZuulFilter { 	// 声明这个过滤器是 route 类型 @Override String filterType() {  return 'route' } 	// 过滤器的执行逻辑 Object run() {  HttpServletRequest request = RequestContext.getCurrentContext().getRequest();  Header[] headers = buildZuulRequestHeaders(request)  String verb = getVerb(request);  InputStream requestEntity = request.getInputStream();  CloseableHttpClient httpclient = CLIENT.get()  String uri = request.getRequestURI()  if (RequestContext.getCurrentContext().requestURI != null) {   uri = RequestContext.getCurrentContext().requestURI  }  try {   	// 将请求转发到指定服务器   HttpResponse response = forward(httpclient, verb, uri, request, headers, requestEntity)   setResponse(response)  } catch (Exception e) {   throw e;  }  return null } HttpResponse forward(CloseableHttpClient httpclient, String verb, String uri, HttpServletRequest request, Header[] headers, InputStream requestEntity) {  requestEntity = debug(verb, uri, request, headers, requestEntity)  HttpHost httpHost = getHttpHost()  HttpRequest httpRequest;  switch (verb) {   case 'POST':    httpRequest = new HttpPost(uri + getQueryString())    InputStreamEntity entity = new InputStreamEntity(requestEntity, request.getContentLength())    httpRequest.setEntity(entity)    break   case 'PUT':    httpRequest = new HttpPut(uri + getQueryString())    InputStreamEntity entity = new InputStreamEntity(requestEntity, request.getContentLength())    httpRequest.setEntity(entity)    break;   default:    httpRequest = new BasicHttpRequest(verb, uri + getQueryString())  }  try {   httpRequest.setHeaders(headers)   return forwardRequest(httpclient, httpHost, httpRequest)  } finally {   //httpclient.close();  } } HttpResponse forwardRequest(HttpClient httpclient, HttpHost httpHost, HttpRequest httpRequest) {  return httpclient.execute(httpHost, httpRequest); }}

ZuulNFRequest 结合 Netflix 的 route 过滤器

这个示例中,从 HttpClient 转发改为了使用 RibbonCommand 转发,从而使用了 Ribbon 的功能。关于 Ribbon 以后有时间再说

class ZuulNFRequest extends ZuulFilter { @Override String filterType() {  return 'route' } boolean shouldFilter() {  return NFRequestContext.currentContext.getRouteHost() == null && RequestContext.currentContext.sendZuulResponse() } Object run() {  NFRequestContext context = NFRequestContext.currentContext  HttpServletRequest request = context.getRequest();  MultivaluedMap<String, String> headers = buildZuulRequestHeaders(request)  MultivaluedMap<String, String> params = buildZuulRequestQueryParams(request)  Verb verb = getVerb(request);  Object requestEntity = getRequestBody(request)  IClient restClient = ClientFactory.getNamedClient(context.getRouteVIP());  String uri = request.getRequestURI()  if (context.requestURI != null) {   uri = context.requestURI  }  //remove double slashes  uri = uri.replace("//", "/")  HttpResponse response = forward(restClient, verb, uri, headers, params, requestEntity)  setResponse(response)  return response } def HttpResponse forward(RestClient restClient, Verb verb, uri, MultivaluedMap<String, String> headers, MultivaluedMap<String, String> params, InputStream requestEntity) {  debug(restClient, verb, uri, headers, params, requestEntity)//  restClient.apacheHttpClient.params.setVirtualHost(headers.getFirst("host"))  String route = NFRequestContext.getCurrentContext().route  if (route == null) {   String path = RequestContext.currentContext.requestURI   if (path == null) {    path = RequestContext.currentContext.getRequest() getRequestURI()   }   route = "route" //todo get better name  }  route = route.replace("/", "_")  RibbonCommand<AbstractLoadBalancerAwareClient<HttpRequest, HttpResponse>> command = new RibbonCommand<>(restClient, verb, uri, headers, params, requestEntity);  try {   HttpResponse response = command.execute();   return response  } catch (HystrixRuntimeException e) {   if (e?.fallbackException?.cause instanceof ClientException) {    ClientException ex = e.fallbackException.cause as ClientException    throw new ZuulException(ex, "Forwarding error", 500, ex.getErrorType().toString())   }   throw new ZuulException(e, "Forwarding error", 500, e.failureType.toString())  } }}

总结

从 zuul 实现中看,还是基于 Servlet 的,并在过程中加入 前、中、后和异常处理链。因为基于 Servlet 其处理流程是阻塞的,性能会有所下降。

在 zuul 里面采用了 java 和 groovy 混合编程的方式,编程更加灵活。通过自定了一个 GroovyCompiler 来加载指定路径的 groovy 文件来实现在运行中动态添加 ZuulFilter 这种动态机制在一定程度上实现了热更新 ZuulFilter 功能,也是值得学习的。

参考

GitHub: https://github.com/Netflix/zuul

白色兔子公众号图片









原文转载:http://www.shaoqun.com/a/591577.html

跨境电商:https://www.ikjzd.com/

dhl:https://www.ikjzd.com/w/516

国际标准书号:https://www.ikjzd.com/w/174


zuul1.x是如何实现请求转发的文档写的再好,也不如源码写的好源码地址:GitHub:https://github.com/Netflix/zuulGitee:https://gitee.com/github_mirror_plus/zuul目录简介实现逻辑源码基于Servlet的请求转发ZuulServlet核心代码ZuulRunner核心代码RequestContext核心代码FilterP
败欧洲网站:https://www.ikjzd.com/w/1555
浩方:https://www.ikjzd.com/w/1046
亿恩:https://www.ikjzd.com/w/1461
每日资讯:Parler起诉亚马逊停止为其提供网络托管服务系非法行为!亚马逊发布新产品 支持企业个性化直播:https://www.ikjzd.com/home/140401
亚马逊黑五旺季引流成功后,买家该如何提高转化率?:https://www.ikjzd.com/home/111886
口述:上司和我暧昧6年都没碰过我男人上司女人:http://lady.shaoqun.com/m/a/30874.html

男人衰老自查:过了50岁,出现这5大变化,就是老了!

核心提示:都说女人爱美重视自己的容颜渴望青春永驻,其实对于男人也是一样,也担心衰老迹象出现在自己身上。

都说爱美是女人的天性,而心理专家说男人要比女人更加在乎自己的形象更加在乎衰老,一旦出现迹象都想要及时进行调整,本文就来认识一下男人衰老的迹象。

男人衰老常见的征兆:

第一、头发稀疏

人到四十岁的时候身体开始走下坡路,这个时候一个人的事业基本上也有所成就,各方面的压力往往蜂拥而至,有工作中精神方面的压力以及身体衰老方面的压力,总总压力的影响下会出现内分泌失调,而直接受到影响的当属脱发,当发现自己脑袋上的头发不太浓密之后就需要从生活中调剂起来,尽量采取措施延缓衰老。

第二、听力下降

年龄慢慢大了,耳朵就开始变得不好使,除了先天性的因素之外助听器的主要销售对象是年纪大的人群,一个人一旦到了年龄身体就开始走下坡路,而现在人们打电话听音乐都少不了耳机的帮助,慢慢的对听力有极大透支消耗,让人的听力提前进入衰退期,因此听力下降也是现在男性常见的衰老征兆。

第三、心肺能力下降

随着年两的增长,人的精力就越来越弱,没有以前旺盛,随便做点什么就气喘吁吁的。这是因为心肺功能下降导致的,身体内氧气的交换效率下降导致的。现在的上班族长时间在办公室坐着,身体缺乏锻炼会加快心肺的衰老速度,更容易出现心肺功能下降的现象。

第四、牙齿变长

一个人上了年纪牙齿就会变得越来越长,这是人体衰老的征兆之一,之所以会出现这种现象是因为随着年龄的增大牙床开始萎缩,这样就会增加牙根部位裸露的面积,从视觉上会看到牙齿边长,一旦出现这种现象也是人体衰老的一个症状。

第五、尿无力

前列腺是反应男人健康的直接表现,也被认为是男性衰老的起点,一旦身体进入衰老阶段之后,小便开始变得细长无力,这也是男人最不愿意看到的现象。

一旦身体开始出现上述症状就要引起重视,这是人体走向衰老的征兆之一,这个时候一定要好好保养才可以达到延缓衰老的效果。

男人延缓衰老需要从以下事情开始:

1、戒烟戒酒

人上了岁数之后烟酒就都远离吧,有相关研究发现,抽烟者的外貌要比不抽烟人群老至少五岁,抽烟会伤害肝脏影响排毒,会表现在面部,而喝酒会伤害肝脏还会促进人体吸收毒素,也会影响年轻态。

2、健康饮食


生活中有一些饮食可以帮助延缓衰老,一些粗粮以及膳食纤维含量比较多的食物都可以达到这样的效果,此外还要少接触糖跟盐,也会加速衰老。

3、户外运动

人到一定年龄之后可以多参加户外运动,不仅可以锻炼自己,还可以跟人沟通,不管是在增强身体抵抗力还是释放压力方面都有很大的效果。


原文转载:http://health.shaoqun.com/a/186066.html

跨境电商:https://www.ikjzd.com/

易联通:https://www.ikjzd.com/w/1854.html

reverb:https://www.ikjzd.com/w/1273


核心提示:都说女人爱美重视自己的容颜渴望青春永驻,其实对于男人也是一样,也担心衰老迹象出现在自己身上。 都说爱美是女人的天性,而心理专家说男人要比女人更加在乎自己的形象更加在乎衰老,一旦出现迹象都想要及时进行调整,本文就来认识一下男人衰老的迹象。男人衰老常见的征兆:第一、头发稀疏人到四十岁的时候身体开始走下坡路,这个时候一个人的事业基本上也有所成就,各方面的压力往往蜂拥而至,有工作中精神方面的压力
usps国际快递查询:https://www.ikjzd.com/w/513
writer:https://www.ikjzd.com/w/1280
急速:https://www.ikjzd.com/w/1861
来了!亚马逊瑞典站掘金通道正式开启!全球更广生意等你来!:https://www.ikjzd.com/home/132455
口述实录:我和小姨子背后之间的哪些肮脏事情:http://lady.shaoqun.com/m/a/74934.html
东南亚电商Shopee 双十一大促开幕:国货拓宽跨境赛道:https://www.ikjzd.com/home/132200

科学家很困惑宇宙有多大?有第九颗行星吗?反物质是如何出现的?

人类正在积极地研讨和探究太空,尽管每一天都有新发现,但总会呈现新的疑团,这科学家们疑惑不解。因此,咱们会问:探究太空是否应该持续?毕竟,有太多的东西变得越来越不可理解,而且咱们也不清楚该怎么处理它们。

宇宙有多大?有第九颗行星吗?反物质是如何出现的?科学家很困惑

 

1.宇宙的大小

 

我们知道,在太阳系中,有八颗行星围绕着太阳旋转,这便是一个恒星系统。但别忘了,在银河系中至少有2000-4000亿个这样的星系。此外,星系本身也是如此,乃至更多。这便是我们所看到的。那么宇宙有界限吗?相信宇宙是无限的,这有点困难,因为人类的思想难以承受。

宇宙有多大?有第九颗行星吗?反物质是如何出现的?科学家很困惑

来自牛津大学的科学家们以为,宇宙的实际体积要比咱们所以为的大250倍。如果真是这样的话,那么星系的数量将是如此之多,以至于咱们难以去统计这一数值。所以,关于恒星的数量,你以为有多少呢?

 

2.第9颗行星

 

数年来,天文学家一向假设有第九颗行星存在。当冥王星被掠夺了行星地位时,咱们的太阳系就变成了八颗行星。柯伊伯带和奥尔特云团的“行为”好像证实了这一假说。但咱们并没有真正看到第九颗行星。只要一个假设,着重这颗行星比地球重2-3倍。

宇宙有多大?有第九颗行星吗?反物质是如何出现的?科学家很困惑

唯一的借口是:咱们的望远镜不允许咱们探测到一个如此暗淡的物体。而且,最有或许的是,它离太阳很远,乃至超过了冥王星离太阳的距离。

 

3.黑洞

 

从理论上,咱们证明了黑洞的存在。并且在本年咱们甚至还拍照到了在附近星系中一个黑洞暗影的第一张相片。但是,关于黑洞,问题也不少。例如,现在咱们还不清楚它到底是什么?它们是如何构成的(星系中心的超大质量黑洞)?以及它们内部的物质发生了什么变化呢?

宇宙有多大?有第九颗行星吗?反物质是如何出现的?科学家很困惑

虽然我们有各式各样的主意(如关于平行世界、虫孔、奇点),但这只适合于科幻电影,目前还不适合科学知识。

 

4. 反物质

 

物质的对立面是反物质。它们具有相同的性质,但电荷相反。据信,反物质形成于世界诞生之时,并在与普通物质的接触中湮灭。事实证明,这种物质还有一些残余物并没有消失,所以它们现在位于世界中的某个当地。

宇宙有多大?有第九颗行星吗?反物质是如何出现的?科学家很困惑

此外,科学家已了解了创造反物质的机制,但要创造出1克的反物质,则需求动用一切人类的力量和财力。截至目前为止,咱们并不是彻底清楚,反物质是如何呈现的?为什么需求它?为什么它们没有彻底消失?

 

5.多元宇宙

 

一些现代物理理论认为,咱们的世界并不是唯一的,因此,有人就提出了多元世界的假说。然而,不管是平行世界,仍是多元世界,等等,科学家们都没有达到一致。

宇宙有多大?有第九颗行星吗?反物质是如何出现的?科学家很困惑

退一万步讲,就算他们达成了共识,咱们也无法去验证这一切。咱们无法去“拥抱”咱们的宇宙,更不用说,去尝试了解其他世界了,由于这已超过了咱们所了解的范围,这是虚构的。

当然,关于世界,咱们还有许多问题有待处理。例如,什么是暗物质、暗能量、世界膨胀和大爆炸。



原文转载:http://tech.shaoqun.com/a/355773.html

跨境电商:https://www.ikjzd.com/

败欧洲运费:https://www.ikjzd.com/w/1555

promotion:https://www.ikjzd.com/w/127


人类正在积极地研讨和探究太空,尽管每一天都有新发现,但总会呈现新的疑团,这科学家们疑惑不解。因此,咱们会问:探究太空是否应该持续?毕竟,有太多的东西变得越来越不可理解,而且咱们也不清楚该怎么处理它们。1.宇宙的大小我们知道,在太阳系中,有八颗行星围绕着太阳旋转,这便是一个恒星系统。但别忘了,在银河系中至少有2000-4000亿个这样的星系。此外,星系本身也是如此,乃至更多。这便是我们所看到的。那么
airwallex:https://www.ikjzd.com/w/1011
邓白氏集团:https://www.ikjzd.com/w/582
worldfirst:https://www.ikjzd.com/w/289
润步贸易:https://www.ikjzd.com/w/2067
亚马逊封店预警!三大危险侵权品牌来了,赶紧下架它们!:https://www.ikjzd.com/home/117659
口述:老婆让我和小三试婚一年试婚老婆儿子:http://lady.shaoqun.com/m/a/29818.html

2021-02-26

数万listing被删!亚马逊这2大类目出大事了……

继收保险费后,亚马逊又搞事了。

灯类产品被查,Light品名不能用了?

今日,一则灯类产品被美国FDA扣查的通知在卖家群中疯传,引起了轩然大波。

通知要求立即停止使用LED、Light、Flashlight或各种有"Light"字的品名,因为美国FDA部门门现在在疯狂扣查所有中国进口的灯类产品。

到底是真是假呢?小知咨询了几位货代,都说最近这段时间FDA确实在查灯具产品,手上有整柜和散货都遇到了查验,不过还没有出现扣货的现象。

看来消息是真的了,可FDA不是食品、药品监督局吗,怎么会查灯呢?

其实,早在前两年,就传LED灯将被纳入FDA监管范围,如今看来是实锤了,

Statista的数据显示,中国是LED灯的较大出口国之一,而美国是中国最大的出口市场,亚马逊上中国灯类卖家不少。

现在出了这事,各位售卖相关产品的卖家最好提前准备好齐全的资料,比如灯具物品所有方位照片、物品包装上的产品简介贴纸等,以备不时之需。

无独有偶,除了灯类产品外,玩具类产品也出事了。

数万listing被删,亚马逊清洗玩具类目?

这两日,多位玩具类目卖家发现,亚马逊正在删减Toys & Games(玩具&游戏)类目下的listing,甚至会出现页面加载错误的情况,且bug久未修复,卖家直接崩溃!

有位卖家反映到,数以万计的listing已经被删除,而且平台清洗该类目listing的行动还在继续!

卖家们纷纷感叹:"玩具卖家的日子好像走到头了,亚马逊甚至审查自营店的产品"。近来一系列误导性的政策盘旋在这些无法重新流向实体市场的玩具头上,对于整个市场来说是毁灭性的打击。

还有卖家表示自家店铺已经有超过900个listing被亚马逊下架或禁售,平台给出的原因包括:没有详情描述,侵犯专利或外观设计以及具有安全隐患。

但令人匪夷所思的是,这些玩具明明是大型玩具品牌出品,正规厂家生产,完全不具备违规的要件。

也有卖家表示,这是平台打击假冒伪劣产品的无奈之举,他们正在考虑移除整个listing。

目前,删除仍在继续,尚不清楚是亚马逊有意清洗还是后台bug。

2021想要快速爆单?

多账号运营还是很有必要的。

如何快速的注册亚马逊店铺呢?

这里有极速通道

3天快速下店铺

👇👇👇

👆立即扫码免费咨询👆

(原创:跨境知道网 小知)


文章来源:https://www.ikjzd.com/home/142678

跨境电商:https://www.ikjzd.com/

拍拍:https://www.ikjzd.com/w/2205

盘古集团:https://www.ikjzd.com/w/1448

rakuten:https://www.ikjzd.com/w/2718

数万listing被删!亚马逊这2大类目出大事了……

继收保险费后,亚马逊又搞事了。

印度成为”世界最年轻国家“,这些潮流趋势成为新风向

根据人口统计数据,印度拥有8亿处于35岁以下的人口,占国家人口总数的65%,而整个国家的平均年龄为29岁,可谓是世界上最年轻的国家。

 

人口结构的年轻化,对印度这个国家的方方面面都产生着很大影响,印度年轻人的生活状态,很大程度上代表着这个国家的发展状况。

 

来自中产阶层家庭的年轻人为将来的社会地位而奋斗,来自贫民窟的年轻人则为生存而奔波,尽管阶层不同,但巨大的压力却是印度年轻人需要面临的一个共同问题。

 

而网络的快速渗透,在某种程度上,加剧了这些年轻人对未来对生活的焦虑与迷茫,使得他们内心深处的压力不断膨胀。

 

尽管网络帮助更多印度年轻人开阔了眼界,向他们展现了世界的多姿多彩,但某种程度上也将印度各个阶层之间的贫富差距展现的更加淋漓尽致,对比审视网络另一端的生活状态,印度年轻人更容易对自己的生活现状产生不满。

 

对改变现状倍感无力的年轻人,会通过其他渠道来释放自己内心的压力,因此,解压产品成为一种新的流行。解压产品涵盖的范围很广,常见的解压产品包括史莱姆、捏捏乐以及解压魔方等,作为一种新兴类别,市面上正在涌现出更多新奇的解压产品,卖家可多多关注。

 

压力大是印度年轻群体的一个共同体征,而对西方潮流的崇尚则是他们的另一大共同特点。

 

崇尚西方文化、追随西方潮流是亚太地区多个国家及地区都经历过的一个阶段,印度也不例外,比起本土,西方流行音乐、电影、服饰、化妆品等更容易受到印度年轻人的追捧。

 

但随着国家的进一步发展,本土的传统文化会重新受到重视,年轻人也会逐渐恢复冷静与理智,印度元素会重新占据主流,印度民族服装以及其他民族文化会重新受到追捧,相关产品的市场也会不断增长。





原文转载:http://www.shaoqun.com/a/589596.html

跨境电商:https://www.ikjzd.com/

预售:https://www.ikjzd.com/w/889

c88是什么:https://www.ikjzd.com/w/1017.html


根据人口统计数据,印度拥有8亿处于35岁以下的人口,占国家人口总数的65%,而整个国家的平均年龄为29岁,可谓是世界上最年轻的国家。人口结构的年轻化,对印度这个国家的方方面面都产生着很大影响,印度年轻人的生活状态,很大程度上代表着这个国家的发展状况。来自中产阶层家庭的年轻人为将来的社会地位而奋斗,来自贫民窟的年轻人则为生存而奔波,尽管阶层不同,但巨大的压力却是印度年轻人需要面临的一个共同问题。而网
cb体系:https://www.ikjzd.com/w/2063
拍拍购物:https://www.ikjzd.com/w/2205
韩蓬:https://www.ikjzd.com/w/1635
跨境电商独立站shopify的收款方式有哪几种?:https://www.ikjzd.com/home/132312
纯干货!速卖通产品上新技巧与快速出单的方法:https://www.ikjzd.com/home/132123
亚马逊ppc广告遭遇恶意点击广告怎么办?:https://www.ikjzd.com/home/22

就在今天,一项尘封55年的NBA纪录,被哈登达成了!_篮网

原标题:就在今天,一项尘封55年的NBA纪录,被哈登达成了!

北京时间2021年2月26日,NBA常规赛继续进行,布鲁克林篮网队在主场迎战奥兰多魔术队。这场比赛,篮网队在首节遭遇得分荒,魔术队占据着上风。直到第二节比赛,篮网在哈登的超神发挥下单节轰下41分,一举建立18分领先。下半场比赛,魔术队反扑无力,篮网队稳稳保持着20分左右领先,比赛早早进入垃圾时间。最终,篮网以129-92大胜魔术。就在今天,一项尘封55年的NBA纪录,被哈登达成了!

这场比赛,魔术队打得非常卖力,尤其是武切维奇,抓住篮网队的内线短板,轰下28分+12篮板+2助攻的全面数据。但篮网队只用了一节时间就成功扭转局面。欧文贡献27分+5篮板+9助攻,哈登更不讲理。他出战33分钟,16投7中(三分球10中5),轻取20分+9篮板+7助攻。与此同时,哈登打破了一项尘封55年的NBA纪录。

据NBA官网数据统计,这是哈登转投篮网后的第20场比赛。在此期间哈登场均能够砍下25.2分+8.5篮板+11.6助攻,他成为NBA历史上第二位在换队之后前20场比赛中场均能够砍下20分+10助攻的球员,上一位完成此壮举的球员是1966赛季的盖伊-罗杰斯。小球时代,联盟涌现出一大批优质后卫,比如库里、利拉德、东契奇等等。得分、组织,这已经成为考量一名后卫水平的新标准。

就拿库里来说,一手精湛的射手让他成为小球时代的成功楷模,全票MVP、总冠军奖杯、史上最优秀的射手都是他最成功的的标签;再如东契奇,年纪轻轻就崭露头角,本赛季场均28.9分+8.6篮板+9.2助攻的全能表现让他坐稳一个西部全明星首发的位置。当然,说到全能后卫,他们较哈登还是差那么点意思。

2016-17赛季,哈登生涯首次改打组织后卫就成为常规赛助攻王;过去三年,哈登都是常规赛得分王。在此期间,哈登的得分能力和超强的球场大局观都给人留下深刻印象。本赛季转投篮网之后,篮网助教席有他最熟悉的恩师德安东尼,别提哈登打得有多轻松自如了,丝毫不需要磨合就把自己的一切呈现在球场之上。篮网队员沙梅特在接受采访时直言:我曾经以为哈登只是一个单打得分手,但他远远不止于此,他应该被称为大师!

目前,篮网队以22胜12负排在东部第二位,距离东部第一76人队仅相差0.5个胜场。不难看出,他们豪组三巨头的预期目标正在走进现实。尤其是哈登,接过篮网队的组织后卫大权之后,他本人成为联盟助攻王,篮网队也成为联盟最厉害的进攻大队,场均得分、进攻效率、命中率等多项数据遥遥领先于其他球队。感谢哈登,祝福篮网,三巨头这是要冲冠的节奏啊。球迷朋友们,你们对此怎么看呢?来给我留言评论探讨一下吧。返回搜狐,查看更多

责任编辑:

原文转载:http://sport.shaoqun.com/a/451739.html

跨境电商:https://www.ikjzd.com/

马莎:https://www.ikjzd.com/w/2385

tenso:https://www.ikjzd.com/w/1552.html


原标题:就在今天,一项尘封55年的NBA纪录,被哈登达成了!北京时间2021年2月26日,NBA常规赛继续进行,布鲁克林篮网队在主场迎战奥兰多魔术队。这场比赛,篮网队在首节遭遇得分荒,魔术队占据着上风。直到第二节比赛,篮网在哈登的超神发挥下单节轰下41分,一举建立18分领先。下半场比赛,魔术队反扑无力,篮网队稳稳保持着20分左右领先,比赛早早进入垃圾时间。最终,篮网以129-92大胜魔术。就在今天
cbo:https://www.ikjzd.com/w/2670
沃尔码:https://www.ikjzd.com/w/220
执御:https://www.ikjzd.com/w/717.html
京东想引入更多欧洲奢侈品牌,与阿里巴巴展开较量:https://www.ikjzd.com/home/557
什么是亚马逊品牌分析?2021年有哪些ABA更新调整?:https://www.ikjzd.com/home/139845
印尼电商清关难于上青天,幕后却只有两家公司?:https://www.ikjzd.com/home/18717

俄国电商敲开欧盟大门,Wildberries在法国、意大利和西班牙上市

外媒报道,俄罗斯电商Wildberries已经在法国、意大利和西班牙启动了专门的电子商务网站。

 

该公司在发给《莫斯科时报》的一份声明中表示,该公司已开始在法国、意大利和西班牙销售。加上之前Wildberries在德国等地进行过的扩张,这意味着Wildberries目前在欧盟的四大消费市场上都有了一席之地。

 

自Wildberries在德国推出之后,Wildberries就算是正式进入了欧洲市场。1月15日,Wildberries在德国上市,这标志着Wildberries成为了欧洲首个打开电子商务大门的主要电子商务国家。此前,它还曾在波兰和其他东欧市场推出。

 

而现在,这家俄罗斯电子商务巨头在法国推出Wildberries.fr,在意大利启动it.wildberries.eu,并且在西班牙启动Wildberries.es,逐渐将自己的商业版图扩展到了更多的欧洲国家,这些国家的客户可以通过专门的电子商务网站,使用iOS或者安卓应用程序进行订购。

 

该网站和应用程序都是以这些欧洲国家/地区的当地语言运行的,Wildberries目前提供来自大约40000个品牌的约400万个SKU产品,并宣布将来会提供更多不同的产品。上述这些国家的客户现在可以通过Wildberries订购时装,配件,消费电子产品,书籍,美容用品,汽车零件,宠物用品等。

 

有分析人士说,俄罗斯的在线零售业正在迅速增长,这种流行趋势已经发展了数年,但是俄罗斯的电子商务市场目前还缺少一个主导角色,比如美国的亚马逊和中国的阿里巴巴,所以俄罗斯的公司还在电商领域中大量投资以赢得客户和争夺地位。

 

根据Data Insight的数据,Wildberries控制着俄罗斯电子商务市场约13%的份额,是竞争对手Ozon及俄罗斯其他公司的两倍以上。

 

"目前,Wildberries已在13个国家/地区运营,包括俄罗斯,德国,波兰,以色列,斯洛伐克,白俄罗斯,哈萨克斯坦和许多其他国家," Wildberries开发总监Vyacheslav Ivashchenko说。"我们为客户提供各大制造商的各种商品,包括知名的全球品牌和当地的小型企业,并且愿意与所有国家的企业家合作。"





原文转载:http://www.shaoqun.com/a/589574.html

跨境电商:https://www.ikjzd.com/

tracker:https://www.ikjzd.com/w/2720

声网agora:https://www.ikjzd.com/w/2176


外媒报道,俄罗斯电商Wildberries已经在法国、意大利和西班牙启动了专门的电子商务网站。该公司在发给《莫斯科时报》的一份声明中表示,该公司已开始在法国、意大利和西班牙销售。加上之前Wildberries在德国等地进行过的扩张,这意味着Wildberries目前在欧盟的四大消费市场上都有了一席之地。自Wildberries在德国推出之后,Wildberries就算是正式进入了欧洲市场。1月15
usps国际快递查询:https://www.ikjzd.com/w/513
芒果店长:https://www.ikjzd.com/w/1533
心怡物流:https://www.ikjzd.com/w/1327
亚马逊欧洲站灯具类目安全审核再度收紧!要求有EN60598-2-20检测报告:https://www.ikjzd.com/home/11391
2019年亚马逊选品工作从何做起_亚马逊卖家选品应分析竞争对手那几个因素:https://www.ikjzd.com/home/14468
Jumia关闭卢旺达站点,非洲电商市场究竟有多难?:https://www.ikjzd.com/home/112754

搭建ASP.NET Core API框架(1) 从零开始

框架需求

  • 独立的后端框架
  • 基于Restful标准
  • 最简单的后端框架
  • 学习入门版与实际项目版结合
  • 入门最好教程

框架优势

  • 增加了内核数据库[SQLite],专门保存SQL语句,可利用工具做增删改查功能[可选功能]
  • 增加了存储过程调用版本,方便有这方面的需求的人使用[可选功能]
  • 结合菜鸟与架构师风格,制定的两个版本
  • 减少代码量,多用共用模块

框架内容

  1. 包含快速开发工具(Web前端编辑功能 + Winform编辑工具)
  2. 不需要额外功能,不需要编辑代码
  3. 跨平台兼容(.NET Core版本)
  4. 以MES系统Web Api开发为例

技术分享

  • 中文技术开发文档[PDF版]
  • 测试工具使用方法
  • 简单的例子到复杂的逻辑全过程
  • 本教程是以真实项目框架,如需要购买源代码,请与博主联系
  • 最详细的视频讲解,真实的项目代码,如有需要,进QQ群下载
  • QQ群:433472922








原文转载:http://www.shaoqun.com/a/589571.html

跨境电商:https://www.ikjzd.com/

moss:https://www.ikjzd.com/w/1653

好东东网:https://www.ikjzd.com/w/1238


框架需求独立的后端框架基于Restful标准最简单的后端框架学习入门版与实际项目版结合入门最好教程框架优势增加了内核数据库[SQLite],专门保存SQL语句,可利用工具做增删改查功能[可选功能]增加了存储过程调用版本,方便有这方面的需求的人使用[可选功能]结合菜鸟与架构师风格,制定的两个版本减少代码量,多用共用模块框架内容包含快速开发工具(Web前端编辑功能+Winform编辑工具)不需要额外功
002315焦点科技:https://www.ikjzd.com/w/1831
mil:https://www.ikjzd.com/w/1285
etsy:https://www.ikjzd.com/w/169.html
Shopify独立站如何收款专题精讲Paypal、2Checkout、Stripe的较量:https://www.ikjzd.com/home/132113
亚马逊运营常见问题QA集锦(564-573):https://www.ikjzd.com/home/121979
童俭丞:https://www.ikjzd.com/w/1810

陈薇团队研发的新冠疫苗附条件上市|新型冠状病毒|生物工程|陈薇

  来源:科技日报


  24日,康希诺生物发布公告,2月21日已正式向国家药监局提交重组新型冠状病毒疫苗(5型腺病毒载体)附条件上市申请,并获得受理。此款疫苗是由康希诺生物与军事科学院军事医学研究院生物工程研究所陈薇院士团队共同开发。

原文转载:http://tech.shaoqun.com/a/353773.html

跨境电商:https://www.ikjzd.com/

parenthood:https://www.ikjzd.com/w/2497

鸥鹭:https://www.ikjzd.com/w/2568


来源:科技日报  24日,康希诺生物发布公告,2月21日已正式向国家药监局提交重组新型冠状病毒疫苗(5型腺病毒载体)附条件上市申请,并获得受理。此款疫苗是由康希诺生物与军事科学院军事医学研究院生物工程研究所陈薇院士团队共同开发。原文转载:http://tech.shaoqun.com/a/353773.html跨境电商:https://www.ikjzd.com/parenthood:https:
易佰:https://www.ikjzd.com/w/1482
外贸圈:https://www.ikjzd.com/w/1083
primc:https://www.ikjzd.com/w/129
口述:我和女友结婚只因爱上她姐姐:http://lady.shaoqun.com/m/a/3049.html
亚马逊销量上去之后如何稳住?:https://www.ikjzd.com/home/90533
"无货源"跨境电商培训:人和货两头全被忽悠:https://www.ikjzd.com/home/133915

0-2大冷!英超首支欧战出局球队诞生,4-0!4-3!2热门联手晋级_总比分

原标题:0-2大冷!英超首支欧战出局球队诞生,4-0!4-3!2热门联手晋级

欧联1/16决赛,英超排名第三的莱斯特城爆冷0-2不敌捷克球队布拉格斯拉维亚,总比分0-2出局!此外,曼联、阿森纳都成功晋级,之前热刺也晋级。

莱斯特城0-2布拉格斯拉维亚

第17分钟,前场抢断造威胁,阿尔布赖顿迎球怒射飞出。第27分钟,操之过急,西马单刀错失良机。第49分钟,反客为主!普罗沃德拍马赶到,后点包抄破门,莱斯特城0-1落后。第78分钟,锁定胜局,西马禁区前沿远射破网!莱斯特城0-2爆冷输掉比赛。这样一来,莱斯特城将全部精力放在欧战赛场。莱斯特城也成为首支欧战出局的英超球队。

曼联0-0皇家社会,总分4-0晋级

第11分钟,B费禁区内半转身凌空抽射,球被雷米罗没收。第13分钟,詹姆斯送点,奥亚萨瓦尔将球罚丢。第22分钟,马夏尔右脚劲射,雷米罗将球挡出。1分钟后,运气欠佳,B费跟进打空门击中横梁。第36分钟,詹姆斯近距离甩头攻门,雷米罗神扑将球挡出。第48分钟,拉什福德任意球直接射门,球稍稍偏出。1分钟后,萨尼安头球攻门,球击中门楣弹出。第63分钟,图安泽贝破门,裁判经VAR认定林德洛夫犯规在先,并出示黄牌。第85分钟,梅尔克兰斯一脚低射,迪恩-亨德森将球没收。最终,曼联0-0战平皇家社会,总比分4-0晋级。

阿森纳3-2本菲卡,总分4-3晋级

双方首回合战成1-1平手,阿森纳手握一粒客场进球优势。上半场比赛萨卡内切后送出精妙直塞,奥巴梅扬机敏前插得球挑射破门,贡萨尔维斯世界波扳平比分。易边再战,奥巴梅扬单刀破门越位在先进球无效,塞瓦略斯失误送礼,蒂尔尼贴地斩扳平比分,常规时间结束前,萨卡再次助攻奥巴梅扬头球完成绝杀!最终阿森纳3-2本菲卡,总比分4-3晋级16强。阿森纳队官推也在赛后发推俏皮地称赞了萨卡:"只是提醒一下大家,这个男孩还只有19岁哦……19岁。"

返回搜狐,查看更多

责任编辑:

原文转载:http://sport.shaoqun.com/a/450738.html

跨境电商:https://www.ikjzd.com/

wario:https://www.ikjzd.com/w/887

feedback:https://www.ikjzd.com/w/159


原标题:0-2大冷!英超首支欧战出局球队诞生,4-0!4-3!2热门联手晋级欧联1/16决赛,英超排名第三的莱斯特城爆冷0-2不敌捷克球队布拉格斯拉维亚,总比分0-2出局!此外,曼联、阿森纳都成功晋级,之前热刺也晋级。莱斯特城0-2布拉格斯拉维亚第17分钟,前场抢断造威胁,阿尔布赖顿迎球怒射飞出。第27分钟,操之过急,西马单刀错失良机。第49分钟,反客为主!普罗沃德拍马赶到,后点包抄破门,莱斯特城
好卖家:https://www.ikjzd.com/w/776
沃尔码:https://www.ikjzd.com/w/220
邮乐网:https://www.ikjzd.com/w/1776
Lazada怎么开店?最新Lazada开店图文实操及入驻条件费用!:https://www.ikjzd.com/home/136071
卖家通病 | 流量高没转化率怎么办?:https://www.ikjzd.com/home/18115
美国企业品牌价值排行:亚马逊第一,沃尔玛排第八:https://www.ikjzd.com/home/20571

2021-02-25

分类广告网Avito上线电商功能,瓜分俄罗斯2千亿元电商市场

Avito创立于2007年,是俄罗斯最受欢迎的分类广告网站,是一个专门展示商品、工作、租房、汽车、宠物等出售广告的平台。平台只提供展示,所有交易由买卖双方通过其他渠道完成。

 

此次测试的电商功能,Avito将接受卖家入驻,并将向他们收取佣金。Avito计划在三到五年内成为俄罗斯电商市场的头部玩家。但有专家表示如果Avito要与Wildberries、Ozon等竞争,还需要更大的投入和努力。

 

INFOLine Analytics数据显示,2020年俄罗斯电商市场总体规模约为2.7万亿卢布(约2371亿人民币)。线上销售方面,2020年上半年Wildberries、Ozon和DNS三者占据了21.3%的市场份额。

 

目前,Avito已经对电商功能着手测试,已经有200家左右的卖家在平台上进行销售测试。Avito计划在今年年底前扩大这一规模。根据Mediascope的数据,2020年11月Avito在俄罗斯的用户达4040万人。这一庞大的用户基础,将有益于发展其电商功能。

 

上线电商功能后,Avito将继续保持原先的分类广告模式,因为用户投放和推广广告是该公司收入的主要来源。

 

就为何推出电商功能这一问题,Avito总经理阿列克谢·库拉金(Alexey Kurakin)解释道,由于疫情影响,Avito许多用户都流向了其他电商平台,推出电商功能的主要目的是留住用户。其次,Avito希望电商功能可以增加该公司的收入和商业价值。

 

推出电商功能是俄罗斯互联网企业去年至今的一大"喜好"。去年年底,俄罗斯互联网巨头Yandex旗下的比价购物平台Yandex.Market上线了电商功能。并在1月表示,将优先展示那些入驻卖家的产品信息,一度引起用户的抵制。

 

Avito这一举措也不被专家看好。INFOLine Analytics认为,Avito进入电商领域已经有点晚。而且其他电商平台有能力补贴物流,Avito这方面的资源还很欠缺。同时,Avito还将面临另一个大挑战——如何与大卖家建立关系并维持。

 

短期内看Avito很难在俄罗斯电商市场分上一杯羹。眼下,Avito应该着眼于现存问题并考虑如何解决。




原文转载:http://www.shaoqun.com/a/586604.html

跨境电商:https://www.ikjzd.com/

邓白氏集团:https://www.ikjzd.com/w/582

c79:https://www.ikjzd.com/w/1016


Avito创立于2007年,是俄罗斯最受欢迎的分类广告网站,是一个专门展示商品、工作、租房、汽车、宠物等出售广告的平台。平台只提供展示,所有交易由买卖双方通过其他渠道完成。此次测试的电商功能,Avito将接受卖家入驻,并将向他们收取佣金。Avito计划在三到五年内成为俄罗斯电商市场的头部玩家。但有专家表示如果Avito要与Wildberries、Ozon等竞争,还需要更大的投入和努力。INFOLi
雨果网:https://www.ikjzd.com/w/1307
海淘贝:https://www.ikjzd.com/w/1726
友家速递:https://www.ikjzd.com/w/1341
跨境电商平台疯狂"刷单"走私,涉案金额达4亿多人民币:https://www.ikjzd.com/home/22823
2019外贸旺季,业务员要做些什么?:https://www.ikjzd.com/home/107031
eBay卖家请注意:只能通过eBay支付给物流供应商付款!:https://www.ikjzd.com/home/10020

Vue高级使用,综合案例学生管理系统实现

Vue高级使用:自定义组件,Vue生命周期,Vue异步操作,综合案例学政管理系统登录功能实现,分页查询功能实现,增删改查实现

课堂讲义

1、Vue 高级使用

1.1、自定义组件

  • 学完了 Element 组件后,我们会发现组件其实就是自定义的标签。例如<el-button>就是对<button>的封装

  • 本质上,组件是带有一个名字且可复用的 Vue 实例,我们完全可以自己定义

  • 定义格式

    Vue.component(组件名称, {
    props:组件的属性,
    data: 组件的数据函数,
    template: 组件解析的标签模板
    })
  • 代码实现

    <!DOCTYPE html>
    <html lang="en">
    <head>
       <meta charset="UTF-8">
       <meta name="viewport" content="width=device-width, initial-scale=1.0">
       <title>自定义组件</title>
       <script src="vue/vue.js"></script>
    </head>
    <body>
       <div id="div">
           <my-button></my-button>
       </div>
    </body>
    <script>
       Vue.component("my-button",{
           // 属性
           props:["style"],
           // 数据函数
           data: function(){
               return{
                   msg:"我的按钮"
              }
          },
           //解析标签模板
           template:"<button style='color:red'>{{msg}}</button>"
      });
    ​
       new Vue({
           el:"#div"
      });
    </script>
    </html>

1.2、Vue的生命周期

  • 生命周期

 

 

 

  • 生命周期的八个阶段

     

     

  • 代码实现

    <!DOCTYPE html>
    <html lang="en">
    <head>
       <meta charset="UTF-8">
       <meta name="viewport" content="width=device-width, initial-scale=1.0">
       <title>生命周期</title>
       <script src="vue/vue.js"></script>
    </head>
    <body>
       <div id="app">
          {{message}}
       </div>
    </body>
    <script>
       let vm = new Vue({
    el: '#app',
    data: {
    message: 'Vue的生命周期'
    },
    beforeCreate: function() {
    console.group('------beforeCreate创建前状态------');
    console.log("%c%s", "color:red", "el     : " + this.$el); //undefined
    console.log("%c%s", "color:red", "data   : " + this.$data); //undefined
    console.log("%c%s", "color:red", "message: " + this.message);//undefined
    },
    created: function() {
    console.group('------created创建完毕状态------');
    console.log("%c%s", "color:red", "el     : " + this.$el); //undefined
    console.log("%c%s", "color:red", "data   : " + this.$data); //已被初始化
    console.log("%c%s", "color:red", "message: " + this.message); //已被初始化
    },
    beforeMount: function() {
    console.group('------beforeMount挂载前状态------');
    console.log("%c%s", "color:red", "el     : " + (this.$el)); //已被初始化
    console.log(this.$el);
    console.log("%c%s", "color:red", "data   : " + this.$data); //已被初始化  
    console.log("%c%s", "color:red", "message: " + this.message); //已被初始化  
    },
    mounted: function() {
    console.group('------mounted 挂载结束状态------');
    console.log("%c%s", "color:red", "el     : " + this.$el); //已被初始化
    console.log(this.$el);
    console.log("%c%s", "color:red", "data   : " + this.$data); //已被初始化
    console.log("%c%s", "color:red", "message: " + this.message); //已被初始化
    },
    beforeUpdate: function() {
    console.group('beforeUpdate 更新前状态===============》');
    let dom = document.getElementById("app").innerHTML;
    console.log(dom);
    console.log("%c%s", "color:red", "el     : " + this.$el);
    console.log(this.$el);
    console.log("%c%s", "color:red", "data   : " + this.$data);
    console.log("%c%s", "color:red", "message: " + this.message);
    },
    updated: function() {
    console.group('updated 更新完成状态===============》');
    let dom = document.getElementById("app").innerHTML;
    console.log(dom);
    console.log("%c%s", "color:red", "el     : " + this.$el);
    console.log(this.$el);
    console.log("%c%s", "color:red", "data   : " + this.$data);
    console.log("%c%s", "color:red", "message: " + this.message);
    },
    beforeDestroy: function() {
    console.group('beforeDestroy 销毁前状态===============》');
    console.log("%c%s", "color:red", "el     : " + this.$el);
    console.log(this.$el);
    console.log("%c%s", "color:red", "data   : " + this.$data);
    console.log("%c%s", "color:red", "message: " + this.message);
    },
    destroyed: function() {
    console.group('destroyed 销毁完成状态===============》');
    console.log("%c%s", "color:red", "el     : " + this.$el);
    console.log(this.$el);
    console.log("%c%s", "color:red", "data   : " + this.$data);
    console.log("%c%s", "color:red", "message: " + this.message);
    }
    });
    ​

    // 销毁Vue对象
    //vm.$destroy();
    //vm.message = "hehe"; // 销毁后 Vue 实例会解绑所有内容
    ​
    // 设置data中message数据值
    vm.message = "good...";
    </script>
    </html>

1.3、Vue异步操作***

  • 在Vue中发送异步请求,本质上还是AJAX。我们可以使用axios这个插件来简化操作!

  • 使用步骤 1.引入axios核心js文件。 2.调用axios对象的方法来发起异步请求。 3.调用axios对象的方法来处理响应的数据。

  • axios常用方法

     

     

  • 代码实现

    • html代码

    <!DOCTYPE html>
    <html lang="en">
    <head>
       <meta charset="UTF-8">
       <title>异步操作</title>
       <script src="js/vue.js"></script>
       <script src="js/axios-0.18.0.js"></script>
    </head>
    <body>
       <div id="div">
          {{name}}
           <button @click="send()">发起请求</button>
       </div>
    </body>
    <script>
       new Vue({
           el:"#div",
           data:{
               name:"张三"
          },
           methods:{
               send(){
                   // GET方式请求
                   // axios.get("testServlet?name=" + this.name)
                   //     .then(resp => {
                   //         alert(resp.data);
                   //     })
                   //     .catch(error => {
                   //         alert(error);
                   //     })
    ​
                   // POST方式请求
                   axios.post("testServlet","name="+this.name)
                      .then(resp => {
                           alert(resp.data);
                      })
                      .catch(error => {
                           alert(error);
                      })
              }
          }
      });
    </script>
    </html>
    • java代码

    package com.itheima;
    ​
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    @WebServlet("/testServlet")
    public class TestServlet extends HttpServlet {
       @Override
       protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
           //设置请求和响应的编码
           req.setCharacterEncoding("UTF-8");
           resp.setContentType("text/html;charset=UTF-8");
    ​
           //获取请求参数
           String name = req.getParameter("name");
           System.out.println(name);
    ​
           //响应客户端
           resp.getWriter().write("请求成功");
      }
    ​
       @Override
       protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
           this.doGet(req,resp);
      }
    }

1.4、小结

  • 自定义组件:本质上,组件是带有一个名字且可复用的 Vue 实例,我们可以自己来定义。

    Vue.component(组件名称, {
    props:组件的属性,
    data: 组件的数据函数,
    template: 组件解析的标签模板
    })
  • 生命周期:核心八个阶段 beforeCreate:创建前 created:创建后 beforeMount:载入前 mounted:载入后 beforeUpdate:更新前 updated:更新后 beforeDestroy:销毁前 destroyed:销毁后

  • 异步操作:通过 axios 插件来实现。

     

     

2、综合案例 学生管理系统***

2.1、效果环境的介绍

 

 

 

 

2.2、登录功能的实现

  • 环境搭建

    • 从当天的资料中解压《学生管理系统原始项目》,并导入。

  • 代码实现

    • html代码

      onSubmit(formName) {
                     // 为表单绑定验证功能
                     this.$refs[formName].validate((valid) => {
                         if (valid) {
                             //请求服务器完成登录功能
                             axios.post("userServlet","username=" + this.form.username + "&password=" + this.form.password)
                                .then(resp => {
                                     if(resp.data == true) {
                                         //登录成功,跳转到首页
                                         location.href = "index.html";
                                    }else {
                                         //登录失败,跳转到登录页面
                                         alert("登录失败,请检查用户名和密码");
                                         location.href = "login.html";
                                    }
                                })
                        } else {
                             return false;
                        }
                    });
                }
    • java代码

      • UserServlet.java

      package com.itheima.controller;
      ​
      import com.itheima.bean.User;
      import com.itheima.service.UserService;
      import com.itheima.service.impl.UserServiceImpl;
      ​
      import javax.servlet.ServletException;
      import javax.servlet.annotation.WebServlet;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      import java.util.List;
      ​
      @WebServlet("/userServlet")
      public class UserServlet extends HttpServlet {
         private UserService service = new UserServiceImpl();
         @Override
         protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
             //设置请求和响应编码
             req.setCharacterEncoding("UTF-8");
             resp.setContentType("text/html;charset=UTF-8");
      ​
             //1.获取请求参数
             String username = req.getParameter("username");
             String password = req.getParameter("password");
      ​
             //2.封装User对象
             User user = new User(username,password);
      ​
             //3.调用业务层的登录方法
             List<User> list = service.login(user);
      ​
             //4.判断是否查询出结果
             if(list.size() != 0) {
                 //将用户名存入会话域当中
                 req.getSession().setAttribute("username",username);
                 //响应给客户端true
                 resp.getWriter().write("true");
            }else {
                 //响应给客户端false
                 resp.getWriter().write("false");
            }
        }
      ​
         @Override
         protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
             doGet(req,resp);
        }
      }
      • UserService.java

      package com.itheima.service;
      ​
      import com.itheima.bean.User;
      ​
      import java.util.List;
      /*
         业务层约束接口
      */
      public interface UserService {
         /*
             登录方法
          */
         public abstract List<User> login(User user);
      }
      • UserServiceImpl.java

      package com.itheima.service.impl;
      ​
      import com.itheima.bean.User;
      import com.itheima.mapper.UserMapper;
      import com.itheima.service.UserService;
      import org.apache.ibatis.io.Resources;
      import org.apache.ibatis.session.SqlSession;
      import org.apache.ibatis.session.SqlSessionFactory;
      import org.apache.ibatis.session.SqlSessionFactoryBuilder;
      ​
      import java.io.IOException;
      import java.io.InputStream;
      import java.util.List;
      ​
      public class UserServiceImpl implements UserService {
         @Override
         public List<User> login(User user) {
             InputStream is = null;
             SqlSession sqlSession = null;
             List<User> list = null;
             try{
                 //1.加载核心配置文件
                 is = Resources.getResourceAsStream("MyBatisConfig.​
                 //2.获取SqlSession工厂对象
                 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
      ​
                 //3.通过SqlSession工厂对象获取SqlSession对象
                 sqlSession = sqlSessionFactory.openSession(true);
      ​
                 //4.获取UserMapper接口的实现类对象
                 UserMapper mapper = sqlSession.getMapper(UserMapper.class);
      ​
                 //5.调用实现类对象的登录方法
                 list = mapper.login(user);
      ​
            }catch (Exception e) {
                 e.printStackTrace();
            } finally {
                 //6.释放资源
                 if(sqlSession != null) {
                     sqlSession.close();
                }
                 if(is != null) {
                     try {
                         is.close();
                    } catch (IOException e) {
                         e.printStackTrace();
                    }
                }
            }
             //7.返回结果到控制层
             return list;
        }
      }
      • UserMapper.java

      package com.itheima.mapper;
      ​
      import com.itheima.bean.User;
      import org.apache.ibatis.annotations.Select;
      ​
      import java.util.List;
      ​
      public interface UserMapper {
         /*
             登录方法
          */
         @Select("SELECT * FROM user WHERE username=#{username} AND password=#{password}")
         public abstract List<User> login(User user);
      }

2.3、分页查询功能的实现

 

 

  • 代码实现

    • html代码

      <script>
         new Vue({
             el:"#div",
             data:{
                 dialogTableVisible4add: false,  //添加窗口显示状态
                 dialogTableVisible4edit: false, //编辑窗口显示状态
                 formData:{},//添加表单的数据
                 editFormData: {},//编辑表单的数据
                 tableData:[],//表格数据
                 pagination: {
                     currentPage: 1, //当前页
                     pageSize: 5,    //每页显示条数
                     total: 0        //总条数
                },
                 rules: {
                     number: [
                        {required: true, message: '请输入学号', trigger: 'blur'},
                        {min: 2, max: 10, message: '长度在 2 到 10 个字符', trigger: 'blur'}
                    ],
                     name: [
                        {required: true, message: '请输入姓名', trigger: 'blur'},
                        {min: 2, max: 10, message: '长度在 2 到 10 个字符', trigger: 'blur'}
                    ],
                     birthday: [
                        {required: true, message: '请选择日期', trigger: 'change'}
                    ],
                     address: [
                        {required: true, message: '请输入地址', trigger: 'blur'},
                        {min: 2, max: 200, message: '长度在 2 到 200 个字符', trigger: 'blur'}
                    ],
                }
            },
             methods:{
                 //分页查询功能
                 selectByPage(){
                     axios.post("studentServlet","method=selectByPage&currentPage=" + this.pagination.currentPage + "&pageSize=" + this.pagination.pageSize)
                        .then(resp => {
                             //将查询出的数据赋值tableData
                             this.tableData = resp.data.list;
                             //设置分页参数
                             //当前页
                             this.pagination.currentPage = resp.data.pageNum;
                             //总条数
                             this.pagination.total = resp.data.total;
                        })
                },
                 //改变每页条数时执行的函数
                 handleSizeChange(pageSize) {
                     //修改分页查询的参数
                     this.pagination.pageSize = pageSize;
                     //重新执行查询
                     this.selectByPage();
                },
                 //改变页码时执行的函数
                 handleCurrentChange(pageNum) {
                     //修改分页查询的参数
                     this.pagination.currentPage = pageNum;
                     //重新执行查询
                     this.selectByPage();
                },
                 showAddStu() {
                     //弹出窗口
                     this.dialogTableVisible4add = true;
                },
                 resetForm(addForm) {
                     //双向绑定,输入的数据都赋值给了formData, 清空formData数据
                     this.formData = {};
                     //清除表单的校验数据
                     this.$refs[addForm].resetFields();
                },
                 showEditStu(row) {
                     //1. 弹出窗口
                     this.dialogTableVisible4edit = true;
      ​
                     //2. 显示表单数据
                     this.editFormData = {
                         number:row.number,
                         name:row.name,
                         birthday:row.birthday,
                         address:row.address,
                    }
                }  
            },
             mounted(){
                 //调用分页查询功能
                 this.selectByPage();
            }
        });
      </script>
    • java代码

      • 1、创建StudentServlet.java

      package com.itheima.controller;
      ​
      import com.fasterjackson.databind.ObjectMapper;
      import com.github.pagehelper.Page;
      import com.github.pagehelper.PageInfo;
      import com.itheima.bean.Student;
      import com.itheima.service.StudentService;
      import com.itheima.service.impl.StudentServiceImpl;
      import org.apache.commons.beanutils.BeanUtils;
      import org.apache.commons.beanutils.ConvertUtils;
      import org.apache.commons.beanutils.Converter;
      ​
      import javax.servlet.ServletException;
      import javax.servlet.annotation.WebServlet;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      import java.text.ParseException;
      import java.text.SimpleDateFormat;
      import java.util.Date;
      import java.util.Map;
      ​
      @WebServlet("/studentServlet")
      public class StudentServlet extends HttpServlet {
         private StudentService service = new StudentServiceImpl();
         @Override
         protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
             //设置请求和响应编码
             req.setCharacterEncoding("UTF-8");
             resp.setContentType("text/html;charset=UTF-8");
      ​
             //1.获取方法名
             String method = req.getParameter("method");
             if(method.equals("selectByPage")) {
                 //分页查询功能
                 selectByPage(req,resp);
            }
        }
      ​
         /*
             分页查询功能
          */
         private void selectByPage(HttpServletRequest req, HttpServletResponse resp) {
             //获取请求参数
             String currentPage = req.getParameter("currentPage");
             String pageSize = req.getParameter("pageSize");
      ​
             //调用业务层的查询方法
             Page page = service.selectByPage(Integer.parseInt(currentPage), Integer.parseInt(pageSize));
      ​
             //封装PageInfo
             PageInfo info = new PageInfo(page);
      ​
             //将info转成json,响应给客户端
             try {
                 String json = new ObjectMapper().writeValueAsString(info);
                 resp.getWriter().write(json);
            } catch (Exception e) {
                 e.printStackTrace();
            }
        }
      ​
         @Override
         protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
             doGet(req,resp);
        }
      }
      • 2、创建StudentService.java

      package com.itheima.service;
      ​
      import com.github.pagehelper.Page;
      import com.itheima.bean.Student;
      ​
      /*
         学生业务层接口
      */
      public interface StudentService {
         /*
             分页查询方法
          */
         public abstract Page selectByPage(Integer currentPage, Integer pageSize);
      }
      • 3、创建StudentServiceImpl.java

      package com.itheima.service.impl;
      ​
      import com.github.pagehelper.Page;
      import com.github.pagehelper.PageHelper;
      import com.itheima.bean.Student;
      import com.itheima.mapper.StudentMapper;
      import com.itheima.service.StudentService;
      import org.apache.ibatis.io.Resources;
      import org.apache.ibatis.session.SqlSession;
      import org.apache.ibatis.session.SqlSessionFactory;
      import org.apache.ibatis.session.SqlSessionFactoryBuilder;
      ​
      import java.io.IOException;
      import java.io.InputStream;
      ​
      /*
         学生业务层实现类
      */
      public class StudentServiceImpl implements StudentService {
      ​
         /*
             分页查询功能
          */
         @Override
         public Page selectByPage(Integer currentPage, Integer pageSize) {
             InputStream is = null;
             SqlSession sqlSession = null;
             Page page = null;
             try{
                 //1.加载核心配置文件
                 is = Resources.getResourceAsStream("MyBatisConfig.            //2.获取SqlSession工厂对象
                 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
                 //3.通过SqlSession工厂对象获取SqlSession对象
                 sqlSession = sqlSessionFactory.openSession(true);
                 //4.获取StudentMapper接口实现类对象
                 StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
                 //5.设置分页参数
                 page = PageHelper.startPage(currentPage,pageSize);
                 //6.调用实现类对象查询全部方法
                 mapper.selectAll();
            } catch (Exception e) {
                 e.printStackTrace();
            } finally {
                 //7.释放资源
                 if(sqlSession != null) {
                     sqlSession.close();
                }
                 if(is != null) {
                     try {
                         is.close();
                    } catch (IOException e) {
                         e.printStackTrace();
                    }
                }
            }
      ​
             //8.返回结果到控制层
             return page;
        }
      }
      • 4、创建StudentMapper.java

      package com.itheima.mapper;
      ​
      import com.itheima.bean.Student;
      import org.apache.ibatis.annotations.Delete;
      import org.apache.ibatis.annotations.Insert;
      import org.apache.ibatis.annotations.Select;
      import org.apache.ibatis.annotations.Update;
      ​
      import java.util.List;
      ​
      /*
         学生持久层接口
      */
      public interface StudentMapper {
         /*
             查询全部方法
          */
         @Select("SELECT * FROM student")
         public abstract List<Student> selectAll();
      }
      ​

2.4、添加功能的实现

 

 

  • 代码实现

    • html代码

      在stuList.html中增加"添加功能"代码

      //添加学生功能   addStu(){    let param = "method=addStu&number=" + this.formData.number + "&name=" + this.formData.name +      "&birthday=" + this.formData.birthday + "&address=" + this.formData.address +      "&currentPage=" + this.pagination.currentPage + "&pageSize=" + this.pagination.pageSize;    axios.post("studentServlet",param)     .then(resp => {      //将查询出的数据赋值tableData      this.tableData = resp.data.list;      //设置分页参数      //当前页      this.pagination.currentPage = resp.data.pageNum;      //总条数      this.pagination.total = resp.data.total;     })    //关闭添加窗口    this.dialogTableVisible4add = false;   }
    • java代码

      • 1、在StudentServlet.java中增加"添加功能"代码-addStu

      	/*	*1、直接复制会报错	*2、需要将此行代码需要添加到"doGet"方法中	*3、增加"addStu"方法名的判断	 */	else if(method.equals("addStu")) {   //添加数据功能   addStu(req,resp);  }	==================================================================================	/*  添加数据功能  */ private void addStu(HttpServletRequest req, HttpServletResponse resp) {  //获取请求参数  Map<String, String[]> map = req.getParameterMap();  String currentPage = req.getParameter("currentPage");  String pageSize = req.getParameter("pageSize");  //封装Student对象  Student stu = new Student();  //注册日期转换器方法  dateConvert();  try {   BeanUtils.populate(stu,map);  } catch (Exception e) {   e.printStackTrace();  }  //调用业务层的添加方法  service.addStu(stu);  //重定向到分页查询功能  try {   resp.sendRedirect(req.getContextPath() + "/studentServlet?method=selectByPage&currentPage=" + currentPage + "&pageSize=" + pageSize);  } catch (IOException e) {   e.printStackTrace();  } } /*  日期转换  */ private void dateConvert() {  ConvertUtils.register(new Converter() {   public Object convert(Class type, Object value) {    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");    try {     return simpleDateFormat.parse(value.toString());    } catch (ParseException e) {     e.printStackTrace();    }    return null;   }  }, Date.class); }
      • 2、在StudentService.java中增加"添加功能"-addStu

       /*  添加数据方法  */ public abstract void addStu(Student stu);
      • 3、StudentServiceImpl.java中增加"添加功能"-addStu

      /*
             添加数据方法
          */
         @Override
         public void addStu(Student stu) {
             InputStream is = null;
             SqlSession sqlSession = null;
             try{
                 //1.加载核心配置文件
                 is = Resources.getResourceAsStream("MyBatisConfig.            //2.获取SqlSession工厂对象
                 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
                 //3.通过SqlSession工厂对象获取SqlSession对象
                 sqlSession = sqlSessionFactory.openSession(true);
                 //4.获取StudentMapper接口实现类对象
                 StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
                 //5.调用实现类对象添加方法
                 mapper.addStu(stu);
            } catch (Exception e) {
                 e.printStackTrace();
            } finally {
                 //6.释放资源
                 if(sqlSession != null) {
                     sqlSession.close();
                }
                 if(is != null) {
                     try {
                         is.close();
                    } catch (IOException e) {
                         e.printStackTrace();
                    }
                }
            }
        }
      • 4、StudentMapper.java中增加"添加功能"-addStu

          /*
             添加数据方法
          */
         @Insert("INSERT INTO student VALUES (#{number},#{name},#{birthday},#{address})")
         public abstract void addStu(Student stu);

2.5、修改功能的实现

 

 

  • 代码实现

    • html代码

      在stuList.html中增加"修改功能"代码

      //修改数据功能
                 updateStu() {
                     let param = "method=updateStu&number=" + this.editFormData.number + "&name=" + this.editFormData.name +
                         "&birthday=" + this.editFormData.birthday + "&address=" + this.editFormData.address +
                         "&currentPage=" + this.pagination.currentPage + "&pageSize=" + this.pagination.pageSize;
                     axios.post("studentServlet",param)
                        .then(resp => {
                             //将查询出的数据赋值tableData
                             this.tableData = resp.data.list;
                             //设置分页参数
                             //当前页
                             this.pagination.currentPage = resp.data.pageNum;
                             //总条数
                             this.pagination.total = resp.data.total;
                        })
                     //关闭编辑窗口
                     this.dialogTableVisible4edit = false;
                }
    • java代码

      • 1、在StudentServlet.java中增加"修改功能"-updateStu

       /*  修改数据功能  */ private void updateStu(HttpServletRequest req, HttpServletResponse resp) {  //获取请求参数  Map<String, String[]> map = req.getParameterMap();  String currentPage = req.getParameter("currentPage");  String pageSize = req.getParameter("pageSize");  //封装Student对象  Student stu = new Student();  //注册日期转换器方法  dateConvert();  try {   BeanUtils.populate(stu,map);  } catch (Exception e) {   e.printStackTrace();  }  //调用业务层的修改方法  service.updateStu(stu);  //重定向到分页查询功能  try {   resp.sendRedirect(req.getContextPath() + "/studentServlet?method=selectByPage&currentPage=" + currentPage + "&pageSize=" + pageSize);  } catch (IOException e) {   e.printStackTrace();  } }
      • 2、在StudentService.java中增加"修改功能"-updateStu

      /*  修改数据方法  */ public abstract void updateStu(Student stu);
      • 3、StudentServiceImpl.java中增加"修改功能"-updateStu

      	/*	*1、直接复制会报错	*2、需要将此行代码需要添加到"doGet"方法中	*3、增加"updateStu"方法名的判断	 */	else if(method.equals("updateStu")) {   //添加数据功能   updateStu(req,resp);  }	==================================================================================/*  修改数据方法  */ @Override public void updateStu(Student stu) {  InputStream is = null;  SqlSession sqlSession = null;  try{   //1.加载核心配置文件   is = Resources.getResourceAsStream("MyBatisConfig.
      • 4、StudentMapper.java中增加"修改功能"-updateStu

      /*  修改数据方法  */ @Update("UPDATE student SET number=#{number},name=#{name},birthday=#{birthday},address=#{address} WHERE number=#{number}") public abstract void updateStu(Student stu);

2.6、删除功能的实现

  • 代码实现

    • html代码

      在stuList.html中增加"删除功能"代码

      //删除数据功能   deleteStu(row) {    if(confirm("确定要删除" + row.number + "数据?")) {     let param = "method=deleteStu&number=" + row.number +      "&currentPage=" + this.pagination.currentPage + "&pageSize=" + this.pagination.pageSize;     axios.post("studentServlet",param)      .then(resp => {       //将查询出的数据赋值tableData       this.tableData = resp.data.list;       //设置分页参数       //当前页       this.pagination.currentPage = resp.data.pageNum;       //总条数       this.pagination.total = resp.data.total;      })    }   }
    • java代码

      • 1、在StudentServlet.java中增加"删除功能"-

       /*
      *1、直接复制会报错
      *2、需要将此行代码需要添加到"doGet"方法中
      *3、增加"deleteStu"方法名的判断
         */
      else if(method.equals("deleteStu")) {
                 //添加数据功能
                 deleteStu(req,resp);
          }
      ==================================================================================
      ​
      ​
      /*
             删除数据功能
          */
         private void deleteStu(HttpServletRequest req, HttpServletResponse resp) {
             //获取请求参数
             String number = req.getParameter("number");
             String currentPage = req.getParameter("currentPage");
             String pageSize = req.getParameter("pageSize");
      ​
             //调用业务层的删除方法
             service.deleteStu(number);
      ​
             //重定向到分页查询功能
             try {
                 resp.sendRedirect(req.getContextPath() + "/studentServlet?method=selectByPage&currentPage=" + currentPage + "&pageSize=" + pageSize);
            } catch (IOException e) {
                 e.printStackTrace();
            }
        }
      • 2、在StudentService.java中增加"删除功能"-

       /*  删除数据方法  */ public abstract void deleteStu(String number);
      • 3、StudentServiceImpl.java中增加"删除功能"-

      /*
             删除数据方法
          */
         @Override
         public void deleteStu(String number) {
             InputStream is = null;
             SqlSession sqlSession = null;
             try{
                 //1.加载核心配置文件
                 is = Resources.getResourceAsStream("MyBatisConfig.            //2.获取SqlSession工厂对象
                 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
                 //3.通过SqlSession工厂对象获取SqlSession对象
                 sqlSession = sqlSessionFactory.openSession(true);
                 //4.获取StudentMapper接口实现类对象
                 StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
                 //5.调用实现类对象删除方法
                 mapper.deleteStu(number);
            } catch (Exception e) {
                 e.printStackTrace();
            } finally {
                 //6.释放资源
                 if(sqlSession != null) {
                     sqlSession.close();
                }
                 if(is != null) {
                     try {
                         is.close();
                    } catch (IOException e) {
                         e.printStackTrace();
                    }
                }
            }
        }
      • 4、StudentMapper.java中增加"删除功能"-

          /*
             删除数据方法
          */
         @Delete("DELETE FROM student WHERE number=#{number}")
         public abstract void deleteStu(String number);








原文转载:http://www.shaoqun.com/a/586593.html

跨境电商:https://www.ikjzd.com/

mav:https://www.ikjzd.com/w/2414

f2c:https://www.ikjzd.com/w/1242


Vue高级使用:自定义组件,Vue生命周期,Vue异步操作,综合案例学政管理系统登录功能实现,分页查询功能实现,增删改查实现课堂讲义1、Vue高级使用1.1、自定义组件学完了Element组件后,我们会发现组件其实就是自定义的标签。例如<el-button>就是对<button>的封装本质上,组件是带有一个名字且可复用的Vue实例,我们完全可以自己定义定义格式Vue.com
55海淘网:https://www.ikjzd.com/w/1723
贝恩资本:https://www.ikjzd.com/w/1336
e票联:https://www.ikjzd.com/w/1452
哪几种情况需要注册西班牙VAT税号?西班牙VAT增值税相关问题:https://www.ikjzd.com/home/119734
外贸课堂:收美金这样做合法又方便!:https://www.ikjzd.com/home/101723
2020亚马逊乘风破浪-旺季掘金同学会:https://www.ikjzd.com/home/130358