//tips
//smart contract
新しいボードモデルを作成。
npx sequelize-cli model:generate --name Board --attributes userId:integer,message:string
これによりモデルフォルダにboard.jsファイルが作成されたので、対応させたい形に修正。
'use strict';
module.exports = (sequelize, DataTypes) => {
const Board=sequelize.define('Board',{
//モデルの関連付けをアソシエーション機能で行い、その際に必要なのがuserId
userId:{
type:DataTypes,INTEGER,
validate:{
notEmpty:{
msg:"利用者は必須です。"
}
}
},
message:{
type:DataTypes.STRING,
validate:{
notEmpty:{
msg:"メッセージは必須です。"
}
}
}
},{});
Board.associate=function(models){
Board.belongsTo(models.User);
};
return Board;
};
npx sequelize-cli db:migrateでマイグレーションを実行。
これによりデータベースファイル内にBoardモデルに対応するテーブルが作成された。db_dev.sqlite3を開いて確認できた。
associateではテーブル間での関連付けを行なっており、BoardモデルとUSERモデルが連携できるようになっている。
ログイン処理をusers.jsに追加。
router.get('/login', (req, res, next) =>{
//ログインアクセス時の表示
var data={
title:'Uses/Login',
content:'名前とパスワードを入力ください。'
}
res.render('users/login',data);
});
router.post('/login', (req, res, next) =>{
//ログインフォーム送信後の表示
db.User.findOne({
//送信されたnameとpassでUserモデルを取得
//これは一つのレコードのみ取得できる
where:{
name:req.body.name,
pass:req.body.pass
}
})
.then(usr=>{
//モデル取り出し後の処理
if(usr!=null){
req.session.login=usr;
let back=req.session.back;
if(back==null){
back='/';
}
res.redirect(back);
}else{
var data={
title:'Uses/Login',
content:'名前かパスワードに問題があります。再度入力ください。'
}
res.render('users/login',data);
}
});
別途routesフォルダ内のboards.jsファイルを作成。
const express = require('express');
const router = express.Router();
const db = require('../models/index');
const { Op } = require("sequelize");
const pnum = 10;
// ログインのチェック
function check(req,res) {
//nullならログインしていないのでリダイレクトさせ、trueを返す
if (req.session.login == null) {
//ログイン後に戻るページのアドレスを.backで渡せる
req.session.back = '/boards';
res.redirect('/users/login');
return true;
} else {
return false;
}
}
// トップページ
router.get('/',(req, res, next)=> {
res.redirect('/boards/0');
});
// トップページにページ番号をつけてアクセス
//番号を使い一定数ごとにBoardを取り出して表示
router.get('/:page',(req, res, next)=> {
if (check(req,res)){ return };
const pg = req.params.page * 1;
//ページ版んごうはpageパラメータから取り出し、整数にするため1をかける
//ログイン中の場合は処理実行
//Boardから指定のページの取り出し
db.Board.findAll({
//ページ番号と表示数をかけて、offset値を取り出す位置を確定
//limitは取り出す個数
offset: pg * pnum,
limit: pnum,
//取り出す値の並び順を指定
order: [//配列を使用
//値が新しいものから順
['createdAt', 'DESC']//ASCまたはDESCを選択する
],
//関連づけられたモデルの読み込み
include: [{
model: db.User,
required: true//modelを読み込むかどうかを指定
}]
}).then(brds => {
var data = {
title: 'Boards',
login:req.session.login,
content: brds,
page:pg
}
res.render('boards/index', data);
});
});
// メッセージフォームの送信処理
router.post('/add',(req, res, next)=> {
if (check(req,res)){ return };
//フォーム送信されたメッセージをBoardに追加する処理
db.sequelize.sync()
.then(() => db.Board.create({
userId: req.session.login.id,//ログインユーザーのUserからid取り出し
message:req.body.msg
})
.then(brd=>{
res.redirect('/boards');
})
.catch((err)=>{
res.redirect('/boards');
})
)
});
// 利用者のホーム
router.get('/home/:user/:id/:page',(req, res, next)=> {
if (check(req,res)){ return };
const id = req.params.id * 1;
const pg = req.params.page * 1;
db.Board.findAll({
where: {userId: id},
offset: pg * pnum,
limit: pnum,
order: [
['createdAt', 'DESC']
],
include: [{
model: db.User,
required: true
}]
}).then(brds => {
var data = {
title: 'Boards',
login:req.session.login,
userId:id,
userName:req.params.user,
content: brds,
page:pg
}
res.render('boards/home', data);
});
});
module.exports = router;
これをapp.jsに組み込む
var boardsRouter=require('./routes/boards');
app.use('/boards',boardsRouter);
最後にejsを追加していく。
完成して無事に動かすことができた。
開発を行う上でMarkdownという技術系ドキュメントを書く際の簡易言語があるのでそちらも触る。
Ex-gen-appに追加する形で作っていく。
npm install markdown-it
モデルを作成。markdata.jsが生成された。
npx sequelize-cli model:generate --name Markdata --attributes userId:integer,title:string,content:text
これを修正して利用していく。修正したものをマイグレーションしてデータベースに反映。
npx sequelize-cli db:migrate