Skip to content

Commit 6901c7e

Browse files
committed
회원가입, 로그인 연결
1 parent ab83cea commit 6901c7e

2 files changed

Lines changed: 106 additions & 14 deletions

File tree

src/components/login/Login.jsx

Lines changed: 52 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,62 @@
1-
// src/components/Login.jsx
2-
import React from 'react';
3-
import './Login.css'; // CSS 파일 import
1+
import React, { useState } from 'react';
2+
import axios from 'axios';
3+
import './Login.css';
44

55
function Login() {
6+
const [formData, setFormData] = useState({
7+
username: '',
8+
password: '',
9+
});
10+
11+
const handleChange = (e) => {
12+
setFormData({
13+
...formData,
14+
[e.target.id]: e.target.value
15+
});
16+
};
17+
18+
const handleSubmit = async (e) => {
19+
e.preventDefault();
20+
21+
try {
22+
const response = await axios.post('http://localhost:5000/api/users/login', {
23+
userId: formData.username,
24+
password: formData.password,
25+
});
26+
27+
const { token, name, role, userId } = response.data;
28+
29+
console.log('✅ 로그인 성공:', response.data);
30+
31+
// 토큰 및 사용자 정보 저장 (예: 로컬스토리지)
32+
localStorage.setItem('token', token);
33+
localStorage.setItem('username', name);
34+
localStorage.setItem('userId', userId);
35+
localStorage.setItem('role', role);
36+
37+
alert('로그인 성공!');
38+
// 페이지 이동 (예: 홈으로)
39+
// window.location.href = '/';
40+
} catch (error) {
41+
console.error('❌ 로그인 실패:', error.response?.data || error.message);
42+
alert(error.response?.data?.message || '로그인에 실패했습니다.');
43+
}
44+
};
45+
646
return (
747
<div className="login-container">
848
<div className="login-box">
949
<h1 className="login-title">로그인</h1>
1050
<p className="login-subtitle">계정에 로그인하여 CodeViz를 시작하세요</p>
11-
<form className="login-form">
51+
52+
<form className="login-form" onSubmit={handleSubmit}>
1253
<label htmlFor="username">아이디</label>
1354
<input
1455
id="username"
1556
type="text"
1657
placeholder="사용자 아이디 입력"
58+
value={formData.username}
59+
onChange={handleChange}
1760
required
1861
/>
1962
<div className="password-container">
@@ -24,14 +67,19 @@ function Login() {
2467
id="password"
2568
type="password"
2669
placeholder="••••••••"
70+
value={formData.password}
71+
onChange={handleChange}
2772
required
2873
/>
74+
2975
<div className="remember-me">
3076
<input type="checkbox" id="remember" />
3177
<label htmlFor="remember">로그인 상태 유지</label>
3278
</div>
79+
3380
<button type="submit">로그인</button>
3481
</form>
82+
3583
<div className="divider">또는 소셜 계정으로 로그인</div>
3684
<div className="social-buttons">
3785
<button disabled>Google</button>

src/components/signup/SignUp.jsx

Lines changed: 54 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,75 @@
1-
// src/components/SignUp.jsx
2-
import React from 'react';
3-
import '../login/Login.css'; // 로그인과 같은 스타일 사용
1+
import React, { useState } from 'react';
2+
import axios from 'axios';
3+
import '../login/Login.css'; // 로그인 스타일 재사용
44

55
function SignUp() {
6+
const [formData, setFormData] = useState({
7+
username: '',
8+
email: '',
9+
password: '',
10+
confirmPassword: '',
11+
name: '',
12+
});
13+
14+
const handleChange = (e) => {
15+
setFormData({
16+
...formData,
17+
[e.target.id]: e.target.value
18+
});
19+
};
20+
21+
const handleSubmit = async (e) => {
22+
e.preventDefault();
23+
24+
if (formData.password !== formData.confirmPassword) {
25+
alert('비밀번호가 일치하지 않습니다.');
26+
return;
27+
}
28+
29+
try {
30+
const response = await axios.post('http://localhost:5000/api/users/signup', {
31+
userId: formData.username,
32+
email: formData.email,
33+
password: formData.password,
34+
name: formData.name,
35+
}, {
36+
headers: {
37+
'Content-Type': 'application/json'
38+
}
39+
});
40+
41+
42+
console.log('회원가입 성공:', response.data);
43+
alert('회원가입이 완료되었습니다!');
44+
} catch (error) {
45+
console.error('회원가입 오류:', error.response?.data || error.message);
46+
alert('회원가입에 실패했습니다.');
47+
}
48+
};
49+
650
return (
751
<div className="login-container">
852
<div className="login-box">
953
<h1 className="login-title">회원가입</h1>
1054
<p className="login-subtitle">CodeViz 계정을 만들고 코드 시각화를 시작하세요</p>
1155

12-
<form className="login-form">
56+
<form className="login-form" onSubmit={handleSubmit}>
1357
<label htmlFor="username">아이디 *</label>
14-
<input id="username" type="text" placeholder="사용할 아이디 입력" required />
58+
<input id="username" type="text" placeholder="사용할 아이디 입력" value={formData.username} onChange={handleChange} required />
1559

1660
<label htmlFor="email">이메일 *</label>
17-
<input id="email" type="email" placeholder="name@example.com" required />
61+
<input id="email" type="email" placeholder="name@example.com" value={formData.email} onChange={handleChange} required />
1862
<small>인증번호를 받을 이메일 주소를 입력해주세요.</small>
1963

2064
<label htmlFor="password">비밀번호 *</label>
21-
<input id="password" type="password" required />
65+
<input id="password" type="password" value={formData.password} onChange={handleChange} required />
2266
<small>비밀번호는 8자 이상이어야 합니다.</small>
2367

24-
<label htmlFor="confirm-password">비밀번호 확인 *</label>
25-
<input id="confirm-password" type="password" required />
68+
<label htmlFor="confirmPassword">비밀번호 확인 *</label>
69+
<input id="confirmPassword" type="password" value={formData.confirmPassword} onChange={handleChange} required />
2670

2771
<label htmlFor="name">이름 *</label>
28-
<input id="name" type="text" placeholder="홍길동" required />
72+
<input id="name" type="text" placeholder="홍길동" value={formData.name} onChange={handleChange} required />
2973

3074
<div className="remember-me">
3175
<input type="checkbox" id="terms" required />

0 commit comments

Comments
 (0)