- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563344 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174226
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
HTML 知识点(未完)
* C3 V n7 g c! y( {% L$ m, I5 ]' O
HTML 知识点' y5 v2 }4 h4 D+ f9 s
" e6 T: x5 x; C4 ]
三列布局- (高度已知,左右宽度固定,中间自适应)' v4 M* K8 }5 R* o. _4 E
; `$ [; {( \) _. ]9 ?2 p6 z
布局方案 优点 缺点3 J% O: R0 E4 }) W! P( [7 _# R
浮动 兼容性好 脱离文档流,需清除浮动
/ b8 Y5 x7 N" {" I& Q# ?绝对定位 比较快捷。 因为其本身脱离了文档流,导致了其子元素都脱离了文档流,使用性较差。' r/ X# l; s2 W m1 ~! n; l1 n
flex布局 目前是比较完美的方案。 只兼容到ie9。# r; Y0 C$ c, ^* u
表格布局 兼容性好,当需要兼容ie8时可以用表格布局。 多栏布局时,某栏高度增加,会使其他栏高度一起增加。
1 x4 n* g) {$ ?' X网格布局 新技术,代码量少
# J! A- n# q3 ]+ g$ V' Q<!-- 网格布局 -->( T/ x/ S( e: z2 G
<body>% ]" _1 Y: `7 `
<section class="layout grid">
( K8 q+ d Y' c7 p6 _" A! E) \9 [ <style media="screen">5 I \" ^$ P0 D/ H2 c
.layout.grid .left-right-center{
i" ^+ L! V+ p1 F: ^ |1 T display: grid;$ Y6 }5 ~" e( T1 o6 | }. v: M8 J
width: 100%;
% W" J# q' Q% Z/ F2 a9 Z grid-template-rows: 100px; // 设置行高
. Q5 }* d6 A" e. P9 s grid-template-columns: 300px auto 300px; // 设置每列的宽度5 V& w$ ^' \) u$ f- g$ a. V
6 Z/ L) J5 R% F b9 s5 f3 R
</style>
6 V, M; \' S# ~+ i+ |0 L <article class="left-right-center">
, b1 k7 L8 i& M: i7 o1 O <div class="left"></div>
7 w# W1 X; w/ ]$ F: z <div class="center"></div>0 A! Q. P) b% Q* ^ y9 ]
<div class="right"></div>! Y2 G/ ^. ^" m4 `9 M8 d
</article>
# l' K' @. y+ D$ `/ h8 c </section>
5 u. v% N! b: y2 F6 U$ @& a- ~</body>
7 F! @5 C9 @! P& @; r! l) z
$ G8 _3 M: ^ E2 w& ecss盒模型; h* \- e: F! Q8 h' Z" l0 s/ w
* e3 w6 k% v( O% q1 u
CSS盒模型的认识
D$ o" k8 V$ ?& B+ r* h3 e4 l- ~) q7 c
css属性: content padding border margin
- T! b5 [5 q# L3 ^8 I
5 \2 W% q b- N" B2 g( n$ ^0 l两种模型:IE盒模型(怪异盒模型)和 标准盒模型% {# d. N5 [9 O7 c$ A* F5 P
; t3 N* Y' A1 ~4 ]2 j7 L: c7 e
两种模型的区别:计算高度和宽度的不同
, I! n' [! b' m& [. D1 p7 Z
$ c1 D" k4 y2 ]) S两种模型如何设置:box-sizing: content-box(标准盒模型); box-sizing: border-box(IE盒模型) N' T8 J; g- _- b3 E* a# H
+ x0 Q( A/ u) `% IJS如何设置获取盒模型对应的宽和高; Y9 j0 z0 S" W
2 q# ?+ q$ y9 |获取方式 优缺点 r3 \" N0 D( s5 V
dom.style.width/height 只能获取内联样式设置的宽和高 W4 o# K0 G9 C- j: _6 Z# v
dom.current style.width 获取浏览器渲染后的宽和高,只支持ie* Q3 F( q& A- I7 N
window.getcomputedstyle(dom).width 兼容性更好' l- X9 R/ U- m: W% Y& h
dom.getboundingclentreact().width 适用于取元素的绝对位置。能取到 left top width height 四个属性 。// 获取浏览器渲染后的宽和高一般用于获取元素绝对位置1 e' Z- I9 a1 ?
实例题 (根据盒模型解释边距重叠)子元素边距成了父元素边距* N. Q$ R O( F
. e7 r" F1 b% z d块级元素包含了子块级元素,子元素是100像素- I7 W( Y- J( B; S2 ~' p
子元素与父元素上边距是10像素3 M+ W3 b: s4 K, s# P! N
父元素是110px还是100px (100px, 设置了overflow:hidden就成了110px)& r! M8 T3 Q; c3 h8 P+ g) x& r
另一种兄弟块级元素-, t4 |0 g, J9 `; {! u2 h' {( p
5 R7 ?( V$ a" f- K6 X" I1 Y% c F
挨着每个都有上边距或每个都有下边距。-2 e" b$ a2 ? f0 o
该重叠的原则就是取最大值4 L5 F9 J/ C8 m' v2 A
空元素的边距-取margin-top和margin-bottom的最大值
4 ]' O$ g6 Q, g7 H0 B) @解决方案:) f( a2 P) O8 w
" t0 ~) q: J, ]& x1 w# m# o& b
父元素创建成一个BFC (无论父子,兄弟情况)% T( p8 z9 n4 T& I+ R
4 i1 V4 P, p4 a0 Z: p' J4. BFC (边距重叠解决方案)
) H) t2 ]1 c0 B! B
* ]' K3 F! d# Y. H/ xBFC(边距重叠解决方案)4 j% j3 B2 O% f$ Z
4 _6 B ?, `, n( V1、BFC的基本概念: 块级格式化上下文;
5 u+ @: j6 ?! ]& K1 T, p: X6 P" Y w' \6 U& `
2、BFC的原理:BFC的渲染规则。2 b6 l9 G. T- D% g4 [
! Y$ a9 b ]+ t
①:在BFC这个元素的垂直方向的边距会发生重叠。(同一个BFC下外边距会发生重叠)
4 b' j' g- Q5 ?' `! C2 J- S' _' a
②:BFC的区域不会与浮动元素的box重叠。(清除浮动), k0 p3 e: p* }
! v v; `3 @5 i
③:BFC在页面上是一个独立的容器,外面的元素不会影响里面的元素,里面的元素也不会影响外面的元素。' e, A- J) D7 Y5 B6 R/ i0 S
( h" D3 h: {3 h' e6 L0 ?# X④:计算BFC高度时,浮动元素也会参与计算: U9 m/ z* i2 {8 c- r
$ D7 e7 b ^3 r2 `8 I) _ ~
3、如何创建BFC
* d6 m1 ~3 h# d4 P1 X- l/ y
' \" ^0 P6 K5 e' i①:float不为none。
q- g0 c6 A" E7 h2 c# A$ t6 r$ q5 f' j3 M# G! q
②:position不为static或者relative。
% }3 g, i0 ]( v$ I7 Y5 \1 |. c$ s/ ^' i, ~8 O( `
③:display为inline-block或者是table相关的。
; e ~- a* F6 g, n
( K/ K, s8 ?6 u' m4 b4 O) @④:overflow不为visible。2 N; v1 c9 K L4 M
% r: H; n) X, V) [
⑤ : body 根元素7 j5 s; ]1 U& J7 X
+ A( E1 d! b9 {8 j* f应用场景:
& _' i3 }2 z7 n7 l左右布局时,float
4 X& b) {2 w$ d9 e6 T) X相邻div使用margin产生边距重叠$ V# G( L! w) A; ~" b- s; A" h
dom事件3 ]! W4 [3 @0 e1 B5 Q. a, M- I
+ v1 B n" E9 b* [/ L4 S9 Z
基本概念: DOM事件的级别$ l( \1 T* K m- k) V
' L9 e5 b/ Y! w) JDOM0: element.οnclick=function()$ {; S! T' u9 g4 D: q2 ]; H# b4 q
; q. m& F: d% Y' XDOM2: element.addEventListener(‘click’, function(){}, false)& s+ H/ n: ~% l& t
- d3 v4 x' v6 IDOM3: element.addEventListener(‘keyup’, function(){}, false)
1 x( k: I9 k8 y
& y6 w2 b; _+ z; F ?& |DOM事件模型3 u! a; D6 k# }6 ?8 E; V& @7 Y
# P a3 R/ o9 A3 o+ h7 { H
event.target 2. event.currentTarget5 O# b; ~, j% R) q) t2 u. ^
event.target指向引起触发事件的元素,而event.currentTarget则是事件绑定的元素' j7 R) `! {5 R2 K* o, r
DOM事件流
, T3 D# D" ~7 I
6 @* C" |8 }& z P3 t事件流 -->《捕获》 2. 目标阶段 3. 冒泡, }! a& r7 i" S( a$ T2 O
描述DOM事件捕获的具体流程3 T& h; D3 f& V( r, F
& G. j! Y& e7 N2 L. `" }1 B
window 2. document 3. html 4. body 5. 按html结构 6. 目标元素1 X3 e; n' r* m8 [( m' j
Event对象的常见应用4 ^& h# b1 H3 j u8 {6 x
- u7 c+ ~- Y8 T1 h) L+ u
e.preventDefault() 2. e.stopPropagation() 3. e.stopImmediatePropagation() 4. e.currentTarget() 5. e.target()
+ U v9 O2 @0 |( U/ h. Z& g% j自定义事件
3 G+ _) z+ Z1 n9 c0 \+ S7 V8 K% k5 E0 t6 X& F+ W
var eve = new Event('custome');( G- ~2 t7 v4 H/ n5 F$ b
ev.addEventListener('custome', function() {) A9 B: B1 @* o1 g. C9 e/ i
console.log('custome');
8 M- G" k8 |4 I});
+ \) I, L* p. x+ Q7 bev.dispatchEvent(eve);( _& }$ e# e( A, O
1# @! F9 S8 N# k4 N% K, `
2
; k4 }7 g+ n/ E2 V' l3/ a4 t% J6 W; c. ~+ Y
4
0 k( u* {- x. Q! l" U; ]2 K- P55 R) P. {( G: e1 p, H0 N9 s
http协议
: [. a, |6 r, N+ X# X
( l8 t6 @( L9 w9 _! _/ F7 v0 DHTTP协议的主要特点
o4 z Z5 n0 b2 i* {8 ]& x# c- B6 O# H" j4 l+ a# p
简单快速(资源的URI是固定的,输入URI)、灵活(头部分有不同数据类型,一个http协议不同传输)、
8 r. |' m1 m B; s: {9 Z- Z( g C+ O/ U2 f/ O' r/ g) I/ w/ O
无连接(连接一次就断掉)
% ], ^: h, p- o( e: r+ M' A5 A. j无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。
- Q: j2 n0 x- ~无状态(两次连接身份)
+ t& v' n& F( A' M! J是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传
: X/ n2 R D9 f) v$ D; FHTTP报文的组成部分1 Q& N4 C& G# ~, m9 H
' q+ ^1 ]9 ?7 n! ?1 y4 A# [: U
请求报文
$ }1 F* ^% ?+ r, f8 Y7 f1 j% D. O# p7 q# Y
请求行 请求头 空行 请求体4 u$ S9 {; ^8 J& x# i' d1 Z+ Z$ A
# O" ^! Q! k* [响应报文! ]+ Y7 a5 T% t( w$ x
" p* E. A+ W: v }) U- j状态行 响应头 空行 响应体
$ n! d& D' M) |' t7 C+ ^! }
; o P& `5 ?" [ _$ z0 p x% I' ~1 AHTTP方法) c* `/ N r% e1 K& q- }( v
! E3 I1 y: S3 k# e% s$ j( _2 S方法名 方法作用 注意0 s z: ^6 @- }1 p
GET 获取资源 % `+ c4 ]' K- t- [
POST 传输资源 ) E* W" a. g! p
PUT 更新资源
" D) M9 ~* s, \. s+ xDELETE 删除资源 1 Q( {$ ?8 \+ s _9 m
HEAD 获得报文首部
8 `) T# U3 r( F( O o. \ e. DPOST和GET的区别
+ A. X. `' C5 g
7 L3 _4 U/ p* i' R9 tget post7 }5 L$ E+ {- j2 X- Z* E/ I
在浏览器回退时是无害的 会再次提交请求
- k3 \& w& Y/ J# q( t$ Y产生的URL地址可以被收藏 post不可以& m" ~ W( P8 N1 t3 ~
请求会被浏览器主动缓存 不会,除非手动设置
+ m/ S. n+ }8 u# F只能进行url编码 支持多种编码方式$ a& f( s! t8 Q
请求参数会被完整保留在浏览器历史记录里 参数不会被保留9 {; K7 s$ H* r
请求在URL中传送的参数是有长度限制的 没有限制
" f3 \6 O E! z) g9 ~: O$ t对参数的数据类型,get只接受ASCII字符 没有限制2 x. @8 v, P0 V( V
更不安全,因为参数直接暴露在URL上,所以不能咏柳传递敏感信息 没暴露2 I% }. u, o1 ~$ k( @; j
参数通过URL传递 放在Request body中: Q/ H; `. e3 L4 I+ {# _
HTTP状态码. \ N* e, v! M* l" `
. g n# S0 [! y( `' d状态码 意义
( g1 }5 F! ?+ F. J$ i1 W. E! f' M* Q" G1xx 指示信息 - 表示请求已接收,继续处理。
, a* n; E9 Z! @& U- r. u1 r3 n2 P: M2xx 成功 - 表示请求已被成功接收。
0 `/ J5 t% \. _8 K) V1 d3xx 重定向 - 要完成请求必须进行更进一步的操作。
, S3 w1 r+ l/ x4xx 客户端错误 - 请求有语法错误或请求无法实现。2 O, c6 s8 }7 W4 A. J u. q$ X
5xx 服务器错误 - 服务器未能实现合法的请求。' }8 ?+ }) C- `
状态码 意义
) |3 d, o# O- [- l200 OK 客户端请求成功9 U7 h2 ^( O6 l! J9 f: G, \
206 Parital Content 客户发送了一个带有Range头的GET请求,服务器完成了它
4 n& |4 W8 h9 W C1 w301 Moved Permanently 所请求的页面已经转移至新的url
/ B( j/ u& m" D6 b6 N4 n t302 Found 所请求的也么已经临时转移至新的url
. c7 j6 X( u" e. n304 Not Modified 客户端有缓冲的文档并发出了一个条件性的请求, 服务器告诉客户,原来缓冲的文档还可以继续使用% k7 w; d. q- _7 T+ B- J8 [+ `
400 Bad Request 客户端请求有语法错误,不能被服务器所理解" P9 w( W8 ^2 `
401 Unanthorized 请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用8 l9 p6 I' O# F, g+ I! m
403 Forbidden 对被请求页面的访问被禁止$ Z4 n5 {. I/ S0 L5 E% h* S( m) b
404 Not Found 请求资源不存在6 Q: N4 y5 o# a$ s9 C
500 Internal Server Error 服务器发生不可预期的错误原来缓冲的文档还可以继续使用2 K5 p, F' w1 u9 f9 _! f! k! L8 L
503 Server Unavaliable 请求未完成, 服务器临时过载或当机,一段时间后可能恢复正常# t/ q$ {7 h5 x2 a( y
什么是持久连接
) y! B7 ~8 n4 G `- c# C0 n/ q" B) x/ H8 k6 n- o) w
HTTP协议采用“请求-应答”模式,当使用普通模式,即非Keep-Alive模式时, 每个请求/应答客户和服务器都要新建一个连接,完成之后立即断开连接(HTTP协议为无连接的协议)
]* z- t) a0 d( U2 A
; d' l, h4 T, C当使用Keep-Alive模式(又称持久连接、连接重用)时, Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。
; }0 {- c e$ B6 ~; ?1 A8 K; h% F
使用了持久连接+ s5 D5 p8 b4 _' J+ I
. o! d [& l) Z% V5 {
请求1->响应1->请求2->响应2->请求3->响应35 Y* _5 C1 V' r w2 w+ M7 l
. k* J2 c* \/ u5 F* w变成了5 R# g" ]# S! K# A# G) Z
$ J" r l' d/ G* n5 a* n |0 L
请求1->请求2->请求3->响应1->响应2->响应3( D T4 Z; [8 f; a" o% O* _
; u& }) K( { j! i- | [* G# d. K什么是管线化# M+ V" O9 B+ Y+ X
: H& d8 \* X$ b管线化通过持久连接完成,仅http/1.1 支持此技术: D2 F* `' d' U( I& _
只有get和head请求可以进行管线化,而post则有所限制
U, e, ?/ N# g# W9 g4 f- Q初次创建连接不应启动管线机制,因为对方(服务器)不一定支持HTTP/1.1版本的协议
( v3 p4 B j4 F& z9 X/ W+ a0 R) o+ G…
/ h5 P! k" n7 u) }7 x0 z- {* E安全2 s' a/ g, T# I) P# m1 F: c$ \; j
6 D/ \5 c' m& r/ a$ iCSRF7 d9 S8 U* h# ?! J1 ~* o
基本概念和缩写
* l m; l( _/ FCSRF, 通常称为跨站请求伪造,英文名Cross-site request forgery 缩写CSRF。
( t; \7 n4 a. l( _攻击原理, j: `' M1 I; }8 P9 y) \
访问网站B时,网站B引诱点击链接,用户浏览器携带的cookie就被网站B的某些代码访问了。& k9 B; L! F3 w g/ E5 w
这利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。) m9 B6 N1 x6 ~; V' C3 Q- {7 ?
XSS% `1 R; a* l: w6 w/ S% `0 c
基本概念和缩写
2 M3 N; G( X5 ` G6 QXSS, 跨站脚本攻击, 英文名Cross Site Scripting 缩写XSS。+ M$ W [5 x Q' W7 h
攻击原理" O2 K% Q1 n! J) {
输出脚本code. O9 u1 E* o+ A
跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。' J7 |! I: \) W E+ k
xss漏洞通常是通过php的输出函数将javascript代码输出到html页面中,通过用户本地浏览器执行的,所以xss漏洞关键就是寻找参数未过滤的输出函数。6 ~7 r7 M; n* h2 ]
渲染机制类- T4 [7 j3 c0 h. i3 [/ D
2 Z" q) l' v( ~9 f什么是DOCTYPE及作用
6 E4 z# m4 x" @- N. W/ n% j. x8 K
DTD (document type definition, 文档类型定义)是一系列的语法规则,用来定义XML或HTML的文件类型。
6 }' c# S7 ]$ y$ b作用:浏览器会使用它来判断文档类型, 决定使用何种协议来解析,以及切换浏览器模式。! p' [3 M; N1 S; s0 v* u, `9 f$ }
DOCTYPE是用来声明文档类型和DTD规范的, k0 X4 t2 O2 G) ~. _7 z/ h
作用:一个主要的用途便是文件的合法性验证。如果文件代码不合法, 那么浏览器解析时便会出一些差错。
0 i3 C1 P- l& ]9 |5 y4 jHTML5的DOCTYPE:
: |6 k6 \/ Z: k" @- n+ f N
5 z* R- }$ X5 s2 v7 f' }HTML4有严格模式和传统模式
2 U2 \: C/ e! u0 \/ ?" P0 w9 P) A0 i" Q: t
浏览器渲染过程. g: j# b! C( m# I% Q) f; C% F2 J
T4 Y7 I$ m7 H4 _一些概念0 T% K) i' @! F$ n8 u- B
& | x" x, T) N: f# ^( \, H. A
名称 概念" {( R& w W% `, u
DOM Tree 浏览器将HTML解析成树形的数据结构。 i- R) k# l5 o+ l, r3 j
CSS Rule Tree 浏览器将CSS解析成树形的数据结构。
9 v/ J1 l9 d: N! W- F' V% k! eRender Tree DOM和CSSOM合并后生成Render Tree。
7 N9 Q: x) l, L Llayout 有了Render Tree,浏览器已经能知道网页中有哪些节点、各个节点的CSS定义以及他们的从属关系,从而去计算出每个节点在屏幕中的位置。
) P6 y/ |. I5 Z; qpainting 按照算出来的规则,通过显卡,把内容画到屏幕上。8 E1 W% Y- Q% L" F. ?& s
1。当用户输入一个URL,浏览器就会发送一个请求,请求URL对应的资源: D' L6 S6 z) s9 S5 n
2。HTML解析器会将这个文件解析,构建成一棵DOM树2 O! J) w' ?9 Y( L
3。构建DOM树时,遇到JS和CSS元素,HTML解析器就将控制权转让给JS或者CSS解析器
7 i# F% u0 Y5 h; B* |8 s- `4。JS或者CSS解析器解析完这个元素时候,HTML又继续解析下个元素,直到整棵DOM树构建完成
6 `8 j) c u @% H* I5。DOM树构建完之后,浏览器把DOM树中的一些不可视元素去掉,然后与CSSOM合成一棵render树
+ g. l* N6 ]/ B6 G! F" v$ R6。接着浏览器根据这棵render树,计算出各个节点(元素)在屏幕的位置。这个过程叫做layout,输出的是一棵layout树
/ I. X6 R; {7 b' Y. H7。最后浏览器根据这棵layout树,将页面渲染到屏幕上去/ i% M! H5 c9 H/ z0 i
17 o+ @" {! p, ~& \! W B2 J" n* y
2$ C, H( E: j& j$ I
36 w0 V- ?9 T$ F
4
( s/ a$ ^. B0 x# d5" B( o* k: ^; P' W% [
6' x! A" _7 y- w r! ~: E
7' \2 ]- R7 ^" L c/ Z! G3 @
重排Reflow, x* {! N! i8 v0 ~2 W
* J/ v) q# L" L) ?7 y7 r
定义:当浏览器发现某个部分发生了变化影响了布局,需要倒回去重新渲染,内行称这个回退的过程叫 reflow。6 J3 u5 t+ K8 T8 {0 n1 Y5 s
触发Reflow: V3 |# g+ T! i- c
当你增加、删除、修改dom节点时,会导致Reflow或Repaint
: I1 W) F, |0 C0 e% m, Q! i当你移动DOM的位置,或是搞个动画的时候
; q/ U& _5 }) o. o. R! C当你修改CSS样式的时候
6 z6 ~3 G7 G/ K7 v当你Resize窗口的时候(移动端没有这个问题),或是滚动的时候
: H: o. v) \" G9 ?. K ~当你修改网页的默认字体时/ k$ J! y; I5 X1 \% W. e7 v
重绘Repaint
+ V" R% X {; t: o. g; X2 @- D) L$ O1 n8 `5 c
定义: 改变某个元素的背景色、文字颜色、边框颜色等等不影响它周围或内部布局的属性时,屏幕的一部分要重画,但是元素的几何尺寸没有变。8 c f" f4 u3 S4 M9 E6 k* f$ V
$ q& X9 O+ R. y6 j* [6 A3 x触发Repaint:7 m2 [3 W5 q" e
$ z9 g9 Q7 w, n! w& GDOM改动" U! y" Q- T3 K# F
CSS改动
8 O9 j) A: O' g- }& t- {————————————————
F! ]& }. Q; U1 f6 H版权声明:本文为CSDN博主「ton365」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
3 H9 o$ f. v, g# k. q( M原文链接:https://blog.csdn.net/u012015672/article/details/105931291. O; a) s2 D; Z
# [6 k5 q8 \& U+ n3 ?. }
$ u( S) k" \2 J" \
|
zan
|