Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
students
shopping-mall
Commits
2ff3fb7c
Commit
2ff3fb7c
authored
Feb 02, 2021
by
Jiwon Yoon
Browse files
Merge branch 'ourMaster' into jiwon
parents
8ae10e44
581c62c4
Changes
8
Hide whitespace changes
Inline
Side-by-side
client/src/Components/ListCard.js
View file @
2ff3fb7c
...
...
@@ -53,6 +53,13 @@ function ListCard(props) {
<
Col
sm
=
{
3
}
xs
=
{
5
}
className
=
'
p-1
'
><
li
>
주문날짜
:
<
/li></
Col
>
<
Col
sm
=
{
8
}
xs
=
{
6
}
className
=
'
p-1
'
><
strong
>
{
e
.
createdAt
.
substring
(
0
,
10
)}
<
/strong></
Col
>
<
Col
sm
=
{
3
}
xs
=
{
5
}
className
=
'
p-1
'
><
li
>
결제정보
:
<
/li></
Col
>
<
Col
sm
=
{
8
}
xs
=
{
6
}
className
=
'
p-1
'
><
strong
>
{
e
.
paymentWay
}
<
/strong>{e.paymentWay == 'Remittance'
?
(
<>
<
br
/><
strong
>
{
e
.
paymentInfo
.
bank
}
/ ~ {e.paymentInfo.deadline}</
strong
>
<
/
>
)
:
''
}
<
/Col
>
<
/Row
>
<
/Col
>
<
/Card.Text
>
...
...
@@ -69,7 +76,7 @@ function ListCard(props) {
<
Card
>
<
Row
className
=
"
mx-1
"
>
<
Col
xs
=
{
2
}
sm
=
{
2
}
className
=
"
text-center my-auto
"
>
<
input
className
=
""
type
=
"
checkbox
"
name
=
{
String
(
e
.
_id
)}
onChange
=
{
props
.
checkedCart
}
/
>
<
input
type
=
"
checkbox
"
name
=
{
String
(
e
.
_id
)}
onChange
=
{
props
.
checkedCart
}
checked
=
{
e
.
checked
}
/
>
<
/Col
>
<
Col
className
=
"
text-center
"
>
<
Card
.
Img
className
=
"
img-fluid
"
variant
=
"
top
"
src
=
{
e
.
productId
.
main_imgUrl
&&
`/images/
${
e
.
productId
.
main_imgUrl
}
`
}
style
=
{{
width
:
'
20rem
'
}}
/
>
...
...
@@ -83,7 +90,7 @@ function ListCard(props) {
<
Card
.
Text
>
수량
<
/Card.Text
>
<
div
>
<
input
type
=
"
image
"
name
=
{
String
(
e
.
_id
)}
alt
=
"
마이너스
"
src
=
"
https://img.icons8.com/ios-glyphs/20/000000/minus-math.png
"
className
=
"
align-middle
"
onClick
=
{
props
.
minusNum
}
/
>
<
input
type
=
"
number
"
style
=
{{
width
:
'
3
0
px
'
}}
className
=
"
text-center align-middle mx-1
"
placeholder
=
{
e
.
count
}
value
=
{
e
.
count
}
readOnly
><
/input
>
<
input
type
=
"
number
"
style
=
{{
width
:
'
3
5
px
'
}}
className
=
"
text-center align-middle mx-1
"
placeholder
=
{
e
.
count
}
value
=
{
e
.
count
}
readOnly
><
/input
>
<
input
type
=
"
image
"
name
=
{
String
(
e
.
_id
)}
alt
=
"
플러스
"
src
=
"
https://img.icons8.com/ios-glyphs/20/000000/plus-math.png
"
className
=
"
align-middle
"
onClick
=
{
props
.
plusNum
}
/
>
<
/div
>
<
/Card.Body
>
...
...
client/src/Pages/Account.js
View file @
2ff3fb7c
...
...
@@ -166,7 +166,7 @@ function Account() {
<
/Row
>
<
Row
className
=
"
px-3
"
>
<
Card
.
Body
className
=
"
p-2 text-center
"
>
<
h4
><
Link
to
=
"
/
"
>
<
h4
><
Link
to
=
"
/
"
style
=
{{
textDecoration
:
"
none
"
}}
>
<
strong
title
=
"
홈으로
"
>
<
Image
src
=
"
/icon/mypagetiger.svg
"
width
=
{
"
30rem
"
}
roundedCircle
className
=
"
img-thumbnail
"
>
<
/Image>KU
#
...
...
client/src/Pages/Payment.js
View file @
2ff3fb7c
...
...
@@ -79,6 +79,7 @@ function Payment({ match, location }) {
function
handleReceiverInfo
(
e
)
{
const
{
name
,
value
}
=
e
.
target
console
.
log
(
name
,
value
)
setOrder
({
...
order
,
receiverInfo
:
{
...
order
.
receiverInfo
,
[
name
]:
value
}
})
}
...
...
@@ -129,25 +130,27 @@ function Payment({ match, location }) {
<
Row
className
=
"
justify-content-md-center
"
>
<
Col
md
=
{
6
}
className
=
"
border m-5 p-5
"
>
<
Form
>
<
Form
.
Group
controlId
=
"
exampleForm.ControlSelect1
"
>
<
Form
.
Group
controlId
=
"
bank
"
>
<
Form
.
Label
>
입금은행
<
/Form.Label
>
<
Form
.
Control
as
=
"
select
"
placeholder
=
"
입금은행을 선택하세요.
"
>
<
option
>
농협
/
352
-
0559
-
2528
-
83
/
김수빈
<
/option
>
<
option
>
우리은행
/
0000
-
000
-
000000
/
이재연
<
/option
>
<
option
>
국민은행
/
111111
-
11
-
111111
/
윤대기
<
/option
>
<
Form
.
Control
as
=
"
select
"
name
=
"
bank
"
onChange
=
{
handleReceiverInfo
}
>
<
option
value
=
''
>
입금은행을
선택하세요
.
<
/option
>
<
option
value
=
"
농협
"
>
농협
/
352
-
0559
-
2528
-
83
/
김수빈
<
/option
>
<
option
value
=
"
우리은행
"
>
우리은행
/
0000
-
000
-
000000
/
이재연
<
/option
>
<
option
value
=
"
국민은행
"
>
국민은행
/
111111
-
11
-
111111
/
윤대기
<
/option
>
<
/Form.Control
>
<
/Form.Group
>
<
Form
.
Group
controlId
=
"
formName
"
>
<
Form
.
Group
controlId
=
"
depositor
"
>
<
Form
.
Label
>
입금자
<
/Form.Label
>
<
Form
.
Control
type
=
"
email
"
placeholder
=
"
윤지원
"
/>
<
Form
.
Control
type
=
"
text
"
name
=
"
depositor
"
onChange
=
{
handleReceiverInfo
}
/
>
<
/Form.Group
>
<
Form
.
Group
controlId
=
"
formDay
"
>
<
Form
.
Group
controlId
=
"
deadline
"
>
<
Form
.
Label
>
입금예정일
<
/Form.Label
>
<
Form
.
Control
type
=
"
date
"
/>
<
Form
.
Control
type
=
"
date
"
name
=
"
deadline
"
onChange
=
{
handleReceiverInfo
}
/
>
<
/Form.Group
>
<
/Form
>
<
/Col
>
<
/Row>
)
setCompleteState
(
"
Remittance
"
)
setPaymentWay
(
bankList
)
}
}
...
...
@@ -167,61 +170,69 @@ function Payment({ match, location }) {
order
.
products
.
map
((
el
)
=>
{
cartIds
.
push
(
el
.
_id
)
})
try
{
setError
(
''
)
const
response
=
await
axios
.
post
(
`/api/order/addorder`
,
{
userId
:
user
,
...
order
,
total
:
finalPrice
+
2500
})
const
response2
=
await
axios
.
post
(
`/api/cart/deletecart2`
,
{
userId
:
user
,
cartId
:
cartIds
})
const
response3
=
await
axios
.
post
(
`/api/product/pluspurchase`
,
{
products
:
order
.
products
})
if
(
completeState
===
"
kakaopay
"
)
{
let
itemNames
=
""
if
(
cart
.
length
>
1
)
{
itemNames
=
cart
[
0
].
productId
.
pro_name
+
'
외
'
+
String
(
cart
.
length
-
1
)
+
'
개
'
}
else
{
itemNames
=
cart
[
0
].
productId
.
pro_name
}
setError
(
''
)
const
response
=
await
fetch
(
'
/api/kakaopay/test/single
'
,
{
method
:
"
POST
"
,
headers
:
{
'
Content-type
'
:
'
application/json
'
},
body
:
JSON
.
stringify
({
cid
:
'
TC0ONETIME
'
,
partner_order_id
:
'
partner_order_id
'
,
partner_user_id
:
user
,
item_name
:
itemNames
,
quantity
:
cart
.
length
,
total_amount
:
finalPrice
+
2500
,
vat_amount
:
200
,
tax_free_amount
:
0
,
approval_url
:
'
http://localhost:3000/paymentcompleted
'
,
fail_url
:
'
http://localhost:3000/shoppingcart
'
,
cancel_url
:
'
http://localhost:3000/shoppingcart
'
,
})
})
const
data
=
await
response
.
json
()
window
.
location
.
href
=
data
.
redirect_url
}
else
{
alert
(
"
주문이 완료되었습니다.
"
)
history
.
push
(
'
/paymentcompleted
'
)
}
}
catch
(
error
)
{
catchErrors
(
error
,
setError
)
alert
(
"
주문에 실패하셨습니다. 다시 확인해주세요.
"
)
}
// try {
// setError('')
// const response = await axios.post(`/api/order/addorder`, {
// userId: user,
// ...order,
// paymentWay: completeState,
// total: finalPrice + 2500
// })
// const response2 = await axios.post(`/api/cart/deletecart2`, {
// userId: user,
// cartId: cartIds
// })
// const response3 = await axios.post(`/api/product/pluspurchase`, {
// products: order.products
// })
// if (completeState === "kakaopay") {
// let itemNames = ""
// if (cart.length > 1) {
// itemNames = cart[0].productId.pro_name + ' 외 ' + String(cart.length - 1) + '개'
// } else {
// itemNames = cart[0].productId.pro_name
// }
// setError('')
// const response = await fetch('/api/kakaopay/test/single', {
// method: "POST",
// headers: {
// 'Content-type': 'application/json'
// },
// body: JSON.stringify({
// cid: 'TC0ONETIME',
// partner_order_id: 'partner_order_id',
// partner_user_id: user,
// item_name: itemNames,
// quantity: cart.length,
// total_amount: finalPrice + 2500,
// vat_amount: 200,
// tax_free_amount: 0,
// approval_url: 'http://localhost:3000/paymentcompleted',
// fail_url: 'http://localhost:3000/shoppingcart',
// cancel_url: 'http://localhost:3000/shoppingcart',
// })
// })
// const data = await response.json()
// window.location.href = data.redirect_url
// } else {
// alert("주문이 완료되었습니다.")
// history.push('/paymentcompleted')
// }
// } catch (error) {
// catchErrors(error, setError)
// alert("주문에 실패하셨습니다. 다시 확인해주세요.")
// window.location.reload()
// }
}
if
(
error
)
{
alert
(
`
${
error
}
`
)
setError
(
''
)
}
return
(
<
Container
className
=
"
mb-5
"
>
{
console
.
log
(
"
order=
"
,
order
)}
<
h3
className
=
"
my-5 font-weight-bold text-center
"
>
주문
/
결제
<
/h3
>
<
div
>
<
h5
className
=
"
font-weight-bold py-3 border-top border-bottom text-center
"
style
=
{{
background
:
'
#F7F3F3
'
}}
>
주문자
정보
<
/h5
>
...
...
@@ -249,15 +260,15 @@ function Payment({ match, location }) {
<
Row
className
=
"
justify-content-center
"
>
<
Col
md
=
{
8
}
>
<
Form
>
<
Form
.
Group
>
<
Form
.
Group
controlId
=
"
recipientName
"
>
<
Form
.
Label
>
이름
<
/Form.Label
>
<
Form
.
Control
type
=
"
text
"
name
=
"
name
"
onChange
=
{
handleReceiverInfo
}
><
/Form.Control
>
<
/Form.Group
>
<
Form
.
Group
>
<
Form
.
Group
controlId
=
"
recipientTel
"
>
<
Form
.
Label
>
휴대전화
<
/Form.Label
>
<
Form
.
Control
type
=
"
text
"
name
=
"
tel
"
onChange
=
{
handleReceiverInfo
}
><
/Form.Control
>
<
/Form.Group
>
<
Form
.
Group
controlId
=
"
formBasic
Add
"
>
<
Form
.
Group
controlId
=
"
recipient
Add
"
>
<
Form
.
Label
>
주소
<
/Form.Label
>
<
Form
.
Row
>
<
Col
xs
=
{
4
}
sm
=
{
4
}
>
...
...
client/src/Pages/Product.js
View file @
2ff3fb7c
...
...
@@ -26,6 +26,7 @@ function Product({ location }) {
},
[
product
])
useEffect
(()
=>
{
window
.
scrollTo
(
0
,
0
)
setProduct
(
location
.
state
)
},
[
location
.
state
])
...
...
client/src/Pages/ShoppingCart.js
View file @
2ff3fb7c
...
...
@@ -17,6 +17,10 @@ function ShoppingCart() {
getCart
()
},
[
user
])
useEffect
(()
=>
{
price
()
},
[
cart
])
function
plusNum
(
e
)
{
const
addCount
=
cart
.
map
((
el
)
=>
{
if
(
el
.
_id
===
e
.
target
.
name
)
{
...
...
@@ -27,6 +31,7 @@ function ShoppingCart() {
})
setCart
(
addCount
)
}
function
minusNum
(
e
)
{
const
addCount
=
cart
.
map
((
el
)
=>
{
if
(
el
.
_id
===
e
.
target
.
name
)
{
...
...
@@ -38,8 +43,17 @@ function ShoppingCart() {
setCart
(
addCount
)
}
function
checkedCart
(
e
)
{
function
price
(
)
{
let
price
=
0
const
list
=
cart
.
filter
((
el
)
=>
el
.
checked
===
true
)
list
.
map
((
el
)
=>
{
price
=
el
.
count
*
el
.
productId
.
price
+
price
})
setFinalPrice
(
price
)
setFinalCart
(
list
)
}
function
checkedCart
(
e
)
{
const
cartCheck
=
cart
.
map
((
el
)
=>
{
if
(
el
.
_id
===
e
.
target
.
name
)
{
return
{
...
el
,
checked
:
!
el
.
checked
}
...
...
@@ -47,13 +61,7 @@ function ShoppingCart() {
return
{
...
el
}
}
})
const
list
=
cartCheck
.
filter
((
el
)
=>
el
.
checked
===
true
)
list
.
map
((
el
)
=>
{
price
=
el
.
count
*
el
.
productId
.
price
+
price
})
setFinalPrice
(
price
)
setCart
(
cartCheck
)
setFinalCart
(
list
)
}
async
function
deleteCart
(
e
)
{
...
...
@@ -74,7 +82,7 @@ function ShoppingCart() {
setError
(
''
)
const
response
=
await
axios
.
get
(
`/api/cart/showcart/
${
user
}
`
)
const
addChecked
=
response
.
data
.
map
((
el
)
=>
{
return
{
...
el
,
checked
:
fals
e
}
return
{
...
el
,
checked
:
tru
e
}
})
setCart
(
addChecked
)
}
catch
(
error
)
{
...
...
server/controllers/order.controller.js
View file @
2ff3fb7c
...
...
@@ -4,10 +4,27 @@ import User from "../schemas/User.js";
import
Product
from
"
../schemas/Product.js
"
;
const
addorder
=
async
(
req
,
res
)
=>
{
const
{
userId
,
products
,
receiverInfo
,
total
}
=
req
.
body
const
{
userId
,
products
,
receiverInfo
,
paymentWay
,
total
}
=
req
.
body
console
.
log
(
"
pay=
"
,
paymentWay
)
console
.
log
(
receiverInfo
.
bank
,
receiverInfo
.
depositor
,
receiverInfo
.
deadline
)
try
{
const
newOrder
=
await
new
Order
({
userId
,
products
,
receiverInfo
,
total
}).
save
()
res
.
status
(
200
).
send
(
'
Order DB에 저장 완료
'
)
if
(
!
/^
[
0-9
]{2,3}
-
[
0-9
]{3,4}
-
[
0-9
]{4}
/
.
test
(
receiverInfo
.
tel
))
{
return
res
.
status
(
422
).
send
(
'
유효한 휴대전화번호가 아닙니다. 정확히 입력해주세요.
'
)
}
else
if
(
paymentWay
)
{
if
(
paymentWay
==
'
Remittance
'
)
{
if
(
!
(
receiverInfo
.
bank
&&
receiverInfo
.
depositor
&&
receiverInfo
.
deadline
))
{
return
res
.
status
(
422
).
send
(
'
선택하신 결제 수단에 관한 모든 정보를 입력해주시기 바랍니다.
'
)
}
const
paymentInfo
=
{
bank
:
receiverInfo
.
bank
,
depositor
:
receiverInfo
.
depositor
,
deadline
:
receiverInfo
.
deadline
}
const
newOrder
=
await
new
Order
({
userId
,
products
,
receiverInfo
,
paymentWay
,
paymentInfo
,
total
}).
save
()
res
.
status
(
200
).
send
(
'
Order DB에 저장 완료
'
)
}
else
{
const
newOrder
=
await
new
Order
({
userId
,
products
,
receiverInfo
,
paymentWay
,
total
}).
save
()
res
.
status
(
200
).
send
(
'
Order DB에 저장 완료
'
)
}
}
else
{
return
res
.
status
(
422
).
send
(
'
결제수단을 선택해주시기 바랍니다.
'
)
}
}
catch
(
error
)
{
console
.
log
(
error
)
res
.
status
(
500
).
send
(
'
Order DB에 저장 실패
'
)
...
...
server/controllers/user.controller.js
View file @
2ff3fb7c
...
...
@@ -32,12 +32,15 @@ const userById = async (req, res, next, id) => {
const
signup
=
async
(
req
,
res
)
=>
{
const
{
name
,
number1
,
number2
,
id
,
password
,
tel
,
email
}
=
req
.
body
try
{
if
(
!
isLength
(
password
,
{
min
:
8
,
max
:
15
}))
{
return
res
.
status
(
422
).
send
(
'
비밀번호는 8-15자리로 입력해주세요.
'
)
}
const
user
=
await
User
.
findOne
({
id
})
if
(
user
)
{
return
res
.
status
(
422
).
send
(
`
${
id
}
가 이미 사용중입니다.`
)
}
else
if
(
!
isLength
(
password
,
{
min
:
8
,
max
:
15
}))
{
return
res
.
status
(
422
).
send
(
'
비밀번호는 8-15자리로 입력해주세요.
'
)
}
else
if
(
number1
.
match
(
'
[^0-9]
'
)
||
number2
.
match
(
'
[^0-9]
'
))
{
return
res
.
status
(
422
).
send
(
'
주민등록번호는 숫자로 입력해주세요.
'
)
}
else
if
(
!
/^
[
0-9
]{2,3}
-
[
0-9
]{3,4}
-
[
0-9
]{4}
/
.
test
(
tel
))
{
return
res
.
status
(
422
).
send
(
'
유효한 휴대전화번호가 아닙니다. 정확히 입력해주세요.
'
)
}
const
hash
=
await
bcrypt
.
hash
(
password
,
10
)
const
newUser
=
await
new
User
({
...
...
@@ -50,7 +53,7 @@ const signup = async (req, res) => {
email
}).
save
()
await
new
Cart
({
userId
:
newUser
.
_id
}).
save
()
res
.
json
(
newUser
)
res
.
status
(
200
).
json
(
'
회원가입 성공
'
)
}
catch
(
error
)
{
console
.
log
(
error
)
res
.
status
(
500
).
send
(
'
죄송합니다. 다시 입력해 주십시오.
'
)
...
...
server/schemas/Order.js
View file @
2ff3fb7c
...
...
@@ -52,8 +52,22 @@ const OrderSchema = new mongoose.Schema({
type
:
String
,
required
:
true
}
}
,
},
paymentWay
:
{
type
:
String
,
required
:
true
},
paymentInfo
:
{
bank
:
{
type
:
String
},
depositor
:
{
type
:
String
},
deadline
:
{
type
:
String
}
},
total
:
{
type
:
Number
,
required
:
true
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment