# MedicalCheckApp - 健康診断アプリケーション
2020-05-18 中村

新ソフトウェア工学の
[第4回演習課題](http://www27.cs.kobe-u.ac.jp/~masa-n/lecture/newse/04/enshuu04.html)
を題材にしたSpring Boot Application．

- Spring Boot JPA を使ってデータベースを操作する練習をする．
- Thymeleaf を使ってサーバサイドでのView生成を行う．

## 元の課題
### 問1（基礎）
健康診断における受診者の個人情報を管理するクラスPersonを作成しなさい．  
- 管理する個人情報は名前(name)，生年月日(birthday)，身長(height)，体重(weight)
- 生年月日はString型 (yyyy-mm-dd) ，身長(cm)・体重(kg)はそれぞれdouble型で扱いなさい
- デフォルトコンストラクタ public Person() を作成しなさい．空のインスタンスを作成すること．
- 引数付きコンストラクタ public Person(String name, String birthday, double height, double weight) を作成しなさい．
    - インスタンス生成と同時に４つのフィールドに値がセットされるようにすること
- 個人の情報を画面に表示するメソッド public void showPerson() を作成しなさい
    - 表示例：「中村さんの生年月日は1972-01-14，身長は179.5cm，体重は86.2kgです」
- 個人の[BMI (Body Mass Index)](https://ja.wikipedia.org/wiki/%E3%83%9C%E3%83%87%E3%82%A3%E3%83%9E%E3%82%B9%E6%8C%87%E6%95%B0) を計算して返すメソッドpublic double getBMI()を作成しなさい．
- 個人のBMIの値に応じて，肥満指標を診断して画面に表示するメソッド public void showObesity()を作成しなさい
    - 表示例： 中村さんのBMI値は26.8，肥満（1度）です」
    - 肥満指標は[日本肥満学会の肥満基準](https://ja.wikipedia.org/wiki/%E3%83%9C%E3%83%87%E3%82%A3%E3%83%9E%E3%82%B9%E6%8C%87%E6%95%B0#%E5%88%A4%E5%AE%9A%E5%9F%BA%E6%BA%96)を用いること．

### 問2（応用）
健康診断の全ての受診者の個人情報を管理するクラス PersonManagerを作成しなさい．
- PersonManagerは，複数のPersonインスタンスを管理し，各インスタンスを受診者番号(number)で識別する．
- 受診者の情報を登録するメソッド public void addPerson(int number, Person person) を持っている
- 受診者の情報を取得するメソッド public Person getPerson(int number)　を持っている
- 全ての受診者の番号と名前を出力するメソッド public void showAllPersons() を持っている
- データファイルから受診者の一括登録を行うメソッド public void loadPersonFile(String fileName) を持っている．
    - ここでデータファイルは，1行が以下の形式のCSVファイル(Comma-Separated Values，コンマ区切り形式)である．
    - 受診者番号,名前,生年月日,身長, 体重

## 作成するWebアプリケーション

### 画面
<img src="design/screens.png">

#### 静的ページ (resources/static)
- index.html: アプリの入口ページ
#### テンプレート (resources/templates)
- list.html: 受診者を一覧するページ
- register.html: 受診者を登録するページ
- update.html: 受診者を更新するページ

### 画面遷移
<img src="design/transition.png">

- <span style="color:red;">赤字</span>は画面に対応するURL
- 画面間の遷移のラベルは，[ボタン・リンク押下] / [コントローラへのアクション] を表している
- redirect:/persons は，アクション終了後にリダイレクトを行う


## 作成するWeb-API
Personを操作する以下のWeb-API．またこれらをMySQLで永続化する．

お手本用にRESTfulにCRUDとHTTPメソッドをきちんとマップする．

### 登録系 API
- `POST /api/persons` : 受診者データを追加する
```
リクエストボディ
{ "name":  名前,
  "birthday": 生年月日yyyy-mm-dd,
  "height": 身長(cm),
  "weight": 体重}
```


### 取得系 API

- `GET /api/persons` : 全受診者の情報をリストで取得する（BMI，肥満指数も含めて）
```
レスポンスボディ
[
{ "number": 受診者番号1,
  "name":  名前,
  "birthday": 生年月日yyyy-mm-dd,
  "height": 身長(cm),
  "weight": 体重,
  "bmi": BMI値,
  "obesity": 肥満度},
{ "number": 受診者番号2,
...
},
:
]
```
- `GET /api/persons/{number}` : 受診者番号で1人の受診者情報を取得する（BMI，肥満指数も含めて）
```
レスポンスボディ

{ "number": 受診者番号,
  "name":  名前,
  "birthday": 生年月日yyyy-mm-dd,
  "height": 身長(cm),
  "weight": 体重,
  "bmi": BMI値,
  "obesity": 肥満度}
```

### 更新系 API
- `PUT /api/persons/{number}`: 受診者番号を指定してデータを更新する
```
リクエストボディ
{ "name":  名前,
  "birthday": 生年月日yyyy-mm-dd,
  "height": 身長(cm),
  "weight": 体重}
```

### 削除系 API
- `DELETE /api/persons/{number}`: 受診者番号を指定してデータを削除する
```
リクエストボディ
なし
```

### カスタム検索系 API
- `GET /api/persons/name?str=STRING` : STRINGを名前に含む受診者情報を検索する
- `GET /api/persons/height?min=MIN&max=MAX` : 身長がMIN～MAXの間の受診者情報を検索する
- `GET /api/persons/weight?min=MIN&max=MAX` : 体重がMIN～MAXの間の受診者情報を検索する
- `GET /api/persons/birthmonth?month=MON` : 生まれ月がMONの間の受診者情報を検索する


