From ddc69b88175dfcae8c224869554967beea113423 Mon Sep 17 00:00:00 2001 From: Jung Seonghun <80201773+seonghun-dev@users.noreply.github.com> Date: Sat, 18 Nov 2023 14:21:38 +0900 Subject: [PATCH] :sparkles: feat(admin): fix main view and dashboard (#381) * :sparkles: feat(admin): fix main view and dashboard * :feat: change dashboard view --- .../streetdrop-admin-web/public/index.html | 10 +- .../streetdrop-admin-web/public/logo192.png | Bin 5347 -> 0 bytes .../streetdrop-admin-web/public/logo512.png | Bin 9664 -> 0 bytes .../streetdrop-admin-web/public/manifest.json | 6 +- .../streetdrop-admin-web/src/App.js | 2 + .../dashboard/UserSignUpGraphDashboard.js | 16 +- .../src/components/graph/UserLineGraph.js | 77 ++--- .../src/components/items/ItemReportPage.js | 97 +++++++ .../src/layout/BasicLayout.js | 44 ++- .../src/layout/DashboardLayout.js | 193 +++++++------ .../src/layout/DefaultLayout.js | 22 ++ .../src/layout/common/CommonHeader.js | 16 +- .../src/layout/common/Menu.js | 3 + .../src/pages/Dashboard.js | 269 ++++++++++++++++-- .../src/service/UserInfoService.js | 11 + .../streetdrop-admin-web/src/styles/App.css | 4 + 16 files changed, 561 insertions(+), 209 deletions(-) delete mode 100644 backend/streetdrop-admin/streetdrop-admin-web/public/logo192.png delete mode 100644 backend/streetdrop-admin/streetdrop-admin-web/public/logo512.png create mode 100644 backend/streetdrop-admin/streetdrop-admin-web/src/components/items/ItemReportPage.js create mode 100644 backend/streetdrop-admin/streetdrop-admin-web/src/layout/DefaultLayout.js create mode 100644 backend/streetdrop-admin/streetdrop-admin-web/src/service/UserInfoService.js diff --git a/backend/streetdrop-admin/streetdrop-admin-web/public/index.html b/backend/streetdrop-admin/streetdrop-admin-web/public/index.html index 3ecc0d46..509bd367 100644 --- a/backend/streetdrop-admin/streetdrop-admin-web/public/index.html +++ b/backend/streetdrop-admin/streetdrop-admin-web/public/index.html @@ -3,13 +3,9 @@
- + - - + -&*j;=u%25ay-%>3@81tGe^_z*C7pb9y*Ed^H3t$BIKH2o+olp#$q;)_ zfpjCb_^VFg5fU~K)nf*d*r@BCC>UZ!0&b?AGk_jTPXaSnCuW110wjHPPe^9R^;jo3 zwvzTl)C`Zl5}O2}3lec=hZ*$JnkW#7enKKc)(pM${_$9Hc=Sr_A9Biwe*Y=T?~1CK z6eZ9uPICjy-sMGbZl$yQmpB&`ouS8v{58__t0$JP%i3R&%QR3ianbZqDs<2#5FdN@n5bCn^ZtH992~5k(eA|8|@G9u`wdn7bnpg|@{m z^d6Y`*$Zf2Xr&|g%sai#5}Syvv(>Jnx&EM7-|Jr7!M~zdAyjt*xl;OLhvW-a%H1m0 z*x5*nb=R5u><7lyVpN AR?q@1U59 zO+)QW wL8t zyip?u_nI+K$uh{ y)~}qj?(w0&=SE^8`_WMM zTybjG=999h38Yes7}-4*LJ7H)UE8{mE(6;8voE+TYY%33A>S6`G_95^5QHNTo_;Ao ztIQIZ_}49%{8|=O;isBZ?=7kfdF8_@azfoTd+hEJKWE!)$)N%HIe2cplaK`ry#=pV z0q{9w-`i0h@!R8K3GC{ivt{70IWG`EP |(1g7i_Q<>aEAT{5( yD z=!O?kq61VegV+st@XCw475j6vS)_z@efuqQgHQR1T4;|-#OLZNQJPV4k$AX1Uk8Lm z{N*b*ia=I+MB}kWpupJ~>!C@xEN#Wa7V+7{m4j8c?)ChV=D?o~sjT?0C_AQ 7B-vxqX30s0I_`2$in86#`mAsT-w?j{&AL@B3$;P z31G4(lV|b}uSD CIrjk+M1R!X7s 4Aabn<)zpgT}#gE|mIvV38^ODy@<&yflpCwS#fRf9ZX3lPV_?8@C5)A;T zqmouFLFk;qIs4rA=hh=GL~sCFsXHsqO6_y~*AFt93 9UYVBSx1s(=Kb&5;j7cSowdE;7()CC2|-i9Zz+_BIw8#ll~-tyH?F3{%`QCsYa*b#s*9iCc`1P1oC26?`g<9))EJ3%xz+O!B3 zZ7$j~To)C@PquR>a1+Dh>-a%IvH_Y7^ys|4o?E%3`I&ADXfC8++hAdZfzIT#%C+Jz z1lU~K_vAm0m8Qk}K$F>| >RPK%<1SI0(G+8q~H zAsjezyP+u!Se4q3GW)`h`NPSRlMoBjCzNPesWJwVTY!o@G8=(6I%4XHGaSiS3MEBK zhgGFv6Jc>L$4jVE!I?TQuwvz_%CyO!bLh94nqK11C2W$*aa2ueGopG8DnBICVUORP zgytv#)49fVXDaR$SukloYC3u7#5H)}1K21=?DKj^U)8G;MS)&Op)g^zR2($<>C*zW z;X7`hLxiIO#J`ANdyAOJle4V%ppa*(+0i3w;8i*BA_;u8gOO6)MY`ueq7stBMJTB; z-a0R>hT*}>z|Gg}@^zDL1MrH+2hsR8 zHc}*9IvuQC^Ju)^#Y{fOr(96rQNPNhxc;mH@W*m206>Lo<*SaaH?~8zg&f&%YiOEG zGiz?*CP>Bci}!WiS=zj#K5I}>DtpregpP_tfZtPa(N<%vo^#WCQ5BTv0vr%Z{)0q+ z)RbfHktUm|lg&U3YM%lMUM(f u}i#kjX9h>GYctkx9Mt_8{@s%!K_EI zScgwy6%_fR?CG JQtmgNAj^h9B#zma MDWgH55pGuY1Gv7D z;8Psm(vEPiwn#MgJYu4Ty9D|h!?Rj0ddE|&L3S{IP%H4^N!m`60ZwZw^;eg4sk6K{ ziA^`Sbl_4~f&Oo%n;8Ye(tiAdlZKI!Z=|j$5hS|D$bDJ}p{gh$KN&JZYLUjv4h{NY zBJ>X9z !xfDGY z+oh_Z&_e#Q(-}>ssZfm=j$D&4W4FNy&-kAO1~#3Im;F)Nwe{(*75(p=P^VI?X 0GFakfh+X-px4a%Uw@fSbmp9hM1_~R>?Z8+ ziy|e9>8V*`OP}4x5JjdWp}7eX;lVxp5qS} 0YZek;SNmm7tEeSF*-dI)6U-A%m6YvCgM(}_=k#a6o^%-K4{`B1+}O4x zztDT%hVb;v#?j`lTvlFQ3aV#zkX=7 ;YFLS$uIzb0E3lozs5`Xy zi~vF+%{z9uLjKvKPhP%x5f ~7-Gj+%5N`%^=yk*Qn{`> z;xj&ROY6g`iy2a@{O)V(jk&8#hHACVDXey5a+KDod_Z&}kHM}xt7}Md@pil{2x7E~ zL$k^d2@Ec2XskjrN+IILw;#7((abu;OJii&v3?60x>d_Ma(onIPtcVnX@ELF0aL?T zSmWiL3(dOFkt!x=1O!_0n(cAzZW+3nHJ{2S>tgSK?~cF ha^y(l@-Mr2W$%MN{#af8J;V*>hdq!gx=d0h$T7l}>91Wh07)9CTX zh2_ZdQCyFOQ)l(}gft0UZ G`Sh2`x-w`5vC2UD}lZs*5 zG76$akzn}Xi))L3oGJ75#pcN=cX3!=57$Ha=hQ2^lwdyU#a}4JJOz6ddR%zae%#4& za)bFj)z=YQela(F#Y|Q#dp}PJghITwXouVaMq$BM?K%cXn9^Y@g43$=O)F&ZlOUom zJiad#dea;-eywBA@e&D6Pdso1?2^(pXiN91?jvcaUyYoKUmvl5G9e$W!okWe*@a<^ z8cQQ6cNSf+UPDx%?_G4a IiybZHHagF{ ;IcD(dPO!#=u zWfqLcPc^+7Uu#l(B pxft{*4lv#*u7X9AOzDO z1D9?^jIo}?%iz(_dwLa{ex#T}76ZfN_Z-hwpus9y+4xaUu9cX}&P{XrZVWE{1^0yw zO;YhLEW!pJcbCt3L8~a7>jsaN{V3>tz6_7`&pi%GxZ=V3?3K^ U+*ryLSb)8^IblJ0 zSRLNDvIxt)S}g30?s_3NX>F?NKIGrG_zB9@Z>uSW3k2es_H2kU;Rnn%j5qP)!XHKE zPB2mHP~tLCg4K_vH$xv`HbRsJwbZMUV(t=ez;Ec(vyHH)FbfLg`c61I$W_uBB>i^r z&{_P;369-&>23R%qNIULe=1~T$(DA`ev*EWZ6j(B$(te}x1WvmIll21zvygkS%vwG zzkR6Z#RKA2!z!C%M!O>!=Gr0(J0FP=-MN=5t-Ir)of50y10W}j`GtRCsXBakrKtG& zazmITDJMA0C51&BnLY)SY9r)NVTMs);1<=oosS9g31l{4ztjD3#+2H7u_|66b|_*O z;Qk6nalpqdHOjx|K&vUS_6ITgGll;TdaN*ta=M_YtyC)I9Tmr~VaPrH2q b6sd~=AcIxV+%z{E&0@y=DPArw zdV7z(G1hBx7hd{>(cr43^WF%4Y@PXZ?wPpj{OQ#tvc$pABJbvPGvdR`cAtHn)cSEV zrpu}1tJwQ3y!mSmH*uz*x0o|CS<^w%&KJzsj~DU0cLQUxk5B!hWE>aBkjJle8z~;s z-!A=($+}Jq_BTK5^B!`R>!MulZN)F=iXXeUd0w5lUsE5VP*H*oCy( ;?S$p*TVvTxwAeWFB$jHyb0593)$zqalVlDX=GcCN1gU0 zlgU)I$LcXZ8Oyc2TZYTPu@-;7<4YYB-``Qa;IDcvydIA$%kHhJKV^m*- zxcvU4viy &Kr5GVM{IT>WRywKQ9;>SEiQD*NqplK-KK4YR`p0@JW)n_{TU3bt0 zim%;(m1=#v2}zTps=?fU5w^(*y)xT%1vtQH&}50ZF!9YxW=&7*W($2kgKyz1mUgfs zfV<*XVVIFnohW=|j+@Kfo!#liQR^x>2yQdrG;2o8WZR+XzU_nG=Ed2rK?ntA;K5B{ z>M8+*A4 !Jm^Bg}aW?R?6;@QG@uQ8&oJ{hFixcfEnJ4QH?A4>P=q29oDGW;L;= z9-a0;g%c`C+Ai!UmK$NC*4#;Jp<1=TioL=t^YM)<<%u#hnnfSS`nq63QKGO1L8RzX z@MFDq s1z ztYmxDl@LU)5acvHk)~Z`RW7=aJ_nGD!mOSYD>5Odjn@TK#LY{jf?+piB5AM-CAoT_ z?S-*q7}wyLJzK>N%eMPuFgN)Q_otKP;aqy=D5f! 7<=n(lNkYRXVpkB{TAYLYg{|(jtRqYmg$xH zjmq ?B(RE4 zQx^~Pt}gxC2~l=K$$-sYy_r$CO(d=+b3H1MB*y_5g6WLaWTXn+TKQ|hNY^>Mp6k*$ zwkovomhu776vQATqT4blf~g;TY(MWCrf^^yfWJvSAB$p5l;jm@o#=!lqw+Lqfq>X= z$6~kxfm7`3q4zUEB;u4qa#BdJxO!;xGm)wwuisj{0y2x{R(IGMrsIzDY9LW>m!Y`= z04sx3IjnYvL<4JqxQ8f7qYd0s2Ig%`ytYPEMKI)s(LD}D@EY>x`VFtqvnADNBdeao zC96X+MxnwKmjpg{U&gP3HE}1=s!lv&D{6(g_lzyF3A`7Jn*&d_kL<;dAFx!UZ>hB8 z5A*%LsAn;VLp>3${0>M?PSQ)9s3}|h2e?TG4_F{}{Cs>#3Q*t$(CUc}M)I}8cPF6% z=+h(Kh^8)}gj(0}#e7O^FQ6`~fd1#8#!}LMuo3A0bN`o}PYsm!Y}sdOz$+Tegc=qT z8x`PH$7lvnhJp{kHWb22l;@7B7|4yL4UOOVM0MP_>P%S1Lnid)+k9{+3D+JFa#Pyf zhVc#&df87APl4W9X)F3pGS>@etfl=_E5tBcVoOfrD4hmVeTY-cj((pkn%n@EgN{0f zwb_^Rk0I#i ZuHK!l*lN`ceJn(sI{$Fq6nN& zE<-=0_2WN}m+*ivmIOxB@#~Q-cZ>l136w{#TIJe478`KE7@=a{>SzPHsKLzYAyBQO zAtuuF$-JSDy_S@6GW0MOE~R)b;+0f%_NMrW(+V#c_d&U8Z9+ec4=HmOHw?gdjF(Lu zzra 83M_BoO-1b3;9`%&DHfuUY)6YDV21P$C!Rc?mv&{lx#f8oc6?0?x zK08{WP65?#>(vPfA-c=MCY| %*1_<3D4NX zeVTi-JGl2uP_2@0F{G({pxQOXt_d{g_CV6b?jNpfUG9;8yle-^4KHRvZs-_2siata zt+d_T@U$&t*xaD22(fH(W1r$Mo?3dc%Tncm=C6{V9y{v&VT#^1L04vDrLM9qBoZ4@ z6DBN#m57hX7$C(=#$Y5$bJmwA$T8jKD8+6A!-IJwA{WOfs%s}yxUw^?MRZjF$n_KN z6`_bGXcmE#5e4Ym)aQJ)xg3Pg0@k`iGuHe?f(5LtuzSq=nS^5z>vqU0EuZ&75V%Z{ zYyhRLN^)$c6Ds{f7*FBpE;n5iglx5PkHfWrj3`x^j^t z7ntuV`g!9Xg#^3!x)l*}IW=(Tz3>Y5l4uGaB&lz{GDjm2D5S$CExLT`I1#n^lBH7Y zDgpMag@`iETKAI=p<5E#LTkw zVR@=yY|uBVI1HG|8h+d;G-qfuj}-ZR6fN>EfCCW z9~wRQoAPEa#aO?3h?x{YvV*d+NtPkf&4V0k4|L=uj!U{L+oLa(z#&iuhJr3-PjO3R z5s?=nn_5^*^Rawr>>Nr@K(jwkB#JK-=+HqwfdO<+P5byeim)wvqGlP-P|~Nse8=XF zz`?RYB|D6SwS}C+YQv+;}k6$-%D(@+t14BL@vM z2q%q?f6D-A5s$_WY3{^G0F131bbh|g!}#BKw=HQ7mx;Dzg4Z*bTLQSfo{ed{4}NZW zfrRm^Ca$rlE{Ue~uYv>R9{3s mwATcdM_6+yWIO z*ZRH~uXE@#p$XTbCt5j7j2=86e{9>HIB6xDzV+vAo&B?KUiMP|ttOElepnl%|DPqL b{|{}U^kRn2wo}j7|0ATu<;8xA7zX}7|B6mN diff --git a/backend/streetdrop-admin/streetdrop-admin-web/public/manifest.json b/backend/streetdrop-admin/streetdrop-admin-web/public/manifest.json index 2256e022..161f3c7b 100644 --- a/backend/streetdrop-admin/streetdrop-admin-web/public/manifest.json +++ b/backend/streetdrop-admin/streetdrop-admin-web/public/manifest.json @@ -1,10 +1,10 @@ { - "short_name": "Street Drop Admin", - "name": "Street Drop Admin page", + "short_name": "StreetDrop Admin", + "name": "StreetDrop Admin page", "icons": [ { "src": "favicon.ico", - "sizes": "64x64 32x32 24x24 16x16", + "sizes": "16x16", "type": "image/x-icon" } ], diff --git a/backend/streetdrop-admin/streetdrop-admin-web/src/App.js b/backend/streetdrop-admin/streetdrop-admin-web/src/App.js index 0347a043..6e88a93b 100644 --- a/backend/streetdrop-admin/streetdrop-admin-web/src/App.js +++ b/backend/streetdrop-admin/streetdrop-admin-web/src/App.js @@ -18,6 +18,7 @@ import UserBlockPage from "./components/user/UserBlockPage"; import MemberListPage from "./components/member/MemberListPage"; import MemberLoginLogPage from "./components/member/MemberLoginLogPage"; import MemberSecuritySettingPage from "./components/member/MemberSecuritySettingPage"; +import ItemReportPage from "./components/items/ItemReportPage"; const App = () => { return ( @@ -28,6 +29,7 @@ const App = () => { }> }/> }/> + }/> }/> }/> }/> diff --git a/backend/streetdrop-admin/streetdrop-admin-web/src/components/dashboard/UserSignUpGraphDashboard.js b/backend/streetdrop-admin/streetdrop-admin-web/src/components/dashboard/UserSignUpGraphDashboard.js index 1f3eda4d..66d2c2c0 100644 --- a/backend/streetdrop-admin/streetdrop-admin-web/src/components/dashboard/UserSignUpGraphDashboard.js +++ b/backend/streetdrop-admin/streetdrop-admin-web/src/components/dashboard/UserSignUpGraphDashboard.js @@ -1,18 +1,26 @@ import UserLineGraph from "../graph/UserLineGraph"; import {useEffect, useState} from "react"; -import UserSignUpStaticApi from "../../api/domain/dashboard/UserSignUpStaticApi"; function UserSignUpGraphDashboard() { - const [data, setData] = useState([]); + const [data, setData] = useState(); useEffect(() => { fetchData(); + }, []); const fetchData = async () => { - const response = await UserSignUpStaticApi.getUserSignUpStaticCount(); - const formattedData = response.data.map(data => ({ + const response = [ + {"date": "10.05", "count": 5}, + {"date": "10.06", "count": 20}, + {"date": "10.07", "count": 34}, + {"date": "10.08", "count": 56}, + {"date": "10.09", "count": 28}, + {"date": "10.10", "count": 67}, + {"date": "10.11", "count": 13} + ]; + const formattedData = response.map(data => ({ x: data.date, y: data.count })); diff --git a/backend/streetdrop-admin/streetdrop-admin-web/src/components/graph/UserLineGraph.js b/backend/streetdrop-admin/streetdrop-admin-web/src/components/graph/UserLineGraph.js index 4cf7dae8..1723b9f2 100644 --- a/backend/streetdrop-admin/streetdrop-admin-web/src/components/graph/UserLineGraph.js +++ b/backend/streetdrop-admin/streetdrop-admin-web/src/components/graph/UserLineGraph.js @@ -3,72 +3,47 @@ import { ResponsiveLine } from '@nivo/line' function UserLineGraph({data}) { return ( - +diff --git a/backend/streetdrop-admin/streetdrop-admin-web/src/components/items/ItemReportPage.js b/backend/streetdrop-admin/streetdrop-admin-web/src/components/items/ItemReportPage.js new file mode 100644 index 00000000..801587d1 --- /dev/null +++ b/backend/streetdrop-admin/streetdrop-admin-web/src/components/items/ItemReportPage.js @@ -0,0 +1,97 @@ +import React, {useEffect, useState} from "react"; +import UserBlockApi from "../../api/domain/user/UserBlockApi"; +import BasicLayout from "../../layout/BasicLayout"; +import {Table} from "antd"; + +function ItemReportPage() { + const [data, setData] = useState([]); + + const exampleData ={ + + } + + const [tableParams, setTableParams] = useState({ + pagination: { + current: 1, + pageSize: 30 + }, + }); + + useEffect(() => { + fetchData(); + }, [JSON.stringify(tableParams)]); + + + const fetchData = async () => { + const response = await UserBlockApi.getAllBlockList(tableParams.pagination.current - 1, tableParams.pagination.pageSize); + setData(response.data['data']); + setTableParams({ + ...tableParams, + pagination: { + ...tableParams.pagination, + total: response.data['meta']['totalElements'], + }, + }); + } + + const columns = [ + { + title: 'ID', + dataIndex: 'id', + key: 'id', + }, + { + title: '차단 요청 유저 ID', + dataIndex: 'userId', + }, + { + title: '차단 요청 유저 닉네임', + dataIndex: 'userNickname', + }, + { + title: '아이템 정보', + dataIndex: 'blockUserId', + }, + { + title: '차단 대상 유저 닉네임', + dataIndex: 'blockUserNickname', + }, + { + title: '차단 일자', + dataIndex: 'createdAt', + } + ]; + + const handleTableChange = ( + pagination, + ) => { + setTableParams({ + pagination, + }); + + + if (pagination.pageSize !== tableParams.pagination?.pageSize) { + setData([]); + } + }; + + + return ( + <> ++ 아이템 신고 관리
+아이템의 신고내역과 신고 처리를 관리할 수 있습니다.
+record.id} + pagination={tableParams.pagination} + dataSource={data} + onChange={handleTableChange} + /> + + > + ) +} + +export default ItemReportPage; \ No newline at end of file diff --git a/backend/streetdrop-admin/streetdrop-admin-web/src/layout/BasicLayout.js b/backend/streetdrop-admin/streetdrop-admin-web/src/layout/BasicLayout.js index 911e8699..1b806a2a 100644 --- a/backend/streetdrop-admin/streetdrop-admin-web/src/layout/BasicLayout.js +++ b/backend/streetdrop-admin/streetdrop-admin-web/src/layout/BasicLayout.js @@ -1,38 +1,28 @@ -import MenuComponent from "./common/Menu"; -import {Layout, theme} from "antd"; -import React, {useState} from "react"; +import {theme} from "antd"; +import React from "react"; import {Content} from "antd/es/layout/layout"; -import Sider from "antd/es/layout/Sider"; -import CommonHeader from "./common/CommonHeader"; +import DefaultLayout from "./DefaultLayout"; function BasicLayout({children}) { const {token: {colorBgContainer},} = theme.useToken(); - const [collapsed, setCollapsed] = useState(false); return ( <> -
- +setCollapsed(value)}> - - -- - -- - -- {children} --+ {children}+ + } + /> > ) } diff --git a/backend/streetdrop-admin/streetdrop-admin-web/src/layout/DashboardLayout.js b/backend/streetdrop-admin/streetdrop-admin-web/src/layout/DashboardLayout.js index a82057f9..ab2ff1ef 100644 --- a/backend/streetdrop-admin/streetdrop-admin-web/src/layout/DashboardLayout.js +++ b/backend/streetdrop-admin/streetdrop-admin-web/src/layout/DashboardLayout.js @@ -1,101 +1,128 @@ -import React, {useState} from "react"; -import {Col, Layout, Row, theme} from "antd"; -import Sider from "antd/es/layout/Sider"; -import MenuComponent from "./common/Menu"; +import React from "react"; +import {theme} from "antd"; import {Content} from "antd/es/layout/layout"; -import CommonHeader from "./common/CommonHeader"; +import DefaultLayout from "./DefaultLayout"; -function DashboardLayout({children, children2, children3, children4}) { +function DashboardLayout({indexContentList, longContent, graphContent, firstHalfContent, secondHalfContent}) { const { - token: {colorBgContainer}, + token: { colorBgContainer }, } = theme.useToken(); - const [collapsed, setCollapsed] = useState(false); + + const indexContents = (indexContentList) => ( + <> + {indexContentList.slice(0, 4).map(content => ( ++ + ))} + > + ); + + + const fifteenSizeContent = (content) => ( + <> ++ {content} +++ {content} ++ > + ); + + const nineSizeHalfContent = (content) => ( + <> ++ {content} ++ > + ); + + const twelveSizeContent = (content) => ( + <> ++ {content} ++ > + ); return ( <> -- setCollapsed(value)}> - - -- - - -
- + + -- {children} -- - -- - - - -- {children2} ---
- - - -- {children3} --- + + > + } + /> > - ) + ); } export default DashboardLayout; \ No newline at end of file diff --git a/backend/streetdrop-admin/streetdrop-admin-web/src/layout/DefaultLayout.js b/backend/streetdrop-admin/streetdrop-admin-web/src/layout/DefaultLayout.js new file mode 100644 index 00000000..5ae3b384 --- /dev/null +++ b/backend/streetdrop-admin/streetdrop-admin-web/src/layout/DefaultLayout.js @@ -0,0 +1,22 @@ +import {Layout} from "antd"; +import CommonHeader from "./common/CommonHeader"; +import Sider from "antd/es/layout/Sider"; +import MenuComponent from "./common/Menu"; +import React from "react"; + +function DefaultLayout({content}) { + + return ( + <> +-+ + + +- {children4} -- - - - - + {longContent()} ++ + + > + ) +} + +export default DefaultLayout; \ No newline at end of file diff --git a/backend/streetdrop-admin/streetdrop-admin-web/src/layout/common/CommonHeader.js b/backend/streetdrop-admin/streetdrop-admin-web/src/layout/common/CommonHeader.js index 18ae25a7..832176fb 100644 --- a/backend/streetdrop-admin/streetdrop-admin-web/src/layout/common/CommonHeader.js +++ b/backend/streetdrop-admin/streetdrop-admin-web/src/layout/common/CommonHeader.js @@ -8,7 +8,6 @@ import MemberApi from "../../api/domain/member/MemberApi"; function CommonHeader() { - const {token: {colorBgContainer},} = theme.useToken(); const navigate = useNavigate(); const [memberName, setMemberName] = React.useState(''); const [memberPart, setMemberPart] = React.useState(''); @@ -41,8 +40,13 @@ function CommonHeader() { return ( <> -+ + {content} ++ - Street Drop Admin + + Street Drop Admin {memberName} - + {memberPart}diff --git a/backend/streetdrop-admin/streetdrop-admin-web/src/layout/common/Menu.js b/backend/streetdrop-admin/streetdrop-admin-web/src/layout/common/Menu.js index f0189fad..aa0f834a 100644 --- a/backend/streetdrop-admin/streetdrop-admin-web/src/layout/common/Menu.js +++ b/backend/streetdrop-admin/streetdrop-admin-web/src/layout/common/Menu.js @@ -29,6 +29,9 @@ const MenuComponent = () => { • 아이템 드랍+ • 아이템 신고 + +• 음악 검색어 추천 diff --git a/backend/streetdrop-admin/streetdrop-admin-web/src/pages/Dashboard.js b/backend/streetdrop-admin/streetdrop-admin-web/src/pages/Dashboard.js index 473a0981..3ef31c6b 100644 --- a/backend/streetdrop-admin/streetdrop-admin-web/src/pages/Dashboard.js +++ b/backend/streetdrop-admin/streetdrop-admin-web/src/pages/Dashboard.js @@ -1,9 +1,6 @@ import React from "react"; -import {Typography} from 'antd'; +import {Button, Cascader, Segmented, Space, Typography} from 'antd'; import DashboardLayout from "../layout/DashboardLayout"; -import ItemDashboard from "../components/dashboard/ItemDashboard"; -import KpiDashboard from "../components/dashboard/KpiDashboard"; -import PushDashboard from "../components/dashboard/PushDashboard"; import UserSignUpGraphDashboard from "../components/dashboard/UserSignUpGraphDashboard"; @@ -11,38 +8,252 @@ const {Title} = Typography; function Dashboard() { + const appStoreReviewData = [{ + author :'ParkSeungWoo', + rating : 5, + vote : 0, + title : '아이디어 좋아요', + content : '아이디어 정말 좋은데 해외도 추가해주시면 좋을거같고, 줌 아웃했을때 마커들이 클러스터링 돼도 좋을것같네요. 또 반경 밖의 음악은 확인할 수 없는것 같은데 다른 지역에 드랍된 음악들도 확인할 수 있는 방안이 있으면 좋을거같아요!' + }] + const indexItemData = [{ + title: '전체 가입 유저', + value: "2,546", + color: '#0062c1' + }, + { + title: '전체 드랍 개수', + value: "1,453", + color: '#0062c1' + }, + { + title: 'WAU', + value: "446", + color: '#0062c1' + }, + { + title: 'MAU', + value: "2546", + color: '#0062c1' + }] - const dashboard1 = (<> -KPI 지표 -서비스와 관련된 KPI 지표를 확인해볼 수 있습니다.
-- >); - const dashboard2 = (<> - 지역분석 -최근(3일이내) 가장 많이 드랍된 지역입니다.
-- >) - ; + const data = [ + { + title: '남구 송암동', + value: 3, + color: '#0062c1' + }, + { + title: '영등포구 여의동', + value: 3, + color: '#d56464' + }, + { + title: '동작구 상도1동', + value: 1, + color: '#0062c1' + }, + { + title: '강남구 역삼1동', + value: 2, + color: '#3c4f30' + }, + { + title: '광진구 광장동', + value: 1, + color: '#3c4f30' + }, + ]; - const dashboard3 = (<> - 가입유저 -일별 가입유저 그래프입니다.
-- >); + const longContent = () => ( + ++ ) + const titleValueList = (data) => ( ++ + {titleValueList(data)} +지역분석 ++ + {data.map((item, index) => ( ++ ); - const dashboard4 = (<> -++ ))} ++ ++{item.title}
+{item.value}
+푸시 분석 -푸시 발송내역 및 푸시 기록입니다.
-- >) - return (<> - - - >); + const indexContentList = (indexItemContentDataList) => ( + indexItemContentDataList.map(indexItemContentData => { + return ( ++ ++ ) + }) + ); + + + const selectOptions: Option[] = [ + { + value: '이번 주', + label: '이번 주', + }, + { + value: '지난 주', + label: '지난 주', + }, + { + value: '최근 월별', + label: '최근 월별', + }, + ]; + const onChange = (value: string[]) => { + console.log(value); + }; + + + const graphContent = () => ( +++{indexItemContentData.title}
+{indexItemContentData.value}
+++ ) + + const reportListContent = () => ( +++신규 가입 유저
++ + ++ ) + + const appStoreReviewContent = () => ( +++ +신고 관리
+ + +++ ) + + + return ( + <> +++ +앱스토어 리뷰
+ + ++ > + ); } diff --git a/backend/streetdrop-admin/streetdrop-admin-web/src/service/UserInfoService.js b/backend/streetdrop-admin/streetdrop-admin-web/src/service/UserInfoService.js new file mode 100644 index 00000000..eff7b8aa --- /dev/null +++ b/backend/streetdrop-admin/streetdrop-admin-web/src/service/UserInfoService.js @@ -0,0 +1,11 @@ +import browserStorage from "../utils/BrowserStorage"; + + +const userInfoService = { + isInfoSaved : () => !!browserStorage.get('user-'), + saveToken: (token) => browserStorage.set('token', token), + getToken: () => browserStorage.get('token'), + logout: () => browserStorage.remove('token'), +}; + +export default userInfoService; \ No newline at end of file diff --git a/backend/streetdrop-admin/streetdrop-admin-web/src/styles/App.css b/backend/streetdrop-admin/streetdrop-admin-web/src/styles/App.css index 9683c354..5e241599 100644 --- a/backend/streetdrop-admin/streetdrop-admin-web/src/styles/App.css +++ b/backend/streetdrop-admin/streetdrop-admin-web/src/styles/App.css @@ -13,3 +13,7 @@ .ant-layout-content { height: 100%; } + +@media (max-width: 767px) { + /* 화면 너비가 768px 미만인 경우 아무 스타일도 적용하지 않음 */ +}