Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test #20

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open

test #20

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@ node_modules/
conn.php
.DS_STORE
.eslintcache
config.json
1 change: 1 addition & 0 deletions homeworks/week17/hw1/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
node_modules/
140 changes: 140 additions & 0 deletions homeworks/week17/hw1/controllers/content.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
const db = require('../models')
const Contents = db.hw17_contents //hw17_contents 指的不是 models 資料夾底下的名稱,是裡面定義的內容,注意大小寫
const User = db.hw17_users // hw17_users 指的不是 models 資料夾底下的名稱,是裡面定義的內容,注意大小寫

const contentController = {
index: (req, res) => {
User.findAll({
include: {
model: Contents, //為上面引入並定義的參數
where: {
is_deleted: null //對於要關聯的內容下條件
},
},
order: [[Contents ,'id', 'desc']] //對於 include model 指定升降冪排序
}).then(users => {
res.render('front', {
users
})
})
},

category: (req, res) => {
User.findAll({
include: {
model: Contents,
where: {
is_deleted: null //對於要關聯的內容下條件
}
},
order: [[Contents ,'id', 'desc']]
}).then(users => {
res.render('content/category', {
users
})
})
},

write: (req, res) => {
User.findAll({
where: {
username: req.session.username
}
}).then(users => {
res.render('content/write', {
users
})
})

},

handleWrite: (req, res, next) => {
const {title, content } = req.body
if (!title || !content ) { //檢查 POST 表單有沒有東西
req.flash('errorMessage', "缺少必要欄位")
return next() // 給下一個 middleware 來處理
}

Contents.create({
username: req.session.username,
article_titile: title,
article_content: content,
hw17UserId: req.session.userId
}).then(() => {
res.redirect('/')
})
},

article: (req, res) => {
User.findAll({
include: {
model: Contents,
where: {
id: req.params.id //對於要關聯的內容下條件
}
},
}).then(users => {
res.render('content/article', {
users
})
})
},


editArticle: (req, res) => {
User.findAll({
include: {
model: Contents,
where: {
id: req.params.id //對於要關聯的內容下條件
}
},
}).then(users => {
res.render('content/editArticle', {
users
})
})
},

handleEditArticle: (req, res, next) => {
const {title, content } = req.body
if (!title || !content ) { //檢查 POST 表單有沒有東西
req.flash('errorMessage', "缺少必要欄位")
return next() // 給下一個 middleware 來處理
}

Contents.findOne({
where: {
id: req.params.id,
hw17UserId: req.body.userId
}
}).then(content => {
return content.update({
article_titile: req.body.title,
article_content: req.body.content
}).then(() => {
res.redirect('/');
}).catch(() => {
res.redirect('/');
});
})
},

handleDeleteArticle: (req, res, next) => {
Contents.findOne({
where: {
id: req.params.id,
}
}).then(content => {
return content.update({
is_deleted: 1,
}).then(() => {
res.redirect('/')
}).catch(() => {
res.redirect('/')
})
})
},
}

module.exports = contentController
48 changes: 48 additions & 0 deletions homeworks/week17/hw1/controllers/user.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
const db = require('../models')
const Contents = db.hw17_contents //hw17_contents 指的不是 models 資料夾底下的名稱,是裡面定義的內容,注意大小寫
const User = db.hw17_users // hw17_users 指的不是 models 資料夾底下的名稱,是裡面定義的內容,注意大小寫

const userController = {
login: (req, res) => {
res.render('user/login')
},

handleLogin: (req, res, next) => {
const {username, password} = req.body
if (!username || !password ) {
req.flash('errorMessage', "缺少必要欄位")
return next() // 給下一個 middleware 來處理
}

User.findOne({ // 去資料庫 User 去找條件為表格輸入的 username
where: {
username: username
}
}).then(user => { // user 為自己定義的,為了去帶去資料庫的東西而已
if (!user) { // 看資料庫有無 username 存在,沒有則 !user 不會有東西
req.flash('errorMessage', '使用者不存在')
return next()
}

if (password === user.password) {
req.session.username = user.username
req.session.userId = user.id
} else {
req.flash('errorMessage', '密碼錯誤')
return next()
}
res.redirect('/')

}).catch(err => {
req.flash('errorMessage', err.toString())
return next()
})
},

logout: (req, res) => {
req.session.username = null
res.redirect('/')
}
}

module.exports = userController
65 changes: 65 additions & 0 deletions homeworks/week17/hw1/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
const express = require('express') //引入進來會是一個 function
const app = express()
const port = process.env.PORT || 5001
const flash = require('connect-flash')
const session = require('express-session')
const bodyParser = require('body-parser')

// 有用 POST 表單需加
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())

// connect views
app.set('view engine', 'ejs')

//負責管理 Session
app.use(session({
secret: 'keyboard cat',
resave: false,
saveUninitialized: true,
}))

// 顯示錯誤用
app.use(flash())

// 登入以及錯誤資訊
app.use((req, res, next) => {
res.locals.username = req.session.username //可將變數傳給 view 來使用,類似全域變數
res.locals.errorMessage = req.flash('errorMessage') //可將變數傳給 view 來使用,類似全域變數
next() // middleware 可以繼續往下傳
})

function redirectBack(req, res) {
res.redirect('back')
}

// 檢查是否為登入狀態
function checkUserAuth(req, res, next) {
if (req.session.username === undefined) {
return res.redirect('back')
}
next()
}
//引入絕對路徑 public 資料夾底下的 css/ jpg 檔案
app.use('/', express.static(__dirname + '/public'));


const contentController = require('./controllers/content')
const userController = require('./controllers/user')

app.get('/login', userController.login) //傳給 controller 來處理
app.post('/login', userController.handleLogin, redirectBack)
app.get('/logout', userController.logout)

app.get('/', contentController.index)
app.get('/category', contentController.category)
app.get('/article/:id', contentController.article)
app.get('/edit-article/:id', checkUserAuth ,contentController.editArticle, redirectBack)
app.post('/edit-article/:id', checkUserAuth ,contentController.handleEditArticle, redirectBack)
app.get('/delete-article/:id',checkUserAuth ,contentController.handleDeleteArticle, redirectBack)
app.get('/write', checkUserAuth ,contentController.write)
app.post('/write-article', checkUserAuth ,contentController.handleWrite, redirectBack)

app.listen(port, () => {
console.log(`Example app listening on port ${port}!`)
})
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
'use strict';
module.exports = {
up: async (queryInterface, Sequelize) => {
await queryInterface.createTable('hw17_users', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
},
username: {
type: Sequelize.STRING
},
password: {
type: Sequelize.STRING
},
about: {
type: Sequelize.STRING
},
createdAt: {
allowNull: false,
type: Sequelize.DATE
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE
}
});
},
down: async (queryInterface, Sequelize) => {
await queryInterface.dropTable('hw17_users');
}
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
'use strict';
module.exports = {
up: async (queryInterface, Sequelize) => {
await queryInterface.createTable('hw17_contents', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
},
username: {
type: Sequelize.STRING
},
article_titile: {
type: Sequelize.STRING
},
article_content: {
type: Sequelize.TEXT
},
article_category: {
type: Sequelize.STRING
},
is_deleted: {
type: Sequelize.INTEGER
},
createdAt: {
allowNull: false,
type: Sequelize.DATE
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE
},
hw17UserId: {
type: Sequelize.INTEGER
}
});
},
down: async (queryInterface, Sequelize) => {
await queryInterface.dropTable('hw17_contents');
}
};
27 changes: 27 additions & 0 deletions homeworks/week17/hw1/models/contents.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
'use strict';
const {
Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
class hw17_contents extends Model {
/**
* Helper method for defining associations.
* This method is not a part of Sequelize lifecycle.
* The `models/index` file will call this method automatically.
*/
static associate(models) {
// define association here
hw17_contents.belongsTo(models.hw17_users);
}
};
hw17_contents.init({
username: DataTypes.STRING,
article_titile: DataTypes.STRING,
article_content: DataTypes.TEXT,
is_deleted: DataTypes.INTEGER,
}, {
sequelize,
modelName: 'hw17_contents',
});
return hw17_contents;
};
Loading