추천을 했을 때 추천을 했다는 정보를 담기 위해
recommend라는 테이블을 만들었다.
module.exports = (sequelize, DataTypes) => {
return sequelize.define('recommend', {
username: {
type: DataTypes.STRING,
allowNull: false
},
postId: {
type: DataTypes.INTEGER,
allowNull: false
}
});
};
테이블의 구조는 간단하게 username과 postid(게시글 식별)로 구성되어 있다.
db.users.hasMany(db.recommend);
db.recommend.belongsTo(db.users);
db.posts.hasMany(db.recommend);
db.recommend.belongsTo(db.posts);
db.js에서 연결을 해줄 때 post와 users 테이블과의 관계를 hasMany와 belongTo로 설정해 주었다.
하나의 username과 postid에 대해 여러 개의 데이터를 가질 수 있게 해준다.
router.post('/recommend/:postId', async (req, res) => {
if(!req.session.user){
return res.redirect('/auth/login');
}
const postId = req.params.postId;
const username = req.session.user.username;
const [recommend, created] = await db.recommend.findOrCreate({
where: { username: username, postId: postId },
defaults: { username: username, postId: postId }
});
return res.redirect('/board/read/'+postId)
});
라우터 파일에서 recommend 링크를 만들어서 post로 요청이 왔을 때 수행할 작업을 만들었다.
findOrCreate는 있으면 created에 true를 반환하고 없으면 데이터를 생성해주는 함수인데 원래는
추천을 눌렀을 때 이미 추천했으면 이미 추천했다는 메세지가 나오게 하려고 했어서 이렇게 짰지만
그냥 이미 추천했으면 추천 버튼이 비활성화되게 구조를 바꿔서 recommend와 created 변수는 사용하지 않게 되었다.
아무튼 이렇게 데이터베이스의 recommend 테이블에 데이터를 추가하고 보던 글로 redirect를 해주었다.
router.get('/read/:id', async(req, res) => {
if(!req.session.user){
return res.redirect('/auth/login');
}
const postId = req.params.id;
const post = await db.posts.findByPk(postId)
const iswriter = req.session.user && req.session.user.username === post.writer;
const comments = await db.comments.findAll({
where: {postId: postId},
order: [['createdAt', 'DESC']]
})
const recommendnum = await db.recommend.count({
where: { postId: postId }
});
const isrecommend = await db.recommend.findOne({
where: { username: req.session.user.username, postId: postId }
}) !== null;
if (post.secret && (!req.session.user || req.session.user.username !== post.writer || 1 === 1)) {
return res.render('board/secret', { postId: post.idx });
}
res.render('board/read', { post: post,
iswriter: iswriter,
comments: comments,
user: req.session.user,
recommendnum: recommendnum,
isrecommend: isrecommend
});
});
read에 대한 요청 부분도 조금 바뀌었는데, read.ejs에서 화면을 표시할 때 추천수와 추천여부를 표시하기 위해서
recommendnum(추천수), isrecommend(추천 여부) 변수를 같이 보내주었다.
<div>
<span>추천수: <%= recommendnum %></span>
<% if (isrecommend) { %>
<button disabled>추천함</button>
<% } else { %>
<form action="/board/recommend/<%= post.idx %>" method="post">
<button type=""submit>추천</button>
</form>
<% } %>
</div>
read.ejs 파일에서 추천에 대한 영역을 만들어서 추천수를 표시하고, isrecommend가 거짓일 때만
추천 버튼을 활성화시켰다.
'웹개발' 카테고리의 다른 글
게시판-파일 업로드, 다운로드 (0) | 2023.10.29 |
---|---|
게시판-카테고리, 검색 (0) | 2023.10.28 |
게시판-댓글 (0) | 2023.10.26 |
게시판-자기 글 수정, 삭제, 비밀글 (0) | 2023.10.25 |
게시판-이메일 인증, 아이디 찾기 (0) | 2023.10.25 |