首页
归档
关于
友人帐
Search
1
Mac OS 终端利器 iTerm2 + Oh My Zsh
13,897 阅读
2
前端 History 路由及 API 反向代理的 Nginx 配置
10,595 阅读
3
解决 Xcode Command Line Tools 错误或无法安装问题
6,248 阅读
4
Mac下右键使用VSCode打开项目
3,945 阅读
5
BrowserHistory刷新页面404问题
3,430 阅读
码上世界
内容分享
生活印记
其他
登录
Search
小小孩
累计撰写
95
篇文章
累计收到
181
条评论
首页
栏目
码上世界
内容分享
生活印记
其他
页面
归档
关于
友人帐
搜索到
95
篇与
小小孩
的结果
2020-09-14
十分钟带你了解中国历史
视频版来自B站Director鹤唳云端的视频 BV1n441127jG {dplayer src="https://pro-video.xiaoheiban.cn/202106/25207a88-476c-46ab-bce6-2db3811544d1.mp4"/}文字版来自幕布 tianbin约公元前2500年,涿鹿之战,传说轩辕与蚩尤战于涿鹿公元前2697年,黄帝纪元元年约公元前2070年,禹之子启得“夏”王朝地位公元前1900年前后,太康失国、后羿代夏,相传兄弟五人止于洛,作《五子之歌》约公元前1559年,鸣条之战,商汤打败夏桀,夏朝灭亡约公元前1600年,商汤于鸣条之战灭亡夏后建立商公元前1300年,甲骨文已经是成熟文字公元前1046年,牧野之战,武王克商,商朝灭亡约公元前1046年,武王克商建立周朝,都城在镐,称镐京西周公元前841年,周召共和,国人暴动,逐厉王,周召共和约公元前770年,周平王迁都洛邑,史称东周,春秋时期开始公元前722年,史书《春秋》编年始于此公元前679年,齐桓公称霸,后晋文公、楚庄王、吴王阖闾、越王勾践相继称霸,史称春秋五霸公元前595年,基本确认十九年七闰之法公元前579年,晋楚盟和,春秋时期第一次弥兵会盟公元前536年,郑子产铸刑鼎,刊布成文法公元前498年,孔子周游列国始公元前494年,吴越之战,越王勾践困守会稽山,向吴称臣求和公元前473年,越王勾践消灭吴国苦心人,天不负,卧薪尝胆,三千越甲可吞吴公元前481年,公羊、穀梁本《春秋》编年纪事止公元前453年,三家分晋,战国时期开始公元前479年,孔子逝世,《左传》本春秋编年记事止公元前445年,李悝变法魏文侯任用李悝变法。李悝撰著《法经》公元前403年,周烈王承认韩、赵、魏为诸侯,《资治通鉴》记事始于此年公元前390年,墨子去世,墨子,墨家学派创始人公元前386年,战国七雄,秦、楚、齐、燕、韩、赵、魏的战国七雄局面形成公元前359年,商鞅变法,秦孝公任用商鞅,实施变法约公元前350年,百家争鸣与战国学术的空前繁荣公元前350年,秦迁都咸阳公元前349年,秦推行二十等爵位公元前342年,马陵之战,齐打败魏军,庞涓自杀公元前338年,秦国车裂商鞅公元前334年,魏齐互相称王,为中原诸侯称王始公元前314年,燕国内乱,齐国占领燕国,后退兵公元前307年,胡服骑射,赵武灵王推行“胡服”,教练“骑射”公元前304年,孟子逝世儒家学派代表人物。宣扬“仁政”,最早提出“民贵君轻”的思想公元前390年,庄子逝世继老子之后,道家学派的代表人物公元前288年,齐秦并称东、西帝。不久齐去帝号,合纵抗秦公元前287年,五国攻秦,赵、魏、韩、燕、楚五国联兵攻秦,秦被迫割地给赵、魏以求和公元前278年,楚都郢(ying)被秦将白起攻陷楚国诗人屈原投汨罗江自尽公元前270年,范睢入秦,献“远交近攻”之策公元前260年,秦将白起坑杀四十万降卒,长平之战公元前256年,周朝灭亡,秦国攻入洛邑,西周公投降公元前249年,秦相吕不韦带兵灭位于巩邑的东周公公元前230年,秦灭韩公元前228年,秦灭赵公元前225年,秦灭魏公元前223年,秦灭楚公元前222年,秦灭燕公元前222年,秦灭越公元前221年,秦灭齐公元前221年,秦统一中原约公元前221年,秦王嬴政定尊号“皇帝”,自称为始皇帝公元前221年,统一度量衡,车同轨,书同文公元前220年,秦始筑驰道,秦始皇下令修筑以咸阳为中心的、通往全国各地的驰道公元前214年,秦开凿灵渠,秦始皇下令在湘江和漓江中间开凿人工运河公元前214年,筑长城,秦始皇下令修长城,史称万里长城公元前213年,焚书坑儒,秦始皇焚毁书籍、坑杀“犯禁者四百六十余人”公元前210年,秦始皇死于东巡胡亥继位,假诏赐死长子扶苏公元前209年,揭竿而起,陈胜、吴广“揭竿起义”公元前208年,赵高陷害李斯李斯被腰斩于咸阳,夷三族公元前207年,巨鹿之战,项羽军破釜沉舟大败秦军公元前206年,刘邦攻入关中,秦国灭亡公元前202年,项羽乌江自刎,汉军包围楚军于垓下约公元前202年,西汉,刘邦即皇帝位,是为汉高祖公元前193年,萧何逝世萧何定《九章律》公元前180年,吕后逝世太尉周勃等尽诛诸吕公元前154年,七国之乱,吴王刘濞(pi)联合诸王起兵叛变,为太尉周亚夫率军平定公元前140年,罢黜百家,表章六经汉武帝采董仲舒之议公元前139年,张骞出使西域公元前127年,卫青北击匈奴恢复河南地、陇西、北地、上郡的北部,置朔方、五原二郡公元前121年,霍去病北击匈奴击灭居于河西走廊的匈奴部落,以其地设酒泉郡公元前118年,司马相如逝世著有《子虚赋》、《上林赋》、《长门赋》等公元前90年,司马迁逝世司马迁的《史记》是我国第一部纪传体通史公元前60年,西域都护府汉宣帝正式设立西域都护府公元8年,王莽篡位孺子婴禅让后自立为帝,改国号为新公元10年,五均六筦,盐、铁、酒专卖,政府铸钱,名山大泽产品收税和五均赊贷公元17年,绿林军起义公元18年,赤眉军起义公元23年,昆阳大战,绿林部刘秀与王莽部大战于昆阳,莽军大败公元25年,刘秀为汉光武帝,国号仍为汉,史称东汉或后汉公元37年,东汉统一战争结束公元40年,复用五铢钱民间杂用布帛金票相交易公元67年,蔡愔等取佛经回沙门迦叶摩腾、竺法兰同来公元69-70年,王景主持疏浚黄河,此后黄河安流达600年之久公元73年,班超出使西域此时西域与汉已绝交65年公元92年,史学家班固去世他在父班彪基础上修订《汉书》,未成而死公元100年,许慎《说文解字》首部按部首编排的汉语字典公元100年前后,《九章算术》标识着中国古代数字完整体系形成公元105年,蔡伦改造造纸术公元132年,张衡造侯风地动仪,可测定地震方位公元166年,党锢之祸,东汉末年士人与宦官的一场大规模政治斗争公元190年,群雄割据,董卓胁帝迁都长安公元197年,袁术称帝,后袁术逃往汝南,继续作皇帝公元198年,曹操消灭了吕布的势力公元199年,袁绍消灭了公孙瓒的势力公元200年,官渡之战,曹操击败袁绍,奠定曹操统一北方的基础公元207年,曹操统一北方公元208年,赤壁之战,孙权、刘备联军于赤壁大败曹军公元208年,三国鼎立格局基本奠定公元211年,刘备入蜀公元219年,关羽战死,孙权袭杀关羽,占有荆州全部公元220年,曹操去世,后曹坯追尊曹操为武皇帝,庙号太祖公元220年,汉献帝被迫禅位,曹丕篡汉自立,东汉亡公元221年,刘备于成都称帝,国号仍为“汉”,史称“蜀汉”公元229年,孙权称帝,定都建业公元222年,彝陵之战,陆逊火烧连营,刘备元气大伤公元223年,白帝城刘备驾崩,刘禅继位公元226年,曹丕驾崩。曹睿继位,曹休、曹真、陈群、司马懿辅政公元225年,孟获投降,蜀汉诸葛亮平定南中叛军公元228年,兵出祁山,诸葛亮首次攻魏公元230年,钟繇去世,擅长书法,与晋王羲之并称“钟王”公元234年,五丈原星落,诸葛亮最后一次北伐,同年病死五丈原公元240年,蜀汉大将姜维第一次北伐公元249年,司马懿发动政变史称高平陵之变,诛宗室曹爽公元251、255、257年,淮南三叛结果司马氏铲除反对势力,完全控制魏国大权公元263年,嵇康被杀嵇康与阮籍、山涛、向秀、刘伶、王戎、阮咸合成竹林七贤公元263年,魏灭蜀汉公元265年,司马炎代魏称帝,以晋为国号,史称西晋公元279年,司马炎下令六路晋军攻吴公元280年,吴主孙皓出降西晋灭吴,统一中国公元291年,八王之乱,惠帝皇后贾南风唆使楚王司马玮杀汝南王司马亮公元297年,陈寿去世著有《三国志》公元306年,左思去世《三都赋》颇被当时称颂,造成洛阳纸贵公元311年,永嘉之祸,汉帝刘聪攻陷洛阳,掳晋怀帝司马炽,放火焚宫,屠杀官民公元316年,西晋灭亡,晋愍(min)帝投降被杀公元318年,琅邪王司马睿称帝,东晋开始,南北分裂公元319年,前赵,汉帝刘曜改国号为“赵”公元319年,后赵,后勒称赵王公元337年,前燕,慕容皝称燕王公元338年,成汉,成帝李寿改国号为“汉”公元338年,代,代王拓跋什翼犍自立公元345年,前凉,凉州张骏称凉王,都姑臧,国号“凉”公元350年,氐族人苻洪占据关中,称三秦王,不久为后赵毒杀公元350年,冉魏,冉闵夺后赵政权称帝,国号“魏”,建都邺公元351年,前秦,苻健称帝,定都长安,国号“大秦”公元354-369年,东晋桓温数次北伐公元376年,氐人苻坚统一北方公元366年,敦煌莫高窟始辟此后续有开凿,成为世界上著名的石窟艺术群公元383年,淝水之战,前秦苻坚南下攻打东晋,大败,北方再次分裂公元398年,北魏,拓跋珪称帝,为魏道武帝公元420年,刘宋,刘裕废晋恭帝自立,建国号“宋公元420年,东晋亡,进入“南北朝时期”公元433年,谢灵运去世所作山水诗开一代风起,被视为山水诗派之祖公元450年,国史之狱北魏主持编撰国史的崔浩被杀北魏末年,《齐民要术》,我国现存第一部完整农书公元479年,南齐,萧道成判宋篡位,建国号“齐”公元502年,粱,齐宗室萧衍篡位,史称梁武帝,南齐亡公元485年,北魏孝文帝依汉人李安世之议,颁布均田令公元531年,昭明太子萧统卒主持编订的《文选》是我国现存编选最早的一部文学总集公元534年,北魏分裂魏东魏和西魏公元548年,侯景之乱,东魏降将侯景勾结粱京城守将萧正德,举兵谋反公元555年,后梁,萧詧称帝,并对西魏称臣公元555年,陈,粱权臣陈霸先篡位,建国“陈”,史称陈武帝公元557年,北周,宇文泰的儿子宇文觉建立北周,西魏亡公元579年,外戚杨坚控制北周政权公元581年,杨坚受禅代周称帝,改国号为“隋”,史称隋文帝,北周王公元589年,陈叔宝被俘,隋军攻入建康,南陈亡公元610年,南北大运河贯通公元614年,隋炀帝三伐高句丽婴阳王遣返杨玄感同党斛斯政,隋因而撤军公元617年,太原留守李渊起兵,攻入关中公元618年,李渊代隋称帝,国号唐,是为唐高祖公元626年,宣武门之变,政变,唐高祖李渊让位,成为太上皇,秦王李世民继位,即唐太宗公元627年,贞观之治清明政治,经济复苏,文化繁荣的治世局面公元655年,武昭仪被立为皇后公元640年,文成公主和亲唐派文成公主与吐蕃赞普松赞干布通婚约公元652年,《千金方》,“药王”孙思邈著,被誉为中国最早的临床百科全书公元664年,武后杀宰相上官仪武后权力日盛,与高宗并称“二圣”公元690年,武则天废睿宗,即帝位,改国号“周”公元693年,初唐四杰,杨炯去世,与王勃、卢照邻、骆宾王并称初唐四杰公元705年,唐中宗复辟。张东之等拥太子即位,复国号唐公元713年,开元盛世,唐玄宗李隆基改元开元,而后唐朝国力达到鼎盛约公元720年,彩色釉陶的制作与唐三彩公元753年,鉴真东渡,高僧鉴真东渡日本公元755年,安史之乱,安史之乱爆发,此后藩镇问题成为唐朝最重要的政治问题之一公元756年,马嵬驿兵变,军士哗变,杨国忠、杨贵妃被杀公元760年,吴道子去世画史尊称画圣,人物画称作“吴带当风”公元762年,王维去世诗人、画家,人称“诗中有画,画中有诗”公元762年,李白去世伟大的浪漫主义诗人,被后人誉为“诗仙”公元770年,杜甫去世现实主义诗人杜甫,其诗被誉为“诗史”公元784年,颜真卿遇害其书法端庄雄伟,世称“颜体”公元787年,平凉劫盟唐番关系恶化,战事再起公元791年,吐蕃陷安西都护府,西域自此断绝公元793年,税茶,自此有茶税之称公元806年,元和中心,唐宪宗治国有方,国家政治一度回到正轨的时代公元819年,柳宗元去世与韩愈大力提倡“古文运动”,并称“韩柳”公元835年,甘露之变,唐后期宦官专权达到顶峰公元841年,唐武宗灭佛,唐武宗大规模取缔佛教公元874年,军阀混战时期开始黄巢在冤句起兵,响应王仙芝公元907年,朱温逼迫唐哀宗禅让,唐王,进入五代十国时期公元916年,契丹,耶律阿保机登基称“大圣大明天皇帝”公元940年,赵崇祚编《花间集》我国最早的词总集,收录温庭筠等十八家词,尽显绮丽婉约之风公元947年,契丹改国号为“大辽”契丹耶律德光称帝与开封公元960年,北宋,陈桥兵变,殿前督点检赵匡胤夺取后周帝位,建国号“宋”公元961年,杯酒肆兵权解除大将兵权,重文轻武公元970年,冯继升献“火箭法”标志着火药已正式用于武器制造公元975年,李煜奉表投降宋军攻陷南陵,宋灭南唐公元986年,宋辽大战,宋发兵伐辽,败于岐沟关,杨业殉难公元1004年,澶渊之盟,契丹南下攻宋,宋辽订立“澶渊之盟”公元1043年,庆历新政,范仲淹等主持推行,仅一年而失败公元1069年,王安石变法,宋神宗任王安石为参知政事,推动变法公元1084年,《资治通鉴》,司马光主持编撰《资治通鉴》成书公元1084年,《梦溪笔谈》,沈括撰成《梦溪笔谈》,中国科学史上的里程碑公元1101-1125年,《清明上河图》,中国十大传世名画之作,宋徽宗时期张择端创作公元1038年,西夏,李元昊称帝,即夏景宗,定都兴州并改名兴庆府公元1115年,大金,完颜阿骨打于会宁府建都立国公元1118年,海上之盟,宋、金联合攻辽公元1127年,靖康之变,金兵攻陷宋都汴京,掳走宋帝徽、钦二宗公元1127年,金灭北宋。宗室赵构在南京应天府登基为帝,史称“南宋”公元1130年,宋将韩世忠率八千精兵,堵塞五万金兵在黄天荡四十八天公元1138年,南宋定都临安临安成为全国的政治、经济、文化中心,直至1276年南宋灭亡公元1141年,绍兴和议,宋、金签订绍兴和议,宋朝称臣,并与金以淮河为界公元1142年,岳飞遇害,抗金名将岳飞于风波亭遇害约公元1155年,李清照去世女词人,婉约词派代表公元1175年,鹅湖之会,朱熹、陆九渊、吕祖谦聚于信州鹅湖寺切磋辩论约公元1210年,词在宋代发展到鼎盛时期公元1206年,成吉思汗,铁木真获得尊号“成吉思汗”,建国“大蒙古国”公元1234年,蒙古灭金蒙古与宋联军攻陷蔡州,金哀宗自杀,金末帝死于乱军之中,金亡公元1271年,大元大蒙古国,蒙古改国号为“大元”公元1275年,马克.波罗到达元上都公元1278年,文天祥被俘,后被解往北京,1283年遇害公元1279年,丞相陆秀夫负幼主跳海宋军与崖山海域败于元军公元1247、1281年,元朝皇帝忽必烈两次派军攻打日本公元1280年,帝师八思巴卒,著《彰所知论》,制八思巴文字公元1280年,授时历,定一回归年为365.2425日13世纪后期,黄道婆在松江地区推广面纱纺织技术公元1300年,关汉卿去世著《窦娥冤》等,“元曲四大家”之首公元1313年,《农书》,中国第一部涵盖全国范围的系统农学著作公元1332年,当时铸造的火铳是世界上现存的最早的火铳公元1333年,理学家吴澄去世与许衡并称“南吴北许”14世纪中期,《田家五行》,我国现存最早的农业气象专著公元1351年,红巾之乱,韩山童、刘福通组织民众起事反元,郭子兴、张士诚相继响应公元1355年,朱元璋继领郭子兴部,奉小明王正朔公元1368年,朱元璋于南京称帝,国号“大明”。明军攻占大都,元顺帝逃亡上都。公元1380年,胡惟庸案,丞相胡惟庸被处死,废止宰相公元1405年,下西洋,郑和七次下西洋始公元1407年,《永乐大典》问世,中国古代规模最大的一部类书公元1420年,明成祖迁都北京,北京设东厂公元1529年,哲学家王阳明去世,提出“致良知”,世称阳明心学公元1563年,荡平倭寇,戚继光、俞大猷扫平了东南沿海的倭寇公元1573年,张居正改革,张居正柄政,推行改革公元1596年,《本草纲目》,李时珍考古证今,辩疑订误,广采博收群书著成17世纪初,茶叶始输入欧洲公元1601年,意大利耶稣教会传教士利玛窦获准留居北京传教公元1602年,李贽狱中自杀,著有《焚书》公元1610年,《金瓶梅》刊刻,署名兰陵笑笑生公元1615年,爱新觉罗.努尔哈赤定八旗制公元1618年,七大恨,努尔哈赤以“七大恨”檄文誓师反明公元1621年,“三言”开始刊刻,冯梦龙小说《警世通言》、《醒世恒言》、《喻世明言》公元1628年,“二拍”开始刊刻,凌濛初所作《初刻拍案惊奇》、《二刻拍案惊奇》公元1623年,魏忠贤为东厂长官公元1630年,李自成、张献忠参加起义公元1636年,皇太极称帝,大金改国号“大清”,清朝建立公元1637年,《天工开物》,宋应星著作,中国17世纪的工艺百科全书公元1644年,李自成西安称帝,建国号“大顺”,攻陷北京,明亡公元1644年,清军入据北京公元1661年,郑成功收复台湾从荷兰侵略者手中收复了沦陷38年的中国领土台湾公元1673年,三藩之乱,吴三桂、尚可喜、耿精忠反清公元1682年,顾炎武去世,与黄宗羲、王夫之并称明末清初三大启蒙思想家公元1688年,《长生殿》,清初剧作家洪升创作的传奇公元1709年,修建圆明园公元1723年,雍正秘密立储公元1726年,全面推行“改土归流”公元1763年,曹雪芹去世《红楼梦》八十回已完稿公元1769年,文字狱,销毁钱谦益著作,乾隆帝屡行文字狱公元1782年,《四库全书》问世,中华传统文化最丰富最完备的集成之作公元1790年,徽班进京公元1839年,虎门硝烟,林则徐在广东虎门集中销毁鸦片公元1840年,第一次鸦片战争英国“东方远征军”抵达中国海面公元1842年,《海国图志》,作者魏源,提出“师夷长技以制夷”的中心思想公元1842年,《南京条约》,中英签署南京条约,割让香港给英国公元1851年,太平天国运动,反对清朝封建统治和外国资本主义侵略的农民起义战争公元1856年,第二次鸦片战争,中国因此而 丧失了包括东北和西北共150万平方公里的领土公元1858年,《天津条约》,中国半殖民地半封建统治程度加深公元1860年,火烧圆明园西周英法联军攻入北京,火烧圆明园公元1860年,《北京条约》,进一步加深了中国的半殖民地本封建社会程度公元1861年,垂帘听政,慈禧太后发动政变,两宫皇太后听政公元1864年,天京陷落,洪秀全病逝,天京被湘军所破,太平天国运动失败公元1876年,左宗棠收复新疆,随即上疏建议新疆改设行省公元1894年,甲午战争,日本侵略中国和朝鲜的战争,大大加深了中国社会半殖民地化的程度公元1895年,北洋水师全军覆灭,清与日签订《马关条约》公元1897年,中国通商银行中国自办的第一家商业银行在上海成立公元1898年,《天演论》,严复翻译,宣传了“物竞天择,适者生存”的观点公元1898年,戊戌变法,一次具有爱过救亡意义的变法维新运动公元 1898年,六君子血溅菜市口戊戌变法失败,谭嗣同等六君子被杀公元1900年,义和团运动,一场以“扶清灭洋”为口号的农民运动,沉重打击了清政府的反动统治公元1901年,《辛丑条约》,中国赔款白银4.5亿海关两,俗称“庚子赔款”1905年,中国同盟会,孙中山在日本东京组成,在《民报》中首次提出“三民主义”1909年,京张铁路建成通车,詹天佑设计建造1911年,辛亥革命,推翻了统治中国几千年的君主专制制度,建立起共和政体1912年,孙中山在南京就任中华民国临时大总统1912年,宣统皇帝溥仪宣布退位,清朝正式灭亡
2020年09月14日
706 阅读
0 评论
0 点赞
2020-09-14
JavaScript 中精度问题及简单解决办法
JavaScript 中的数字按照 IEEE 754 的标准,使用 64 位双精度浮点型来表示。其中符号位 S,指数位 E,尾数位M分别占了 1,11,52 位,并且在 ES5 规范 中指出了指数位E的取值范围是 [-1074, 971]。想用有限的位来表示无穷的数字,显然是不可能的,因此会出现一些列精度问题 比如 0.1 + 0.2 !== 0.3解决思路一般是把浮点数转化为字符串,模拟实际运算的过程。以下是 简单的 解决办法// 两个浮点数求和 function fpAdd(num1, num2) { let r1, r2; try { r1 = num1.toString().split('.')[1].length; } catch (e) { r1 = 0; } try { r2 = num2.toString().split(".")[1].length; } catch (e) { r2 = 0; } const m = Math.pow(10, Math.max(r1, r2)); return Math.round(num1 * m + num2 * m) / m; } // 两个浮点数相减 function fpSub(num1, num2) { var r1, r2 try { r1 = num1.toString().split('.')[1].length; } catch (e) { r1 = 0; } try { r2 = num2.toString().split(".")[1].length; } catch (e) { r2 = 0; } const m = Math.pow(10, Math.max(r1, r2)); const n = (r1 >= r2) ? r1 : r2; return (Math.round(num1 * m - num2 * m) / m).toFixed(n); } // 两个浮点数相除 function fpDiv(num1, num2) { var t1, t2 try { t1 = num1.toString().split('.')[1].length; } catch (e) { t1 = 0; } try { t2 = num2.toString().split(".")[1].length; } catch (e) { t2 = 0; } const r1 = Number(num1.toString().replace(".", "")); const r2 = Number(num2.toString().replace(".", "")); return (r1 / r2) * Math.pow(10, t2 - t1); } // 两个浮点数相乘 function fpMul(num1, num2) { const m = 0, s1 = num1.toString(), s2 = num2.toString(); try { m += s1.split(".")[1].length } catch (e) { }; try { m += s2.split(".")[1].length } catch (e) { }; return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m); }
2020年09月14日
722 阅读
0 评论
0 点赞
2020-08-28
H5 移动端开发经常遇到的问题
搜罗了一些 H5 移动端开发经常遇到的问题,来方便以后查阅!还会继续添加!1. 弹出数字键盘<!-- 有"#" "*"符号输入 --> <input type="tel" /> <!-- 纯数字 --> <input pattern="\d*" />安卓跟 IOS 的表现形式应该不一样,大家可以自己试试。当运用了正则 pattern 后,就不用关注 input 的类型了2. 调用系统的某些功能<!-- 拨号 --> <a href="tel:10086">打电话给: 10086</a> <!-- 发送短信 --> <a href="sms:10086">发短信给: 10086</a> <!-- 发送邮件 --> <a href="mailto:839626987@qq.com">发邮件给:839626987@qq.com</a> <!-- 选择照片或者拍摄照片 --> <input type="file" accept="image/*" /> <!-- 选择视频或者拍摄视频 --> <input type="file" accept="video/*" /> <!-- 多选 --> <input type="file" multiple />3. 打开原生应用<a href="weixin://">打开微信</a> <a href="alipays://">打开支付宝</a> <a href="alipays://platformapi/startapp?saId=10000007" >打开支付宝的扫一扫功能</a > <a href="alipays://platformapi/startapp?appId=60000002">打开支付宝的蚂蚁森林</a>这种方式叫做 URL Scheme,是一种协议,一般用来访问 APP 或者 APP 中的某个功能/页面(如唤醒 APP 后打开指定页面或者使用某些功能)😒URL Scheme 的基本格式如下:行为(应用的某个功能/页面) | scheme://[path][?query] | | 应用标识 功能需要的参数一般是由 APP 开发者自己定义,比如规定一些参数或者路径让其他开发者来访问,就像上面的例子 🍤注意事项唤醒 APP 的条件是你的手机已经安装了该 APP某些浏览器会禁用此协议,比如微信内部浏览器(除非开了白名单)4. 解决 active 伪类失效<body ontouchstart></body>给 body 注册一个空事件即可 😂5. 忽略自动识别<!-- 忽略浏览器自动识别数字为电话号码 --> <meta name="format-detection" content="telephone=no" /> <!-- 忽略浏览器自动识别邮箱账号 --> <meta name="format-detection" content="email=no" />当页面上的内容包含了手机号/邮箱等,会自动转换成可点击的链接 😁比如你有如下代码:但是有些浏览器会识别为手机,并且可以点击拨号。6. 解决 input 失焦后页面没有回弹一般出现在 IOS 设备中的微信内部浏览器,出现的条件为:页面高度过小聚焦时,页面需要往上移动的时候所以一般 input 在页面上方或者顶部都不会出现无法回弹 🤣解决办法为,在聚焦时,获取当前滚动条高度,然后失焦时,赋值之前获取的高度:<template> <input type="text" @focus="focus" @blur="blur" /> </template> <script> export default { data() { return { scrollTop: 0 }; }, methods: { focus() { this.scrollTop = document.scrollingElement.scrollTop; }, blur() { document.scrollingElement.scrollTo(0, this.scrollTop); } } }; </script>6. 禁止长按以上行为可以总结成这几个(每个手机以及浏览器的表现形式不一样):长按图片保存、长按选择文字、长按链接/手机号/邮箱时呼出菜单。想要禁止这些浏览器的默认行为,可以使用以下 CSS:// 禁止长按图片保存 img { -webkit-touch-callout: none; pointer-events: none; // 像微信浏览器还是无法禁止,加上这行样式即可 } // 禁止长按选择文字 div { -webkit-user-select: none; } // 禁止长按呼出菜单 div { -webkit-touch-callout: none; }7. 滑动不顺畅,粘手一般出现在 IOS 设备中,自定义盒子使用了 overflow: auto || scroll 后出现的情况。优化代码:div { -webkit-overflow-scrolling: touch; }8. 屏幕旋转为横屏时,字体大小会变具体出现的情况不明 😒,有时候有有时候没有,欢迎指出。优化代码:* { -webkit-text-size-adjust: 100%; }9. 最简单的 rem 自适应大家都知道,rem 的值是根据根元素的字体大小相对计算的,但是我们每个设备的大小不一样,所以根元素的字体大小要动态设置 😂html { font-size: calc(100vw / 3.75); } body { font-size: .14rem; }这是最简单的,稍微复杂的可以使用我正在使用的 rem.js10. 滑动穿透当你想在出现遮罩的时候,锁住用户的滚动行为,你可以这么做。假设 HTML 结构如下: 我是弹框 CSS 样式如下:.mask { position: fixed; top: 0; left: 0; display: flex; justify-content: center; align-items: center; width: 100%; height: 100%; background-color: rgba($color: #333, $alpha: 0.6); .content { padding: 20px; background-color: #fff; width: 300px; } }可以看到,当在遮罩上滑动的时候,是会穿透到父节点的,最简单的办法就是阻住默认行为:document.querySelector(".mask").addEventListener("touchmove", event => { event.preventDefault(); });如果在 vue 中,你可以这么写:<div class="mask" @touchumove.prevent></div> 如果.content 也有滚动条,那么只要阻止遮罩本身就行:document.querySelector(".mask").addEventListener("touchmove", event => { if (event.target.classList.contains("mask")) event.preventDefault(); });或者:<div class="mask" @touchumove.self.prevent></div> 这样,当出现遮罩的时候用户的滑动就会被锁住啦 👌
2020年08月28日
703 阅读
0 评论
1 点赞
2020-07-16
动图展示10大Git命令
作者: Lydia Hallie可视化
2020年07月16日
1,914 阅读
0 评论
0 点赞
2020-07-16
前端 History 路由及 API 反向代理的 Nginx 配置
underscores_in_headers on; location ~ ^/prod-api { rewrite ^/prod-api/(.*)$ /$1 break; proxy_pass http://*****.com; } location ^/file { proxy_pass http://*****.com; } location ~ / { try_files $uri $uri/ /index.html; } #if (!-e $request_filename) { # rewrite ^/(.*) /index.html last; # break; #}
2020年07月16日
10,595 阅读
0 评论
1 点赞
2020-06-01
DockerHub国内镜像设置加速服务
哪些 docker hub 镜像加速目前有许多镜像地址https://docker.mirrors.ustc.edu.cn/ (中国科学技术大学(LUG@USTC)的开源镜像)https://registry.docker-cn.com (docker 官方中国镜像)阿里云的容器镜像服务里也有专属加速器地址 可进 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 查看,大致是 https://xxxxxxxx.mirror.aliyuncs.com我用的当中 属 中国科学技术大学(LUG@USTC)的开源镜像最快配置镜像加速Linux 新版的 Docker 使用镜像配置地址是 /etc/docker/daemon.json 但可能文件不存在sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn","https://registry.docker-cn.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker这时再下 就快多了
2020年06月01日
977 阅读
0 评论
0 点赞
2020-05-29
号天扣地,无自律
说好的晚上少吃点减肥,可在意志在美食面前瞬间土崩瓦解。说好的晚上早睡,一趟床上就刷刷抖音熬到了无人的深夜。说好的周末在家好好学习,可时间就在游戏电影中悄然流逝。说好的要完成几个小目标,可都如同成了被拍死的蚊子尸横遍野。殊不知自己已经成了一个思想上的巨人,行动上的矮子,竟然可笑的为自己那么点努力沾沾自喜,自己依然不知天高地厚。显然已掉入自己给自己编制的陷阱,只会告诉自己“你很好,不怪你”。现在面临难题不是想着怎么解决,而是如何逃避。逃避小人,逃避尔虞我诈,逃避一切。曾经也曾昂扬斗志,激扬愤慨,立下很多 Flag ,现在却好像没有真正的努力奋斗过。正如法国古典文学作家佛朗哥所说:“我们所犯的过错,几乎都比用来掩饰的方法,更值得原谅。”,培养自律的生活方式,首要的功课之一就是破除找借口的倾向!自律并不仅对我们现在的身体有益,在几年后,我们会发现它对于我们在社会上的工作和生活也有很大的影响。因为当我们还是年轻时,犯了错误我们还有再来一次,从头开始的机会,可是在社会上我们就必须为自己的每一次失误或者错误负责而承担后果。时刻提醒自己,做一个自律的人。唯有自律方能践行,唯有践行方能立己。
2020年05月29日
1,079 阅读
2 评论
0 点赞
2020-05-01
Vue3 中的 Proxy API
Object.defineProperty 的一些弊端Vue2.x 中,实现数据的可响应,需要对 Object 和 Array 两种类型采用不同的处理方式。 Object 类型通过 Object.defineProperty 将属性转换成 getter/setter ,这个过程需要递归侦测所有的对象 key,来实现深度的侦测。为了感知 Array 的变化,对 Array 原型上几个改变数组自身的内容的方法做了拦截,虽然实现了对数组的可响应,但也存在一些问题。 同时,defineProperty 通过递归实现 getter/setter 也有一定的性能问题。更好的实现方式是通过 ES6 提供的 Proxy 。Proxy 的一些坑Proxy 具有更加强大的功能, 相比旧的 defineProperty ,Proxy 可以代理数组,并且提供了多个 traps(主要是 get 、 set ) ,可以实现诸多功能。但其中的一些比较容易被忽略的细节。trap 默认行为let data = { info: "info" }; let p = new Proxy(data, { get(target, key, receiver) { return target[key]; }, set(target, key, value, receiver) { console.log("set value"); target[key] = value; // ? } }); p.info = 123;通过 proxy 返回的对象 p 代理了对原始数据的操作,当对 p 设置时,便可以侦测到变化。但是这么写实际上是有问题, 当代理的对象数据是数组时,就会报错。let data = [1, 2]; let p = new Proxy(data, { get(target, key, receiver) { return target[key]; }, set(target, key, value, receiver) { console.log("set value"); target[key] = value; } }); p.push(3); // 报错将代码更改为:let data = [1, 2]; let p = new Proxy(data, { get(target, key, receiver) { return target[key]; }, set(target, key, value, receiver) { console.log("set value"); target[key] = value; return true; } }); p.push(3); // set value 打印 2 次实际上,当代理对象是数组,通过 push 操作,并不只是操作当前数据,push 操作还触发数组本身其他属性更改。let data = [1, 2]; let p = new Proxy(data, { get(target, key, receiver) { console.log("get value:", key); return target[key]; }, set(target, key, value, receiver) { console.log("set value:", key, value); target[key] = value; return true; } }); p.push(3); // get value: push // get value: length // set value: 2 3 // set value: length 3先看 set 操作,从打印输出可以看出,push 操作除了给数组的第 2 位下标设置值 3 ,还给数组的 length 值更改为 3。 同时这个操作还触发了 get 去获取 push 和 length 两个属性。我们可以通过 Reflect 来返回 trap 相应的默认行为,对于 set 操作相对简单,但是一些比较复杂的默认行为处理起来相对繁琐得多,Reflect 的作用就显现出来了。let data = [1, 2]; let p = new Proxy(data, { get(target, key, receiver) { console.log("get value:", key); return Reflect.get(target, key, receiver); }, set(target, key, value, receiver) { console.log("set value:", key, value); return Reflect.set(target, key, value, receiver); } }); p.push(3); // get value: push // get value: length // set value: 2 3 // set value: length 3相比自己处理 set 的默认行为,Reflect 就方便得多。多次触发 set / get当代理对象是数组时,push 操作会触发多次 set 执行,同时,也引发 get 操作,这点非常重要,vue3 就很好的使用了这点。 我们可以从另一个例子来看这个操作:let data = [1, 2, 3]; let p = new Proxy(data, { get(target, key, receiver) { console.log("get value:", key); return Reflect.get(target, key, receiver); }, set(target, key, value, receiver) { console.log("set value:", key, value); return Reflect.set(target, key, value, receiver); } }); p.unshift("a"); // get value: unshift // get value: length // get value: 2 // set value: 3 3 // get value: 1 // set value: 2 2 // get value: 0 // set value: 1 1 // set value: 0 a // set value: length 4可以看到,在对数组做 unshift 操作时,会多次触发 get 和 set 。 仔细观察输出,不难看出,get 先拿数组最末位下标,开辟新的下标 3 存放原有的末位数值,然后再将原数值都往后挪,将 0 下标设置为了 unshift 的值 a ,由此引发了多次 set 操作。而这对于 通知外部操作 显然是不利,我们假设 set 中的 console 是触发外界渲染的 render 函数,那么这个 unshift 操作会引发 多次 render 。我们后面会讲述如何解决相应的这个问题,继续。proxy 只能代理一层let data = { foo: "foo", bar: { key: 1 }, ary: ["a", "b"] }; let p = new Proxy(data, { get(target, key, receiver) { console.log("get value:", key); return Reflect.get(target, key, receiver); }, set(target, key, value, receiver) { console.log("set value:", key, value); return Reflect.set(target, key, value, receiver); } }); p.bar.key = 2; // get value: bar执行代码,可以看到并没有触发 set 的输出,反而是触发了 get ,因为 set 的过程中访问了 bar 这个属性。 由此可见,proxy 代理的对象只能代理到第一层,而对象内部的深度侦测,是需要开发者自己实现的。同样的,对于对象内部的数组也是一样。p.ary.push("c"); // get value: ary同样只走了 get 操作,set 并不能感知到。我们注意到 get/set 还有一个参数:receiver ,对于 receiver ,其实接收的是一个代理对象:let data = { a: { b: { c: 1 } } }; let p = new Proxy(data, { get(target, key, receiver) { console.log(receiver); const res = Reflect.get(target, key, receiver); return res; }, set(target, key, value, receiver) { return Reflect.set(target, key, value, receiver); } }); // Proxy {a: {…}}这里 receiver 输出的是当前代理对象,注意,这是一个已经代理后的对象。let data = { a: { b: { c: 1 } } }; let p = new Proxy(data, { get(target, key, receiver) { const res = Reflect.get(target, key, receiver); console.log(res); return res; }, set(target, key, value, receiver) { return Reflect.set(target, key, value, receiver); } }); // {b: {c: 1} }当我们尝试输出 Reflect.get 返回的值,会发现,当代理的对象是多层结构时,Reflect.get 会返回对象的内层结构。Vue3 如何解决 proxy 中的细节问题Vue3 项目结构采用了 lerna 做 monorepo 风格的代码管理,目前比较多的开源项目切换到了 monorepo 的模式, 比较显著的特征是项目中会有个 packages/ 的文件夹。Vue3 对功能做了很好的模块划分,同时使用 TS 。我们直接在 packages 中找到响应式数据的模块:Vue3 中的 reactivity其中,reactive.ts 文件提供了 reactive 函数,该函数是实现响应式的核心。 同时这个函数也挂载在了全局的 Vue 对象上。这里对源代码做一点程度的简化:const rawToReactive = new WeakMap(); const reactiveToRaw = new WeakMap(); // utils function isObject(val) { return typeof val === "object"; } function hasOwn(val, key) { const hasOwnProperty = Object.prototype.hasOwnProperty; return hasOwnProperty.call(val, key); } // traps function createGetter() { return function get(target, key, receiver) { const res = Reflect.get(target, key, receiver); return isObject(res) ? reactive(res) : res; }; } function set(target, key, val, receiver) { const hadKey = hasOwn(target, key); val = reactiveToRaw.get(val) || val; const result = Reflect.set(target, key, val, receiver); const oldValue = target[key]; if (!hadKey) { console.log("trigger ..."); } else if (val !== oldValue) { console.log("trigger ..."); } return result; } // handler const mutableHandlers = { get: createGetter(), set: set }; // entry function reactive(target) { return createReactiveObject( target, rawToReactive, reactiveToRaw, mutableHandlers ); } function createReactiveObject(target, toProxy, toRaw, baseHandlers) { let observed = toProxy.get(target); // 原数据已经有相应的可响应数据, 返回可响应数据 if (observed !== void 0) { return observed; } // 原数据已经是可响应数据 if (toRaw.has(target)) { return target; } observed = new Proxy(target, baseHandlers); toProxy.set(target, observed); toRaw.set(observed, target); return observed; }rawToReactive 和 reactiveToRaw 是两个弱引用的 Map 结构,这两个 Map 用来保存 原始数据 和 可响应数据 ,在函数 createReactiveObject 中,toProxy和 toRaw 传入的便是这两个 Map 。我们可以通过它们,找到任何代理过的数据是否存在,以及通过代理数据找到原始的数据。除了保存了代理的数据和原始数据,createReactiveObject 函数仅仅是返回了 new Proxy 代理后的对象。 重点在 new Proxy中传入的 handler 参数 baseHandlers。还记得前面提到的 Proxy 实现数据侦测的细节问题吧,我们尝试输入:let data = { foo: "foo", ary: [1, 2] }; let r = reactive(data); r.ary.push(3);打印结果:可以看到打印输出了一次 trigger ...问题一:如何做到深度的侦测数据的 ?深度侦测数据是通过 createGetter 函数实现的,前面提到,当对多层级的对象操作时,set 并不能感知到,但是 get 会触发, 于此同时,利用 Reflect.get() 返回的“多层级对象中内层” ,再对“内层数据”做一次代理。function createGetter() { return function get(target, key, receiver) { const res = Reflect.get(target, key, receiver); return isObject(res) ? reactive(res) : res; }; }可以看到这里判断了 Reflect 返回的数据是否还是对象,如果是对象,则再走一次 proxy,从而获得了对对象内部的侦测。并且,每一次的 proxy 数据,都会保存在 Map 中,访问时会直接从中查找,从而提高性能。当我们打印代理后的对象时:可以看到这个代理后的对象内层并没有代理的标志,这里仅仅是代理外层对象。输出其中一个存储代理数据的 rawToReactiv :对于内层 ary: [1, 2] 的代理,已经被存储在了 rawToReactive 中。由此实现了深度的数据侦测。问题二:如何避免多次 trigger ?function hasOwn(val, key) { const hasOwnProperty = Object.prototype.hasOwnProperty; return hasOwnProperty.call(val, key); } function set(target, key, val, receiver) { console.log(target, key, val); const hadKey = hasOwn(target, key); val = reactiveToRaw.get(val) || val; const result = Reflect.set(target, key, val, receiver); const oldValue = target[key]; if (!hadKey) { console.log("trigger ... is a add OperationType"); } else if (val !== oldValue) { console.log("trigger ... is a set OperationType"); } return result; }关于多次trigger 的问题,vue 处理得很巧妙。在 set 函数中 hasOwn 前打印 console.log(target, key, val) 。let data = ["a", "b"]; let r = reactive(data); r.push("c");r.push('c') 会触发 set 执行两次,一次是值本身 'c' ,一次是 length 属性设置设置值 'c' 时,传入的新增索引 key 为 2,target 是原始的代理对象 ['a', 'c'] ,hasOwn(target, key) 显然返回 false ,这是一个新增的操作,此时可以执行 trigger ... is a add OperationType当传入 key 为 length 时,hasOwn(target, key) ,length 是自身属性,返回 true,此时判断 val !== oldValue, val 是 3, 而 oldValue 即为 target['length'] 也是 3,此时不执行 trigger 输出语句。所以通过 判断 key 是否为 target 自身属性,以及设置 val 是否跟 target[key]相等 可以确定 trigger 的类型,并且避免多余的 trigger总结Vue3 并非简单的通过 Proxy 来递归侦测数据, 而是通过 get 操作来实现内部数据的代理,并且结合 WeakMap 来对数据保存,这将大大提高响应式数据的性能。
2020年05月01日
779 阅读
0 评论
0 点赞
2020-04-04
深切哀悼
为表达全国各族人民对抗击新冠肺炎疫情斗争牺牲烈士和逝世同胞的深切哀悼,国务院今天发布公告,决定2020年4月4日举行全国性哀悼活动。在此期间,全国和驻外使领馆下半旗志哀,全国停止公共娱乐活动。4月4日10时起,全国人民默哀3分钟,汽车、火车、舰船鸣笛,防空警报鸣响。据此,本网站在2020-04-04 这天,所有页面也将变灰来响应哀吊。
2020年04月04日
979 阅读
0 评论
0 点赞
2020-04-01
腾讯Ubuntu云服务器环境初始配置
一、配置 root 登陆腾讯 Ubuntu 云服务器默认用户ubuntu ,又懒得 每次都输 sudo ,所以加上 root 用户1. 设置 root 密码先使用 ubuntu 用户 ssh 登录腾讯云,然后执行命令sudo passwd root2. 修改 ssh 登录的配置/etc/ssh/sshd_config文件,修改为允许 root 登录,可以执行命令sudo vim /etc/ssh/sshd_config注意:这里的 sudo 前缀不可少,否则接下来的修改无法保存。进入 vim 编辑,用方向键向下滚动找到 PermitRootLogin 这项按下 insert 键进入插入模式,将 PermitRootLogin 后面的 prohibit-password 改为 yes,再按下 Esc 键,然后依次按下:键(英文冒号键)、w 键和 q 键,最后按下回车键,保存修改成功。3. 重启 ssh 服务sudo service ssh restart使刚才的 ssh 配置的修改生效,执行命令使用 root 用户登录使用root用户登录 必要的话 可以删除ubuntu 用户删除命令:userdel -r ubuntu二、安装 docker 及 docker-composedocker最方便的方法是使用官方脚本并使用阿里云镜像安装curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun如果您想将 Docker 用作非 root 用户,您现在应该考虑将您的用户添加到“docker”组,例如:可以自行添加用户 (尽量避免使用docker作为用户名)useradd your-usersudo usermod -aG docker your-user请记得注销并重新登录才能生效!docker-compose1. 运行脚本sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose其中 1.24.0 可以切换你想安装的版本2. 对二进制文件应用可执行权限:sudo chmod +x /usr/local/bin/docker-compose注意:如果 docker-compose 安装后命令失败,请检查您的路径。您还可以创建/usr/bin 路径中的符号链接或任何其他目录。 例如:sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose3. 测试安装。docker-compose --version4. 卸载:sudo rm /usr/local/bin/docker-compose三、安装 Nginx因为是ubuntu 系统 不像 centos ,ubuntu 的包都比较新 所以直接用包管理器安装apt-get update apt-get install nginx完成之后 nginx -v 打印出版本号就说明安装成功了四、安装 Node.js因为每个项目可能依赖的 Node 版本不同 这里选用了 nvm 来作为 node 的包管理器 ,它可以方便的在同一台设备上进行多个 node 版本之间切换curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh | bash注意:在 Linux 上,运行安装脚本后,如果 nvm: command not found 在键入后收到或看不到终端的反馈:command -v nvm只需关闭当前终端,打开新终端,然后再次尝试 nvm -v验证。验证成功后就可以安装node.js了nvm 用法要下载,编译和安装最新版本的节点,请执行以下操作:nvm install node # node是最新版本的别名要安装特定版本的节点:nvm install 6.14.4 # 10.10.0,8.9.1 等您可以使用 ls-remote 列出可用版本:nvm ls-remote然后在任何新的 shell 中只使用已安装的版本:五、安装 MongoDB既然我们安装了 docker 我们就用 docker 安装 MongoDB1. 拉取镜像 docker pull mongo # 直接拉去默认tag 为latest 的mongo:latest 镜像2. 使用 mongo 镜像docker run --name mongo -p 27017:27017 -v /mongo/db:/data/db -d mongo命令说明:--name 命名容器名字-p 27017:27017 :将容器的 27017 端口映射到主机的 27017 端口-v /mongo/db:/data/db :将主机中/mongo/db 挂载到容器的/data/db,作为 mongo 数据存储目录3. 查看容器启动情况docker ps可看到 已经运行成功了使用 mongo 镜像执行 mongo 命令连接到刚启动的容器docker run -it mongo:latest mongo六、安装 MongoDB跟安装 MongoDB 一样docker pull mysql:5.6 mkdir -p /mysql/data /mysql/logs /mysql/conf docker run -p 3306:3306 --name mymysql \ -v /mysql/conf:/etc/mysql/conf.d \ -v /mysql/logs:/logs \ -v /mysql/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ -d mysql:5.6命令说明:-p 3306:3306 #将容器的 3306 端口映射到主机的 3306 端口。-v /mysql/conf:/etc/mysql/conf.d #将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。-v /mysql/logs:/logs #将主机当前目录下的 logs 目录挂载到容器的 /logs。-v /mysql/data:/var/lib/mysql #将主机当前目录下的 data 目录挂载到容器的 /var/lib/mysql 。-e MYSQL_ROOT_PASSWORD=123456 #初始化 root 用户的密码。查看容器启动情况docker ps 注意 : mysql 5.7 及以上版本 映射的配置文件目录可能有所不同 详细可取 Docker Hub 查看
2020年04月01日
518 阅读
0 评论
0 点赞
1
...
5
6
7
...
10