はじめに

CrudBaseに付属するサービスであるメッセージボードの改良案件である。 メッセージボードにGoodボタン(評価)機能をつけたい。 時間も限られているため、ひと段落つくところまでの改良でよい。 中断してもすぐに再開できるようにこの記録を残す。

現状

メッセージ投稿機能のテキスト送信およびテキストの表示は正常。
XSSサニタイズも問題ないようだ。
画像添付して送信ボタンを押したときに画像が表示されないバグがある。 しかし、ブラウザをリロードすると画像はちゃんと表示される。

メッセージの編集が可能。他の人が投稿したメッセージは編集できない使用になっている。
メッセージの削除も可能。基本的に自分が投稿したメッセージしか削除できないが、管理者社は他のユーザーのメッセージを削除できる。

Goodボタンは張りぼてであり未作成。今回作成する箇所だ。
あとURLが文字列に含まれるならリンク化させたいところ。また、youtube動画のリンクが張られた場合、動画のサムネイルが表示されるようにしたい。
これは次回対応だ。

今回の作業について

評価ボタンのインターフェースについて考察

基本的にGoodボタン(「いいね」ボタン)の一種類であるが、低評価ボタンや返事アイコンにも対応させたいところだ。

だれがGoodボタンを押したか分かるようにしたい。
この機能を実現するために一般的なSNSのインターフェースではどうなっているだろうか?
他のチャットについて調べてみた。

ツイッターはハートアイコン+評価人数のボタン方式である。このボタンを押すと評価される。
ツイッターはだれが評価したか分からない仕様である。評価アクションと評価表示が一体型とうことだ。参考にならず。

チャットワークもツイッターと同じで評価ボタン+人数という組み合わせである。
ただ評価の種類は複数ある。評価の種類ごとに評価アイコンが増えていく感じなのだろう。
だれが評価したかどうかは別のボタンで実装されている。

Yahooニュースは高評価ボタンと低評価ボタンの2種類が存在する。
やはり評価ボタンの隣に人数がついている。だれが評価したかは分からない仕様。

Youtubeも高評価ボタンと低評価ボタンの2種類。
高評価のみ人数がついており、低評価ボタンには人数は表示されていない。
返信機能がついているのも特徴。この機能も欲しいが別の機会に検討しよう。

どのチャットか忘れたが過去に関わったチャットにこのような機能があった。
評価、または返事した人のアイコンが並んで表示されるというもの。

評価ボタンのインターフェースについて

評価ボタンは多くのチャットで採用されている「評価アイコン+人数」という表記にしよう。
その評価ボタンは種類ごとに複数表示しよう。
だれが返信したが、返信したユーザーのアイコンを並べて表示しよう。新しく評価した順で。
とりあえず最大100人くらいまでのアイコン表示とし、超過分は「その他○人」と表示しようかな。
評価ボタンは評価アイコン部分と評価人数部分で分けよう。 評価アイコンをクリックすると評価アクションになり、評価人数をクリックすると他の評価ユーザーを確認できるようにしよう。

評価ボタンとアクション

複数種の評価ボタンが存在するがアクションは一つにしよう。 評価ボタンの種類ごとに複数のアクションを用意するのは煩雑になりそうなのでしない。
特異性のある評価ボタンはパラメータでカバーすれば良いだろう。 パラメータには「型コード(type_code)」と言ったプロパティを一つ用意すれば十分なはずだ。 ロジック側で型コードを見て処理分岐するだけで特異性のある評価ボタンに対応できる。

評価ボタンを押したときがある状態のときは表記を変更する必要がある。
2回目に評価ボタンを押したときは、評価をキャンセルするという処理も必要だ。

DB設計

「★new」と書いている場所が、今回の修正おより機能追加場所になる。
既存テーブルには手を加えない。

  1. users ユーザーテーブル
  2. msg_boards メッセージボードテーブル
  3. msg_board_user_evals メッセージボード・ユーザー評価テーブル ★new
  4. msg_board_eval_types メッセージボード・評価種別テーブル★new

users ユーザーテーブル

Laravelのusersテーブルと同じもの

msg_boards メッセージボードテーブル

FieldTypeNullKeyCommentmemo
idint(11)NOPRIメッセージボードID
other_idint(11)YES外部ID拡張要素。別に空でもよい。
user_idint(11)YESユーザーIDメッセージを書き込んだユーザーのユーザーIDがセットされる。
user_typevarchar(10)YESユーザータイプmasterとguestの2種類あり。
masterは管理者を表し、guestは一般ユーザーを表す。
管理者と一般ユーザーでは機能に違いがある。
messagevarchar(2000)YESメッセージメッセージのテキスト。
attach_fnvarchar(512)YES添付ファイル添付ファイルのパスを保管する。
sort_noint(11)YES順番管理画面用である。メッセージボードのソート自体は生成日時が使われる。
delete_flgtinyint(1)YES無効フラグ削除ボタンを押すと1になる。1の状態だと一覧から表示されない。
update_uservarchar(50)YES更新者ログインユーザー名がセットされる。
ip_addrvarchar(40)YESIPアドレス管理画面用
createddatetimeYES生成日時メッセージ一覧の順番は、この日時が新しい順になる。
新しい投稿ほど上に表示。
modifiedtimestampYES更新日時管理画面用

msg_board_user_evals メッセージボード・ユーザー評価テーブル

★new
FieldTypeNullKeyCommentmemo
idint(11)NOPRI
msg_board_idint(11)YESメッセージボードIDメッセージボードID
user_idint(11)YESユーザーID評価ボタンを押した人のユーザーID
eval_type_idint(11)YES評価種別ID評価の種類。
sort_noint(11)YES順番管理画面用
delete_flgtinyint(1)YES無効フラグ管理画面用
update_uservarchar(50)YES更新者管理画面用
ip_addrvarchar(40)YESIPアドレス管理画面用
createddatetimeYES生成日時管理画面用
modifiedtimestampYES更新日管理画面用
msg_board_id, user_id, eval_type_idの組み合わせでユニークであること。

msg_board_eval_types メッセージボード・評価種別テーブル

★new
FieldTypeNullKeyCommentmemo
idint(11)NOPRI
eval_type_codevarchar(12)YES評価タイプコード評価ボタンの種類毎に設定する一意なコード。
eval_valueint(11)YES評価値現在は未使用。拡張用に。
icon_fnvarchar(512)YESアイコンファイル名アイコンファイルのパス
conversely_eval_type_idint(11)YES反対評価種別ID対となる評価種別ID。例えば「高評価」なら対となる評価種別IDは「低評価」になる。高評価をしたら低評価はキャンセルにする処理が必要であるため。
users_show_flgint(11)YESユーザー表示フラグ評価したユーザーたちの名前を表示するかどうかのフラグ
notevarchar(1000)YESノート評価ボタンの種類毎ごとに説明を書く。管理画面用
sort_noint(11)YES順番管理画面用
delete_flgtinyint(1)YES無効フラグ管理画面用
update_uservarchar(50)YES更新者管理画面用
ip_addrvarchar(40)YESIPアドレス管理画面用
createddatetimeYES生成日時管理画面用
modifiedtimestampYES更新日管理画面用

ER図


評価ボタン押下アクション

Ajaxで送信するパラメータ
プロパティテーブル名.フィールドフィールド名メモ
msg_board_idmsg_boards.idメッセージボードID-
eval_user_idmsg_board_user_evals.user_id評価したユーザーID-
eval_type_idmsg_board_user_evals.eval_type_id評価種別ID-
eval_type_codemsg_board_eval_types.eval_type_code評価種別コード-
delete_flgmsg_board_eval_types.delete_flg無効フラグ未評価であれば0を送信、評価済みなら1を送信する。
eval_cancel_flgなし評価取消フラグ0:評価, 1:評価取消

バックエンド側

msg_board_id, eval_type_id, eval_user_idをWHERE条件にしてmsg_board_user_evalsテーブルからレコードを1件取得を試みる。

レコード次第でDB登録の処理分岐を行う。

レコードを取得できなかった場合→ DB登録は「初回評価登録」になる。
レコード取得に成功且つ、無効フラグが0である場合→DB登録は「評価取消登録」になる。
レコード取得に成功且つ、無効フラグが1である場合→DB登録は「再評価登録」になる。

評価ボタン押下時のDB登録

初回評価登録 → msg_board_user_evalsテーブルへ下記エンティティエンティティを挿入INSERTする。
プロパティ登録する値
msg_board_idAjax送信されてきた値
eval_type_idAjax送信されてきた値
delete_flg0

評価取消登録→2回目に評価ボタン押下時は評価取消登録になる。 → msg_board_user_evalsテーブルへ下記エンティティエンティティをUPDATEする。
プロパティ登録する値
delete_flg1

再評価登録→評価取消から評価状態に戻す → msg_board_user_evalsテーブルへ下記エンティティエンティティをUPDATEする。
プロパティ登録する値
delete_flg0