【ポートフォリオ】初心者🔰がLaravelでカーシェアアプリ開発

![logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969534/3993caa9-7e3d-3cb4-ed4b-8227a5ce404e.png)
# 概要
車両を保有している人と保有していない人を結ぶアプリケーション。大手カーシェアリングサービスのように車両を会社からドライバーに貸し出す(BtoB)のでなく、**個人間で気軽に貸し借りができるサービス(CtoC)をコンセプト**とした。</br>
※悪意のあるイタズラが多発したため、アプリリンクは貼っていません。
![スクリーンショット 2021-02-13 15.35.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969534/b05dbb6f-d2c6-1c1b-b0e3-1202e185dab2.png)

# 制作背景
交通インフラの整備や若者の車離れの影響を受け、自動車の国内需要は1990年ごろをピークとして年々減少している。これに伴い、大手のBtoBカーシェアリングサービス(タイムズ)の会員数は過去5年間で約4倍以上伸びている。対して、**今後伸びてくると予想されていたCtoCのカーシェアリング業界は伸び悩んでいる**というギャップが生じている。この現象に疑問を持ったため、原因をトヨタの問題解決の手法を用いて考え、このギャップを解決するサービスの開発を行った。
[→[制作背景詳細 リンク](https://docs.google.com/presentation/d/1OABJBOwKqDq_JxD1KIYu-qL-ZuTJeTTjMZKbfSKyjW8/edit?usp=sharing)]

# システム概要
このサービスのユーザーは3パターンに分けられる。</br>
A. ドライバー (車を借りたい人）</br>
B. オーナー （車を貸したい人）</br>
C. 管理者 (Car.マッチング株式会社:自動車保険会社）</br>
![systemflow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969534/1b9b9f15-6a68-3c21-763f-7fb4cbefd75d.png)
# 操作説明

各ユーザーの操作方法について下記に示す。
### A. ドライバーの基本操作

①ログイン</br>
②希望の条件(日時や乗車人数)で検索</br>
③該当したオーナーとチャットでの交流</br>
④車両を借りることへの不安がなくなれば、契約を結んでもらえるようオーナーへ依頼</br>
![driver.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969534/2d71b607-9cfa-c5cd-9ca7-1c9bf4006f75.gif)

***

### B. オーナーの基本操作

①ログイン</br>
②車両を貸し出せる日程を登録</br>
③ドライバーから依頼があればチャットにて交流</br>
④オーナーとドライバーが契約条件に合意した場合、契約フォームに入力</br>
⑤確認メール送信
![ownerQiita2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969534/28cb828b-1075-6e2d-434f-6270d8fd8712.gif)
***

### C. 管理者(Car.マッチング株式会社:自動車保険会社）の基本操作

①ドライバーとオーナー間で契約が結ばれた後、DBへ内容が保存されるため、それらを表示</br>
②この登録情報を見て自動車の保険の加入手続き・料金の支払い手続きに移行
![admin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969534/b5d9c294-73eb-8078-9c09-02064d8de23c.png)
 
# こだわり
私はCtoCのカーシェアリング業界が伸びていない原因は主に下記の3点に起因すると考える。</br>
①初期登録操作のハードルが高い</br>
②条件に合う車両を探す作業が煩わしい</br>
③全く交流がない他人から車両を借りることへの不安がある</br>

これらを解決するために下記にこだわって開発した。

**A. 初期登録の簡略化**</br>
初期の登録はなるべくシンプルにしておき、ドライバーとオーナーの交渉が成立してから、更に必要な情報を入力させる。ナンバープレート情報や料金の設定など初期登録の際に煩わしさを感じるものは契約時に入力させる。
    
**B. 操作がシンプル**</br>
マルチログイン機能を実装してドライバーとオーナーの操作を分け、余分な機能は付けず、直感的に分かりやすい構成を心がける。</br>
* ドライバーの操作： 初期登録 → 検索 → チャットによるオーナーとの交渉</br>
* オーナーの操作 ： 初期登録→ 貸出日程登録 → チャット → 契約詳細入力
    
**C. LINEのような手軽さで個人間でチャットが可能(非同期通信)**</br>
アプリ内のチャット機能を、スマートフォンユーザーのおよそ80％が利用しているLINEの操作に合わせることで、誰でも容易にチャット機能を使って交流できる。また、非同期通信を行うことによって画面の遷移無しで、相手のメッセージを受け取ることができる。


上記とは色合いが異なるが、その他にもユーザーと管理者を思いやった機能も追加した。    

**D. 契約内容のエビデンスとしてメールの自動送信**</br>
オーナーが契約内容を入力後、確認メールが自動でドライバー・オーナー・Carマッチング（自動車保険会社）へと送付される。これにより、ドライバーとオーナーとの間で契約した内容を失念しても、再度確認することができる。また、料金や内容の相違でトラブルが起きた際に、エビデンスとして示すこともできる。

**E. 管理者用の契約内容閲覧機能**</br>
ドライバーとオーナー間で契約が結ばれた後、DBへその内容が保存されるため、その内容を表示する機能。その内容を見て自動車の保険の加入手続き・料金の支払い手続きに移行する。<br>

# 使用技術
 
**バックエンド**
PHP 7.2.34 / Laravel 6.20.5

**フロントエンド**
HTML / CSS / javascript / jQuery 3.2.1 / Vue.js(現在学習中のため今後組み込む)

**インフラ**
mysql 8.0.22 / AWS(EC2,S3)

**その他の使用技術**
Pusher / git(gitHub) / Visual Studio Code / draw.io / Gmail
 
# AWS構成図
![aws.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969534/29c7d35c-12cd-cc09-1535-4b770ef95db3.png)


# DB設計
### ・ ER図
![finaltable.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969534/f817f059-6573-7b78-ae38-98e6d2cea93f.png)

### ・ 各種テーブル
| **テーブル名** | **定義** |
| ---- | ---- |
| owners<br>(オーナー) | オーナーの登録情報 |
| drivers<br>(ドライバー) | ドライバーの登録情報 |
| owner_schedules<br>(オーナースケジュール) | ドライバーの車両貸出可能な日程 |
| chats<br>(チャット) | 会話の内容 |
| contracts<br>(コントラクト) | 契約確定後、契約内容を格納|


# 苦労したところ
### ①DB設計
ER図を添付していますが、実際のアプリケーションとテーブル名やカラム名に相違があります。テーブルの命名規則の理解が曖昧ままDB設計をしており、キャメルケースを用いた記述をしてしまいました。開発終盤に気付きましたが、影響範囲が広すぎて修正が困難になりました。この失敗を二度と繰り返さないよう再度学習を行い、Qiitaにまとめています。初期設計の重要性を身に染みて学びました。[→[Qiita記事 リンク](https://qiita.com/tatsuya_1995/items/4b706fc40fe2f300bbc0)]

### ②Laravelのマルチログイン機能
ドライバーとオーナーで初期の登録方法やログインした後の挙動が変わるため、マルチログイン機能を実装する必要がありました。Laravelでは基本のログイン機能がついていますが、これを応用して２通りのログイン機能を作りました。変更が必要なファイルが多く、それぞれの関連性が分かっていなかったため、苦労しました。ここで３日以上も悩んだことで認証やミドルウェア・ルーティングについての知識を身に着けることができました。[→[Qiita記事 リンク](https://qiita.com/tatsuya_1995/items/92f5448175bd33097c13)]


### ③AWSでのデプロイ
web系企業ではクラウドはAWSが主流になっていますのでAWSを用いて本番環境を構築しました。初めてのVimコマンドの操作に慣れていないことや、ディレクトリの階層も頭に入っていなかったことで、configファイルや.envファイルを探したり編集するだけでかなり難航しました。VPCの生成から数えると30〜40時間以上かけてなんとかデプロイしました。多く悩んだ分、仮想サーバーやIPアドレスの知識・コマンドの操作などを身に着けることができました。

### ④websocket通信を用いたチャットの非同期通信
外部API(pusher）を用いたリアルタイムチャットの実装に挑戦しました。実装に必要な作業をなるべく最小単位に分割して進めていきました。非同期でのメッセージの受信はできるようになったものの、ドライバー側からのメッセージなのかオーナー側からのメッセージなのかを分岐させることができません。少し手詰まり状態にありますが、今も諦めずにトライしています。

### ⑤LaravelのCollection型の条件分岐（ユーザーからのフィードバック）
知人にアプリケーションの操作トライを依頼した際に、「検索後、該当するものが無かった時にコメントが出ないので分からない」とアドバイスを受けました。これを受け、検索する前・検索して成功した時・検索して失敗した時と３つの条件で表示を分岐させました。この時にLaravelのCollection型の扱いについて理解が少なく、空値判定がうまくいかず長時間悩んでしまいましたので、学習してQiitaにまとめました。[→[Qiita記事　リンク](https://qiita.com/tatsuya_1995/items/e244099cdc7ab48d55db)]

# 最後に
転職活動のポートフォリオとして製作しています。実務未経験者が独学で作ったため、内容に誤っている点があるかと思います。お手柔らかにお願いいたします。今後実務を経験して、過去の実力を振り返られるように記録として執筆しました。