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
eue
Commits
8bcf6e01
Commit
8bcf6e01
authored
Jul 26, 2021
by
KangMin An
Browse files
Merge branch 'gitlab/who' into premaster.
parents
84acb663
c73c4950
Changes
20
Expand all
Hide whitespace changes
Inline
Side-by-side
client/package-lock.json
View file @
8bcf6e01
This diff is collapsed.
Click to expand it.
client/package.json
View file @
8bcf6e01
...
@@ -7,7 +7,7 @@
...
@@ -7,7 +7,7 @@
"@testing-library/react"
:
"^11.2.7"
,
"@testing-library/react"
:
"^11.2.7"
,
"@testing-library/user-event"
:
"^12.8.3"
,
"@testing-library/user-event"
:
"^12.8.3"
,
"axios"
:
"^0.21.1"
,
"axios"
:
"^0.21.1"
,
"bootstrap"
:
"^
4.6.0
"
,
"bootstrap"
:
"^
5.0.2
"
,
"chart.js"
:
"^3.4.0"
,
"chart.js"
:
"^3.4.0"
,
"moment"
:
"^2.29.1"
,
"moment"
:
"^2.29.1"
,
"ngx-spinner"
:
"^12.0.0"
,
"ngx-spinner"
:
"^12.0.0"
,
...
@@ -16,7 +16,7 @@
...
@@ -16,7 +16,7 @@
"pg"
:
"^8.6.0"
,
"pg"
:
"^8.6.0"
,
"pg-hstore"
:
"^2.3.4"
,
"pg-hstore"
:
"^2.3.4"
,
"react"
:
"^17.0.2"
,
"react"
:
"^17.0.2"
,
"react-bootstrap"
:
"^
1.6.1
"
,
"react-bootstrap"
:
"^
2.0.0-beta.4
"
,
"react-chartjs-2"
:
"^3.0.3"
,
"react-chartjs-2"
:
"^3.0.3"
,
"react-copy-to-clipboard"
:
"^5.0.3"
,
"react-copy-to-clipboard"
:
"^5.0.3"
,
"react-dom"
:
"^17.0.2"
,
"react-dom"
:
"^17.0.2"
,
...
@@ -27,6 +27,7 @@
...
@@ -27,6 +27,7 @@
"react-redux"
:
"^7.2.4"
,
"react-redux"
:
"^7.2.4"
,
"react-router-dom"
:
"^5.2.0"
,
"react-router-dom"
:
"^5.2.0"
,
"react-scripts"
:
"4.0.3"
,
"react-scripts"
:
"4.0.3"
,
"react-select"
:
"^4.3.1"
,
"react-use"
:
"^17.2.4"
,
"react-use"
:
"^17.2.4"
,
"sass"
:
"^1.35.1"
,
"sass"
:
"^1.35.1"
,
"sequelize"
:
"^6.6.5"
,
"sequelize"
:
"^6.6.5"
,
...
...
client/src/App.css
View file @
8bcf6e01
...
@@ -5,6 +5,10 @@ body {
...
@@ -5,6 +5,10 @@ body {
}
}
.form-check-input
:checked
{
background-color
:
#04AB70
!important
;
}
#btnlink
{
#btnlink
{
color
:
white
!important
;
color
:
white
!important
;
text-decoration
:
none
!important
;
text-decoration
:
none
!important
;
...
@@ -36,6 +40,7 @@ body {
...
@@ -36,6 +40,7 @@ body {
padding
:
0.5em
;
padding
:
0.5em
;
}
}
.form-group
.form-control
{
.form-group
.form-control
{
border-radius
:
40px
;
border-radius
:
40px
;
}
}
...
...
client/src/App.js
View file @
8bcf6e01
import
React
from
'
react
'
;
import
React
from
'
react
'
;
import
{
BrowserRouter
as
Router
,
Route
}
from
'
react-router-dom
'
;
import
{
BrowserRouter
as
Router
,
Route
,
Switch
}
from
'
react-router-dom
'
;
import
'
./App.css
'
;
import
'
./App.css
'
;
import
Home
from
'
./pages/Home
'
;
import
Home
from
'
./pages/Home
'
;
import
SignupPage
from
'
./pages/SignupPage
'
;
import
SignupPage
from
'
./pages/SignupPage
'
;
import
LoginPage
from
'
./pages/LoginPage
'
;
import
LoginPage
from
'
./pages/LoginPage
'
;
import
LocalCodePage
from
'
./pages/LocalCodePage
'
;
import
LocalCodePage
from
'
./pages/LocalCodePage
'
;
import
PrivateRoute
from
'
./utils/PrivateRoutes
'
;
import
PageNotFound
from
'
./components/PageNotFound
'
;
function
App
()
{
function
App
()
{
return
(
return
(
<
Router
>
<
Router
>
<>
<
Switch
>
<
Route
exact
path
=
'
/
'
component
=
{
Home
}
/
>
<
Route
exact
path
=
'
/
'
component
=
{
Home
}
/
>
<
Route
exact
path
=
'
/signup
'
component
=
{
SignupPage
}
/
>
<
Route
path
=
'
/signup
'
component
=
{
SignupPage
}
/
>
<
Route
exact
path
=
'
/login
'
component
=
{
LoginPage
}
/
>
<
Route
path
=
'
/login
'
component
=
{
LoginPage
}
/
>
<
Route
exact
path
=
'
/local_code
'
component
=
{
LocalCodePage
}
/
>
<
PrivateRoute
path
=
'
/local_code
'
>
<
/
>
<
LocalCodePage
/>
<
/PrivateRoute
>
<
Route
component
=
{
PageNotFound
}
/
>
<
/Switch
>
<
/Router
>
<
/Router
>
);
);
...
...
client/src/Utils/Auth.js
View file @
8bcf6e01
import
axios
from
'
axios
'
;
import
axios
from
'
axios
'
;
import
{
useState
}
from
'
react
'
;
import
Oauth
from
'
./Oauth
'
;
export
function
handleLogin
({
userId
,
role
,
name
,
tel
,
email
})
{
export
function
handleLogin
({
userId
,
role
,
name
,
tel
,
email
})
{
localStorage
.
setItem
(
'
id
'
,
userId
)
localStorage
.
setItem
(
'
id
'
,
userId
)
...
@@ -17,7 +15,7 @@ export async function handleLogout() {
...
@@ -17,7 +15,7 @@ export async function handleLogout() {
}
}
export
function
isLogined
()
{
export
function
isLogined
()
{
const
userId
=
localStorage
.
getItem
(
'
id
'
)
const
userId
=
localStorage
.
getItem
(
'
nickname
'
)
if
(
userId
)
{
if
(
userId
)
{
return
userId
return
userId
}
else
{
}
else
{
...
...
client/src/Utils/Oauth.js
View file @
8bcf6e01
import
{
Spinner
,
Button
,
Row
,
Alert
}
from
'
react-bootstrap
'
;
import
Swal
from
'
sweetalert2
'
import
Swal
from
'
sweetalert2
'
import
'
../App.css
'
import
'
../App.css
'
...
@@ -85,19 +84,4 @@ export function kakaoLogout() {
...
@@ -85,19 +84,4 @@ export function kakaoLogout() {
}
}
})
})
})
})
}
export
function
Loading
()
{
return
(
<
Row
className
=
'
d-block
'
>
<
Button
id
=
'
formbtn
'
className
=
'
d-flex justify-content-center align-items-center m-auto
'
style
=
{{
width
:
'
200px
'
,
height
:
'
200px
'
,
flexDirection
:
'
column
'
}}
disabled
>
<
Spinner
animation
=
"
border
"
role
=
"
status
"
>
<
span
className
=
"
sr-only
"
>
Loading
...
<
/span
>
<
/Spinner
>
<
br
/>
Loading
...
<
/Button
>
<
/Row
>
)
}
}
\ No newline at end of file
client/src/Utils/PrivateRoutes.js
0 → 100644
View file @
8bcf6e01
import
React
from
'
react
'
;
import
{
Redirect
,
Route
}
from
'
react-router-dom
'
;
import
{
isLogined
}
from
'
../utils/Auth
'
;
function
PrivateRoute
({
path
,
children
})
{
if
(
isLogined
())
{
return
(
<
Route
path
=
{
path
}
>
{
children
}
<
/Route
>
)
}
else
{
alert
(
'
권한이 없습니다
'
)
return
(
<
Redirect
to
=
'
/
'
/>
)
}
}
export
default
PrivateRoute
client/src/Utils/SendEmail.js
deleted
100644 → 0
View file @
84acb663
// const { smtpTransport } = require('./config/email');
// const nodemailer = require('nodemailer');
// /* min ~ max까지 랜덤으로 숫자를 생성하는 함수 */
// var generateRandom = function (min, max) {
// var ranNum = Math.floor(Math.random() * (max - min + 1)) + min;
// return ranNum;
// }
// // transporter 생성
// let transporter = nodemailer.createTransport({
// // host: "mail.회사.계정.입력" *** mail. <-요게 핵심이었다!
// host: "mail.abc.co.kr",
// // 보안 무시
// port: 587,
// // 회사 도메인 내 계정 및 비밀번호
// auth: {
// user: "myid@abc.co.kr",
// pass: "mypassword",
// },
// // 서명받지 않은 사이트의 요청도 받겠다.
// tls: {
// rejectUnauthorized: false
// }
// });
// // 메일 관련 옵션
// let mailOptions = {
// // 발송 메일 주소 (위에서 작성한 회사 계정 아이디)
// from: "myid@abc.co.kr",
// // 수신 메일 주소
// to: "receiverid@domain.com",
// // 제목
// subject: "인증 메일입니다.",
// // 인증 URL
// html: `<p>아래의 링크를 클릭하시면 인증이 완료됩니다.</p>
// <a href='http://localhost:3000/auth?etc'>인증하기</a>`,
// };
// // 메일 보내기
// transporter.sendMail(mailOptions, function (err, info) {
// if (err) {
// // 메일 보내기 에러 발생 시, 콘솔 찍어보기
// console.log("메일보내기 에러쓰");
// console.log(err);
// } else {
// // 성공했다!
// console.log("Email sent: " + info.response);
// }
// });
// // export const auth = {
// // SendEmail: async (req, res) => {
// // const number = generateRandom(111111, 999999)
// // const { sendEmail } = req.body;
// // const mailOptions = {
// // from: "정욱이네러버덕",
// // to: sendEmail,
// // subject: "[러버덕]인증 관련 이메일 입니다",
// // text: "오른쪽 숫자 6자리를 입력해주세요 : " + number
// // };
// // const result = await smtpTransport.sendMail(mailOptions, (error, responses) => {
// // if (error) {
// // return res.status(statusCode.OK).send(util.fail(statusCode.BAD_REQUEST, responseMsg.AUTH_EMAIL_FAIL))
// // } else {
// // /* 클라이언트에게 인증 번호를 보내서 사용자가 맞게 입력하는지 확인! */
// // return res.status(statusCode.OK).send(util.success(statusCode.OK, responseMsg.AUTH_EMAIL_SUCCESS, {
// // number: number
// // }))
// // }
// // smtpTransport.close();
// // });
// // }
// // }
\ No newline at end of file
client/src/components/EueSuggest.js
View file @
8bcf6e01
import
React
from
'
react
'
import
React
,
{
useEffect
}
from
'
react
'
import
{
Row
,
Card
}
from
'
react-bootstrap
'
;
import
{
Row
,
Card
,
Col
}
from
'
react-bootstrap
'
;
function
EueSuggest
()
{
function
EueSuggest
()
{
const
cardstyled
=
{
const
cardstyled
=
{
margin
:
'
auto
'
,
margin
:
'
auto
'
,
padding
:
'
1em
'
,
padding
:
'
1em
'
,
...
@@ -13,18 +14,22 @@ function EueSuggest() {
...
@@ -13,18 +14,22 @@ function EueSuggest() {
borderColor
:
'
rgb(110, 189, 142)
'
,
borderColor
:
'
rgb(110, 189, 142)
'
,
color
:
'
#04AB70
'
color
:
'
#04AB70
'
}
}
const
airUsing
=
localStorage
.
getItem
(
'
using-aircondition
'
)
return
(
return
(
<
Row
className
=
'
text-center w-100 my-2
'
>
<
Row
className
=
'
text-center w-100 my-2
'
>
<
Card
style
=
{
cardstyled
}
>
<
Card
style
=
{
cardstyled
}
>
<
Card
.
Title
>
EUE
제안
<
Card
.
Title
>
<
/Card.Title
>
EUE
제안
<
Card
.
Text
>
<
/Card.Title
>
"
에어컨을 줄이시면 더 효율적입니다.
"
<
Card
.
Text
>
<
/Card.Text
>
"
에어컨을 줄이시면 더 효율적입니다.
"
<
/Card
>
<
/Card.Text
>
<
/Row
>
<
/Card
>
<
/Row
>
)
)
}
}
...
...
client/src/components/Loading.js
0 → 100644
View file @
8bcf6e01
import
React
from
'
react
'
import
{
Spinner
,
Row
,
Button
}
from
'
react-bootstrap
'
;
function
Loading
()
{
return
(
<
Button
id
=
'
formbtn
'
className
=
'
d-flex justify-content-center align-items-center m-auto
'
style
=
{{
width
:
'
200px
'
,
height
:
'
200px
'
,
flexDirection
:
'
column
'
}}
disabled
>
<
Spinner
animation
=
"
border
"
role
=
"
status
"
>
<
span
className
=
"
sr-only
"
>
Loading
...
<
/span
>
<
/Spinner
>
<
br
/>
Loading
...
<
/Button
>
)
}
export
default
Loading
;
\ No newline at end of file
client/src/components/LocCodeChange.js
View file @
8bcf6e01
import
React
,
{
useEffect
,
useState
}
from
'
react
'
import
React
,
{
useEffect
,
useState
}
from
'
react
'
import
'
../App.css
'
import
'
../App.css
'
import
{
Form
,
Button
,
Row
,
Col
,
Card
,
DropdownButton
,
Dropdown
,
ButtonGroup
}
from
'
react-bootstrap
'
;
import
{
Form
,
Button
,
Row
,
Col
,
Card
}
from
'
react-bootstrap
'
;
import
axios
from
'
axios
'
;
import
axios
from
'
axios
'
;
import
Swal
from
'
sweetalert2
'
function
LocCodeChange
()
{
function
LocCodeChange
()
{
...
@@ -20,7 +22,6 @@ function LocCodeChange() {
...
@@ -20,7 +22,6 @@ function LocCodeChange() {
const
inboxstyled
=
{
const
inboxstyled
=
{
display
:
'
flex
'
,
display
:
'
flex
'
,
flexDirection
:
'
column
'
,
flexDirection
:
'
column
'
,
maxWidth
:
'
80%
'
,
justifyContent
:
'
center
'
,
justifyContent
:
'
center
'
,
margin
:
'
auto
'
,
margin
:
'
auto
'
,
padding
:
'
10px
'
padding
:
'
10px
'
...
@@ -28,46 +29,89 @@ function LocCodeChange() {
...
@@ -28,46 +29,89 @@ function LocCodeChange() {
const
btnstyled2
=
{
const
btnstyled2
=
{
background
:
'
white
'
,
background
:
'
white
'
,
margin
:
'
1px
'
,
width
:
'
50%
'
,
maxWidth
:
'
fit-content
'
,
borderWidth
:
'
2px
'
,
borderWidth
:
'
2px
'
,
color
:
'
rgb(110, 189, 142)
'
,
color
:
'
rgb(110, 189, 142)
'
,
borderColor
:
'
rgba(195, 195, 195, 0.753)
'
,
borderColor
:
'
rgba(195, 195, 195, 0.753)
'
,
borderRadius
:
'
20px
'
}
const
[
locCodeShow
,
setLocCodeShow
]
=
useState
(
false
)
function
handleClickLoc
()
{
setLocCodeShow
(
true
);
const
auth
=
document
.
getElementById
(
'
loc-code
'
)
auth
.
style
.
visibility
=
'
visible
'
}
}
const
[
does
,
setDoes
]
=
useState
([])
const
[
does
,
setDoes
]
=
useState
([])
const
[
sggs
,
setSggs
]
=
useState
([])
const
[
sggs
,
setSggs
]
=
useState
([])
// const [emds, setEmds] = useState([])
const
[
emds
,
setEmds
]
=
useState
([])
const
[
sggsArray
,
setSggsArray
]
=
useState
([])
const
[
emdsArray
,
setEmdsArray
]
=
useState
([])
const
does_array
=
[]
const
doeSelect
=
document
.
getElementById
(
'
select-doe
'
)
const
sggs_array
=
[]
const
sggSelect
=
document
.
getElementById
(
'
select-sgg
'
)
// const emds_array = []
const
emdSelect
=
document
.
getElementById
(
'
select-emd
'
)
does
.
map
((
doesObj
)
=>
does_array
.
push
(
doesObj
[
'
name_doe
'
]))
sggs
.
map
((
sggsObj
)
=>
console
.
log
(
sggsObj
[
'
sgg
'
]))
function
handleClickLoc
()
{
console
.
log
(
'
does ::
'
,
does
)
if
(
doeSelect
.
options
[
doeSelect
.
selectedIndex
].
text
!==
'
도
'
&&
sggSelect
.
options
[
sggSelect
.
selectedIndex
].
text
!==
'
시군구
'
&&
emdSelect
.
options
[
emdSelect
.
selectedIndex
].
text
!==
'
읍면동
'
)
{
console
.
log
(
'
does_array:::
'
,
does_array
)
localStorage
.
setItem
(
'
code_doe
'
,
doeSelect
.
value
)
localStorage
.
setItem
(
'
name_doe
'
,
doeSelect
.
options
[
doeSelect
.
selectedIndex
].
text
)
localStorage
.
setItem
(
'
code_sgg
'
,
sggSelect
.
value
)
localStorage
.
setItem
(
'
name_sgg
'
,
sggSelect
.
options
[
sggSelect
.
selectedIndex
].
text
)
localStorage
.
setItem
(
'
code_emd
'
,
emdSelect
.
value
)
localStorage
.
setItem
(
'
name_emd
'
,
emdSelect
.
options
[
emdSelect
.
selectedIndex
].
text
)
if
(
localStorage
.
getItem
(
'
name_emd
'
))
{
Swal
.
fire
({
title
:
'
변경되었습니다.
'
,
text
:
'
축하드립니다!👏
'
,
icon
:
'
success
'
,
customClass
:
'
swal-wide
'
,
confirmButtonText
:
'
확인
'
,
}).
then
((
res
)
=>
{
if
(
res
.
isConfirmed
)
{
window
.
location
.
reload
()
}
else
{
window
.
location
.
reload
()
}
})
}
}
else
{
Swal
.
fire
({
title
:
'
실패
'
,
text
:
'
전부 선택해주세요
'
,
icon
:
'
error
'
,
customClass
:
'
swal-wide
'
,
confirmButtonText
:
'
확인
'
})
}
}
async
function
getLocCode
()
{
async
function
getLocCode
()
{
const
res
=
await
axios
.
get
(
"
http://localhost:4500/api/data/loccode
"
)
const
res
=
await
axios
.
get
(
"
http://localhost:4500/api/data/loccode
"
)
const
local_codes
=
res
.
data
.
locCodes
const
local_codes
=
res
.
data
.
locCodes
console
.
log
(
'
local_codes:::
'
,
local_codes
)
setDoes
(
local_codes
.
DOE
)
setDoes
(
local_codes
.
DOE
)
setSggs
(
local_codes
.
SGG
)
setSggs
(
local_codes
.
SGG
)
setEmds
(
local_codes
.
EMD
)
}
}
useEffect
(()
=>
{
useEffect
(()
=>
{
getLocCode
()
getLocCode
()
},
[])
},
[])
function
selectLocal
()
{
sggs
.
map
(
function
(
sggvalue
)
{
if
(
doeSelect
.
value
==
sggvalue
[
'
code_doe
'
])
{
setSggsArray
(
sggvalue
[
'
sgg
'
])
}
})
emds
.
map
(
function
(
emdvalue
)
{
if
(
sggSelect
.
value
==
emdvalue
[
'
code_sgg
'
])
{
setEmdsArray
(
emdvalue
[
'
emd
'
])
}
})
}
return
(
return
(
<
Row
className
=
'
text-center w-100 my-2
'
>
<
Row
className
=
'
text-center w-100 my-2
'
>
<
Card
style
=
{
cardstyled
}
>
<
Card
style
=
{
cardstyled
}
>
...
@@ -78,54 +122,62 @@ function LocCodeChange() {
...
@@ -78,54 +122,62 @@ function LocCodeChange() {
Please
select
a
your
region
Please
select
a
your
region
<
/Card.Subtitle
>
<
/Card.Subtitle
>
<
hr
/>
<
hr
/>
<
Card
.
Text
>
<
Card
.
Text
className
=
'
m-0
'
>
<
Form
style
=
{
inboxstyled
}
>
<
Form
style
=
{
inboxstyled
}
>
<
Row
className
=
'
m-auto w-100 d-flex justify-content-center
'
>
<
Row
md
=
{
12
}
xs
=
{
12
}
className
=
'
m-auto w-100 d-flex justify-content-center
'
style
=
{{
padding
:
'
0
'
,
display
:
'
flex
'
,
justifyContent
:
'
center
'
,
width
:
'
100%
'
}}
>
<
Col
md
=
{
12
}
xs
=
{
12
}
style
=
{{
padding
:
'
0
'
,
display
:
'
flex
'
,
justifyContent
:
'
center
'
,
width
:
'
100%
'
}}
>
<
Form
.
Group
className
=
'
m-auto w-100
'
style
=
{
btnstyled2
}
>
<
Form
.
Group
style
=
{
btnstyled2
}
>
<
Row
className
=
'
m-auto pb-3
'
onChange
=
{
selectLocal
}
>
<
Form
.
Control
as
=
'
select
'
aria
-
label
=
"
Floating label select example
"
>
<
Col
md
=
{
4
}
xs
=
{
4
}
style
=
{{
padding
:
'
2px
'
}}
>
<
option
>
도
<
/option
>
{
does
.
map
((
doe
)
=>
(
<
Form
.
Control
as
=
'
select
'
size
=
"
sm
"
id
=
'
select-doe
'
>
<
option
value
=
{
`
${
doe
[
"
code_doe
"
]}
`
}
>
<
option
selected
disabled
>
도
<
/option
>
{
`
${
doe
[
"
name_doe
"
]}
`
}
<
/option
>
{
))}
does
.
map
((
doevalue
)
=>
(
<
/Form.Control
>
<
option
value
=
{
`
${
doevalue
[
"
code_doe
"
]}
`
}
>
<
Form
.
Control
as
=
'
select
'
aria
-
label
=
"
Floating label select example
"
>
{
`
${
doevalue
[
"
name_doe
"
]}
`
}
<
option
>
시군구
<
/option
>
<
/option
>
{
does
.
map
((
doe
)
=>
(
))
<
option
value
=
{
`
${
doe
[
"
code_doe
"
]}
`
}
>
}
{
`
${
doe
[
"
name_doe
"
]}
`
}
<
/option
>
<
/Form.Control
>
))}
<
/Col
>
<
/Form.Control
>
<
Form
.
Control
as
=
'
select
'
aria
-
label
=
"
Floating label select example
"
>
<
Col
md
=
{
4
}
xs
=
{
4
}
style
=
{{
padding
:
'
2px
'
}}
>
<
option
>
읍면동
<
/option
>
<
Form
.
Control
as
=
'
select
'
size
=
"
sm
"
id
=
'
select-sgg
'
>
{
does
.
map
((
doe
)
=>
(
<
option
selected
disabled
>
시군구
<
/option
>
<
option
value
=
{
`
${
doe
[
"
code_doe
"
]}
`
}
>
{
{
`
${
doe
[
"
name_doe
"
]}
`
}
<
/option
>
sggsArray
.
map
((
sggvalue
)
=>
(
))}
<
option
value
=
{
`
${
sggvalue
[
"
code_sgg
"
]}
`
}
>
<
/Form.Control
>
{
`
${
sggvalue
[
"
name_sgg
"
]}
`
}
<
/option
>
<
/Form.Group
>
))
<
Button
variant
=
'
light
'
style
=
{
btnstyled2
}
onClick
=
{
!
locCodeShow
&&
handleClickLoc
}
>
확인
<
/Button
>
}
<
/Col
>
<
/Form.Control
>
<
Col
md
=
{
6
}
xs
=
{
4
}
id
=
'
loc-code
'
style
=
{{
<
/Col
>
margin
:
'
5px
'
,
border
:
'
solid
'
,
<
Col
md
=
{
4
}
xs
=
{
4
}
style
=
{{
padding
:
'
2px
'
}}
>
borderColor
:
'
rgb(110, 189, 142)
'
,
<
Form
.
Control
as
=
'
select
'
size
=
"
sm
"
id
=
'
select-emd
'
>
display
:
'
flex
'
,
<
option
selected
disabled
>
읍면동
<
/option
>
justifyContent
:
'
center
'
,
{
padding
:
'
2px
'
,
emdsArray
.
map
((
emdvalue
)
=>
(
// visibility: 'hidden',
<
option
value
=
{
`
${
emdvalue
[
"
code_emd
"
]}
`
}
>
transition
:
'
all 2s
'
{
`
${
emdvalue
[
"
name_emd
"
]}
`
}
}}
>
<
/option
>
지역코드
))
<
/Col
>
}
<
/Form.Control
>
<
/Col
>
<
/Row
>
<
/Form.Group
>
<
/Row
>
<
/Row
>
<
/Form
>
<
/Form
>
<
/Card.Text
>
<
/Card.Text
>
<
Row
className
=
'
d-flex justify-content-center
'
>
<
Button
variant
=
'
light
'
style
=
{
btnstyled2
}
onClick
=
{
handleClickLoc
}
>
확인
<
/Button
>
<
/Row
>
<
/Card
>
<
/Card
>
<
/Row
>
<
/Row
>
...
...
client/src/components/LoginComp.js
View file @
8bcf6e01
...
@@ -26,24 +26,30 @@ function LoginComp() {
...
@@ -26,24 +26,30 @@ function LoginComp() {
padding
:
'
10px
'
padding
:
'
10px
'
}
}
const
[
emailSent
,
setEmailSent
]
=
useState
(
false
)
const
[
emailSent
Alert
,
setEmailSent
Alert
]
=
useState
(
false
)
const
[
alertShow
,
setAlertShow
]
=
useState
(
tru
e
)
const
[
alertShow
,
setAlertShow
]
=
useState
(
fals
e
)
function
CheckEmailSend
()
{
const
[
emailAddress
,
setEmailAddress
]
=
useState
(
''
)
setEmailSent
(
!
emailSent
)
function
CheckEmailSend
()
{
localStorage
.
setItem
(
'
login_email_Address
'
,
emailAddress
)
const
emailIs
=
localStorage
.
getItem
(
'
login_email_Address
'
).
split
(
'
@
'
)[
1
]
if
(
emailIs
)
{
setAlertShow
(
true
)
setEmailSentAlert
(
false
)
}
else
{
setAlertShow
(
true
)
setEmailSentAlert
(
true
)
}
}
}
function
addressUrl
()
{
function
addressUrl
()
{
localStorage
.
setItem
(
'
Email-Address
'
,
emailAddress
)
const
afterAt
=
localStorage
.
getItem
(
'
login_email_Address
'
).
split
(
'
@
'
)[
1
]
const
afterAt
=
localStorage
.
getItem
(
'
Email-Address
'
).
split
(
'
@
'
)[
1
]
console
.
log
(
afterAt
)
const
newLink
=
'
https://www.
'
+
afterAt
;
const
newLink
=
'
https://www.
'
+
afterAt
;
window
.
open
(
newLink
);
window
.
open
(
newLink
);
}
}
const
[
emailAddress
,
setEmailAddress
]
=
useState
(
''
)
function
handleChange
(
event
)
{
function
handleChange
(
event
)
{
setEmailAddress
(
event
.
target
.
value
)
setEmailAddress
(
event
.
target
.
value
)
console
.
log
(
emailAddress
)
console
.
log
(
emailAddress
)
...
@@ -61,7 +67,7 @@ function LoginComp() {
...
@@ -61,7 +67,7 @@ function LoginComp() {
<
hr
/>
<
hr
/>
<
Card
.
Text
>
<
Card
.
Text
>
<
Row
className
=
'
m-auto d-flex justify-content-center
'
style
=
{{
width
:
'
80%
'
}}
>
<
Row
className
=
'
m-auto d-flex justify-content-center
'
style
=
{{
width
:
'
80%
'
}}
>
{
!
emailSent
?
{
!
emailSent
Alert
?
<
Alert
show
=
{
alertShow
}
variant
=
{
'
success
'
}
>
<
Alert
show
=
{
alertShow
}
variant
=
{
'
success
'
}
>
<
Col
>
<
Col
>
😍
이메일
전송이
완료
되었습니다
.
😍
이메일
전송이
완료
되었습니다
.
...
@@ -80,18 +86,15 @@ function LoginComp() {
...
@@ -80,18 +86,15 @@ function LoginComp() {
<
/Alert.Link
>
<
/Alert.Link
>
<
/Alert
>
<
/Alert
>
}
}
<
Button
onClick
=
{()
=>
setAlertShow
(
true
)}
>
보여주고
<
/Button
>
<
Button
onClick
=
{()
=>
setAlertShow
(
false
)}
>
안보여주고
<
/Button
>
<
/Row
>
<
/Row
>
<
Form
style
=
{
inboxstyled
}
>
<
Form
style
=
{
inboxstyled
}
>
<
Form
.
Group
controlId
=
"
formBasicEmail
"
>
<
Form
.
Group
controlId
=
"
formBasicEmail
"
>
<
Form
.
Control
type
=
"
email
"
placeholder
=
"
Email
"
onChange
=
{
handleChange
}
/
>
<
Form
.
Control
type
=
"
email
"
placeholder
=
"
Email
"
onChange
=
{
handleChange
}
/
>
<
/Form.Group
>
<
/Form.Group
>
<
Button
variant
=
'
light
'
id
=
'
formbtn
'
onClick
=
{
CheckEmailSend
}
>
<
Button
variant
=
'
light
'
className
=
'
mt-3
'
id
=
'
formbtn
'
onClick
=
{
CheckEmailSend
}
>
LOGIN
LOGIN
<
/Button
>
<
/Button
>
<
/Form
>
<
/Form
>
<
Row
className
=
'
d-flex align-items-center m-2
'
>
<
Row
className
=
'
d-flex align-items-center m-2
'
>
...
...
client/src/components/MainLayer.js
View file @
8bcf6e01
import
React
from
'
react
'
import
React
,
{
useEffect
,
useState
}
from
'
react
'
import
{
Button
,
Image
,
Row
,
ButtonGroup
,
}
from
'
react-bootstrap
'
;
import
{
Button
,
Image
,
Row
,
ButtonGroup
,
Form
,
Col
}
from
'
react-bootstrap
'
;
import
{
Link
}
from
'
react-router-dom
'
;
import
{
Link
}
from
'
react-router-dom
'
;
import
'
../App.css
'
import
'
../App.css
'
import
LocalCode
from
'
../components/LocalCode
'
;
import
UserInfo
from
'
./UserInfo
'
;
import
{
kakaoLogout
}
from
'
../utils/Oauth
'
;
import
{
kakaoLogout
}
from
'
../utils/Oauth
'
;
...
@@ -36,9 +36,15 @@ function MainLayer() {
...
@@ -36,9 +36,15 @@ function MainLayer() {
const
logined
=
localStorage
.
getItem
(
'
nickname
'
)
const
logined
=
localStorage
.
getItem
(
'
nickname
'
)
const
[
airUsing
,
setAirUsing
]
=
useState
(
false
)
function
aircondiCheck
()
{
setAirUsing
(
!
airUsing
)
localStorage
.
setItem
(
'
using-aircondition
'
,
!
airUsing
);
}
return
(
return
(
<>
<
Col
>
<
Row
className
=
'
d-flex align-items-center m-auto w-100
'
>
<
Row
className
=
'
d-flex align-items-center m-auto w-100
'
>
<
Link
to
=
'
/
'
className
=
'
m-auto
'
>
<
Link
to
=
'
/
'
className
=
'
m-auto
'
>
<
Image
src
=
'
/images/EUE11.jpg
'
alt
=
'
EUE
'
style
=
{
boxstyled
}
/
>
<
Image
src
=
'
/images/EUE11.jpg
'
alt
=
'
EUE
'
style
=
{
boxstyled
}
/
>
...
@@ -46,8 +52,18 @@ function MainLayer() {
...
@@ -46,8 +52,18 @@ function MainLayer() {
<
/Row
>
<
/Row
>
<
Row
className
=
'
m-auto d-flex justify-content-center w-100
'
>
<
Row
className
=
'
m-auto d-flex justify-content-center w-100
'
>
<
LocalCode
/>
<
UserInfo
/>
<
/Row
>
<
/Row
>
<
Form
key
=
'
checkbox
'
className
=
"
d-flex justify-content-center w-100
"
style
=
{{
flexDirection
:
'
row-reverse
'
}}
>
<
Form
.
Check
type
=
'
switch
'
id
=
'
aircondition-checkbox
'
label
=
'
에어컨 사용중
'
onChange
=
{
aircondiCheck
}
/
>
<
/Form
>
<
Row
className
=
'
d-flex justify-content-center align-items-center my-2 mx-auto w-100
'
>
<
Row
className
=
'
d-flex justify-content-center align-items-center my-2 mx-auto w-100
'
>
<
ButtonGroup
vertical
className
=
'
m-auto
'
style
=
{{
width
:
'
100%
'
,
flexDirection
:
'
column
'
}}
>
<
ButtonGroup
vertical
className
=
'
m-auto
'
style
=
{{
width
:
'
100%
'
,
flexDirection
:
'
column
'
}}
>
{
logined
?
{
logined
?
...
@@ -76,7 +92,7 @@ function MainLayer() {
...
@@ -76,7 +92,7 @@ function MainLayer() {
<
Row
className
=
'
m-auto justify-content-center w-100
'
id
=
'
contour
'
>
<
Row
className
=
'
m-auto justify-content-center w-100
'
id
=
'
contour
'
>
|
|
<
/Row
>
<
/Row
>
<
/
>
<
/
Col
>
);
);
}
}
...
...
client/src/components/PageNotFound.js
0 → 100644
View file @
8bcf6e01
import
React
,
{
useEffect
}
from
'
react
'
import
{
Row
,
Container
}
from
'
react-bootstrap
'
;
import
{
Redirect
}
from
'
react-router-dom
'
;
import
Loading
from
'
./Loading
'
;
// const goHome = setTimeout(window.location.replace('/'), 3000);
function
PageNotFound
()
{
useEffect
(()
=>
{
setTimeout
(
window
.
location
.
replace
(
'
/
'
),
5000
);
},
[])
return
(
<
Container
className
=
'
d-flex justify-content-center align-items-center
'
style
=
{{
flexDirection
:
'
column
'
,
height
:
'
70vh
'
}}
>
<
Row
style
=
{{
marginBottom
:
'
1em
'
,
fontSize
:
'
2rem
'
,
fontWeight
:
'
bold
'
}}
>
잘못된
접근
입니다
.
<
br
/>
PAGE
NOT
FOUND
<
/Row
>
<
Row
>
<
Loading
/>
<
/Row
>
<
/Container
>
)
}
export
default
PageNotFound
;
\ No newline at end of file
client/src/components/SignupComp.js
View file @
8bcf6e01
...
@@ -27,16 +27,40 @@ function SignupComp() {
...
@@ -27,16 +27,40 @@ function SignupComp() {
}
}
const
initValues
=
{
const
initValues
=
{
email
:
''
,
name
:
''
,
name
:
''
email
:
''
}
}
const
[
formValues
,
setFormValues
]
=
useState
(
initValues
)
const
[
formValues
,
setFormValues
]
=
useState
(
initValues
)
const
[
validated
,
setValidated
]
=
useState
(
false
)
const
[
validated
,
setValidated
]
=
useState
(
false
)
const
[
emailSubm
,
setEmailSubm
]
=
useState
(
false
)
const
[
userExist
,
setUserExist
]
=
useState
(
false
)
const
[
alertShow
,
setAlertShow
]
=
useState
(
false
)
function
handleChange
(
event
)
{
function
handleChange
(
event
)
{
const
{
name
,
value
}
=
event
.
target
const
{
name
,
value
}
=
event
.
target
setFormValues
({
...
formValues
,
[
name
]:
value
})
setFormValues
({
...
formValues
,
[
name
]:
value
})
console
.
log
(
'
???
'
,
formValues
)
}
function
CheckUserExist
()
{
localStorage
.
setItem
(
'
signup_username
'
,
formValues
.
name
)
localStorage
.
setItem
(
'
signup_email_Address
'
,
formValues
.
email
)
const
signUser
=
localStorage
.
getItem
(
'
signup_username
'
)
const
signEmail
=
localStorage
.
getItem
(
'
signup_email_Address
'
).
split
(
'
@
'
)[
1
]
if
(
signEmail
&&
signUser
)
{
setAlertShow
(
true
)
setUserExist
(
!
userExist
)
}
else
if
(
!
signEmail
)
{
setAlertShow
(
false
)
// setUserExist(true)
}
}
}
function
handleSubmit
(
event
)
{
function
handleSubmit
(
event
)
{
...
@@ -55,7 +79,6 @@ function SignupComp() {
...
@@ -55,7 +79,6 @@ function SignupComp() {
// setFormError(validate(formValues))
// setFormError(validate(formValues))
// setIsSubmit(true)
// setIsSubmit(true)
}
}
const
[
emailSubm
,
setEmailSubm
]
=
useState
(
false
)
function
handleClickSubm
()
{
function
handleClickSubm
()
{
// setEmailSubm(true);
// setEmailSubm(true);
...
@@ -66,12 +89,6 @@ function SignupComp() {
...
@@ -66,12 +89,6 @@ function SignupComp() {
}
}
const
[
userExist
,
setUserExist
]
=
useState
(
false
)
const
[
alertShow
,
setAlertShow
]
=
useState
(
true
)
function
CheckUserExist
()
{
setUserExist
(
!
userExist
)
}
return
(
return
(
...
@@ -106,13 +123,11 @@ function SignupComp() {
...
@@ -106,13 +123,11 @@ function SignupComp() {
<
/Alert.Link
>
<
/Alert.Link
>
<
/Alert
>
<
/Alert
>
}
}
<
Button
onClick
=
{()
=>
setAlertShow
(
true
)}
>
보여주고
<
/Button
>
<
Button
onClick
=
{()
=>
setAlertShow
(
false
)}
>
안보여주고
<
/Button
>
<
/Row
>
<
/Row
>
<
Form
style
=
{
inboxstyled
}
<
Form
style
=
{
inboxstyled
}
onSubmit
=
{
handleSubmit
}
>
onSubmit
=
{
handleSubmit
}
>
<
Form
.
Group
controlId
=
"
user
Email
"
>
<
Form
.
Group
controlId
=
"
user
name
"
>
<
Row
className
=
'
m-auto mb-1 d-flex justify-content-center
'
>
<
Row
className
=
'
m-auto mb-1 d-flex justify-content-center
'
>
<
Form
.
Control
<
Form
.
Control
type
=
"
text
"
type
=
"
text
"
...
@@ -138,8 +153,8 @@ function SignupComp() {
...
@@ -138,8 +153,8 @@ function SignupComp() {
<
/Row
>
<
/Row
>
<
/Form.Group
>
<
/Form.Group
>
<
Button
variant
=
'
light
'
className
=
'
mt-
2
'
id
=
'
formbtn
'
onClick
=
{
CheckUserExist
}
>
<
Button
variant
=
'
light
'
className
=
'
mt-
3
'
id
=
'
formbtn
'
onClick
=
{
CheckUserExist
}
>
{
/* type="submit" */
}
{
/* type="submit" */
}
Sign
Up
Sign
Up
<
/Button
>
<
/Button
>
<
/Form
>
<
/Form
>
...
...
client/src/components/
LocalCode
.js
→
client/src/components/
UserInfo
.js
View file @
8bcf6e01
import
React
,
{
useState
}
from
'
react
'
import
React
,
{
useState
}
from
'
react
'
import
{
Row
,
Card
,
Button
,
Col
,
Modal
}
from
'
react-bootstrap
'
;
import
{
Row
,
Card
,
Button
,
Col
,
Modal
}
from
'
react-bootstrap
'
;
// import db from "../db/index"
import
'
../App.css
'
import
'
../App.css
'
import
{
Link
}
from
'
react-router-dom
'
;
import
{
Link
}
from
'
react-router-dom
'
;
function
LocalCode
()
{
function
UserInfo
()
{
const
logined
=
localStorage
.
getItem
(
'
nickname
'
)
const
nickname
=
localStorage
.
getItem
(
'
nickname
'
)
const
localname_doe
=
localStorage
.
getItem
(
'
name_doe
'
)
const
localname_sgg
=
localStorage
.
getItem
(
'
name_sgg
'
)
const
localname_emd
=
localStorage
.
getItem
(
'
name_emd
'
)
const
cardstyled
=
{
const
cardstyled
=
{
margin
:
'
auto
'
,
margin
:
'
auto
'
,
...
@@ -18,25 +20,29 @@ function LocalCode() {
...
@@ -18,25 +20,29 @@ function LocalCode() {
borderWidth
:
'
3px
'
,
borderWidth
:
'
3px
'
,
borderRadius
:
'
20px
'
,
borderRadius
:
'
20px
'
,
borderColor
:
'
rgba(195, 195, 195, 0.753)
'
,
borderColor
:
'
rgba(195, 195, 195, 0.753)
'
,
color
:
'
rgb(110, 189, 142)
'
// color: '#04AB70'
color
:
'
rgb(110, 189, 142)
'
,
}
}
const
btnstyled2
=
{
const
btnstyled2
=
{
background
:
'
white
'
,
background
:
'
white
'
,
margin
:
'
auto
'
,
margin
:
'
auto
'
,
borderWidth
:
'
2px
'
,
borderWidth
:
'
2px
'
,
fontSize
:
'
0.5em
'
,
// padding: '0',
fontSize
:
'
0.7em
'
,
color
:
'
rgb(110, 189, 142)
'
,
color
:
'
rgb(110, 189, 142)
'
,
borderColor
:
'
rgba(195, 195, 195, 0.753)
'
,
borderColor
:
'
rgba(195, 195, 195, 0.753)
'
,
borderRadius
:
'
20px
'
,
// borderRadius: '20px',
width
:
'
50%
'
}
}
const
[
localChange
,
setLocalChange
]
=
useState
(
false
)
const
nickname
=
localStorage
.
getItem
(
'
nickname
'
)
return
(
return
(
<>
<
Row
>
<
Col
className
=
'
text-center pt-3 pb-2 px-0
'
>
<
Col
className
=
'
text-center pt-3 pb-2 px-0
'
>
<
Card
style
=
{
cardstyled
}
id
=
'
localName
'
>
<
Card
style
=
{
cardstyled
}
id
=
'
localName
'
>
<
Card
.
Title
>
<
Card
.
Title
>
{
logined
?
{
nickname
?
`
${
nickname
}
`
`
${
nickname
}
`
:
:
<>
<>
...
@@ -44,37 +50,31 @@ function LocalCode() {
...
@@ -44,37 +50,31 @@ function LocalCode() {
<
/
>
<
/
>
},
환영합니다
.
},
환영합니다
.
<
/Card.Title
>
<
/Card.Title
>
<
Row
style
=
{{
alignItems
:
'
center
'
,
margin
:
'
auto
'
,
whiteSpace
:
'
nowrap
'
}}
>
<
Row
style
=
{{
alignItems
:
'
center
'
,
margin
:
'
auto
'
,
justifyContent
:
'
center
'
}}
>
<
Card
.
Subtitle
>
<
Card
.
Subtitle
>
지역코드
{
localname_emd
?
`
${
localname_doe
}
${
localname_sgg
}
${
localname_emd
}
`
:
<>
지역을
입력해
주세요
<
/
>
}
<
/Card.Subtitle
>
<
/Card.Subtitle
>
{
logined
&&
{
nickname
&&
<
Button
variant
=
'
light
'
className
=
'
m
l-1
'
style
=
{
btnstyled2
}
>
<
Button
variant
=
'
light
'
className
=
'
m
-auto d-flex
'
style
=
{
btnstyled2
}
>
<
Link
to
=
'
/local_code
'
style
=
{{
textDecoration
:
'
none
'
,
color
:
'
rgb(110, 189, 142)
'
}}
>
<
Link
to
=
'
/local_code
'
className
=
'
w-100
'
style
=
{{
textDecoration
:
'
none
'
,
color
:
'
rgb(110, 189, 142)
'
}}
>
변경
변경
<
/Link
>
<
/Link
>
<
/Button
>
<
/Button
>
}
}
<
/Row
>
<
/Row
>
<
Modal
<
hr
/>
show
=
{
localChange
}
onHide
=
{()
=>
setLocalChange
(
false
)}
>
<
Modal
.
Header
className
=
'
d-block text-center
'
>
<
Modal
.
Title
>
마이페이지
<
/Modal.Title
>
<
/Modal.Header
>
<
Modal
.
Body
>
지역이름
(
지역코드
)
<
/Modal.Body
>
<
/Modal
>
환경을
향한
노력
<
br
/>
환경을
향한
노력
<
br
/>
<
strong
>
OOO
일
째
<
/strong
>
<
strong
>
OOO
일
째
<
/strong
>
<
/Card
>
<
/Card
>
<
/Col
>
<
/Col
>
<
/
>
<
/
Row
>
)
)
}
}
export
default
LocalCode
;
export
default
UserInfo
;
\ No newline at end of file
\ No newline at end of file
client/src/pages/Home.js
View file @
8bcf6e01
...
@@ -50,15 +50,11 @@ function Home() {
...
@@ -50,15 +50,11 @@ function Home() {
<
/Col
>
<
/Col
>
<
Col
md
=
{
6
}
style
=
{
col2sty
}
>
<
Col
md
=
{
6
}
style
=
{
col2sty
}
>
<
Row
style
=
{
constyled
}
className
=
'
d-flex mb-2 w-100
'
>
{
/* <TimeNow /> */
}
{
/* <TimeNow /> */
}
<
EueSuggest
/>
<
EueSuggest
/>
<
ChartLine
/>
<
ChartLine
/>
<
ChartDoughnut
/>
<
ChartDoughnut
/>
<
Footer
/>
<
Footer
/>
<
/Row
>
<
/Col
>
<
/Col
>
<
/Row
>
<
/Row
>
<
/Container
>
<
/Container
>
...
...
client/src/pages/LocalCodePage.js
View file @
8bcf6e01
...
@@ -37,10 +37,7 @@ function SignupPage() {
...
@@ -37,10 +37,7 @@ function SignupPage() {
<
/Col
>
<
/Col
>
<
Col
md
=
{
6
}
style
=
{
col2sty
}
>
<
Col
md
=
{
6
}
style
=
{
col2sty
}
>
<
Row
style
=
{
constyled
}
className
=
'
d-flex mb-2 w-100
'
>
<
LocCodeChange
/>
<
LocCodeChange
/>
<
/Row
>
<
/Col
>
<
/Col
>
<
/Row
>
<
/Row
>
<
/Container
>
<
/Container
>
...
...
client/src/pages/LoginPage.js
View file @
8bcf6e01
...
@@ -38,9 +38,7 @@ function SignupPage() {
...
@@ -38,9 +38,7 @@ function SignupPage() {
<
Col
md
=
{
6
}
style
=
{
col2sty
}
>
<
Col
md
=
{
6
}
style
=
{
col2sty
}
>
<
Row
style
=
{
constyled
}
className
=
'
d-flex mb-2 w-100
'
>
<
LoginComp
/>
<
LoginComp
/>
<
/Row
>
<
/Col
>
<
/Col
>
<
/Row
>
<
/Row
>
<
/Container
>
<
/Container
>
...
...
client/src/pages/SignupPage.js
View file @
8bcf6e01
...
@@ -37,10 +37,7 @@ function SignupPage() {
...
@@ -37,10 +37,7 @@ function SignupPage() {
<
/Col
>
<
/Col
>
<
Col
md
=
{
6
}
style
=
{
col2sty
}
>
<
Col
md
=
{
6
}
style
=
{
col2sty
}
>
<
SignupComp
/>
<
Row
style
=
{
constyled
}
className
=
'
d-flex mb-2 w-100
'
>
<
SignupComp
/>
<
/Row
>
<
/Col
>
<
/Col
>
<
/Row
>
<
/Row
>
<
/Container
>
<
/Container
>
...
...
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