チームで出欠管理システムを作りました

社内チームで今年一年の成果物として出欠管理システムを作成しました！！
この記事ではその概要を紹介します。

# プロジェクト概要
成果物として何を作成するかチームで話し合い、社内全体で利用でき作業効率化につながるシステムについて考えました。
社内行事の出欠管理がExcel管理されており、作業負荷がかかる状態だったため、この改善としてQR認証を利用した出欠管理システムを作ることになりました。

# システム運用イメージ
1. 管理者がユーザーのQRコードを発行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502127/46076814-d146-e00d-7984-714f5aca06d9.png)

1. 管理者がユーザーへQRコードを送付（Slack・メール等）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502127/1b843c67-94a2-7a4e-c2ee-ce95da3dd921.png)

1. 開催者がイベント開催日を登録

1. ユーザーがイベント参加時にQRコードをかざす
（開催者はQR認証画面を表示しておく）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502127/54ac2838-e0f1-add9-b0a9-5baf981c78bc.png)

1. 開催者がイベントの出席状況を確認する

# システムの使い方
### QRコード発行
- 「QRコードを生成する」を選択します。
![01 - コピー.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502127/19194c73-eeb0-3832-983b-2a59a05cb2c5.png)

- ユーザーコード・ユーザー名を入力します。
![02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502127/aaa1f41d-c167-1a7e-76b1-7fc939071cdb.png)

- QRコードが発行されます。
管理者は各ユーザーへQRコードを通知します。
![03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502127/421e6e3a-ac97-e5e1-3cbe-e3b0d2bfbe40.png)


### イベント登録/QRコード読み取り
- 「QRコードを読み取る」を選択します。
![01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502127/9d2bb023-72a3-afb4-6353-1a7dc0302286.png)

- イベント名・イベント日付を入力します。
![05.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502127/0534582f-babb-846a-5b7f-c1adcdf21389.png)


- 登録したイベントを選択します。
![06.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502127/f2478c0a-9133-cdbf-cd60-d762b5144ce6.png)

- QRコード読み取り画面が表示されるので、QRコードを認証します。
![07.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502127/eb9a76ae-2731-55d3-57dc-1ead9a633840.png)

- QRコードの認証に成功するとこのような画面になります。
![08.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502127/307f78c5-416a-6d73-95a9-c1bd50cd2c6d.png)

### イベント履歴確認
- 「イベント履歴を見る」を選択します。
![09.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502127/09320f5a-456d-976f-196a-f064c80cd0c3.png)

- 登録済みのイベントが表示されます。
![10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502127/af4da446-4102-42ce-ff06-8c4f2f71509f.png)

- イベント参加者が確認できます。
![11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502127/8d3a820f-81f0-22ce-b5a8-33c5787a1519.png)

# 活用技術
メンバーの各々が得意な分野を用いて作成されています。

- 実行環境
  - GCP
        - Compute Engine
        - Cloud DNS
        - Cloud Load Balancing
  - Docker
        - Nginx
        - PostgreSQL
- Webアプリ
  - JavaScript
        - node.js
        - Vue.js
        - TypeScript
- API
  - Python
        - Flask

# システム構成
GCPを利用して環境を構築しました。
Web画面、API、DBをVM上にDockerコンテナとして常駐させています。
タブレットでブラウザからURLへアクセスするとDNS・LB・Nginxを経由、Web画面またはAPIへリクエストし、QRコード生成/認証・イベント履歴閲覧などの各処理を行う実装方式としています。
QR認証履歴などの各データへのアクセスはAPIからDBへSQLを発行することで保存するようにしました。

![構成図.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502127/6620235d-8387-f338-61b9-90fecdb96e2e.jpeg)

# 開発期間
主担当3人で日常業務の片手間で約3か月ほどかかりました。
実際の作業時間はもっと短かったです。

# 苦労した点
- 担当者3人で作った成果物の結合  
インフラ面で統一した開発環境を用意せず進めたため、実際に結合した際にCORSの考慮漏れ等でwebアプリがうまく動作しませんでした。  
躓いた点はIssueに整理して今後のチーム開発では気を付けていきます。
- クライアントからAPIへのアクセス  
Web画面からAPIにリクエストする際、クライアントからリクエストを飛ぶことを意識していなかったため、ファイアウォールやDNS・LB・Nginxの設定に苦労しました。  
今後システム構成を考える際は意識していきたいと思います。


# 今後の展開
- 管理画面への**ログイン認証機能**の実装  
実装工数が足りなかったため実装できませんでした。  
Amazon Cognitoを利用した実装を検討中です。
- システム基盤を**AWS**へ移行  
前述のAWS Cognito実装などAWSサービスの勉強も今後チームで実施していきたいと考えています。  
併せて、基盤移行も検討中です。
- 各社内イベントでの**運用**  
コロナの影響で実際に人が集まる機会がなく、テストが不十分です。  
データ量や負荷など分からない点が多いので、今後活用してもらっていきたいと考えています。