---
# System prepended metadata

title: 開発演習

---

# 開発演習
スケジュール共有システムを作りましょう。

## 背景(fiction)
リモートワークが増えて、社外の方とのオンラインミーティングも一般的になってきました。  
社員が予定を効率よく管理できるようにしたいと思っています。

## アプリ要件

### 初回案
- 社員(ユーザー)
  - ユーザ登録機能
    - 以下の情報は必須で登録できるようにする
      - ID(社員番号)：自動採番でOK
      - ユーザ名
      - パスワード
  - ログイン機能
  - ログアウト機能
  - スケジュールを登録機能
    - 以下の情報は必須で登録できるようにする
    　- タイトル
    　- 場所 or ビデオ会議のURL
    　- 参加者
    　- 詳細
　- スケジュールを確認機能
    　- 日毎の予定の一覧を確認できる画面を作成

### 機能追加
- [追加]管理者(ユーザー)用機能
  - グループ管理機能
    - 登録
      - 登録できる項目
        - グループ名
    - 編集
       - 編集できる項目
        - グループ名
    - 削除
    
  - グループへのユーザ登録機能
    - ユーザをグループに割り当てる(1人のユーザは1グループにしか所属しない)

- 社員(ユーザー)
  - ユーザ管理機能
    - 登録機能は必須
      - 以下の情報は必須で登録できるようにする
        - ID(社員番号)：自動採番でOK
        - ユーザ名
        - パスワード
    - [追加]編集機能
      - 編集できる項目
        - ユーザ名
    - [追加]削除機能
      - 名前
      - パスワード
  - ログイン機能
  - ログアウト機能
  - スケジュールを登録できる
    - タイトル
    - 場所 or ビデオ会議のURL
    - 参加者
    - 詳細
  - スケジュールを確認機能
    - 日毎のスケジュールを確認できる機能  
      - 日付ごとの予定の一覧を確認できる画面を作成
    - [追加]週毎のスケジュール、月ごとのスケジュールを確認できる機能
  - [追加]自分と同じグループのユーザのスケジュールを確認する機能
  - [追加]スケジュール共有機能
    - [追加]未ログインユーザにスケジュールを確認してもらえる
      - [追加]予定のタイトルは見えずに `予定あり` ということだけがわかる（場所などの情報も非公開）

### 機能追加２
- 管理者(ユーザー)用機能
  - グループ管理機能
    - 登録
      - 登録できる項目
        - グループ名
    - 編集
       - 編集できる項目
        - グループ名
    - 削除
    
  - グループへのユーザ登録機能
    - ユーザをグループに割り当てる(1人のユーザは1グループにしか所属しない)

- 社員(ユーザー)
  - ユーザ管理機能
    - 登録機能は必須
      - 以下の情報は必須で登録できるようにする
        - ID(社員番号)：自動採番でOK
        - ユーザ名
        - パスワード
    - 編集機能
      - 編集できる項目
        - ユーザ名
    - 削除機能
      - 名前
      - パスワード
    - [追加]パスワードを暗号化してDBに登録
      - 参考：[bcrypt](https://pkg.go.dev/golang.org/x/crypto/bcrypt)
  - ログイン機能
  - ログアウト機能
  - スケジュールを登録できる
    - タイトル
    - 場所 or ビデオ会議のURL
    - 参加者
    - 詳細
    - [追加]スケジュール登録をした際に、登録完了メールを送信する
  - スケジュールを確認機能
    - 日毎のスケジュールを確認できる機能  
      - 日付ごとの予定の一覧を確認できる画面を作成
      - [追加]画面遷移をせずに、同じ画面の中で、日付を変更することで、別の日の予定を確認することができるようにする(APIの作成&利用)
      [イメージ](https://i.gyazo.com/11845c14d8c0e0c9ba058b5cf9ee78a1.mp4)
    - 週毎のスケジュール、月ごとのスケジュールを確認できる機能
    - [追加]場所が登録されている時に、その予定に、GoogleMapを開くためのボタンを表示する
    - [追加]ビデオ会議のURLが登録されている時に、その予定に、ビデオ通話を開くためのボタンを表示する
  - 自分と同じグループのユーザのスケジュールを確認する機能
  - [追加]自分と同じグループのユーザへのスケジュールの登録依頼機能
  - [追加]自分と同じグループのユーザからのスケジュール登録承認機能
  - スケジュール共有機能
    - 未ログインユーザにスケジュールを確認してもらえる
      - 予定のタイトルは見えずに `予定あり` ということだけがわかる（場所などの情報も非公開）
      - [追加]共有したURLから1度だけ、ユーザのスケジュールを登録することができる


### 最終版
- 管理者(ユーザー)用機能
  - グループ管理機能
    - 登録
      - 登録できる項目
        - グループ名
    - 編集
       - 編集できる項目
        - グループ名
    - 削除
    
  - グループへのユーザ登録機能
    - ユーザをグループに割り当てる(1人のユーザは1グループにしか所属しない)

- 社員(ユーザー)
  - ユーザ管理機能
    - 登録機能は必須
      - 以下の情報は必須で登録できるようにする
        - ID(社員番号)：自動採番でOK
        - ユーザ名
        - パスワード
    - 編集機能
      - 編集できる項目
        - ユーザ名
    - 削除機能
      - 名前
      - パスワード
    - [追加]パスワードを暗号化してDBに登録
      - 参考：[bcrypt](https://pkg.go.dev/golang.org/x/crypto/bcrypt)
  - ログイン機能
  - ログアウト機能
  - スケジュールを登録できる
    - タイトル
    - 場所 or ビデオ会議のURL
    - 参加者
    - 詳細
    - [追加]スケジュール登録をした際に、登録完了メールを送信する
  - スケジュールを確認機能
    - 日毎のスケジュールを確認できる機能  
      - 日付ごとの予定の一覧を確認できる画面を作成
      - [追加2]画面遷移をせずに、同じ画面の中で、日付を変更することで、別の日の予定を確認することができるようにする(APIの作成&利用)
      [イメージ](https://i.gyazo.com/11845c14d8c0e0c9ba058b5cf9ee78a1.mp4)
    - [追加1]週毎のスケジュール、月ごとのスケジュールを確認できる機能
    - [追加2]場所が登録されている時に、その予定に、GoogleMapを開くためのボタンを表示する
    - [追加2]ビデオ会議のURLが登録されている時に、その予定に、ビデオ通話を開くためのボタンを表示する
  - [追加1]自分と同じグループのユーザのスケジュールを確認する機能
  - [追加2]自分と同じグループのユーザへのスケジュールの登録依頼機能
  - [追加2]自分と同じグループのユーザからのスケジュール登録承認機能
  - [追加1]スケジュール共有機能
    - [追加1]未ログインユーザにスケジュールを確認してもらえる
      - [追加1]予定のタイトルは見えずに `予定あり` ということだけがわかる（場所などの情報も非公開）
      - [追加2]共有したURLから1度だけ、ユーザのスケジュールを登録することができる