About Us
-
최고의 IT 교육 플랫폼을 만들어갑니다
우리의 비전
- 실무 중심의 IT 교육을 통해 더 많은 사람들이 디지털 시대의 전문가로
- 성장할 수 있도록 돕고, 글로벌 IT 인재 양성의 허브가 되고자 합니다.
+ 엔지니어에게 필요한 관리 포탈을 만듭니다.
핵심 가치
-
- 실무 중심 교육
+ 시스템 엔지니어를 위한 관리 도구
-
- 최신 기술 트렌드
+ -
-
- 커뮤니티 중심
+ -
@@ -67,9 +65,9 @@ const About = () => {
Contact Us
-
contact@example.com
-
02-1234-5678
-
서울특별시 강남구 테헤란로 123
+
icurfer@gmail.com
+
-
+
-
diff --git a/src/pages/Home.js b/src/pages/Home.js
index 681cf63..d0ae249 100644
--- a/src/pages/Home.js
+++ b/src/pages/Home.js
@@ -25,9 +25,9 @@ const Home = () => {
-
Demo 사이트 입니다.
+
System Management Portal
데모 사이트 입니다.
-
+
diff --git a/src/pages/Login.js b/src/pages/Login.js
index 240e860..de4ff94 100644
--- a/src/pages/Login.js
+++ b/src/pages/Login.js
@@ -1,55 +1,66 @@
// ./src/pages/Login.js
-import React, { useState } from 'react';
-import { useNavigate } from 'react-router-dom';
-import authApi from '../api/authApi';
-import { useAuth } from '../context/AuthContext'; // ✅ 추가: AuthContext 사용
+import React, { useState } from "react";
+import { useNavigate } from "react-router-dom";
+import authApi from "../api/authApi";
+import { useAuth } from "../context/AuthContext"; // ✅ 추가: AuthContext 사용
const Login = () => {
const navigate = useNavigate();
- const { login } = useAuth(); // ✅ 로그인 상태 업데이트 함수
+ const { login } = useAuth(); // ✅ 로그인 상태 업데이트 함수
- const [email, setEmail] = useState('');
- const [password, setPassword] = useState('');
+ const [email, setEmail] = useState("");
+ const [password, setPassword] = useState("");
const handleLogin = async () => {
try {
- const res = await authApi.post('/api/auth/login/', { email, password });
+ const res = await authApi.post("/api/auth/login/", { email, password });
// ✅ localStorage 저장 + 전역 상태 갱신
- login(res.data); // ← access, refresh 포함된 객체
+ login(res.data); // ← access, refresh 포함된 객체
- alert('로그인 성공');
- navigate('/');
+ alert("로그인 성공");
+ navigate("/");
} catch (err) {
- const message = err.response?.data?.detail || '서버 오류';
- alert('로그인 실패: ' + message);
+ const message = err.response?.data?.detail || "서버 오류";
+ alert("로그인 실패: " + message);
}
};
return (
);
diff --git a/src/pages/Register.js b/src/pages/Register.js
new file mode 100644
index 0000000..6647b29
--- /dev/null
+++ b/src/pages/Register.js
@@ -0,0 +1,95 @@
+import React, { useState } from 'react';
+import { useNavigate } from 'react-router-dom';
+import authApi from '../api/authApi';
+
+const Register = () => {
+ const navigate = useNavigate();
+ const [form, setForm] = useState({
+ email: '',
+ name: '',
+ password: '',
+ confirmPassword: ''
+ });
+
+ const handleChange = (e) => {
+ setForm({ ...form, [e.target.name]: e.target.value });
+ };
+
+ const handleSubmit = async (e) => {
+ e.preventDefault();
+
+ if (form.password !== form.confirmPassword) {
+ alert('비밀번호가 일치하지 않습니다.');
+ return;
+ }
+
+ try {
+ await authApi.post('/api/auth/register/', {
+ email: form.email,
+ name: form.name,
+ password: form.password
+ });
+ alert('회원가입 성공! 로그인 해주세요.');
+ navigate('/login');
+ } catch (err) {
+ const msg = err.response?.data?.email?.[0] || err.response?.data?.detail || '회원가입 실패';
+ alert(msg);
+ }
+ };
+
+ return (
+
+
+
+ );
+};
+
+export default Register;
diff --git a/src/utils/jwt.js b/src/utils/jwt.js
new file mode 100644
index 0000000..0d2a5bd
--- /dev/null
+++ b/src/utils/jwt.js
@@ -0,0 +1,10 @@
+// src/utils/jwt.js
+export function decodeToken(token) {
+ try {
+ const base64Url = token.split('.')[1];
+ const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
+ return JSON.parse(atob(base64));
+ } catch (err) {
+ return null;
+ }
+}
diff --git a/version b/version
index 7d6b3eb..429d94a 100644
--- a/version
+++ b/version
@@ -1 +1 @@
-0.0.8
\ No newline at end of file
+0.0.9
\ No newline at end of file