2.1 회원 가입
API
POST /user
JavaScript
복사
method, 전송 url
Req
{
"user": {
"username": String*,
"email": String*,
"password": String*,
"accountname": String*,
"intro": String,
"image": String // 예시) https://mandarin.api.weniv.co.kr/1641906557953.png
}
}
JSON
복사
body(json)
{
"Content-type" : "application/json"
}
JSON
복사
header
•
email, password, accountname, username 은 필수로 작성해야 합니다.
•
email은 이메일 형식에 맞게 작성해야 합니다.
•
accountname은 영문자, 숫자, 점(.), 밑줄(_)만 포함해야 합니다.
•
image가 없을 경우 기본 이미지가 적용됩니다. (image에 빈 문자열이 들어가면 서버에 저장된 기본 이미지로 적용됩니다.)
Res
// SUCCESS
{
"message": "회원가입 성공",
"user": {
"_id": String,
"username": String,
"email": String,
"accountname": String,
"intro": String,
"image": String,
}
}
// FAIL
// email, password, accountname, username 중 하나라도 작성하지 않을 경우
필수 입력사항을 입력해주세요.
// password를 6자 이상 입력하지 않을 경우
비밀번호는 6자 이상이어야 합니다.
// eamil 형식이 잘못될 경우
잘못된 이메일 형식입니다.
// 가입된 email일 경우
이미 가입된 이메일 주소입니다.
// accountname에 지정된 문자 이외의 문자가 들어갈 경우
영문, 숫자, 밑줄, 마침표만 사용할 수 있습니다.
// 가입된 accountname일 경우
이미 사용중인 계정 ID입니다.
JSON
복사
2.2 로그인
API
POST /user/login
JavaScript
복사
method, 전송 url
Req
{
"user":{
"email": String,
"password": String
}
}
JSON
복사
body(json)
{
"Content-type" : "application/json"
}
JSON
복사
header
•
email, password은 필수로 작성해야 합니다.
Res
// SUCCESS
{
"user": {
"_id": String,
"username": String,
"email": String,
"accountname": String,
"image": String,
"token": String
}
}
// FAIL
// email, password를 입력하지 않을 때
이메일 또는 비밀번호를 입력해주세요.
// email를 입력하지 않을 때
이메일을 입력해주세요.
// password를 입력하지 않을 때
비밀번호를 입력해주세요.
// email, password를 일치하지 않을 때
{
"message": "이메일 또는 비밀번호가 일치하지 않습니다.",
"status": 400
}
JSON
복사
2.3 프로필 정보 불러오기
API
GET /user/myinfo
JavaScript
복사
Req
{
"Authorization" : "Bearer {token}"
}
JavaScript
복사
header
Res
// SUCCESS
[
{
"user": {
"_id": String,
"username": String,
"accountname": String,
"image": String,
"isfollow": false,
"following": [],
"follower": [],
"followerCount": 0,
"followingCount": 0
}
}
]
JSON
복사
2.4 이메일 검증
API
POST /user/emailvalid
JavaScript
복사
Req
{
"user":{
"email": String
}
}
JSON
복사
body(json)
{
"Content-type" : "application/json"
}
JSON
복사
header
Res
// SUCCESS
// 사용 가능한 이메일인 경우
{
"message": "사용 가능한 이메일 입니다."
}
// 가입한 이메일이 있는 경우
{
"message": "이미 가입된 이메일 주소 입니다."
}
// FAIL
{
"message": "잘못된 접근입니다."
}
JSON
복사
2.5 계정 검증
API
POST /user/accountnamevalid
JavaScript
복사
Req
{
"user":{
"accountname": String
}
}
JSON
복사
body(json)
{
"Content-type" : "application/json"
}
JSON
복사
header
Res
// SUCCESS
// 사용 가능한 계정ID인 경우
{
"message": "사용 가능한 계정ID 입니다."
}
// 가입한 계정ID가 있는 경우
{
"message": "이미 가입된 계정ID 입니다."
}
// FAIL
{
"message": "잘못된 접근입니다."
}
JSON
복사
import { useEffect, useState, useRef } from 'react'
import axios from "axios"
import { useNavigate } from 'react-router';
import Button from '../../components/Button';
import UserInput from '../../components/userinput/UserInput';
import Inp from '../../components/userinput/Inp';
import Warning from '../../components/Warning';
export default function Register() {
const [idValid, setIdValid] = useState(false);
const [pwValid, setPwValid] = useState(false);
const [isDisable, setIsDisable] = useState(true);
const idAlertMsg = useRef(null);
const pwAlertMsg = useRef(null);
const idInput = useRef(null);
const pwInput = useRef(null);
const [userEmail, setUserEmail] = useState(null);
const [resMsg, setResMsg] = useState(null);
const [userData, setUserData] = useState(null)
const navigate = useNavigate();
const checkValid = (e) => {
if (e.target.id === "email"){
if (e.target.validity.valueMissing){
idAlertMsg.current.textContent = "*값을 입력해주세요.";
setIdValid(false);
}
else if (e.target.validity.typeMismatch){
idAlertMsg.current.textContent = "*알맞은 형식을 입력해주세요.";
setIdValid(false);
}
else if (resMsg.message === "이미 가입된 이메일 주소 입니다."){
idAlertMsg.current.textContent = "*이미 가입된 이메일 주소입니다.";
setIdValid(false);
}
else {
e.target.setCustomValidity('')
idAlertMsg.current.style.display = "none";
setIdValid(true);
return;
}
idAlertMsg.current.style.display = "block";
}
else if (e.target.id === "pw"){
if (e.target.value.length < 6){
pwAlertMsg.current.style.display = "block";
setPwValid(false);
}
else {
pwAlertMsg.current.style.display = "none";
setPwValid(true);
}
}
setUserData({
"user": {
"username": null,
"email": userEmail,
"password": pwInput.current.value,
"accountname": null,
"intro": null,
"image": "https://mandarin.api.weniv.co.kr/Ellipse.png"
}
})
}
useEffect(() => {
const getMsg = async () => {
setUserEmail(idInput.current.value);
const res = await axios.post('https://mandarin.api.weniv.co.kr/user/emailvalid', {
"user":{
"email": userEmail
}
})
setResMsg(res.data);
}
getMsg();
}, [userEmail, resMsg])
useEffect(() => {
idValid && pwValid ? setIsDisable(false) : setIsDisable(true);
}, [idValid, pwValid])
const handleSubmit = (e) => {
e.preventDefault(); // 새로고침 막기
// console.log(email, password,displayName);
// navigate('../profile', { state: userData });
// console.log(userData)
}
return (
<>
<h1>이메일로 회원가입</h1>
<form onSubmit={handleSubmit}>
<UserInput inputId="email" label="이메일">
<Inp
type="email"
id="email"
ref={idInput}
placeholder="이메일 주소를 입력해주세요."
onBlur={checkValid}
required
>
</Inp>
</UserInput>
<Warning ref={idAlertMsg}>
이메일 안내 메시지
</Warning>
<UserInput inputId="pw" label="비밀번호">
<Inp
type="password"
id="pw"
ref={pwInput}
placeholder="비밀번호를 설정해주세요."
onBlur={checkValid}
required
>
</Inp>
</UserInput>
<Warning ref={pwAlertMsg}>* 비밀번호는 6자 이상이어야 합니다.</Warning>
<Button type="submit" className="large" disabled={isDisable}>다음</Button>
</form>
</>
);
}
JavaScript
복사