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
butter-studio
Commits
fcabe7b8
Commit
fcabe7b8
authored
Aug 04, 2021
by
Jiwon Yoon
Browse files
Merge branch 'gyumin'
parents
4517a35f
731cc282
Changes
15
Hide whitespace changes
Inline
Side-by-side
.gitignore
View file @
fcabe7b8
/node_modules
.env.development
.env
./upload
\ No newline at end of file
upload/
\ No newline at end of file
client/src/apis/auth.api.js
View file @
fcabe7b8
...
...
@@ -32,13 +32,13 @@ const compareId = async (userId) => {
const
confirmMbnum
=
async
(
phone
)
=>
{
const
url
=
`
${
baseUrl
}
/api/auth/phone/
${
phone
}
`
const
{
data
}
=
await
axios
.
post
(
url
)
const
{
data
}
=
await
axios
.
post
(
url
)
;
return
data
}
const
confirmNum
=
async
(
n
um
)
=>
{
const
url
=
`
${
baseUrl
}
/api/auth/num
/
${
num
}
`
const
{
data
}
=
await
axios
.
ge
t
(
url
)
const
confirmNum
=
async
(
confirmN
um
)
=>
{
const
url
=
`
${
baseUrl
}
/api/auth/num`
const
{
data
}
=
await
axios
.
pos
t
(
url
,
confirmNum
);
return
data
}
...
...
@@ -61,7 +61,8 @@ const comparePw = async (pw) => {
const
modifyUser
=
async
(
user
)
=>
{
const
url
=
`
${
baseUrl
}
/api/auth/modify`
await
axios
.
post
(
url
,
user
)
const
{
data
}
=
await
axios
.
post
(
url
,
user
)
return
data
}
const
authApi
=
{
...
...
client/src/components/MyInfo/MyInfo.js
View file @
fcabe7b8
...
...
@@ -8,6 +8,7 @@ const MyInfo = () => {
const
[
img
,
setImg
]
=
useState
(
""
);
const
[
profile
,
setProfile
]
=
useState
(
""
);
const
[
startTime
,
setStartTime
]
=
useState
(
""
);
// 사용자 이름 가져오는 함수
const
getMember
=
async
()
=>
{
const
member
=
await
authApi
.
getMember
();
...
...
@@ -22,16 +23,21 @@ const MyInfo = () => {
//변경할 데이터 입력받는 state
const
[
userRe
,
setUserRe
]
=
useState
({
userName
:
""
,
userEmail
:
""
,
userNickName
:
""
,
userMbnum
:
""
,
userPassword
:
""
,
userRePassword
:
""
})
const
[
confirmMb
,
setConfirmMb
]
=
useState
(
false
);
const
[
number
,
setNumber
]
=
useState
(
null
);
//각 타입별 error 유무 state
const
[
mbError
,
setMbError
]
=
useState
(
false
);
const
[
error
,
setError
]
=
useState
(
""
);
const
[
errorMsg
,
setErrorMsg
]
=
useState
({
errorName
:
false
,
errorEmail
:
false
,
errorNickName
:
false
,
errorMbnum
:
false
,
...
...
@@ -62,7 +68,6 @@ const MyInfo = () => {
}
const
enterKey
=
(
e
)
=>
{
if
(
e
.
key
===
"
Enter
"
)
{
handleOnSummitVerify
(
e
);
}
}
...
...
@@ -105,6 +110,55 @@ const MyInfo = () => {
}
}
const
handleOnClickMbnum
=
async
(
e
)
=>
{
e
.
preventDefault
();
try
{
setStartTime
(
""
);
setError
(
""
);
setLoading
(
true
);
const
phone
=
userRe
.
userMbnum
;
console
.
log
(
"
phone :
"
,
phone
);
const
message
=
await
authApi
.
confirmMbnum
(
phone
);
console
.
log
(
"
message :
"
,
message
);
if
(
message
.
isSuccess
){
console
.
log
(
"
mberror:
"
+
mbError
);
setMbError
(
"
보냄
"
);
setStartTime
(
message
.
startTime
);
}
}
catch
(
error
)
{
console
.
log
(
'
error
'
+
error
)
}
finally
{
setLoading
(
false
);
}
}
const
handleOnChangeMb
=
(
e
)
=>
{
setNumber
(
String
(
e
.
target
.
value
));
}
const
handleOnClickMbConfirm
=
async
(
e
)
=>
{
e
.
preventDefault
();
try
{
setError
(
""
);
setLoading
(
true
);
console
.
log
(
"
startTime :
"
,
startTime
);
const
confirmNum
=
{
userMbnum
:
userRe
.
userMbnum
,
number
:
number
,
startTime
:
startTime
};
console
.
log
(
confirmNum
);
const
message
=
await
authApi
.
confirmNum
(
confirmNum
);
console
.
log
(
message
);
setMbError
(
message
);
if
(
message
===
"
성공
"
){
setConfirmMb
(
true
);
console
.
log
(
"
인증완료
"
);
}
}
catch
(
error
)
{
catchErrors
(
error
,
setError
);
}
finally
{
setLoading
(
false
);
}
}
//비교하여 error메세지 반환
const
vaildationData
=
(
text
,
compareValue
,
error
)
=>
{
if
(
text
!==
compareValue
)
{
...
...
@@ -121,8 +175,11 @@ const MyInfo = () => {
setErrorMsg
(
errorMsg
=>
({
...
errorMsg
,
[
error
]:
false
}));
}
}
//유효성 검사
const
validation
=
()
=>
{
//이름 유효성 검사
vaildationData
((
userRe
.
userName
.
length
===
0
),
false
,
"
errorName
"
);
//별명 유효성 검사
vaildationData
((
userRe
.
userNickName
.
length
===
0
),
false
,
"
errorNickName
"
);
// 휴대폰 유효성 검사
...
...
@@ -133,31 +190,29 @@ const MyInfo = () => {
vaildationData
(
userRe
.
userPassword
,
userRe
.
userRePassword
,
"
errorRePassword
"
);
// 최종 유효성 검사
if
((
Object
.
values
(
errorMsg
).
some
((
element
)
=>
(
element
))
===
false
))
{
if
(
!
(
Object
.
values
(
errorMsg
).
some
((
element
)
=>
(
element
))))
{
return
true
}
else
{
return
false
}
}
const
handleOnSummit
=
async
(
e
)
=>
{
e
.
preventDefault
();
try
{
console
.
log
(
'
handle ?????
'
)
setError
(()
=>
(
""
));
//처리가 될때까지 버튼(가입하기)이 안눌리게 지정
setLoading
(()
=>
(
true
));
console
.
log
(
"
userRe :
"
+
userRe
.
userEmail
);
//유효성 검사
let
valid
=
validation
();
console
.
log
(
"
valid :
"
+
valid
)
;
console
.
log
(
'
handle on submit
'
,
valid
)
if
(
valid
)
{
const
userData
=
userRe
;
console
.
log
(
userData
);
//서버로 전송
const
process
=
await
authApi
.
modifyUser
(
userData
);
console
.
log
(
"
process :
"
+
process
);
const
result
=
await
authApi
.
modifyUser
(
userData
);
console
.
log
(
"
result :
"
+
result
);
alert
(
"
회원정보 수정 완료
"
);
valid
=
false
;
}
else
{
throw
new
Error
(
"
유효하지 않은 데이터입니다.
"
)
}
...
...
@@ -190,8 +245,8 @@ const MyInfo = () => {
<
/div
>
<
/div
>
<
/div
>
<
div
className
=
"
modal fade
"
id
=
"
staticBackdrop
"
data
-
bs
-
backdrop
=
"
static
"
data
-
bs
-
keyboard
=
"
false
"
tab
i
ndex
=
"
-1
"
aria
-
labelledby
=
"
staticBackdropLabel
"
aria
-
hidden
=
"
true
"
>
{
/* 프로필 변경 모달창 */
}
<
div
className
=
"
modal fade
"
id
=
"
staticBackdrop
"
data
-
bs
-
backdrop
=
"
static
"
data
-
bs
-
keyboard
=
"
false
"
tab
I
ndex
=
"
-1
"
aria
-
labelledby
=
"
staticBackdropLabel
"
aria
-
hidden
=
"
true
"
>
<
div
className
=
"
modal-dialog modal-dialog-centered
"
>
<
form
className
=
"
modal-content
"
onSubmit
=
{
handleOnSummitForm
}
>
<
div
className
=
"
modal-header
"
>
...
...
@@ -210,15 +265,15 @@ const MyInfo = () => {
<
/div
>
{
/* 기존 비밀번호 확인 모달창 */
}
<
div
className
=
"
modal fade
"
id
=
"
verifyPassword
"
data
-
bs
-
backdrop
=
"
static
"
data
-
bs
-
keyboard
=
"
false
"
aria
-
hidden
=
"
true
"
aria
-
labelledby
=
"
verifyPasswordLabel
"
tab
i
ndex
=
"
-1
"
>
<
div
className
=
"
modal fade
"
id
=
"
verifyPassword
"
data
-
bs
-
backdrop
=
"
static
"
data
-
bs
-
keyboard
=
"
false
"
aria
-
hidden
=
"
true
"
aria
-
labelledby
=
"
verifyPasswordLabel
"
tab
I
ndex
=
"
-1
"
>
<
div
className
=
"
modal-dialog modal-dialog-centered modal-dialog-centered
"
>
{
page
?
<><
form
className
=
"
modal-content
"
onSubmit
=
{
handleOnSummitVerify
}
>
<
div
className
=
"
modal-header
"
>
<
h5
className
=
"
modal-title
"
id
=
"
verifyPasswordLabel
"
>
기존
비밀번호
확인
<
/h5
>
<
button
type
=
"
button
"
className
=
"
btn-close
"
data
-
bs
-
dismiss
=
"
modal
"
aria
-
label
=
"
Close
"
on
c
lick
=
{
handleOnClick
}
><
/button
>
<
button
type
=
"
button
"
className
=
"
btn-close
"
data
-
bs
-
dismiss
=
"
modal
"
aria
-
label
=
"
Close
"
on
C
lick
=
{
handleOnClick
}
><
/button
>
<
/div
>
<
div
clasName
s
=
"
modal-body
"
>
<
div
clas
s
Name
=
"
modal-body
"
>
<
div
className
=
"
d-flex flex-column
"
>
<
div
className
=
"
d-flex justify-content-around align-items-center my-4
"
>
<
label
className
=
{
styles
.
signupLabel
}
>
현재
비밀번호
<
/label
>
...
...
@@ -233,13 +288,20 @@ const MyInfo = () => {
:
<><
form
className
=
{
`modal-content d-flex col-md-6 col-12 justify-content-center d-flex flex-column`
}
onSubmit
=
{
handleOnSummit
}
>
<
div
className
=
"
modal-header
"
>
<
h5
className
=
"
modal-title
"
id
=
"
modifyLabel
"
>
회원정보
수정
<
/h5
>
<
button
type
=
"
button
"
className
=
"
btn-close
"
data
-
bs
-
dismiss
=
"
modal
"
aria
-
label
=
"
Close
"
on
c
lick
=
{
handleOnClick
}
><
/button
>
<
button
type
=
"
button
"
className
=
"
btn-close
"
data
-
bs
-
dismiss
=
"
modal
"
aria
-
label
=
"
Close
"
on
C
lick
=
{
handleOnClick
}
><
/button
>
<
/div
>
<
div
className
=
{
`modal-body`
}
>
<
div
className
=
"
d-flex flex-column
"
>
<
div
className
=
{
styles
.
inputContent
}
>
<
label
className
=
{
styles
.
signupLabel
}
>
이름
<
/label
>
<
input
className
=
{
`
${
styles
.
input
}
${
styles
.
inputSize
}
`
}
type
=
"
text
"
name
=
"
userName
"
placeholder
=
"
이름을 입력해주세요
"
onChange
=
{
handleUserOnChange
}
maxLength
=
"
11
"
required
/>
<
/div
>
{
errorMsg
.
errorName
&&
<
p
className
=
{
styles
.
passwordConfirmError
}
>
이름을
입력해주세요
<
/p>
}
<
/div
>
<
div
className
=
"
d-flex flex-column
"
>
<
div
className
=
{
styles
.
inputContent
}
>
<
label
className
=
{
styles
.
signupLabel
}
>
이메일
<
/label
>
<
input
className
=
{
`
${
styles
.
input
}
${
styles
.
inputSize
}
`
}
type
=
"
email
"
name
=
"
userEmail
"
placeholder
=
"
이메일을 입력해주세요
"
onChange
=
{
handleUserOnChange
}
max
l
ength
=
"
20
"
required
/>
<
input
className
=
{
`
${
styles
.
input
}
${
styles
.
inputSize
}
`
}
type
=
"
email
"
name
=
"
userEmail
"
placeholder
=
"
이메일을 입력해주세요
"
onChange
=
{
handleUserOnChange
}
max
L
ength
=
"
20
"
required
/>
<
/div
>
{
errorMsg
.
errorEmail
&&
<
p
className
=
{
styles
.
passwordConfirmError
}
>
이메일을
입력해주세요
<
/p>
}
<
/div
>
...
...
@@ -255,12 +317,29 @@ const MyInfo = () => {
<
div
className
=
{
styles
.
inputContent
}
>
<
label
className
=
{
styles
.
signupLabel
}
>
휴대폰
번호
<
/label
>
<
div
className
=
"
d-flex col-md-auto
"
>
<
input
className
=
{
`
${
styles
.
input
}
${
styles
.
inputSize
}
`
}
type
=
"
number
"
name
=
"
userMbnum
"
placeholder
=
"
-없이 11자리 입력
"
onChange
=
{
handleUserOnChange
}
min
=
""
max
=
"
99999999999
"
required
/>
<
input
className
=
{
`
${
styles
.
input
}
`
}
type
=
"
number
"
name
=
"
userMbnum
"
placeholder
=
"
-없이 11자리 입력
"
onChange
=
{
handleUserOnChange
}
min
=
""
max
=
"
99999999999
"
required
/>
<
button
type
=
"
button
"
disabled
=
{
loading
}
className
=
{
`rounded-2 mt-2
${
styles
.
butterYellowAndBtn
}
${
styles
.
btnHover
}
`
}
data
-
bs
-
toggle
=
"
collapse
"
data
-
bs
-
target
=
"
#collapseExample
"
aria
-
expanded
=
"
false
"
aria
-
controls
=
"
collapseExample
"
onClick
=
{
handleOnClickMbnum
}
>
인증번호받기
<
/button
>
<
/div
>
<
/div
>
{
errorMsg
.
errorMbnum
&&
<
p
className
=
{
styles
.
passwordConfirmError
}
>-
없이
숫자
11
자리를
입력해주세요
.
<
/p>
}
<
div
className
=
"
collapse
"
id
=
"
collapseExample
"
>
{
/* <div className="d-flex col-md-auto justify-content-end"> */
}
<
div
className
=
"
d-flex justify-content-around mt-3
"
>
<
label
className
=
{
`
${
styles
.
confirm
}
`
}
>
인증하기
<
/label
>
<
div
>
<
input
className
=
{
`
${
styles
.
input
}
`
}
type
=
"
number
"
placeholder
=
"
인증번호를 입력
"
onChange
=
{
handleOnChangeMb
}
required
/>
<
button
type
=
"
button
"
className
=
{
`rounded-2 py-2
${
styles
.
butterYellowAndBtn
}
${
styles
.
btnHover
}
`
}
onClick
=
{
handleOnClickMbConfirm
}
>
확인
<
/button
>
<
button
type
=
"
button
"
className
=
{
`rounded-2 py-2
${
styles
.
butterYellowAndBtn
}
${
styles
.
btnHover
}
`
}
onClick
=
{
handleOnClickMbnum
}
>
재전송
<
/button
>
<
/div
>
<
/div
>
{(
mbError
===
"
재전송
"
)
&&
<
p
className
=
{
styles
.
passwordConfirmError
}
>
유효시간이
만료되었습니다
.
재전송해주세요
.
<
/p>
}
{(
mbError
===
"
보냄
"
)
&&
<
p
className
=
{
styles
.
passwordConfirmError
}
>
5
분이내에
입력해주세요
.
<
/p>
}
{(
mbError
===
"
성공
"
)
&&
<
p
className
=
{
styles
.
passwordConfirmError
}
>
인증되었습니다
.
<
/p>
}
{(
mbError
===
"
실패
"
)
&&
<
p
className
=
{
styles
.
passwordConfirmError
}
>
인증번호를
다시
입력해주세요
.
<
/p>
}
<
/div
>
<
/div
>
<
div
className
=
"
d-flex flex-column
"
>
<
div
className
=
{
styles
.
inputContent
}
>
<
label
className
=
{
styles
.
signupLabel
}
>
새
비밀번호
<
/label
>
...
...
client/src/components/MyInfo/my-info.module.scss
View file @
fcabe7b8
...
...
@@ -2,10 +2,10 @@
display
:
flex
;
justify-content
:
center
;
color
:
#FEDC00
;
font-size
:
1
.8
rem
;
font-size
:
3
rem
;
margin
:
2rem
0
;
}
img
{
.
img
{
width
:
40%
;
}
...
...
@@ -22,7 +22,7 @@ width: 40%;
}
.userName
{
color
:
white
;
font-size
:
1
.
3
rem
;
font-size
:
1
.
8
rem
;
}
.contents
{
...
...
@@ -120,9 +120,11 @@ width: 40%;
.passwordConfirmError
{
margin-bottom
:
0
;
margin-top
:
0
.5rem
;
margin-right
:
3rem
;
text-align
:
end
;
font-size
:
13px
;
color
:
#FEDC00
;
font-weight
:
bold
;
color
:
black
;
}
@media
(
max-width
:
403px
)
{
...
...
client/src/components/ReservationDetails/ReservationDetails.js
View file @
fcabe7b8
import
styles
from
"
./reservation-details.module.scss
"
;
const
ReservationDetails
=
()
=>
{
return
(
<
div
className
=
{
`
${
styles
.
width
}
`
}
>
<
header
className
=
{
`
${
styles
.
header
}
`
}
>
나의
예매
내역
<
/header
>
<
main
>
<
/main
>
<
/div
>
return
(
<
div
className
=
{
`d-flex flex-column align-items-center
${
styles
.
width
}
`
}
>
<
div
className
=
{
`
${
styles
.
header
}
`
}
>
나의
예매
내역
<
/div
>
<
div
className
=
{
`
${
styles
.
body
}
`
}
>
<
div
className
=
{
`d-flex justify-content-around align-items-center py-3`
}
>
<
div
className
=
{
`
${
styles
.
span
}
d-flex justify-content-center`
}
>
<
span
>
영화
포스터
<
/span
>
<
/div
>
<
div
className
=
{
`
${
styles
.
span
}
d-flex flex-column`
}
>
<
span
>
영화제목
<
/span
>
<
span
>
예매확인번호
<
/span
>
<
span
>
예매날짜
<
/span
>
<
span
>
상영관
<
/span
>
<
span
>
좌석정보
<
/span
>
<
span
>
결제금액
<
/span
>
<
span
>
결제수단
<
/span
>
<
/div
>
<
/div
>
<
/div
>
<
div
className
=
{
`
${
styles
.
header
}
`
}
>
나의
리뷰
<
/div
>
<
/div
>
)
}
...
...
client/src/components/ReservationDetails/reservation-details.module.scss
View file @
fcabe7b8
.width
{
width
:
100%
;
display
:
flex
;
margin-top
:
5rem
;
justify-content
:
center
;
}
.header
{
display
:
flex
;
...
...
@@ -12,5 +10,15 @@
width
:
80%
;
text-align
:
center
;
font-size
:
2
.5rem
;
margin
:
5rem
;
}
.body
{
width
:
80%
;
border-top
:
1px
solid
#FEDC00
;
border-bottom
:
1px
solid
#FEDC00
;
}
.span
span
{
color
:white
;
font-size
:
1
.5rem
;
}
\ No newline at end of file
client/src/components/Signup/Signup.js
View file @
fcabe7b8
...
...
@@ -7,6 +7,7 @@ import catchErrors from "../../utils/catchErrors.js";
const
Signup
=
()
=>
{
const
[
user
,
setUser
]
=
useState
({
userId
:
""
,
userName
:
""
,
userEmail
:
""
,
userNickName
:
""
,
userBirthday
:
""
,
...
...
@@ -14,7 +15,7 @@ const Signup = () => {
userPassword
:
""
,
userRePassword
:
""
})
const
[
startTime
,
setStartTime
]
=
useState
(
""
);
const
[
number
,
setNumber
]
=
useState
(
null
);
const
[
loading
,
setLoading
]
=
useState
(
false
);
const
[
success
,
setSuccess
]
=
useState
(
false
);
...
...
@@ -23,6 +24,7 @@ const Signup = () => {
const
[
error
,
setError
]
=
useState
(
""
);
const
[
errorMsg
,
setErrorMsg
]
=
useState
({
errorId
:
null
,
errorName
:
false
,
errorEmail
:
false
,
errorNickName
:
false
,
errorBirthday
:
false
,
...
...
@@ -87,15 +89,18 @@ const Signup = () => {
const
handleOnClickMbnum
=
async
(
e
)
=>
{
e
.
preventDefault
();
try
{
setStartTime
(
""
);
setError
(
""
);
setLoading
(
true
)
const
phone
=
user
.
userMbnum
;
console
.
log
(
"
phone :
"
,
phone
)
console
.
log
(
"
phone :
"
,
phone
)
;
const
message
=
await
authApi
.
confirmMbnum
(
phone
);
console
.
log
(
"
message :
"
,
message
);
if
(
message
.
isSuccess
){
console
.
log
(
"
mberror:
"
+
mbError
);
setMbError
(
"
보냄
"
);
setStartTime
(
message
.
startTime
);
}
}
catch
(
error
)
{
console
.
log
(
'
error
'
+
error
)
...
...
@@ -112,9 +117,10 @@ const Signup = () => {
e
.
preventDefault
();
try
{
setError
(
""
);
setLoading
(
true
)
const
confirmNum
=
number
;
console
.
log
(
confirmNum
)
setLoading
(
true
);
console
.
log
(
"
startTime :
"
,
startTime
);
const
confirmNum
=
{
userMbnum
:
user
.
userMbnum
,
number
:
number
,
startTime
:
startTime
};
console
.
log
(
confirmNum
);
const
message
=
await
authApi
.
confirmNum
(
confirmNum
);
console
.
log
(
message
);
setMbError
(
message
);
...
...
@@ -129,6 +135,9 @@ const Signup = () => {
}
}
const
handleOnSummit
=
async
(
e
)
=>
{
e
.
preventDefault
();
try
{
...
...
@@ -176,6 +185,8 @@ const Signup = () => {
setPreId
(
user
.
userId
);
//아이디 유효성 검사
vaildationIdPw
(
user
.
userId
.
length
,
5
,
"
errorId
"
);
//이름 유효성 검사
vaildationData
((
user
.
userName
.
length
===
0
),
false
,
"
errorName
"
);
//별명 유효성 검사
vaildationData
((
user
.
userNickName
.
length
===
0
),
false
,
"
errorNickName
"
);
// 생일 유효성 검사
...
...
@@ -228,6 +239,13 @@ const Signup = () => {
{
overlapId
&&
(
errorMsg
.
errorId
===
false
)
&&
<
p
className
=
{
styles
.
passwordConfirmError
}
>
아이디
중복이
확인되었습니다
.
<
/p>
}
{(
errorMsg
.
errorId
===
false
)
&&
(
overlapId
===
false
)
&&
<
p
className
=
{
styles
.
passwordConfirmError
}
>
아이디
중복확인을
해주세요
.
<
/p>
}
<
/div
>
<
div
className
=
"
d-flex flex-column
"
>
<
div
className
=
{
styles
.
inputContent
}
>
<
label
className
=
{
styles
.
signupLabel
}
>
이름
<
/label
>
<
input
className
=
{
`
${
styles
.
input
}
${
styles
.
inputSize
}
`
}
type
=
"
text
"
name
=
"
userName
"
placeholder
=
"
이름을 입력해주세요
"
onChange
=
{
handleUserOnChange
}
maxlength
=
"
10
"
required
/>
<
/div
>
{
errorMsg
.
errorName
&&
<
p
className
=
{
styles
.
passwordConfirmError
}
>
이름을
입력해주세요
<
/p>
}
<
/div
>
<
div
className
=
"
d-flex flex-column
"
>
<
div
className
=
{
styles
.
inputContent
}
>
<
label
className
=
{
styles
.
signupLabel
}
>
이메일
<
/label
>
...
...
@@ -266,7 +284,7 @@ const Signup = () => {
<
div
className
=
"
d-flex justify-content-between mt-3
"
>
<
label
className
=
{
`
${
styles
.
confirm
}
`
}
>
인증하기
<
/label
>
<
div
>
<
input
className
=
{
`
${
styles
.
input
}
${
styles
.
input2
}
`
}
type
=
"
number
"
placeholder
=
"
인증번호를 입력
"
onChange
=
{
handleOnChangeMb
}
require
/>
<
input
className
=
{
`
${
styles
.
input
}
${
styles
.
input2
}
`
}
type
=
"
number
"
placeholder
=
"
인증번호를 입력
"
onChange
=
{
handleOnChangeMb
}
require
d
/>
<
button
type
=
"
button
"
className
=
{
`rounded-2 py-2
${
styles
.
butterYellowAndBtn
}
${
styles
.
btnHover
}
`
}
onClick
=
{
handleOnClickMbConfirm
}
>
확인
<
/button
>
<
button
type
=
"
button
"
className
=
{
`rounded-2 py-2
${
styles
.
butterYellowAndBtn
}
${
styles
.
btnHover
}
`
}
onClick
=
{
handleOnClickMbnum
}
>
재전송
<
/button
>
<
/div
>
...
...
client/src/pages/TicketingSeatPage.js
View file @
fcabe7b8
...
...
@@ -60,7 +60,7 @@ const TicketingSeatPage = ({ location }) => {
return
(
<>
<
div
ref
=
{
modalRef
}
className
=
"
modal fade
"
id
=
"
staticBackdrop
"
data
-
bs
-
backdrop
=
"
static
"
data
-
bs
-
keyboard
=
"
false
"
tab
i
ndex
=
"
-1
"
aria
-
labelledby
=
"
staticBackdropLabel
"
aria
-
hidden
=
{
modal
}
>
<
div
ref
=
{
modalRef
}
className
=
"
modal fade
"
id
=
"
staticBackdrop
"
data
-
bs
-
backdrop
=
"
static
"
data
-
bs
-
keyboard
=
"
false
"
tab
I
ndex
=
"
-1
"
aria
-
labelledby
=
"
staticBackdropLabel
"
aria
-
hidden
=
{
modal
}
>
<
div
className
=
"
modal-dialog
"
>
<
div
className
=
"
modal-content
"
>
{
}
...
...
server/config/app.config.js
View file @
fcabe7b8
...
...
@@ -4,6 +4,7 @@ const config = {
jwtSecret
:
'
dfkasf23i$efksdfks!
'
,
jwtExpires
:
'
7d
'
,
cookieName
:
'
butterStudio
'
,
cookieNameMb
:
'
confirmNum
'
,
cookieMaxAge
:
60
*
60
*
24
*
7
*
1000
,
kakaoAdminKey
:
'
e3ce7106688a35e072e2630daa9d7250
'
,
}
...
...
server/controllers/user.controller.js
View file @
fcabe7b8
import
jwt
from
"
jsonwebtoken
"
;
import
config
from
"
../config/app.config.js
"
;
import
{
User
,
Role
,
Guest
}
from
'
../db/index.js
'
;
import
{
User
,
Role
,
Guest
,
ConfirmNum
}
from
'
../db/index.js
'
;
import
fs
from
"
fs
"
;
import
CryptoJS
from
"
crypto-js
"
;
import
axios
from
"
axios
"
;
...
...
@@ -95,7 +95,6 @@ const compareId = async (req, res) => {
}
// 휴대폰 인증
const
NCP_serviceID
=
'
ncp:sms:kr:270376424445:butterstudio
'
;
const
NCP_accessKey
=
'
GQmVCT2ZFxnEaJOWbrQs
'
;
const
NCP_secretKey
=
'
XLQQ8sd9WxW40hNi0xNBTOG0T8ksRsr8c8sUIEvy
'
;
...
...
@@ -123,12 +122,8 @@ hmac.update(accessKey);
const
hash
=
hmac
.
finalize
();
const
signature
=
hash
.
toString
(
CryptoJS
.
enc
.
Base64
);
let
inherentNum
=
""
;
// 유효시간 5분 설정
const
time
=
()
=>
{
inherentNum
=
false
;
return
inherentNum
}
// 인증번호 발송
const
confirmMbnum
=
async
(
req
,
res
)
=>
{
...
...
@@ -139,39 +134,56 @@ const confirmMbnum = async (req, res) => {
//인증번호 생성
const
verifyCode
=
Math
.
floor
(
Math
.
random
()
*
(
999999
-
100000
))
+
100000
;
console
.
log
(
"
verifyCode :
"
,
verifyCode
);
let
result
=
await
axios
({
method
:
method
,
json
:
true
,
url
:
url
,
headers
:
{
'
Content-Type
'
:
"
application/json
"
,
'
x-ncp-apigw-timestamp
'
:
date
,
'
x-ncp-iam-access-key
'
:
accessKey
,
'
x-ncp-apigw-
signature-v2
'
:
signatur
e
,
}
,
data
:
{
type
:
'
SMS
'
,
contentType
:
'
COMM
'
,
countryCod
e
:
'
82
'
,
from
:
'
01086074580
'
,
cont
ent
:
`[본인 확인] 인증번호 [
${
verifyCode
}
]를 입력해주세요.`
,
messages
:
[
{
to
:
`
${
phoneNumber
}
`
,
},
]
,
},
});
const
resultMs
=
result
.
data
.
messages
;
console
.
log
(
'
resultMs
'
,
resultMs
);
let
today
=
new
Date
();
let
time
=
String
(
today
.
getTime
());
console
.
log
(
"
time :
"
,
time
);
// let result = await axios({
//
method: method
,
//
json: true,
//
url: url
,
//
headers: {
//
'
Content-Type': "application/json"
,
//
'x-ncp-apigw-
timestamp': dat
e,
//
'x-ncp-iam-access-key': accessKey
,
// 'x-ncp-apigw-signature-v2': signature,
//
}
,
//
data: {
//
typ
e: '
SMS
',
//
contentType: 'COMM
',
//
co
u
nt
ryCode: '82'
,
//
from: '01086074580',
//
content: `[본인 확인] 인증번호 [${verifyCode}]를 입력해주세요.`,
//
messages: [
//
{
//
to: `${phoneNumber}`
,
//
},
// ],
// },
// }
);
cons
ole
.
log
(
'
response
'
,
res
.
data
,
res
[
'
data
'
])
;
inherentNum
=
String
(
verifyCode
);
//
cons
t resultMs =
res
ult
.data
.messages
;
// console.log('resultMs', resultMs
);
// 5분 유효시간 설정
setTimeout
(
time
,
300000
);
res
.
json
({
isSuccess
:
true
,
code
:
202
,
message
:
"
본인인증 문자 발송 성공
"
,
result
:
res
.
data
});
// console.log('response', res.data, res['data']);
const
confirm
=
await
ConfirmNum
.
findOne
({
where
:
{
phone
:
phoneNumber
}
});
console
.
log
(
confirm
);
if
(
confirm
){
await
confirm
.
destroy
();
// 5분 유효시간 설정
await
ConfirmNum
.
create
({
confirmNum
:
String
(
verifyCode
),
phone
:
phoneNumber
,
startTime
:
time
,
});
}
else
{
await
ConfirmNum
.
create
({
confirmNum
:
String
(
verifyCode
),
phone
:
phoneNumber
,
startTime
:
time
,
}
);
}
res
.
json
({
startTime
:
time
,
isSuccess
:
true
,
code
:
202
,
message
:
"
본인인증 문자 발송 성공
"
,
result
:
res
.
data
});
}
catch
(
error
)
{
console
.
log
(
"
error:
"
,
error
);
if
(
error
.
res
==
undefined
)
{
...
...
@@ -180,19 +192,30 @@ const confirmMbnum = async (req, res) => {
else
res
.
json
({
isSuccess
:
true
,
code
:
204
,
message
:
"
본인인증 문자 발송에 문제가 있습니다.
"
,
result
:
error
.
res
});
}
};
// 인증번호 확인
const
confirmNum
=
async
(
req
,
res
)
=>
{
try
{
const
verifyCode
=
inherentNum
;
const
confirmNum
=
req
.
params
.
num
;
if
(
!
verifyCode
){
res
.
send
(
"
재전송
"
)
}
else
{
if
(
confirmNum
!==
verifyCode
)
{
const
{
userMbnum
,
number
,
startTime
}
=
req
.
body
;
console
.
log
(
userMbnum
,
number
,
startTime
);
const
confirm
=
await
ConfirmNum
.
findOne
({
where
:
{
phone
:
userMbnum
,
startTime
:
startTime
}
});
console
.
log
(
confirm
);
let
today
=
new
Date
();
let
time
=
today
.
getTime
();
console
.
log
(
"
time2 :
"
,
time
);
const
elapsedMSec
=
time
-
confirm
.
startTime
;
const
elapsedMin
=
String
(
elapsedMSec
/
1000
/
60
);
console
.
log
(
"
elapsedMin :
"
,
elapsedMin
);
if
(
elapsedMin
<=
5
){
if
(
number
!==
confirm
.
confirmNum
)
{
res
.
send
(
"
실패
"
);
}
else
{
await
confirm
.
destroy
();
res
.
send
(
"
성공
"
);
}
}
else
{
res
.
send
(
"
재전송
"
)
}
}
catch
(
error
)
{
console
.
error
(
"
error :
"
,
error
.
message
);
...
...
@@ -201,10 +224,9 @@ const confirmNum = async (req, res) => {
};
const
signup
=
async
(
req
,
res
)
=>
{
const
{
userId
,
userEmail
,
userNickName
,
userBirthday
,
userMbnum
,
userPassword
}
=
req
.
body
;
// 휴대폰 중복 확인
const
{
userId
,
userName
,
userEmail
,
userNickName
,
userBirthday
,
userMbnum
,
userPassword
}
=
req
.
body
;
try
{
const
mbnum
=
await
User
.
findOne
({
where
:
{
phoneNumber
:
userMbnum
}
});
const
mbnum
=
await
User
.
findOne
({
where
:
{
phoneNumber
:
userMbnum
}});
const
email
=
await
User
.
findOne
({
where
:
{
email
:
userEmail
}
});
if
(
mbnum
&&
email
)
{
...
...
@@ -217,6 +239,7 @@ const signup = async (req, res) => {
const
role
=
await
Role
.
findOne
({
where
:
{
name
:
"
member
"
}
})
const
newUser
=
await
User
.
create
({
userId
:
userId
,
name
:
userName
,
email
:
userEmail
,
nickname
:
userNickName
,
birth
:
userBirthday
,
...
...
@@ -258,7 +281,6 @@ const uploadProfile = async (req, res) => {
if
(
decoded
)
{
const
img
=
await
User
.
findOne
({
where
:
{
id
:
decoded
.
id
},
attributes
:
[
"
img
"
]
});
console
.
log
(
"
여기여기
"
);
fs
.
unlink
(
"
upload
"
+
`\
\$
{img.img}`
,
function
(
data
)
{
console
.
log
(
data
);
});
const
user
=
await
User
.
update
({
...
...
@@ -304,7 +326,6 @@ const overlap = async (decoded, dataType, data) => {
let
overlap
=
await
User
.
findOne
({
where
:
{
id
:
decoded
.
id
}
});
console
.
log
(
"
기존 데이터 :
"
,
overlap
,
"
변경할 데이터 :
"
,
data
);
if
(
overlap
[
dataType
]
===
data
)
{
console
.
log
(
"
여기여기
"
)
return
true
}
else
{
let
overlap2
=
await
User
.
findOne
({
attributes
:
[
dataType
]
});
...
...
@@ -324,21 +345,19 @@ const modifyUser = async (req, res) => {
try
{
const
token
=
req
.
cookies
.
butterStudio
;
const
decoded
=
jwt
.
verify
(
token
,
config
.
jwtSecret
);
const
{
userEmail
,
userNickName
,
userMbnum
,
userPassword
}
=
req
.
body
;
console
.
log
(
userEmail
);
console
.
log
(
userMbnum
);
const
{
userName
,
userEmail
,
userNickName
,
userMbnum
,
userPassword
}
=
req
.
body
;
const
overlapEmail
=
await
overlap
(
decoded
,
"
email
"
,
userEmail
);
const
overlapMbnum
=
await
overlap
(
decoded
,
"
phoneNumber
"
,
userMbnum
);
console
.
log
(
"
overlapEmail
"
,
overlapEmail
,
"
overlapMbnum :
"
,
overlapMbnum
);
if
(
overlapEmail
&&
overlapMbnum
)
{
const
user
=
await
User
.
update
({
name
:
userName
,
email
:
userEmail
,
nickname
:
userNickName
,
phoneNumber
:
userMbnum
,
password
:
userPassword
,
},
{
where
:
{
id
:
decoded
.
id
}
});
},
{
where
:
{
id
:
decoded
.
id
}
,
individualHooks
:
true
});
console
.
log
(
"
user22 :
"
,
user
);
res
.
json
(
user
);
}
else
if
(
!
overlapEmail
&&
overlapMbnum
)
{
...
...
@@ -353,6 +372,7 @@ const modifyUser = async (req, res) => {
res
.
status
(
500
).
send
(
"
수정 에러. 나중에 다시 시도 해주세요
"
);
}
};
const
getUserInfo
=
async
(
req
,
res
)
=>
{
const
{
id
}
=
req
.
body
console
.
log
(
id
)
...
...
server/db/index.js
View file @
fcabe7b8
...
...
@@ -9,6 +9,7 @@ import TicketFeeModel from "../models/ticketfee.model.js";
import
TimeTableModel
from
'
../models/role.model.js
'
;
import
ReservationModel
from
'
../models/reservation.model.js
'
;
import
GuestModel
from
'
../models/guest.model.js
'
import
ConfirmNumModel
from
'
../models/confirmnum.model.js
'
import
dbConfig
from
"
../config/db.config.js
"
;
const
sequelize
=
new
Sequelize
(
...
...
@@ -37,6 +38,7 @@ const TicketFee = TicketFeeModel(sequelize)
const
TimeTable
=
TimeTableModel
(
sequelize
)
const
Reservation
=
ReservationModel
(
sequelize
)
const
Guest
=
GuestModel
(
sequelize
)
const
ConfirmNum
=
ConfirmNumModel
(
sequelize
)
User
.
belongsTo
(
Role
);
Role
.
hasOne
(
User
);
...
...
@@ -56,5 +58,6 @@ export {
TicketFee
,
TimeTable
,
Reservation
,
Guest
Guest
,
ConfirmNum
}
\ No newline at end of file
server/index.js
View file @
fcabe7b8
...
...
@@ -23,6 +23,7 @@ sequelize
if
(
!
adminRole
)
{
await
User
.
create
({
userId
:
"
admin
"
,
name
:
"
관리자
"
,
email
:
"
han35799@naver.com
"
,
nickname
:
"
haha
"
,
birth
:
"
990926
"
,
...
...
server/models/confirmnum.model.js
0 → 100644
View file @
fcabe7b8
import
Sequelize
from
"
sequelize
"
;
const
{
DataTypes
}
=
Sequelize
;
const
ConfirmNumModel
=
(
sequelize
)
=>
{
const
ConfirmNum
=
sequelize
.
define
(
"
confirmnum
"
,
{
id
:
{
type
:
DataTypes
.
INTEGER
,
primaryKey
:
true
,
autoIncrement
:
true
,
},
confirmNum
:
{
type
:
DataTypes
.
STRING
,
},
phone
:
{
type
:
DataTypes
.
STRING
},
startTime
:
{
type
:
DataTypes
.
STRING
},
},
{
timestamps
:
true
,
freezeTableName
:
true
,
tableName
:
"
confirmnum
"
}
);
return
ConfirmNum
;
};
export
default
ConfirmNumModel
;
\ No newline at end of file
server/models/user.model.js
View file @
fcabe7b8
...
...
@@ -16,6 +16,9 @@ const UserModel = (sequelize) => {
userId
:
{
type
:
DataTypes
.
STRING
},
name
:
{
type
:
DataTypes
.
STRING
},
email
:
{
type
:
DataTypes
.
STRING
},
...
...
@@ -51,6 +54,7 @@ const UserModel = (sequelize) => {
);
User
.
beforeSave
(
async
(
user
)
=>
{
console
.
log
(
'
update before
'
,
user
)
if
(
!
user
.
changed
(
"
password
"
))
{
return
;
}
...
...
server/routes/user.route.js
View file @
fcabe7b8
...
...
@@ -33,7 +33,10 @@ router
router
.
route
(
"
/member
"
)
.
get
(
userCtrl
.
getMember
)
router
.
route
(
"
/num
"
)
.
post
(
userCtrl
.
confirmNum
)
router
.
route
(
"
/pw/:pw
"
)
.
get
(
userCtrl
.
comparePw
)
...
...
@@ -46,9 +49,6 @@ router
.
route
(
"
/phone/:phone
"
)
.
post
(
userCtrl
.
confirmMbnum
)
router
.
route
(
"
/num/:num
"
)
.
get
(
userCtrl
.
confirmNum
)
router
.
route
(
'
/getuserinfo
'
)
.
post
(
userCtrl
.
getUserInfo
)
...
...
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