#facebookもどき 仕様書 ##目次
- サービス名、コンセプト、機能要件、未確定要件
- 見積もり
- UI設計
- テーブル設計
##サービス名、コンセプト、機能要件、未確定要件 ###サービス名 ###コンセプト ###機能要件
通し番号 | 担当 | 要件 |
---|---|---|
1 | ユーザ | ユーザはemail, password, 氏名で新規登録できる |
2 | ユーザ | ログイン前のユーザはタイムラインの閲覧のみ可能 |
3 | ユーザ | 登録 or ログイン後のユーザは投稿が可能 |
4 | ユーザ | 投稿できる内容はコメントと写真。写真は最大3枚まで。 |
5 | ユーザ | 投稿されたものに返信ができる |
6 | ユーザ | 投稿されたものと返信にはいいねができる |
7 | ユーザ | 他の人をフォローすることができる |
8 | ユーザ | 投稿は公開レベルを設定できる。全体公開、フォロワーのみに公開、自分のみに公開 |
9 | ユーザ | ユーザはグループを作成可能、facebookのグループのようなもの |
10 | ユーザ | フォローしているユーザの投稿から構成されるタイムラインが作成可能 |
11 | ユーザ | いいね、コメントをするとその投稿をした本人と他にコメントをした人に通知が飛ぶ |
12 | ユーザ | ユーザの影響力を集計。投稿にいいねされると1点、投稿をすると1点、コメントにいいねがつくと1点、プロフィールが閲覧されると1点。影響力は一部カスタマイズする |
13 | ユーザ | おすすめユーザ機能。影響力の高い順に並んだランキングを作成しフォローをおすすめする。 |
14 | ユーザ | ユーザはメールの通知を受け取るか受け取らないかを設定可能 |
15 | ユーザ | プロフィールページを作成 |
16 | グループ | グループ内への投稿が可能 |
17 | グループ | グループは招待制、グループメンバーのみが他の人を招待可能 |
18 | グループ | グループ内の投稿はグループメンバーのみ閲覧可能 |
19 | グループ | グループへの投稿内容はコメントと写真、返信はなし、いいねあり |
20 | 管理画面 | ユーザが一覧できる |
21 | 管理画面 | ユーザ情報の詳細、Feedの内容などが見られる |
22 | ユーザ | 影響力をrakeタスクでカスタマイズする |
23 | ユーザ | Feed, Reply, GroupPostが投稿されると、Slackに通知が飛ぶ |
###機能要件の未確定部分 テーブル設計にも関連
- adminとuserを分離するか yes
- userでないadminが存在するか yes
- adminは複数人登録可能か yes
- 投稿は編集・削除可能か
- reply含めた流れが消えるのでできれば不可としたい can edit, but can't delete
- 編集可能でないとしても、公開度だけは編集可能か yes
- ログイン後すぐの画面(first view)において表示する投稿は公開投稿&フォローユーザー投稿&グループ投稿で良いか yes
- グループに友人以外のuserを招待可能か no
- 不可として、相互フォローのみ招待可能とするか、片側フォローでも可とするか only follow_followed relationship
- フォローユーザー投稿への切り替えはページ遷移とするか、first viewと同じ画面で切り替える same page
###機能要求の追加部分、まとめた方がわかりやすい部分
- 編集・削除可能かどうかなどについて
モデル名 | 編集 | 削除 |
---|---|---|
feed | 公開度のみ可 | 不可(公開を自分のみにすることはできる) |
reply | 不可 | 不可 |
feed_favorite | 不可(定義的に) | 可 |
reply_favorite | 不可(定義的に) | 可 |
##見積もり まずは基本機能から
- ユーザーモデル関連(devise)
- 新規ユーザー作成
- ユーザーのログイン
- ユーザーのログアウト
- ユーザーのプロフィール変更(hobbyはinfluenceまで後回し、写真も後回し)
- フォロー機能(influenceは後回し、とりあえずユーザーを列挙してフォローできるように、フォローは拒否できない、解除は可能)
- ユーザー一覧を表示させる(名前とかのプロフィールは見れる状態)
- フォローできるようにする
- 個人投稿(feeds)作成(写真は後回し、とりあえず文字だけ)
- ファーストビューとっかかり
- ファーストビュー1(ログイン前)
- ファーストビュー2(ログイン後1)
- ファーストビュー3(ログイン後2、フォロワーの投稿に限定)
- 個人投稿続き
- 返信機能
- いいね機能
- 編集機能(公開度のみ)
- グループ
- グループ作成
- 招待
- グループ内投稿作成
- グループ内投稿閲覧
- 投稿へのいいね
- ファーストビューの改良
- feedsだけでなくグループ投稿も表示できるようにする
- 写真関連(carrier wave)
- 投稿
- 個人のfeedで
- グループ内で
- feedへのコメントで
- プロフィール写真
- まず設定できるように
- フォロー画面で表示できるように
- クリックしたら大きくしてもいいかも
- 投稿
- 通知機能(mailer)
- いいねした時の通知
- コメントした時の通知
- 管理者権限
- namespace使ってまず機能(profileの生年月日見れる)を
- ログイン関連
- 新規登録
- ログイン
- ログアウト
- UI
- Bootstrapの導入
- 実装
- influence
- 全員共通の影響力(投稿やいいね数)
- ユーザーのhobbyテーブルの作成
- 影響力のカスタマイズ化のアルゴリズム決定
- アルゴリズム実装(投稿数、いいね数、etc..)
##UI設計 ##テーブル設計 ###1. users
column | 説明 | type | default | null | 備考 |
---|---|---|---|---|---|
メアド | string | false | |||
name | ユーザーネーム | string | false | ||
password | パスワード | string | false | ||
birth_date | date | true | 自由登録 | ||
picture | 写真 | true | 自由登録 | ||
notification_allowed | 通知設定 | tinyint | 0 | false |
誕生日は登録自由、公開only。 ageはbirth_datesに合体
###2. hobbies => 類似度に使わないことになったので不要となった
###3. users_hobbies => 類似度に使わないことになったので不要となった
###4. follow_relationships
column | 説明 | type | default | null | 備考 |
---|---|---|---|---|---|
follower_user_id | integer | false | |||
followee_user_id | integer | false |
###5. similarities (influecesより変更)
column | 説明 | type | default | null | 備考 |
---|---|---|---|---|---|
similarity | 類似度 | float | 0 | false |
influenceをどうやって定義するか ①自分のフォローしてるユーザーにいいねされまくってるユーザー、趣味共通のユーザー、をオススメしたい(年齢や誕生日はプライバシー感があるのでオススメには使わず) ②始めたばっかで友達少ないユーザーにはフォロワーめっちゃ多い人もオススメ
つまり、完全カスタマイズではなく、多少は共通部分もあるようにする。そうすればユーザーからすると、使い始めもサポートしてくれる一方で友達増やしたりサービス使えば使うほどオススメの精度が上がったように感じられるはず?
=> 投稿の情報を元にオススメすると、複数種類の情報を組み合わせて類似度として評価することになり、どうしても恣意的になる。 今回はフォロー関係のみからcos類似度を用いて評価することにした。 フォロー関係が一切存在しない場合、類似度は全て0になってしまい評価できないので、 この場合はフォロワーが多い人をオススメすることにした。
###6. groups
column | 説明 | type | default | null | 備考 |
---|---|---|---|---|---|
name | グループ名 | string | false |
###7. groups_users
column | 説明 | type | default | null | 備考 |
---|---|---|---|---|---|
group_id | integer | false | |||
user_id | integer | false |
###8. feeds 個人の投稿
column | 説明 | type | default | null | 備考 |
---|---|---|---|---|---|
user_id | integer | false | |||
content | メッセージ内容 | stringか写真 | false | ||
privacy | 公開度 | enum | public | false | share_with_all, share_with_follower, share_with_only_meの3つ |
###9. group_posts
column | 説明 | type | default | null | 備考 |
---|---|---|---|---|---|
user_id | integer | false | |||
group_id | integer | false | |||
content | メッセージ内容 | stringか写真? | false |
###10. group_post_favorites
column | 説明 | type | default | null | 備考 |
---|---|---|---|---|---|
group_post_id | integer | false | |||
user_id | integer | false |
###11. replies 個人の投稿に対する返信
column | 説明 | type | default | null | 備考 |
---|---|---|---|---|---|
post_id | integer | false | |||
user_id | integer | false | |||
content | 返信内容 | stringか写真 | false |
###12. feed_favorites
column | 説明 | type | default | null | 備考 |
---|---|---|---|---|---|
post_id | integer | false | |||
user_id | integer | false |
###13. reply_favorites 個人投稿への返信へのファボ
column | 説明 | type | default | null | 備考 |
---|---|---|---|---|---|
reply_id | integer | false | |||
user_id | integer | false |
###14. admin_users
column | 説明 | type | default | null | 備考 |
---|---|---|---|---|---|
メアド | string | false | |||
name | ユーザーネーム | string | false | ||
password | パスワード | string | false |
column | 説明 | type | default | null | 備考 |
---|---|---|---|---|---|
feed_id | integer | false | |||
picture | string | false |
carrierwaveを使ったので、pictureカラムにはstringが入る
column | 説明 | type | default | null | 備考 |
---|---|---|---|---|---|
reply_id | integer | false | |||
picture | string | false |
column | 説明 | type | default | null | 備考 |
---|---|---|---|---|---|
group_post_id | integer | false | |||
picture | string | false |
column | 説明 | type | default | null | 備考 |
---|---|---|---|---|---|
similairty_id | integer | false | |||
user_id | integer | false |
類似度はユーザー2人の組に対して計算されるものなので、5.で定義したsimilaritiesテーブルの各レコードに対して、 それがどの2人の類似度かを示したもの。