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
49fc2a67
Commit
49fc2a67
authored
Aug 10, 2021
by
Jiwon Yoon
Browse files
Merge branch 'kimpen'
parents
6e0e826d
ab2a8d78
Changes
18
Show whitespace changes
Inline
Side-by-side
client/src/App.js
View file @
49fc2a67
...
@@ -38,7 +38,7 @@ function App() {
...
@@ -38,7 +38,7 @@ function App() {
<
Route
path
=
"
/movie/:movieId
"
component
=
{
MoviePage
}
/
>
<
Route
path
=
"
/movie/:movieId
"
component
=
{
MoviePage
}
/
>
<
Route
path
=
"
/mypage
"
component
=
{
MyPage
}
/
>
<
Route
path
=
"
/mypage
"
component
=
{
MyPage
}
/
>
<
Route
path
=
"
/guest
"
component
=
{
GuestPage
}
/
>
<
Route
path
=
"
/guest
"
component
=
{
GuestPage
}
/
>
<
Route
path
=
"
/ticket/seat
"
component
=
{
TicketingSeatPage
}
/
>
<
Route
path
=
"
/ticket/seat
"
component
=
{
TicketingSeatPage
}
/
>
<
Route
path
=
"
/ticket
"
component
=
{
TicketingPage
}
/
>
<
Route
path
=
"
/ticket
"
component
=
{
TicketingPage
}
/
>
<
Route
path
=
"
/payment
"
component
=
{
PaymentPage
}
/
>
<
Route
path
=
"
/payment
"
component
=
{
PaymentPage
}
/
>
<
Route
path
=
"
/paymentcomplete
"
component
=
{
PaymentCompletePage
}
/
>
<
Route
path
=
"
/paymentcomplete
"
component
=
{
PaymentCompletePage
}
/
>
...
@@ -47,6 +47,7 @@ function App() {
...
@@ -47,6 +47,7 @@ function App() {
<
Route
path
=
"
/search
"
component
=
{
SearchPage
}
/
>
<
Route
path
=
"
/search
"
component
=
{
SearchPage
}
/
>
<
/Switch
>
<
/Switch
>
<
/div
>
<
/div
>
<
/Switch
>
<
/Switch
>
<
/Router
>
<
/Router
>
<
/AuthProvider
>
<
/AuthProvider
>
...
...
client/src/apis/timetable.api.js
View file @
49fc2a67
import
axios
from
"
axios
"
;
import
axios
from
"
axios
"
;
import
{
baseUrl
}
from
"
../utils/baseUrl.js
"
;
import
{
baseUrl
}
from
"
../utils/baseUrl.js
"
;
const
getAll
=
async
(
selectDate
)
=>
{
const
getAll
=
async
(
selectDate
,
movieId
)
=>
{
const
{
data
}
=
await
axios
.
get
(
`
${
baseUrl
}
/api/timetable?when=
${
selectDate
}
`
)
const
{
data
}
=
await
axios
.
get
(
`
${
baseUrl
}
/api/timetable?when=
${
selectDate
}
&movieId=
${
movieId
}
`
)
return
data
return
data
}
}
...
...
client/src/components/Admin/MovieEdit.js
View file @
49fc2a67
...
@@ -18,6 +18,7 @@ const MovieEdit = () => {
...
@@ -18,6 +18,7 @@ const MovieEdit = () => {
async
function
paginate
(
pageNum
)
{
async
function
paginate
(
pageNum
)
{
try
{
try
{
setError
(
""
)
const
{
TMDBmovies
,
totalPage
}
=
(
search
.
keyword
!==
''
)
?
await
movieApi
.
search
(
search
,
pageNum
)
:
await
movieApi
.
getAllfromTM
(
pageNum
)
const
{
TMDBmovies
,
totalPage
}
=
(
search
.
keyword
!==
''
)
?
await
movieApi
.
search
(
search
,
pageNum
)
:
await
movieApi
.
getAllfromTM
(
pageNum
)
setActivePage
(
pageNum
)
setActivePage
(
pageNum
)
setTotalPages
(
totalPage
)
setTotalPages
(
totalPage
)
...
...
client/src/components/Admin/TimeTable.js
View file @
49fc2a67
...
@@ -5,19 +5,23 @@ import timetableApi from "../../apis/timetable.api.js";
...
@@ -5,19 +5,23 @@ import timetableApi from "../../apis/timetable.api.js";
import
catchErrors
from
"
../../utils/catchErrors.js
"
;
import
catchErrors
from
"
../../utils/catchErrors.js
"
;
import
styles
from
"
./admin.module.scss
"
;
import
styles
from
"
./admin.module.scss
"
;
const
TimeTable
=
()
=>
{
const
TimeTable
=
(
{
ticketInfo
=
{
movieId
:
0
},
setTicketInfo
}
)
=>
{
const
[
selectDate
,
setSelectDate
]
=
useState
(
moment
().
format
(
'
YYYY-MM-DD
'
))
const
[
selectDate
,
setSelectDate
]
=
useState
(
moment
().
format
(
'
YYYY-MM-DD
'
))
const
[
timeList
,
setTimeList
]
=
useState
([])
const
[
timeList
,
setTimeList
]
=
useState
([])
const
[
error
,
setError
]
=
useState
(
""
)
const
[
error
,
setError
]
=
useState
(
""
)
useEffect
(()
=>
{
useEffect
(()
=>
{
getTimeTable
(
selectDate
)
getTimeTable
(
selectDate
,
ticketInfo
.
movieId
)
},
[
selectDate
])
},
[
selectDate
])
async
function
getTimeTable
()
{
useEffect
(()
=>
{
getTimeTable
(
selectDate
,
ticketInfo
.
movieId
)
},
[
ticketInfo
.
movieId
])
async
function
getTimeTable
(
selectDate
,
movieId
)
{
try
{
try
{
setError
(
""
)
setError
(
""
)
const
res
=
await
timetableApi
.
getAll
(
selectDate
)
const
res
=
await
timetableApi
.
getAll
(
selectDate
,
movieId
)
setTimeList
(
res
)
setTimeList
(
res
)
}
catch
(
error
)
{
}
catch
(
error
)
{
catchErrors
(
error
,
setError
)
catchErrors
(
error
,
setError
)
...
@@ -35,13 +39,38 @@ const TimeTable = () => {
...
@@ -35,13 +39,38 @@ const TimeTable = () => {
}
}
}
}
function
handleClick
(
time
)
{
const
date
=
new
Date
(
time
.
start_time
)
let
hours
=
date
.
getHours
()
let
mins
=
date
.
getMinutes
()
if
(
hours
<=
9
)
hours
=
'
0
'
+
hours
if
(
mins
<=
9
)
mins
=
'
0
'
+
mins
setTicketInfo
({
...
ticketInfo
,
timetableId
:
time
.
id
,
time
:
time
.
date
.
split
(
'
T
'
)[
0
]
+
"
"
+
hours
+
"
:
"
+
mins
,
selectedTheater
:
time
.
theater
.
theaterName
})
}
return
(
return
(
<
div
className
=
"
col-12 col-lg-6 ms-lg-1 mb-5
"
>
<>
<
HorizontalCalender
selectDate
=
{
selectDate
}
setSelectDate
=
{
setSelectDate
}
/
>
<
HorizontalCalender
selectDate
=
{
selectDate
}
setSelectDate
=
{
setSelectDate
}
/
>
{
timeList
.
length
!==
0
?
{
timeList
.
length
!==
0
?
timeList
.
map
(
el
=>
<
div
className
=
"
mt-4
"
>
timeList
.
map
(
el
=>
<
div
className
=
"
mt-4
"
>
<
h5
className
=
"
mb-0
"
>
{
el
.
theaterName
}
관
/
<
p
className
=
"
d-inline fs-6 mb-0
"
>
{
el
.
theatertype
.
theaterTypeName
}
<
/p></
h5
>
<
h5
className
=
"
mb-0
"
>
{
el
.
theaterName
}
관
/
<
p
className
=
"
d-inline fs-6 mb-0
"
>
{
el
.
theaterTypeName
}
<
/p></
h5
>
{
el
.
timetable
.
map
(
time
=>
<
div
className
=
"
d-inline-flex flex-column m-2
"
>
{
el
.
timetable
.
map
(
time
=>
{
console
.
log
(
"
timetable==
"
,
time
)
if
(
ticketInfo
)
return
<
div
className
=
"
d-inline-flex m-2
"
>
<
div
className
=
{
`card text-dark
${
styles
.
cursor
}
`
}
onClick
=
{()
=>
handleClick
(
time
)}
>
<
div
className
=
"
card-body py-1
"
>
{
moment
(
time
.
start_time
).
format
(
'
HH:mm
'
)}
~
{
moment
(
time
.
end_time
).
format
(
'
HH:mm
'
)}
<
/div
>
<
div
className
=
"
card-footer text-center py-1
"
>
{
time
.
theater
.
rows
*
time
.
theater
.
columns
-
time
.
reservations
}
/ {time.theater.rows * time.theater.columns}</
div
>
<
/div
>
<
/div
>
else
return
<
div
className
=
"
d-inline-flex flex-column m-2
"
>
<
div
className
=
"
d-flex justify-content-end
"
>
<
div
className
=
"
d-flex justify-content-end
"
>
<
button
type
=
"
button
"
className
=
{
`btn btn-dark btn-sm shadow-none
${
styles
.
customBtn
}
`
}
onClick
=
{()
=>
deleteTime
(
time
.
id
)}
>
X
<
/button
>
<
button
type
=
"
button
"
className
=
{
`btn btn-dark btn-sm shadow-none
${
styles
.
customBtn
}
`
}
onClick
=
{()
=>
deleteTime
(
time
.
id
)}
>
X
<
/button
>
<
/div
>
<
/div
>
...
@@ -49,10 +78,11 @@ const TimeTable = () => {
...
@@ -49,10 +78,11 @@ const TimeTable = () => {
<
div
className
=
"
card-body py-1
"
>
{
moment
(
time
.
start_time
).
format
(
'
HH:mm
'
)}
~
{
moment
(
time
.
end_time
).
format
(
'
HH:mm
'
)}
<
/div
>
<
div
className
=
"
card-body py-1
"
>
{
moment
(
time
.
start_time
).
format
(
'
HH:mm
'
)}
~
{
moment
(
time
.
end_time
).
format
(
'
HH:mm
'
)}
<
/div
>
<
div
className
=
"
card-footer text-center py-1
"
>
{
time
.
title
}
<
/div
>
<
div
className
=
"
card-footer text-center py-1
"
>
{
time
.
title
}
<
/div
>
<
/div
>
<
/div
>
<
/div>
)
}
<
/div
>
})}
<
/div>
)
<
/div>
)
:
<
p
className
=
"
text-center mt-5 mb-0
"
>
서버에
저장되어
있는
상영시간표가
존재하지
않습니다
.
<
br
/>
아래의
양식을
작성해
새로운
상영시간표를
등록해주세요
.
<
/p>
}
:
<
p
className
=
"
text-center mt-5 mb-0
"
>
서버에
저장되어
있는
상영시간표가
존재하지
않습니다
.
<
br
/>
아래의
양식을
작성해
새로운
상영시간표를
등록해주세요
.
<
/p>
}
<
/
div
>
<
/
>
)
)
}
}
...
...
client/src/components/Admin/TimeTableEdit.js
View file @
49fc2a67
...
@@ -7,7 +7,9 @@ const TimeTableEdit = () => {
...
@@ -7,7 +7,9 @@ const TimeTableEdit = () => {
<>
<>
<
h2
className
=
"
border-bottom border-2 text-center pb-2 me-2
"
>
현재
상영시간표
정보
<
/h2
>
<
h2
className
=
"
border-bottom border-2 text-center pb-2 me-2
"
>
현재
상영시간표
정보
<
/h2
>
<
div
className
=
"
d-flex flex-column flex-lg-row-reverse
"
>
<
div
className
=
"
d-flex flex-column flex-lg-row-reverse
"
>
<
div
className
=
"
col-12 col-lg-6 ms-lg-1 mb-5
"
>
<
TimeTable
/>
<
TimeTable
/>
<
/div
>
<
TimeTableEditForm
/>
<
TimeTableEditForm
/>
<
/div
>
<
/div
>
<
/
>
<
/
>
...
...
client/src/components/Admin/TimeTableEditForm.js
View file @
49fc2a67
...
@@ -75,13 +75,13 @@ const TimeTableEditForm = () => {
...
@@ -75,13 +75,13 @@ const TimeTableEditForm = () => {
const
{
list
}
=
showTimes
const
{
list
}
=
showTimes
const
isSelect
=
Object
.
values
(
selectInfo
).
every
((
el
)
=>
Boolean
(
el
))
const
isSelect
=
Object
.
values
(
selectInfo
).
every
((
el
)
=>
Boolean
(
el
))
if
(
isSelect
)
{
if
(
isSelect
)
{
const
isTime
=
list
.
find
(
el
=>
(
el
.
theater
Type
Id
===
selectInfo
.
theater
)
&&
((
getDate
(
el
.
start
)
<=
getDate
(
selectInfo
.
start
)
&&
getDate
(
selectInfo
.
start
)
<=
getDate
(
el
.
end
))
||
(
getDate
(
el
.
start
)
>
getDate
(
selectInfo
.
start
)
&&
getDate
(
el
.
start
)
<=
getDate
(
selectInfo
.
end
))))
const
isTime
=
list
.
find
(
el
=>
(
el
.
theaterId
===
selectInfo
.
theater
)
&&
((
getDate
(
el
.
start
)
<=
getDate
(
selectInfo
.
start
)
&&
getDate
(
selectInfo
.
start
)
<=
getDate
(
el
.
end
))
||
(
getDate
(
el
.
start
)
>
getDate
(
selectInfo
.
start
)
&&
getDate
(
el
.
start
)
<=
getDate
(
selectInfo
.
end
))))
if
(
isTime
)
alert
(
'
이미 추가한 상영시간대입니다. 다른 시간대를 골라주시기 바랍니다.
'
)
if
(
isTime
)
alert
(
'
이미 추가한 상영시간대입니다. 다른 시간대를 골라주시기 바랍니다.
'
)
else
{
else
{
const
theater
=
theaterList
.
find
(
theater
=>
theater
.
theatertypeI
d
===
selectInfo
.
theater
)
const
theater
=
theaterList
.
find
(
theater
=>
theater
.
i
d
===
selectInfo
.
theater
)
if
(
theater
)
{
if
(
theater
)
{
const
myTime
=
{
const
myTime
=
{
theater
Type
Id
:
selectInfo
.
theater
,
theaterId
:
selectInfo
.
theater
,
theaterName
:
theater
.
theaterName
+
'
관 /
'
+
theater
.
theatertype
.
theaterTypeName
,
theaterName
:
theater
.
theaterName
+
'
관 /
'
+
theater
.
theatertype
.
theaterTypeName
,
start
:
selectInfo
.
start
,
start
:
selectInfo
.
start
,
end
:
selectInfo
.
end
end
:
selectInfo
.
end
...
@@ -126,7 +126,7 @@ const TimeTableEditForm = () => {
...
@@ -126,7 +126,7 @@ const TimeTableEditForm = () => {
try
{
try
{
setError
(
""
)
setError
(
""
)
showTimes
.
list
.
map
(
time
=>
{
showTimes
.
list
.
map
(
time
=>
{
timeArr
.
push
({
theater
:
time
.
theater
Type
Id
,
start
:
time
.
start
,
end
:
time
.
end
})
timeArr
.
push
({
theater
:
time
.
theaterId
,
start
:
time
.
start
,
end
:
time
.
end
})
})
})
const
sendData
=
{
const
sendData
=
{
movieId
:
selectMovie
.
id
,
movieId
:
selectMovie
.
id
,
...
@@ -184,9 +184,9 @@ const TimeTableEditForm = () => {
...
@@ -184,9 +184,9 @@ const TimeTableEditForm = () => {
theaterList
.
map
((
theater
,
index
)
=>
{
theaterList
.
map
((
theater
,
index
)
=>
{
if
(
index
===
0
)
return
<>
if
(
index
===
0
)
return
<>
<
option
value
=
"
0
"
disabled
>
상영관을
선택해주십시오
.
<
/option
>
<
option
value
=
"
0
"
disabled
>
상영관을
선택해주십시오
.
<
/option
>
<
option
value
=
{
theater
.
theatertypeI
d
}
>
{
theater
.
theaterName
}
관
/
{
theater
.
theatertype
.
theaterTypeName
}
<
/option
>
<
option
value
=
{
theater
.
i
d
}
>
{
theater
.
theaterName
}
관
/
{
theater
.
theatertype
.
theaterTypeName
}
<
/option
>
<
/
>
<
/
>
else
return
<
option
value
=
{
theater
.
theatertypeI
d
}
>
{
theater
.
theaterName
}
관
/
{
theater
.
theatertype
.
theaterTypeName
}
<
/option
>
else
return
<
option
value
=
{
theater
.
i
d
}
>
{
theater
.
theaterName
}
관
/
{
theater
.
theatertype
.
theaterTypeName
}
<
/option
>
})
})
:
<
option
value
=
"
0
"
disabled
>
서버에
등록된
상영관이
없습니다
.
<
/option>
}
:
<
option
value
=
"
0
"
disabled
>
서버에
등록된
상영관이
없습니다
.
<
/option>
}
<
/select
>
<
/select
>
...
...
client/src/components/Calender/HorizontalCalender.js
View file @
49fc2a67
import
{
useState
,
useEffect
}
from
"
react
"
;
import
{
useState
,
useEffect
}
from
"
react
"
;
import
{
useHistory
}
from
"
react-router-dom
"
;
import
moment
from
"
moment
"
;
import
moment
from
"
moment
"
;
import
DatePicker
from
"
./DatePicker.js
"
;
import
DatePicker
from
"
./DatePicker.js
"
;
import
styles
from
"
./calender.module.scss
"
;
import
styles
from
"
./calender.module.scss
"
;
...
@@ -9,6 +10,7 @@ const Calender = ({ selectDate, setSelectDate }) => {
...
@@ -9,6 +10,7 @@ const Calender = ({ selectDate, setSelectDate }) => {
const
[
weekly
,
setWeekly
]
=
useState
([])
const
[
weekly
,
setWeekly
]
=
useState
([])
const
[
week
,
setWeek
]
=
useState
([
"
일
"
,
"
월
"
,
"
화
"
,
"
수
"
,
"
목
"
,
"
금
"
,
"
토
"
])
const
[
week
,
setWeek
]
=
useState
([
"
일
"
,
"
월
"
,
"
화
"
,
"
수
"
,
"
목
"
,
"
금
"
,
"
토
"
])
const
[
month
,
setMonth
]
=
useState
({
pre
:
moment
(
selectDate
).
subtract
(
1
,
'
months
'
).
format
(
'
YYYY-MM
'
),
cur
:
moment
(
selectDate
).
format
(
'
YYYY-MM
'
),
next
:
moment
(
selectDate
).
add
(
1
,
'
months
'
).
format
(
'
YYYY-MM
'
)
})
const
[
month
,
setMonth
]
=
useState
({
pre
:
moment
(
selectDate
).
subtract
(
1
,
'
months
'
).
format
(
'
YYYY-MM
'
),
cur
:
moment
(
selectDate
).
format
(
'
YYYY-MM
'
),
next
:
moment
(
selectDate
).
add
(
1
,
'
months
'
).
format
(
'
YYYY-MM
'
)
})
const
history
=
useHistory
()
useEffect
(()
=>
{
useEffect
(()
=>
{
setMonth
({
...
month
,
pre
:
moment
(
selectDate
).
subtract
(
1
,
'
months
'
).
format
(
'
YYYY-MM
'
),
cur
:
moment
(
selectDate
).
format
(
'
YYYY-MM
'
),
next
:
moment
(
selectDate
).
add
(
1
,
'
months
'
).
format
(
'
YYYY-MM
'
)
})
setMonth
({
...
month
,
pre
:
moment
(
selectDate
).
subtract
(
1
,
'
months
'
).
format
(
'
YYYY-MM
'
),
cur
:
moment
(
selectDate
).
format
(
'
YYYY-MM
'
),
next
:
moment
(
selectDate
).
add
(
1
,
'
months
'
).
format
(
'
YYYY-MM
'
)
})
...
@@ -20,10 +22,10 @@ const Calender = ({ selectDate, setSelectDate }) => {
...
@@ -20,10 +22,10 @@ const Calender = ({ selectDate, setSelectDate }) => {
let
dateArr
=
[]
let
dateArr
=
[]
dateArr
=
Array
(
7
).
fill
(
0
).
map
((
n
,
i
)
=>
{
dateArr
=
Array
(
7
).
fill
(
0
).
map
((
n
,
i
)
=>
{
let
current
=
moment
(
oneDay
).
add
((
n
+
i
),
'
days
'
)
let
current
=
moment
(
oneDay
).
add
((
n
+
i
),
'
days
'
)
return
<
div
className
=
"
col-auto align-self-end text-center
"
onClick
=
{()
=>
setSelectDate
(
current
)}
>
return
<
div
className
=
"
col-auto align-self-end text-center
"
onClick
=
{()
=>
setSelectDate
(
current
.
format
(
'
YYYY-MM-DD
'
)
)}
>
{
current
.
isSame
(
oneDay
)
||
current
.
format
(
"
DD
"
)
===
"
01
"
?
<
strong
className
=
{
styles
.
yearmonth
}
>
{
current
.
format
(
'
YYYY.MM
'
)}
<
/strong> : ""
}
{
current
.
isSame
(
oneDay
)
||
current
.
format
(
"
DD
"
)
===
"
01
"
?
<
strong
className
=
{
styles
.
yearmonth
}
>
{
current
.
format
(
'
YYYY.MM
'
)}
<
/strong> : ""
}
<
div
className
=
{
`d-flex flex-column
${
styles
.
cursor
}
`
+
((
current
.
format
(
"
d
"
)
===
"
0
"
||
current
.
format
(
"
d
"
)
===
"
6
"
)
?
((
current
.
format
(
"
d
"
)
===
"
0
"
)
?
"
text-danger
"
:
"
text-primary
"
)
:
""
)}
>
<
div
className
=
{
`d-flex flex-column
${
styles
.
cursor
}
`
+
((
current
.
format
(
"
d
"
)
===
"
0
"
||
current
.
format
(
"
d
"
)
===
"
6
"
)
?
((
current
.
format
(
"
d
"
)
===
"
0
"
)
?
"
text-danger
"
:
"
text-primary
"
)
:
""
)}
>
<
strong
className
=
{
current
.
isSame
(
oneDay
)
?
styles
.
selectDate
:
""
}
>
{
current
.
format
(
'
DD
'
)}
<
/strong
>
<
strong
className
=
{
current
.
isSame
(
oneDay
)
?
(
/admin/g
.
test
(
history
.
location
.
pathname
)
?
styles
.
selectDate
:
styles
.
selectatHome
)
:
""
}
>
{
current
.
format
(
'
DD
'
)}
<
/strong
>
<
strong
>
{
current
.
isSame
(
oneDay
)
?
"
오늘
"
:
week
[
Number
(
current
.
format
(
"
d
"
))]}
<
/strong
>
<
strong
>
{
current
.
isSame
(
oneDay
)
?
"
오늘
"
:
week
[
Number
(
current
.
format
(
"
d
"
))]}
<
/strong
>
<
/div
>
<
/div
>
<
/div
>
<
/div
>
...
@@ -43,7 +45,7 @@ const Calender = ({ selectDate, setSelectDate }) => {
...
@@ -43,7 +45,7 @@ const Calender = ({ selectDate, setSelectDate }) => {
const
resultArr
=
dateArr
.
map
(
el
=>
<
div
className
=
"
col-2 align-self-end text-center
"
onClick
=
{()
=>
setSelectDate
(
el
.
date
)}
>
const
resultArr
=
dateArr
.
map
(
el
=>
<
div
className
=
"
col-2 align-self-end text-center
"
onClick
=
{()
=>
setSelectDate
(
el
.
date
)}
>
{
moment
(
el
.
date
).
isSame
(
oneDay
)
||
el
.
date
.
split
(
'
-
'
)[
2
]
===
"
01
"
?
<
strong
className
=
{
styles
.
yearmonth
}
>
{
moment
(
el
.
date
).
format
(
'
YYYY.MM
'
)}
<
/strong> : ""
}
{
moment
(
el
.
date
).
isSame
(
oneDay
)
||
el
.
date
.
split
(
'
-
'
)[
2
]
===
"
01
"
?
<
strong
className
=
{
styles
.
yearmonth
}
>
{
moment
(
el
.
date
).
format
(
'
YYYY.MM
'
)}
<
/strong> : ""
}
<
div
className
=
{
`d-flex flex-column
${
styles
.
cursor
}
`
+
((
Number
(
el
.
day
)
===
0
||
Number
(
el
.
day
)
===
6
)
?
((
Number
(
el
.
day
)
===
0
)
?
"
text-danger
"
:
"
text-primary
"
)
:
""
)}
>
<
div
className
=
{
`d-flex flex-column
${
styles
.
cursor
}
`
+
((
Number
(
el
.
day
)
===
0
||
Number
(
el
.
day
)
===
6
)
?
((
Number
(
el
.
day
)
===
0
)
?
"
text-danger
"
:
"
text-primary
"
)
:
""
)}
>
<
strong
className
=
{
moment
(
el
.
date
).
isSame
(
oneDay
)
?
styles
.
selectDate
:
""
}
>
{
moment
(
el
.
date
).
format
(
'
DD
'
)}
<
/strong
>
<
strong
className
=
{
moment
(
el
.
date
).
isSame
(
oneDay
)
?
(
/admin/g
.
test
(
history
.
location
.
pathname
)
?
styles
.
selectDate
:
styles
.
selectatHome
)
:
""
}
>
{
moment
(
el
.
date
).
format
(
'
DD
'
)}
<
/strong
>
<
strong
>
{
moment
(
el
.
date
).
isSame
(
oneDay
)
?
"
오늘
"
:
week
[
el
.
day
]}
<
/strong
>
<
strong
>
{
moment
(
el
.
date
).
isSame
(
oneDay
)
?
"
오늘
"
:
week
[
el
.
day
]}
<
/strong
>
<
/div
>
<
/div
>
<
/div>
)
<
/div>
)
...
...
client/src/components/Calender/calender.module.scss
View file @
49fc2a67
...
@@ -36,3 +36,9 @@
...
@@ -36,3 +36,9 @@
color
:
#fff
;
color
:
#fff
;
border-radius
:
50%
;
border-radius
:
50%
;
}
}
.selectatHome
{
background-color
:
#fff
;
color
:
#000
;
border-radius
:
50%
;
}
\ No newline at end of file
client/src/components/Collection.js
View file @
49fc2a67
...
@@ -23,7 +23,7 @@ const Collection = ({ TMDB_TopRated_Data }) => {
...
@@ -23,7 +23,7 @@ const Collection = ({ TMDB_TopRated_Data }) => {
return
(
return
(
<>
<>
<
h2
className
=
"
fw-bold text-white text-center my-5
"
>
Movie
Collection
<
/h2
>
<
h2
className
=
"
fw-bold text-white text-center my-5
"
>
Movie
Collection
<
/h2
>
<
div
className
=
"
row
justify-content-sm-center
"
style
=
{{
marginBottom
:
"
8rem
"
}}
>
<
div
className
=
"
d-flex
justify-content-sm-center
"
style
=
{{
marginBottom
:
"
8rem
"
}}
>
<
div
className
=
"
col-md-8
"
>
<
div
className
=
"
col-md-8
"
>
{
videoUrls
.
length
>
0
{
videoUrls
.
length
>
0
?
?
...
...
client/src/components/SearchResult.js
View file @
49fc2a67
...
@@ -2,6 +2,7 @@ import { useState, useEffect } from 'react'
...
@@ -2,6 +2,7 @@ import { useState, useEffect } from 'react'
import
{
useLocation
}
from
'
react-router-dom
'
import
{
useLocation
}
from
'
react-router-dom
'
import
queryString
from
'
query-string
'
import
queryString
from
'
query-string
'
import
MovieCard
from
"
./MovieCard/index.js
"
import
MovieCard
from
"
./MovieCard/index.js
"
import
Pagination
from
"
./Pagination.js
"
;
import
movieApi
from
'
../apis/movie.api.js
'
import
movieApi
from
'
../apis/movie.api.js
'
import
catchErrors
from
'
../utils/catchErrors.js
'
import
catchErrors
from
'
../utils/catchErrors.js
'
...
@@ -18,8 +19,8 @@ const SearchResult = () => {
...
@@ -18,8 +19,8 @@ const SearchResult = () => {
async
function
findforKeyword
()
{
async
function
findforKeyword
()
{
try
{
try
{
setError
(
""
)
setError
(
""
)
const
{
count
,
results
}
=
await
movieApi
.
search
({
type
:
"
home
"
,
keyword
:
title
})
const
res
=
await
movieApi
.
search
({
type
:
"
home
"
,
keyword
:
title
})
setResult
(
[...
results
]
)
setResult
(
res
)
}
catch
(
error
)
{
}
catch
(
error
)
{
catchErrors
(
error
,
setError
)
catchErrors
(
error
,
setError
)
}
}
...
...
client/src/components/TicketingTimeTable/TicketingTimeTable.js
View file @
49fc2a67
const
TicketingTimeTable
=
({
ticketInfo
})
=>
{
import
TimeTable
from
"
../Admin/TimeTable
"
;
const
TicketingTimeTable
=
({
ticketInfo
,
setTicketInfo
})
=>
{
return
(
return
(
<
div
className
=
"
text-center
"
style
=
{{
color
:
"
white
"
}}
>
<
div
style
=
{{
color
:
"
white
"
}}
>
{
ticketInfo
.
movieId
&&
ticketInfo
.
cinema
{
ticketInfo
.
movieId
&&
ticketInfo
.
cinema
?
<
div
>
{
ticketInfo
.
movieId
}
{
ticketInfo
.
cinema
}
<
/div
>
?
<
TimeTable
ticketInfo
=
{
ticketInfo
}
setTicketInfo
=
{
setTicketInfo
}
/
>
:
<
div
>
영화와
극장을
모두
선택해주세요
.
<
/div>
}
:
<
div
className
=
"
text-center
"
>
영화와
극장을
모두
선택해주세요
.
<
/div>
}
<
/div
>
<
/div
>
)
)
}
}
...
...
client/src/components/Video.js
View file @
49fc2a67
...
@@ -25,7 +25,7 @@ const Video = ({ movieId }) => {
...
@@ -25,7 +25,7 @@ const Video = ({ movieId }) => {
?
videoUrls
.
map
(
el
=>
(
?
videoUrls
.
map
(
el
=>
(
<
div
className
=
"
mt-5 pb-5
"
>
<
div
className
=
"
mt-5 pb-5
"
>
<
p
>
{
el
.
name
}
<
/p
>
<
p
>
{
el
.
name
}
<
/p
>
<
div
class
=
"
ratio ratio-16x9
"
>
<
div
class
Name
=
"
ratio ratio-16x9
"
>
<
iframe
src
=
{
`https://www.youtube.com/embed/
${
el
.
key
}
`
}
title
=
"
YouTube video
"
allowFullScreen
><
/iframe
>
<
iframe
src
=
{
`https://www.youtube.com/embed/
${
el
.
key
}
`
}
title
=
"
YouTube video
"
allowFullScreen
><
/iframe
>
<
/div
>
<
/div
>
<
/div
>
<
/div
>
...
...
client/src/pages/TicketingPage.js
View file @
49fc2a67
...
@@ -13,8 +13,8 @@ const TicketingPage = ({ location }) => {
...
@@ -13,8 +13,8 @@ const TicketingPage = ({ location }) => {
movieId
:
0
,
movieId
:
0
,
...
location
.
state
,
...
location
.
state
,
cinema
:
""
,
cinema
:
""
,
selectedTheater
:
1
,
selectedTheater
:
""
,
time
:
"
2021/07/21 10:00
"
time
:
""
})
})
const
[
cinemaInfo
,
setCinemaInfo
]
=
useState
({})
const
[
cinemaInfo
,
setCinemaInfo
]
=
useState
({})
const
[
movieInfo
,
setMovieInfo
]
=
useState
()
const
[
movieInfo
,
setMovieInfo
]
=
useState
()
...
@@ -69,7 +69,7 @@ const TicketingPage = ({ location }) => {
...
@@ -69,7 +69,7 @@ const TicketingPage = ({ location }) => {
<
/div
>
<
/div
>
<
div
className
=
"
col-sm-5 mb-4
"
>
<
div
className
=
"
col-sm-5 mb-4
"
>
<
h3
className
=
"
py-2 text-white text-center
"
style
=
{{
border
:
"
3px solid #000000
"
,
borderBottom
:
"
3px solid #FEDC00
"
}}
>
시간표
<
/h3
>
<
h3
className
=
"
py-2 text-white text-center
"
style
=
{{
border
:
"
3px solid #000000
"
,
borderBottom
:
"
3px solid #FEDC00
"
}}
>
시간표
<
/h3
>
<
TicketingTimeTable
ticketInfo
=
{
ticketInfo
}
cinemaInfo
=
{
cinema
Info
}
/
>
<
TicketingTimeTable
ticketInfo
=
{
ticketInfo
}
setTicketInfo
=
{
setTicket
Info
}
/
>
<
/div
>
<
/div
>
<
/div
>
<
/div
>
<
div
className
=
"
row p-3
"
style
=
{{
backgroundColor
:
"
#252525
"
}}
>
<
div
className
=
"
row p-3
"
style
=
{{
backgroundColor
:
"
#252525
"
}}
>
...
@@ -85,7 +85,7 @@ const TicketingPage = ({ location }) => {
...
@@ -85,7 +85,7 @@ const TicketingPage = ({ location }) => {
<
li
>
영화
:
{
movieInfo
.
title
}
<
/li
>
<
li
>
영화
:
{
movieInfo
.
title
}
<
/li
>
<
li
>
극장
:
{
ticketInfo
.
cinema
}
<
/li
>
<
li
>
극장
:
{
ticketInfo
.
cinema
}
<
/li
>
<
li
>
일시
:
{
ticketInfo
.
time
}
<
/li
>
<
li
>
일시
:
{
ticketInfo
.
time
}
<
/li
>
<
li
>
상영관
:
{
ticketInfo
.
selectedTheater
}
<
/li
>
<
li
>
상영관
:
{
(
ticketInfo
.
selectedTheater
!==
""
)
?
ticketInfo
.
selectedTheater
+
"
관
"
:
""
}
<
/li
>
<
/ul
>
<
/ul
>
:
<
div
><
/div>
}
:
<
div
><
/div>
}
<
/div
>
<
/div
>
...
...
server/controllers/movie.controller.js
View file @
49fc2a67
...
@@ -97,8 +97,6 @@ const getMovieById = async (req, res) => {
...
@@ -97,8 +97,6 @@ const getMovieById = async (req, res) => {
}
}
const
getMovieList
=
async
(
req
,
res
)
=>
{
const
getMovieList
=
async
(
req
,
res
)
=>
{
const
{
category
}
=
req
.
params
// console.log(category)
try
{
try
{
const
{
category
}
=
req
.
params
const
{
category
}
=
req
.
params
const
movieList
=
await
Movie
.
findAll
()
const
movieList
=
await
Movie
.
findAll
()
...
@@ -178,15 +176,15 @@ const findonlyTitle = async (req, res) => {
...
@@ -178,15 +176,15 @@ const findonlyTitle = async (req, res) => {
try
{
try
{
const
{
keyword
}
=
req
.
query
const
{
keyword
}
=
req
.
query
const
movieIds
=
[]
const
movieIds
=
[]
const
{
count
,
rows
}
=
await
Movie
.
findA
ndCountA
ll
({
const
findAll
=
await
Movie
.
findAll
({
where
:
{
where
:
{
title
:
{
title
:
{
[
Op
.
substring
]:
keyword
[
Op
.
substring
]:
keyword
}
}
}
}
});
});
if
(
rows
)
{
if
(
findAll
)
{
rows
.
forEach
(
movie
=>
movieIds
.
push
(
movie
.
movieId
))
findAll
.
forEach
(
movie
=>
movieIds
.
push
(
movie
.
movieId
))
const
elements
=
await
Promise
.
all
(
const
elements
=
await
Promise
.
all
(
movieIds
.
map
(
async
(
movieId
)
=>
{
movieIds
.
map
(
async
(
movieId
)
=>
{
const
movie
=
await
axios
.
get
(
`https://api.themoviedb.org/3/movie/
${
movieId
}
?api_key=
${
process
.
env
.
TMDB_APP_KEY
}
&language=ko-KR`
)
const
movie
=
await
axios
.
get
(
`https://api.themoviedb.org/3/movie/
${
movieId
}
?api_key=
${
process
.
env
.
TMDB_APP_KEY
}
&language=ko-KR`
)
...
@@ -200,8 +198,8 @@ const findonlyTitle = async (req, res) => {
...
@@ -200,8 +198,8 @@ const findonlyTitle = async (req, res) => {
return
{
...
movie
.
data
,
ticket_sales
:
cols
.
ticket_sales
,
vote_average
:
cols
.
vote_average
,
totalReservationRate
:
totalReservationRate
[
0
]
}
return
{
...
movie
.
data
,
ticket_sales
:
cols
.
ticket_sales
,
vote_average
:
cols
.
vote_average
,
totalReservationRate
:
totalReservationRate
[
0
]
}
})
})
)
)
return
res
.
json
(
{
count
:
movieIds
.
length
,
results
:
elements
}
)
return
res
.
json
(
elements
)
}
else
return
res
.
json
(
{
count
:
count
,
results
:
rows
}
)
}
else
return
res
.
json
(
findAll
)
}
catch
(
error
)
{
}
catch
(
error
)
{
return
res
.
status
(
500
).
send
(
error
.
message
||
"
영화 검색 중 에러 발생
"
);
return
res
.
status
(
500
).
send
(
error
.
message
||
"
영화 검색 중 에러 발생
"
);
}
}
...
...
server/controllers/timetable.controller.js
View file @
49fc2a67
import
{
TimeTable
,
Theater
,
TheaterType
}
from
"
../db/index.js
"
;
import
{
TimeTable
,
Theater
,
TheaterType
,
Reservation
}
from
"
../db/index.js
"
;
import
moment
from
'
moment
'
;
import
sequelize
from
'
sequelize
'
import
sequelize
from
'
sequelize
'
const
{
Op
}
=
sequelize
const
{
Op
}
=
sequelize
const
getAll
=
async
(
req
,
res
)
=>
{
const
getAll
=
async
(
req
,
res
)
=>
{
try
{
try
{
const
{
when
}
=
req
.
query
const
{
when
,
movieId
}
=
req
.
query
const
selectDate
=
new
Date
(
when
)
const
selectDate
=
new
Date
(
when
)
let
findAll
=
null
const
theaterArr
=
[]
const
theaterArr
=
[]
const
findAll
=
await
TimeTable
.
findAll
({
where
:
{
date
:
selectDate
},
attributes
:
{
exclude
:
[
'
createdAt
'
,
'
updatedAt
'
]
},
order
:
[[
"
theater
"
,
"
ASC
"
],
[
"
start_time
"
,
"
ASC
"
]]
})
findAll
=
movieId
?
await
TimeTable
.
findAll
({
where
:
{
date
:
selectDate
,
movieId
:
movieId
},
attributes
:
{
exclude
:
[
'
createdAt
'
,
'
updatedAt
'
]
},
order
:
[[
"
theaterId
"
,
"
ASC
"
],
[
"
start_time
"
,
"
ASC
"
]],
include
:
[
Theater
]
})
findAll
.
forEach
(
element
=>
{
:
await
TimeTable
.
findAll
({
where
:
{
date
:
selectDate
},
attributes
:
{
exclude
:
[
'
createdAt
'
,
'
updatedAt
'
]
},
order
:
[[
"
theaterId
"
,
"
ASC
"
],
[
"
start_time
"
,
"
ASC
"
]],
include
:
[
Theater
]
})
if
(
!
theaterArr
.
includes
(
element
.
theater
))
theaterArr
.
push
(
element
.
theater
)
findAll
.
forEach
(
async
(
element
)
=>
{
if
(
!
theaterArr
.
includes
(
element
.
theaterId
))
theaterArr
.
push
(
element
.
theaterId
)
if
(
movieId
)
{
const
{
count
}
=
await
Reservation
.
findAndCountAll
({
where
:
{
movieId
:
movieId
,
timetableId
:
element
.
id
}
})
element
.
dataValues
.
reservations
=
count
}
})
})
const
findTheater
=
await
Theater
.
findAll
({
where
:
{
id
:
theaterArr
},
attributes
:
{
exclude
:
[
'
createdAt
'
,
'
updatedAt
'
]
},
include
:
[
TheaterType
],
order
:
[[
'
theaterName
'
]]
})
const
findTheater
=
await
Theater
.
findAll
({
where
:
{
id
:
theaterArr
},
attributes
:
{
exclude
:
[
'
createdAt
'
,
'
updatedAt
'
]
},
include
:
[
TheaterType
],
order
:
[[
'
theaterName
'
]]
})
findTheater
.
forEach
(
el
=>
{
findTheater
.
forEach
(
el
=>
{
el
.
dataValues
.
theaterTypeName
=
el
.
dataValues
.
theatertype
.
dataValues
.
theaterTypeName
const
arr
=
findAll
.
filter
(
timetable
=>
{
const
arr
=
findAll
.
filter
(
timetable
=>
{
if
(
el
.
id
===
timetable
.
theater
)
return
timetable
.
dataValues
if
(
el
.
id
===
timetable
.
theater
Id
)
return
timetable
.
dataValues
})
})
el
.
dataValues
.
timetable
=
arr
el
.
dataValues
.
timetable
=
arr
})
})
...
@@ -35,7 +41,7 @@ const submit = async (req, res) => {
...
@@ -35,7 +41,7 @@ const submit = async (req, res) => {
const
isTimeTable
=
await
TimeTable
.
findAll
({
const
isTimeTable
=
await
TimeTable
.
findAll
({
where
:
{
where
:
{
[
Op
.
and
]:
[
[
Op
.
and
]:
[
{
theater
:
theater
.
theater
},
{
theater
Id
:
theater
.
theater
},
{
{
[
Op
.
or
]:
[
[
Op
.
or
]:
[
{
[
Op
.
and
]:
[{
start_time
:
{
[
Op
.
gt
]:
startTime
}
},
{
end_time
:
{
[
Op
.
lte
]:
endTime
}
}]
},
{
[
Op
.
and
]:
[{
start_time
:
{
[
Op
.
gt
]:
startTime
}
},
{
end_time
:
{
[
Op
.
lte
]:
endTime
}
}]
},
...
@@ -62,7 +68,7 @@ const submit = async (req, res) => {
...
@@ -62,7 +68,7 @@ const submit = async (req, res) => {
if
(
'
06:00
'
<=
theater
.
start
&&
theater
.
start
<
'
10:00
'
)
partTime
=
"
morning
"
if
(
'
06:00
'
<=
theater
.
start
&&
theater
.
start
<
'
10:00
'
)
partTime
=
"
morning
"
else
if
(
'
00:00
'
<=
theater
.
start
<
'
06:00
'
)
partTime
=
"
night
"
else
if
(
'
00:00
'
<=
theater
.
start
<
'
06:00
'
)
partTime
=
"
night
"
else
partTime
=
"
day
"
else
partTime
=
"
day
"
await
TimeTable
.
create
({
theater
:
theater
.
theater
,
movieId
,
title
,
release_date
,
date
:
curDate
,
start_time
:
getTime
(
theater
.
start
),
end_time
:
getTime
(
theater
.
start
,
runtime
),
partTime
:
partTime
,
week
:
(
day
===
0
||
day
===
6
)
?
"
weekend
"
:
"
weekdays
"
})
await
TimeTable
.
create
({
theater
Id
:
theater
.
theater
,
movieId
,
title
,
release_date
,
date
:
curDate
,
start_time
:
getTime
(
theater
.
start
),
end_time
:
getTime
(
theater
.
start
,
runtime
),
partTime
:
partTime
,
week
:
(
day
===
0
||
day
===
6
)
?
"
weekend
"
:
"
weekdays
"
})
})
})
)
)
curDate
.
setDate
(
curDate
.
getDate
()
+
1
)
curDate
.
setDate
(
curDate
.
getDate
()
+
1
)
...
...
server/db/index.js
View file @
49fc2a67
...
@@ -50,6 +50,8 @@ Theater.belongsTo(TheaterType, { onDelete: 'CASCADE' });
...
@@ -50,6 +50,8 @@ Theater.belongsTo(TheaterType, { onDelete: 'CASCADE' });
TicketFee
.
belongsTo
(
TheaterType
,
{
onDelete
:
'
CASCADE
'
});
TicketFee
.
belongsTo
(
TheaterType
,
{
onDelete
:
'
CASCADE
'
});
TimeTable
.
belongsTo
(
Theater
);
Reservation
.
belongsTo
(
Theater
);
Reservation
.
belongsTo
(
Theater
);
Reservation
.
belongsTo
(
TimeTable
);
Reservation
.
belongsTo
(
TimeTable
);
...
...
server/index.js
View file @
49fc2a67
...
@@ -18,20 +18,21 @@ sequelize
...
@@ -18,20 +18,21 @@ sequelize
})
})
);
);
const
adminRole
=
await
Role
.
findOne
({
where
:
{
name
:
"
admin
"
}
});
const
adminRole
=
await
Role
.
findOne
({
where
:
{
name
:
"
admin
"
}
})
if
(
!
adminRole
)
{
await
User
.
findOrCreate
({
await
User
.
create
({
where
:
{
userId
:
"
admin
"
},
defaults
:
{
userId
:
"
admin
"
,
userId
:
"
admin
"
,
name
:
"
관리자
"
,
name
:
"
관리자
"
,
email
:
"
han35799@naver.com
"
,
email
:
"
han35799@naver.com
"
,
nickname
:
"
haha
"
,
nickname
:
"
admin
"
,
birth
:
"
990926
"
,
birth
:
"
000000
"
,
phoneNumber
:
"
010
8607458
0
"
,
phoneNumber
:
"
010
0000000
0
"
,
password
:
"
admin!
"
,
password
:
"
admin!
"
,
img
:
"
970aaa79673a39331d45d4b55ca05d25
"
,
img
:
"
970aaa79673a39331d45d4b55ca05d25
"
,
roleId
:
adminRole
?.
id
,
roleId
:
adminRole
?.
id
,
}
});
});
}
else
{
}
app
.
listen
(
appConfig
.
port
,
()
=>
{
app
.
listen
(
appConfig
.
port
,
()
=>
{
console
.
log
(
`Server is running on port
${
appConfig
.
port
}
`
);
console
.
log
(
`Server is running on port
${
appConfig
.
port
}
`
);
...
...
server/models/timetable.model.js
View file @
49fc2a67
...
@@ -11,9 +11,6 @@ const TimeTableModel = (sequelize) => {
...
@@ -11,9 +11,6 @@ const TimeTableModel = (sequelize) => {
primaryKey
:
true
,
primaryKey
:
true
,
autoIncrement
:
true
,
autoIncrement
:
true
,
},
},
theater
:
{
type
:
DataTypes
.
INTEGER
,
},
movieId
:
{
movieId
:
{
type
:
DataTypes
.
INTEGER
,
type
:
DataTypes
.
INTEGER
,
},
},
...
...
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