-
백오피스 프로젝트 3. view Engline (ejs), 리뷰 CRUD, 프론트엔드 - 백엔드 연결Projects/Qwerty - 배달의민족 (team) 2023. 7. 24. 17:18
1. 오늘 목표
고객 리뷰 CRUD
프론트엔드- 백엔드 연결
오늘은 , 고객이 로그인을 하고 해당 음식점에 대한 리뷰를 조회, 생성, 수정 및 삭제할 수 있도록 CRUD를 구현했다.
// 리뷰 작성 API (POST) router.post('/user/store/:storeId/review', authMiddleware, async (req, res) => { //upload.single('image'), const { userId } = res.locals.user; const { storeId } = req.params; const { rating, content } = req.body; // const imageUrl = req.file.location; try { if (!storeId) { return res.status(404).json({ message: '해당 음식점이 존재하지 않습니다.' }); } if (!rating || !content) { return res.status(400).json({ message: '입력값이 유효하지 않습니다.' }); } await Reviews.create({ userId, storeId, rating, content }); //image: imageUrl, return res.status(201).json({ message: '리뷰 작성에 성공하였습니다.' }); } catch (error) { console.log(error); return res.status(400).json({ message: '리뷰 작성에 실패했습니다.' }); } });
// 리뷰 목록조회 API (GET) router.get('/user/store/:storeId/review', async (req, res) => { const { storeId } = req.params; try { if (!storeId) { return res.status(404).json({ message: '해당 음식점이 존재하지 않습니다.' }); } const reviews = await Reviews.findAll({ raw: true, attributes: ['reviewId', 'storeId', 'userId', 'rating', 'content', 'createdAt', 'updatedAt'], // include: [{model: Users, attributes:['userId']}], // 목록조회에 닉네임 추가. where: {storeId}, order: [['createdAt', 'DESC']], }); return res.status(200).json({ data: reviews }); } catch { return res.status(400).json({ message: '리뷰 조회에 실패하였습니다.' }); } });
// 리뷰 수정 API (PUT) router.put('/user/store/:storeId/review/:reviewId', authMiddleware, async (req, res) => { //upload.single('image'), const { storeId, reviewId } = req.params; const { userId } = res.locals.user; const { rating, content } = req.body; // const imageUrl = req.file.location; try { if (!storeId) { return res.status(404).json({ message: '해당 음식점이 존재하지 않습니다.' }); } const review = await Reviews.findOne({ where: { reviewId } }); if (!review) { return res.status(404).json({ message: '리뷰가 존재하지 않습니다.' }); } else if (review.userId !== userId) { return res.status(403).json({ message: '리뷰 수정 권한이 존재하지 않습니다.' }); } if (!content) { return res.status(400).json({ message: '입력값이 유효하지 않습니다.' }); } await Reviews.update( { rating, content }, //image: imageUrl, { where: { [Op.and]: [{ reviewId }, { userId }] } }, ); return res.status(200).json({ data: '리뷰 수정에 성공하였습니다.' }); } catch { return res.status(400).json({ data: '댓글 수정에 실패하였습니다.' }); } });
// 리뷰 삭제 API (DELETE) router.delete('/user/store/:storeId/review/:reviewId', authMiddleware, async (req, res) => { const { storeId, reviewId } = req.params; const { userId } = res.locals.user; try { if (!storeId) { return res.status(404).json({ message: '해당 음식점이 존재하지 않습니다.' }); } const review = await Reviews.findOne({ where: { reviewId } }); if (!review) { return res.status(404).json({ message: '리뷰가 존재하지 않습니다.' }); } else if (review.userId !== userId) { return res.status(403).json({ message: '리뷰 삭제 권한이 존재하지 않습니다.' }); } await Reviews.destroy({ where: { [Op.and]: [{ reviewId }, { userId }] } }); return res.status(200).json({ data: '리뷰 삭제에 성공하였습니다.' }); } catch { return res.status(400).json({ data: '리뷰 삭제에 실패하였습니다.' }); } });
프론트엔드 HTML 파일 분리.
--pages_ceo ceo.html -> 사장님 ceoGet.html -> 사장님 회원목록 조회페이지 ceoLogin.html -> 사장님 로그인 페이지 ceoPost.html -> 사장님 메뉴등록 페이지 ceoSignUp.html -> 사장님 회원가입 페이지 --pages_customer cart.html -> 고객님 장바구니 페이지 login.html -> 고객님 로그인 페이지 order.html -> 고객님 주문 페이지 register.html -> 고객님 회원가입 페이지 review.html -> 고객님 리뷰 목록조회 페이지 reviewDetail.html -> 고객님 리뷰 상세조회 페이지 reviewEdit.html -> 고객님 리뷰 수정,삭제 페이지 reviewWrite.html -> 고객님 리뷰 생성 페이지 store.html -> 단일 가게 페이지 storeSearch.html -> 가게 목록 페이지
그리고 따로 Routes 폴더를 만들어 사장님파드와 고객님파트 렌더링주소를 달리 하고, 이를 app.js로 실행되에 하였다.
const express = require('express'); const router = express.Router(); // GET // => localhost:3000/ // 1. 사장님, 고객님 메인페이지 router.route('/').get((req, res) => { return res.render('./index.html'); }); // => localhost:3000/ceo // 2. 사장님 페이지 router.route('/ceo').get((req, res) => { return res.render('pages_ceo/ceo.html'); }); // => localhost:3000/ceoLogin // 3. 사장님 로그인 페이지 router.route('/ceoLogin').get((req, res) => { return res.render('pages_ceo/ceoLogin.html'); }); // => localhost:3000/ceoPost // 4. 사장님 포스트 페이지 router.route('/ceoPost').get((req, res) => { return res.render('pages_ceo/ceoPost.html'); }); // => localhost:3000/ceoSignup // 5. 사장님 회원가입 페이지 router.route('/ceoSignup').get((req, res) => { return res.render('pages_ceo/ceoSignup.html'); }); module.exports = router;
const express = require('express'); const router = express.Router(); // GET // => localhost:3000/storeSearch // 1. 고객이 가게를 검색해서 찾는 페이지. 검색창이랑 가게 이미지, 이름등이 올라와있다. router.route('/storeSearch').get((req, res) => { return res.render('./pages_customer/storeSearch.html'); }); // => localhost:3000/user/register // 2. 고객 회원가입 페이지 router.route('/user/register').get((req, res) => { return res.render('pages_customer/register.html'); }); // => localhost:3000/cart // 3. 고객이 음식 메뉴를 선택한것들이 모여있는 장바구니 페이지 router.route('/cart').get((req, res) => { return res.render('pages_customer/cart.html'); }); // => localhost:3000/detail // 4. 고객이 음식 구매전, 상세페이지. (수량선택하고 장바구니에 넣거나, 바로구매할수있다.) router.route('/detail').get((req, res) => { return res.render('pages_customer/detail.html'); }); // => localhost:3000/store // 5. 가게 한개의 상세 페이지, 상단에는 메뉴들이 있고, 하단에는 가게 리뷰가 달려있다. router.route('/store').get((req, res) => { return res.render('pages_customer/store.html'); }); // => localhost:3000/order // 6. 고객 주문 페이지 (실제 결제가 이뤄지는 곳) router.route('/order').get((req, res) => { return res.render('pages_customer/order.html'); }); // => localhost:3000/review // 7. 고객이 가게에 대한 리뷰 목록 페이지. router.route('/review').get((req, res) => { return res.render('pages_customer/review.html'); }); // => localhost:3000/user/login // 8. 고객 로그인페이지 router.route('/user/login').get((req, res) => { return res.render('pages_customer/login.html'); }); // => localhost:3000/review/write // 9. 고객 리뷰작성 router.route('/review/write').get((req, res) => { return res.render('pages_customer/reviewWrite.html'); }); module.exports = router;
'Projects > Qwerty - 배달의민족 (team)' 카테고리의 다른 글
백오피스 프로젝트 5. 프로젝트 완성 (0) 2023.07.24 백오피스 프로젝트4. 회원가입 시 이메일인증, 회원가입 CRUD, 백엔드 API 기능구현 (0) 2023.07.24 백오피스 프로젝트 2. 고객님 주문, 주문조회, 회원가입, 이메일인증, 트랜젝션 (0) 2023.07.18 백오피스 프로젝트 1.역할분배, 와이어프레임, ERD, API 명세 (0) 2023.07.17