diff --git a/.cursor/commands/ck.md b/.cursor/commands/ck.md new file mode 100644 index 0000000..1b284f0 --- /dev/null +++ b/.cursor/commands/ck.md @@ -0,0 +1,2 @@ +방금 수행한 작업 체크 +ㄴ \ No newline at end of file diff --git a/.cursor/commands/cm.md b/.cursor/commands/cm.md new file mode 100644 index 0000000..5f0589d --- /dev/null +++ b/.cursor/commands/cm.md @@ -0,0 +1 @@ +지금 수행한 작업 메시지 넣고 커밋s \ No newline at end of file diff --git a/.cursor/commands/n.md b/.cursor/commands/n.md index f81cc69..b96079d 100644 --- a/.cursor/commands/n.md +++ b/.cursor/commands/n.md @@ -1 +1 @@ -안녕? \ No newline at end of file +다음 작업 수행 \ No newline at end of file diff --git a/.cursor/work/loginpagework.md b/.cursor/work/loginpagework.md index 04faf69..2327f7c 100644 --- a/.cursor/work/loginpagework.md +++ b/.cursor/work/loginpagework.md @@ -1,11 +1,4 @@ # 로그인 페이지 작업 리스트 0. [x] 로그인 페이지 생성 - 레이아웃 중앙 정렬 설정 - 상단 로고 추가 - 아이디 입력폼 추가 - 한행에 아이디 기억하기 체크박스 추가 - 한행에 자동로그인 체크박스 추가 - 로그인 버튼 추가 - 한행으로 회원가입 버튼, 아이디찾기 버튼, 비밀번호 재설정 버튼 추가 - 최하단에 카피라이트 추가 - +1. [ ] dffd +2. [ ] df df diff --git a/.cursor/work/mainpagework.md b/.cursor/work/mainpagework.md new file mode 100644 index 0000000..e69de29 diff --git a/app/globals.css b/app/globals.css index b21a3c0..a22f322 100644 --- a/app/globals.css +++ b/app/globals.css @@ -3,11 +3,23 @@ :root { --background: #ffffff; --foreground: #171717; + + /* 테마 컬러 */ + --color-primary: #3b82f6; /* Primary - 파란색 (메인 액션) */ + --color-secondary: #8b5cf6; /* Secondary - 보라색 (보조 액션) */ + --color-success: #10b981; /* Success - 초록색 (성공 상태) */ + --color-error: #ef4444; /* Error - 빨간색 (에러/경고) */ + --color-neutral: #6b7280; /* Neutral - 회색 (중립/보조) */ } @theme inline { --color-background: var(--background); --color-foreground: var(--foreground); + --color-primary: var(--color-primary); + --color-secondary: var(--color-secondary); + --color-success: var(--color-success); + --color-error: var(--color-error); + --color-neutral: var(--color-neutral); --font-sans: var(--font-geist-sans); --font-mono: var(--font-geist-mono); } diff --git a/app/register/page.tsx b/app/register/page.tsx new file mode 100644 index 0000000..9a8a93f --- /dev/null +++ b/app/register/page.tsx @@ -0,0 +1,316 @@ +'use client'; + +import { useState } from 'react'; +import Link from 'next/link'; + +export default function RegisterPage() { + const [formData, setFormData] = useState({ + name: '', + email: '', + password: '', + passwordConfirm: '', + phone: '', + }); + + const [errors, setErrors] = useState({ + name: '', + email: '', + password: '', + passwordConfirm: '', + phone: '', + }); + + // 입력 필드 변경 핸들러 + const handleChange = (e: React.ChangeEvent) => { + const { name, value } = e.target; + setFormData((prev) => ({ + ...prev, + [name]: value, + })); + // 에러 초기화 + if (errors[name as keyof typeof errors]) { + setErrors((prev) => ({ + ...prev, + [name]: '', + })); + } + }; + + // 이메일 유효성 검사 + const validateEmail = (email: string) => { + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + return emailRegex.test(email); + }; + + // 비밀번호 유효성 검사 (최소 8자, 영문/숫자 조합) + const validatePassword = (password: string) => { + return password.length >= 8 && /[a-zA-Z]/.test(password) && /[0-9]/.test(password); + }; + + // 전화번호 유효성 검사 + const validatePhone = (phone: string) => { + if (phone === '') return true; // 선택 항목 + const phoneRegex = /^010-\d{4}-\d{4}$/; + return phoneRegex.test(phone); + }; + + // 폼 제출 전 유효성 검사 + const validateForm = () => { + const newErrors = { + name: '', + email: '', + password: '', + passwordConfirm: '', + phone: '', + }; + + let isValid = true; + + // 이름 검사 + if (formData.name.trim() === '') { + newErrors.name = '이름을 입력해주세요.'; + isValid = false; + } + + // 이메일 검사 + if (formData.email.trim() === '') { + newErrors.email = '이메일을 입력해주세요.'; + isValid = false; + } else if (!validateEmail(formData.email)) { + newErrors.email = '올바른 이메일 형식이 아닙니다.'; + isValid = false; + } + + // 비밀번호 검사 + if (formData.password === '') { + newErrors.password = '비밀번호를 입력해주세요.'; + isValid = false; + } else if (!validatePassword(formData.password)) { + newErrors.password = '비밀번호는 8자 이상, 영문과 숫자를 포함해야 합니다.'; + isValid = false; + } + + // 비밀번호 확인 검사 + if (formData.passwordConfirm === '') { + newErrors.passwordConfirm = '비밀번호 확인을 입력해주세요.'; + isValid = false; + } else if (formData.password !== formData.passwordConfirm) { + newErrors.passwordConfirm = '비밀번호가 일치하지 않습니다.'; + isValid = false; + } + + // 전화번호 검사 (선택 항목) + if (formData.phone && !validatePhone(formData.phone)) { + newErrors.phone = '올바른 전화번호 형식이 아닙니다. (예: 010-1234-5678)'; + isValid = false; + } + + setErrors(newErrors); + return isValid; + }; + + // 전화번호 자동 포맷팅 + const handlePhoneChange = (e: React.ChangeEvent) => { + let value = e.target.value.replace(/[^\d]/g, ''); + if (value.length > 11) value = value.slice(0, 11); + + if (value.length > 7) { + value = value.slice(0, 3) + '-' + value.slice(3, 7) + '-' + value.slice(7); + } else if (value.length > 3) { + value = value.slice(0, 3) + '-' + value.slice(3); + } + + setFormData((prev) => ({ + ...prev, + phone: value, + })); + }; + + // 폼 제출 핸들러 + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + if (validateForm()) { + // 회원가입 완료 페이지로 이동 + // 실제로는 API 호출을 하여 회원가입 처리를 해야 합니다 + window.location.href = '/registercomplete'; + } + }; + + // 필수 항목 입력 여부 확인 + const canProceed = + formData.name.trim() !== '' && + formData.email.trim() !== '' && + formData.password !== '' && + formData.passwordConfirm !== ''; + + return ( +
+
+ {/* 회원가입 카드 */} +
+ {/* 제목 */} +

회원가입

+ + {/* 단계 표시 */} +
+
+ 01 약관 동의 + > + + 02 회원정보입력 + + > + 03 회원가입완료 +
+
+ + {/* 회원정보 입력 폼 */} +
+ {/* 이름 */} +
+ + + {errors.name && ( +

{errors.name}

+ )} +
+ + {/* 이메일 */} +
+ + + {errors.email && ( +

{errors.email}

+ )} +
+ + {/* 비밀번호 */} +
+ + + {errors.password && ( +

{errors.password}

+ )} +
+ + {/* 비밀번호 확인 */} +
+ + + {errors.passwordConfirm && ( +

{errors.passwordConfirm}

+ )} +
+ + {/* 전화번호 */} +
+ + + {errors.phone && ( +

{errors.phone}

+ )} +
+ + {/* 버튼 영역 */} +
+ + 이전 단계 + + +
+
+
+ + {/* 카피라이트 */} +
+ Copyright © 2025 XL LMS. All rights reserved +
+
+
+ ); +} + diff --git a/app/registeragreement/page.tsx b/app/registeragreement/page.tsx index b83fc1a..9bc534d 100644 --- a/app/registeragreement/page.tsx +++ b/app/registeragreement/page.tsx @@ -147,16 +147,17 @@ export default function RegisterAgreementPage() { > 돌아가기 - + diff --git a/app/registercomplete/page.tsx b/app/registercomplete/page.tsx new file mode 100644 index 0000000..62b19bb --- /dev/null +++ b/app/registercomplete/page.tsx @@ -0,0 +1,84 @@ +'use client'; + +import Link from 'next/link'; + +export default function RegisterCompletePage() { + return ( +
+
+ {/* 회원가입 완료 카드 */} +
+ {/* 제목 */} +

회원가입

+ + {/* 단계 표시 */} +
+
+ 01 약관 동의 + > + 02 회원정보입력 + > + + 03 회원가입완료 + +
+
+ + {/* 완료 메시지 */} +
+ {/* 체크 아이콘 */} +
+
+ + + +
+
+ + {/* 완료 메시지 */} +

+ 회원가입이 완료되었습니다! +

+

+ XL LMS에 오신 것을 환영합니다. +
+ 이제 다양한 강의를 수강하실 수 있습니다. +

+ + {/* 버튼 영역 */} +
+ + 로그인하기 + + + 홈으로 가기 + +
+
+
+ + {/* 카피라이트 */} +
+ Copyright © 2025 XL LMS. All rights reserved +
+
+
+ ); +} +