# 知識情報システム演習A1第3回
## Agenda
- 具体的な開発方針について決める
- バックエンド中心に三宅がざっくり作ったので足りない部分の追加や検証作業
- 作業分担
- ざっくりとした開発スケジュールを立てる
- Githubでリポジトリを作る
- 次回までの開発目標を決める
## 大概念
- お勧めの観光地を紹介する
- ここに行けで1つ表示
- 位置情報
- 目的地(水戸)
- ジャンル
- ここに行ってくれたらメイドポイント
- 評価してくれたらメイドポイント
- メイドポイントためると何かが出来る
- GoogleのAPI叩いてDB登録しましょう
- 基本情報は独自にDB
- 名前
- 位置情報
- 都道府県、市町村コード
- ID(Google API)
- ID(我々が独自に定義したやつ)
- 電話番号
- 星
- 皆のデータで平均取っていく(都度計算)
- それ以外の情報はAPIを叩いて取得
- 緯度経度で検索
- 市町村コードをぶち込む
- 取ってきたレコードの位置情報で幾何計算
- 投稿機能
- 新規コンテンツ
- 名前
- 重複登録の可能性
- 偕楽園
- 水戸の綺麗な庭園(偕楽園)
- 位置情報であまりにも近いところは重複登録と見なす
- 隣のお店が登録出来なくなる
- 気にしないことをお勧め
- 場所
- 感想文
- 星5つの評価
- 写真(任意)
- サーバー上でpublicなディレクトリに放り込む
- 一意のIDで紐付ける(ファイル名をID名する感じ)
- 写真の参照はリンクを叩く
- フォームを作ろう!
- 内部的な情報
- 一意のID
- 都道府県コード or 市町村コード
- 編集機能はとりあえず実装しない
- 評価
- IDに対して書き込む
- 投稿内容は投稿機能と同じ
- DBの実装
- 観光地の情報
- 名前
- 位置情報(緯度経度)
- 都道府県、市町村コード
- ID(Google API)
- ID(我々が独自に定義したやつ)
- 電話番号
- 星
- 作成時タイムスタンプ
- 更新時タイムスタンプ
- 投稿データ
- 作成時タイムスタンプ
- 更新時タイムスタンプ
- 投稿者ユーザーID
- 場所(ID)
- 感想文
- 星5つの評価
- 写真(任意)
- 写真はBase64で送りつける
- サーバー上でpublicなディレクトリに放り込む
- 一意のIDで紐付ける(ファイル名をID名する感じ)
- 写真の参照はリンクを叩く
- フォームを作ろう!
- 内部的な情報
- 一意のID
- 都道府県コード or 市町村コード
- ユーザー情報
- 名前
- ID
## 開発方針
### DBの仕様
**名前は仮なので適宜変更**
市町村コードは下記のリンクを参考。これでDBを構築するのが良き。
CSVデータもあるので一瞬で作れます。
https://www.soumu.go.jp/denshijiti/code.html
- place_info(観光地名)
- name, text not null
- id, uuid not null primary key
- updated_at, time
- created_at, time not null
- pref_code, text not null
- tel, text not null
- desc, text // 説明文などの補足資料
- g_uuid, text not null // Google APIで一意に振られるID。独自実装がこちらに合わせることが出来ればこれを主キーにする。
- star, number not null default 0
- lat, number not null // 緯度
- lon, number not null // 経度
- 投稿データ
- id, uuid not null primary key
- updated_at, time
- created_at, time not null
- user_id, uuid not null
- place_id, uuid not null // place_info(仮)のID
- message, text //nullable
- star, number not null default
- photo_id not null default empty string // 補足します
#### photo_idについて
画像の枚数などは動的に変化する上にリレーションで扱いにくいのでRedisというNoSQLなDBを作ります。これはnotch_manが用意するので問題ないです。photo_idはredisにデータを記録した時に一意に定まるキーを発行するのでそれをこちらのDBに保存します。
## バックエンドAPIの開発
言語指定あったっけ?
- Go
- Python(Flask)
のどちらかで作りましょう。notch_man的にはGoが好きです。
JSONでざっくりとした仕様しか示さないで補足あればMTGで(ほんまはAPI Blueprint使うべきだけど時間が無かったのでごめんなさい)
画像アップローダーは別に実装します(方法は要検討)
### 投稿API
新規にデータを投稿する(POST)
#### input
```json=
{
"user_id": "example-user-id",
"message": "hogehoge",
"star": 4.5
"photo_id": "photo-link-id"
"id" : :"post-id" // これを設定すると編集になる。ない場合は新しいテーブルでデータを保存。つまり、編集機能をサポートする。
}
```
#### 200
```json=
{
"status":"success"
}
```
#### 4xx,5xx
```json=
{
"status":"success",
"message":"An error occured in this server"
}
```
### 観光地情報API
新規にデータを投稿する(POST)
#### input
```json=
{
"user_id": "example-user-id",
"message": "hogehoge",
"lan": 45.9,
"lon": 135.8
"star": 4.5,
"photo_id": "photo-link-id"
"title" : "hogehoge動物園"
}
```
#### 200
```json=
{
"status":"success"
}
```
#### 4xx,5xx
```json=
{
"status":"success",
"message":"An error occured in this server"
}
```
次に行く観光地をサジェスト(POST)
Inputパラメーターにnull許容でさまざまな値を放り込めば柔軟に検索できるようになる。追加仕様はお任せします。ミニマムは緯度経度だけなのでこちらはnot null制約でお願いします。
#### Input
```json=
{
"lon" : 45.03
'lan' ; 136.3
}
```
### 200
```json=
{
"name": "hogehoge植物園"
"lon" : 46
"lan" : 135.6
"photo_id" : "example-photo-link"
"star":3.2
"id" : "uuid"
}
```
#### 4xx,5xx
```json=
{
"status":"success",
"message":"An error occured in this server"
}
```
### 中のロジックで作らないといけなさそうな物
- 緯度経度からpref_codeを取得
### フロントエンド
**力尽きました**
フロント担当になった人は三宅と打ち合わせしましょう。
## タスク分担
- バックエンド:
- データベースの作成・登録
-
- API作成
- reon
- notch_man(レビュー担当)
-
- フロントエンド:
- notch_man
- メイド関連(別途)
- やりたい人募集
- メイドちゃん(非技術領域)
- アセット集め
- セリフ作成など
### Flask sample
```python=
@app.route("/message_twitter_3_fast",methods=['POST'])
def example():
# リクエストパラメーターを取得
message = request.json['message']
original_message = request.json['original_message']
#(中略、各種処理)
return jsonify({'messages': result,"score":score})
if __name__ == "__main__":
app.run(host='0.0.0.0', port=9000)
```