2021年3月26日星期五

乍暖还寒天 一件机车夹克可盐可甜

  大部分人对于机车夹克的印象或许还停留在"男性化"、"酷炫帅气"的固有印象中,这与上世纪好莱坞电影中的硬汉形象不无关

图片来源:视觉中国图片来源:视觉中国

  系。美国演员布拉德皮特曾在电影《搏击俱乐部》身着一件红夹克的帅气就让人过目难忘。

图片来源:Pinterest图片来源:Pinterest

  虽然机车夹克起初是出于保护骑行者免受撞伤摩擦的目的而发明出来的,但在与流行文化不断地交汇融合之下,机车夹克已然成为一件时尚单品,隐隐流露出反叛、个性的风格特点。

  实际上,机车夹克在特点鲜明的情况下,仍可以与其他服饰单品融洽地配合,并创造出别具一格的混搭气质。

  如果你曾被机车风张扬的外表所"劝退",那你一定要再给黑色经典款一个机会。机车夹克因为自带气场,所以内搭上无需太费心神。往往一件白色T恤加上牛仔裤就足以完成休闲搭配。

PAIGE Dita 图片来源:NordstromPAIGE Dita 图片来源:Nordstrom

  机车夹克的棱角分明有助于修饰身形,同时,下身穿着紧身牛仔裤可以塑造上宽下窄的修身效果。 

图片来源:Levis图片来源:Levis

  想要再来点不一样的?

  Zara这一身的搭配很适合春夏换季之时。牛仔短裤和白衬衫本身就有潇洒自如的感觉。外搭一件机车夹克不仅能锦上添花,还可以御寒。

图片来源:Zara图片来源:Zara

  时尚达人往往是最好的学习对象。模特Kendall Jennar这两套机车夹克的搭配值得参考。

  外套、裤装和鞋子选择同一颜色,从而突出内搭来塑造层次感。露脐卫衣和套头衫的运动感都能和夹克的机能感无缝衔接。

图片来源:USmagazine图片来源:USmagazine
图片来源:Pinterest图片来源:Pinterest

  然而,机车夹克真正的反转魅力在于兼容并包。如果没有实际看到搭配效果,你可能很难想象机车夹克会和各类裙装碰撞出怎样矛盾又和谐的魅力。

  百褶裙和带褶边装饰的长裙往往代表着一种温柔娴静的气质,但上身套一件机车夹克可以瞬间演变成甜酷风。同时,深浅色的强烈反差进一步加深了这种复杂的魅力。

图片来源:Pinterest图片来源:Pinterest
图片来源:Khaite图片来源:Khaite

  乍暖还寒时,针织长裙也是一个不错的选择。皮革能很好地中和毛线的慵懒感,整体造型看上去休闲而不失精干。


  Acne Studios则提供了阔版和修身两种机车夹克的穿搭指南。Oversize夹克可以考虑稍长一些的裙子,易于营造走路生风的潇洒感。而短夹克与包臀裙是天作之合,能凸显挺拔的身型。此外,善用长围巾除了能保暖还可以发挥为造型增色的作用。

图片来源:Acne Studios图片来源:Acne Studios
图片来源:Acne Studios图片来源:Acne Studios

  黑色大翻领、光泽皮质感、金属纽扣等等确实是机车夹克不变的经典元素。但只要稍作改动,机车夹克的时尚属性会得到显著提高。

  Chloé通过在翻领上叠加绒毛,并在前襟口袋别上小配饰为夹克增添了可爱的元素。

Chloé Fall 2020 RTW 图片来源:VogueChloé Fall 2020 RTW 图片来源:Vogue

  俄国模特Irina Shayk最近街拍的这件机车夹克则巧妙利用了翻领和拉链等部分的颜色反差来塑造甜辣气息。

图片来源:Twitter@thedirectimage.com图片来源:Twitter@thedirectimage.com

  其实,机车夹克也可以通过改变整体面料材质和颜色来满足不同的穿搭需求。

图片来源:Whistles图片来源:Whistles
图片来源:Whistles图片来源:Whistles
图片来源:Whistles图片来源:Whistles

  此时,脱离了基本款的黄金指南,选择多样的机车夹克就需要依靠大家自己的时尚嗅觉了。


原文转载:http://fashion.shaoqun.com/a/371742.html

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

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

铭宣海淘:https://www.ikjzd.com/w/1551


大部分人对于机车夹克的印象或许还停留在"男性化"、"酷炫帅气"的固有印象中,这与上世纪好莱坞电影中的硬汉形象不无关图片来源:视觉中国  系。美国演员布拉德皮特曾在电影《搏击俱乐部》身着一件红夹克的帅气就让人过目难忘。图片来源:Pinterest  虽然机车夹克起初是出于保护骑行者免受撞伤摩擦的目的而发明出来的,但在与流行文化不断地交汇融合之下,机车夹克已然成为一件时尚单品,隐隐流露出反叛、个性的风
taofenba:https://www.ikjzd.com/w/1725
虚拟信用卡:https://www.ikjzd.com/w/1055
aca:https://www.ikjzd.com/w/1371
OpenSky:https://www.ikjzd.com/w/430
Add-on Item:https://www.ikjzd.com/w/61
电商热潮之下 Shopify能否挑战亚马逊?:https://www.ikjzd.com/home/132296

时尚圈也有比特币 4.5亿元数字艺术品的魅力|NFT|数字艺术品|区块链

  时尚圈、艺术界的新宠儿——NFT,近来热潮不断。如果为2021开年这三个月评选历史时刻的话,NFT当仁不让。

  上周就爆出了NFT大新闻,一副NFT艺术品拍卖成交价4.5亿人民币。它的名字叫"Everydays: The First 5000 Days",由5000张不一样的画拼合成。虽然这幅作品被买走了,但我们仍旧能在网上免费查阅到5000张里部分画作。从某种程度上,可以说买家买走的其实就是这张大画作在区块链上的版权——一些数据代码。

4.5亿NFT艺术品4.5亿NFT艺术品

  4.5亿NFT艺术品的创作者是Beeple,他之前还卖出过高达660万美元的10秒短视频NFT,我们同样能在网上免费浏览。Beeple本人是一位集时尚气质和艺术气息一体的NFT创作者,他本人很优秀,不仅曾与Justin Bieber、Eminem等明星合作过演唱会视觉设计,还曾被Louis Vuitton选中,把他的作品印在2019春夏季成衣系列上。

Louis Vuitton 2019春夏系列Louis Vuitton 2019春夏系列

  不光是图片和视频,甚至一张NFT动图(gif)都能卖出高价。

  这只装饰有Gucci标识的小鬼魂,名叫"Gucci Ghost Yellow Aqua",创作者Trevor Andrew第一次售卖的价格仅为200美元,一共卖出45副。如今,它的拥有人之一挂出单幅待售价格16300美元,直接翻了815倍。

"Gucci Ghost Yellow Aqua"在NFT售卖平台上售价

  原本默默无闻的NFT,以势如破竹的气势闯入我们眼中。据《福布斯》报道,2021年仅过了两个月的时间,NFT市场已经价值2.5亿美元,并将继续增长。那它究竟是什么呢?

  NFT是数据资产 拥有时尚感艺术性

  NFT是一种数据资产,是区块链上的一个项目,全称Non-Fungible Token。想理解NFT,必须先了解区块链。

  区块链是一个宏观的科技技术术语。如果普通人去理解,通俗来讲,它是一个"存储海量数据"的名词性称呼,所记录的内容可被确保不被伪造、不被销毁、完全透明、数据安全。

  如果说区块链在金融圈有具体化名的话,可以狭隘地称为比特币。而在时尚圈、艺术界,区块链更多代指的是近两年刚兴起的NFT。


  有业内人士通俗幽默地解释,NFT就好比给阳澄湖的大闸蟹配上专属码,里面登记了这只螃蟹的各类基础及重要信息,包括出生地、体重、身份、水域等等信息。每只螃蟹一个专属码,绝对不重样。

  如果想为一些艺术品标记身份,NFT是最好的选择。它像是这些时尚物、艺术品的所有权凭证,每一个NFT拥有独特且唯一的标识,不可复制、便于交易、无法伪造。

  NFT诞生于2015年左右,2017年成为主流。当年一个叫做CryptoPunks的项目,可以免费领取NFT像素风头像,任何一个头像都设计得十分怪诞有趣且独一无二。几个月后,NFT衍生出CryptoKitties网上撸猫项目,拥有两种以上的猫咪还能培育出卡通图案的新品种猫仔。无论是像素风头像,还是卡通猫咪,都是具备绘画感和艺术特质,拥有它们是一件非常时髦的事情。

  NFT极具时尚性、艺术感,这两种特质在它诞生之初就已有端倪。

CryptoPunks像素风头像项目CryptoPunks像素风头像项目
CryptoKitties网上撸猫项目CryptoKitties网上撸猫项目

  NFT囊括的类型很多,任何时尚又艺术的产品都能成为它,比方一段NBA球星扣篮视频、限量版音乐专辑、有珍藏意义的门票、一件游戏道具,它甚至还有可能是一件虚拟的时装。

LeBron James视频NFT售价20.8万美元LeBron James视频NFT售价20.8万美元  

  NFT时装鞋履 买它从不计较价格

  越来越多人对数字时尚感兴趣,加之NFT特殊的属性和大量的类别,NFT在时尚方面发展潜力巨大。数字设计师Nicole Zisman认为,NFT将对时尚圈产生正向、积极的利益传输。

  前文提到过,NFT也有时装形态。2020年初,历史上第一件NFT时装在纽约Ethereal Summit区块链拍卖会上成交,价格高达9500美元,约合人民币6.1万元。

Iridescence虚拟时装NFT上身图Iridescence虚拟时装NFT上身图

  这件虚拟时装还拥有自己的名称——Iridescence,它由芬兰数字时尚公司The Fabricant与Instagram最火的AR滤镜设计师们共同打造。买家目前仅能通过图片或者其他数字化形式"穿着"它,效果有点类似于皇帝的新衣,实际上买家并没有上身。

  然而,买家Richard Ma却认为,虚拟时装是势不可挡的大趋势。未来十年,普通人消费虚拟时装也会如同去商场购物一样便捷。第一件虚拟时装的收藏价值无可取代,它拥有绝妙的电影渲染效果,不输高定时装。

Iridescence虚拟时装NFTIridescence虚拟时装NFT

  时装领域的NFT还未遍地开花,但鞋界的NFT已出现了不少的花骨朵。最近,虚拟时尚潮牌RTFKT Studios与18岁艺术家Fewocious联名推出三款NFT鞋,一共621对鞋7分钟内迅速售罄,平均每分钟卖出将近90双,这场新概念时尚为品牌和艺术家净赚310万美元。

18岁艺术家Fewocious拿着NFT运动鞋实体版18岁艺术家Fewocious拿着NFT运动鞋实体版

  这并不是RTFKT Studios第一次售卖虚拟球鞋。2020年初,RTFKT Studios发售了一双灵感源自特斯拉推出的电动皮卡Cybertruck的鞋履,当时以15000美元的价格出售。特斯拉CEO Elon Musk 选择让自己2018年Met Gala红毯图"穿上"这双鞋,实际上现场图里Musk穿的是一双黑皮鞋,虚拟NFT鞋是后期设计上去的。


  RTFKT Studios创始人之一Steven Vasilev表示:"对于数字受众来说,我们将自己视为新时代的Supreme。"他们的销售业绩、雄心壮志以及COVID-19对于网络使用时长的增加,让这个NFT品牌的影响力日益增强。

RTFKT Studios NFT虚拟鞋RTFKT Studios NFT虚拟鞋

  买家以"AR滤镜"方式穿着这类时尚NFT。他们把自己的"买家秀"发布到各类社交平台。某种程度上,这有点像是在真实世界买到游戏世界的玩家道具。

  有分析师直言,RTFKT Studios成立短短一年就能获得成功,足以证明NFT对于Gucci、Saint Laurent和Prada等奢侈品牌来说更是一个天然的流量池,有望为即将饱和的奢侈时尚行业打开一个全新的空间。

  在NFT边缘试探 时尚品牌暗自布局

  《福布斯》曾将区块链技术列为奢侈品行业重点关注的趋势之一。虽然时尚品牌未有具体的NFT产品公布,但他们一直在NFT边缘试探。

  动作之一就是利用NFT"拥有独特且唯一标识"的特性做出追踪系统。2019年5月,LVMH集团表示将推出其首个全球区块链认证平台Aura,主要是为了帮助消费者针对Louis Vuitton及Christian Dior香水线全程追溯来源、认证产品信息,这些数据内容只会透露给购买该产品的消费者。

  ConsenSys是AURA的主要技术合作伙伴之一,ConsenSys认为AURA是奢侈品行业的突破性创新,致力于为整个奢侈品行业服务,利用区块链技术基于NFT标准,保护每个品牌的利益,诚信和隐私。


  同年,Nike也于2019年12月尝试了NFT,设计出了CryptoKicks运行平台,耐克和顾客都可以通过识别码依托区块链技术追踪产品所有权,并验证其真实性。小众潮牌1017 ALYX 9SM与EVRYTHNG 平台联手,也合作研究相同原理的追踪系统。

  无论是奢侈品、大众品牌,亦或小众品牌,都把目光投放在NFT之上,以此为技术手段利用区块链提升消费者的体验感、降低自身利益受损程度,缓和假货横行的现状。


  时尚品牌的动作之二是试水具备NFT虚拟特性的时装产物。实际上,消费者对虚拟产品的需求已经以指数级的速度增长。全球综合数据统计库Statista最新研究表明,消费者在"皮肤"——即修改视频游戏角色外观方面的支出到2022年底将达到500亿美元。

  时装品牌甚至已经进入了虚拟的时尚生态系统。今年3月,Gucci与时尚科技公司Wanna合作,首次推出了一款数字运动鞋,可以在其应用程序上以11.99美元的价格购买,在Wanna的应用程序上以8.99美元的价格购买。该运动鞋由Gucci创意总监Alessandro Michele设计,也是Wanna公司的首款原创数字产品。


  早些时候,Gucci在"PokèmonGo"游戏中引入了North Face合作,它还与虚拟形象科技公司 Genies 进一步加深合作,设计出新的穿着各种Gucci单品的虚拟形象。上周,Vogue Business主办的时尚与技术会议上,Gucci执行副总裁Robert Triefus表示,不可避免的是奢侈品牌将开始设计NFT,Gucci尚未涉足市场本身,但是三到四年来,它一直在进入虚拟空间。


  上周关于虚拟时装动态的新闻不止这些。Burberry在微博上公布与王者荣耀合作为游戏角色打造皮肤,在宣传片里Burberry经典Trench风衣的质地、纹理清晰可见,与真实世界别无二样。早前,Louis Vuitton与英雄联盟的合作,Valentino、Marc Jacobs与动森的合作,Balenciaga秋冬21系列借用的游戏视频理念,都预示品牌们其实都在暗自为虚拟时尚、NFT未来铺路。


  "我认为,将来我能以数字方式拥有服装,而不仅仅是像游戏皮肤这样的参数。这些时装NFT使我能够在任何虚拟空间中四处走动。"科技配件公司Higround首席执行官Rustin Sotoodeh期盼。

  LVMH首席数字顾问Ian Rogers表示:"豪华客户现在拥有数字化生活,他们自然希望将产品融入这些生活中,购买豪华手袋并将其数字表示形式带入视频游戏或其他数字环境的想法离我们并不遥远。"

  不过,NFT不是被所有人都看好的产物。加密货币企业家Charlie Lee质疑NFT时表示:"NFT未来的成功取决于如何说服关键人群,让他们相信是值得拥有,并且在未来保持其价值。持怀疑态度的人可能会提到上世纪90年代的Beanie Babies现象,当时人们花成百上千美元购买了价值10美元的毛绒收藏品,结果只看到市场崩溃,而且永不复苏。"


原文转载:http://fashion.shaoqun.com/a/371730.html

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

壹米滴答:https://www.ikjzd.com/w/2314

aca:https://www.ikjzd.com/w/1371


时尚圈、艺术界的新宠儿——NFT,近来热潮不断。如果为2021开年这三个月评选历史时刻的话,NFT当仁不让。  上周就爆出了NFT大新闻,一副NFT艺术品拍卖成交价4.5亿人民币。它的名字叫"Everydays:TheFirst5000Days",由5000张不一样的画拼合成。虽然这幅作品被买走了,但我们仍旧能在网上免费查阅到5000张里部分画作。从某种程度上,可以说买家买走的其实就是这张大画作在
代购公司:https://www.ikjzd.com/w/1982
trax:https://www.ikjzd.com/w/1489
heap:https://www.ikjzd.com/w/2012
Top100:https://www.ikjzd.com/w/462
亚马逊减少广告位,"僧多粥少"卖家广告费暴涨!:https://www.ikjzd.com/home/126352
秘籍!2020亚马逊Prime Day爆款产品分析:https://www.ikjzd.com/home/125354

Java 中的阻塞队列


本文部分摘自《Java 并发编程的艺术》


阻塞队列概述

阻塞队列(BlockingQueue)是一个支持两个附加操作的队列,这两个附加的操作支持阻塞的插入和移除方法:

  • 支持阻塞的插入方法:意思是当队列为满时,队列会阻塞插入元素的线程,直到队列不为满
  • 支持阻塞的移除方法:意思是当队列为空时,获取元素的线程会等待队列变为非空

阻塞队列通常用在生产者和消费者的场景,生产者是向队列添加元素的线程,消费者是从队列获取元素的线程。阻塞队列就是生产者用来存放元素,消费者用来获取元素的容器

在阻塞队列不可用时,这两个附加操作提供了四种处理方式:

抛出异常返回特殊值一直阻塞超时退出
插入方法add(o)offer(o)put(o)offer(o, timeout, timeunit)
移除方法remove(o)poll()take(o)poll(o, timeout, timeunit)
检查方法element()peek()
  • 抛出异常

    当队列满时,如果再往队列里插入元素,会抛出 IllegalStateException 异常。当队列空时,从队列里获取元素会抛出 NoSuchElementException 异常

  • 返回特殊值

    当往队列插入元素,会返回元素是否插入成功,成功返回 true,否则返回 false。如果是移除方法,则是从队列里取出一个元素,如果没有则返回 null

  • 一直阻塞

    当阻塞队列满时,如果生产者线程往队列里 put 元素,队列会一直阻塞生产者线程,直到队列可用或者响应中断。当队列为空时,如果消费者线程从队列里 take 元素,队列会阻塞消费者线程,直到队列不为空

  • 超时退出

    当阻塞队列满时,如果生产者线程往队列里插入元素,队列会阻塞生产者线程一段时间,如果超过了指定的时间,生产者线程就会退出


Java 里的阻塞队列

JDK7 提供了 7 个阻塞队列,如下:

1. ArrayBlockingQueue

ArrayBlockingQueue 是一个用数组实现的有界阻塞队列,此队列按照先进先出(FIFO)的原则对元素进行排序,默认情况下不保证线程公平的访问队列

2. LinkedBlockingQueue

LinkedBlockingQueue 是一个用链表实现的有界阻塞队列,此队列的默认和最大长度为 Integer.MAX_VALUE,此队列按照先进先出的原则对元素进行排序

3. PriorityBlockingQueue

PriorityBlockingQueue 是一个支持优先级的无界阻塞队列,默认情况下元素采取自然顺序升序排序,也可以定义类实现 compareTo() 方法来指定元素排序规则,或者初始化队列时,指定构造参数 Comparator

4. DelayQueue

DelayQueue 是一个支持延时获取元素的无界阻塞队列,队列使用 PriorityQueue 来实现,队列中的元素必须实现 Delay 接口,在创建元素时可以指定多久才能从队列中获取当前元素,只有延迟期满才能从队列中提取元素

DelayQueue 可以运用在以下应用场景:

  • 缓存系统的设计:可以用 DelayQueue 保证缓存元素的有效期,使用一个线程循环查询 DelayQueue,一旦能从中获取元素,表示缓存有效期到了
  • 定时任务调度:使用 DelayQueue 保存当天将会执行的任务和执行时间,一旦从 DelayQueue 中获取到任务就开始执行

5. SynchronousQueue

SynchronousQueue 是一个不存储元素的阻塞队列,每一个 put 操作必须等待一个 take 操作,否则不能继续添加元素

6. LinkedTransferQueue

LinkedTransferQueue 是一个由链表结构组成的无界阻塞队列 TransferQueue 队列,相对于其他阻塞队列,LinkedTransferQueue 多了 tryTransfer 和 transfer 方法

  • transfer 方法

    如果当前有消费者正在等待接收元素(消费者使用 take 方法或带时间限制的 poll 方法时),transfer 方法可以把生产者传入的元素立刻 transfer(传输)给消费者。如果没有消费者在等待接收元素,transfer 方法会将元素存放在队列的 tail 节点,并等到该元素被消费者消费了才返回

  • tryTransfer 方法

    tryTransfer 方法是用来试探生产者传入的元素是否能直接传给消费者,如果没有消费者等待接收元素,则返回 false,和 transfer 方法的区别是 tryTransfer 方法无论消费者是否接收,方法立即返回,也可以带上时间限制

7. LinkedBlockingDeque

LinkedBlockingDeque 是一个由链表结构组成的双向阻塞队列,因为多了一个操作队列的入口,在多线程同时入队时,也就少了一半的竞争










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

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

1淘网:https://www.ikjzd.com/w/1698

浩方:https://www.ikjzd.com/w/1046


本文部分摘自《Java并发编程的艺术》阻塞队列概述阻塞队列(BlockingQueue)是一个支持两个附加操作的队列,这两个附加的操作支持阻塞的插入和移除方法:支持阻塞的插入方法:意思是当队列为满时,队列会阻塞插入元素的线程,直到队列不为满支持阻塞的移除方法:意思是当队列为空时,获取元素的线程会等待队列变为非空阻塞队列通常用在生产者和消费者的场景,生产者是向队列添加元素的线程,消费者是从队列获取元
优1宝贝:https://www.ikjzd.com/w/1507
电霸:https://www.ikjzd.com/w/2597
首信易支付:https://www.ikjzd.com/w/1841
Wayfair平台有哪些与众不同的地方?:https://www.ikjzd.com/home/104487
那些年我踩过Deal 站外的坑,希望能够帮你!:https://www.ikjzd.com/home/137248
四国准备统一货币,对跨境贸易有哪些好处?:https://www.ikjzd.com/home/102923

使用 VS Code 安装 Vue CLI一步步搭建 Vue 项目的初始环境

  在2019年我就通过vs code开发过多个前后端分离的vue项目。之前一直没总结把开发历程记录下来。最近从零开始重新折腾一遍,也遇到不少坑,记录一下。

一、VS Code 安装及配置

  vscode的安装就太简单了,略过。安装好后,配置一下中文,输入chinese,选第一个简体如图  


二、Node,Npm安装及配置   

      到Node官网下载最新版的安装包,https://npm.taobao.org/mirrors/node/v14.16.0/node-v14.16.0-x64.msi。使用国内镜像会快很多,具体安装步骤就不细说了,Node安装包会自带Npm的。       


  

安装完后,在 cmd中确认一下是否成功,如果查询版本号正常返回说明node跟npm都已安装好        


  这里我们可以更改node.js默认下载依赖的位置。在自己安装的node.js文件夹中新建一个node_cache和node_global文件夹,接下来在cmd分别中输入:

     npm config set prefix "F:\program\nodejs\node_global" 

       npm config set cache "F:\program\nodejs\node_cache"

  更改好了目录,可以去文件夹下面看一下是否创建成功,node_global会及时创建,node_cache是在下载文件之后才会创建的。

  由于npm官方地址下载包一般很慢,继续使用以下cmd命令更换为淘宝镜像源。

  npm set registry https://registry.npm.taobao.org  

三、Vue,Vue-cli ,Webpack安装

在vs code终端中执行:npm install -g vue-cli,出现如下界面表示vue安装完成。 

  

如果提示:npm: 无法将"npm "项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。否则表示未安装node.js,请重新安装node.js即可。

  如果设置了npm的全局路径为F:\program\nodejs\node_global,则vue会安装到此位置。此时一定要把该路径配置到环境变量Path中,在我的电脑属性中点开以下标红处编辑。     


 

        如上图所示,因为我已经安装了webpack,所以上图中也有webpack的路径。再输入 npm install vue-cli -g  安装vue-cli,-g表示全局安装。webpack的安装继续在cmd中输入 npm install -D webpack-cli 即可。到此所需要的环境          已经全部安装完成了,下面来创建一个vue项目。 

四、创建Vue 项目

  在vs code中打开一个空的文件夹,然后在"终端"中输入:vue init webpack vue_demo,其中vue_demo可以自行修改。 如果此时出现如下提示:

  无法加载文件 F:\program\nodejs\node_global\node_global\vue.ps1,因为在此系统上禁止运行脚本。解决这个问题只需要在cmd中输入以下命令 set-ExecutionPolicy RemoteSigned 解决:    


     至此,还可能会因为网络问题无法下载vue tample的问题,最近github被墙的很厉害。这里推荐一种免费的范强方式,github 搜索 xx-net,具体使用方法有详细的文档。我最后是通过配置好xx-net,才把vue项目创建成功的,不然               很多包会下载超时导致很多奇怪的问题。          


   最后项目创建成功后的vs code界面是这样的,目录上很多文件不知道啥意思不用紧张,下篇会详细讲解:     


        如果vue文件没有彩色提示,全是黑的,还需要再安装Vetur插件:  


 

 

 

 

 

 

 

 

 

 

 

 

 

顺便把Debugger for Chrome也装一下,后面调试的时候有用。在终端输入:npm run dev  启动起来,如果项目启动了没自动打开浏览器,只要在项目根目录下找到package.json,然后打开该文件,在文件中的script脚本命令的dev行加入–open就可以了,如图所示:

看到下图,到此,全部安装过程完成了。


 

 

 

 

 

 

 

 

 

 

 

 

下一篇继续讲解vue项目的文件结构内容。 









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

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

一淘网:https://www.ikjzd.com/w/1698

coles:https://www.ikjzd.com/w/2506


在2019年我就通过vscode开发过多个前后端分离的vue项目。之前一直没总结把开发历程记录下来。最近从零开始重新折腾一遍,也遇到不少坑,记录一下。一、VSCode安装及配置  vscode的安装就太简单了,略过。安装好后,配置一下中文,输入chinese,选第一个简体如图  二、Node,Npm安装及配置 到Node官网下载最新版的安装包,https://npm.taobao.org/mirr
跨境通:https://www.ikjzd.com/w/1329
yiqu:https://www.ikjzd.com/w/210
cb体系:https://www.ikjzd.com/w/2063
康明凯:中国正试图骗取全球统治地位,我们不能让它发生:https://www.ikjzd.com/home/13034
速卖通"李佳琦"出现了!快来围观! :https://www.ikjzd.com/home/123780
史上最前沿的测评养号系统,亚马逊测评如何降低成本,提高效率,搭建稳定的IP环境?:https://www.ikjzd.com/home/132151

Spring源码之注解扫描Component-scan

本文主要介绍Spring的component-scan标签,了解spring是如何实现扫描注解进行bean的注册,主要实现实在 NamespaceHandler, NamespaceHandlerSupport 和 BeanDefinitionParser 三个接口中,还需要配置spring.handlers文件,在接下里的源码解析中会详细解析,在本篇博客中将使用ApplicationConntext作为起点,直接从差异开始讲解,如果想了解ApplicationContext 源码的全流程请看上篇博客。

GItHub:https://github.com/lantaoGitHub/spring-framework.git

这里解析解释一下他们之间的关系:

NamespaceHandlerSupport 是 Abstract 修饰的抽象类 并 实现 NamespaceHandler 接口,继而实现了 NamespaceHandler接口的parser和docreate方法,自定的NamespaceHandler需要继承NamespaceHandlerSupport类并需要实现NamespaceHandler接口的init方法,init方法需要做解析类的注册操作,代码如下:

package org.springframework.context.config;import org.springframework.beans.factory.
/** * Subclasses can call this to register the supplied {@link BeanDefinitionParser} to * handle the specified element. The element name is the local (non-namespace qualified) * name. */protected final void registerBeanDefinitionParser(String elementName, BeanDefinitionParser parser) {	this.parsers.put(elementName, parser);}

BeanDefinitionParser类是解析类的顶层接口,自定义的解析类需要实现BeanDefinitionParser类的Parser方法,解析类的注册就在NameSpaceHandler的init方法中进行;

  • 还是先看一下测试类:
package lantao.scan;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPath

<?

因为这里使用ApplicationContext,ApplicationContext在上篇文章已经进行了源码解读,接下来我们直接看差异点。

  • 差异代码在DefaultBeanDefinitionDocumentReader类中的parseBeanDefinitions方法中:
/** * Parse the elements at the root level in the document: * "import", "alias", "bean". * @param root the DOM root element of the document */protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) {	//验证

主要差异就在 parseDefaultElement(ele, delegate) 和 delegate.parseCustomElement(ele) 方法上,parseDefaultElement方法仅仅会处理node的namespace是:其他标签自定义标签全部都是通过这个方法来解析的;

  • delegate.parseCustomElement源码:
@Nullablepublic BeanDefinition parseCustomElement(Element ele) {	return parseCustomElement(ele, null);}@Nullablepublic BeanDefinition parseCustomElement(Element ele, @Nullable BeanDefinition containingBd) {	// 获取node的 NameSpaceURI	String namespaceUri = getNamespaceURI(ele);	if (namespaceUri == null) {		return null;	}	// 解析自定义标签 需要在 Meta-inf 文件加 增加 spring.handlers 文件 例如:http\://www.springframework.org/schema/context=org.springframework.context.config.ContextNamespaceHandler	// 根据指定的 NameSpaceURI 获取 NamespaceHandler handler可以参考spring.handlers文件	// abstract NamespaceHandlerSupport 实现了 NamespaceHandler 接口,继而实现了 NamespaceHandler 的两个个方法(parser,docreate),自定义handler 需要实现 NamespaceHandlerSupport 类	// 进行 NamespaceHandler 类的 init 方法的 实现, 主要是做注册 BeanDefinitionParser( registerBeanDefinitionParser ) , 需要自定义解析类 继承 BeanDefinitionParser 类	NamespaceHandler handler = this.readerContext.getNamespaceHandlerResolver().resolve(namespaceUri);	if (handler == null) {		error("Unable to locate Spring NamespaceHandler for 

这里代码很简单,只做了以下三件事情:

1:获取Element的NamespaceUri;

2:通过命名空间处理解析器(NamespaceHandlerResolver)的resolver方法进行NameSpaceHandler的处理;

3:通过NameSpaceHandler的Parse方法进行标签解析;

  • 我们直接看 resolve方法:
/** * Locate the {@link NamespaceHandler} for the supplied namespace URI * from the configured mappings. * @param namespaceUri the relevant namespace URI * @return the located {@link NamespaceHandler}, or {@code null} if none found */@Override@Nullablepublic NamespaceHandler resolve(String namespaceUri) {  // 这里获取的是所有注册到 handlerMappings 中的 NamespaceHandler , 	// 就是 resource/META-INF/spring.handler 中的类 key就是namespaceUri ,	// 这些类都继承了 NamespaceHandlerSupport 实现了init方法 在init方法中进行 BeanDefinitionParse 的注册	Map<String, Object> handlerMappings = getHandlerMappings();	// 通过 namespaceUri 在 handlerMappings 中获取对应的处理器或者 className 如果是初始化过的就直接返回,反之进行类初始化工作	Object handlerOrClassName = handlerMappings.get(namespaceUri);	if (handlerOrClassName == null) {		return null;	}	else if (handlerOrClassName instanceof NamespaceHandler) {		return (NamespaceHandler) handlerOrClassName;	}	else {		String className = (String) handlerOrClassName;		try {			// 实例化			Class<?> handlerClass = ClassUtils.forName(className, this.classLoader);			// 判断实例化的类的超类或者超级接口 是否是 NamespaceHandler			if (!NamespaceHandler.class.isAssignableFrom(handlerClass)) {					throw new FatalBeanException("Class [" + className + "] for namespace [" + namespaceUri +						"] does not implement the [" + NamespaceHandler.class.getName() + "] interface");			}			NamespaceHandler namespaceHandler = (NamespaceHandler) BeanUtils.instantiateClass(handlerClass);			// 注册 自定义标签所对应的 解析策略类 解析策略类都继承了 BeanDefinitionParser ,比如 ComponentScanBeanDefinitionParser			namespaceHandler.init();			// 放入缓存中			handlerMappings.put(namespaceUri, namespaceHandler);			return namespaceHandler;		}		catch (ClassNotFoundException ex) {				throw new FatalBeanException("Could not find NamespaceHandler class [" + className +						"] for namespace [" + namespaceUri + "]", ex);		}		catch (LinkageError err) {			throw new FatalBeanException("Unresolvable class definition for NamespaceHandler class [" +						className + "] for namespace [" + namespaceUri + "]", err);		}	}}

这里主要做了一件事情,就是获取nameSpaceUri对应的NameSpaceHandler,首先会调动getHandlerMappings方法获取全部的NameSpaceHandler,然后通过namespaceUri获取对应的NameSpaceHandler,如果还未实例化则进行实例化操作执行init方法向parsers注册解析类,反之直接返回;getHandlerMappings方法获取的NameSpaceHandler是解析于resource/META-INF/spring.handler 文件下, key就是namespaceUri,value就是自定义的NameSpaceHandler;

  • getHandlerMappings方法源码:
/** * Load the specified NamespaceHandler mappings lazily. */private Map<String, Object> getHandlerMappings() {	Map<String, Object> handlerMappings = this.handlerMappings;	if (handlerMappings == null) {		synchronized (this) {			handlerMappings = this.handlerMappings;			if (handlerMappings == null) {				if (logger.isTraceEnabled()) {					logger.trace("Loading NamespaceHandler mappings from [" + this.handlerMappingsLocation + "]");				}				try {					// 这里的handlerMappingsLocation指定的地址就是 resources 中的 META-INF/spring.handlers					Properties mappings =								PropertiesLoaderUtils.loadAllProperties(this.handlerMappingsLocation, this.classLoader);					if (logger.isTraceEnabled()) {						logger.trace("Loaded NamespaceHandler mappings: " + mappings);					}					handlerMappings = new ConcurrentHashMap<>(mappings.size());					CollectionUtils.mergePropertiesIntoMap(mappings, handlerMappings);					this.handlerMappings = handlerMappings;				}				catch (IOException ex) {					throw new IllegalStateException(								"Unable to load NamespaceHandler mappings from location [" + this.handlerMappingsLocation + "]", ex);				}			}		}	}	return handlerMappings;}

getHandlerMappings就是解析spring.handler文件和执行NameSpaceHandler的init方法并放入缓存的操作,NameSpaceHandler获取到了以后我们看一下init注册的BeanDefinitionParser的parser方法;

  • NameSpaceHandlerSupport的parse方法源码:
/** * Parses the supplied {@link Element} by delegating to the {@link BeanDefinitionParser} that is * registered for that {@link Element}. */@Override@Nullablepublic BeanDefinition parse(Element element, ParserContext parserContext) {	// 在 NamespaceHandlerSupport 中的 parser 集合中获取 BeanDefinitionParser 的实现类 进行 parser	BeanDefinitionParser parser = findParserForElement(element, parserContext);	return (parser != null ? parser.parse(element, parserContext) : null);}

parse方法做了两件事情:

1:通过定义的标签属性(例如:component-scan)获取对应的BeanDefinitionParser解析类,源码如下:

/** * Locates the {@link BeanDefinitionParser} from the register implementations using * the local name of the supplied {@link Element}. */@Nullableprivate BeanDefinitionParser findParserForElement(Element element, ParserContext parserContext) {	// 这里判断各种标签的解析策略 获取标签名字	String localName = parserContext.getDelegate().getLocalName(element);	// 从 parsers 中获取对应的解析策略类 parsers 是在 NameSpaceHandler 的 init 方法是初始化的;	BeanDefinitionParser parser = this.parsers.get(localName);	if (parser == null) {		parserContext.getReaderContext().fatal(				"Cannot locate BeanDefinitionParser for element [" + localName + "]", element);	}	// 返回对应的策略类进行解析	return parser;}

2:开始解析;

  • parse方法源码:
@Override@Nullablepublic BeanDefinition parse(Element element, ParserContext parserContext) {	// 获取 basePackage 的 路径	String basePackage = element.getAttribute(BASE_PACKAGE_ATTRIBUTE);	// 解析给定文本中的${.},将其替换为由{@link #getProperty}解析的相应属性值 就是可以使用 ${} 和 properties中的值对应	basePackage = parserContext.getReaderContext().getEnvironment().resolvePlaceholders(basePackage);	//我们这里在设置 base-package 的值时, 可以通过上面指示的分隔符 ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS 进行多个package的指定. 可以使用"," ";" "\t\n(回车符)"来分割多个包名	String[] basePackages = StringUtils.tokenizeToStringArray(basePackage,			ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS);	// Actually scan for bean definitions and register them.	// 下面的代码就是 实际扫描bean定义并注册它们。	// 配置 ClassPathBeanDefinitionScanner	ClassPathBeanDefinitionScanner scanner = configureScanner(parserContext, element);	// 扫描 并 注册	Set<BeanDefinitionHolder> beanDefinitions = scanner.doScan(basePackages);	// 处理 annotation-config	registerComponents(parserContext.getReaderContext(), beanDefinitions, element);	return null;}

parse方法主要做了以下五件事情:

1:获取basePackage的值,就是

2:basePackage可以配置多个,使用 ',' ';' 或者回车符 进行分割;

3:初始化ClassPathBeanDefinitionScanner,后边的解析操作有ClassPathBeanDefinitionScanner来完成;

4:扫描并注册bean;

5:处理annotation-config(这个后续会详细讲解,这里就不赘述了)

  • 先看一下configureScanner方法源码:
protected ClassPathBeanDefinitionScanner configureScanner(ParserContext parserContext, Element element) {	boolean useDefaultFilters = true;	// 设置 use-default-filters 标签 use-default-filters 属性的默认值为 true,即使用默认的 Filter 进行包扫描,而默认的 Filter 对标有 @Service,@Controller和@Repository 的注解的类进行扫描	if (element.hasAttribute(USE_DEFAULT_FILTERS_ATTRIBUTE)) {		useDefaultFilters = Boolean.valueOf(element.getAttribute(USE_DEFAULT_FILTERS_ATTRIBUTE));	}	// Delegate bean definition registration to scanner class.	// 将注册Bean的任务委托给ClassPathBeanDefinitionScanner类。初始化 ClassPathBeanDefinitionScanner ,ClassPathBeanDefinitionScanner 是解析conponentScanner 的类	ClassPathBeanDefinitionScanner scanner = createScanner(parserContext.getReaderContext(), useDefaultFilters);		scanner.setBeanDefinitionDefaults(parserContext.getDelegate().getBeanDefinitionDefaults());		scanner.setAutowireCandidatePatterns(parserContext.getDelegate().getAutowireCandidatePatterns());	// set RESOURCE_PATTERN_ATTRIBUTE 设置 扫描Resource(资源) 路径 默认为 "**/*.class"	if (element.hasAttribute(RESOURCE_PATTERN_ATTRIBUTE)) {		scanner.setResourcePattern(element.getAttribute(RESOURCE_PATTERN_ATTRIBUTE));	}	try {		// set name-generator		// 初始化bean 名称生成器		parseBeanNameGenerator(element, scanner);	}	catch (Exception ex) {		parserContext.getReaderContext().error(ex.getMessage(), parserContext.extractSource(element), ex.getCause());	}	try {		// 设置bean作用域		parseScope(element, scanner);	}	catch (Exception ex) {		parserContext.getReaderContext().error(ex.getMessage(), parserContext.extractSource(element), ex.getCause());	}	// 设置扫描包含 和 排除的 注解	// 设置过滤器,即用于指定哪些类需要被处理,哪些类需要被忽略	// set INCLUDE_FILTER_ELEMENT and EXCLUDE_FILTER_ELEMENT	parseTypeFilters(element, scanner, parserContext);	return scanner;}

configureScanner方法主要做了以下五件事:

1:获取并设置use-default-filters,use-default-filters 属性的默认值为 true,即使用默认的 Filter 进行包扫描,而默认的 Filter 对标有 @Service,@Controller和@Repository 的注解的类进行扫描,如果设置为false,则需要自行对include-filter添加;

2:初始化ClassPathBeanDefinitionScanner,如果use-default-filters为true则对include-filter进行add操作;

3:初始化bean 名称生成器;

4:设置bean作用域;

5:设置扫描包含 和 排除的 注解,include-filter和exclude-filter;

上述代码就不展现了,git上代码有对应的注释;

  • 接下来看scanner.doScan方法:
/** * Perform a scan within the specified base packages, * returning the registered bean definitions. * <p>This method does <i>not</i> register an annotation config processor * but rather leaves this up to the caller. * @param basePackages the packages to check for annotated classes * @return set of beans registered if any for tooling registration purposes (never {@code null}) */protected Set<BeanDefinitionHolder> doScan(String... basePackages) {	Assert.notEmpty(basePackages, "At least one base package must be specified");	Set<BeanDefinitionHolder> beanDefinitions = new LinkedHashSet<>();	// 循环扫描	for (String basePackage : basePackages) {		// 获取指定包下所有 BeanDefinition		Set<BeanDefinition> candidates = findCandidateComponents(basePackage);		for (BeanDefinition candidate : candidates) {			// 获取一个ScopeMetadata对象,默认为AnnotationScopeMetadataResolver			// 如果目标类未被@Scope注解,则返回一个默认的ScopeMetadata			ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(candidate);			candidate.setScope(scopeMetadata.getScopeName());			// 使用bean名称生成器生成bean名称,默认生成器为AnnotationBeanNameGenerator			// 首先是以注解的value为bean名称,如果注解的value没有值,则使用默认的名称			String beanName = this.beanNameGenerator.generateBeanName(candidate, this.registry);			if (candidate instanceof AbstractBeanDefinition) {				postProcessBeanDefinition((AbstractBeanDefinition) candidate, beanName);			}			if (candidate instanceof AnnotatedBeanDefinition) {				// 处理定义在目标类上的注解,包括@Lazy, @Primary, @DependsOn, @Role, @Description				// 这里会检查和 设置 AnnotatedBeanDefinition 的 @Lazy(懒加载) @Primary(主要,https://www.cnblogs.com/liaojie970/p/7885106.html) @DependsOn(需要依赖但不需要持有) 注解					AnnotationConfigUtils.processCommonDefinitionAnnotations((AnnotatedBeanDefinition) candidate);			}			// 检查beanName是否已经存在 BeanDefinitionRegistry 中存在。			if (checkCandidate(beanName, candidate)) {				//beanName 还没使用过				BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(candidate, beanName);				// 如果有必要,则创建作用域代理				// 如果创建了代理,则返回表示代理对象的BeanDefinitionHolder				definitionHolder =							AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);				beanDefinitions.add(definitionHolder);				// 注册Bean				registerBeanDefinition(definitionHolder, this.registry);			}		}	}	return beanDefinitions;}

在doScan方法中都做了什么:

1:获取指定包下(指定的basePackage)所有 BeanDefinition;

2:获取一个ScopeMetadata对象,默认为AnnotationScopeMetadataResolver,如果目标类未被@Scope注解,则返回一个默认的ScopeMetadata;

3:使用bean名称生成器生成bean名称,默认生成器为AnnotationBeanNameGenerator,如果注解上的value值是null,则需要生成;

4:设置AutowireCandidate autowire-candidate="false" 表示该对象不参与自动注入,借鉴:https://blog.csdn.net/shangboerds/article/details/72758095

5:处理定义在目标类上的注解,包括@Lazy, @Primary, @DependsOn, @Role, @Description,这里会检查和设置 AnnotatedBeanDefinition 的 @Lazy(懒加载) @Primary(主要,https://www.cnblogs.com/liaojie970/p/7885106.html) @DependsOn(需要依赖但不需要持有) 注解;

6:检查beanName是否已经存在 beanDefinitionMap 中存在;

7:如果设置了scopedProxyMode,则需要创建代理类和注册代理类;

8:调用registerBeanDefinition注册bean,就是put到beanDefinitionMap中;

  • 这里只说核心的scanCandidateComponents方法,其他的方法都很简单,读者自行通过debug来做就可以了:
private Set<BeanDefinition> scanCandidateComponents(String basePackage) {	Set<BeanDefinition> candidates = new LinkedHashSet<>();	try {		// ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX = "classpath*:";		// 通过观察resolveBasePackage()方法的实现, 我们可以在设置basePackage时, 使用形如${}的占位符, Spring会在这里进行替换		// this.resourcePattern 默认为 "**/*.class" resourcePattern 可以在

这里主要就是做了通过ResourcePatternResolver的getResource获取指定路径的资源文件,再通过资源文件Resource获取MetadataReader (元数据就是用来定义数据的数据 就是定义 class 的 属性),接下来通过isCandidateComponent方法来做核心处理,因为通过路径获取的资源是全部的,不是想要的,通过isCandidateComponent方法来做 ncludeFilters excludeFilters 的判断,再通过isCandidateComponent(sbd)判断BeanDefinition必须是一个实现类,不可以是接口等;

  • 我们看一下核心判断方法isCandidateComponent:
 /** 	 * Determine whether the given class does not match any exclude filter 	 * and does match at least one include filter. 	 * @param metadataReader the ASM ClassReader for the class 	 * @return whether the class qualifies as a candidate component 	 */ 	protected boolean isCandidateComponent(MetadataReader metadataReader) throws IOException { 		// 判断 excludeFilters 的 TypeFilter 		for (TypeFilter tf : this.excludeFilters) { 			if (tf.match(metadataReader, getMetadataReaderFactory())) { 				return false; 			} 		} 		// 判断逻辑 includeFilters 中的 TypeFilter 默认包含的filter有 @components 和 引用他的 @service @controller @Repository 		for (TypeFilter tf : this.includeFilters) { 			if (tf.match(metadataReader, getMetadataReaderFactory())) { 				// 判断 @Conditional , @Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件给容器注册bean。 还有 @ConditionalOnXX 等注解 				return isConditionMatch(metadataReader); 			} 		} 		return false; 	}
/** * Determine whether the given bean definition qualifies as candidate. * <p>The default implementation checks whether the class is not an interface * and not dependent on an enclosing class. * <p>Can be overridden in subclasses. * @param beanDefinition the bean definition to check * @return whether the bean definition qualifies as a candidate component */ protected boolean isCandidateComponent(AnnotatedBeanDefinition beanDefinition) { 	AnnotationMetadata metadata = beanDefinition.getMetadata(); 	// metadata.isIndependent() 是独立的 & 	// metadata.isConcrete() 是否是接口或者是抽象类 或 	// 必须是抽象类 和 有@lookup 注解 	return (metadata.isIndependent() && (metadata.isConcrete() || 			(metadata.isAbstract() && metadata.hasAnnotatedMethods(Lookup.class.getName())))); }

到这里就已经讲完了Component-scan扫描注入的源码,这里涉及代理和annotation-config没有做详细的讲解,会在后续的文章中做,码字不易,转发请注明出处。

1615879776045-153328









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

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

亚马逊 海外购:https://www.ikjzd.com/w/998

rfq:https://www.ikjzd.com/w/251


本文主要介绍Spring的component-scan标签,了解spring是如何实现扫描注解进行bean的注册,主要实现实在NamespaceHandler,NamespaceHandlerSupport和BeanDefinitionParser三个接口中,还需要配置spring.handlers文件,在接下里的源码解析中会详细解析,在本篇博客中将使用ApplicationConntext作为起
百思买:https://www.ikjzd.com/w/394
万国邮政联盟:https://www.ikjzd.com/w/861
c88:https://www.ikjzd.com/w/1017
亚马逊后台更新!这些美国订单也要征税了!:https://www.ikjzd.com/home/136708
赶紧下架!这款热卖产品品牌已被律所代理!:https://www.ikjzd.com/home/102268
拼多多的多多国际店铺如何上传商品?:https://www.ikjzd.com/home/59773

编程学习:MYSQL数据库编码原理



在mysql编码面有两个概念,大家都不需要知道的。一个是 字符编码"character set"和校验编码"collations"。下面我们来说说这个两个东西。

1、 什么是字符集"character set"

数据库都有字符集,字符集是一个非常大的概念,字符集,规定了不同字符的编码方式,一个字符集就是一组符号和编码。

举个例子,我们常说的"ASCII字符集",就是包括数字、大小写字母、分号、换行等的符合的集合,编码方式按照一定的规律和要求进行排序的编码集合。

如字母A的编码是65。ASCII只规定了英文字母的编码,不是因为字母的(如中文字符)是那个用ASCII编码表示的。

正因为如此,每个国家都会为自己国家的语言做了编码,我国的就是GB2312编码。如果你的网站要用多语言,就要用utf8编码,因为utf8编码是一个国际通用编码,

utf8编码对世界所有语言文字进行了编码。对于这些编码有一个包含的概念,如GB2312编码包含ASCII字符,

UTF8编码包含GB2312字符和ASCII字符。如果网站要用多语言,最合适的就是应该用utf8编码。

我们在使用文本存储时候,无处不在的都涉及到编码问题。我们常用的mysql数据库是支持多字符集的,

并且,支持在不同的字符集之间转换,这方便不同字符集直接的移植并支持多语言,我们在迁移(移植)mysql数据库的时候就要注意,

否则就会发生数据库乱码问题。关于此有一些常用术语,你是应该了解:

字符:汉字、英文字母、标点符号、拉丁文等等。

编码:将字符换成计算机存储的格式,如ASCII将字母A变成65进行存储。

字符集:一组字符以及对应的编码方式。

2、 什么是校验"collations"

"collations"是"校验"的意思。这个校验编码都是在mysql数据库中使用,其作用是指导mysql对字符的比较,和整理。

我们在进行网页开发过程中,大家基本上可以忽略collations校验,我们使用数据库中默认的校验编码就可以了。 


 

另外如果你想更好的提升你的编程能力,学好C语言C++编程!弯道超车,快人一步!笔者这里或许可以帮到你~

分享(源码、项目实战视频、项目笔记,基础入门教程)

欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!

编程学习:


 

编程学习:


 









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

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

打折网:https://www.ikjzd.com/w/74

picitup:https://www.ikjzd.com/w/446


在mysql编码面有两个概念,大家都不需要知道的。一个是字符编码"characterset"和校验编码"collations"。下面我们来说说这个两个东西。1、什么是字符集"characterset"数据库都有字符集,字符集是一个非常大的概念,字符集,规定了不同字符的编码方式,一个字符集就是一组符号和编码。举个例子,我们常说的"ASCII字符集",就是包括数字、大小写字母、分号、换行等的符合的集合
网易考拉海购大促:https://www.ikjzd.com/w/1052
白色清关:https://www.ikjzd.com/w/1410
宝贝格子:https://www.ikjzd.com/w/1322
Sprout Social:https://www.ikjzd.com/w/391
亚马逊开始删评,清帐号?!这个黑五到底怎么过?:https://www.ikjzd.com/home/111419
口述:身为律师的我们犯了重婚罪(4/4):http://lady.shaoqun.com/m/a/46917.html