牛客高級項目課(仿牛客網)筆記

一、介紹:

1. 框架

ssm

2. 開發環境

構建工具:Apache Maven

集成開發工具: IntelliJ IDEA

數據庫:MySQL、Redis

應用服務器:Apache Tomcat

版本控制工具:Git

3. Spring MVC

三層架構:表現層、業務層、數據訪問層

MVC

-Model:模型層

-View:視圖層

-Controller:控制層

核心組件:

前端控制器:DispatcherServlet

    

 

4. 創建maven項目

可在  https://start.spring.io/   創建maven項目

5. MyBatis

MyBatis 是一款優秀的持久層框架,它支持定製化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以使用簡單的 XML 或註解來配置和映射原生類型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 對象)爲數據庫中的記錄。

核心組件

--SqlSessionFactory: 用於創建SqlSession的工廠類

--SqlSession:MyBatis的核心組件,用於面向數據庫執行SQL

--主配置文件:XML配置文件,可以對MyBatis的底層行爲做出詳細的配置

--Mapper接口:Dao接口,在MyBatis中習慣稱爲Mapper

--Mapper映射器:用於編寫SQL,並將SQL和實體類映射的組件,採用XML、註解均可實現

6. 版本控制工具 - Git

 

二、開發社區登錄模塊

1. 發送郵件

郵箱設置:

——啓用客戶端SMTP服務

 

Spring Email:

——導入jar包

——郵箱參數配置

——使用javaMailSend發送郵件

 

模板引擎:

——使用Thymeleaf發送HTML郵件

 

2. 註冊功能

訪問註冊頁面:

——點擊鏈接,打開註冊頁面

 

提交註冊數據:

——通過表單提交數據

——服務端驗證賬號是否已存在,郵箱是否已註冊

——服務端發送激活郵件

 

激活註冊賬號:

——點擊郵件中的鏈接,訪問服務端的激活服務。

 

3. 會話管理

HTTP基本性質:

——HTTP是簡單的、可擴展的、無狀態的、有會話的

 

Cookie:

——是服務器發送到瀏覽器,並保存在瀏覽器端的一塊數據。

——瀏覽器下次訪問該服務器時,會自動攜帶該塊數據,並將其發送服務器

 

Session

——是JavaEE的標準,用於在服務器端記錄客戶端信息。

——數據存放在服務器端更加安全,但是也會增加服務端的內存壓力。

 

4. 生成驗證碼

kaptcha:

——導入jar包(pom添加依賴)

——編寫Kaptcha配置類

——生成隨機字符、生成圖片

 

5. 登錄、退出功能

訪問登錄頁面

登錄:

——驗證賬號、密碼、驗證碼

——成功,生成登錄憑證,發送給客戶端

——失敗,跳回登錄頁

退出:

——將登錄憑證修改爲失效狀態

——跳轉首頁

 

6. 顯示登錄信息

攔截器示例:

——定義攔截器,實現HandlerInterceptor

——配置攔截器,爲它指定攔截、排除的路徑

攔截器應用:

——在請求開始時查詢登錄用戶

——在本次請求中持有用戶數據

——在模板視圖上顯示用戶數據

——在請求結束時清理用戶數據

 

7. 賬號設置

上傳文件:

——請求:必須是POST請求

——表單:enctype = “multipart/from-data”

——Spring MVC:通過MultipartFile處理上傳文件

開發步驟:

——訪問賬號設置頁面

——上傳頭像

——獲取頭像

8. 檢查登錄狀態

使用攔截器:

——在方法前標註自定義註解

——攔截所有請求,只處理帶有該註解的方法

自定義註解:

——常用元註解:@Target、@Retention、@Document、@Inherited

——讀取註解:Method.getDeclaredAnnotations(),  Method.getAnnotation(Class<T> annotationClass)

 

三、社區核心功能

1. 過濾敏感詞

前綴樹:

——名稱:Trie、字典樹、查找樹

——特點:查找效率高,消耗內存大

——應用:字符串檢索、詞頻統計、字符串排序等

敏感詞過濾器:

——定義前綴樹

——根據敏感詞,初始化前綴樹

——編寫過濾敏感詞的方法

 

2. 發佈帖子

AJAX

——Asynchronous JavaScript and XML

——異步的JavaScript與XML,不是一門新技術

——使用AJAX,網頁能夠增量更新呈現在頁面上,而不需要刷新整個頁面

——雖然X代表XML,但目前JSON的使用比XML更加普遍

示例:

——使用jQuery發送AJAX請求。

實踐:

——採用AJAX請求,實現發佈帖子的功能。

 

3. 帖子詳情

DiscussPostMapper

DiscussPostService

DiscussPostController 

index.html

——在帖子標題上增加訪問詳情頁面的鏈接

discuss-detail.html

——處理靜態資源的訪問路徑

——複用index.html的header區域

——顯示標題、作者、發佈時間、帖子正文等內容

 

4. 顯示評論

數據層

——根據實體查詢一頁評論數據。

——根據實體查詢評論的數量。

業務層

——處理查詢評論的業務。  

——處理查詢評論數量的業務。

表現層

——顯示帖子詳情數據時,同時顯示該帖子所有的評論數據

 

5. 添加評論

數據層:

——增加評論數據。

——修改帖子的評論數量。

業務層:

——處理添加評論的業務:先增加評論、再更新帖子的評論數量。

表現層 :

——處理添加評論數據的請求。

——設置添加評論的表單。

 

6. 私信列表

私信列表

——查詢當前用戶的會話列表,   每個會話只顯示一條最新的私信。

——支持分頁顯示。

私信詳情

——查詢某個會話所包含的私信。

——支持分頁顯示。

 

7. 發送私信

發送私信

——採用異步的方式發送私信。

——發送成功後刷新私信列表。

設置已讀

——訪問私信詳情時,   將顯示的私信設置爲已讀狀態。

 

8. 統一處理異常

@ControllerAdvice

——用於修飾類,表示該類是Controller的全局配置類。

——在此類中,可以對Controller進行如下三種全局配置:異常處理方案、綁定數據方案、綁定參數方案。

@ExceptionHandler

——用於修飾方法,該方法會在Controller出現異常後被調用,用於處理捕獲到的異常。

@ModelAttribute

——用於修飾方法,該方法會在Controller方法執行前被調用,用於爲Model對象綁定參數。

@DataBinder

——用於修飾方法,該方法會在Controller方法執行前被調用,用於綁定參數的轉換器。

 

四、Redis,一站式高性能存儲方案

1. Redis入門

Redis是一款基於鍵值對的NoSQL數據庫,它的值支持多種數據結構:字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。

Redis將所有的數據都存放在內存中,所以它的讀寫性能十分驚人。 同時,Redis還可以將內存中的數據以快照或日誌的形式保存到硬盤上,以保證數據的安全性。

Redis典型的應用場景包括:緩存、排行榜、計數器、社交網絡、消息隊列等。

 

2. Spring整合Redis

 引入依賴

——spring-boot-starter-data-redis

配置Redis

——配置數據庫參數

——編寫配置類,構造RedisTemplate

訪問Redis

——redisTemplate.opsForValue()

——redisTemplate.opsForHash()

——redisTemplate.opsForList()

——redisTemplate.opsForSet()

——redisTemplate.opsForZSet()

 

3. 點贊

點贊 :

——支持對帖子、評論點贊。

——第1次點贊,第2次取消點贊。

首頁點贊數量 :

——統計帖子的點贊數量。

詳情頁點贊數量 :

——統計點贊數量。

——顯示點贊狀態。

 

4. 收到的贊

 重構點贊功能:

——以用戶爲key,記錄點贊數量

——increment(key),decrement(key)

開發個人主頁

——以用戶爲key,查詢點贊數量

 

5. 關注、取消關注

需求

——開發關注、取消關注功能。

——統計用戶的關注數、粉絲數。

關鍵

——若A關注了B,則A是B的Follower(粉絲),B是A的Followee(目標)。

——關注的目標可以是用戶、帖子、題目等,在實現時將這些目標抽象爲實體。

 

6. 關注列表、粉絲列表

 業務層:

——查詢某個用戶關注的人,支持分頁。

——查詢某個用戶的粉絲,支持分頁。

表現層 :

——處理“查詢關注的人”、“查詢粉絲”請求。

——編寫“查詢關注的人”、“查詢粉絲”模板。

 

7. 優化登錄模塊

使用Redis存儲驗證碼:

——驗證碼需要頻繁的訪問與刷新,對性能要求較高。

——驗證碼不需永久保存,通常在很短的時間後就會失效。

——分佈式部署時,存在Session共享的問題。

使用Redis存儲登錄憑證:

——處理每次請求時,都要查詢用戶的登錄憑證,訪問的頻率非常高。

使用Redis緩存用戶信息:

——處理每次請求時,都要根據憑證查詢用戶信息,訪問的頻率非常高。

 

五、Kafka,構建TB級異步消息系統

1. 阻塞隊列

BlockingQueue :

——解決線程通信的問題。

——阻塞方法:put、take。

生產者消費者模式:

——生產者:產生數據的線程。

——消費者:使用數據的線程。

實現類 :

——ArrayBlockingQueue

——LinkedBlockingQueue

——PriorityBlockingQueue、SynchronousQueue、DelayQueue等。 

 

2. Kafka入門

Kafka簡介:

——Kafka是一個分佈式的流媒體平臺。

——應用:消息系統、日誌收集、用戶行爲追蹤、流式處理。

Kafka特點 :

——高吞吐量、消息持久化、高可靠性、高擴展性。

Kafka術語:

——Broker、Zookeeper - Topic、Partition、Offset - Leader Replica 、Follower Replica

 

3. Spring整合Kafka

引入依賴:

—— spring-kafka

配置Kafka:

——配置server、consumer

訪問Kafka :

——生產者 

        kafkaTemplate.send(topic, data);

——消費者 

        @KafkaListener(topics = {"test"})

        public void handleMessage(ConsumerRecord record) {}

 

4. 發送系統通知

觸發事件 :

——評論後,發佈通知

——點贊後,發佈通知

——關注後,發佈通知

處理事件 

——封裝事件對象

——開發事件的生產者

——開發事件的消費者
 

5. 顯示系統通知

 通知列表:

——顯示評論、點贊、關注三種類型的通知

通知詳情 :

——分頁顯示某一類主題所包含的通知

未讀消息 :

——在頁面頭部顯示所有的未讀消息數量

 

六、Elasticsearch,分佈式搜索引擎

1. Elasticsearch入門

Elasticsearch簡介:

——一個分佈式的、Restful風格的搜索引擎。

——支持對各種類型的數據的檢索。

——搜索速度快,可以提供實時的搜索服務。

——便於水平擴展,每秒可以處理PB級海量數據。

Elasticsearch術語 :

——索引、類型、文檔、字段。

——集羣、節點、分片、副本。

 

2. Spring整合Elasticsearch

引入依賴 :

——spring-boot-starter-data-elasticsearch

配置Elasticsearch:

—— cluster-name、cluster-nodes

Spring Data Elasticsearch

——ElasticsearchTemplate

——ElasticsearchRepository

 

3. 開發社區搜索功能

 搜索服務:

——將帖子保存至Elasticsearch服務器。

——從Elasticsearch服務器刪除帖子。

——從Elasticsearch服務器搜索帖子。

發佈事件:

——發佈帖子時,將帖子異步的提交到Elasticsearch服務器。

——增加評論時,將帖子異步的提交到Elasticsearch服務器。

——在消費組件中增加一個方法,消費帖子發佈事件。

顯示結果:

——在控制器中處理搜索請求,在HTML上顯示搜索結果。

 

七、構建安全高效的企業服務

1. Spring Security

簡介:

——Spring Security是專注於爲java應用程序提供身份認證和授權的框架,它的強大之處在於它可以輕鬆擴展以滿足自定義的需求。

特徵:

——對身份的認證和授權提供全面的、可擴展的支持。

——防止各種攻擊,如會話固定攻擊、點擊劫持、csrf攻擊等。

——支持與Servlet API、Spring MVC等Web技術集成。

 

2. 權限控制

登錄檢查:

——之前採用攔截器實現登錄檢查,這僅僅是簡單的權限管理方案,現將其廢棄。

授權配置:

——對當前系統內包含的所有的請求,分配訪問權限(普通用戶、管理員、版主)

認證方案:

——繞過Security認證流程,採用系統原來的認證方案。

CSRF配置:

——防止CSRF攻擊的基本原理,以及表單、AJAX相關的配置。

 

3. 置頂、加精、刪除

功能:

——點擊置頂,修改帖子類型

——點擊“加精”、“刪除”,修改帖子狀態

權限管理:

——版主:置頂、加精。

——管理員:刪除。

按鈕顯示:

——版主:置頂、加精。

——管理員:刪除。

 

4. Redis高級數據類型

HyperLogLog:

——採用一種基數算法,用於完成獨立總數統計。

——佔據空間小,無論統計多少個數據,只佔12k內存空間。

——不精確的統計算法,標準誤差0.81%。

Bitmap:

——不是一種獨立的數據結構,實際上就是字符串

——支持按位存取數據,可以將其看成是byte數組。

——適合存儲索大量的連續的數據的布爾值。

 

5. 網站數據統計

UV(Unique Visitor):

——獨立訪客,需通過用戶IP排統計數據。

——每次訪問都要進行統計。

——HyperLogLog,性能好,存儲空間小。

DAU(Daily Active User):

——日活躍用戶,需通過用戶ID排重統計數據。

——訪問過一次,則認爲活躍。

——Bitmap,性能好,可統計精確的結果。

 

6. 任務執行和調度

JDK線程池:

——ExecutorService

——ScheduledExecutorService

Spring線程池:

——ThreadPoolTaskExecutor

——ThreadPoolTaskScheduler

分佈式定時任務:

——Spring Quartz

 

7. 熱帖排行

公式:

——log ( 精華分 + 評論數 * 10 + 點贊數 * 2 ) + ( 發佈時間 - 牛客紀元 )

 

8. 生成長圖

wkhtmltopdf

——wkhtmltopdf url file

——wkhtmltoimage url file

java

——Runtime.getRuntime().exec()

 

9. 將文件上傳至雲服務器

客戶端上傳:

——客戶端將數據提交給雲服務器,並等待響應。

——用戶上傳頭像時,將表單數據提交給雲服務器。

服務器直傳:

——應用服務器將數據直接提交給雲服務器,並等待響應。

——分享時,服務端自動生成的圖片,提交給雲服務器。

使用七牛雲服務器。

 

10. 優化網站性能

本地緩存:

——將數據緩存在應用服務器上,性能最好。

——常用緩存工具:Ehcache、Guava、Caffeine等

分佈式緩存:

——將數據緩存在NoSQL數據庫上,跨服務器。

——常用緩存工具:MemCache、Redis等。

多級緩存:

——一級緩存(本地緩存)> 二級緩存(分佈式緩存)> DB

——避免緩存雪崩(緩存失效,大量請求直達DB),提高系統的可用性。

 

八、項目發佈與總結

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章