各個面試題彙總

最全技術面試180題:阿里11面試+網易+百度+美團!

優知 JAVA高級架構 今天

網絡編程

  1. ISO模型與協議前端

  2. http1.0:須要使用keep-alive參數來告知服務器端要創建一個長鏈接java

  3. http1.1:默認長鏈接。支持只發送header信息,能夠用做權限請求。支持Host域。node

  4. http2.0:多路複用的技術,作到同一個鏈接併發處理多個請求。HTTP2.0使用HPACK算法對header的數據進行壓縮。支持HTTP2.0的web server請求數據的時候,服務器會順便把一些客戶端須要的資源一塊兒推送到客戶端,省得客戶端再次建立鏈接發送請求到服務器端獲取。這種方式很是合適加載靜態資源。linux

  5. 會話層:負責管理主機之間的會話進程,負責創建、管理、終止進程之間的會話。git

  6. 傳輸層:將上層數據分段並提供端到端的、可靠的或不可靠的傳輸,還要處理端到端的差錯控制和流量控制問題。協議TCP、UDP、SPXweb

  7. 網絡層:對子網間的數據包進行路由選擇。此外,網絡層還能夠實現擁塞控制、網際互連等功能。協議IP、IPX、RIP、OSPF面試

  8. 數據鏈路層:在不可靠的物理介質上提供可靠的傳輸。該層的做用包括:物理地址尋址、數據的成幀、流量控制、數據的檢錯、重發等。協議SDLC、HDLC、PPP、STP、幀中繼redis

  9. TCPIP模型與協議算法

  10. 應用層:單位是數據段,協議有FTP、TELNET、HTTP、SMTP、SNMP、TFTP、NTP、DNSspring

  11. 運輸層:單位是數據包,協議有TCP、UDP

  12. 網絡層:單位是數據幀,協議有IP

  13. 網絡接口層:單位是比特,ARP、RARP

  14. 三次握手與四次揮手

  15. BIO NIO AIO

  16. BIO:同步阻塞IO,每一個請求都要一個線程來處理。

  17. NIO:同步非阻塞IO,一個線程能夠處理多個請求,適用於短鏈接、小數據。

  18. AIO:異步非阻塞IO,一個線程處理多個請求,使用回調函數實現,適用於長鏈接、大數據。

  19. DDOS攻擊原理與防護方式

  20. HTTP Get Flood:發送大量會產生sql查詢的鏈接,使得數據庫負載很高。

  21. CSRF跨站請求僞造原理攻擊者盜用了你的身份,以你的名義發送惡意請求。

  22. CSRF攻擊是源於WEB的隱式身份驗證機制!WEB的身份驗證機制雖然能夠保證一個請求是來自於某個用戶的瀏覽器,但卻沒法保證該請求是用戶批准發送的!

  23. 防護方式:1.驗證碼;2. 後臺生成token,讓前端請求攜帶。3.使用對稱加密,後端隨機給前端一個密鑰,前端進行加密,後端解密。

  24. 會話劫持經過暴力破解、 預測、竊取(經過XSS攻擊)等方式獲取到用戶session

  25. XSS攻擊XSS攻擊是Web攻擊中最多見的攻擊方法之一,它是經過對網頁注入可執行代碼且成功地被瀏覽器執行,達到攻擊的目的,造成了一次有效XSS攻擊,一旦攻擊成功,它能夠獲取用戶的聯繫人列表,而後向聯繫人發送虛假詐騙信息,能夠刪除用戶的日誌等等,有時候還和其餘攻擊方式同時實施好比SQL注入攻擊服務器和數據庫、Click劫持、相對連接劫持等實施釣魚,它帶來的危害是巨大的,是web安全的頭號大敵。

  26. XSS反射型攻擊,惡意代碼並無保存在目標網站,經過引誘用戶點擊一個連接到目標網站的惡意連接來實施攻擊的。

  27. XSS存儲型攻擊,惡意代碼被保存到目標網站的服務器中,這種攻擊具備較強的穩定性和持久性,比較常見場景是在博客,論壇等社交網站上,但OA系統,和CRM系統上也能看到它身影,好比:某CRM系統的客戶投訴功能上存在XSS存儲型漏洞,黑客提交了惡意攻擊代碼,當系統管理員查看投訴信息時惡意代碼執行,竊取了客戶的資料,然而管理員絕不知情,這就是典型的XSS存儲型攻擊。

  • 解決方法

  • 在表單提交或者url參數傳遞前,對須要的參數進行過濾

  • 過濾用戶輸入。檢查用戶輸入的內容中是否有非法內容。如<>(尖括號)、」(引號)、 ‘(單引號)、%(百分比符號)、;(分號)、()(括號)、&(& 符號)、+(加號)等

28.RPC與HTTP服務的區別

數據庫原理

  1. MYISAM與innodb搜索引擎原理MyISAM引擎使用B+Tree做爲索引結構,葉節點的data域存放的是數據記錄的地址。其採用索引文件與數據文件,索引文件只存放索引,葉子節點存放數據的物理地址。數據文件存放數據。其索引方式是非彙集的。

  2. InnoDB也使用B+Tree做爲索引結構。可是它的主索引與數據都放在一個文件中。這種索引叫作彙集索引,由於InnoDB的數據文件自己要按主鍵彙集,因此InnoDB要求表必須有主鍵(MyISAM能夠沒有),若是沒有顯式指定,則MySQL系統會自動選擇一個能夠惟一標識數據記錄的列做爲主鍵,若是不存在這種列,則MySQL自動爲InnoDB表生成一個隱含字段做爲主鍵,這個字段長度爲6個字節,類型爲長整形。

  • 區別一:InnoDB的主索引與數據都放在一個文件中。而MYISAM是分開存放的。

  • 區別二:InnoDB的輔助索引data域存儲相應記錄主鍵的值而不是地址。

  • 區別三:InnoDB的主鍵索引是彙集索引,而MYISAM不是彙集索引。

3.索引,聚簇索引和二級索引的加鎖區別

  • 彙集(clustered)索引,也叫聚簇索引。數據行的物理順序與列值(通常是主鍵的那一列)的邏輯順序相同,一個表中只能擁有一個彙集索引。

  • 非彙集(unclustered)索引。該索引中索引的邏輯順序與磁盤上行的物理存儲順序不一樣,一個表中能夠擁有多個非彙集索引。會發生二次查詢。

  • 稠密索引:稠密索引文件中的索引塊保持鍵的順序與文件中的排序順序一致。

  • 稀疏索引:稀疏索引沒有爲每一個數據都建立一個索引,它比稠密索引節省了更多的存儲空間,但查找給定值的記錄需更多的時間。只有當數據文件是按照某個查找鍵排序時,在該查找鍵上創建的稀疏索引才能被使用,而稠密索引則能夠應用在任何的查找鍵。

  • 聯合索引:將一張表中多個列組成聯合索引(col1,col2,col3),其生效方式知足最左前綴原則。

  • 覆蓋索引:對於二級索引而言,在innodb中通常是須要先根據二級索引查詢到主鍵,而後在根據一級索引查詢到數據。可是若是select的列都在索引中,就避免進行一級查詢。

4.主鍵選擇

  • 在使用InnoDB存儲引擎時,若是沒有特別的須要,請永遠使用一個與業務無關的自增字段做爲主鍵。

  • where 1 = 1:可以方便咱們拼sql,可是使用了以後就沒法使用索引優化策略,所以會進行全表掃描,影響效率。

5.分表分庫

  • 水平拆分:依據表中的數據的邏輯關係,將同一個表中的數據依照某種條件拆分到多臺數據庫(主機)上面。按照1個或多個字段以及相應的規則,將一張表重的數據分到多張表中去。好比按照id%5的規則,將一張大表拆分紅5張小表。適合具備超大表的系統。

  • 垂直拆分:依照不一樣的表(或者Schema)來切分到不一樣的數據庫(主機)之上。通常按照模塊來分庫。適合各業務之間耦合度很是低的系統。

6.隔離級別

  • read uncommit:讀不加鎖,寫加共享鎖。會產生髒讀、幻讀。

  • read commit:讀加共享鎖,寫加排它鎖,但不加間隙鎖。間隙鎖的主要做用是防止不可重複讀,但會加大鎖的範圍。

  • repeatable read(innodb默認):讀加共享鎖,寫加間隙排它鎖。注意,Innodb對這個級別進行了特殊處理,使得這個級別可以避免幻讀,但不是全部引擎都可以防止幻讀!(網易面試官問)

  • serialization:會給整張表加鎖,強一致,可是效率低。

7.innodb中的鎖

  • MVCC(multi-Version Concurrency Control):讀不加鎖,讀寫不衝突。適合寫少讀多的場景。讀操做分爲:快照讀(返回記錄的可見版本,不加鎖)、當前讀(記錄的最新版本,加鎖,保證其它記錄不修改)。

  • LBCC(Lock-Based Concurrency Control):

  • join原理Simple Nested-Loop Join:效率最低,按照join的次序,在join的屬性上一個個掃描,併合並結果。

  • Index Nested-Loop Join:效率最高,join的屬性上面有索引,根據索引來匹配。

  • Block Nested-Loop Join:用於沒有索引的列。它會採用join buffer,將外表的值緩存到join buffer中,而後與內表進行批量比較,這樣能夠下降對外表的訪問頻率

8.galera

  • 多主架構:真正的多點讀寫的集羣,在任什麼時候候讀寫數據,都是最新的。

  • 同步複製,各節點間無延遲且節點宕機不會致使數據丟失。

  • 緊密耦合,全部節點均保持相同狀態,節點間無不一樣數據。

  • 無需主從切換操做。

  • 無需進行讀寫分離。

  • 併發複製:從節點在APPLY數據時,支持並行執行,有更好的性能表現。

  • 故障切換:在出現數據庫故障時,由於支持多點寫入,切的很是容易。

  • 熱插拔:在服務期間,若是數據庫掛了,只要監控程序發現的夠快,不可服務時間就會很是少。在節點故障期間,節點自己對集羣的影響很是小。

  • 自動節點克隆:在新增節點,或者停機維護時,增量數據或者基礎數據不須要人工手動備份提供,Galera Cluster會自動拉取在線節點數據,最終集羣會變爲一致。

  • 對應用透明:集羣的維護,對應用程序是透明的,幾乎感受不到。

9.LSM Tree,主要應用於nessDB、leveldb、hbase

  • 核心思想的核心就是放棄部分讀能力,換取寫入的最大化能力。它假設假定內存足夠大,所以不須要每次有數據更新就必須將數據寫入到磁盤中,而能夠先將最新的數據駐留在內存中,等到積累到最後多以後,再使用歸併排序的方式將內存內的數據合併追加到磁盤隊尾。(使用歸併排序是要由於帶排序樹都是有序樹)

  • LSM具備批量特性,存儲延遲。B樹在insert的時候可能會形成分裂,可能會形成隨機讀寫。而LSM將屢次單頁隨機寫,變成一次多頁隨機寫,複用了磁盤尋道時間,極大提高效率。

  • LSM Tree放棄磁盤讀性能來換取寫的順序性。

  • 通常會使用Bloom Filter來優化LSM。當將內存中的數據與磁盤數據合併的時候,先要判斷數據是否有重複,若是不用Bloom Filter就須要在磁盤上一層層地找,而使用了以後就會下降搜索代價。

多線程

  1. synchronized、CAS

  2. Collections

  3. 支持高併發的數據結構,如ConcurrentHashMap

  4. 基於AQS實現的鎖、信號量、計數器原理

  5. Runnable與Callable的區別

  6. 線程池

  7. 做用

  • 減小在建立和銷燬線程上所花的時間以及系統資源的開銷 。

  • 當前任務與主線程隔離,能實現和主線程的異步執行,特別是不少能夠分開重複執行的任務。

8.阻塞隊列

9.threadlocal

Spring框架

  1. IOC/DI

  2. Core、Beans、Context、Expression Language

  3. JDBC、ORM、OXM、JMS、Transaction

  4. AOP

  5. Web

  6. Test

  7. @Autowired原理

  8. 工廠模式

  9. 反射

  10. 自動配置@ConfigurationProperties(prefix = "hello"):讀取以hello爲開頭的配置,屬性類使用

  11. @Configuration:指名當前類爲配置類

  12. @EnableConfigurationProperties(Properties):指名配置屬性類

  13. @ConditionalOnClass(Condition.class):條件類,只有Condition.class存在,當前配置類才生效

  14. Spring Boot在spring.factories配置了不少全限定名的配置類。

Redis

核心原理

  1. 經常使用數據類型String:二進制安全,能夠存任何數據,好比序列化的圖片。最大長度位512M.

  2. Hash:是KV對集合,本質是String類型的KV映射,適合存儲對象。

  3. List:簡單字符串鏈表,能夠在left、right兩邊插入,本質是雙向鏈表。緩衝區也是用這個實現。

  4. Set:String類型的無序集合,內部實現是一個 value永遠爲null的HashMap,實際就是經過計算hash的方式來快速排重的,這也是set能提供判斷一個成員是否在集合內的緣由。

  5. zset:有序集合,每一個元素會關聯一個double類型的score,而後根據score進行排序。注意:元素不能重複,可是score是能夠重複的。使用HashMap和跳躍表(SkipList)來保證數據的存儲和有序,HashMap裏放的是成員到score的映射,而跳躍表裏存放的是全部的成員,排序依據是HashMap裏存的score.

  • pub/sub:在Redis中,你能夠設定對某一個key值進行消息發佈及消息訂閱,當一個key值上進行了消息發佈後,全部訂閱它的客戶端都會收到相應的消息。

持久化

  1. RDB:一種是手動執行持久化命令來持久化快照;另外一種是在配置文件中配置策略,來自動持久化。持久化命令有save、bgsave兩種,bgsave會調用fork命令,產生子進程來進行持久化,而父進程繼續處理數據,可是持久化的快照是fork那一刻的快照,所以這種策略可能會丟失一部分數據。特色:每次都記錄全部數據,恢復快,子進程不影響父進程性能。

  2. AOF:append only file,將每條操做命令都記錄到appendonly.aof文件中,可是不會立馬寫入硬盤,咱們能夠配置always(每有一個命令,都同步)、everysec(每秒同步一次)、no(沒30秒同步一次)。每每everysec就夠了。aof數據損失要比RDB小。特色:有序記錄全部操做,數據丟失更少,會對操做作壓縮優化,bgrewriteaof也會fork子進程,不影響父進程性能

事務

  1. Transactions:不是嚴格的ACID的事務,可是這個Transactions仍是提供了基本的命令打包執行的功能(在服務器不出問題的狀況下,能夠保證一連串的命令是順序在一塊兒執行的,中間有會有其它客戶端命令插進來執行)。

  2. Redis還提供了一個Watch功能,你能夠對一個key進行Watch,而後再執行Transactions,在這過程當中,若是這個Watched的值進行了修改,那麼這個Transactions會發現並拒絕執行。

KafKA

  1. topic

  2. broker

  3. partition

  4. consumer

  5. producer

  6. stream

  7. 存儲機制

  8. 網絡模型

  9. 注意:partition之間是無序的

  10. 消息隊列的生產者消費者中消費者沒有收到消息怎麼辦,消息有順序好比1.2.3可是收到的倒是1.3.2怎麼辦?消息發過來的過程當中損壞或者出錯怎麼辦

Spring security

  1. 攔截器棧

  2. @PreAuthorize

  3. @PostAuthorize

  4. 支持Expression Language

jvm原理

內存模型、垃圾收集器、CMS與G1是重點

垃圾收集算法

  • 標記-清除(CMS)容易產生碎片,當碎片太多會提早觸發Full GC

  • 複製(年輕代基本用這個算法)會浪費一半的可能感受

  • 標記-整理(serial Old、Parallel Old)

  • Serial:採用單線程stop-the-world的方式進行收集。當內存不足時,串行GC設置停頓標識,待全部線程都進入安全點(Safepoint)時,應用線程暫停,串行GC開始工做,採用單線程方式回收空間並整理內存。串行收集器特別適合堆內存不高、單核甚至雙核CPU的場合。

  • ParNew

  • Parallel Scavenge

CMS:

  • 初始標記(stop of world)

  • 並行標記、預清理

  • 從新標記(stop of world)

  • 並行清理

G1

將堆分紅不少region,能夠同時堆年輕代與老年代進行收集

  • 初始標記(stop of world):初始標記(Initial Mark)負責標記全部能被直接可達的根對象(原生棧對象、全局對象、JNI對象)

  • 並行標記:

  • 從新標記(stop of world):

  • 清理(stop of world):

  • 重置

gc觸發條件

  1. 從年輕代分區拷貝存活對象時,沒法找到可用的空閒分區,會觸發Minor GC

  2. 從老年代分區轉移存活對象時,沒法找到可用的空閒分區,會觸發Major GC

  3. 分配巨型對象時在老年代沒法找到足夠的連續分區,會觸發Major GC

  4. 可達性分析:經過檢查一塊內存空間可否被root達到,來判斷是否對其進行回收。

jdk不一樣版本新增的部分特性

jvm調優

  • VisualVM:JDK自帶JVM可視化工具,能過對內存、gc、cpu、thread、class、變量等等信息進行可視化。

設計模式

  1. 單例雙重檢查

  2. 觀察者模式

  3. 裝飾者模式:jdk中輸入輸出流用到了該模式

  4. 適配器模式:jdk中Reader、writer用到了該模式

  5. 代理模式

  6. 靜態代理

  7. JDK動態代理

  8. Cglib到動態代理

  9. 生產者消費者模式

  10. 工廠模式

項目管理與運維工具

  1. git+Jenkins

  2. maven

  3. K8Spod:Pod是全部業務類型的基礎,全部的容器均在Pod中運行,它是一個或多個容器的組合。每個Pod都會被指派一個惟一的Ip地址,在Pod中的每個容器共享網絡命名空間,包括Ip地址和網絡端口。Pod可以被指定共享存儲卷的集合,在Pod中全部的容器可以訪問共享存儲卷,容許這些容器共享數據。

  4. kubelet:kubelet負責管理pods和它們上面的容器,images鏡像、volumes、etc。

  5. ingress,用於負載均衡

  6. docker

  7. docker與虛擬機的區別

數據結構

  1. 平衡二叉樹AVL

  2. 高度log(n)

  3. 插入時間複雜度log(n)

  4. 紅黑樹

  5. 插入時間複雜度log(n)

  6. 查找時間複雜度log(n)

  7. 在查找是,紅黑樹雖然複雜度也是log(n),可是從效率上比要略低於AVL。可是其優點在於插入元素的時候,不會像AVL那樣頻繁地旋轉。

  8. B+Tree:只有葉子節點存值,非葉子節點只存key和child,所以一樣大小的物理頁上能存放更多的節點。每一層的節點數量越多,意味着層次越少,也就意味着IO次數越少,所以很是適合數據庫以及文件系統。

  9. 大根堆:採用數組存儲樹,是一個徹底樹。先插入到數組最後的位置上,而後採用上浮的思想,將該元素與比它小的父元素調換,直到parent>target,浮到root;而後將root與未排序的最後一個元素交換位置;重複以上步驟,直到全部元素都有序。插入如查找的複雜度都是log(n)。

  10. 優先隊列PriorityQueue,Java中使用小根堆實現,非線程安全。

  11. 優先阻塞隊列PriorityBlockQueue,線程安全。

算法

  1. 快排

  2. 時間複雜度O(nlog(n))

  3. 空間複雜度O(log(n))

  4. 堆排序

  5. 時間複雜度O(nlog(n))

  6. 空間複雜度O(1)

  7. 歸併排序

  8. 時間複雜度O(nlog(n))

  9. 空間複雜度O(n)

  10. 跳錶時間複雜度O(log(n))

  11. 空間複雜度O(2n)

  12. 高度O(log(n))

分佈式

cap理論

  1. 可用性

  2. 一致性

  3. 分區容忍性:對網絡斷開的容忍度,有點像魯棒性

  4. 拜占庭將軍問題

Raft 算法

  • 有leader、follower、candidate

同步流程

  1. 由客戶端提交數據到Leader節點。

  2. 由Leader節點把數據複製到集羣內全部的Follower節點。若是一次複製失敗,會不斷進行重試。

  3. Follower節點們接收到複製的數據,會反饋給Leader節點。

  4. 若是Leader節點接收到超過半數的Follower反饋,代表複製成功。因而提交本身的數據,並通知客戶端數據提交成功。

  5. 由Leader節點通知集羣內全部的Follower節點提交數據,從而完成數據同步流程。

zookeeper

  1. Zab(Zookeeper Atomic Broadcast)協議,有兩種模式:

  • 它們分別是:恢復模式(選主)和廣播模式(同步)。

  • 有兩種算法:1. basic paxos;2. fast paxos(默認)

  1. 文件系統:zookeeper的通知機制、分佈式鎖、隊列管理、配置管理都是基於文件系統的。

  2. 分佈式鎖:有了zookeeper的一致性文件系統,鎖的問題變得容易。鎖服務能夠分爲兩類,一個是保持獨佔,另外一個是控制時序。

  3. 獨佔鎖:將zookeeper上的一個znode看做是一把鎖,經過createznode的方式來實現。全部客戶端都去建立 /distribute_lock 節點,最終成功建立的那個客戶端也即擁有了這把鎖。用完刪除掉本身建立的distribute_lock 節點就釋放出鎖。

  4. 控制時序鎖:/distribute_lock 已經預先存在,全部客戶端在它下面建立臨時順序編號目錄節點,和選master同樣,編號最小的得到鎖,用完刪除。

  5. 隊列管理,分爲同步隊列、非同步隊列

  6. 數據複製的好處

  • 容錯:一個節點出錯,不致於讓整個系統中止工做,別的節點能夠接管它的工做;

  • 提升系統的擴展能力 :把負載分佈到多個節點上,或者增長節點來提升系統的負載能力;

  • 提升性能:讓客戶端本地訪問就近的節點,提升用戶訪問速度。

5.一致性hash算法原理

微服務

Spring cloud

  • 網關:zuul

  • 分佈式版本化配置 config

  • 服務註冊和發現:Eureka,配置時須要注意多久刷新列表一次,多久監測心跳等。

  • service-to-service 調用

  • 負載均衡:Ribbon;在生成RestTemplate的bean時,經過@LoadBalanced註解可使得RestTemplate的調用

  • 斷路器:Hystrix

  • 監控:spring admin。在啓動類上加@EnableAdminServer註解。

java web

  1. servlet工做原理

  2. tomcat工做原理,好文,強推

  3. container

linux

  1. 系統結構,講得很好,強推

  2. 硬連接與軟鏈接

  3. 硬連接:數據節點經過引用計數的方式來對指向它的硬連接計數,當計數爲0就刪除。

  4. 軟鏈接:咱們能夠把它當作是快捷方式,它只是記錄了某個文件的硬連接的路徑,若是咱們把源文件刪除,再從新建立一個相同名字的文件,那麼軟鏈接指向的就是新建立的文件。

  5. 虛擬文件系統(VFS):文件系統是有不少實現的,好比ext二、ext三、FAT等等,而VFS則是存在於應用程序與文件系統中間,它封裝了open、close、read、write等等操做文件系統的接口,爲應用程序屏蔽掉不一樣文件系統之間的差別。

  6. VFS數據結構

其它

  • bitmap,大文件交集

  • Elasticsearch索引原理

  • 從內存到屏幕經歷了啥

  • 高併發場景的限流,你怎麼來肯定限流限多少,模擬場景和實際場景有區別怎麼解決,

百度面試

  • 說一下redis與kafka,redis持久化策略

  • git中rebase與merge區別

  • docker底層原理,依賴操做系統的什麼

  • ls -l | grep xxx的執行過程,儘量的細,是多進程仍是單進程?

  • 兩個有序數組求中位數

  • 算法 3Sum、中序遍歷非遞歸實現、循環打印矩陣

  • final、finally、finanize

  • jvm內存模型

  • 垃圾回收器

  • Spring特色介紹下

  • Synchronize與ReentrantLock的區別、使用場景

  • CAS使用場景

  • 聊了下git+jekins+K8S+docker實現自動化部署

  • innodb原理,使用場景,與MYISAM在場景上的區別

  • weakReference、softReference等

  • Hbase的原理,LSM Tree

  • Linux中,哪一種進程可使用管道

美團

  • 權限模型

  • 介紹下線程池,阻塞隊列的用法,無界隊列真的無界嗎?

  • 說一下redis

  • kafka存儲模型與網絡模型

  • zookeeper與redis實現分佈式鎖

  • 樂觀鎖與悲觀鎖

  • 算法:有n我的,給你ai與aj的身高關係,如ai比aj高,進行身高排序,若是條件不知足,則輸出「不知足」

  • Spring boot的特性

Java高級架構 ∣ 乾貨|學習 長按,識別二維碼,加關注

舒適提示

若是你喜歡本文,請分享到朋友圈,想要得到更多信息,請關注我。關注本文說說你的見解吧,下方評論哦。。。Java勸退師........

 

想獲取上方資料加羣:859729143 點擊閱讀原文便可進羣

掃一掃便可領取資料學習

 

微信掃一掃關注該公衆號

相關文章
相關標籤/搜索