<style> /* basic design */ .reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6, .reveal section, .reveal table, .reveal li, .reveal blockquote, .reveal th, .reveal td, .reveal p { font-family: 'Meiryo UI', 'Source Sans Pro', Helvetica, sans-serif, 'Helvetica Neue', 'Helvetica', 'Arial', 'Hiragino Sans', 'ヒラギノ角ゴシック', YuGothic, 'Yu Gothic'; text-align: left; line-height: 1.6; letter-spacing: normal; text-shadow: none; word-wrap: break-word; color: #444; } .reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6 {font-weight: bold;} .reveal h1, .reveal h2, .reveal h3 {color: #2980b9;} .reveal th {background: #DDD;} .reveal section img {background:none; border:none; box-shadow:none; max-width: 95%; max-height: 95%;} .reveal blockquote {width: 90%; padding: 0.5vw 3.0vw;} .reveal table {margin: 1.0vw auto;} .reveal code {line-height: 1.2;} .reveal p, .reveal li {padding: 0vw; margin: 0vw;} .reveal .box {margin: -0.5vw 1.5vw 2.0vw -1.5vw; padding: 0.5vw 1.5vw 0.5vw 1.5vw; background: #EEE; border-radius: 1.5vw;} /* table design */ .reveal table {background: #f5f5f5;} .reveal th {background: #444; color: #fff;} .reveal td {position: relative; transition: all 300ms;} .reveal tbody:hover td { color: transparent; text-shadow: 0 0 3px #aaa;} .reveal tbody:hover tr:hover td {color: #444; text-shadow: 0 1px 0 #fff;} /* blockquote design */ .reveal blockquote { width: 90%; padding: 0.5vw 0 0.5vw 6.0vw; font-style: italic; background: #f5f5f5; } .reveal blockquote:before{ position: absolute; top: 0.1vw; left: 1vw; content: "\f10d"; font-family: FontAwesome; color: #2980b9; font-size: 3.0vw; } /* font size */ .reveal h1 {font-size: 5.0vw;} .reveal h2 {font-size: 4.0vw;} .reveal h3 {font-size: 2.8vw;} .reveal h4 {font-size: 2.6vw;} .reveal h5 {font-size: 2.4vw;} .reveal h6 {font-size: 2.2vw;} .reveal section, .reveal table, .reveal li, .reveal blockquote, .reveal th, .reveal td, .reveal p {font-size: 2.2vw;} .reveal code {font-size: 1.6vw;} /* new color */ .red {color: #EE6557;} .blue {color: #16A6B6;} /* split slide */ #right {left: -18.33%; text-align: left; float: left; width: 50%; z-index: -10;} #left {left: 31.25%; text-align: left; float: left; width: 50%; z-index: -10;} </style> <style> /* specific design */ .reveal h2 { padding: 0 1.5vw; margin: 0.0vw 0 2.0vw -2.0vw; border-left: solid 1.2vw #2980b9; border-bottom: solid 0.8vw #d7d7d7; } </style> <!-- --------------------------------------------------------------------------------------- --> #### 朝活mokumoku # ベーカリーポータルサイト開発(vue+amplify) <br> <br> #### 2021.04.03 ### matcha --- ## 自己紹介 ### まっちゃ - 好きなもの:音楽、ベース、水泳、サイクリング、料理 - 主なスキル:typescript、java、vue、AWS、Linuxなど - https://twitter.com/dom12000931 ![](https://i.imgur.com/tIaXMZM.png) --- ## 今回作ったもの ### ベーカリーポータルサイト ### 作った理由 いろんな新作パンを食べたい・・ でもベーカリーってHP・Twitterがないことが多い じゃあベーカリーが新作パンをアピール場を作ろう ### 主な機能 - パン登録 - メッセージ投稿 - チャット - リアクション機能 - 通知機能 - 友達機能 --- ## アーキテクチャ <img src=https://i.imgur.com/MkEbeRd.jpg width=70%/> - バックエンド: amplifyにお任せ(DB、API、ユーザ認証、ストレージ) - フロントエンド: vue+typescript(コンポーネント化し再利用) --- # 工夫したところ メンテ、再利用しやすいを意識して開発 - モジュール責務範囲の定義 - コンポーネントの汎用化 - インタフェース分離 ---- ### モジュール責務範囲の定義 処理特性に合わせてnamespace(ディレクトリ)を分ける ``` component : vueコンポーネント service : 1エンティティ1サービスを作成。CRUD操作を担当。 util : サービスに依存しないモジュール。APIのラッパーなど。 helper : APIラッパーをさらにサービス依存ある状態でアプリ用にラッピング provider : enum関連のデータ参照を実装。だが、サービス依存が多くなってしまった(要再設計) ``` - **utilは、完全にアプリ非依存。他アプリでもすぐ使える** - **CRUDはserviceに集約、メンテ性をあげる** ---- ### コンポーネントの汎用化(1) 画面の種類は、一覧・詳細・編集のパターンになってる 基本レイアウト/処理は汎用化できる - 一覧 - カードを並べる - 検索バーを出す - 詳細 - 編集/削除メニューを出す - 編集 - 新規・更新で同じ画面使う - バリデーションつける - OK/CANCELボタンがある - **vueのslotを活用し枠と共通処理を実装する** ---- ### コンポーネントの汎用化(2) チャット、通知機能、リアクション機能は依存性を持たせない。 他アプリでもすぐ流用できるようにする - 通知 - 通知専用の抽象クラスを実装すれば通知機能を利用可能にする - リアクション - 好きなエンティティにイイネできる - **他データに依存しない設計で開発** ---- ### インタフェース分離 特性に合わせて各インタフェースレイヤを設計 Ex.サービスクラス ```=java ProductService : ユースケースの実装 abstract GqlWithSrcService : image取得/設定処理の実装 abstract GqlGenService : CRUD処理の実装 BaseService : GraphqlAPIのラッパー ``` エンティティを増やすたびにCRUDを実装する必要がない! GqlGenServiceを継承すればOK --- ## まとめ 今回はメンテ性や汎用性を意識して開発しました。 開発スピードが少し犠牲になりますが、 あとでアプリ機能拡張するときや、他アプリを1から作るときに負担が減るかと思いました <br/> ---
{"metaMigratedAt":"2023-06-15T22:11:51.196Z","metaMigratedFrom":"YAML","title":"HackMD presentation Sample2","breaks":true,"slideOptions":"{\"theme\":\"white\",\"slideNumber\":\"c/t\",\"center\":false,\"transition\":\"slide\",\"keyboard\":true,\"width\":\"93%\",\"height\":\"100%\"}","contributors":"[{\"id\":\"4a44801f-e5d5-4d3b-9c41-541cd6940bdb\",\"add\":9411,\"del\":4829}]"}
    310 views