Contents
一段落は正しくはいちだんらくと読みます
ちょっと時間が経ってしまったし、次のLaravelなどの習得に掛かりたいので一段落つけます。
環境はこちらを使います。
https://github.com/mayarin/NodejsMySQLDocker/releases/tag/20201106
こちらの残り作業は以下の通り。
・入力バリデートをHTML5でいいので実装
・パスワードリマインダ
・ログイン中の会員情報の修正
・機能実装(今回は行先掲示板にでもします)
・herokuに公開
・気が向いたらAngularでSPAにしてみる
このうち下2つを次回に回します。
入力バリデートから対応
入力バリデートはHTML5のrequiredを利用。pug文法では以下の通りの記述になりました。
input.form_parts(type='text' name='name' placeholder='ユーザー名...' value=signup_name required)
ログイン中の会員情報の修正
ログイン中の会員情報の修正については実装ソースにて割愛。
行先掲示板への実装に先んじてusersテーブルを以下の通りに修正しておきます。
(ひとまずメンバー:行先は1:1で実装します。)
CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL, `mailaddress` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL, `password` text COLLATE utf8mb4_bin, `wheretogo` text COLLATE utf8mb4_bin, `go_date` date DEFAULT NULL, `go_time` time DEFAULT NULL, `back_date` date DEFAULT NULL, `back_time` time DEFAULT NULL, `active` tinyint(1) DEFAULT NULL, `createdAt` datetime NOT NULL, `updatedAt` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
実機能実装
次に以下の通りの入力フォームを用意します。
div h2 行先登録 form(action="/setdata", method="post") span.form_title 行先 input.form_parts(type='text' name='wheretogo' placeholder='行先...' value=userinfo.wheretogo required) br span.form_title 出発日時 if userinfo.wheretogo != '' && userinfo.wheretogo != null input.form_parts(type='date' name='go_date' placeholder='出発日...' value=userinfo.go_date required) input.form_parts(type='time' name='go_time' placeholder='出発時刻...' value=userinfo.go_time required) else input.form_parts(type='date' name='go_date' placeholder='出発日...' value='' required) input.form_parts(type='time' name='go_time' placeholder='出発時刻...' value='' required) br span.form_title 帰社日時 if userinfo.wheretogo != '' && userinfo.wheretogo != null input.form_parts(type='date' name='back_date' placeholder='帰社日...' value=userinfo.back_date required) input.form_parts(type='time' name='back_time' placeholder='帰社時刻...' value=userinfo.back_time required) else input.form_parts(type='date' name='back_date' placeholder='帰社日...' value='' required) input.form_parts(type='time' name='back_time' placeholder='帰社時刻...' value='' required) br input.form_parts(type='checkbox' name='remove' value='1') span.form_title 削除 br button(type='submit') 反映
cssをサボっていますが、このようなUIになります。
submitされたデータを反映する旨実装します。
router.post('/setdata', async function(req, res) { await Users.findByPk(req.session.user.id) .then(user => { if(user){ if(req.body.remove != 1){ user.wheretogo = req.body.wheretogo; user.go_date = req.body.go_date; user.go_time = req.body.go_time; user.back_date = req.body.back_date; user.back_time = req.body.back_time; } else { user.wheretogo = ''; } user.save(); res.redirect('/'); } }); });
一覧を表示したい際には、indexのログインセッションがある場合の分岐内で以下のように記述し
const dataset = await Users.findAll(); var username = ''; var userinfo = ''; await Users.findByPk(req.session.user.id) .then(user => { console.log(user.name); userinfo = user; username = user.name; }); res.render('user', { title: username + ' is logined.', userid : req.session.user.id, userinfo : userinfo, dataset });
.jadeファイル内で以下のようにループして表示します。
div h2 メンバー一覧 table.tasks tr th.name 名前 th.where 行先 th.time 自 th.time 至 each t in dataset tr td.name= t.name if t.wheretogo != '' && t.wheretogo != null td.where= t.wheretogo td.time= t.go_date+t.go_time td.time= t.back_date+t.back_time else td.where= '社内' td.time= '' td.time= ''
UIを割愛していますが、登録がある場合には右のように表示されます。
パスワードリマインダ
パスワードリマインダについてはこちらのサイトを参考にしました。
https://blog.capilano-fw.com/?p=5923
ここまでの作業内容
ここまでの作業内容をgithubに反映しました。
https://github.com/mayarin/NodejsMySQLDocker/releases/tag/20201112
総括するとライブラリ頼みな感じでした。
時間を持て余すのもまあ飽きてきたので、明日くらいからはLaravelで会員サイトなどを作ろうと思います。