Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
students
butter-studio
Commits
91911f85
You need to sign in or sign up before continuing.
Commit
91911f85
authored
Jul 28, 2021
by
Jiwon Yoon
Browse files
Merge branch 'master' into jiwon
parents
b2844cef
067778dd
Changes
17
Hide whitespace changes
Inline
Side-by-side
client/src/App.js
View file @
91911f85
...
@@ -21,7 +21,7 @@ function App() {
...
@@ -21,7 +21,7 @@ function App() {
return
(
return
(
<
div
className
=
""
style
=
{{
backgroundColor
:
"
black
"
}}
>
<
div
className
=
""
style
=
{{
backgroundColor
:
"
black
"
}}
>
<
AuthProvider
>
<
AuthProvider
>
<
Router
style
=
{{
backgroundColor
:
"
black
"
}}
>
<
Router
>
<
SubNav
/>
<
SubNav
/>
<
Header
/>
<
Header
/>
<
MainNav
/>
<
MainNav
/>
...
...
client/src/apis/cinema.api.js
View file @
91911f85
import
axios
from
"
axios
"
;
import
axios
from
"
axios
"
;
import
{
baseUrl
}
from
"
../utils/baseUrl.js
"
;
import
{
baseUrl
}
from
"
../utils/baseUrl.js
"
;
const
getInfo
=
async
()
=>
{
const
get
Cinema
Info
=
async
()
=>
{
const
{
data
}
=
await
axios
.
get
(
`
${
baseUrl
}
/api/cinema`
)
const
{
data
}
=
await
axios
.
get
(
`
${
baseUrl
}
/api/
info/
cinema`
)
return
data
return
data
}
}
const
edit
=
async
(
cinemaInfo
)
=>
{
const
editCinema
=
async
(
cinemaInfo
)
=>
{
const
{
data
}
=
await
axios
.
put
(
`
${
baseUrl
}
/api/cinema`
,
cinemaInfo
)
const
{
data
}
=
await
axios
.
put
(
`
${
baseUrl
}
/api/info/cinema`
,
cinemaInfo
)
return
data
}
const
getTicketFee
=
async
()
=>
{
const
{
data
}
=
await
axios
.
get
(
`
${
baseUrl
}
/api/info/ticketfee`
)
return
data
}
const
getTicketFeeOne
=
async
(
theaterType
)
=>
{
const
{
data
}
=
await
axios
.
get
(
`
${
baseUrl
}
/api/info/ticketfee/
${
theaterType
}
`
)
return
data
}
const
editTicketFee
=
async
(
ticketFeeInfo
)
=>
{
const
{
data
}
=
await
axios
.
put
(
`
${
baseUrl
}
/api/info/ticketfee`
,
ticketFeeInfo
)
return
data
}
const
removeTicketFee
=
async
(
theaterType
)
=>
{
const
{
data
}
=
await
axios
.
delete
(
`
${
baseUrl
}
/api/info/ticketfee?theaterType=
${
theaterType
}
`
)
return
data
return
data
}
}
const
cinemaApi
=
{
const
cinemaApi
=
{
getInfo
,
getCinemaInfo
,
edit
editCinema
,
getTicketFee
,
getTicketFeeOne
,
editTicketFee
,
removeTicketFee
}
}
export
default
cinemaApi
export
default
cinemaApi
\ No newline at end of file
client/src/components/Admin/CinemaEdit.js
View file @
91911f85
import
{
useState
,
useEffect
}
from
"
react
"
;
import
{
useState
,
useEffect
,
useRef
}
from
"
react
"
;
import
TicketEditForm
from
"
./TicketEditForm.js
"
;
import
TicketFeeTable
from
"
./TicketFeeTable.js
"
;
import
cinemaApi
from
"
../../apis/cinema.api.js
"
;
import
cinemaApi
from
"
../../apis/cinema.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
INIT_CINEMAINFO
=
{
const
INIT_CINEMAINFO
=
{
cinemaName
:
""
,
cinemaName
:
""
,
transportation
:
""
,
transportation
:
""
,
parking
:
""
,
parking
:
""
,
address
:
""
address
:
""
,
moreFeeInfo
:
""
}
}
const
CinemaEdit
=
()
=>
{
const
CinemaEdit
=
()
=>
{
const
[
cinemaInfo
,
setCinemaInfo
]
=
useState
(
INIT_CINEMAINFO
)
const
[
cinemaInfo
,
setCinemaInfo
]
=
useState
(
INIT_CINEMAINFO
)
const
[
ticketFee
,
setTicketFee
]
=
useState
({})
const
[
error
,
setError
]
=
useState
(
""
)
const
[
error
,
setError
]
=
useState
(
""
)
const
formRef
=
useRef
(
null
)
useEffect
(()
=>
{
useEffect
(()
=>
{
getInfo
()
getInfo
()
...
@@ -26,7 +31,7 @@ const CinemaEdit = () => {
...
@@ -26,7 +31,7 @@ const CinemaEdit = () => {
async
function
getInfo
()
{
async
function
getInfo
()
{
try
{
try
{
setError
(
""
)
setError
(
""
)
const
info
=
await
cinemaApi
.
getInfo
()
const
info
=
await
cinemaApi
.
get
Cinema
Info
()
if
(
info
)
setCinemaInfo
(
info
)
if
(
info
)
setCinemaInfo
(
info
)
else
setCinemaInfo
(
INIT_CINEMAINFO
)
else
setCinemaInfo
(
INIT_CINEMAINFO
)
}
catch
(
error
)
{
}
catch
(
error
)
{
...
@@ -37,7 +42,7 @@ const CinemaEdit = () => {
...
@@ -37,7 +42,7 @@ const CinemaEdit = () => {
async
function
handleSubmit
()
{
async
function
handleSubmit
()
{
try
{
try
{
setError
(
""
)
setError
(
""
)
await
cinemaApi
.
edit
(
cinemaInfo
)
await
cinemaApi
.
edit
Cinema
(
cinemaInfo
)
window
.
location
.
reload
()
window
.
location
.
reload
()
}
catch
(
error
)
{
}
catch
(
error
)
{
catchErrors
(
error
,
setError
)
catchErrors
(
error
,
setError
)
...
@@ -65,6 +70,14 @@ const CinemaEdit = () => {
...
@@ -65,6 +70,14 @@ const CinemaEdit = () => {
<
span
className
=
"
input-group-text
"
id
=
"
address
"
><
i
className
=
"
bi bi-geo-alt-fill
"
><
/i></
span
>
<
span
className
=
"
input-group-text
"
id
=
"
address
"
><
i
className
=
"
bi bi-geo-alt-fill
"
><
/i></
span
>
<
input
type
=
"
text
"
className
=
{
`form-control
${
styles
.
shadowNone
}
`
}
id
=
"
address
"
name
=
"
address
"
value
=
{
cinemaInfo
.
address
}
onChange
=
{
handleChange
}
value
=
{
cinemaInfo
.
address
}
/
>
<
input
type
=
"
text
"
className
=
{
`form-control
${
styles
.
shadowNone
}
`
}
id
=
"
address
"
name
=
"
address
"
value
=
{
cinemaInfo
.
address
}
onChange
=
{
handleChange
}
value
=
{
cinemaInfo
.
address
}
/
>
<
/div
>
<
/div
>
<
p
className
=
"
mb-0
"
>
영화관람료
설정
<
/p
>
<
p
className
=
"
text-danger
"
>*
추가금액
정보를
입력바랍니다
.
필요에
따라
기본가격
또한
변경
가능합니다
.
<
/p
>
<
TicketEditForm
editFee
=
{
ticketFee
}
formRef
=
{
formRef
}
/
>
<
TicketFeeTable
setEditFee
=
{
setTicketFee
}
formRef
=
{
formRef
}
/
>
<
div
className
=
"
mb-3
"
>
<
label
for
=
"
moreFeeInfo
"
className
=
"
form-label
"
>
관람료
추가정보
<
/label
>
<
textarea
className
=
{
`form-control
${
styles
.
shadowNone
}
${
styles
.
textarea
}
`
}
rows
=
"
7
"
id
=
"
moreFeeInfo
"
name
=
"
moreFeeInfo
"
value
=
{
cinemaInfo
.
moreFeeInfo
}
onChange
=
{
handleChange
}
><
/textarea
>
<
/div
>
<
div
className
=
"
d-grid gap-2 mb-5
"
>
<
div
className
=
"
d-grid gap-2 mb-5
"
>
<
button
type
=
"
submit
"
className
=
{
`btn btn-dark shadow-none
${
styles
.
customBtn
}
`
}
onClick
=
{
handleSubmit
}
>
수정
<
/button
>
<
button
type
=
"
submit
"
className
=
{
`btn btn-dark shadow-none
${
styles
.
customBtn
}
`
}
onClick
=
{
handleSubmit
}
>
수정
<
/button
>
<
/div
>
<
/div
>
...
...
client/src/components/Admin/TicketEditForm.js
0 → 100644
View file @
91911f85
import
{
useState
,
useEffect
}
from
"
react
"
;
import
cinemaApi
from
"
../../apis/cinema.api.js
"
;
import
catchErrors
from
"
../../utils/catchErrors.js
"
;
import
styles
from
"
./admin.module.scss
"
;
const
INIT_TICKETFEE
=
{
theaterType
:
""
,
weekdays
:
""
,
weekend
:
""
,
morning
:
""
,
day
:
""
,
night
:
""
,
youth
:
""
,
adult
:
""
,
senior
:
""
,
defaultPrice
:
5000
}
const
TicketEditForm
=
({
editFee
,
formRef
})
=>
{
const
[
ticketFee
,
setTicketFee
]
=
useState
(
INIT_TICKETFEE
)
const
[
error
,
setError
]
=
useState
(
""
)
useEffect
(()
=>
{
setTicketFee
({
...
ticketFee
,
...
editFee
})
},
[
editFee
])
function
handleChange
(
e
)
{
const
{
name
,
value
}
=
e
.
target
setTicketFee
({
...
ticketFee
,
[
name
]:
value
})
}
async
function
handleSubmit
(
e
)
{
e
.
preventDefault
()
try
{
setError
(
""
)
await
cinemaApi
.
editTicketFee
(
ticketFee
)
alert
(
"
해당 관람료 정보 등록이 성공적으로 완료되었습니다.
"
)
window
.
location
.
reload
()
}
catch
(
error
)
{
catchErrors
(
error
,
setError
)
}
}
return
(
<
form
ref
=
{
formRef
}
onSubmit
=
{
handleSubmit
}
>
<
div
className
=
"
d-flex row row-cols-2 mb-2 mb-md-3 gx-0 gy-2 gy-md-0
"
>
<
label
for
=
"
theaterType
"
className
=
"
col-md-auto col-form-label text-center text-md-start
"
>
상영관
종류
<
/label
>
<
div
className
=
"
col-md-4 col-lg-3 mx-md-2
"
>
<
input
className
=
{
`form-control
${
styles
.
shadowNone
}
`
}
type
=
"
text
"
id
=
"
theaterType
"
name
=
"
theaterType
"
value
=
{
ticketFee
.
theaterType
}
onChange
=
{
handleChange
}
/
>
<
/div
>
<
label
for
=
"
defaultPrice
"
className
=
"
col-md-auto col-form-label text-center text-md-start
"
>
기본
가격
<
/label
>
<
div
className
=
"
col-md-3 col-lg-2 mx-md-2
"
>
<
input
className
=
{
`form-control
${
styles
.
shadowNone
}
`
}
type
=
"
number
"
id
=
"
defaultPrice
"
name
=
"
defaultPrice
"
value
=
{
ticketFee
.
defaultPrice
}
onChange
=
{
handleChange
}
/
>
<
/div
>
<
/div
>
<
div
className
=
"
d-flex row row-cols-2 mb-2 mb-md-3 gx-0 gy-2 gy-md-0
"
>
<
label
for
=
"
weekdays
"
className
=
"
col-md-1 col-form-label text-center text-md-start
"
>
주중
<
/label
>
<
div
className
=
"
col-md-3 col-lg-2
"
>
<
input
className
=
{
`form-control
${
styles
.
shadowNone
}
`
}
type
=
"
number
"
id
=
"
weekdays
"
name
=
"
weekdays
"
value
=
{
ticketFee
.
weekdays
}
onChange
=
{
handleChange
}
/
>
<
/div
>
<
label
for
=
"
weekend
"
className
=
"
col-md-1 col-form-label text-center
"
>
주말
<
/label
>
<
div
className
=
"
col-md-3 col-lg-2
"
>
<
input
className
=
{
`form-control
${
styles
.
shadowNone
}
`
}
type
=
"
number
"
id
=
"
weekend
"
name
=
"
weekend
"
value
=
{
ticketFee
.
weekend
}
onChange
=
{
handleChange
}
/
>
<
/div
>
<
/div
>
<
div
className
=
"
d-flex row row-cols-2 mb-2 mb-md-3 gx-0 gy-2 gy-md-0
"
>
<
label
for
=
"
morning
"
className
=
"
col-md-1 col-form-label text-center text-md-start
"
>
조조
<
/label
>
<
div
className
=
"
col-md-3 col-lg-2
"
>
<
input
className
=
{
`form-control
${
styles
.
shadowNone
}
`
}
type
=
"
number
"
id
=
"
morning
"
name
=
"
morning
"
value
=
{
ticketFee
.
morning
}
onChange
=
{
handleChange
}
/
>
<
/div
>
<
label
for
=
"
day
"
className
=
"
col-md-1 col-form-label text-center
"
>
일반
<
/label
>
<
div
className
=
"
col-md-3 col-lg-2
"
>
<
input
className
=
{
`form-control
${
styles
.
shadowNone
}
`
}
type
=
"
number
"
id
=
"
day
"
name
=
"
day
"
value
=
{
ticketFee
.
day
}
onChange
=
{
handleChange
}
/
>
<
/div
>
<
label
for
=
"
night
"
className
=
"
col-md-1 col-form-label text-center
"
>
심야
<
/label
>
<
div
className
=
"
col-md-3 col-lg-2
"
>
<
input
className
=
{
`form-control
${
styles
.
shadowNone
}
`
}
type
=
"
number
"
id
=
"
night
"
name
=
"
night
"
value
=
{
ticketFee
.
night
}
onChange
=
{
handleChange
}
/
>
<
/div
>
<
/div
>
<
div
className
=
"
d-flex row row-cols-2 flex-wrap flex-lg-nowrap mb-2 mb-md-3 gx-0 gy-2 gy-md-0
"
>
<
label
for
=
"
youth
"
className
=
"
col-md-1 col-form-label text-center text-md-start
"
>
청소년
<
/label
>
<
div
className
=
"
col-md-3 col-lg-2
"
>
<
input
className
=
{
`form-control
${
styles
.
shadowNone
}
`
}
type
=
"
number
"
id
=
"
youth
"
name
=
"
youth
"
value
=
{
ticketFee
.
youth
}
onChange
=
{
handleChange
}
/
>
<
/div
>
<
label
for
=
"
adult
"
className
=
"
col-md-1 col-form-label text-center
"
>
일반
<
/label
>
<
div
className
=
"
col-md-3 col-lg-2
"
>
<
input
className
=
{
`form-control
${
styles
.
shadowNone
}
`
}
type
=
"
number
"
id
=
"
adult
"
name
=
"
adult
"
value
=
{
ticketFee
.
adult
}
onChange
=
{
handleChange
}
/
>
<
/div
>
<
label
for
=
"
senior
"
className
=
"
col-md-1 col-form-label text-center
"
>
경로
<
/label
>
<
div
className
=
"
col-md-3 col-lg-2
"
>
<
input
className
=
{
`form-control
${
styles
.
shadowNone
}
`
}
type
=
"
number
"
id
=
"
senior
"
name
=
"
senior
"
value
=
{
ticketFee
.
senior
}
onChange
=
{
handleChange
}
/
>
<
/div
>
<
div
className
=
"
col-12 col-md-2 col-lg-1 ms-lg-auto mt-md-2 mt-lg-0
"
>
<
button
type
=
"
submit
"
className
=
{
`btn btn-dark w-100
${
styles
.
customBtn
}
`
}
>
추가
<
/button
>
<
/div
>
<
/div
>
<
/form
>
)
}
export
default
TicketEditForm
\ No newline at end of file
client/src/components/Admin/TicketFeeTable.js
0 → 100644
View file @
91911f85
import
{
useState
,
useEffect
}
from
"
react
"
;
import
cinemaApi
from
"
../../apis/cinema.api.js
"
;
import
catchErrors
from
"
../../utils/catchErrors.js
"
;
import
styles
from
"
./admin.module.scss
"
;
const
TicketFeeTable
=
({
setEditFee
,
formRef
})
=>
{
const
[
ticketFee
,
setTicketFee
]
=
useState
([])
const
[
error
,
setError
]
=
useState
(
""
)
useEffect
(()
=>
{
getInfo
()
},
[])
async
function
getInfo
()
{
const
res
=
await
cinemaApi
.
getTicketFee
()
setTicketFee
(
res
)
}
async
function
editRow
(
theaterType
)
{
try
{
setError
(
""
)
const
res
=
await
cinemaApi
.
getTicketFeeOne
(
theaterType
)
setEditFee
({
...
res
})
formRef
?.
current
.
scrollIntoView
({
behavior
:
"
smooth
"
,
block
:
"
center
"
})
}
catch
(
error
)
{
catchErrors
(
error
,
setError
)
}
}
async
function
deleteData
(
theaterType
)
{
try
{
setError
(
""
)
await
cinemaApi
.
removeTicketFee
(
theaterType
)
alert
(
"
해당 관람료 정보를 성공적으로 삭제했습니다.
"
)
getInfo
()
}
catch
(
error
)
{
catchErrors
(
error
,
setError
)
}
}
function
priceToString
(
price
)
{
return
price
.
toString
().
replace
(
/
\B(?=(\d{3})
+
(?!\d))
/g
,
'
,
'
);
}
return
(
<
table
className
=
{
`table caption-top text-center align-middle
${
styles
.
tableForm
}
`
}
>
<
caption
className
=
"
text-dark
"
>
영화관람료
안내
<
/caption
>
<
thead
className
=
{
`table-dark align-middle
${
styles
.
dNone
}
`
}
>
<
tr
>
<
th
className
=
{
styles
.
word
}
>
상영관
종류
<
/th
>
<
th
>
주중
/
주말
<
/th
>
<
th
>
시간대
<
/th
>
<
th
>
청소년
<
/th
>
<
th
>
일반
<
/th
>
<
th
>
경로
<
/th
>
<
th
style
=
{{
width
:
"
14%
"
}}
><
/th
>
<
/tr
>
<
/thead
>
<
tbody
>
{
ticketFee
.
length
!==
0
?
ticketFee
.
map
(
info
=>
<>
<
tr
>
<
td
rowSpan
=
"
6
"
className
=
{
`d-block d-md-table-cell
${
styles
.
Row
}
${
styles
.
type
}
`
}
>
{
info
.
theaterType
}
<
/td
>
<
td
rowSpan
=
"
3
"
className
=
{
`d-block d-md-table-cell
${
styles
.
Row
}
${
styles
.
moreData
}
`
}
data
-
label
=
"
- 청소년 / 성인 / 경로
"
>
주중
(
월
~
목
)
<
/td
>
<
td
className
=
"
d-inline-block d-md-table-cell
"
>
조조
(
06
:
00
~
)
<
/td
>
<
td
className
=
"
d-inline-block d-md-table-cell
"
>
{
priceToString
(
info
.
weekdays
+
info
.
morning
+
info
.
youth
+
info
.
defaultPrice
)}
원
<
/td
>
<
td
className
=
"
d-inline-block d-md-table-cell
"
>
{
priceToString
(
info
.
weekdays
+
info
.
morning
+
info
.
adult
+
info
.
defaultPrice
)}
원
<
/td
>
<
td
className
=
"
d-inline-block d-md-table-cell
"
>
{
priceToString
(
info
.
weekdays
+
info
.
morning
+
info
.
senior
+
info
.
defaultPrice
)}
원
<
/td
>
<
td
rowSpan
=
"
6
"
className
=
"
d-none d-md-table-cell
"
>
<
div
className
=
"
d-flex flex-column
"
>
<
button
type
=
"
button
"
className
=
"
btn btn-primary my-1
"
onClick
=
{()
=>
editRow
(
info
.
theaterType
)}
>
수정
<
/button
>
<
button
type
=
"
button
"
className
=
"
btn btn-danger my-1
"
onClick
=
{()
=>
deleteData
(
info
.
theaterType
)}
>
삭제
<
/button
>
<
/div
>
<
/td
>
<
/tr
>
<
tr
>
<
td
className
=
"
d-inline-block d-md-table-cell
"
>
일반
(
11
:
00
~
)
<
/td
>
<
td
className
=
"
d-inline-block d-md-table-cell
"
>
{
priceToString
(
info
.
weekdays
+
info
.
day
+
info
.
youth
+
info
.
defaultPrice
)}
원
<
/td
>
<
td
className
=
"
d-inline-block d-md-table-cell
"
>
{
priceToString
(
info
.
weekdays
+
info
.
day
+
info
.
adult
+
info
.
defaultPrice
)}
원
<
/td
>
<
td
className
=
"
d-inline-block d-md-table-cell
"
>
{
priceToString
(
info
.
weekdays
+
info
.
day
+
info
.
senior
+
info
.
defaultPrice
)}
원
<
/td
>
<
/tr
>
<
tr
>
<
td
className
=
"
d-inline-block d-md-table-cell
"
>
심야
(
00
:
00
~
)
<
/td
>
<
td
className
=
"
d-inline-block d-md-table-cell
"
>
{
priceToString
(
info
.
weekdays
+
info
.
night
+
info
.
youth
+
info
.
defaultPrice
)}
원
<
/td
>
<
td
className
=
"
d-inline-block d-md-table-cell
"
>
{
priceToString
(
info
.
weekdays
+
info
.
night
+
info
.
adult
+
info
.
defaultPrice
)}
원
<
/td
>
<
td
className
=
"
d-inline-block d-md-table-cell
"
>
{
priceToString
(
info
.
weekdays
+
info
.
night
+
info
.
senior
+
info
.
defaultPrice
)}
원
<
/td
>
<
/tr
>
<
tr
>
<
td
rowSpan
=
"
3
"
className
=
{
`d-block d-md-table-cell
${
styles
.
Row
}
${
styles
.
moreData
}
${
styles
.
word
}
`
}
data
-
label
=
"
- 청소년 / 성인 / 경로
"
>
주말
(
금
~
일
)
및
공휴일
<
/td
>
<
td
className
=
"
d-inline-block d-md-table-cell
"
>
조조
(
06
:
00
~
)
<
/td
>
<
td
className
=
"
d-inline-block d-md-table-cell
"
>
{
priceToString
(
info
.
weekend
+
info
.
morning
+
info
.
youth
+
info
.
defaultPrice
)}
원
<
/td
>
<
td
className
=
"
d-inline-block d-md-table-cell
"
>
{
priceToString
(
info
.
weekend
+
info
.
morning
+
info
.
adult
+
info
.
defaultPrice
)}
원
<
/td
>
<
td
className
=
"
d-inline-block d-md-table-cell
"
>
{
priceToString
(
info
.
weekend
+
info
.
morning
+
info
.
senior
+
info
.
defaultPrice
)}
원
<
/td
>
<
/tr
>
<
tr
>
<
td
className
=
"
d-inline-block d-md-table-cell
"
>
일반
(
11
:
00
~
)
<
/td
>
<
td
className
=
"
d-inline-block d-md-table-cell
"
>
{
priceToString
(
info
.
weekend
+
info
.
day
+
info
.
youth
+
info
.
defaultPrice
)}
원
<
/td
>
<
td
className
=
"
d-inline-block d-md-table-cell
"
>
{
priceToString
(
info
.
weekend
+
info
.
day
+
info
.
adult
+
info
.
defaultPrice
)}
원
<
/td
>
<
td
className
=
"
d-inline-block d-md-table-cell
"
>
{
priceToString
(
info
.
weekend
+
info
.
day
+
info
.
senior
+
info
.
defaultPrice
)}
원
<
/td
>
<
/tr
>
<
tr
className
=
{
styles
.
Row
}
>
<
td
className
=
"
d-inline-block d-md-table-cell
"
>
심야
(
00
:
00
~
)
<
/td
>
<
td
className
=
"
d-inline-block d-md-table-cell
"
>
{
priceToString
(
info
.
weekend
+
info
.
night
+
info
.
youth
+
info
.
defaultPrice
)}
원
<
/td
>
<
td
className
=
"
d-inline-block d-md-table-cell
"
>
{
priceToString
(
info
.
weekend
+
info
.
night
+
info
.
adult
+
info
.
defaultPrice
)}
원
<
/td
>
<
td
className
=
"
d-inline-block d-md-table-cell
"
>
{
priceToString
(
info
.
weekend
+
info
.
night
+
info
.
senior
+
info
.
defaultPrice
)}
원
<
/td
>
<
td
className
=
{
`d-block d-md-none
${
styles
.
borderTop
}
`
}
>
<
div
className
=
"
d-flex justify-content-end
"
>
<
button
type
=
"
button
"
className
=
"
btn btn-primary
"
onClick
=
{()
=>
editRow
(
info
.
theaterType
)}
>
수정
<
/button
>
<
button
type
=
"
button
"
className
=
"
btn btn-danger ms-2
"
onClick
=
{()
=>
deleteData
(
info
.
theaterType
)}
>
삭제
<
/button
>
<
/div
>
<
/td
>
<
/tr
>
<
/>
)
:
<
tr
>
<
td
colSpan
=
"
7
"
>
등록된
관람료
관련
정보가
없습니다
.
<
/td
>
<
/tr>
}
<
/tbody
>
<
/table
>
)
}
export
default
TicketFeeTable
\ No newline at end of file
client/src/components/Admin/admin.module.scss
View file @
91911f85
@media
screen
and
(
max-width
:
76
8
px
)
{
@media
screen
and
(
max-width
:
76
7
px
)
{
.box
{
.box
{
margin-bottom
:
100px
;
margin-bottom
:
100px
;
...
@@ -14,6 +14,38 @@
...
@@ -14,6 +14,38 @@
z-index
:
10
;
z-index
:
10
;
}
}
}
}
.tableForm
{
border-top
:
2px
solid
;
&
.dNone
{
display
:
none
;
border
:
0
;
}
&
.Row
{
border-bottom
:
2px
solid
;
}
&
.type
{
font-size
:
1
.2rem
;
background-color
:
#000
;
color
:
#fff
;
}
&
.borderTop
{
border-top
:
1px
solid
;
}
&
.moreData
::after
{
content
:
attr
(
data-label
);
margin-left
:
1em
;
}
}
}
.word
{
word-break
:
keep-all
;
}
}
.shadowNone
{
.shadowNone
{
...
...
client/src/components/MovieTable/MovieTable.js
View file @
91911f85
...
@@ -31,7 +31,7 @@ const MovieTable = ({ movieList }) => {
...
@@ -31,7 +31,7 @@ const MovieTable = ({ movieList }) => {
}
}
return
(
return
(
<
table
style
=
{{
color
:
"
white
"
}}
className
=
{
`table text-center align-middle
${
styles
.
tableForm
}
`
}
>
<
table
className
=
{
`table text-center align-middle
${
styles
.
tableForm
}
`
}
>
<
thead
className
=
{
`table-dark
${
styles
.
dNone
}
`
}
>
<
thead
className
=
{
`table-dark
${
styles
.
dNone
}
`
}
>
<
tr
>
<
tr
>
<
th
className
=
"
col-md-5
"
>
제목
<
/th
>
<
th
className
=
"
col-md-5
"
>
제목
<
/th
>
...
...
client/src/components/MovieTable/movie-table.module.scss
View file @
91911f85
...
@@ -9,7 +9,7 @@
...
@@ -9,7 +9,7 @@
word-break
:
keep-all
;
word-break
:
keep-all
;
}
}
@media
screen
and
(
max-width
:
76
8
px
)
{
@media
screen
and
(
max-width
:
76
7
px
)
{
.tableForm
{
.tableForm
{
border-top
:
2px
solid
;
border-top
:
2px
solid
;
...
...
client/src/components/Navs/SubNav.js
View file @
91911f85
...
@@ -6,12 +6,10 @@ const SubNav = () => {
...
@@ -6,12 +6,10 @@ const SubNav = () => {
return
(
return
(
<>
{(
user
)
?
<>
{(
user
)
?
<
nav
className
=
"
nav justify-content-end py-1
"
>
<
nav
className
=
"
nav justify-content-end py-1
"
>
{(
user
.
role
===
"
member
"
)
{(
user
.
role
===
"
member
"
)
?
<><
Link
className
=
"
nav-link text-white
"
to
=
"
/mypage
"
>
마이페이지
<
/Link
>
?
<
Link
className
=
"
nav-link text-white
"
to
=
"
/mypage
"
>
마이페이지
<
/Link
>
<
/
>
:
<
Link
className
=
"
nav-link text-white
"
to
=
"
/admin
"
>
관리자페이지
<
/Link>
}
:
<
Link
className
=
"
nav-link text-white
"
to
=
"
/admin
"
>
관리자페이지
<
/Link>
}
<
Link
className
=
"
nav-link text-white
"
to
=
"
/
"
onClick
=
{
logout
}
>
로그아웃
<
/Link
>
<
Link
className
=
"
nav-link text-white
"
to
=
"
/
"
onClick
=
{
logout
}
>
로그아웃
<
/Link
>
{
/* <a className="nav-link text-white" href="/mypage" onClick={logout}>로그아웃</a> */
}
<
/nav>
:
<
/nav>
:
<
nav
className
=
"
nav justify-content-end py-1
"
>
<
nav
className
=
"
nav justify-content-end py-1
"
>
<
Link
className
=
"
nav-link text-white
"
to
=
"
/login
"
>
로그인
<
/Link
>
<
Link
className
=
"
nav-link text-white
"
to
=
"
/login
"
>
로그인
<
/Link
>
...
...
client/src/scss/custom.scss
View file @
91911f85
...
@@ -41,7 +41,7 @@ $theme-colors: map-merge($theme-colors, $custom-colors);
...
@@ -41,7 +41,7 @@ $theme-colors: map-merge($theme-colors, $custom-colors);
font-style
:
normal
;
font-style
:
normal
;
}
}
@media
(
max-width
:
76
8
px
)
{
@media
(
max-width
:
76
7
px
)
{
// .carousel-inner .carousel-item > div {
// .carousel-inner .carousel-item > div {
// display: none;
// display: none;
// }
// }
...
...
server/controllers/cinema.controller.js
View file @
91911f85
...
@@ -4,7 +4,7 @@ const getAll = async (req, res) => {
...
@@ -4,7 +4,7 @@ const getAll = async (req, res) => {
try
{
try
{
const
info
=
await
Cinema
.
findOne
({
const
info
=
await
Cinema
.
findOne
({
where
:
{
id
:
1
},
where
:
{
id
:
1
},
attributes
:
[
'
cinemaName
'
,
'
transportation
'
,
'
parking
'
,
'
address
'
]
attributes
:
[
'
cinemaName
'
,
'
transportation
'
,
'
parking
'
,
'
address
'
,
'
moreFeeInfo
'
]
})
})
return
res
.
json
(
info
)
return
res
.
json
(
info
)
}
catch
(
error
)
{
}
catch
(
error
)
{
...
...
server/controllers/ticketfee.controller.js
0 → 100644
View file @
91911f85
import
{
TicketFee
}
from
"
../db/index.js
"
;
const
getAll
=
async
(
req
,
res
)
=>
{
try
{
const
findAll
=
await
TicketFee
.
findAll
({
attributes
:
{
exclude
:
[
'
createdAt
'
,
'
updatedAt
'
]
}
})
return
res
.
json
(
findAll
)
}
catch
(
error
)
{
return
res
.
status
(
500
).
send
(
error
.
message
||
"
관람료 정보 가져오는 중 에러 발생
"
)
}
}
const
getOne
=
async
(
req
,
res
)
=>
{
try
{
const
{
theaterType
}
=
req
.
params
const
find
=
await
TicketFee
.
findOne
({
where
:
{
theaterType
:
theaterType
},
attributes
:
{
exclude
:
[
'
createdAt
'
,
'
updatedAt
'
]
}
})
if
(
!
find
)
throw
new
Error
(
"
해당 정보를 찾지 못했습니다.
"
);
return
res
.
json
(
find
)
}
catch
(
error
)
{
return
res
.
status
(
500
).
send
(
error
.
message
||
"
관람료 정보 가져오는 중 에러 발생
"
)
}
}
const
edit
=
async
(
req
,
res
)
=>
{
try
{
const
{
theaterType
}
=
req
.
body
let
response
=
null
const
result
=
await
TicketFee
.
findOrCreate
({
where
:
{
theaterType
:
theaterType
},
defaults
:
{
...
req
.
body
}
})
if
(
!
result
[
1
])
{
const
updateData
=
await
TicketFee
.
update
({
...
req
.
body
},
{
where
:
{
theaterType
:
theaterType
}
})
response
=
updateData
}
else
response
=
result
[
0
]
return
res
.
json
(
response
)
}
catch
(
error
)
{
return
res
.
status
(
500
).
send
(
error
.
message
||
"
관람료 정보 수정 중 에러 발생
"
)
}
}
const
remove
=
async
(
req
,
res
)
=>
{
try
{
const
{
theaterType
}
=
req
.
query
const
delNum
=
await
TicketFee
.
destroy
({
where
:
{
theaterType
:
theaterType
}
})
if
(
delNum
)
res
.
json
(
delNum
)
else
throw
new
Error
(
"
해당 정보를 서버에서 삭제하는데 실패했습니다.
"
);
}
catch
(
error
)
{
return
res
.
status
(
500
).
send
(
error
.
message
||
"
관람료 정보 삭제 중 에러 발생
"
)
}
}
export
default
{
getAll
,
getOne
,
edit
,
remove
}
\ No newline at end of file
server/db/index.js
View file @
91911f85
...
@@ -4,6 +4,7 @@ import RoleModel from "../models/role.model.js";
...
@@ -4,6 +4,7 @@ import RoleModel from "../models/role.model.js";
import
MovieModel
from
"
../models/movie.model.js
"
;
import
MovieModel
from
"
../models/movie.model.js
"
;
import
CinemaModel
from
"
../models/cinema.model.js
"
;
import
CinemaModel
from
"
../models/cinema.model.js
"
;
import
TheaterModel
from
"
../models/theater.model.js
"
;
import
TheaterModel
from
"
../models/theater.model.js
"
;
import
TicketFeeModel
from
"
../models/ticketfee.model.js
"
;
import
TimeTableModel
from
'
../models/role.model.js
'
;
import
TimeTableModel
from
'
../models/role.model.js
'
;
import
ReservationModel
from
'
../models/reservation.model.js
'
;
import
ReservationModel
from
'
../models/reservation.model.js
'
;
import
dbConfig
from
"
../config/db.config.js
"
;
import
dbConfig
from
"
../config/db.config.js
"
;
...
@@ -29,12 +30,15 @@ const Role = RoleModel(sequelize)
...
@@ -29,12 +30,15 @@ const Role = RoleModel(sequelize)
const
Movie
=
MovieModel
(
sequelize
)
const
Movie
=
MovieModel
(
sequelize
)
const
Cinema
=
CinemaModel
(
sequelize
)
const
Cinema
=
CinemaModel
(
sequelize
)
const
Theater
=
TheaterModel
(
sequelize
)
const
Theater
=
TheaterModel
(
sequelize
)
const
TicketFee
=
TicketFeeModel
(
sequelize
)
const
TimeTable
=
TimeTableModel
(
sequelize
)
const
TimeTable
=
TimeTableModel
(
sequelize
)
const
Reservation
=
ReservationModel
(
sequelize
)
const
Reservation
=
ReservationModel
(
sequelize
)
User
.
belongsTo
(
Role
);
User
.
belongsTo
(
Role
);
Role
.
hasOne
(
User
);
Role
.
hasOne
(
User
);
TicketFee
.
hasOne
(
Theater
,
{
foreignKey
:
"
theaterType
"
,
targetKey
:
"
theaterType
"
,
onDelete
:
"
Cascade
"
});
export
{
export
{
sequelize
,
sequelize
,
User
,
User
,
...
@@ -42,6 +46,7 @@ export {
...
@@ -42,6 +46,7 @@ export {
Movie
,
Movie
,
Cinema
,
Cinema
,
Theater
,
Theater
,
TicketFee
,
TimeTable
,
TimeTable
,
Reservation
Reservation
}
}
\ No newline at end of file
server/models/cinema.model.js
View file @
91911f85
...
@@ -22,6 +22,9 @@ const CinemaModel = (sequelize) => {
...
@@ -22,6 +22,9 @@ const CinemaModel = (sequelize) => {
},
},
address
:
{
address
:
{
type
:
DataTypes
.
STRING
type
:
DataTypes
.
STRING
},
moreFeeInfo
:
{
type
:
DataTypes
.
TEXT
}
}
},
},
{
{
...
...
server/models/ticketfee.model.js
0 → 100644
View file @
91911f85
import
Sequelize
from
"
sequelize
"
;
const
{
DataTypes
}
=
Sequelize
;
const
TicketFeeModel
=
(
sequelize
)
=>
{
const
TicketFee
=
sequelize
.
define
(
"
ticketfee
"
,
{
id
:
{
type
:
DataTypes
.
INTEGER
,
primaryKey
:
true
,
autoIncrement
:
true
,
},
theaterType
:
{
type
:
DataTypes
.
STRING
},
weekdays
:
{
type
:
DataTypes
.
INTEGER
},
weekend
:
{
type
:
DataTypes
.
INTEGER
},
morning
:
{
type
:
DataTypes
.
INTEGER
},
day
:
{
type
:
DataTypes
.
INTEGER
},
night
:
{
type
:
DataTypes
.
INTEGER
},
youth
:
{
type
:
DataTypes
.
INTEGER
},
adult
:
{
type
:
DataTypes
.
INTEGER
},
senior
:
{
type
:
DataTypes
.
INTEGER
},
defaultPrice
:
{
type
:
DataTypes
.
INTEGER
,
}
},
{
timestamps
:
true
,
freezeTableName
:
true
,
tableName
:
"
ticketfees
"
}
);
return
TicketFee
;
};
export
default
TicketFeeModel
;
\ No newline at end of file
server/routes/cinema.route.js
View file @
91911f85
import
express
from
"
express
"
;
import
express
from
"
express
"
;
import
cinemaCtrl
from
"
../controllers/cinema.controller.js
"
;
import
cinemaCtrl
from
"
../controllers/cinema.controller.js
"
;
import
ticketfeeCtrl
from
"
../controllers/ticketfee.controller.js
"
;
const
router
=
express
.
Router
();
const
router
=
express
.
Router
();
router
router
.
route
(
"
/
"
)
.
route
(
"
/
cinema
"
)
.
get
(
cinemaCtrl
.
getAll
)
.
get
(
cinemaCtrl
.
getAll
)
.
put
(
cinemaCtrl
.
edit
)
.
put
(
cinemaCtrl
.
edit
)
router
.
route
(
"
/ticketfee/:theaterType
"
)
.
get
(
ticketfeeCtrl
.
getOne
)
router
.
route
(
"
/ticketfee
"
)
.
get
(
ticketfeeCtrl
.
getAll
)
.
put
(
ticketfeeCtrl
.
edit
)
.
delete
(
ticketfeeCtrl
.
remove
)
export
default
router
;
export
default
router
;
\ No newline at end of file
server/routes/index.js
View file @
91911f85
...
@@ -9,8 +9,8 @@ const router = express.Router();
...
@@ -9,8 +9,8 @@ const router = express.Router();
router
.
use
(
'
/movie
'
,
movieRouter
)
router
.
use
(
'
/movie
'
,
movieRouter
)
router
.
use
(
'
/auth
'
,
userRouter
)
router
.
use
(
'
/auth
'
,
userRouter
)
router
.
use
(
'
/cinema
'
,
cinemaRouter
)
router
.
use
(
'
/kakaopay
'
,
kakaopayRouter
)
router
.
use
(
'
/kakaopay
'
,
kakaopayRouter
)
router
.
use
(
'
/email
'
,
emailRouter
)
router
.
use
(
'
/email
'
,
emailRouter
)
router
.
use
(
'
/info
'
,
cinemaRouter
)
export
default
router
;
export
default
router
;
\ No newline at end of file
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