diff --git a/assets/affiliate.data.js b/assets/affiliate.data.js deleted file mode 100644 index 6f439e5..0000000 --- a/assets/affiliate.data.js +++ /dev/null @@ -1,241 +0,0 @@ -export const affiliates = [ -{ - "idx": 1, - "title": "세이프닥", - "meta_content": "전국 250개 병원 최대 49% 할인 (15개 진료과목)", - "content": "<혜택 내용> \n \ - - 대상: 재학생 및 가족/졸업생 포함\n\ - - 기간: 2023년 1월 1일~2023년 12월 31일\n\ - - 혜택 내용: 전국 250개 병원 최대 49% 할인 (15개 진료과목)\n\ - - 혜택 전용 복지몰 : https://www.safedoc1.com \n\ - \n \ - <예약 방법>\n\ - - 전화상담 : 02-2088-8677\n \ - - 카톡상담 : 플러스친구 '세이프닥' 추가\n\ - - 플친 바로가기 : http://pf.kakao.com/_nxaKej \n\ - \n \ - 📱앱설치\n\ - -구글스토어: https://url.kr/rhfljb \n\ - -앱스토어: https://url.kr/5bpodu \n\ - \n \ - ★상담·예약시 대학교명을 말씀해주셔야 우대가 적용이 가능합니다. \n\ - " -}, -{ - "idx": 2, - "title": "리플랜에듀x에듀윌", - "meta_content":"포항공과대학교 학우들을 위한 \"리플랜에듀x에듀윌\"만의 BIG 11가지 혜택사항-", - "content": "포항공과대학교 학우들을 위한 \"리플랜에듀x에듀윌\"만의 BIG 11가지 혜택사항- \n \ - 1. 제휴대학 학우들 전체강좌 무제한 2년 수강 \n\ - 2. 에듀윌토익&컴스쿨닷컴 유료강좌 4500강좌 전부제공 \n\ - 3. 모든 컨텐츠 무제한 반복수강 \n\ - 4. 일시정지 기능지원 [연5회] \n\ - 5. 최신 개정강좌 실시간 업데이트 \n\ - 6. 정품 에듀윌토익 교재 4권 특별 지원 \n\ - 7. 토익 응시료 50% 특별 지원 \n\ - 8. 에듀윌토익 온라인 모의테스트 2회 지원 \n\ - 9. 컴퓨터 태블릿 스마트폰 수강가능 서비스지원 \n\ - 10.2년수강료 80%할인▶365.000원 \n\ - 11.최대 100% 전액 환급 장학제도 \n\ - \n \ - * 출석 인정은 PC수강만 가능 / 교재비 및 서버관리비(10%) 제외된 금액으로 환급 \n\ - \n \ - < 신 청 방 법 > \n \ - -50명 한정지원 \n \ - -해당 링크로 접속하기 ▶ https://naver.me/FAQbuqUO \n \ - (신청서 작성시 NAVER 로그인 후 작성 부탁드립니다.) \n \ - ※양식에 맞춰 신청서 작성 후 80%지원혜택 받을 학생들에게 담당자 직접 연락드릴예정입니다. \n \ - \n \ - < 문 의 사 항 > \n \ - 궁금하신 부분 있다면 언제든 연락주세요 \n \ - ☏ 010-2037-8347 \"리플랜에듀x에듀윌\" 담당자 \n \ - ☞ 상담 시간 ▶ 평일 10:00 ~ 17:00 \n \ - " -}, -{ - "idx": 3, - "title": "심플핏", - "meta_content":"심플핏에서 글포구매시 분반잠 3000원 할인!", - "content": "🎈심플핏에서 글포구매시 분반잠 3000원 할인! \n \ - 🎈선배들이 만든 분반잠이 있다면 시안 걱정 ㄴㄴ 심플핏에서 시안 보유 중! \n \ - 🎈심플핏에서 '한번'이라도 글포를 구매하신 분은 과잠바 3000원할인 \n \ - \n \ - ➡️심플핏 페이스북 http://facebook.com/wearsimplefit \n \ - ➡️심플핏 인스타그램 http://instagram.com/simplefit_official/ \n \ - ➡️심플핏 홈페이지 http://www.simplefit.co.kr/ \n \ - ➡️카카오톡 문의하기 http://pf.kakao.com/_ryuHl/chat \n \ - " -}, -{ - "idx": 4, - "title": "포항공과대학교 x 밝은성모안과", - "meta_content":"포항공과대학교 재학생(가족포함) 및 지인 제휴 할인", - "content": "▶제휴 대상 \n \ - - 포항공과대학교 재학생(가족포함) 및 지인 \n \ - \n \ - ▶혜택내용 \n \ - 라식/라섹 수술 전 50여가지 정밀 검사 \n \ - 검사 후 당일 수술 진행 시 추가 혜택 \n \ - 가족&지인까지 제휴할인 적용 가능 \n \ - 부모님 노안, 백내장 검진 가능 \n \ - \n \ - ▶제휴 기간 \n \ - ~2023년 12월 31일까지 \n \ - \n \ - ▶이용, 신청방법 \n \ - 1. 담당자에게 전화, 문자로 신청합니다 \n \ - 포항공과대학교 담당자 -> 010-9026-1522 \n \ - 2. 카카오톡으로 신청합니다 \n \ - Kakao ID -> oklasik1521 \n \ - (담당자를 통한 예약시에만 제휴 혜택이 적용됩니다) \n \ - " -}, -{ - "idx": 5, - "title": "메가박스", - "meta_content":"포항지역 메가박스와 제휴하여 교내 모든 구성원에게 4,000원 영화 예매 할인 혜택을 제공합니다!", - "content": "온라인 전용 동반 1인까지 적용 가능 \n \ - 사용기한: ~8월 31일까지 \n \ - \n 사용 방법 \n \ - - 메가박스 앱 \n \ - 로그인 상태->오른쪽 하단 MY->메가박스 쿠폰->오른쪽 상단 등록하기->쿠폰번호 입력 등록 후 예매 진행 과정에서 쿠폰 사용 \n \ - - 메가박스 홈페이지 \n \ - 로그인->오른쪽 상단 사람모양 (MY페이지) ->쿠폰 -> 할인쿠폰 등록 -> 쿠폰 번호 입력 등록 후 예매 진행 과정에서 쿠폰 사용 \n \ - \n \ - 할인 예매 후, 영화관 입장 시에 교내 구성원 확인 절차가 있을 수 있으니 학생증 & 직원증 지참 부탁드립니다. \n \ - " -} -]; - -export const discountOffers = [ - { - "idx": 1, - "title": "순수치킨 효자점", - "region": "효자", - "open_hour": "화요일 제외 16:00~00:30 (화 휴무)", - "phone": "054-272-9982", - "content": "4/21~5/12 3주간 배달 현금 계산 시 한 마리 당 3,000원 할인+쿠폰 1매. \n \ - 쿠폰 3매 모으면 15,000원 상당 영화 티켓 1매 증정\n" - }, - { - "idx": 2, - "title": "유상운 베이커리", - "region": "효자", - "open_hour": "일요일 제외 08:00~22:00, 일 09:00~21:00", - "phone": "054-284-0636", - "content": "상시 할인품목 제외 10% 할인\n" - }, - { - "idx": 3, - "title": "니알포차", - "region": "효자", - "open_hour": "매일 22:00~04:00 (전화 문의)", - "phone": "010-6560-0097", - "content": "기본 안주 라면 제공" - }, - { - "idx": 4, - "title": "모가모가", - "region": "효자", - "open_hour": "일요일 제외 10:00~18:00 (일 휴무)", - "phone": "0507-1327-0324", - "content": "컷트 1,000원 할인" - }, - { - "idx": 5, - "title": "모가모가", - "region": "효자", - "open_hour": "일요일 제외 10:00~18:00 (일 휴무)", - "phone": "0507-1327-0324", - "content": "컷트 1,000원 할인" - }, - { - "idx": 6, - "title": "밀투유 (밀키트)", - "region": "효자", - "open_hour": "연중무휴 24시간 영업", - "phone": "0507-1374-7204", - "content": "1. 키오스크 공대할인 등록-샐러드 7,000원, 이외 매달 매장품목 중 5~10개 할인\n\ - 2. 샐러드 정기배송 5,000원 할인, 5인 이상 같은 장소 배송 시 10,000원 추가 할인" - }, - { - "idx": 7, - "title": "멀티패스 PC방", - "region": "효자", - "open_hour": "24시 운영", - "phone": "054-272-0606", - "content": "학생증 제시 시 피크닉 제공" - }, - { - "idx": 8, - "title": "효동피자", - "region": "효자", - "open_hour": "매일 11:30~22:00", - "phone": "054-273-4205", - "content": "5% 할인 제공" - }, - { - "idx": 9, - "title": "다둥이통신", - "region": "효자", - "open_hour": "매일 11:30~20:00", - "phone": "0507-1350-0097", - "content": "공대생 기기값 할인" - }, - { - "idx": 10, - "title": "이태리파스타", - "region": "SK뷰", - "open_hour": "월요일 제외 11:30~21:00 (월 휴무), 브레이크 타임 15:00~16:30", - "phone": "054-281-0523", - "content": "1~2인 방문 시 음료 1잔, 3~4인 방문 시 음료 2잔 제공" - }, - { - "idx": 11, - "title": "인드라", - "region": "SK뷰", - "open_hour": "매일 11:00~21:30", - "phone": "0507-1429-1478", - "content": "현금 결제 시 10% 할인" - }, - { - "idx": 12, - "title": "더은필라테스", - "region": "SK뷰", - "open_hour": "일요일 제외 09:00~22:00 (일 휴무)", - "phone": "0507-1385-5540", - "content": "할인 적용 및 횟수 추가" - }, - { - "idx": 13, - "title": "등촌샤브칼국수", - "region": "기타", - "open_hour": "월요일 제외 11:00~21:00 (월 휴무), 브레이크 타임 15:00~16:00", - "phone": "054-272-9345", - "content": "공대생 야채사리 서비스" - }, - { - "idx": 14, - "title": "청춘밥상", - "region": "기타", - "open_hour": "매일 11:00~21:00, 브레이크 타임 15:00~17:00", - "phone": "054-614-4715", - "content": "2인당 탄산음료 1캔 제공" - }, - { - "idx": 15, - "title": "힘찬민물장어", - "region": "기타", - "open_hour": "일요일 제외 10:00~22:00 (일 휴무)", - "phone": "054-275-9424", - "content": "방문/배달 주문 시 음료수 제공" - }, - { - "idx": 16, - "title": "리얼스트렝스짐", - "region": "기타", - "open_hour": "평일 10:00~22:00", - "phone": "0507-1492-1330", - "content": "10% 할인" - } -]; \ No newline at end of file diff --git a/components/board/benefit/affiliate/affiliate.table.jsx b/components/board/benefit/affiliate/affiliate.table.jsx new file mode 100644 index 0000000..d0c6203 --- /dev/null +++ b/components/board/benefit/affiliate/affiliate.table.jsx @@ -0,0 +1,54 @@ +import React from 'react' +import Link from "next/link"; +import moment from 'moment' +import { Table } from 'semantic-ui-react' + +const AffiliateTable = ({ affiliateList }) => { + + return ( + + + + + id + + + 업체명 + + + 짤은 설명 + + + 설명 + + + 생성일 + + + + + { + affiliateList.map((affiliate) => ( + + + {affiliate.id} + {affiliate.title} + {affiliate.content_short} + {affiliate.content} + + { + moment(affiliate.created_at).format('YYYY-MM-DD HH:mm') + } + + + + )) + } + +
+ ) +} + +export default AffiliateTable; diff --git a/components/board/benefit/discount/discount.table.jsx b/components/board/benefit/discount/discount.table.jsx new file mode 100644 index 0000000..60553e8 --- /dev/null +++ b/components/board/benefit/discount/discount.table.jsx @@ -0,0 +1,62 @@ +import React from 'react' +import Link from "next/link"; +import moment from 'moment' +import { Table } from 'semantic-ui-react' + +const DiscountTable = ({ discountList }) => { + + return ( + + + + + id + + + 업체명 + + + 지역 + + + 영업 시간 + + + 가게 번호 + + + 할인 내용 + + + 생성일 + + + + + { + discountList.map((discount) => ( + + + {discount.id} + {discount.title} + {discount.region} + {discount.open_hour} + {discount.phone} + {discount.content} + + { + moment(discount.created_at).format('YYYY-MM-DD HH:mm') + } + + + + )) + } + +
+ ) +} + +export default DiscountTable; diff --git a/components/board/board.menubar.jsx b/components/board/board.menubar.jsx index 163ccaf..7e38151 100644 --- a/components/board/board.menubar.jsx +++ b/components/board/board.menubar.jsx @@ -17,7 +17,7 @@ export default class BoardMenubar extends Component { - 제휴 및 할인업체 소개 + 총학 제휴/할인 업체 동아리 게시물 diff --git a/components/common/delete.confirm.modal.jsx b/components/common/delete.confirm.modal.jsx index e04fabd..7571fe6 100644 --- a/components/common/delete.confirm.modal.jsx +++ b/components/common/delete.confirm.modal.jsx @@ -1,20 +1,29 @@ import { useState } from 'react' import { Button, Modal } from 'semantic-ui-react' +import { useRouter } from "next/router"; + import { PoPoAxios } from "@/utils/axios.instance"; const DeleteConfirmModal = (props) => { + const router = useRouter(); + const deleteTarget = props.target const deleteURI = props.deleteURI + const afterDeleteURI = props.afterDeleteURI; const [open, setOpen] = useState(props.open) const handleDelete = async () => { try { await PoPoAxios.delete(`/${deleteURI}`, { withCredentials: true }) - window.location.reload() - } catch (e) { - alert('장소 삭제에 실패했습니다.') - console.log(e) + if (afterDeleteURI) { + router.push(afterDeleteURI); + } else { + window.location.reload() + } + } catch (err) { + const errMsg = err.response.data.message; + alert(`삭제에 실패했습니다.\n${errMsg}`); } } diff --git a/pages/board/benefit.jsx b/pages/board/benefit.jsx deleted file mode 100644 index 7271795..0000000 --- a/pages/board/benefit.jsx +++ /dev/null @@ -1,30 +0,0 @@ -import { Divider } from 'semantic-ui-react' -import styled from 'styled-components' -import BoardLayout from '@/components/board/board.layout' -import AffiliateCards from '@/components/board/affiliate.cards' -import DiscountOfferCards from '@/components/board/discount.cards' - -import { affiliates, discountOffers } from '../../assets/affiliate.data'; - -const BenefitPage = () => { - return ( - -

총학생회 제휴 업체 소개

- - -

총학생회 할인 업체 소개

- -
- ) -} - -export default BenefitPage - -const AffiliateDivider = styled(Divider)` - margin: 20px 0px 0px 0px; - padding: 20px 0px 0px 0px; -` \ No newline at end of file diff --git a/pages/board/benefit/affiliate/create.jsx b/pages/board/benefit/affiliate/create.jsx new file mode 100644 index 0000000..c8d5de7 --- /dev/null +++ b/pages/board/benefit/affiliate/create.jsx @@ -0,0 +1,65 @@ +import { useState } from 'react' +import { useRouter } from "next/router"; +import { Form } from "semantic-ui-react"; + +import { PoPoAxios } from "@/utils/axios.instance"; +import BoardLayout from '@/components/board/board.layout'; + +const AffiliateCreatePage = () => { + const router = useRouter(); + + const [title, setTitle] = useState('') + const [content_short, setContentShort] = useState('') + const [content, setContent] = useState('') + + const handleSubmit = async () => { + const body = { + 'title': title, + 'content_short': content_short, + 'content': content, + } + + PoPoAxios.post('/benefit/affiliate', + body, + { withCredentials: true }, + ).then(() => { + alert('제휴 업체가 등록 되었습니다!') + router.push('/board/benefit'); + }).catch(err => { + const errMsg = err.response.data.message; + alert(`제휴 업체 등록에 실패했습니다.\n${errMsg}`); + }) + } + + return ( + +

총학 제휴 업체 생성

+ +
+ setTitle(e.target.value)} + /> + + setContentShort(e.target.value)} + /> + + setContent(e.target.value)} + /> + + + 생성 + + +
+ ) +} + +export default AffiliateCreatePage; diff --git a/pages/board/benefit/affiliate/update/[id].jsx b/pages/board/benefit/affiliate/update/[id].jsx new file mode 100644 index 0000000..077666f --- /dev/null +++ b/pages/board/benefit/affiliate/update/[id].jsx @@ -0,0 +1,96 @@ +import { useState } from 'react' +import { useRouter } from "next/router"; +import { Button, Form, Icon } from "semantic-ui-react"; + +import { PoPoAxios } from "@/utils/axios.instance"; +import BoardLayout from '@/components/board/board.layout'; +import DeleteConfirmModal from "@/components/common/delete.confirm.modal"; + +const AffiliateUpdatePage = ({ affiliateInfo }) => { + const router = useRouter(); + + const [deleteModalOpen, setDeleteModalOpen] = useState(false) + + const id = affiliateInfo.id; + const [title, setTitle] = useState(affiliateInfo.title) + const [content_short, setContentShort] = useState(affiliateInfo.content_short) + const [content, setContent] = useState(affiliateInfo.content) + + const handleSubmit = async () => { + const body = { + 'title': title, + 'content_short': content_short, + 'content': content, + } + + PoPoAxios.put(`/benefit/affiliate/${id}`, + body, + { withCredentials: true }, + ).then(() => { + alert('제휴 업체 정보가 수정 되었습니다!') + router.push('/board/benefit'); + }).catch(err => { + const errMsg = err.response.data.message; + alert(`제휴 업체 정보 수정에 실패했습니다.\n${errMsg}`); + }) + } + + return ( + +

총학 제휴 업체 수정

+ +
+ setTitle(e.target.value)} + /> + + setContentShort(e.target.value)} + /> + + setContent(e.target.value)} + /> + + + + 수정 + + setDeleteModalOpen(true)}> + 삭제 + )} + /> + + +
+ ) +} + +export default AffiliateUpdatePage; + +export async function getServerSideProps(ctx) { + const { id } = ctx['params']; + const res = await PoPoAxios.get(`benefit/affiliate/${id}`); + const affiliateInfo = res.data; + + return { props: { affiliateInfo } } +} diff --git a/pages/board/benefit/discount/create.jsx b/pages/board/benefit/discount/create.jsx new file mode 100644 index 0000000..dd6420e --- /dev/null +++ b/pages/board/benefit/discount/create.jsx @@ -0,0 +1,81 @@ +import { useState } from 'react' +import { useRouter } from "next/router"; +import { Form } from "semantic-ui-react"; + +import { PoPoAxios } from "@/utils/axios.instance"; +import BoardLayout from '@/components/board/board.layout'; + +const DiscountCreatePage = () => { + const router = useRouter(); + + const [title, setTitle] = useState('') + const [region, setRegion] = useState('') + const [open_hour, setOpenHour] = useState('') + const [phone, setPhone] = useState('') + const [content, setContent] = useState('') + + const handleSubmit = async () => { + const body = { + 'title': title, + 'region': region, + 'open_hour': open_hour, + 'phone': phone, + 'content': content, + } + + PoPoAxios.post('/benefit/discount', + body, + { withCredentials: true }, + ).then(() => { + alert('할인 업체가 등록 되었습니다!') + router.push('/board/benefit'); + }).catch(err => { + const errMsg = err.response.data.message; + alert(`할인 업체 등록에 실패했습니다.\n${errMsg}`); + }) + } + + return ( + +

총학 할인 업체 생성

+ +
+ setTitle(e.target.value)} + /> + + setRegion(e.target.value)} + /> + + setOpenHour(e.target.value)} + /> + + setPhone(e.target.value)} + /> + + setContent(e.target.value)} + /> + + + 생성 + + +
+ ) +} + +export default DiscountCreatePage; diff --git a/pages/board/benefit/discount/update/[id].jsx b/pages/board/benefit/discount/update/[id].jsx new file mode 100644 index 0000000..c572d65 --- /dev/null +++ b/pages/board/benefit/discount/update/[id].jsx @@ -0,0 +1,114 @@ +import { useState } from 'react' +import { useRouter } from "next/router"; +import { Button, Form, Icon } from "semantic-ui-react"; + +import { PoPoAxios } from "@/utils/axios.instance"; +import BoardLayout from '@/components/board/board.layout'; +import DeleteConfirmModal from "@/components/common/delete.confirm.modal"; + +const DiscountUpdatePage = ({ discountInfo }) => { + const router = useRouter(); + + const [deleteModalOpen, setDeleteModalOpen] = useState(false) + + const id = discountInfo.id; + const [title, setTitle] = useState(discountInfo.title) + const [region, setRegion] = useState(discountInfo.region) + const [open_hour, setOpenHour] = useState(discountInfo.open_hour) + const [phone, setPhone] = useState(discountInfo.phone) + const [content, setContent] = useState(discountInfo.content) + + const handleSubmit = async () => { + const body = { + 'title': title, + 'region': region, + 'open_hour': open_hour, + 'phone': phone, + 'content': content, + } + + PoPoAxios.put(`/benefit/discount/${id}`, + body, + { withCredentials: true }, + ).then(() => { + alert('할인 업체 정보가 수정 되었습니다!') + router.push('/board/benefit'); + }).catch(err => { + const errMsg = err.response.data.message; + alert(`할인 업체 정보 수정에 실패했습니다.\n${errMsg}`); + }) + } + + return ( + +

총학 할인 업체 수정

+ +
+ setTitle(e.target.value)} + /> + + setRegion(e.target.value)} + /> + + setOpenHour(e.target.value)} + /> + + setPhone(e.target.value)} + /> + + setContent(e.target.value)} + /> + + + + 수정 + + setDeleteModalOpen(true)}> + 삭제 + )} + /> + + +
+ ) +} + +export default DiscountUpdatePage; + +export async function getServerSideProps(ctx) { + const { id } = ctx['params']; + const res = await PoPoAxios.get(`benefit/discount/${id}`); + const discountInfo = res.data; + + return { props: { discountInfo } } +} diff --git a/pages/board/benefit/index.jsx b/pages/board/benefit/index.jsx new file mode 100644 index 0000000..5b6cb11 --- /dev/null +++ b/pages/board/benefit/index.jsx @@ -0,0 +1,54 @@ +import React from 'react' +import Link from 'next/link' +import { Button, Message } from 'semantic-ui-react' + +import { PoPoAxios } from "@/utils/axios.instance"; +import BoardLayout from '@/components/board/board.layout' +import AffiliateTable from '@/components/board/benefit/affiliate/affiliate.table'; +import DiscountTable from '@/components/board/benefit/discount/discount.table'; + +const BenefitPage = ({ affiliateList, discountList }) => { + return ( + +

총학 혜택 목록

+ + + 총학 제휴/할일 업체 목록은 이름 순으로 정렬되어 표시 됩니다. + + +

총학 제휴 업체

+
+ + + +
+
+ +
+ + +

총학 할인 업체

+
+ + + +
+
+ +
+
+ ) +} + +export default BenefitPage; + +export async function getServerSideProps() { + const res1 = await PoPoAxios.get('benefit/affiliate'); + const affiliateList = res1.data; + + + const res2 = await PoPoAxios.get('benefit/discount'); + const discountList = res2.data; + + return { props: { affiliateList, discountList } }; +}