ファングニューク・フォーラム・プロジェクトの概要

1. データベース内の各テーブルにはどのようなフィールドがありますか?

ユーザーテーブル ユーザーテーブル

(1) ID ユーザーの ID (2) ユーザー名 ユーザー名 (3) パスワード パスワード (4) ソルト ソルト (5) 電子メール

(6) type タイプ (7) status ステータス (8) activityCode アクティベーションコード (9) headerUrl アバター格納パス
(10) createTime 作成時刻

ディスカッションポスト投稿テーブル

(1) id 各投稿のID

(2) user_id は、この投稿を投稿したユーザーとユーザーの ID を記録します。明らかに、このフィールドはユーザー テーブルと関連付けるために使用できます。

(3) タイトル 投稿のタイトル

(4) content 投稿の内容 投稿の内容は比較的長いため、このフィールドのデータ型はテキストです。

(5) type 投稿のタイプ、0 はこれが通常の投稿であることを意味し、1 はこれが固定された投稿であることを意味します

(6) ステータス 投稿のステータス。0 は通常の投稿、1 はハイライト投稿、2 はブロックされたことを意味します。

(7) create_time 投稿の作成時刻、データ型はタイムスタンプです。

(8) comment_count は、この投稿に対するコメントの数を示します。

(9) スコアは投稿のスコアであり、投稿をランク付けするために使用されます。

コメントコメントフォーム

(1) id主キー

(2) コメントしたユーザーID

(3) コメントしているentity_type (たとえば、1は投稿へのコメントを表し、2は投稿コメントへのコメントを表します)

(4)entity_idはコメントした人のIDで、例えば投稿Aにコメントした場合、投稿Aの主キーIDになります。

(5) 内容 コメントの具体的な内容

(6) ステータス 0 は正常を意味し、ステータス 1 は利用不可を意味します

(7) create_time 作成時刻

login_ticket ログイン資格情報テーブル

(1) id主キーフィールド

(2) user_id は、この行がどのユーザーのログイン資格情報であるかを示します。

(3) チケット資格情報: 一意の識別子としてのランダムな文字列

(4) ステータス、バウチャーが有効かどうか、0 は正常、1 は無効を意味します

(5) 期限切れ いつ期限切れになりますか? データ タイプはタイムスタンプです。つまり、有効期限が切れると、バウチャーは自動的に期限切れになります。

メッセージテーブル プライベートメッセージテーブル

(1) id主キーフィールド

(2) from_id メッセージ送信者のID

(3) to_id メッセージ受信者のID

(4)conversation_id は、この会話を一意に識別するために使用されます(たとえば、from_id は 111、to_id は 112 であるため、conversation_id は 111_112、from_id は 112、to_id は 111、conversation_id は 111_112 のままです)

(5) 送信内容内容

(6) ステータス 0 は未読を意味し、1 は既読を意味します

(7) create_timeは送信時刻を表します

2.機能

1. ページング クエリ機能: 各ページに 10 件の投稿が表示され、Discussion_post テーブルに移動して検索します (ユーザーがログインしている場合、ブロックされた投稿のステータスは表示されません! = 2)

select id,user_id,title,content,type,status,create_time,comment_count,score
from discuss_post
where status!=2
order by type desc,create_time desc
limit 0  10

type=1 は固定投稿を意味し、最初に固定投稿を前に配置し、次に作成順序を比較し、作成順序に従って並べ替えます。

Limit の後には 2 つのパラメータが続き、最初のパラメータは各ページの開始行の行番号、2 番目のパラメータは各ページに表示するデータの最大数です。

別の関数: 私が公開した投稿関数は、Discussion_post テーブル内でも検索され、このテーブル内の user_id フィールドがログイン ユーザーの ID と等しい行も検索されます。

2. ユーザー登録機能

 ホームページの登録ボタンをクリックして登録します。

 フォームを通じてデータを送信すると、バックエンドは登録済みのアカウントがすでに存在するかどうか、および電子メール アドレスが登録されているかどうかを確認します (ユーザー テーブルで確認します)。

select xxxxx  from  user  where  email=xxxxx

次に、入力したメールアドレスにアクティベーションメールを送信します(ここではメール送信機能は Spring Mail の Maven 座標依存関係をインポートすることで実装されています)。

ユーザーはアクティベーション電子メール内のリンクをクリックして登録に成功し、ログイン ページにジャンプします。

ユーザーテーブルにデータが正常に挿入されました

4.終了機能

ログイン資格情報を無効な状態に変更し、Web サイトのホームページにジャンプします (ログインしていません)。

5. インターセプタを使用して、ユーザーがログインして一部のページにアクセスできなくなるのを防ぎます。

6.投稿を公開する

「公開」をクリックし、タイトルとコンテンツを入力し、「公開」をクリックして、ajax を介してデータベースに送信します。ページはまだ前のページにあります。

実際には、Discussion_post テーブルにデータ行を追加することです。

投稿する前にログインする必要があります

機密性の高い単語を指定し、プレフィックス ツリーを使用してすべての機密性の高い単語を * に置き換えます。

7. 投稿にコメントする

コメントテーブルにデータ行を追加します。

8. いいね機能

9. kafka を使用してユーザーに通知を送信する

誰かがユーザーの投稿にコメントすると、そのユーザーに通知が送信されます

誰かがユーザーの投稿に「いいね!」をした場合、そのユーザーに通知を送信します

誰かがユーザーをフォローすると、ユーザーに通知が送信されます

 コメント、いいね、フォロワーはそれぞれトピックです。

ログイン、登録、投稿、コメント、いいね、フォローなどの機能を実現したフォーラムシステムです。

テクノロジースタック: SpringMVC、Mybatis、Springboot、Mybatis、

AOP を使用してログを均一に記録します

kafka を使用してシステム通知 (いいね!、フォロー、コメント) をユーザーに非同期的に送信する

プロジェクト内で redis が使用される場所:

(1) ユーザーのログイン認証情報を保存する

(2) 設定したデータ構造を利用してlikesを実装する キーはlikeオブジェクトのid、valueにはlikerのidが格納されます。

(3) アテンションの実装には、zset データ構造 (順序集合) を使用し、キーはフォローされる人の ID、値はフォローされる人の ID、スコアはアテンションの時間を表します。

(4) ログイン時に必要な認証コードを保存する

(5) Redis の HyperLogLog データ構造を使用して UV をカウントします


 

面接に関するよくある質問:

1. IOC と AOP について話しましょう

2.SpringMVC

3. 登録機能の実装方法

ホームページの登録ボタンをクリックして登録します。

 フォームからデータを送信します。データを受信すると、サーバーはアカウントが登録されているか、メールボックスが登録されているかをバックグラウンドで確認します。登録されていない場合、サーバーは登録されたメールボックスにアクティベーションメールを送信します(インポートによるメール送信機能) Spring Mail Maven 座標依存関係)、ユーザーはメールボックス内のリンクをクリックし、正常にアクティブ化します。

実際には、ユーザーテーブルにデータ行を挿入します。

ここで注意が必要なのは、md5 暗号化です。データベースがユーザーのパスワードを保存する場合、ユーザーのパスワードの MD5 値 (128 ビット) が保存されます。これにより、たとえ犯罪者がデータベース内のユーザーパスワードのMD5値を入手したとしても、ユーザーがログインする際に、ユーザーが入力したパスワードのMD5暗号化結果が一致した場合、ユーザーのパスワードを知ることはできません。データベース内の MD5 値と一致している場合は、パスワードが正しいことを意味します。

具体的には、パスワードとソルトは文字列で連結されます (文字列 = パスワード + ソルト)。

次に、連結された文字列を md5 で暗号化します。

//生成盐,其实就是长度为5的字符串
user.setSalt(CommunityUtil.generateUUID().substring(0,5));

//密码和盐进行拼接
String  password=user.getPassword()+user.getSalt();

//进行md5加密后存入数据库
user.setPassword(CommunityUtil.md5(password);

ステータスフィールドは、最初は無効を示す0ですが、アクティベーション処理後は有効を示す1になります。

4.ログイン機能

kaptcha ツール クラスを使用して検証コードを生成する

ログインが成功すると、ログイン資格情報が生成され (login_ticket ログイン資格情報テーブルにデータが挿入され)、資格情報がクライアントに発行されます (文字列であるチケット フィールドをクライアントに返すだけです)。チケットを Cookie に入れます)、ページ ホームページへジャンプします。

失敗した場合はログインページに戻ります 

5. ログインステータスはどこに保存されますか?

最初はデータベースに保存されます。チケット フィールドを持つログイン テーブル、login_ticket があります。ユーザーがログインすると、データ行がこのテーブルに挿入されます。

リクエストが届いたら、リクエストにチケット文字列があるかどうかを確認します。チケット文字列が、login_ticket テーブルのレコードのチケット フィールドと等しい場合、はいの場合、ユーザーはログインしていることを意味します。 out、リクエストにチケット文字列を入れます。

その後、最適化のために redis が使用され、キーはチケット文字列、値はシリアル化されたオブジェクトです。

Redis を使用してログイン認証情報を保存した後、login_ticket表就不需要了

6. AOP はプロジェクトのどこで使用されますか?

ログを出力する場合、メソッド呼び出しの前にログを出力するときに AOP が使用されます。

AOP アスペクト指向プログラミング_Pr Young のブログ - CSDN ブログ

印刷ログ関数をアスペクトにカプセル化し、ターゲット オブジェクトの接続ポイント位置に織り込みます。

7. プロジェクトでの Redis の使用方法

Redis は検証コードを保存します。以前はサーバー側のセッションに保存されていましたが、現在は Redis に保存されています (有効期限は 60 秒に設定されています)。

ユーザーは検証コードを更新し、ランダムな文字列 fae737adc5eb41eaa189334f9d152d4e を生成します。検証コードの値は 4ZBT で、Cookie に保存されます。

kaptchaOwner:fae737adc5eb41eaa189334f9d152d4e //60秒後に削除

 Redis に保存されます:

fae737adc5eb41eaa189334f9d152d4e:4ZBT

8.Ajax: 部分更新

9. いいね機能を実装するにはどうすればよいですか?

  これは非常によく使われる機能で、特に有名アカウントが投稿すると短期間で多くの人に「いいね」がつきます。

//执行点赞  

//第一个参数表示点赞用户的id,第二个参数是帖子的id
//表示userid这个用户给entityid这个帖子点赞
  
public void  like(int userId,int entityId)
{
   
     

}

設定されたデータ構造を使用すると、キーは「いいね!」したオブジェクトの ID (つまり、投稿の ID) で、値には「いいね!」した人の ID が格納されるため、kv キーと値のペアは、どのユーザーが「いいね!」したのかを表します。投稿に「いいね!」をしました。

例: ID 275、376、および 555 のユーザーは、ID 123 の投稿を好みます。次のキーと値のペアが Redis に保存されます。

123->{275,376,555}

1回目は「いいね!」をして、2回目はキャンセルします(2回目のいいねをするときは、まず投稿ID-ユーザーIDのKey-Valueが既に存在するかどうかを確認します。存在する場合、それは繰り返しいいねされたことを意味します) 2 回目です。そのため、いいねをキャンセルします。つまり、セットからユーザーの ID を削除します)

同時に、投稿の「いいね」の合計数を表示することもできます (特定の投稿の「いいね」の数をクエリします。投稿の ID を渡して「いいね」の数を調べます)。

10. フォロー機能とフォロー解除機能を実装する方法:

こちらもredisを使用しており、キーはフォローされている人のID、バリューはフォローされている人のIDの集合で、like関数とよく似ており、スコアはフォローした時間です。

11. Elasticsearchを使用した投稿検索

投稿が公開されると、Elasticsearch サーバーに保存されます。

elasticsearchService.searchDiscussPost()

12.SpringSecurity はログインチェックのインターセプターを置き換えます

ユーザーがログインしているかどうかを確認するにはインターセプターを使用すると思います。

おすすめ

転載: blog.csdn.net/weixin_47414034/article/details/128504308