diff --git a/src/App.tsx b/src/App.tsx index d9411a2..3daa316 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -73,7 +73,7 @@ const App = () => { > {/* 1. 로그인 여부와 관계없이 항상 독립적으로 표시되는 페이지 */} - } /> + } /> } /> } /> diff --git a/src/services/adminMemberService.ts b/src/services/adminMemberService.ts index 1dd97a8..3b9726e 100644 --- a/src/services/adminMemberService.ts +++ b/src/services/adminMemberService.ts @@ -62,3 +62,9 @@ export const deleteAdminMember = async (memberSeq: number): Promise('/admin/member/delete', { memberSeq }); return response.data; }; + +// 회원 가입 (비로그인 상태에서 회원가입) +export const registerAdminMember = async (member: Partial): Promise => { + const response = await axios.post('/admin/member/register', member); + return response.data; +}; diff --git a/src/views/pages/login/Login.tsx b/src/views/pages/login/Login.tsx index bacd24b..71a5b65 100644 --- a/src/views/pages/login/Login.tsx +++ b/src/views/pages/login/Login.tsx @@ -53,7 +53,11 @@ const Login = () => { setError('쿠키에서 accessToken을 찾을 수 없습니다.'); } } else { - setError(response.resultMessage || '로그인에 실패했습니다.'); + let errorMsg = response.resultMessage || '로그인에 실패했습니다.' + if (response.resultData && typeof response.resultData === 'string') { + errorMsg += `\n${response.resultData}` + } + setError(errorMsg) } } catch (err: any) { setError(err.response?.data?.message || '로그인 중 오류가 발생했습니다.'); @@ -65,16 +69,16 @@ const Login = () => { return (
- + - +

Login

Sign In to your account

- {error &&
{error}
} + {error &&
{error}
} @@ -108,16 +112,19 @@ const Login = () => {
- +
-

Sign up

+

가입신청

+

- 신규 사용자의 경우, 가입신청 후 권한을 부여받아야 접속 가능합니다. + 신규 어드민 회원은
+ 가입신청 후 권한을 부여받아야
+ 접속 가능합니다.

- + - Register Now! + 어드민 회원가입 신청
diff --git a/src/views/pages/register/Register.tsx b/src/views/pages/register/Register.tsx index d78b24c..12d1d97 100644 --- a/src/views/pages/register/Register.tsx +++ b/src/views/pages/register/Register.tsx @@ -1,71 +1,174 @@ -import React from 'react' +import React, { useState, useEffect } from 'react' +import { useNavigate, Link } from 'react-router-dom' import { - CButton, - CCard, - CCardBody, - CCol, - CContainer, - CForm, - CFormInput, - CInputGroup, - CInputGroupText, - CRow, + CButton, + CCard, + CCardBody, + CCol, + CContainer, + CForm, + CFormInput, + CFormLabel, + CRow, + CSpinner, } from '@coreui/react' -import CIcon from '@coreui/icons-react' -import { cilLockLocked, cilUser } from '@coreui/icons' +import { registerAdminMember } from 'src/services/adminMemberService' +import { logout } from 'src/axios/authService' const Register = () => { - return ( -
- - - - - - -

Register

-

Create your account

- - - - - - - - @ - - - - - - - - - - - - - - -
- Create Account -
-
-
-
-
-
-
-
- ) + const navigate = useNavigate() + const [loading, setLoading] = useState(false) + + // 회원가입 페이지 진입 시 기존 토큰 제거 + useEffect(() => { + logout() + }, []) + const [formData, setFormData] = useState({ + memberId: '', + memberName: '', + password: '', + passwordConfirm: '', + }) + + const handleInputChange = (e: React.ChangeEvent) => { + const { name, value } = e.target + setFormData(prev => ({ + ...prev, + [name]: value, + })) + } + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault() + + // 유효성 검사 + if (!formData.memberId.trim()) { + alert('어드민 회원 ID를 입력해주세요.') + return + } + if (!formData.memberName.trim()) { + alert('이름을 입력해주세요.') + return + } + if (!formData.password) { + alert('비밀번호를 입력해주세요.') + return + } + if (formData.password !== formData.passwordConfirm) { + alert('비밀번호가 일치하지 않습니다.') + return + } + + setLoading(true) + try { + const response = await registerAdminMember({ + memberId: formData.memberId, + memberName: formData.memberName, + password: formData.password, + }) + + if (response.resultCode === '200') { + alert('회원가입이 완료되었습니다. 관리자 승인 후 로그인이 가능합니다.') + navigate('/login') + } else { + alert(response.resultMessage || '회원가입에 실패했습니다.') + } + } catch (error) { + console.error('회원가입 실패:', error) + alert('회원가입에 실패했습니다.') + } finally { + setLoading(false) + } + } + + return ( +
+ + + + + + +

어드민 회원가입

+

어드민 계정을 생성합니다

+ +
+ 어드민 회원 ID * + +
+ +
+ 이름 * + +
+ +
+ 비밀번호 * + +
+ +
+ 비밀번호 확인 * + +
+ +
+ + {loading ? ( + <> + + 가입 중... + + ) : ( + '회원가입' + )} + +
+ +
+ 이미 계정이 있으신가요? + 로그인 +
+
+
+
+
+
+
+
+ ) } export default Register