본문 바로가기
React를 같이 배워보자

React 마지막 간단한 프로젝트 3일차- 로그인 활용 기능

by 멈추지않아 2022. 3. 6.
완성본:https://github.com/qjawns0222/hompage.git

우선 프로젝트여시고 Component/menu.jsx

import React from "react";
import Form from "./Form";
import style from "./css/Menu.module.css";

export default function Menu({
  gimbab,
  odeng,
  addition,
  gimminus,
  gimplus,
  odengminus,
  odengplus,
  odengchange,
  gimchange,
  additionchange,
  addorder,
  value,
}) {
  return (
    <Form>
      <div className={value.auth || value.user ? style.form : style.formnone}>
        <div className={style.menus}>
          <div className={style.item}>
            <div className={style.imgs}>
              <img
                width={200}
                className={style.img}
                alt="#"
              />
            </div>
            <div className={style.name}>김밥</div>
            <div className={style.price}>2000원</div>
            <div className={style.buttons}>
              <button className={style.minus} onClick={gimminus}>
                -
              </button>
              <input
                type="number"
                onChange={gimchange}
                value={gimbab}
                className={style.menuinput}
              />
              <button className={style.plus} onClick={gimplus}>
                +
              </button>
            </div>
          </div>
          <div className={style.item}>
            <div className={style.imgs}>
              <img
                className={style.img}
                width={200}
                alt="#"
              />
            </div>
            <div className={style.name}>오뎅</div>
            <div className={style.price}>500원</div>
            <div className={style.buttons}>
              <button className={style.minus} onClick={odengminus}>
                -
              </button>

              <input
                type="number"
                onChange={odengchange}
                value={odeng}
                className={style.menuinput}
              />

              <button className={style.plus} onClick={odengplus}>
                +
              </button>
            </div>
          </div>
        </div>
        <div className={style.addition}>
          <h3 className={style.title}>요청 사항</h3>
          <hr className={style.hr}></hr>
          <div className={style.requests}>
            <textarea
              value={addition}
              onChange={additionchange}
              className={style.request}
              placeholder="요청사항을 입력하세요"
            />
          </div>
        </div>

        <div className={style.orders}>
          <button className={style.order} onClick={addorder}>
            주문
          </button>
        </div>
      </div>
    </Form>
  );
}

이부분을 보시면  저장소의 auth 와 user 둘중 한개라도 있으면 form을 넣어서 원래 기존처럼 놔두고  아니면 formnone을 이용해서 클릭이 안되게 합니다. 

이렇게 하면 로그인 하지 않은 사람들은 클릭이 되지 않게 됩니다. 그렇게 함으로써 로그인 한사람만 주문을 하게 만들었습니다.

Component/Home.jsx

import React from "react";
import Form from "./Form";
import style from "./css/Home.module.css";
import { Link } from "react-router-dom";
export default function Home({ value, logout }) {
  return (
    <Form>
      <h1 className={style.name}>천생슈퍼</h1>
      <div className={style.image}>
        <img
          className={style.img}
          alt="메인"
        />
      </div>
      <div className={style.description}>
        30년 전동의 김밥 가게
        <br />
        김밥과 오뎅이 주 메뉴이다
      </div>
      {value.login === true ? (
        <button className={style.login} onClick={logout}>
          로그아웃
        </button>
      ) : (
        <Link to={"/login"}>
          <button className={style.login}>로그인</button>
        </Link>
      )}
    </Form>
  );
}

Homecontainer.jsx

import React, { useContext } from "react";
import { useNavigate } from "react-router-dom";
import Home from "../Components/Home";
import store from "../context/store";
export default function Homecontainer() {
  const value = useContext(store);
  const navigate = useNavigate();
  const logout = () => {
    value.login = false;
    value.auth = false;
    value.user = "";
    navigate("/");
  };

  return <Home value={value} logout={logout} />;
}

이렇게 login값이 true이면  로그아웃 버튼을 보여줘서 자기가 로그인 됬다는것을 확인 시켜주고 또한 로그아웃이 가능하게 구현 했습니다.

반대로 로그인 이 false 면 로그인 버튼을 보여줘서 로그인 안될걸 알려주고 로그인 가능하게 버튼을 활성화시켰습니다.

로그아웃은 logout할때  login auth 둘다 false로 만들어주고 user도 비워 줘서 로그아웃 한 설정을 만들어 줍니다.

Component/Buy.jsx

import React from "react";
import Form from "./Form";
import style from "./css/Buy.module.css";
import { Link } from "react-router-dom";

export default function Buy({ value, delvalue }) {
  return (
    <Form>
      <div className={style.orderboxs}>
        <div className={style.orderbox}>
          <div className={style.id}>순번</div>
          <div className={style.gim}>김밥</div>
          <div className={style.odeng}>오뎅</div>
          <div className={style.addition}>요청사항</div>
          <div className={style.date}>시간</div>
          <div className={style.button}>삭제</div>
        </div>
        <hr className={style.line} />
        {value.data.map((p) => {
          return (
            <div key={p.id} className={style.data}>
              <div className={style.orderbox}>
                <div className={style.id}>
                  <Link to={`/detail${p.id}`}>{p.id}</Link>
                </div>
                <div className={style.gim}>
                  <Link to={`/detail${p.id}`}>{p.gim}</Link>
                </div>
                <div className={style.odeng}>
                  <Link to={`/detail${p.id}`}>{p.odeng}</Link>
                </div>
                <div className={style.addition}>
                  <Link to={`/detail${p.id}`}>{p.summary}</Link>
                </div>
                <div className={style.date}>
                  <Link to={`/detail${p.id}`}>{p.date}</Link>
                </div>
                <div className={style.button}>
                  <button
                    id={p.id}
                    onClick={delvalue}
                    className={
                      value.auth || p.user === value.user
                        ? style.delete
                        : style.disable
                    }
                  >
                    삭제
                  </button>
                </div>
              </div>
              <hr className={style.line} />
            </div>
          );
        })}
      </div>
    </Form>
  );
}

여기 보시면 auth가 true이거나 데이터의 user 랑 저장소의 user가 같을때만 클릭이 가능하게 했습니다.

이로써 삭제는  본인과 관리자만 할수 있습니다.

Component/Detail.jsx

import React from "react";
import Form from "./Form";
import style from "./css/Menu.module.css";

export default function Menu({
  gimbab,
  odeng,
  addition,
  gimminus,
  gimplus,
  odengminus,
  odengplus,
  odengchange,
  gimchange,
  additionchange,
  addorder,
  value,
  user,
}) {
  return (
    <Form>
      <div
        className={
          value.auth || user === value.user ? style.form : style.formnone
        }
      >
        <div className={style.menus}>
          <div className={style.item}>
            <div className={style.imgs}>
              <img
                width={200}
                className={style.img}
                alt="#"
              />
            </div>
            <div className={style.name}>김밥</div>
            <div className={style.price}>2000원</div>
            <div className={style.buttons}>
              <button className={style.minus} onClick={gimminus}>
                -
              </button>
              <input
                type="number"
                onChange={gimchange}
                value={gimbab}
                className={style.menuinput}
              />
              <button className={style.plus} onClick={gimplus}>
                +
              </button>
            </div>
          </div>
          <div className={style.item}>
            <div className={style.imgs}>
              <img
                width={200}
                className={style.img}
                alt="#"
              />
            </div>
            <div className={style.name}>오뎅</div>
            <div className={style.price}>500원</div>
            <div className={style.buttons}>
              <button className={style.minus} onClick={odengminus}>
                -
              </button>

              <input
                type="number"
                onChange={odengchange}
                value={odeng}
                className={style.menuinput}
              />

              <button className={style.plus} onClick={odengplus}>
                +
              </button>
            </div>
          </div>
        </div>
        <div className={style.addition}>
          <h3 className={style.title}>요청 사항</h3>
          <hr className={style.hr}></hr>
          <div className={style.requests}>
            <textarea
              value={addition}
              onChange={additionchange}
              className={style.request}
              placeholder="요청사항을 입력하세요"
            />
          </div>
        </div>

        <div className={style.orders}>
          <button className={style.order} onClick={addorder}>
            주문
          </button>
        </div>
      </div>
    </Form>
  );
}

여기도 위에랑 똑같이 auth 이거나 저장소의 user 가 해당 데이터의user 랑 같으면 클릭이 가능하게 만들어서 관리자나 주문한 사람만 수정이 가능하게 만들었습니다.

 

이상으로 로그인 이용한 기능입니다.

내일은 아이디 만드는것을 해보겠습니다.