-
글쓴이글
-
2022년 4월 3일 07:04 #30977
서영석참가자안녕하세요. node.js 수강중인 학생 입니다.
제가 장바구니를 구현하려고 합니다.
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
app.use(express.urlencoded({extended: true}));
const MongoClient = require('mongodb').MongoClient;
const MongoStore = require('connect-mongo');
const { redirect } = require('express/lib/response');
const methodOverride = require('method-override');
app.use(methodOverride('_method'))
app.set('view engine', 'ejs');app.use('/public', express.static('public'));
var db;
MongoClient.connect('mongodb+srv://scott:scott@cluster0.eeagm.mongodb.net/perfumeapp?retryWrites=true&w=majority', function(에러, client){
if(에러) return console.log(에러)
db = client.db('perfumeapp'); //database 이름 perfumeappconsole.log('저장완료');
});app.listen(4626, function(){
console.log('listening on 4626')
});app.get('/sub', function(요청, 응답){
응답.render('sub.ejs')
});app.get('/', function(요청, 응답){
응답.render('index.ejs')
});app.get('/complete', function(요청, 응답){
응답.render('complete.ejs')
});app.get('/logout', function(요청, 응답){
응답.render('logout.ejs')
});// app.get('/shop', function(요청, 응답){
// 응답.render('shop.ejs')
// });// app.get('/mypage', function(요청, 응답){
// 응답.render('mypage.ejs')
// });
// app.get('/order', function(요청, 응답){
// 응답.render('order.ejs')
// });// app.get('/buy', function(요청, 응답){
// 응답.render('buy.ejs')
// });app.get('/record', function(요청, 응답){
응답.render('record.ejs')
});app.get('/order', function(요청, 응답){
응답.render('order')
});app.get('/pocket', function(요청, 응답){
응답.render('pocket.ejs')
});// app.get('/register', function(요청, 응답){
// 응답.render('join.ejs')
// });// app.get('/edit/:id', function(요청, 응답){
// db.collection('product').findOne({_id : parseInt(요청.params.id)},function(에러, 결과){
// console.log(결과)
// 응답.render('edit.ejs',{data: 결과})
// })
// })// app.put('/edit', function(요청, 응답){
// db.collection('product').updateOne({_id : parseInt(요청.body.id)},{$set : {상품시리얼번호:
// 요청.body.productnum, 상품이름 : 요청.body.productname,상품수량 : 요청.body.productcount, 판매가격 : 요청.body.productprice, 상세설명: 요청.body.productdetail} },function(에러, 결과){
// console.log('수정완료')
// 응답.redirect('/list')
// })
// })// app.post('/buy', function(요청, 응답){
// 응답.send('전송완료');
// db.collection('cart').insertOne({상품이름 : 요청.body.productname, 판매가격 : 요청.body.productprice},function(){
// 응답.redirect('/shop')
// })
// })app.post('/add', function(요청, 응답){
응답.send('전송완료');
db.collection('productcounter').findOne({name : '상품갯수'}, function(에러, 결과){
console.log(결과.AllProduct)
var 총상품갯수 = 결과.AllProduct;db.collection('product').insertOne( { _id : 총상품갯수 + 1,상품시리얼번호: 요청.body.productnum, 상품이름 : 요청.body.productname,상품수량 : 요청.body.productcount, 판매가격 : 요청.body.productprice, 상세설명: 요청.body.productdetail } , function(){
console.log('저장완료');
db.collection('productcounter').updateOne({name:'상품갯수'},{ $inc :{AllProduct:1}},function(에러,결과){
// db.collection('accounter').updateOne({name:'상품갯수'},{$inc :{AllProduct:1}})
if(에러){return console.log(에러)}
})
});
});
});app.delete('/delete', function(요청, 응답){
요청.body._id = parseInt(요청.body._id)
db.collection('product').deleteOne(요청.body, function(에러, 결과){
console.log('삭제완료')
})
응답.send('삭제완료')
});// app.post('/plus', function(요청, 응답){
// 응답.send('전송완료');
// db.collection('productcount').findOne({name: '상품갯수'}, function(에러, 결과){
// // console.log(결과.TotalProduct)
// var 상품갯수 = 결과.totalProduct;
// var 저장할거 = {_id : 상품갯수 + 1, 상품이름 : 요청.body.productname, 상품가격 : 요청.body.productprice, 상세설명 : 요청.body.productdetail}
// db.collection('product').insertOne( { _id : 상품갯수 + 1, 상품이름 : 요청.body.pfname, 상품가격 : 요청.body.pfsprice, 상세설명 : 요청.body.pfdetail} , function(){
// console.log('저장완료');
// db.collection('productcount').updateOne({name : '상품총갯수'}, {$inc : {totalProduct : 0}}, function(에러, 결과){
// if(에러){return console.log(에러)}
// 응답.send('전송완료');
// });
// });
// });
// });app.get('/list', function(요청, 응답){
db.collection('product').find().toArray(function(에러, 결과){
console.log(결과);
응답.render('list.ejs',{products : 결과});
});
});app.get('/search', (요청, 응답)=>{
var 검색조건 = [
{
$search: {
index: 'productsearch',
text: {
query: 요청.query.value,
path: '상품이름' // 제목날짜 둘다 찾고 싶으면 ['제목', '날짜']
}
}
}
]
db.collection('product').aggregate(검색조건).toArray((에러, 결과)=>{
console.log(결과)
응답.render('search.ejs',{products:결과})
})
})app.post('/pocket', function(요청, 응답){
db.collection('cart').insertOne({상품이름 : 요청.body.productname,상품수량 : 요청.body.productcount, 판매가격 : 요청.body.productprice, 상세설명: 요청.body.productdetail }, function(에러,결과){
console.log('저장완료');
})
})app.post('/order', function(요청, 응답){
응답.send('전송완료');
db.collection('productsum').findOne({name : '상품구매금액'}, function(에러, 결과){
console.log(결과.AllProductSum)
var 총상품구매금액 = 결과.AllProductSum;db.collection('incart').insertOne({_id: 총상품구매금액, 이름: 요청.body.name, 성별: 요청.body.gender, 휴대폰번호:요청.body.ph, 배송주소: 요청.body.addr, 메모:요청.body.comment, 향수선택:요청.body.good, 결제수단:요청.body.pay}, function(에러,결과){
consolo.log('저장완료');db.collection('productsum').updateOne({name:'상품구매금액'},{ $mul :{AllProductSum:count*price}},function(에러,결과){
// db.collection('accounter').updateOne({name:'상품갯수'},{$inc :{AllProduct:1}})
if(에러){return console.log(에러)}
})
})
})
});app.get('/shop/:id', function(요청, 응답){
db.collection('product').findOne({_id : parseInt(요청.params.id)}, function(에러,결과){
console.log(결과);
응답.render('shop.ejs',{ data : 결과})
})
})// app.get('/edit/:id', function(요청, 응답){
// db.collection('product').findOne({ _id : parseInt(요청.params.id) },function(에러, 결과){
// console.log(결과);
// 응답.render('edit.ejs',{products: 결과})
// })
// });// app.post('/plus', function(요청, 응답){
// 응답.send('전송완료');
// db.collection('productcount').findOne({name: '상품갯수'}, function(에러, 결과){
// console.log(결과.totalProduct)
// var 상품갯수 = 결과.totalProduct;// db.collection('product').insertOne( { _id : (상품갯수) + 1, 상품이름 : 요청.body.pfname, 판매가격 : 요청.body.pfsprice, 상세설명 : 요청.body.pfdetail} , function(){
// console.log('저장완료');
// db.collection('productcount').updateOne({name : '상품갯수'}, {$inc : {totalProduct : 1}}, function(에러, 결과){
// if(에러){return console.log(에러)}
// 응답.send('전송완료');
// });
// });
// });
// });const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const session = require('express-session');
const res = require('express/lib/response');app.use(session({secret : '비밀코드', resave : true, saveUninitialized: false}));
app.use(passport.initialize());
app.use(passport.session());app.get('/login', function(요청, 응답){
응답.render('login.ejs')
});app.post('/logout',function(요청, 응답){
요청.logout();
응답.redirect('/');
});app.post('/login', passport.authenticate('local', {
failureRedirect : '/fall'
}), function(요청, 응답){
응답.redirect('/sub')
});app.get('/list', function(요청, 응답){
db.collection('product').find().toArray(function(에러, 결과){
console.log(결과);
응답.render('list.ejs',{products : 결과});
})
})app.get('/basket', function(요청, 응답){
db.collection('product').find().toArray(function(에러, 결과){
console.log(결과);
응답.render('basket.ejs',{products: 결과});
})
})app.get('/pocket', function(요청, 응답){
db.collection('cart').find().toArray(function(에러, 결과){
console.log(결과);
응답.render('pocket.ejs',{products: 결과});
})
})
// app.get('/shop/:id', function(요청, 응답){
// db.collection('product').findOne({_id : parseInt(요청.params.id)}, function(에러,결과){
// console.log(결과);
// 응답.render('shop.ejs',{product : 결과})
// })
// });// app.get('/record', 로그인했니, function(요청,응답){
// console.log(요청.user);
// 응답.render('record.ejs',{사용자: 요청.user})
// })// function 로그인했니(요청, 응답, next) {
// if (요청.user) {
// next()
// }
// else {
// 응답.send('로그인안하셨는데요?')
// }
// }app.get('/mypage', 로그인했니, function(요청,응답){
console.log(요청.user);
응답.render('mypage.ejs',{사용자: 요청.user})
})function 로그인했니(요청, 응답, next) {
if (요청.user) {
next()
}
else {
응답.send('로그인안하셨는데요?')
}
}passport.use(new LocalStrategy({
usernameField: 'uid',
passwordField: 'pw1',
session: true,
passReqToCallback: false,
}, function (입력한아이디, 입력한비번, done) {
//console.log(입력한아이디, 입력한비번);
db.collection('user').findOne({ uid: 입력한아이디 }, function (에러, 결과) {
if (에러) return done(에러)
if (!결과) return done(null, false, { message: '존재하지않는 아이디요' })
if (입력한비번 == 결과.pw1) {
return done(null, 결과)
} else {
return done(null, false, { message: '비번틀렸어요' })
}
})
}));passport.serializeUser(function (user, done) {
done(null, user.uid)
});
passport.deserializeUser(function (아이디, done) {
db.collection('user').findOne({uid : 아이디}, function(에러, 결과){
done(null, 결과)
})
});app.post('/register', function (요청, 응답) {
db.collection('user').insertOne({ uid: 요청.body.uid, pw1: 요청.body.pw1, pw2: 요청.body.pw2, 이름: 요청.body.name, 성별: 요청.body.gender, 휴대폰번호:요청.body.ph, 수신동의1:요청.body.news_letter, 수신동의2:요청.body.marketing }, function (에러, 결과) {
응답.redirect('/')
})
})
//app.get('/shop/:id', function(요청, 응답){
db.collection('product').findOne({_id : parseInt(요청.params.id)}, function(에러,결과){
console.log(결과);
응답.render('shop.ejs',{ data : 결과})
})
});// app.post('/record', function(요청, 응답){
// db.collection('product')
// });// app.post('/plus', function(요청, 응답){
// 응답.send('전송완료');
// db.collection('productcount').findOne({name: '상품갯수'}, function(에러, 결과){
// console.log(결과.totalProduct)
// var 상품갯수 = 결과.totalProduct;// db.collection('product').insertOne( { _id : (상품갯수) + 1, 상품이름 : 요청.body.pfname, 상품가격 : 요청.body.pfsprice, 상세설명 : 요청.body.pfdetail} , function(){
// console.log('저장완료');
// db.collection('productcount').updateOne({name : '상품갯수'}, {$inc : {totalProduct : 1}}, function(에러, 결과){
// if(에러){return console.log(에러)}
// 응답.send('전송완료');
// });
// });
// });mongodb nosql 기반인것으로 알고 있습니다.
제가 장바구니를
<!doctype html>
<html>
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"><!-- Bootstrap CSS -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous"><title>장바구니</title>
</head>
<body>
<%- include('nav.html') %>
<div class="container">
<ul class="list-group">
<% for (var i = 0; i < products.length; i++){ %>
<li class="list-group-item">
<h4>상품번호 : <%= products[i]._id%></h4>
<h4>상품이름 : <%= products[i].상품이름%></h4>
<h4>상품수량 : <%= products[i].상품수량%></h4>
<h3>총상품구매금액 : <%= products[i].총상품구매금액%></h3>
<button type="button" onclick="cart()">구매</button>
<button type="button" data-id="<%=products[i]._id %>">삭제</button>
</li>
<% } %>
</ul>
</div>
<!-- Optional JavaScript -->
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
function cart()
{
location.href="/order"
}
</script>
<script>
$('.delete').click(function(e){
var 상품번호 = e.target.dataset.id; //내가 누른 버튼에 숨겨진 data-id을 가져와주세요
var 지금누른거 = $(this);
$.ajax({
method : 'DELETE',
url : '/delete',
data : { _id : 상품번호}
}).done(function(결과){
//페이지를 강제로 새로 고침해주세요
//삭제 버튼을 누른 <li> 요소를 제거해주세요/안보이게
console.log('성공했어염')
지금누른거.parent('li').fadeOut();
}).fall(function(xhr, textStatus, errorThrown){
console.log(xhr, textStatus, errorThrown);
});
});
</script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
</body>
</html>이렇게 하고 있습니다.
장바구니 번호를 objectid로사용해도 되는가요?
갈피를 못잡고 있어 힌트 받고 싶어 게시글을 작성하게되었습니다.
2022년 4월 3일 09:53 #30984
codingapple키 마스터네 컬렉션 하나 만들어서 거기 다 넣으면 됩니다
_id : objectid() 는 유니크해서 장바구니상품간 구분하고 싶으면 _id 쓰면 됩니다
그런데 장바구니에 어떤 유저가 추가한건지 정보도 들어있어야겠군요 유저 본인 상품만 볼 수 있어야하니까요
2022년 4월 6일 19:35 #31276
서영석참가자basket 관련 컬렉션에 수량과 상품번호 와 유저 정보를 다시 입력해야하는건가요?
아니면 기존 db 컬렉션에서 읽어보는건가요?
예를 들어 설명을 들을수있을까해서 도움을 받고 싶어 댓글을 남깁니다.
2022년 4월 6일 21:25 #31286
codingapple키 마스터{
_id: 총상품구매금액,
이름: 요청.body.name,
성별: 요청.body.gender,
휴대폰번호:요청.body.ph,
배송주소: 요청.body.addr,
메모:요청.body.comment,
향수선택:요청.body.good,
결제수단:요청.body.pay
}장바구니에 이거저장하고있는거같은데
일단 _id는 빼는게 좋아보입니다 자동으로 발급되는 _id 사용하고
구매금액저장하려면 다른 필드를 만듭시다
누가 주문한건지 유저의 _id 이런것도 넣는게 좋을듯요 나중에 누가 주문한건지 찾을 수 있어야하니까요
document 에 뭐가 들어갈지 고민되면
document를 나중에 1. 어떤 페이지들에서 2. 어떻게 찾아쓰게될지 생각해보면 됩니다
-
글쓴이글
- 답변은 로그인 후 가능합니다.