From 28f0a5e0bc9caa69d5f11d7dc69d4c78ae1ce6f1 Mon Sep 17 00:00:00 2001 From: JangHyeonJun <83224463+hyeon17@users.noreply.github.com> Date: Mon, 6 Mar 2023 14:17:37 +0900 Subject: [PATCH 01/84] Update README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 4c78c74..91545fc 100644 --- a/README.md +++ b/README.md @@ -2,18 +2,18 @@ [![Netlify Status](https://api.netlify.com/api/v1/badges/df0e144a-736d-44d7-be21-12d6c1573797/deploy-status)](https://app.netlify.com/sites/magical-babka-4591f3/deploys) -**TwoCircle(투써클 안경점)** : https://magical-babka-4591f3.netlify.app/ +**[TwoCircle(투써클 안경점)](https://magical-babka-4591f3.netlify.app/)** [상품은 내일 추가 예정..] ## 작업기간 23.01.30(월) ~ 미정 ## 테스트 아이디 -### 테스트 -ID : test@naver.com +### 사용자 +ID : test@naver.com
PW : abcd1234 ### 관리자 -ID : admin@naver.com +ID : admin@naver.com
PW : abcd1234 ## 사이트 설명 (추가 예정...) From 3c42177ad86c7ef2dfedd90edb1ecfd658ac19b0 Mon Sep 17 00:00:00 2001 From: Nevacat Date: Tue, 7 Mar 2023 13:26:52 +0900 Subject: [PATCH 02/84] =?UTF-8?q?feat:=20=EC=8A=A4=ED=81=AC=EB=A1=A4=20?= =?UTF-8?q?=EB=B1=83=EC=A7=80=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit loop삭제 --- pages/header.js | 37 ++++++++++++++++++++++++------------- scss/base/event.scss | 2 +- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/pages/header.js b/pages/header.js index c76cc94..c2bba96 100644 --- a/pages/header.js +++ b/pages/header.js @@ -80,24 +80,34 @@ export function headerRender() {

TEAM5
23.01.30
~ ING

- -

박희수

+ + +

박희수

+
- -

김선미

+ + +

김선미

+
- -

송지윤

+ + +

송지윤

+
- -

장현준

+ + +

장현준

+
- -

박현준

+ + +

박현준

+
@@ -222,11 +232,12 @@ export function headerRender() { }) // 이벤트 베너 const eventBanner = new Swiper('.event-swiper', { - width: "100", - loop:true, + slidesPerView: 1, + width: 100, autoplay:true, scrollbar: { - el: ".swiper-scrollbar" + el: ".swiper-scrollbar", + draggable: true }, }); // 스크롤 이벤트 diff --git a/scss/base/event.scss b/scss/base/event.scss index 7f0ed7b..b00c1f7 100644 --- a/scss/base/event.scss +++ b/scss/base/event.scss @@ -7,7 +7,6 @@ z-index: 2; .swiper-container{ position: relative; - width: 100%; height: 200px; overflow: hidden; border: 1px solid #d6dae5; @@ -55,6 +54,7 @@ bottom: 0 !important; .swiper-scrollbar-drag{ background-color: #FF597B !important; + --swiper-scrollbar-size: 20%; } } } From 755def42c2440c83888a315b576b404ccfeacc75 Mon Sep 17 00:00:00 2001 From: Nevacat Date: Tue, 7 Mar 2023 13:28:57 +0900 Subject: [PATCH 03/84] =?UTF-8?q?Docs:=20=EC=8A=A4=ED=81=AC=EB=A1=A4=20con?= =?UTF-8?q?sole.log=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/header.js | 1 - 1 file changed, 1 deletion(-) diff --git a/pages/header.js b/pages/header.js index c2bba96..1cf13f1 100644 --- a/pages/header.js +++ b/pages/header.js @@ -243,7 +243,6 @@ export function headerRender() { // 스크롤 이벤트 const eventSection = document.querySelector(".event") window.addEventListener('scroll',_.throttle(()=>{ - console.log(window.scrollY) if(window.scrollY<330){ gsap.to(eventSection,.4,{ opacity:0, From 09985995a6d0c1161fb5bbd374b050932dfe58a6 Mon Sep 17 00:00:00 2001 From: PHJ Date: Thu, 9 Mar 2023 01:30:47 +0900 Subject: [PATCH 04/84] =?UTF-8?q?fix:=20=EA=B5=AC=EB=A7=A4=EB=82=B4?= =?UTF-8?q?=EC=97=AD=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=EB=84=A4=EC=9D=B4=EC=85=98=20=EB=AC=B8=EC=A0=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scss/user/purchase_history.scss | 28 ++++++- source/js/purchase_history.js | 127 ++++++++++++++++++++++++++------ 2 files changed, 132 insertions(+), 23 deletions(-) diff --git a/scss/user/purchase_history.scss b/scss/user/purchase_history.scss index 3522c56..8ad8bbe 100644 --- a/scss/user/purchase_history.scss +++ b/scss/user/purchase_history.scss @@ -242,7 +242,7 @@ } .no_list_container { - display: flex; + display: none; justify-content: center; align-items: center; width: inherit; @@ -276,6 +276,11 @@ } } + .list_item_orderNumber { + width: 9.5rem; + //text-align: center; + } + .list_item_btn { display: flex; @@ -347,11 +352,32 @@ color: #4e4e4e; } + .arrow-link { + height: 4rem; + width: 4rem; + margin: 1rem 1rem 0 0; + cursor: pointer; + font-size: 1.6rem; + text-align: center; + color: #4e4e4e; + } + .active-link { background-color: #FF597B; border-color: #FF597B; color: #FFFFFF; } + + .arrow-link-unactive { + height: 4rem; + width: 4rem; + margin: 1rem 1rem 0 0; + cursor: text; + font-size: 1.6rem; + text-align: center; + color: #c7c5c5; + pointer-events: none; + } } } } diff --git a/source/js/purchase_history.js b/source/js/purchase_history.js index 265fab3..b2b857b 100644 --- a/source/js/purchase_history.js +++ b/source/js/purchase_history.js @@ -41,10 +41,15 @@ export async function purchaseHandler() { }; let currentPage = 1; let itemsPerPage = 5; + let itemLength = 0; status1FilterEl.style.cssText = 'background-color: #FF597B; border-color: #FF597B; color: #FFFFFF;'; renderItemList(); + //targetPageLink = document.querySelectorAll('.list_item_pagination a[data-page="1"]'); + //console.log('링크 '+Array.for(targetPageLink)); + //var targetPageLinkHref = targetPageLink.href; + //targetPageLinkHref.classList.add('active-link'); //구매 상태 필터 이벤트 @@ -234,7 +239,14 @@ export async function purchaseHandler() { deal_canceled = item.isCanceled; deal_done = item.done; - titleEl.textContent = item.product.title; + let result = item.product.title; + + if (item.product.title.includes('/')) { + const index = item.product.title.indexOf('/'); + result = item.product.title.substring(0, index); + } + + titleEl.textContent = result; priceEl.textContent = item.product.price + ' 원'; timeEl.textContent = getdate(item.timePaid); const productInfoEl = document.createElement('div'); @@ -322,9 +334,10 @@ export async function purchaseHandler() { const listItems = listItemContainerEl.querySelectorAll('ul li'); console.log(listItems); - - updatePagination(listItems.length, itemsPerPage, currentPage); + itemLength = listItems.length; + updatePagination(itemLength, itemsPerPage, currentPage); displayPage(currentPage, itemsPerPage); + console.log(currentPage); } //페이지네이션 @@ -332,24 +345,76 @@ export async function purchaseHandler() { const numPages = Math.ceil(numItems / itemsPerPage); paginationContainer.innerHTML = ''; - for (let i = 1; i <= numPages; i++) { - const link = document.createElement('a'); - link.href = '#'; - link.classList.add('page-link'); - link.dataset.page = i; - link.textContent = i; - - if (i === currentPage) { - link.classList.add('active-link'); - } + const groupSize = 5; + const groupIndex = Math.floor((currentPage - 1) / groupSize); + const startPage = groupIndex * groupSize + 1; + const endPage = Math.min(startPage + groupSize - 1, numPages); + + // 처음으로 + const firstLink = createPaginationLink(currentPage - groupSize, '<<'); + paginationContainer.appendChild(firstLink); + + // 이전 + const prevLink = createPaginationLink(currentPage - groupSize, '<'); + paginationContainer.appendChild(prevLink); + if (currentPage === 1) { + firstLink.disabled = true; + prevLink.disabled = true; + firstLink.classList.add('arrow-link-unactive'); + prevLink.classList.add('arrow-link-unactive'); + } + else { + firstLink.disabled = false; + prevLink.disabled = false; + firstLink.classList.remove('arrow-link-unactive'); + prevLink.classList.remove('arrow-link-unactive'); + } + + for (let i = startPage; i <= endPage; i++) { + const link = createPaginationLink(i, i); paginationContainer.appendChild(link); + } + + // 다음 + const nextLink = createPaginationLink(endPage, '>'); + paginationContainer.appendChild(nextLink); + + + //마지막 + const lastLink = createPaginationLink(numPages, '>>'); + paginationContainer.appendChild(lastLink); + if (currentPage === numPages) { + nextLink.disabled = true; + lastLink.disabled = true; + nextLink.classList.add('arrow-link-unactive'); + lastLink.classList.add('arrow-link-unactive'); + } + else { + nextLink.disabled = false; + lastLink.disabled = false; + nextLink.classList.remove('arrow-link-unactive'); + lastLink.classList.remove('arrow-link-unactive'); + } + + } - // const activeLink = paginationContainer.querySelector('.active'); - // if (activeLink) { - // activeLink.classList.add('active-link'); - // } + function createPaginationLink(pageNumber, label) { + const link = document.createElement('a'); + link.href = '#'; + if (typeof label === 'number') { + link.classList.add('page-link'); + if (label === currentPage) { + link.classList.add('active-link'); + console.log("링크이동 "+currentPage); + } + } + else { + link.classList.add('arrow-link'); } + link.dataset.page = pageNumber; + link.textContent = label; + return link; } function displayPage(pageNum, itemsPerPage) { @@ -369,14 +434,32 @@ export async function purchaseHandler() { paginationContainer.addEventListener('click', (event) => { event.preventDefault(); const link = event.target; + console.log(link); if (link.classList.contains('page-link')) { const pageNum = parseInt(link.dataset.page, 10); + currentPage = pageNum; + updatePagination(itemLength, itemsPerPage, currentPage); displayPage(pageNum, itemsPerPage); - - paginationContainer.querySelectorAll('.page-link').forEach((link) => { - link.classList.remove('active-link'); - }); - link.classList.add('active-link'); + } + if (link.textContent === '<<') { + currentPage = 1; + updatePagination(itemLength, itemsPerPage, currentPage); + displayPage(currentPage, itemsPerPage); + } + if (link.textContent === '<') { + currentPage -= 1; + updatePagination(itemLength, itemsPerPage, currentPage); + displayPage(currentPage, itemsPerPage); + } + if (link.textContent === '>') { + currentPage += 1; + updatePagination(itemLength, itemsPerPage, currentPage); + displayPage(currentPage, itemsPerPage); + } + if (link.textContent === '>>') { + currentPage = Math.ceil(itemLength / itemsPerPage, currentPage); + updatePagination(itemLength, itemsPerPage, currentPage); + displayPage(currentPage, itemsPerPage); } }); From 7682b57becd85e6a6a6202651c195420cb7aeec5 Mon Sep 17 00:00:00 2001 From: jiyoon29 Date: Fri, 10 Mar 2023 02:10:26 +0900 Subject: [PATCH 05/84] =?UTF-8?q?feat:=20swiper=20=EB=B2=84=EC=A0=84=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.html | 83 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 49 insertions(+), 34 deletions(-) diff --git a/index.html b/index.html index 1612f92..a737862 100644 --- a/index.html +++ b/index.html @@ -1,38 +1,53 @@ + + + + + + + 투써클(TWO CIRCLE) - - - - - - - 투써클(TWO CIRCLE) + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - -
-
- - - \ No newline at end of file + +
+ + From 463de3e228514b859049ecfe55b39606398fe2fc Mon Sep 17 00:00:00 2001 From: jiyoon29 Date: Fri, 10 Mar 2023 02:31:06 +0900 Subject: [PATCH 06/84] =?UTF-8?q?feat:=20login=20=EA=B0=92=20=EC=97=86?= =?UTF-8?q?=EC=9D=84=EB=95=8C=20error=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 어드민 로그인시 링크 부분 --- source/route.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/route.js b/source/route.js index f44fcb8..e0389be 100644 --- a/source/route.js +++ b/source/route.js @@ -78,7 +78,7 @@ router.hooks({ } // 관리자 - if (auth.email === process.env.ADMIN && match.url === '') { + if (auth && auth.email === process.env.ADMIN && match.url === '') { loginNameEl.innerHTML = /* html */ ` 관리자페이지로 이동 `; From a6107a8195129ff2a2509772a817767afcbe03f4 Mon Sep 17 00:00:00 2001 From: jiyoon29 Date: Fri, 10 Mar 2023 02:32:31 +0900 Subject: [PATCH 07/84] docs: console.log delete --- source/route.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/source/route.js b/source/route.js index e0389be..b8e710a 100644 --- a/source/route.js +++ b/source/route.js @@ -148,21 +148,18 @@ router adminWrap(); adminPageRender(); const ativeNav = document.querySelector('.menu_prd_list'); - console.log({ ativeNav }); ativeNav.classList.add('now_page'); }, "admin/product_add": () => { adminWrap(); adminProductAdd(); const ativeNav = document.querySelector('.menu_prd_add'); - console.log({ ativeNav }); ativeNav.classList.add('now_page'); }, "admin/user_list": () => { adminWrap(); userListRender(); const ativeNav = document.querySelector('.menu_user_list'); - console.log({ ativeNav }); ativeNav.classList.add('now_page'); }, "admin/dashboard": () => { @@ -179,7 +176,6 @@ router adminWrap(); productUpdate(match.data.id); const ativeNav = document.querySelector('.menu_prd_list'); - console.log({ ativeNav }); ativeNav.classList.add('now_page'); }, }) From ce4e28c6c9f7415a9e281e6df6ee90fc89dbd3de Mon Sep 17 00:00:00 2001 From: jiyoon29 Date: Fri, 10 Mar 2023 02:35:49 +0900 Subject: [PATCH 08/84] feat: admin side bar add dashboard --- pages/admin_wrap.js | 6 ++---- source/route.js | 2 ++ 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pages/admin_wrap.js b/pages/admin_wrap.js index ec184b3..3bd08a9 100644 --- a/pages/admin_wrap.js +++ b/pages/admin_wrap.js @@ -18,12 +18,10 @@ export function adminWrap() {
diff --git a/source/route.js b/source/route.js index b8e710a..e1cfaad 100644 --- a/source/route.js +++ b/source/route.js @@ -165,6 +165,8 @@ router "admin/dashboard": () => { adminWrap(); dashBoardRender(); + const ativeNav = document.querySelector('.menu_dashboard'); + ativeNav.classList.add('now_page'); }, "admin/:id": (match) => { adminWrap(); From 5907dc68abb96fa62c807eabe8418dd1a62e2812 Mon Sep 17 00:00:00 2001 From: jiyoon29 Date: Fri, 10 Mar 2023 02:36:42 +0900 Subject: [PATCH 09/84] =?UTF-8?q?design:=20admin=20=EB=A7=81=ED=81=AC=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84=20=EB=B3=80=ED=99=94?= =?UTF-8?q?=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EB=94=94=EC=9E=90=EC=9D=B8=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scss/base/_preset.scss | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/scss/base/_preset.scss b/scss/base/_preset.scss index d24f269..c64d231 100644 --- a/scss/base/_preset.scss +++ b/scss/base/_preset.scss @@ -78,8 +78,11 @@ header { &_right { >div { display: flex; + .login_name a:hover { + border-bottom: 1px solid var(--font-color); + } - p:first-child::after { + >:first-child::after { display: inline-block; content: ""; border-left: 1px solid var(--gray-color); From 32c70602c462d835109937e8c81652c6bf26e197 Mon Sep 17 00:00:00 2001 From: jiyoon29 Date: Fri, 10 Mar 2023 02:39:18 +0900 Subject: [PATCH 10/84] =?UTF-8?q?fix:=20=EC=82=AD=EC=A0=9C=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=97=90=EB=9F=AC=20=EC=88=98=EC=A0=95,=20?= =?UTF-8?q?=ED=8C=90=EB=A7=A4=EC=A4=91=20=EB=A7=A4=EC=A7=84=20=EA=B8=80?= =?UTF-8?q?=EC=9E=90=EC=83=89=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scss/admin/admin_product_list.scss | 7 +++++++ source/js/admin/product_list.js | 5 ++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/scss/admin/admin_product_list.scss b/scss/admin/admin_product_list.scss index 3d2f041..b94f7a3 100644 --- a/scss/admin/admin_product_list.scss +++ b/scss/admin/admin_product_list.scss @@ -37,6 +37,7 @@ } :nth-child(6) { width: 15%; + } } @@ -61,6 +62,12 @@ color: var(--gray-color); } } + .sold { + color: #03c04a; + } + .sold_out { + color: #d21404; + } } } } \ No newline at end of file diff --git a/source/js/admin/product_list.js b/source/js/admin/product_list.js index bf5565c..ae2a157 100644 --- a/source/js/admin/product_list.js +++ b/source/js/admin/product_list.js @@ -1,4 +1,3 @@ -import { async } from "q"; import { allProduct } from "../../api/products/admin/allProduct_api.js"; import { productDelete } from "../../api/products/admin/product_delete.js"; @@ -27,7 +26,7 @@ function renderList(data) { ${prd.description}

${prd.price} 원

-

${prd.isSoldOut ? '품절' : '판매중'}

+

${prd.isSoldOut ? '품절' : '판매중'}

`; @@ -53,7 +52,7 @@ function renderList(data) { await productDelete(checkbox.dataset.id); } } - const list = await productList(); + const list = await allProduct(); renderList(list); }; choseDelete(); From db18b62cfc91099d97d47291accacca563194cc6 Mon Sep 17 00:00:00 2001 From: hyeon17 Date: Fri, 10 Mar 2023 20:47:12 +0900 Subject: [PATCH 11/84] =?UTF-8?q?feat:=20=EB=A1=9C=EA=B7=B8=EC=95=84?= =?UTF-8?q?=EC=9B=83=20=EC=8B=9C=20payment=EB=8D=B0=EC=9D=B4=ED=84=B0=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/js/admin/admin.js | 1 + source/route.js | 11 +++-------- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/source/js/admin/admin.js b/source/js/admin/admin.js index 43f944d..00e218c 100644 --- a/source/js/admin/admin.js +++ b/source/js/admin/admin.js @@ -15,6 +15,7 @@ export async function admin() { logoutBtn.addEventListener('click', async () => { await logout(accessToken); localStorage.removeItem('accessToken'); + localStorage.removeItem("payment"); location.href = '/'; }); } \ No newline at end of file diff --git a/source/route.js b/source/route.js index f44fcb8..3861931 100644 --- a/source/route.js +++ b/source/route.js @@ -30,6 +30,7 @@ import { userListRender } from '../pages/admin/admin_userlist.js'; import { admin } from './js/admin/admin.js'; import { dashBoardRender } from "../pages/admin/admin_dashboard.js"; + export const router = new Navigo('/'); router.hooks({ @@ -67,6 +68,7 @@ router.hooks({ logoutBtn.addEventListener('click', async () => { await logout(accessToken); localStorage.removeItem('accessToken'); + localStorage.removeItem('payment'); loginEl.style.display = 'flex'; logoutEl.style.display = 'none'; router.navigate("/"); @@ -76,14 +78,6 @@ router.hooks({ loginEl.style.display = 'flex'; logoutEl.style.display = 'none'; } - - // 관리자 - if (auth.email === process.env.ADMIN && match.url === '') { - loginNameEl.innerHTML = /* html */ ` - 관리자페이지로 이동 - `; - } - done(); }, after: (match) => { @@ -185,3 +179,4 @@ router }) .resolve(); + From 6a0296402b94ec3652ec6abf8297295ac310cc1f Mon Sep 17 00:00:00 2001 From: PHJ Date: Fri, 10 Mar 2023 21:12:28 +0900 Subject: [PATCH 12/84] =?UTF-8?q?fix:=20=EB=B3=80=EC=88=98=EB=AA=85?= =?UTF-8?q?=EC=9D=84=20=EC=BB=A8=EB=B2=A4=EC=85=98=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/js/purchase_history.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/source/js/purchase_history.js b/source/js/purchase_history.js index b2b857b..346b067 100644 --- a/source/js/purchase_history.js +++ b/source/js/purchase_history.js @@ -25,8 +25,8 @@ export async function purchaseHandler() { let product_title = ''; let product_price = 0; let product_time = ''; - let deal_done = false; - let deal_canceled = false; + let dealDone = false; + let dealCanceled = false; let list_items = ''; let detailId = ''; let filtered_items = ''; @@ -236,8 +236,8 @@ export async function purchaseHandler() { btnEl.classList.add('list_item_btn'); detailId = item.detailId; - deal_canceled = item.isCanceled; - deal_done = item.done; + dealCanceled = item.isCanceled; + dealDone = item.done; let result = item.product.title; @@ -254,15 +254,15 @@ export async function purchaseHandler() { productInfoEl.append(imgEl, titleEl); listItemEl.append(timeEl, productInfoEl, priceEl, btnEl); - if (deal_canceled == true && deal_done == false) { + if (dealCanceled == true && dealDone == false) { btnEl.textContent = '구매 취소'; listItemCancelEl.appendChild(listItemEl); } - if (deal_done == true && deal_canceled == false) { + if (dealDone == true && dealCanceled == false) { btnEl.textContent = '구매 확정'; listItemConfirmEl.appendChild(listItemEl); } - if (deal_done == false && deal_canceled == false) { + if (dealDone == false && dealCanceled == false) { console.log(detailId); const btnOkEl = document.createElement('div'); btnOkEl.classList.add('btn_ok'); @@ -274,7 +274,7 @@ export async function purchaseHandler() { btnOkEl.addEventListener('click', (e) => { //구매 확정 alert('구매가 확정되었습니다!'); - deal_done = true; + dealDone = true; detailId = item.detailId; console.log({ detailId }); purchaseOk({ detailId }); @@ -287,7 +287,7 @@ export async function purchaseHandler() { btnCancelEl.addEventListener('click', (e) => { //구매 취소 alert('구매가 취소되었습니다.'); - deal_canceled = true; + dealCanceled = true; detailId = item.detailId; console.log(item.isCanceled); purchaseCancel({ detailId }); From 4c9f47b2deba65e388aab4b3837d8b187b702317 Mon Sep 17 00:00:00 2001 From: PHJ Date: Fri, 10 Mar 2023 22:20:15 +0900 Subject: [PATCH 13/84] =?UTF-8?q?fix:=20=EB=B9=84=EB=B0=80=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=ED=99=95=EC=9D=B8,=20=EC=9C=A0=EC=A0=80=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EC=88=98=EC=A0=95=20=ED=8E=98=EC=9D=B4=EC=A7=80=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EB=A9=98=ED=86=A0=EB=8B=98=20=ED=94=BC?= =?UTF-8?q?=EB=93=9C=EB=B0=B1=EC=97=90=20=EB=A7=9E=EA=B2=8C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/js/pw_check.js | 18 +++++++++--------- source/js/user_info.js | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/source/js/pw_check.js b/source/js/pw_check.js index baf6c5e..2485207 100644 --- a/source/js/pw_check.js +++ b/source/js/pw_check.js @@ -27,18 +27,18 @@ export async function pwCheck(url) { }; const res = await pwCheckApi('POST', body); - try { - loginResult = await pwCheckApi("POST", body, login_check); - console.log(loginResult); - login_check = loginResult.status; - console.log(login_check); - } - catch (error) { + // try { + // loginResult = await pwCheckApi("POST", body, login_check); + // console.log(loginResult); + // login_check = loginResult.status; + // console.log(login_check); + // } + // catch (error) { - } + // } console.log(url) if (res.status === 200) { - alert('비밀번호 확인 성공!'); + //alert('비밀번호 확인 성공!'); if(url === "mypage/account"){ accountRender() }else{ diff --git a/source/js/user_info.js b/source/js/user_info.js index 79e97fa..cc977c9 100644 --- a/source/js/user_info.js +++ b/source/js/user_info.js @@ -185,7 +185,7 @@ export async function userInfoHandler() { changeModalEl.innerHTML = /* HTML */`

이름 변경

- 변경하실 이름을 입력하세요. + 변경하실 이름을 입력하세요. (이름은 한글만 가능합니다.)
From e0e9742dbb3ca698dfefa19f2bba85d7fbcfa655 Mon Sep 17 00:00:00 2001 From: PHJ Date: Fri, 10 Mar 2023 22:24:03 +0900 Subject: [PATCH 14/84] test --- package.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index f1fc3af..aab445f 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,11 @@ "scripts": { "dev": "parcel index.html", "build": "parcel build index.html", - "dev:3000": "parcel --port 3000 index.html" + "dev:3000": "parcel --port 3000 index.html", + "test": "parcel ./pages/user/user_information.html", + "test2": "parcel ./pages/user/purchase_history.html", + "test3": "parcel ./pages/user/password_check.html", + "test4": "parcel ./pages/user/password_change.html" }, "repository": { "type": "git", From 75e3e673d28b84d52de3d25f28128dda615956fc Mon Sep 17 00:00:00 2001 From: jiyoon29 Date: Fri, 10 Mar 2023 22:28:26 +0900 Subject: [PATCH 15/84] =?UTF-8?q?feat:=20product=20add=20main=20tag=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 상품 추가 시 메인태그 구별 기능 - 기능 구현에 따른 디자인 수정 --- pages/admin/product_add.js | 48 ++++++++++++++++++++--- scss/admin/product.scss | 3 ++ scss/admin/product_add.scss | 27 +++++++++++-- source/js/admin/product_add.js | 71 ++++++++++++++++++++++------------ 4 files changed, 116 insertions(+), 33 deletions(-) diff --git a/pages/admin/product_add.js b/pages/admin/product_add.js index cd2808e..067d617 100644 --- a/pages/admin/product_add.js +++ b/pages/admin/product_add.js @@ -10,21 +10,59 @@ export function adminProductAdd() {
-

제품이름

+

제품이름*

-

제품가격

+

제품가격*

-

제품 상세 설명

+

제품 상세 설명*

+
+

메인상품 진열

+
    +
  • + + +
  • +
  • + + +
  • +
  • + + +
  • +
+ 핫한 상품(6), MD 추천 상품(6), 신상품(12)까지만 보입니다. +

태그

- - 태그는 ', '로 구분해주세요 +
    +
  • + + +
  • +
  • + + +
  • +
  • + + +
  • +
  • + + +
  • +
  • + + +
  • +

제품 사진

diff --git a/scss/admin/product.scss b/scss/admin/product.scss index 7d0cd2b..a7c586d 100644 --- a/scss/admin/product.scss +++ b/scss/admin/product.scss @@ -40,17 +40,20 @@ } &_list { display: flex; + flex-wrap: wrap; > p { line-height: 3rem; background: var(--font-color); color: var(--white-color); padding: 0 1rem; margin-right: 1rem; + margin-bottom: 1rem; } } } .product_detail { + width: 40rem; margin-left: 5rem; font-size: 2rem; font-weight: 700; diff --git a/scss/admin/product_add.scss b/scss/admin/product_add.scss index 8d7097d..52dc0bf 100644 --- a/scss/admin/product_add.scss +++ b/scss/admin/product_add.scss @@ -12,15 +12,36 @@ > p { margin-bottom: 1rem; font-weight: 700; + b { + color: var(--pink-color); + } } - input { + input[type="text"] { border: 1px solid var(--gray-color); width: 35rem; height: 4rem; padding: 0 1rem; outline: none; - &[type="file"] { - display: none; + } + input[type="file"] { + display: none; + } + .main_tag { + display: flex; + li { + margin-right: 2rem; + } + } + .tag_list { + display: flex; + flex-wrap: wrap; + li { + margin-right: 2rem; + margin-bottom: 1rem; + &:nth-child(4), + &:nth-child(5) { + margin-bottom: 0; + } } } span { diff --git a/source/js/admin/product_add.js b/source/js/admin/product_add.js index fd1d956..14333ec 100644 --- a/source/js/admin/product_add.js +++ b/source/js/admin/product_add.js @@ -5,7 +5,8 @@ export function productAddItem() { const nameEl = document.querySelector('.product_name'); const priceEl = document.querySelector('.product_price'); const textEl = document.querySelector('.product_text'); - const tagEl = document.querySelector('.product_tag'); + const mainTagEl = document.querySelectorAll('[name="main_tag"]'); + const tagEl = document.querySelectorAll('[name="tag"]'); const thumbnailBtn = document.querySelector('.thumbnail_btn'); const thumbnailEl = document.querySelector('.product_thumbnail'); const photoBtn = document.querySelector('.photo_btn'); @@ -13,16 +14,16 @@ export function productAddItem() { const discountEl = document.querySelector('.product_discount'); const registrationBtn = document.querySelector('.product_registration'); - let name = ''; + let title = ''; let price = ''; - let text = ''; - let tag = ''; - let thumbnailImgBase64 = ''; - let photoImgBase64 = ''; - let discount = ''; + let description = ''; + let tags = []; + let thumbnailBase64 = ''; + let photoBase64 = ''; + let discountRate = ''; nameEl.addEventListener('input', e => { - name = e.target.value; + title = e.target.value; }); priceEl.addEventListener('input', e => { price = Number(e.target.value); @@ -31,10 +32,30 @@ export function productAddItem() { } }); textEl.addEventListener('input', e => { - text = e.target.value; + description = e.target.value; }); - tagEl.addEventListener('input', e => { - tag = e.target.value.split(', '); + + // 메인상품 진열 + mainTagEl.forEach(function (mainTag) { + mainTag.addEventListener('change', function (event) { + if (event.target.checked) { + tags.push(event.target.id); + } else { + tags = tags.filter(ele => ele !== event.target.id); + } + }); + }); + + + // 태그 + tagEl.forEach(function (tag) { + tag.addEventListener('change', function (event) { + if (event.target.checked) { + tags.push(event.target.dataset.id); + } else { + tags = tags.filter(ele => ele !== event.target.dataset.id); + } + }); }); // 제품 사진 @@ -46,10 +67,10 @@ export function productAddItem() { const reader = new FileReader(); reader.readAsDataURL(file); reader.addEventListener('load', e => { - thumbnailImgBase64 = e.target.result; + thumbnailBase64 = e.target.result; const img = document.querySelector('.thumbnail_img'); img.innerHTML = /* html */ ` - 썸네일 + 썸네일 `; }); }); @@ -63,33 +84,33 @@ export function productAddItem() { const reader = new FileReader(); reader.readAsDataURL(file); reader.addEventListener('load', e => { - photoImgBase64 = e.target.result; + photoBase64 = e.target.result; const img = document.querySelector('.photo_img'); img.innerHTML = /* html */ ` - 상세이미지 + 상세이미지 `; }); }); discountEl.addEventListener('input', e => { - discount = e.target.value; - if (isNaN(discount)) { + discountRate = e.target.value; + if (isNaN(discountRate)) { e.target.value = ''; } }); registrationBtn.addEventListener('click', async () => { await productAdd({ - title: name, - price: price, - description: text, - tags: tag, - thumbnailBase64: thumbnailImgBase64, - photoBase64: photoImgBase64, - discountRate: discount + title, + price, + description, + tags, + thumbnailBase64, + photoBase64, + discountRate }); - router.navigate("admin") + router.navigate("admin"); }); } From eaf4d1e0d584d6c74425209effb526397e8d5494 Mon Sep 17 00:00:00 2001 From: Nevacat Date: Fri, 10 Mar 2023 22:58:23 +0900 Subject: [PATCH 16/84] =?UTF-8?q?Docs:=20=EA=B8=B0=EB=8A=A5=EA=B3=BC=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=B6=84=EB=A6=AC=20=EC=9E=91?= =?UTF-8?q?=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/header.js | 60 +++-------------------- pages/user/signup.js | 100 +++------------------------------------ source/js/event_badge.js | 36 ++++++++++++++ source/js/header.js | 23 +++++++++ source/js/signup.js | 88 ++++++++++++++++++++++++++++++++++ 5 files changed, 161 insertions(+), 146 deletions(-) create mode 100644 source/js/event_badge.js create mode 100644 source/js/header.js create mode 100644 source/js/signup.js diff --git a/pages/header.js b/pages/header.js index 1cf13f1..db30b2e 100644 --- a/pages/header.js +++ b/pages/header.js @@ -1,4 +1,6 @@ -import { router } from '../source/route'; +import { eventBadgeHandler } from '../source/js/event_badge'; +import { headerHandler } from '../source/js/header'; + export function headerRender() { const wrap = document.querySelector('#wrap'); @@ -127,7 +129,7 @@ export function headerRender() { 최근 본 상품 - TOP +
@@ -181,7 +183,7 @@ export function headerRender() {

SNS

`; - - // 검색기능 - const search = document.querySelector('.search'); - const searchInput = document.querySelector('.search input'); - - search.addEventListener('submit', (e) => { - e.preventDefault(); - router.navigate(`product_search/${searchInput.value}`); - }); - - // 카트, 찜하기 개수 - const cartNum = document.querySelector('.cart_num'); - const heartNum = document.querySelector('.heart_num'); - - if (localStorage.getItem('basket')) { - cartNum.innerText = JSON.parse(localStorage.getItem('basket')).length; - } - if (localStorage.getItem('wish')) { - heartNum.innerText = JSON.parse(localStorage.getItem('wish')).length; - } - // TOP - const top = document.querySelector(".scroll_top") - top.addEventListener("click",()=>{ - window.scrollTo({top : 0, behavior: 'smooth'}) - }) - // 이벤트 베너 - const eventBanner = new Swiper('.event-swiper', { - slidesPerView: 1, - width: 100, - autoplay:true, - scrollbar: { - el: ".swiper-scrollbar", - draggable: true - }, - }); - // 스크롤 이벤트 - const eventSection = document.querySelector(".event") - window.addEventListener('scroll',_.throttle(()=>{ - if(window.scrollY<330){ - gsap.to(eventSection,.4,{ - opacity:0, - display:'none' - }) - }else{ - gsap.to(eventSection,.4,{ - opacity:1, - display:'block' - }) - } - },300)) + headerHandler() + eventBadgeHandler() } diff --git a/pages/user/signup.js b/pages/user/signup.js index 11dd11f..911989d 100644 --- a/pages/user/signup.js +++ b/pages/user/signup.js @@ -1,8 +1,8 @@ -import "../../scss/user/signup.scss" -import { signUp } from "../../source/api/certified/signup_api" +import '../../scss/user/signup.scss'; +import { signupHandler } from '../../source/js/signup'; -export function signupRender(){ - const app = document.querySelector("#app") +export function signupRender() { + const app = document.querySelector('#app'); app.innerHTML = /* html */ ` - ` - - // 회원가입 기능 + `; - const signUpForm = document.querySelector(".signup_form") - - let profileImgBase64 = "" - - signUpForm.addEventListener("submit",e=>{ - e.preventDefault() - // 비밀번호 확인 - const pwCheck = e.target[3].value - // 전송 할 Body - const body = { - // 각 Input에 해당하는 Value - email : e.target[1].value, - password : e.target[2].value, - displayName : e.target[0].value, - profileImgBase64 - } - // 비밀번호가 일치하면 전송 - if(body.password.length>=8 && body.password === pwCheck){ - signUp("POST",body) - }else if(body.password.length<7){ - alert("비밀번호가 옳바르지 않습니다.") - }else if(body.password.length>=8 && body.password != pwCheck){ - alert("비밀번호가 일치하지 않습니다.") - } - }) - - - // 비밀번호 일치 확인 - - const pw = document.querySelector(".signup_form_pw_input") - const pwCheck = document.querySelector(".signup_form_check_input") - - - // 비밀번호 - pw.addEventListener("input",e=>{ - const err = document.querySelector(".signup_form_pw_error") - const inputBox = document.querySelector(".signup_form_pw_input:focus") - if(e.target.value.length > 7){ - err.textContent = "사용 가능한 비밀번호 입니다." - err.style.color = "#2DB400" - inputBox.style.border="1px solid #2DB400" - }else{ - err.textContent = "8자 이상의 비밀번호를 입력하세요." - err.style.color = "var(--pink-color)" - inputBox.style.border="1px solid var(--pink-color)" - } - }) - - // 비밀번호 일치 여부 - pwCheck.addEventListener("input",e=>{ - const err = document.querySelector(".signup_form_check_error") - const inputBox = document.querySelector(".signup_form_check_input:focus") - if(e.target.value===pw.value&&e.target.value){ - err.textContent = "비밀번호가 일치합니다." - err.style.color = "#2DB400" - inputBox.style.border="1px solid #2DB400" - }else if(e.target.value!=pw.value || !e.target.value){ - err.textContent = "비빌번호가 일치하지 않습니다!" - err.style.color = "var(--pink-color)" - inputBox.style.border="1px solid var(--pink-color)" - } - }) - - // 이미지 파일 업로드 - const uploadName = document.querySelector(".upload_name") - const inputImgEl = document.querySelector(".signup_form_profil_input[type='file']") - const figureEl = document.querySelector(".signup_form_profil_img") - inputImgEl.addEventListener("change", ()=>{ - const file = inputImgEl.files[0] - if(file.size <= 1000000){ - uploadName.setAttribute("value",file.name) - figureEl.style.border = "1px solid #2DB400" - const reader = new FileReader() - reader.readAsDataURL(file) - reader.addEventListener("load",e=>{ - const imgEl = document.createElement("img") - imgEl.src = e.target.result - profileImgBase64 = e.target.result - figureEl.innerHTML = "" - figureEl.append(imgEl) - }) - }else{ - figureEl.innerHTML = "" - figureEl.style.border = "1px solid var(--pink-color)" - } - }) + // 회원가입 기능 + signupHandler() } diff --git a/source/js/event_badge.js b/source/js/event_badge.js new file mode 100644 index 0000000..da17a63 --- /dev/null +++ b/source/js/event_badge.js @@ -0,0 +1,36 @@ +export function eventBadgeHandler() { + // TOP + const top = document.querySelector('.scroll_top'); + top.addEventListener('click', () => { + window.scrollTo({ top: 0, behavior: 'smooth' }); + }); + // 이벤트 베너 + const eventBanner = new Swiper('.event-swiper', { + slidesPerView: 1, + width: 100, + loop: true, + autoplay: true, + scrollbar: { + el: '.swiper-scrollbar', + draggable: true, + }, + }); + // 스크롤 이벤트 + const eventSection = document.querySelector('.event'); + window.addEventListener( + 'scroll', + _.throttle(() => { + if (window.scrollY < 330) { + gsap.to(eventSection, 0.4, { + opacity: 0, + display: 'none', + }); + } else { + gsap.to(eventSection, 0.4, { + opacity: 1, + display: 'block', + }); + } + }, 300) + ); +} diff --git a/source/js/header.js b/source/js/header.js new file mode 100644 index 0000000..e4b2a42 --- /dev/null +++ b/source/js/header.js @@ -0,0 +1,23 @@ +import { router } from '../../source/route'; + +export function headerHandler() { + // 검색기능 + const search = document.querySelector('.search'); + const searchInput = document.querySelector('.search input'); + + search.addEventListener('submit', (e) => { + e.preventDefault(); + router.navigate(`product_search/${searchInput.value}`); + }); + + // 카트, 찜하기 개수 + const cartNum = document.querySelector('.cart_num'); + const heartNum = document.querySelector('.heart_num'); + + if (localStorage.getItem('basket')) { + cartNum.innerText = JSON.parse(localStorage.getItem('basket')).length; + } + if (localStorage.getItem('wish')) { + heartNum.innerText = JSON.parse(localStorage.getItem('wish')).length; + } +} diff --git a/source/js/signup.js b/source/js/signup.js new file mode 100644 index 0000000..7f3fe54 --- /dev/null +++ b/source/js/signup.js @@ -0,0 +1,88 @@ +import { signUp } from '../../source/api/certified/signup_api'; + +export function signupHandler() { + const signUpForm = document.querySelector('.signup_form'); + + let profileImgBase64 = ''; + + signUpForm.addEventListener('submit', (e) => { + e.preventDefault(); + // 비밀번호 확인 + const pwCheck = e.target[3].value; + // 전송 할 Body + const body = { + // 각 Input에 해당하는 Value + email: e.target[1].value, + password: e.target[2].value, + displayName: e.target[0].value, + profileImgBase64, + }; + // 비밀번호가 일치하면 전송 + if (body.password.length < 7) { + return alert('비밀번호가 옳바르지 않습니다.'); + } + if (body.password != pwCheck) { + return alert('비밀번호가 일치하지 않습니다.'); + } + return signUp('POST', body); + }); + + // 비밀번호 일치 확인 + + const pw = document.querySelector('.signup_form_pw_input'); + const pwCheck = document.querySelector('.signup_form_check_input'); + + // 비밀번호 + pw.addEventListener('input', (e) => { + const err = document.querySelector('.signup_form_pw_error'); + const inputBox = document.querySelector('.signup_form_pw_input:focus'); + if (e.target.value.length > 7) { + err.textContent = '사용 가능한 비밀번호 입니다.'; + err.style.color = '#2DB400'; + inputBox.style.border = '1px solid #2DB400'; + } else { + err.textContent = '8자 이상의 비밀번호를 입력하세요.'; + err.style.color = 'var(--pink-color)'; + inputBox.style.border = '1px solid var(--pink-color)'; + } + }); + + // 비밀번호 일치 여부 + pwCheck.addEventListener('input', (e) => { + const err = document.querySelector('.signup_form_check_error'); + const inputBox = document.querySelector('.signup_form_check_input:focus'); + if (e.target.value === pw.value && e.target.value) { + err.textContent = '비밀번호가 일치합니다.'; + err.style.color = '#2DB400'; + inputBox.style.border = '1px solid #2DB400'; + } else if (e.target.value != pw.value || !e.target.value) { + err.textContent = '비빌번호가 일치하지 않습니다!'; + err.style.color = 'var(--pink-color)'; + inputBox.style.border = '1px solid var(--pink-color)'; + } + }); + + // 이미지 파일 업로드 + const uploadName = document.querySelector('.upload_name'); + const inputImgEl = document.querySelector(".signup_form_profil_input[type='file']"); + const figureEl = document.querySelector('.signup_form_profil_img'); + inputImgEl.addEventListener('change', () => { + const file = inputImgEl.files[0]; + if (file.size <= 1000000) { + uploadName.setAttribute('value', file.name); + figureEl.style.border = '1px solid #2DB400'; + const reader = new FileReader(); + reader.readAsDataURL(file); + reader.addEventListener('load', (e) => { + const imgEl = document.createElement('img'); + imgEl.src = e.target.result; + profileImgBase64 = e.target.result; + figureEl.innerHTML = ''; + figureEl.append(imgEl); + }); + } else { + figureEl.innerHTML = ''; + figureEl.style.border = '1px solid var(--pink-color)'; + } + }); +} From 6c08500fa63ac5852428460141113c1da7ed526c Mon Sep 17 00:00:00 2001 From: Nevacat Date: Fri, 10 Mar 2023 22:59:43 +0900 Subject: [PATCH 17/84] =?UTF-8?q?Design:=20=EB=A1=9C=EB=94=A9Css->Scss?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=ED=99=98=20=EB=B0=8F=20=EC=A0=84=EB=B0=98?= =?UTF-8?q?=EC=A0=81=EC=9D=B8=20=EB=94=94=EC=9E=90=EC=9D=B8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scss/base/event.scss | 5 +- scss/base/loading.scss | 161 +++++++++++++++----------------- scss/user/user_information.scss | 2 +- 3 files changed, 79 insertions(+), 89 deletions(-) diff --git a/scss/base/event.scss b/scss/base/event.scss index b00c1f7..1ca4cc1 100644 --- a/scss/base/event.scss +++ b/scss/base/event.scss @@ -2,7 +2,7 @@ display: none; width: 100px; position: fixed; - right: 5rem; + right: 1rem; bottom: 5rem; z-index: 2; .swiper-container{ @@ -90,6 +90,9 @@ font-size: 13px; font-weight: 700; color: #fff; + padding: 0; + border: none; + outline: none; } } } \ No newline at end of file diff --git a/scss/base/loading.scss b/scss/base/loading.scss index a06f393..afd9e69 100644 --- a/scss/base/loading.scss +++ b/scss/base/loading.scss @@ -1,98 +1,85 @@ .dot-wrap{ width: 7rem; margin: 20rem auto; + .dot-spinner { + --uib-size: 7rem; + --uib-speed: .9s; + --uib-color: black; + + position: relative; + display: flex; + align-items: center; + justify-content: center; + height: var(--uib-size); + width: var(--uib-size); + .dot-spinner__dot{ + position: absolute; + top: 0; + left: 0; + display: flex; + align-items: center; + justify-content: flex-start; + height: 100%; + width: 100%; + &::before { + content: ''; + height: 20%; + width: 20%; + border-radius: 50%; + background-color: var(--uib-color); + transform: scale(0); + opacity: 0.5; + animation: pulse calc(var(--uib-speed) * 1.111) ease-in-out infinite; + } + &:nth-child(2) { + transform: rotate(45deg); + &::before { + animation-delay: calc(var(--uib-speed) * -0.875); + } + } + &:nth-child(3) { + transform: rotate(90deg); + &::before { + animation-delay: calc(var(--uib-speed) * -0.75); + } + } + &:nth-child(4) { + transform: rotate(135deg); + &::before { + animation-delay: calc(var(--uib-speed) * -0.625); + } + } + &:nth-child(5) { + transform: rotate(180deg); + &::before { + animation-delay: calc(var(--uib-speed) * -0.5); + } + } + &:nth-child(6) { + transform: rotate(225deg); + &::before { + animation-delay: calc(var(--uib-speed) * -0.375); + } + } + &:nth-child(7) { + transform: rotate(270deg); + &::before { + animation-delay: calc(var(--uib-speed) * -0.25); + } + } + &:nth-child(8) { + transform: rotate(315deg); + &::before { + animation-delay: calc(var(--uib-speed) * -0.125); + } + } + } + } } -.dot-spinner { - --uib-size: 7rem; - --uib-speed: .9s; - --uib-color: black; - - position: relative; - display: flex; - align-items: center; - justify-content: center; - height: var(--uib-size); - width: var(--uib-size); -} - -.dot-spinner__dot { - position: absolute; - top: 0; - left: 0; - display: flex; - align-items: center; - justify-content: flex-start; - height: 100%; - width: 100%; -} - -.dot-spinner__dot::before { - content: ''; - height: 20%; - width: 20%; - border-radius: 50%; - background-color: var(--uib-color); - transform: scale(0); - opacity: 0.5; - animation: pulse calc(var(--uib-speed) * 1.111) ease-in-out infinite; -} - -.dot-spinner__dot:nth-child(2) { - transform: rotate(45deg); -} - -.dot-spinner__dot:nth-child(2)::before { - animation-delay: calc(var(--uib-speed) * -0.875); -} - -.dot-spinner__dot:nth-child(3) { - transform: rotate(90deg); -} - -.dot-spinner__dot:nth-child(3)::before { - animation-delay: calc(var(--uib-speed) * -0.75); -} - -.dot-spinner__dot:nth-child(4) { - transform: rotate(135deg); -} - -.dot-spinner__dot:nth-child(4)::before { - animation-delay: calc(var(--uib-speed) * -0.625); -} - -.dot-spinner__dot:nth-child(5) { - transform: rotate(180deg); -} - -.dot-spinner__dot:nth-child(5)::before { - animation-delay: calc(var(--uib-speed) * -0.5); -} - -.dot-spinner__dot:nth-child(6) { - transform: rotate(225deg); -} - -.dot-spinner__dot:nth-child(6)::before { - animation-delay: calc(var(--uib-speed) * -0.375); -} - -.dot-spinner__dot:nth-child(7) { - transform: rotate(270deg); -} -.dot-spinner__dot:nth-child(7)::before { - animation-delay: calc(var(--uib-speed) * -0.25); -} -.dot-spinner__dot:nth-child(8) { - transform: rotate(315deg); -} -.dot-spinner__dot:nth-child(8)::before { - animation-delay: calc(var(--uib-speed) * -0.125); -} @keyframes pulse { 0%, diff --git a/scss/user/user_information.scss b/scss/user/user_information.scss index 8d1b78b..52a8c8c 100644 --- a/scss/user/user_information.scss +++ b/scss/user/user_information.scss @@ -31,7 +31,7 @@ border: 0.1rem solid lightgray; cursor: pointer; height: 3rem; - width: 10rem; + width: 11rem; font-weight: 600; margin-left: 3rem; From e75170303a5b20ea92da05d79fa2c38e7a98818f Mon Sep 17 00:00:00 2001 From: Nevacat Date: Fri, 10 Mar 2023 23:01:19 +0900 Subject: [PATCH 18/84] =?UTF-8?q?Docs:=20else=20if=20->=20if=20return=20?= =?UTF-8?q?=EB=B3=80=ED=99=98=20=EB=B0=8F=20=ED=95=84=EC=9A=94=EC=97=86?= =?UTF-8?q?=EB=8A=94=20=ED=8C=8C=EC=9D=BC=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/api/certified/login_api.js | 38 ++++++++++++++---------------- source/api/certified/signup_api.js | 14 +++++++---- source/api/userAPI.js | 0 source/api/util.js | 0 4 files changed, 27 insertions(+), 25 deletions(-) delete mode 100644 source/api/userAPI.js delete mode 100644 source/api/util.js diff --git a/source/api/certified/login_api.js b/source/api/certified/login_api.js index e4a081a..7d1c2ca 100644 --- a/source/api/certified/login_api.js +++ b/source/api/certified/login_api.js @@ -1,26 +1,24 @@ -import { router } from "../../route"; -import { url, headers } from "../requests" - - +import { router } from '../../route'; +import { url, headers } from '../requests'; export async function login(method, data) { - const res = await fetch(url + "/auth/login", { + const res = await fetch(url + '/auth/login', { method, headers, - body: JSON.stringify(data) - }) - const json = await res.json() - if (res.status === 200) { - localStorage.setItem("accessToken", JSON.stringify(json.accessToken)); - if(json.user.email === process.env.ADMIN){ - alert("관리자님 환영합니다.") - router.navigate("admin") - }else{ - alert("로그인 성공!"); - history.go(-1); - } - } else { - alert("아이디와 비밀번호가 일치하지 않습니다.!"); + body: JSON.stringify(data), + }); + const json = await res.json(); + if (res.status !== 200) { + return alert('아이디와 비밀번호가 일치하지 않습니다.!'); + } + + localStorage.setItem('accessToken', JSON.stringify(json.accessToken)); + + if (json.user.email === process.env.ADMIN) { + alert('관리자님 환영합니다.'); + return router.navigate('admin'); } + alert('로그인 성공!'); + history.go(-1); return res; -} \ No newline at end of file +} diff --git a/source/api/certified/signup_api.js b/source/api/certified/signup_api.js index 2b2c064..087a634 100644 --- a/source/api/certified/signup_api.js +++ b/source/api/certified/signup_api.js @@ -10,12 +10,16 @@ export async function signUp(method, data){ }) const json = await res.json() if(res.status===401){ - alert("이미 존재하는 이메일 입니다.") - }else if(res.status === 400){ - alert("옳바른 정보를 입력해주세요.") - }else if(res.status === 200){ + return alert("이미 존재하는 이메일 입니다.") + } + + if(res.status === 400){ + return alert("옳바른 정보를 입력해주세요.") + } + + if(res.status === 200){ alert("TwoCircle 회원이 되신 것을 환영합니다!") - router.navigate("login") + return router.navigate("login") } } diff --git a/source/api/userAPI.js b/source/api/userAPI.js deleted file mode 100644 index e69de29..0000000 diff --git a/source/api/util.js b/source/api/util.js deleted file mode 100644 index e69de29..0000000 From 9b13766577fe8109ce886c07d3d25a6a0d03ac23 Mon Sep 17 00:00:00 2001 From: Nevacat Date: Fri, 10 Mar 2023 23:02:12 +0900 Subject: [PATCH 19/84] =?UTF-8?q?feat:=20=EB=B9=84=EB=B0=80=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=ED=99=95=EC=9D=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 비밀번호 확인 후 다시 새로고침하면 인증을 거치지않고 바로 정보를 확인할 수 있도록 수정 --- source/api/certified/authcheck_api.js | 1 + source/api/certified/logout_api.js | 1 + source/js/pw_check.js | 1 + 3 files changed, 3 insertions(+) diff --git a/source/api/certified/authcheck_api.js b/source/api/certified/authcheck_api.js index 6674115..950b419 100644 --- a/source/api/certified/authcheck_api.js +++ b/source/api/certified/authcheck_api.js @@ -13,6 +13,7 @@ export async function authCheck(accessToken) { }) if(res.status !== 200) { localStorage.removeItem("accessToken") + localStorage.removeItem("pwCheck") return null; } return await res.json(); diff --git a/source/api/certified/logout_api.js b/source/api/certified/logout_api.js index 6db9422..4c14f0f 100644 --- a/source/api/certified/logout_api.js +++ b/source/api/certified/logout_api.js @@ -10,6 +10,7 @@ export async function logout(accessToken) { }); if (res.status === 200) { alert("로그아웃!"); + localStorage.removeItem("pwCheck") } return res.json(); } \ No newline at end of file diff --git a/source/js/pw_check.js b/source/js/pw_check.js index e11305f..68edccf 100644 --- a/source/js/pw_check.js +++ b/source/js/pw_check.js @@ -35,6 +35,7 @@ export async function pwCheck(url) { } if (res.status === 200) { alert('비밀번호 확인 성공!'); + localStorage.setItem("pwCheck",true) if(url === "mypage/account"){ accountRender() }else{ From 0fb93886b80baab764d2ac47fb84261ec539342c Mon Sep 17 00:00:00 2001 From: Nevacat Date: Fri, 10 Mar 2023 23:03:23 +0900 Subject: [PATCH 20/84] =?UTF-8?q?Docs:=20await=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/js/login.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/js/login.js b/source/js/login.js index 9ed9fee..ddc5587 100644 --- a/source/js/login.js +++ b/source/js/login.js @@ -9,6 +9,6 @@ export function loginHandler(){ email: e.target[0].value, password: e.target[1].value } - login("POST", body) + await login("POST", body) }) } \ No newline at end of file From dd829e8010b69f320ccc09aa72b0c72599347a02 Mon Sep 17 00:00:00 2001 From: Nevacat Date: Fri, 10 Mar 2023 23:09:14 +0900 Subject: [PATCH 21/84] =?UTF-8?q?Design:=20=EB=A1=9C=EA=B7=B8=EC=9D=B8,=20?= =?UTF-8?q?=ED=9A=8C=EC=9B=90=EA=B0=80=EC=9E=85=20margin=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20padding=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scss/user/login.scss | 7 +++---- scss/user/signup.scss | 3 +-- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/scss/user/login.scss b/scss/user/login.scss index ac7f2da..e69f474 100644 --- a/scss/user/login.scss +++ b/scss/user/login.scss @@ -21,8 +21,7 @@ a { max-width: 44rem; margin: 0 auto; text-align: center; - margin-top: 9rem; - margin-bottom: 6rem; + padding: 9rem 0; // 로그인 제목 .login_section_title { @@ -69,7 +68,7 @@ a { .icon_person { position: absolute; right: 2.6rem; - top: 7.8rem; + top: 16.8rem; } // 비밀번호 입력 @@ -81,7 +80,7 @@ a { .icon_lock { position: absolute; right: 2.6rem; - top: 15.2rem; + top: 24.2rem; } // 버튼 diff --git a/scss/user/signup.scss b/scss/user/signup.scss index 6b5ff2b..836ea2b 100644 --- a/scss/user/signup.scss +++ b/scss/user/signup.scss @@ -18,8 +18,7 @@ max-width: 41rem; margin: 0 auto; text-align: start; - margin-top: 9rem; - margin-bottom: 6rem; + padding: 9rem 0; // 회원가입 제목 .signup_section_title { From 8e42ea6324d0ac2851f943469de8724174d08db1 Mon Sep 17 00:00:00 2001 From: jiyoon29 Date: Sat, 11 Mar 2023 04:15:12 +0900 Subject: [PATCH 22/84] =?UTF-8?q?feat:=20main=20product=20=EC=A7=84?= =?UTF-8?q?=EC=97=B4=20=ED=83=9C=EA=B7=B8=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 태그에서 메인 진열되는 부분 분리 작업 --- scss/admin/product.scss | 3 ++- source/js/admin/product.js | 27 +++++++++++++++++++++++++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/scss/admin/product.scss b/scss/admin/product.scss index a7c586d..880f88c 100644 --- a/scss/admin/product.scss +++ b/scss/admin/product.scss @@ -30,7 +30,8 @@ } } - .tag_box { + .tag_box, + .main_tag_box { margin-bottom: 2rem; span { display: block; diff --git a/source/js/admin/product.js b/source/js/admin/product.js index b6bc963..039d15f 100644 --- a/source/js/admin/product.js +++ b/source/js/admin/product.js @@ -13,6 +13,8 @@ function renderProduct(data) { const adminWrap = document.querySelector('.admin_wrap'); const titleEl = document.querySelector('.title'); let tag = false; + const mainTag = Array.from(data.tags).filter(ele => ['best', 'md', 'new'].includes(ele)); + const productTag = Array.from(data.tags).filter(ele => !mainTag.includes(ele)); titleEl.innerHTML = /* html */ `

${data.title}

@@ -31,6 +33,12 @@ function renderProduct(data) {

이름${data.title}

가격${data.price.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")}원

설명${data.description}

+ ${data.tags.includes('best') || data.tags.includes('md') || data.tags.includes('new') ? + ` +
+ 메인상품 진열 +
+ ` : ''} ${data.tags == '' ? '' : '
태그
' } @@ -45,12 +53,27 @@ function renderProduct(data) {
`; - if (Array.isArray(data.tags)) { + // 메인상품 진열 + if (data.tags.includes('best') || data.tags.includes('md') || data.tags.includes('new')) { + const mainTagEl = document.querySelector('.main_tag_box'); + const divEl = document.createElement('div'); + divEl.classList = 'tag_box_list'; + const tags = mainTag.map((e) => { + const pEl = document.createElement('p'); + pEl.innerText = e; + return pEl; + }); + divEl.append(...tags); + mainTagEl.append(divEl); + } + + // 태그 + if (Array.isArray(data.tags) && data.tags.length !== 0) { tag = true; const tagBox = document.querySelector('.tag_box'); const divEl = document.createElement('div'); divEl.classList = 'tag_box_list'; - const tags = data.tags.map((e) => { + const tags = productTag.map((e) => { const pEl = document.createElement('p'); pEl.innerText = e; return pEl; From da95f2e9d690a215aaf6876dac1e07121886e8f6 Mon Sep 17 00:00:00 2001 From: JangHyeonJun Date: Sun, 12 Mar 2023 06:14:33 +0900 Subject: [PATCH 23/84] =?UTF-8?q?feat:=20=ED=8E=98=EC=9D=B4=EC=A7=80?= =?UTF-8?q?=EB=84=A4=EC=9D=B4=EC=85=98=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/admin/admin_dashboard.js | 5 +- scss/admin/admin_dashboard.scss | 34 ++++--- source/js/admin/admin_dashboard.js | 139 ++++++++++++++++++++++++++--- 3 files changed, 152 insertions(+), 26 deletions(-) diff --git a/pages/admin/admin_dashboard.js b/pages/admin/admin_dashboard.js index 643a75b..c1dc917 100644 --- a/pages/admin/admin_dashboard.js +++ b/pages/admin/admin_dashboard.js @@ -34,10 +34,7 @@ export function dashBoardRender() {
-
- - -
+
diff --git a/scss/admin/admin_dashboard.scss b/scss/admin/admin_dashboard.scss index 7e725db..fb525a6 100644 --- a/scss/admin/admin_dashboard.scss +++ b/scss/admin/admin_dashboard.scss @@ -40,6 +40,7 @@ .dashboard_table { border: 1px solid #ddd; padding: 1rem; + margin-bottom: 1rem; /* 테이블 타이틀 스타일링 */ .table_title { @@ -67,7 +68,7 @@ } .navbar_date { - flex: 2; + flex: 1.5; } .navbar_user { @@ -123,7 +124,7 @@ } .content_date { - flex: 2; + flex: 1.5; } .content_user { @@ -181,18 +182,29 @@ } } } - .table_pagination{ - display:flex; + + .table_pagination { + display: flex; justify-content: center; align-items: center; - button{ - width: 8rem; - height: 5rem; - margin: 2rem 8rem; - cursor: pointer; - border: 2px solid var(--pink-color); - background-color: #fff + margin: 2rem; + + .dashboard-link { + text-align: center; + width: 4rem; + padding: 1rem; + margin: 1rem; + border: 1px solid #ddd; + border-radius: 0.5rem; + text-decoration: none; + color: black; + transition: .5s; + &:hover { + background-color: var(--pink-color); + color: #eee; + } } + } } diff --git a/source/js/admin/admin_dashboard.js b/source/js/admin/admin_dashboard.js index f2a5f20..7b5d73f 100644 --- a/source/js/admin/admin_dashboard.js +++ b/source/js/admin/admin_dashboard.js @@ -8,10 +8,15 @@ export async function dashBoardHandler() { await productDataHandler(); const products = await allProduct(); const users = await userlist(); - const items = await transactionDetail(); + const itemList = await transactionDetail(); const dot = document.querySelector(".dot-wrap"); - const prevEl = document.querySelector(".pagination_prev"); - const nextEl = document.querySelector(".pagination_next"); + const pageNationEl = document.querySelector(".table_pagination"); + let itemLength = 0; + let currentPage = 1; + let itemsPerPage = 10; + let sum = 0; + let index = 0; + // 차트를 그릴 캔버스 요소 const canvas = document.querySelector("#myChart"); @@ -67,9 +72,7 @@ export async function dashBoardHandler() { }, }); - let index = 0; - let sum = 0; - const liEl = items.map((item) => { + const liEl = itemList.map((item) => { const listEl = document.createElement("div"); listEl.classList.add("list"); const numberEl = document.createElement("div"); @@ -152,6 +155,125 @@ export async function dashBoardHandler() { const tableEl = document.querySelector(".table_content"); tableEl.append(...liEl); + const listItems = document.querySelectorAll(".list"); + itemLength = listItems.length; + updatePageNation(itemLength, itemsPerPage, currentPage); + displayPage(currentPage, itemsPerPage); + + function updatePageNation(numItems, itemsPerPage, currentPage) { + const numPages = Math.ceil(numItems / itemsPerPage); + pageNationEl.innerHTML = ""; + + const groupSize = 5; + const groupIndex = Math.floor((currentPage - 1) / groupSize); + const startPage = groupIndex * groupSize + 1; + const endPage = Math.min(startPage + groupSize - 1, numPages); + + const firstLink = createPageNation(currentPage - groupSize, "<<"); + pageNationEl.appendChild(firstLink); + + const prevLink = createPageNation(currentPage - groupSize, "<"); + pageNationEl.appendChild(prevLink); + if (currentPage === 1) { + disableLink(firstLink); + disableLink(prevLink); + } + + for (let i = startPage; i <= endPage; i++) { + const link = createPageNation(i, i); + pageNationEl.appendChild(link); + } + + const nextLink = createPageNation(currentPage + 1, ">"); + pageNationEl.appendChild(nextLink); + + const lastLink = createPageNation(numPages, ">>"); + pageNationEl.appendChild(lastLink); + if (currentPage === numPages) { + disableLink(nextLink); + disableLink(lastLink); + } + } + + function createPageNation(pageNumber, label) { + const link = document.createElement("a"); + link.classList.add("dashboard-link"); + link.href = "#"; + if (typeof label === "number") { + link.classList.add("page-link"); + if (label === currentPage) { + link.classList.add("active-link"); + } + } else { + link.classList.add("arrow-link"); + } + link.dataset.page = pageNumber; + link.textContent = label; + return link; + } + + function disableLink(link) { + link.disabled = true; + link.classList.add("arrow-link-unactive"); + } + + function displayPage(pageNum, itemsPerPage) { + const startIndex = (pageNum - 1) * itemsPerPage; + const endIndex = startIndex + itemsPerPage; + + listItems.forEach((item) => { + item.style.display = "none"; + }); + + for (let i = startIndex; i < endIndex && i < listItems.length; i++) { + listItems[i].style.display = "flex"; + } + } + + pageNationEl.addEventListener("click", (event) => { + event.preventDefault(); + const link = event.target; + + if (link.classList.contains("page-link")) { + const pageNum = parseInt(link.dataset.page, 10); + currentPage = pageNum; + updatePageNation(itemLength, itemsPerPage, currentPage); + displayPage(pageNum, itemsPerPage); + } + if (link.textContent === "<<") { + if (currentPage === 1) { + return; + } + currentPage = 1; + updatePageNation(itemLength, itemsPerPage, currentPage); + displayPage(currentPage, itemsPerPage); + } + if (link.textContent === "<") { + if (currentPage === 1) { + return; + } + currentPage -= 1; + updatePageNation(itemLength, itemsPerPage, currentPage); + displayPage(currentPage, itemsPerPage); + } + if (link.textContent === ">") { + if (currentPage === Math.ceil(itemLength / itemsPerPage)) { + return; + } + currentPage += 1; + updatePageNation(itemLength, itemsPerPage, currentPage); + displayPage(currentPage, itemsPerPage); + } + if (link.textContent === ">>") { + if (currentPage === Math.ceil(itemLength / itemsPerPage)) { + return; + } + currentPage = Math.ceil(itemLength / itemsPerPage, currentPage); + updatePageNation(itemLength, itemsPerPage, currentPage); + displayPage(currentPage, itemsPerPage); + } + }); + const itemCountEl = document.querySelector(".summary_itemcount"); const saleSumEl = document.querySelector(".summary_salesum"); const memberEl = document.querySelector(".summary_member"); @@ -161,10 +283,5 @@ export async function dashBoardHandler() { ); memberEl.append(`회원 수 : ${users.length}명`); - - - prevEl.addEventListener("click", () => {}); - nextEl.addEventListener("click", () => {}); - dot.style.display = "none"; } From 94dad969acd7e0851f4884d1d7f045c5a1d39d3b Mon Sep 17 00:00:00 2001 From: JangHyeonJun Date: Sun, 12 Mar 2023 06:15:00 +0900 Subject: [PATCH 24/84] =?UTF-8?q?feat:=20=EC=84=A0=ED=83=9D=EB=90=9C=20?= =?UTF-8?q?=EC=9D=80=ED=96=89=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EC=B9=B4?= =?UTF-8?q?=EB=93=9C=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/js/payment.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/source/js/payment.js b/source/js/payment.js index c6d4351..51138c3 100644 --- a/source/js/payment.js +++ b/source/js/payment.js @@ -93,6 +93,24 @@ export async function paymentHandler() { if (selectedBank.bankName === "KB국민은행") { cardImg.innerHTML = `KB국민은행`; } + if (selectedBank.bankName === "신한은행") { + cardImg.innerHTML = `신한은행`; + } + if (selectedBank.bankName === "우리은행") { + cardImg.innerHTML = `우리은행`; + } + if (selectedBank.bankName === "하나은행") { + cardImg.innerHTML = `하나은행`; + } + if (selectedBank.bankName === "케이뱅크") { + cardImg.innerHTML = `케이뱅크`; + } + if (selectedBank.bankName === "카카오뱅크") { + cardImg.innerHTML = `카카오뱅크`; + } + if (selectedBank.bankName === "NH농협은행") { + cardImg.innerHTML = `NH농협은행`; + } } else { // 선택된 계좌 정보가 존재하지 않을 경우 alert("계좌를 선택해주세요"); From 5861d31fcb38f212fd0930addc054e7a11dbffe7 Mon Sep 17 00:00:00 2001 From: JangHyeonJun Date: Mon, 13 Mar 2023 03:14:24 +0900 Subject: [PATCH 25/84] =?UTF-8?q?design:=20=EB=8C=80=EC=8B=9C=EB=B3=B4?= =?UTF-8?q?=EB=93=9C=20=EB=94=94=EC=9E=90=EC=9D=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- image/box.png | Bin 0 -> 13124 bytes image/usercount.png | Bin 0 -> 13688 bytes image/won.png | Bin 0 -> 8277 bytes pages/admin/admin_dashboard.js | 6 +++--- scss/admin/admin_dashboard.scss | 20 +++++++++++--------- source/js/admin/admin_dashboard.js | 7 ++++--- static/image/box.png | Bin 0 -> 13124 bytes static/image/usercount.png | Bin 0 -> 13688 bytes static/image/won.png | Bin 0 -> 8277 bytes 9 files changed, 18 insertions(+), 15 deletions(-) create mode 100644 image/box.png create mode 100644 image/usercount.png create mode 100644 image/won.png create mode 100644 static/image/box.png create mode 100644 static/image/usercount.png create mode 100644 static/image/won.png diff --git a/image/box.png b/image/box.png new file mode 100644 index 0000000000000000000000000000000000000000..08a1a5431874c4cacd50f768aeb5707883453792 GIT binary patch literal 13124 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 literal 0 HcmV?d00001 diff --git a/image/usercount.png b/image/usercount.png new file mode 100644 index 0000000000000000000000000000000000000000..4072c528c6c2501c63950d73c7bf6444b1b0e0d4 GIT binary patch literal 13688 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 PDZo${rBkKl^zi=yrrpvz literal 0 HcmV?d00001 diff --git a/image/won.png b/image/won.png new file mode 100644 index 0000000000000000000000000000000000000000..2fe33eeebf26bc7ca5e8b42b6b055eb6388796d6 GIT binary patch literal 8277 zcmeHM`#)3v<9Ew_OhoRtT+8LnY~()o+gw&jT2W$?Y2lc7E0>XS&)ufxz9C7Z4$7rM zrNm0DR&)^uLn>WV-_z%x`26tw>~Z!u+aBj^=R9A}=j-`=zIHAE=Yfz^krWURKzMn& z1_=lV!7qgb#D(GAaMO-acqbf>_1YsYF8*@Xe+GUlLGcWU7Z8vt{reQ8E?@r)f2f?` zwm$)XA~Jy*9(PQDN~M~TVvolk4W}G4JrNg0=i8~k-y;y!gu~BAqa;T5EK#?*&-??E+Hu;jgXN=%59Zb*ruqoU0Fp{OaAPR>{tS2uSLPcLsDUq76GKwuDl&)$8(`$G-n#e4l`X7=s7_aEjy&M!cVOUwL~)wNIS zpTB(F`1bwB&&^-I7sX##2?(h6dAU08*{-}iD3MmS{#$hQw?i0fz!&k=gZ!N5VF7&TUE$l$&|?#-h}o+hce|8{qa=Q(|`hSH;aOe6$I>8 zTkoNstK)8TGoA69)4L$kZ28!J)=$yfH!pz_l%Zt@$o(CrIiSZ{(17F6+%9{1Dns<; zu*5Y{6fytJFHeG|b$FsRaC^sUuK`kuuaO4CuLiJ0s6ll`!ZN4Zv(WqvFXkpbRbAK-shY>TI89XXW>u)8nXT zJHqEpZ^P~HZgLjhe5?Rv4@$H;a8e6y-?#{}DMQiHz{XoMFd+DVFwS$lksqhgAUQ;aXt7Ag=Z(#fCuZdv`H}zAq_y)58^08tVCs? z_Xr`LZL5jf4m8E?6?|q@4K~lvo*vl zmhCp&x23;Wx1F#9>St*Fj*!EhH=mnh(Tvqo=fRh2m}Sz02yT8Cvt8_W6J;B~o2B_l zsi5w@@vDoqW^~w8fj3zLVURdLtf)D zX+oe(*@st88LGzshnYbi12M9=q`W4+!=4rs1Uge*=^Wglj?;7$4iWtsXx+!*ROM)TLXf;b4YULoD%h0=;V-H)02XtHjGXuJnIRrri>BQRh zKA9GD23RpebA|zTl^hA`(b2?-+j;TSJ!_2+iRtn}jzQF2LEp2%)0B*!Z3wiRu`GTA z#h9t_@!NQ*AG6U2yG|>QQF;?*tQ7V1ll`jT9j??!po#&JSzkB zPI)ftK({jFyB66g8W}ud$3KiTzgoV9xa7V-sx%|)FG&T@2eW$-xQ?$)?Omb@!GRmv zj4*;X?`6@FKjDhB_doCR;^k8^I`k0LgL4O<*IDwk64p;e_p<>#*Yz0!uUvS#<}IN( z-f4=^su2)14CzAcw35^>C7fk})|c#*Ex4~hV=PIdEjgg4Qvmmj;K7qJe@PSV9U23B zSgPW^HXMSu!ONB_we7k~8g;R1jF^{na8jkiwg$|ibS_`w^k<@CTr$bC5iicLdgT`O zd-4`2ojb2qg1SWoCpq>a2E7NKFtsO73Id0R$J#B~Kev)zl!?*@##+v@do@W$`@IOV z)*)Z4fMzXwGdxv{5yPz%4b`;|4%(1o#O$sHFBLWYV(q*lWssYV$H1^Jo3@jJ7tFlw%abMM(2q(2C0c+rR%kWrrD=P&-I$qQed%`+o-2!ka zzV(=;Dqs-$DL8;?K1sy@kB7&~YuG!lqY^nR8$+?%3c&Tka}Ggt7Y+J zH-H&lJN(6p17MrlYx(xpzhCCUfRAzpIhT0?1uMV3c($YaYvLf8w0FG{93JgqswZzR zWwU(0F98$5M?;6Q-u3K55or(A{dg@x)(*Dt&(5ajlR8w@F4?>C43lPeLZ%t-uGw&E zB+cwRd6tyT?tc*1vz2i5{3z?+5RQjUI&xekMruZ%rPE8d!UZf=|L+Y~qJo zpXS0k>K#`71^ZONrLWEHH;}KNXNl5>)}EAc{IWg%V!KOCv)`8&kn}+havxap|1Am0 zqzAV%V@1{eEV&X+5t5D_hVEl%@94KU<7rXRC{*6-t3I}~I1yPmNF8zz;*{n_yIQ;@6 znqMw(mc`9#oOqpf*0-!n!DFXZCnHfrsS%|=b+I~qR)ygD%(u6Gkmz7&VGu^KK=UuX z<@*3dz;R%0_#&t58Lj8QRM<{yhZ{7II(zkw8K*{iL`AuRnh$4!N#76~Sq%O8zuLgBzlla<@`(R25yLU^$$6IxLRMH7UU}bpi zfV@hK@QS)CA;iR5V-d%Dyz0Dc0m;zbT@7XZ#B8n#0-3W(OR3P0VcB6eU1TIwwXHFh z`mNR$XqB8ziarCKZyl8NBTi@(G`BPPz_+7l;MZ&tqz6xDj_!dNje?3#6?m%n=1F59 zcPqt?QviNK%odiTh+9TnJ_c_5v)P#jzNXlr%0b)Nie{E7V#MVQep>#t%_Z@SBC>zpmEFWRJoD>L-X4;*!|5ld>|#`ev19e_Ht_Rtqr#2L{*jC?^bq{luk^(Udu zG(@(*L#8n{L}L?QUkaL1?BYxSvmt*xyH}&Y<292X_l>k2z|SPrbEBcJSz|%;BhUpO z^%J}52R}6`GUbo|7dIlk{TFefo=jZ2l~Gnb-A>M7_z@ON$y1r1#~a%**m|>8$`0&% zN$9oP*Zihf>7hEJL#w%E`f5@!NH0o_3feFkdV6pmTMVmv#s=UOrNW*rJsa>VW#7Uz zJDOXl3JUvGPcd*>ewKp9TWf@$GzG39X=m`5t+fGU4g5C?P3<*npdLy4%^7z!{2cCW zpu6K%J%5i#tvxXILp*)xMAalih&B|7dM@g0c+iayOdF_DU}Oi(d-1R$@Ag93+DTdQ zMwOvC<~K^fC}iFsoHAB%%?+|cGe;p)tho#mcEyZ+t5$k%_Ij*B<@jlhK~{G;h!f|s z6>4&4)UoiKDFg?cOk_ufjl#GYb|yOrqwIXM3RIHoI8^$@Wkw&5QE*;x=Y9HD#P|&Q zm{hb*Sk_&RdL9$iFo+Z9c%kMC)4H46`%Hz_w*Vh?J-=Tgc62Ca0CIpOl99qrk#ydj zt}l#iJITp+qTuRc1%*mCw)iPdJ2Ow$@vTLod{nwzDan)baU!JSDkzV%IXu-^sANMq zzdR;Kpa#pc6InP3X*h)yG`T+#=O?SJX=f9(<%dfYm&pQ!F2$3Z} zC|gIs!<^isjTD9hlyh%6I4zeZTY24zt|JaRxo$?HIMCXvy$D(e>&m6w*$NdnO~Cl~ z7<9&}SO#<|cV4kVsOV5M12_C5Ue-Pw?H|1b2kdh*JRI-Z==F`t;_gtLML3K&W>BR8 zpRJ?qE|s-nMZlW?s$@ow1cIy8`#L=P{sEl_)ssv;Y?urXrQ0fV5&GBPA1#ApVP6znxV+IM#26szDciJ@DpZ*Qv`D75utb zFEiP}P+>M*bOp7ucI>|B{x?s$LJr7kfazeA+#z-L&ekoD^O)o2n|?<`$=O3Le^dIZ zv2iWmDXDQmrMfMec6-sC{y}xn(oK)EoQb4kdB~&>iQHE?k~A#f2|o;|1E zO6mk9j1$Gl=jj8g|LIf#bT7i0q_>LPSLg5hHjZCjb%(u{7SLM)uB~F<9jR`6EmCGv zgl@&88~g~^uo=2+08itq1NmJy)yq;!(9{9>qpV(~*=Kp8my2$?w-P&>jEsBC$lle1 zQZOqlu(75Qc1F)5PX+?&YGZe;Y)2#eQGj$ig>h%7~}NUh<}QUM{YE1S8`#Pw?f9j6QtYbyJD$ z#~jxkod|;txqVy45jr(20#7LWJ&R4}aP>$*x701xjR6RZkdot?$F6fV;NAH+&%AUH5NY}{WA7aomq3V4fP+r&FL@(Cy6J7th?QSh{#nfClOQUf-DPqP0O4i!i6o^4C zw5&_{-M^k4O}F4KWpt6MOmLaIA2Bqt|?Q**Y9^P@`t!{xB6Zbsy< z*yR7z9J!N@fWMYW#YE(;7=F`utEYc3RQ_ID2Up7%YdD&jh4PA(rO)YgE#!0^^ykIr zoL59Wmn6;m(+$F{GSF9aP4KK<>EbnApg$~l-Jp8M%Yl{!74A|YYL8iMyRgnXFNmMX z%j!C%k~mDV+(LRz2QTQjx*vva(L(YyNf%zpCHkEw#UqzY8~J2c4_g&f#$HFRU1q{7 zS2{I(V;6wY+Wj|8?8rNRn(1fTQ2)f6t0vhB2O{+X@hVTAiTUnA^tZ4^`TS10{wv$}B!^GX~q zE2pxG^X2T4G`ElT@Srz6P>qAfIp3B}<1Uxp8=>4AbLq+ONycVphuRo-y zr?tBbeMJlZi)7g>(DJub1Wv&MWExev&{K=p)l$Ux-Fx8nVx{vj6iRlP%0-tH-8|h@ z6^f|d+{RI-jVinFh@PLKrkdm}f>D>ysmvEuu*2jqUUSB?-tXY{$(S*G=qoKQaQi4k z+P{P$6#o?UB+@ad_J`!$^LdY|<17on$KO%pZXq+@tN`VLxP(kA@AqTb}(>F|f-P7)$olTe0LOWCu&m zO*AGmJp8QT-r(S7k2WW{G#Z#Y?_br!6kb{ENW{=|6mz7oe=bcIgY4=*Uu zX$Jz9U66G(dS%FGWGeC`xnUv;Y&@0I@Q72UQ0slJkQ8s&SGu807S+yLWTgl`+0&Z` zFN#bCcAe6E4LQ^GfWU4HTQw)A8pm_mqxVlHnlO9$jxSf*z3e}2Q|IrBnbThIN#yRn zL);rp0~tc)A8I8vC+8?hCTnu!cIUmOwS0Bgy+>8LTt3LukDrxD;#0V7 z#57}HCg0ul*)Hgj%ZH|^Ce?q<^U>4wap&AP>gl84CD0&%ZQ4~;oF*&NIDX%q#YsdF zb4GV(ftmsA4N|2uZ7IKc*SX6mHsijXEALlMhbDV5 z%e&8qesrd!hiIu*_WeAFmkaj~qG}o^nv)&IGyT8Tk5@Ob_QR<^UwqMrSHXJzvdc#C zR+TSZjrUdq`pWr6s$W&&}Y07Q(JA17V2{ry=MrkJ)^jDM!z z+MnMp^!OsTjmbH^&4mMyzK+rkMLbpQcZWQAF4#knyw987zxL-fGZq;)Bm(j8Xx^J@ zGV6@qLDrv@eYy`nEnzbY3-R6xcXIBmPQ=rud-f4Kj6m29ypI!1468W;RFo&?2W3zG7|#nr?9Pv)=@Jd>`f z^KUlc(*HiEl}*n$-0d~_zPWl7yw?g#^>nuhLPgsnp$T4l9FXr?C=__*MBi9#onq6o z4hH^J;=ot0>Rqn{1c^5?&;$WHC!XQ^yaf(IM5B3JPy9}ISCvc{8feyzdgaZNdfv{^ zcbvv*L1xY4azx)ua*-v7@7c8y$dz_-%ASaHf9nbJn2Kr|y!rtZa!^(91;vOAzVYSV zE_R6w>?uVH%T?|qu8*OhAG&Ar>Q0LvqunO%;}K#u(^J#-*c-iBq^_j>9F!-r>vHTAJfBK zhbGe$jPob}D_D;lHWzWZ;8J98M`ni-i(<)w>BD5vXJ!? z8B{ZWF1Pqvdy^QP!aAy5&6d&`PpdSxXH9VF8v6+do7O~S%j=0dY12LrU#X6UPgPwN zlRMID89%LamUrK`tlPEH{&C(fVVgEv%P;0wvQngRh^$SUgyo)FRzqYVOO(6~8Et7P zsy%Hw_At*Cr+PQ9^h9ol>c~Sz8Y5BC^3!(g6~7D0FVt)<>sbcAmYl_uSAEm4i50Xo zSCpG*VJL6URomDxRS}bKm_$>ymbKyk+qB~4I)pyvd)W5sh*VIq&z9`~s%-;fi=SC!Yu>FHLMha!cCD+{9JjQoNv)p>HlgsK99oXK!ifqqW< z4==8LVGb$CxAzKC>e58JechZp*Pgb2yVtdIISlumq(sppvq{y<>GL-WB427NR!>2C zt`qJLNL_~MN#DxdQ*_T~PZEWWyp`kjo%d|%$wOCY>HnB$60Tb?<}RJ9B>I(1BLjgm zwRfwboO5@M97w?KLDb!)=j2PElGKa$rpO_FXFb0`6aA?Tnl?Hs-MOd1=|3m_GEDo} zSaME&^xabRG{Z&z7X~@SV|)CZ8=f9?dP>MCZe>Gx#6^#%=W>cO4U<*n;2ctCg4FGP zz_Jkuq{>*W%k7*pI;B(`oT{PcueC25A7@y11*4ZLx0AkveGem}r;6nzZykv?(~Wfhr+c_q6&D#DtP_bl=B=q;r26T0gtwSha_C!p!`+2$>a18cnIo>QE8yn~UOmY)dUgJ}&85BcDkr|@!-%H^?n_H|TGTTS x#woO3|L2Io8JpHmB#k()w=VmR$q0Qqvy)VowDZh`=D&aDdb#0T+p%F8{|6`<^T+@I literal 0 HcmV?d00001 diff --git a/pages/admin/admin_dashboard.js b/pages/admin/admin_dashboard.js index c1dc917..b2fcc9c 100644 --- a/pages/admin/admin_dashboard.js +++ b/pages/admin/admin_dashboard.js @@ -15,9 +15,9 @@ export function dashBoardRender() {

요약

-
-
-
+
상품
+
원화
+
유저수
diff --git a/scss/admin/admin_dashboard.scss b/scss/admin/admin_dashboard.scss index fb525a6..5578d3d 100644 --- a/scss/admin/admin_dashboard.scss +++ b/scss/admin/admin_dashboard.scss @@ -5,17 +5,16 @@ } @mixin summary-item { - width: 100%; - height: 100%; - border-radius: 100%; + width: 30rem; + height: 18rem; display: flex; + flex-direction: column; align-items: center; justify-content: center; - margin: 3rem 10rem; - font-size: 1.5rem; + margin: 3rem 5rem; + font-size: 2rem; font-weight: bold; text-align: center; - background-color: var(--more-lightgray-color); } .admin_dashboard { @@ -203,8 +202,7 @@ background-color: var(--pink-color); color: #eee; } - } - + } } } @@ -235,9 +233,13 @@ } .summary_member { - color: red; + color: var(--pink-color); @include summary-item(); } + img{ + width:5rem; + height: 5rem; + } } } } \ No newline at end of file diff --git a/source/js/admin/admin_dashboard.js b/source/js/admin/admin_dashboard.js index 7b5d73f..042b8dd 100644 --- a/source/js/admin/admin_dashboard.js +++ b/source/js/admin/admin_dashboard.js @@ -274,9 +274,10 @@ export async function dashBoardHandler() { } }); - const itemCountEl = document.querySelector(".summary_itemcount"); - const saleSumEl = document.querySelector(".summary_salesum"); - const memberEl = document.querySelector(".summary_member"); + // 요약 정보 + const itemCountEl = document.querySelector(".itemcount"); + const saleSumEl = document.querySelector(".salesum"); + const memberEl = document.querySelector(".member"); itemCountEl.append(`판매 상품 갯수 : ${products.length}개`); saleSumEl.append( `총 판매 매출 : ${sum.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")}원` diff --git a/static/image/box.png b/static/image/box.png new file mode 100644 index 0000000000000000000000000000000000000000..08a1a5431874c4cacd50f768aeb5707883453792 GIT binary patch literal 13124 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 literal 0 HcmV?d00001 diff --git a/static/image/usercount.png b/static/image/usercount.png new file mode 100644 index 0000000000000000000000000000000000000000..4072c528c6c2501c63950d73c7bf6444b1b0e0d4 GIT binary patch literal 13688 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 PDZo${rBkKl^zi=yrrpvz literal 0 HcmV?d00001 diff --git a/static/image/won.png b/static/image/won.png new file mode 100644 index 0000000000000000000000000000000000000000..2fe33eeebf26bc7ca5e8b42b6b055eb6388796d6 GIT binary patch literal 8277 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 literal 0 HcmV?d00001 From 90f1d2e9ce13c27d443f66926860dd5c678e12c6 Mon Sep 17 00:00:00 2001 From: Nevacat Date: Mon, 13 Mar 2023 16:55:22 +0900 Subject: [PATCH 26/84] fix: Modified Loading Style --- scss/base/loading.scss | 4 ---- 1 file changed, 4 deletions(-) diff --git a/scss/base/loading.scss b/scss/base/loading.scss index 649458c..fd60e2f 100644 --- a/scss/base/loading.scss +++ b/scss/base/loading.scss @@ -1,10 +1,6 @@ .dot-wrap{ width: 7rem; margin: 20rem auto; - // z-index: 4; - // position: fixed; - // top: 30%; - // left: 50%; .dot-spinner { --uib-size: 7rem; --uib-speed: .9s; From 413e1db4dd29a42cee3cad6690163aa7cb5df2b8 Mon Sep 17 00:00:00 2001 From: Nevacat Date: Mon, 13 Mar 2023 17:09:13 +0900 Subject: [PATCH 27/84] =?UTF-8?q?Design=20:=20=EC=83=81=ED=92=88=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20margin=EA=B3=BCpadding=20=EA=B0=92=20?= =?UTF-8?q?=EB=B3=80=EA=B2=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scss/user/product_list.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scss/user/product_list.scss b/scss/user/product_list.scss index e5510cb..4c132f5 100644 --- a/scss/user/product_list.scss +++ b/scss/user/product_list.scss @@ -1,5 +1,5 @@ .product_wrap { - padding: 12rem 0 22rem; + padding: 12rem 0; } // 카테고리 제목 @@ -65,7 +65,7 @@ gap: 1.33%; li { width: 24%; - margin-bottom: 1.5rem; + margin-bottom: 4.5rem; } .product{ // 상품 썸네일 이미지 From 43d5fb7c10f5e87cb302058927a7c5ae10631dc3 Mon Sep 17 00:00:00 2001 From: Nevacat Date: Mon, 13 Mar 2023 17:19:39 +0900 Subject: [PATCH 28/84] =?UTF-8?q?Docs:=20Alt=20=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=EC=88=98=EC=A0=95,=20event=20=EB=B1=83=EC=A7=80=20=EB=A7=81?= =?UTF-8?q?=ED=81=AC=EC=97=90=20=5Fblank=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/header.js | 22 +++++++++++----------- pages/user/login.js | 4 ++-- pages/user/mypage.js | 2 +- source/js/admin/product_update.js | 8 ++++---- source/js/cart.js | 2 +- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/pages/header.js b/pages/header.js index db30b2e..b1f907a 100644 --- a/pages/header.js +++ b/pages/header.js @@ -82,32 +82,32 @@ export function headerRender() {

TEAM5
23.01.30
~ ING

@@ -137,7 +137,7 @@ export function headerRender() {