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
Today KU
Commits
e8156733
Commit
e8156733
authored
Nov 03, 2021
by
Choi Ga Young
Browse files
context, 로그인, 로그아웃 적용
parent
4c649483
Changes
8
Hide whitespace changes
Inline
Side-by-side
client/src/App.js
View file @
e8156733
...
@@ -10,34 +10,37 @@ import StudyPlanPage from "./pages/StudyPlanPage";
...
@@ -10,34 +10,37 @@ import StudyPlanPage from "./pages/StudyPlanPage";
import
StudyPlanEditPage
from
"
./pages/StudyPlanEditPage
"
;
import
StudyPlanEditPage
from
"
./pages/StudyPlanEditPage
"
;
import
SubjectEditPage
from
"
./pages/SubjectEditPage
"
;
import
SubjectEditPage
from
"
./pages/SubjectEditPage
"
;
import
AdminPage
from
"
./pages/Admin/AdminPage
"
;
import
AdminPage
from
"
./pages/Admin/AdminPage
"
;
import
{
AuthProvider
}
from
"
./utils/context.js
"
;
import
PrivateRoute
from
"
./components/PrivateRoute
"
;
import
PrivateRoute
from
"
./components/PrivateRoute
"
;
import
ErrorPage
from
"
./pages/ErrorPage
"
;
import
ErrorPage
from
"
./pages/ErrorPage
"
;
function
App
()
{
function
App
()
{
return
(
return
(
<
Router
basename
=
{
process
.
env
.
PUBLIC_URL
}
>
<
AuthProvider
>
<
div
id
=
"
box
"
className
=
"
container position-relative vh-100 mx-sm-auto
"
>
<
Router
basename
=
{
process
.
env
.
PUBLIC_URL
}
>
<
Switch
>
<
div
id
=
"
box
"
className
=
"
container position-relative vh-100 mx-sm-auto
"
>
<
Route
exact
path
=
"
/
"
component
=
{
LoginPage
}
/
>
<
Switch
>
<
Route
path
=
"
/login
"
component
=
{
LoginPage
}
/
>
<
Route
exact
path
=
"
/
"
component
=
{
LoginPage
}
/
>
<
Route
path
=
"
/signup
"
component
=
{
SignupPage
}
/
>
<
Route
path
=
"
/login
"
component
=
{
LoginPage
}
/
>
<
Route
path
=
"
/home
"
component
=
{
HomePage
}
/
>
<
Route
path
=
"
/signup
"
component
=
{
SignupPage
}
/
>
<
Route
path
=
"
/schedule/edit
"
component
=
{
ScheduleEditPage
}
/
>
<
Route
path
=
"
/home
"
component
=
{
HomePage
}
/
>
<
Route
path
=
"
/schedule/:date
"
component
=
{
SchedulePage
}
/
>
<
Route
path
=
"
/schedule/edit
"
component
=
{
ScheduleEditPage
}
/
>
<
Route
path
=
"
/todo/:date
"
component
=
{
ToDoPage
}
/
>
<
Route
path
=
"
/schedule/:date
"
component
=
{
SchedulePage
}
/
>
<
Route
path
=
"
/studyplan/edit
"
component
=
{
StudyPlanEditPage
}
/
>
<
Route
path
=
"
/todo/:date
"
component
=
{
ToDoPage
}
/
>
<
Route
path
=
"
/studyplan/:
"
component
=
{
StudyPlanPage
}
/
>
<
Route
path
=
"
/studyplan/edit
"
component
=
{
StudyPlanEditPage
}
/
>
<
Route
path
=
"
/studyplan
"
component
=
{
StudyPlanListPage
}
/
>
<
Route
path
=
"
/studyplan/:
"
component
=
{
StudyPlanPage
}
/
>
<
Route
path
=
"
/subject/edit/:subjectId
"
component
=
{
SubjectEditPage
}
/
>
<
Route
path
=
"
/studyplan
"
component
=
{
StudyPlanListPage
}
/
>
<
Route
path
=
"
/subject/edit
"
component
=
{
SubjectEditPage
}
/
>
<
Route
path
=
"
/subject/edit/:subjectId
"
component
=
{
SubjectEditPage
}
/
>
<
Route
path
=
"
/admin/edit
"
component
=
{
ScheduleEditPage
}
/
>
<
Route
path
=
"
/subject/edit
"
component
=
{
SubjectEditPage
}
/
>
<
Route
path
=
"
/admin
"
component
=
{
AdminPage
}
/
>
<
Route
path
=
"
/admin/edit
"
component
=
{
ScheduleEditPage
}
/
>
{
/* <PrivateRoute path="/admin" component={AdminPage} role="admin" /> */
}
<
Route
path
=
"
/admin
"
component
=
{
AdminPage
}
/
>
{
/* <PrivateRoute path="/admin" component={AdminPage} role="admin" /> */
}
<
Route
component
=
{
ErrorPage
}
/
>
<
Route
component
=
{
ErrorPage
}
/
>
<
/Switch
>
<
/Switch
>
<
/div
>
<
/div
>
<
/Router
>
<
/Router
>
<
/AuthProvider
>
);
);
}
}
...
...
client/src/apis/auth.api.js
View file @
e8156733
import
axios
from
"
axios
"
;
import
axios
from
"
axios
"
;
import
baseUrl
from
"
../utils/baseUrl.js
"
;
import
baseUrl
from
"
../utils/baseUrl.js
"
;
const
getUser
=
async
()
=>
{
const
url
=
`
${
baseUrl
}
/api/auth/user`
const
{
data
}
=
await
axios
.
get
(
url
)
return
data
}
const
signup
=
async
(
user
)
=>
{
const
signup
=
async
(
user
)
=>
{
const
url
=
`
${
baseUrl
}
/api/auth/signup`
;
const
url
=
`
${
baseUrl
}
/api/auth/signup`
;
const
{
data
,
status
}
=
await
axios
.
post
(
url
,
user
);
const
{
data
}
=
await
axios
.
post
(
url
,
user
);
return
{
data
,
status
}
return
data
}
}
const
login
=
async
(
user
)
=>
{
const
login
=
async
(
user
)
=>
{
const
url
=
`
${
baseUrl
}
/api/auth/login`
;
const
url
=
`
${
baseUrl
}
/api/auth/login`
;
const
{
data
,
status
}
=
await
axios
.
post
(
url
,
user
);
const
{
data
}
=
await
axios
.
post
(
url
,
user
);
return
{
data
,
status
}
return
data
}
const
logout
=
async
()
=>
{
const
url
=
`
${
baseUrl
}
/api/auth/logout`
;
const
{
data
}
=
await
axios
.
get
(
url
);
return
data
}
}
const
authApi
=
{
const
authApi
=
{
getUser
,
signup
,
signup
,
login
login
,
logout
};
};
export
default
authApi
export
default
authApi
\ No newline at end of file
client/src/components/Form/LoginForm.js
View file @
e8156733
import
{
useState
}
from
'
react
'
;
import
{
useState
}
from
'
react
'
;
import
{
Redirect
,
Link
}
from
"
react-router-dom
"
;
import
{
Redirect
,
Link
}
from
"
react-router-dom
"
;
import
{
Formik
}
from
'
formik
'
;
import
{
Formik
}
from
'
formik
'
;
import
{
useAuth
}
from
"
../../utils/context.js
"
;
import
*
as
Yup
from
'
yup
'
;
import
*
as
Yup
from
'
yup
'
;
import
authApi
from
'
../../apis/auth.api
'
;
import
catchErrors
from
"
../../utils/catchErrors.js
"
;
import
catchErrors
from
"
../../utils/catchErrors.js
"
;
import
styles
from
"
./form.module.scss
"
;
import
styles
from
"
./form.module.scss
"
;
const
LoginForm
=
()
=>
{
const
LoginForm
=
()
=>
{
const
{
login
}
=
useAuth
();
const
[
success
,
setSuccess
]
=
useState
(
false
);
const
[
success
,
setSuccess
]
=
useState
(
false
);
const
[
error
,
setError
]
=
useState
(
""
);
const
[
error
,
setError
]
=
useState
(
""
);
...
@@ -28,9 +29,10 @@ const LoginForm = () => {
...
@@ -28,9 +29,10 @@ const LoginForm = () => {
})}
})}
onSubmit
=
{
async
(
values
,
{
setSubmitting
,
resetForm
})
=>
{
onSubmit
=
{
async
(
values
,
{
setSubmitting
,
resetForm
})
=>
{
try
{
try
{
console
.
log
(
'
login values
'
,
values
)
setError
(
""
)
setError
(
""
)
const
result
=
await
authApi
.
login
(
values
)
const
result
=
await
login
(
values
)
if
(
result
.
status
===
201
)
{
if
(
result
)
{
setSuccess
(
true
)
setSuccess
(
true
)
}
}
}
catch
(
error
)
{
}
catch
(
error
)
{
...
...
client/src/components/Menu/Menu.js
View file @
e8156733
import
{
Link
,
Redirect
}
from
"
react-router-dom
"
;
import
{
Link
,
Redirect
}
from
"
react-router-dom
"
;
import
{
useAuth
}
from
"
../../utils/context.js
"
;
import
moment
from
"
moment
"
;
import
moment
from
"
moment
"
;
import
styles
from
"
./menu.module.scss
"
;
import
styles
from
"
./menu.module.scss
"
;
const
Menu
=
()
=>
{
const
Menu
=
()
=>
{
const
{
logout
}
=
useAuth
();
return
(
return
(
<>
<>
<
button
className
=
"
btn btn-crimson shadow-none mt-2
"
type
=
"
button
"
data
-
bs
-
toggle
=
"
collapse
"
data
-
bs
-
target
=
"
#menuContent
"
aria
-
controls
=
"
menuContent
"
aria
-
expanded
=
"
false
"
aria
-
label
=
"
menu
"
>
<
button
className
=
"
btn btn-crimson shadow-none mt-2
"
type
=
"
button
"
data
-
bs
-
toggle
=
"
collapse
"
data
-
bs
-
target
=
"
#menuContent
"
aria
-
controls
=
"
menuContent
"
aria
-
expanded
=
"
false
"
aria
-
label
=
"
menu
"
>
...
@@ -39,7 +41,7 @@ const Menu = () => {
...
@@ -39,7 +41,7 @@ const Menu = () => {
<
Link
className
=
"
text-dark text-decoration-none
"
to
=
{
`/schedule/
${
moment
().
format
(
"
YYYY-MM-DD
"
)}
`
}
><
i
className
=
"
bi bi-check
"
><
/i>일정</
Link
>
<
Link
className
=
"
text-dark text-decoration-none
"
to
=
{
`/schedule/
${
moment
().
format
(
"
YYYY-MM-DD
"
)}
`
}
><
i
className
=
"
bi bi-check
"
><
/i>일정</
Link
>
<
Link
className
=
"
text-dark text-decoration-none
"
to
=
"
/studyplan
"
><
i
className
=
"
bi bi-check
"
><
/i>학업별 계획</
Link
>
<
Link
className
=
"
text-dark text-decoration-none
"
to
=
"
/studyplan
"
><
i
className
=
"
bi bi-check
"
><
/i>학업별 계획</
Link
>
<
/div
>
<
/div
>
<
p
className
=
{
`position-absolute bottom-0 text-dark
${
styles
.
logout
}
`
}
>
로그아웃
<
/p
>
<
p
className
=
{
`position-absolute bottom-0 text-dark
${
styles
.
logout
}
`
}
onClick
=
{
logout
}
>
로그아웃
<
/p
>
<
/div
>
<
/div
>
<
/div
>
<
/div
>
<
/div
>
<
/div
>
...
...
client/src/components/PrivateRoute.js
View file @
e8156733
import
{
Redirect
,
Route
}
from
"
react-router-dom
"
;
import
{
Redirect
,
Route
}
from
"
react-router-dom
"
;
//
import { useAuth } from "../
context/auth_
context"
;
import
{
useAuth
}
from
"
../
utils/
context
.js
"
import
ErrorPage
from
"
../pages/ErrorPage
"
;
import
ErrorPage
from
"
../pages/ErrorPage
"
;
const
PrivateRoute
=
({
component
:
Component
,
...
rest
})
=>
{
const
PrivateRoute
=
({
component
:
Component
,
...
rest
})
=>
{
//
const { user } = useAuth();
const
{
user
}
=
useAuth
();
//
return (
// return (
// <Route
// <Route
// {...rest}
// {...rest}
// render={(props) => {
// render={(props) => {
// if (user) {
// if (user) {
// if (rest.role) {
// if (rest.role) {
// if (rest.role === user.role) {
// if (rest.role === user.role) {
// return <Component {...props} />;
// return <Component {...props} />;
// } else {
// return <ErrorPage />
// }
// } else {
// return <Component {...props} />
// }
// } else {
// } else {
// return <
ErrorPage
/>
//
return <
Redirect to="/login"
/>
;
// }
// }
// } else {
// }}
// return <Component {...props} />
// }
// } else {
// return <Redirect to="/login" />;
// }
// }}
// />
// />
//
);
// );
return
(
return
(
<
Route
{...
rest
}
render
=
{(
props
)
=>
<
Component
{...
props
}
/>} /
>
<
Route
{...
rest
}
render
=
{(
props
)
=>
<
Component
{...
props
}
/>} /
>
)
)
...
...
client/src/utils/context.js
View file @
e8156733
import
{
createContext
,
useCallback
,
useContext
,
useEffect
,
useState
}
from
'
react
'
;
import
{
Redirect
}
from
'
react-router-dom
'
;
import
authApi
from
"
../apis/auth.api
"
;
import
catchErrors
from
'
./catchErrors
'
;
const
AuthContext
=
createContext
({
error
:
""
,
user
:
{
id
:
""
,
role
:
"
user
"
,
name
:
""
},
setUser
:
()
=>
{
},
login
:
()
=>
Promise
.
resolve
(
false
),
logout
:
()
=>
{
},
catchErrorAuth
:
(
error
,
displayError
)
=>
{
},
});
const
AuthProvider
=
({
children
})
=>
{
const
[
error
,
setError
]
=
useState
(
""
);
const
[
user
,
setUser
]
=
useState
({
id
:
""
,
role
:
"
user
"
,
name
:
""
});
const
getUser
=
async
()
=>
{
const
{
id
,
role
,
userName
}
=
await
authApi
.
getUser
();
const
user
=
{
id
:
id
,
role
:
role
,
name
:
userName
};
setUser
(
user
);
}
useEffect
(()
=>
{
getUser
();
},
[]);
const
login
=
useCallback
(
async
(
data
)
=>
{
try
{
setError
(
""
);
const
user
=
await
authApi
.
login
(
data
);
console
.
log
(
'
user in context
'
,
user
)
setUser
(
user
);
console
.
log
(
'
setUser 결과
'
,
user
)
return
true
;
}
catch
(
error
)
{
catchErrors
(
error
,
setError
);
return
false
;
}
},
[]);
const
logout
=
useCallback
(
async
()
=>
{
try
{
setError
(
""
);
const
user
=
await
authApi
.
logout
();
setUser
(
user
);
alert
(
"
로그아웃 되었습니다.
"
);
}
catch
(
error
)
{
catchErrors
(
error
,
setError
);
}
},
[]);
const
catchErrorAuth
=
useCallback
(
async
(
error
,
displayError
)
=>
{
let
errMsg
;
if
(
error
.
response
)
{
if
(
typeof
error
.
response
.
data
===
"
string
"
)
{
errMsg
=
error
.
response
.
data
;
console
.
log
(
'
Error response:
'
,
errMsg
);
}
else
{
const
{
data
}
=
error
.
response
;
if
(
data
.
redirectUrl
)
{
errMsg
=
data
.
message
;
console
.
log
(
'
Error response with redirected message:
'
,
errMsg
);
return
await
logout
();
}
}
}
else
if
(
error
.
request
)
{
errMsg
=
error
.
request
;
console
.
log
(
'
Error request:
'
,
errMsg
);
}
else
{
errMsg
=
error
.
message
;
console
.
log
(
"
Error message:
"
,
errMsg
)
}
displayError
(
errMsg
);
},
[]);
return
(
<
AuthContext
.
Provider
value
=
{{
error
,
user
,
setUser
,
login
,
logout
,
catchErrorAuth
}}
>
{
children
}
<
/AuthContext.Provider
>
);
};
const
useAuth
=
()
=>
useContext
(
AuthContext
);
export
{
AuthProvider
,
useAuth
};
server/controllers/user.controller.js
View file @
e8156733
...
@@ -2,6 +2,22 @@ import jwt from "jsonwebtoken";
...
@@ -2,6 +2,22 @@ import jwt from "jsonwebtoken";
import
{
User
}
from
'
../db/index.js
'
;
import
{
User
}
from
'
../db/index.js
'
;
import
config
from
"
../config/app.config.js
"
;
import
config
from
"
../config/app.config.js
"
;
const
getUser
=
async
(
req
,
res
)
=>
{
try
{
if
(
req
.
cookies
.
todayku
)
{
const
token
=
req
.
cookies
.
todayku
;
const
{
id
,
role
,
name
}
=
jwt
.
verify
(
token
,
config
.
jwtSecret
);
res
.
json
({
id
,
role
,
name
});
}
else
{
res
.
json
({
id
:
""
,
role
:
"
user
"
,
name
:
""
});
}
}
catch
(
error
)
{
console
.
error
(
error
);
return
res
.
status
(
500
).
send
(
"
유저를 가져오지 못했습니다.
"
);
}
}
const
signup
=
async
(
req
,
res
)
=>
{
const
signup
=
async
(
req
,
res
)
=>
{
console
.
log
(
'
server/signup req.body
'
,
req
.
body
)
console
.
log
(
'
server/signup req.body
'
,
req
.
body
)
const
{
userId
,
password
,
userName
,
userStudNum
}
=
req
.
body
;
const
{
userId
,
password
,
userName
,
userStudNum
}
=
req
.
body
;
...
@@ -15,7 +31,7 @@ const signup = async (req, res) => {
...
@@ -15,7 +31,7 @@ const signup = async (req, res) => {
password
:
password
,
password
:
password
,
userName
:
userName
,
userName
:
userName
,
studNum
:
userStudNum
,
studNum
:
userStudNum
,
role
:
"
user
"
role
:
"
user
"
});
});
res
.
status
(
201
).
json
(
"
success
"
)
res
.
status
(
201
).
json
(
"
success
"
)
}
catch
(
error
)
{
}
catch
(
error
)
{
...
@@ -38,8 +54,9 @@ const login = async (req, res) => {
...
@@ -38,8 +54,9 @@ const login = async (req, res) => {
const
signData
=
{
const
signData
=
{
id
:
user
.
userID
,
id
:
user
.
userID
,
name
:
user
.
userName
role
:
"
user
"
,
};
name
:
user
.
userName
,
};
const
token
=
jwt
.
sign
(
signData
,
config
.
jwtSecret
,
{
const
token
=
jwt
.
sign
(
signData
,
config
.
jwtSecret
,
{
expiresIn
:
config
.
jwtExpires
,
expiresIn
:
config
.
jwtExpires
,
...
@@ -52,8 +69,8 @@ const login = async (req, res) => {
...
@@ -52,8 +69,8 @@ const login = async (req, res) => {
secure
:
config
.
env
===
"
production
"
,
secure
:
config
.
env
===
"
production
"
,
});
});
res
.
status
(
201
).
json
(
user
)
res
.
status
(
201
).
json
(
signData
)
}
else
{
}
else
{
res
.
status
(
401
).
send
(
"
비밀번호가 일치하지 않습니다.
"
)
res
.
status
(
401
).
send
(
"
비밀번호가 일치하지 않습니다.
"
)
}
}
...
@@ -63,7 +80,23 @@ const login = async (req, res) => {
...
@@ -63,7 +80,23 @@ const login = async (req, res) => {
}
}
}
}
const
logout
=
async
(
req
,
res
)
=>
{
try
{
res
.
clearCookie
(
config
.
cookieName
);
res
.
json
({
id
:
""
,
role
:
"
user
"
,
name
:
""
})
}
catch
(
error
)
{
console
.
log
(
error
);
return
res
.
status
(
500
).
send
(
"
로그아웃 에러발생
"
)
}
}
export
default
{
export
default
{
getUser
,
signup
,
signup
,
login
login
,
logout
}
}
\ No newline at end of file
server/routes/user.route.js
View file @
e8156733
...
@@ -11,4 +11,7 @@ router
...
@@ -11,4 +11,7 @@ router
.
route
(
"
/login
"
)
.
route
(
"
/login
"
)
.
post
(
userCtrl
.
login
)
.
post
(
userCtrl
.
login
)
router
.
route
(
"
/logout
"
)
.
get
(
userCtrl
.
logout
)
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