tAKtuG@EVaR6yG=?l{w+@?9{d5G
z{6)rTgNirzFgwpo_T72s{qyw=z!7$e$RL}Cq(DZFVPVK0x$1K*Y~k*mJ@_4Y=>ClmwxmON?SJV$}*CT+x`&h@q(6T(>%BR?9RP*d@cD9Zw7;-8^p@wq>?8!)|N03}yXy#%>&WVo)z&iKP8-
z;0ZfUMi?D4$myE`Rw+%33{oS!a}!NZxW+i>yOG8FK2^$k=y1QsBQN1eQHt+9@=(+N
zX}3;(yWu!;+@_a^R{n0|Fc}-W$kWCF302IX2!`2Y15k+Pr?^DCi1JUrLcBc1E7T!l
n$WdG)1vO`plQ!tfb&5)w%h#Z3gAkcHG;CYPdD;-kw!u2IFx)*eHa>Iy()5kDzMQ-`J#lsV
z;@i{jeth%tM>j8xPyc&N?nSFK-p24?jOzK~TZc^yOJ*)i&0HIs{_M>3t
zY+>k(i^Xw~*3!C})%FW_*vfXO8m%*(6RbVe~TD
zNJP-1VmJ0s`S3!)I7z8hCO=d(GoE*Qg9kGF2p(0?tKu>2V`wfJF4IjVk>>@5hk_mP
zpjB!M%HDfhww@|wKl&6LP;n4HCO0bV^jL;LEae4gk!#7QP#Tw^4>X379{2$jhwu}k
zri`zEp(Bd1Voj8pf&@z7r}&wI!zzA`BMd7gTTmjTd75iO+;K-7%7@1W4)oDZx|Vzx
z@Fs0)&_ZUzVhy(Ze)d>07rElhJXC5SMy#9UDy0>G6%1ZHR-k4eM^?M(@BU(qlQTDs{9J47pOnJO&V9O_)l
zS1ft&7qYmC*q6uIrNVVlR4}UII8IPonu{6tbCcQ)sj8>?@)=q7iwGa|7~FA^eyz{N
z;|w)^TU(maP0?4(r-gk;@+lQ-%F1wKklVT(2a`4Kuug^CQPGCxZY;zc%Y2Fc{xDDs
zds{2?#B^VB9mR#h~u!0!Ea;|WtCo1RNZ3~U&d0VyhJ&rKHfC+23kV4H>2K4PWms%K
z2B8-WPsZa4eV?bHEdXY{C>^nO#zJ1OF)D@uJ!f*aXj8zQ?-zP!q|^fD*hw*5qtC)%
zK}Im_i5BT>e7AtWZHNGvRSm=8@50Ay$i2haL+%zy-wgAlTcoauW$5g0y0+}Ic2{;(&j{M=jj{Ra5Tgjo
zJy{T1kCiW2CLQ%;b#+^o>$o;A_(kI^U4-`%cpo1q_)x{4@aM8lsGFnKF`=b+KAq*X
zf)8xLeKPFOur{-q|u$xy>{aS
z*cE!H!qfCCUxSvOqF>b)z%w{aBZg=39ICy=yGU9pS2taULf37RST;`MsE)Osjyrt0
zK!?=%OZp-M(`BnHwh`nN(?1X4=~
zsRd)WP=Yi@A*sxu3l#I;g}J_t#N}Uo3W3
zVMP@@#jxkG`985R4#9mY}9F?e5U5lwPmB;Ngw}s(ohR_L->DW9bq4NSq4F)AC
zoZgHs7><1dVZVZUhT~g8H>jJVypx7JOBB4oP%96w=9DGu
zjPCF@?W6ogKMpgLXYc;FF!BBJoP~QS!KnVR!iKdTbH$?kK~lEqRv^
zNlQ%#-r>!wOdpe`zZqY+^WE~~_~PsonO1O|p>0cgUDRpSQd9h*918;A$IBGh#hX7b
z-gvk$aU=WHFL`tdq6{ZDF=3C{j!5x7cPb>HAEy|qmZpAMnD}z>{@mi+w~yxUW$*m3
zH1*lS?MWBID-5lh81SgAW}G3@(ws5gy0TgopH_m9y?Z-*?`BT-gYo50zFwNY6+k;W
z6r2g76R%OSujN)JQQfr07)mKsyt2Shx0+_{x@z0R^tC6cdYonG+0c14p{5-wOLkfo
z6+S9rsgXF3Q{jrK>rypetBTvr1f^?vH|6&EOe!X5T)fpqYQ^OHS2lDu%qC(=M2N<=yGl|Fj*)6m-h^1eGc7fkDAWiOdwBA
zTfy7p+~ca3|3am%M-ZzMZc+*&3*Du^C9db1U!c#-SaH#*$@|~8L3=wa6*E-!W~d*e
zM89Th#E(|PFdbEPK~h=oao6SHAf>+;HLWY0vepu&GnN*--AvKdQA3GR!S+*kX6T~-
zUfFP|W&3DNotnni>5bFOXfCOr0sEB}ML0*J{0vl~o5rBG0X;ZRZwwc3k(9{8|Dc$D
z!1dpt%%N;x2IZlOX@nZ5v3nZ(rt#cE)E1%fPedkBK8J>ZibSY!27I1GM^;24)SMH&
zv?3Y|oydt!u85MMmYnGHifAbGsuW4DeXiF>T!7W6Mh)r+d=n1f1ZvSiE$JLdF5@8H
zr?xbVFs>qkkEz~Eg!LYZ974i_H_+>%zK%XzqL@h8o9HJymuan_q$xxX-lCUc+BkrB
yXjSH;bD$HTy`a#)n-BATR~t|o@;^Y^eJIjtwkp(>WaK@P6_JA<&@32xNqS({+7NFgmWY10uXOPf;KhPDvWv@~guV#Sx_kxV<839|rI
zalr*aaRqk~-0A{?h|v_m1qB6H5L^MpUED=cWbr%q-Fb6o=9Rp*KjvlLyZ4;$eCIpo
zo_W3Jnf-SFSczxjs6lNM5gT=wW1(rcbCHusIqC7l){))rXx_q{HOX``zt%$S($3)+
z<{}nF+(tcY3yVfGlZiiA$M{r<>dMOg#Ju+
zJdvBqCez~=WSvR(;!Ji=V$8`qdh=)|>v|T7n|k7CKw}h5Hk#35;kbjgV4*%UmD`lb
z4m+s=L7cp_GZYN9eCw2(b@ItfI@eQ=`Dlxx-Ns>f9%Bguq{0Sy%(0Z9usM{EKF@6-pOiGFM+@1k
zo6aYOl9TQZX1+(V-hstYEU|G6jGV7NUb2d$$gpK4{^{Sxm<%r%oGPSVo<>
zmrNzIOwNfW>cPASrDs-*J7eg^iYO8`UWnr?G?#eVkjbQ6Cv71zw0*}$3#|st`k7ML
z2?AtgFl)2=5472hlWd%fQzW(!qYr0Uutz-BOUhJ1Zjl`W7M5x!N<_VxREn*J71m=y^n=@G<7{lV5cg`hKba%U
zlR}oTtS+nIA?%1^*v2_{k%i;KRB*Wo#+FTvPvo~1aue%QDGRFu2=kbpHM+WI^}l)y
z;l(y~;UyO8vTVPsgP=t8^=XEbX#u9v|56(cM%d*>GKKWmpv#DGgEqcroPYKxf^?;NZFVafwWXFVdtQH2i!~Y
zvNmI53Kz0!)4X9}e$lFNIMHSf`6voDF2cpsM3`(=$42ElV`CPUEIrStkYaHfw|qtJ
zwed2%oVDsHQZaC1NI|OX7_?rBS4QzF8?VM|LLO~p7D(EpJ2~QJnedLlgqMisMkSZm
z+ISsa?-$e=PL3H3TTrsPte`H(8>6_w#+7(e$bu?2!LBt`$g5Hc>UV~gwm4Hfjp}hZ
zuCnnKyp^%@q{=4U5V6Z%+4*)G@4!2ma{9EeDu6K~;aUULcRUo=NaK8$g;PRVF?*Xf
zEP&o)Ki$|pBVF&%VADRl#}_yK9MACxJl8hBWRf5^slBFM-dcQ4spu)UDZ
zb08Q_=8_{RcYQjY$$K*qqYoUVMtJ1r5*Ik5>MKwL0
z!&C-C76htpRJYN~*_to%=123PP9^(ZIp)1nMclPRLqycH#m!G-#!^s*^3lGtE!
zJniHQGWD!jGql=psjaRxQ>bCkn!p?mcvNk`xTCt4_g(2Fc-CW0Nuo1S9Zi+HsZx0;
zW1)pz2ZOlMQV1OF0Ri@P?zCX_Q8@*Lp=_Me{B-hh*>qjJZ(t~nKNJdwo-(179lHTr
z{d}|e>o(4rHLwOMf7Mj{6rd>j4`tsPBao6N*3w*e=#+FSP1@ezR;-agHc9vbor$V>
zhR@=o{`4j#PaksgC2qVBQ(s!yc?l*)Eo+H_R;wNVQ=~%{h|Rxx%QoMQgLv`Bd6+;%b8t%r#Hz;$s|=mZ2I
zI#ezXjHkXRBSmr9*cPB7kM^~pV=zU;y+vAm4Y3R@1WDHj-W#>F5Yz@!2=bIaP|DXI
zINY;CLl0+Bjz6D51#UJ9J;2*S<1i`Y-UEl$#9~m#2UqFex@9w^PNx@_IZPOL^ob%-
zMJCj*_k-#2}khp;VxYlABdTX*#EjkVf@
zcLKJNrY$mfS0u4)1TW*N>JaoyoBh5{vdHTXKPZ-mCu
zYvvU)b_m}=hhC1(-AtbIc%nBmIh9HCH)9Wu;;Y9Rz60lZC-1WPc|E_);q}A3w(-gr
z;{5ywza@CJc&+RD0<6#Sj~aZGpYj-d)A})fiUBUb$FYxB3!lIzQL8qO@>_xRuvI8M|_0066Lgyl(h2Q>lYb_AU%UFBfQ4DmMyvkM^9tv
z4g6+uzSHRfB5RazAR-;O)9aK>mt1l**Bvt{|R8Lam-
zXDWDt6_qp+)8sp7(hlZw#h39F+AAv9yYp4vF+%bx>}v#ZC%(={qKQh*HcsP=%0y+2
z=xpD4AZK^t8`|&==2eo>t~u*xGGbR>i)dsYBDLbei_t6gOAQz8zKeF;g}Vv&n_OLo
zn)&OjVmNoH)PD>2XfChhRiwSp<8rGsgTY!1bl;6=Y#*Xhk|KqO(HX8_2e?xC^)$H9
z_q$N@N_)5$-)0<*n1}DES}Zc`J^L=72|D(gr*K#lhxbOzo^dZ>daQqsVSFDy&~P`g
zNQ9i0BHY+~oI8W_=BUl4vaT_RsV!g@4&AKMIXHiSw2bmSSVY=W
z(&7uUBjqn1A*<`UBe$dG+}Z_ogEPq1;GBKWKGZGtJ<8fuySg4Rw(-SO&Poz_GO2YrHn&d49a!#eT}G$I5ycm!X<%6f%Y3nsZY8{{_lpc^X7wwS|5
z=;9anrFN0$Rm!(@`CVxC+*~HIdxLidd9*dCCHqO@ZR}#VD}UZO)av_d^+{^QqxcnZ
zmoz4Ke$6{VLoKWpGxkUQ*ndM{zs2vkLQ1+K_RARio2z5L``}{#Jze|(f7CA03`ojN
zw=TxrJ%hJJs*bz+SUC49M_!3lw=UYiV?2f>S#rkSNDrm(<<3pKBRbTL|1q_!n36vc
z)}Qeg4J*T|z$&I=pj#4hwYT4FsSmSZK4Rc%_LI@8ZlbWpN@%*G8=Kr|)DP`hmf6ROa_&*B61$Y1e
literal 0
HcmV?d00001
diff --git a/mall_common/target/classes/com/mall/common/result/BizException.class b/mall_common/target/classes/com/mall/common/result/BizException.class
new file mode 100644
index 0000000000000000000000000000000000000000..0c05d61d5336b52e55388cea7d7b09049ad00c38
GIT binary patch
literal 1459
zcma)+TTc^F6ouF6^unbD+Cp2o$;C@M1tuoy3x)?#lNulfkT)NOa#F_3g-oYv{7pV+
zA|dg?AK>rt*|^TkI1EsYP1-rvy}rHnp8ojt?K^;nSQ|qIS^?Q2a>xtJzBS*OhHbh%
zV}IZVmLs2k=*qLe@?3%Z6U()NErFTl&gHp-z_;AqX6tAaBN#1UtcYqU5
z8yq;EYxuH1umj_%^)VGQ+x1SQfas{(6Gcp7NPv
zH;-*eGJ&bS^exjql7645yzV@s3B+RZ1PQ8;?rf)hjAQE91dS)oSK&{zH?Id;!
zw1+s5K6=%Hd`||u%Gc>;>t;Mww;%5pcrZ#|YqmN91#U$1Y_p@x96Rs^epkM*lp*DG
zJvUTaV40=N&_@lkn8pm40%sZ2`DJ~>F_?xPFVXeLmH_ir&6}(97cIISP9F
z9HlSeomsVqEPua2nUDdVB2x
z<$r0_$Txu!=__c2T1(N@M5`KWF&u7Vi4sb6R3!^8M9RytvgA`K*L4afNv<(TeU9l~
zW?CaIs262A&rBDXM
zs#E}jB$OH}=IAoz0hZPR*u%n)j
zQLW|kPPM9VCh3RQL{~Po6QIA{%kQX#KJ+V?dAl_6NlnP<+RoK=$@Q3p<2b>^D~`M1
zGs!|s%G8S%l1M2SoD%XBI+LkZ#-zZ57KQ{c;s{z*OeZa5@Dkmw+SSzygK?Iu(K^w)B+0IJKy-m|GZas%Aj=_)a@^9|y}&@3zxhygj$Y6h8ZZ0`p_Y?KW;H
za8F$|n$>yf4%pYjAHkems_WD-pdDxcSRi{ERigb=k
zgDAv2TktTji)_-8N!z?@=Woy0>wy^c*{hdkCfG3SfJh}c+at$=!(9*Dk8jWX)=+&*
zOA`?`Heaq)^3KJAv{ZXT;U}f((9csZ1ckSG4aqBrFR_rkP-vU<##6MB21IzBre%V6
z#k-z<0QD0GVa)IvhdhuzZsfKAL`IT<0JnQNggxMHFEm*t!2aA6cg}Mhm88Xl
zAl(H5@KqQ@Hp?glBK8R8wIf3h(D5Um{EUSV;IJ2n4-pFp6gGsyP*dJwnWAM|(02&B
zh<5|fE4&M6^vKXd?0<*@t(bjHn9)tl=oU<|?1=du!{>XDS1G|chUQoG9*iGaa_rb;
zMfvWe8{b`BB=^wP8h+QV-1+Le#;C62{lM*Xz)ZvwNkbogDXb=1BAc3s1e$0_Q07Dl
zQVLyhTEzYVJ`CtzB$#M9k{*0YgwF=?TSh>9E!08i$E$*>!^uKFw~q+RuZSSGzo>4V
z+vf(;-$U2#4*mx7JLuuNgTKO@8A@;9i1*0B3q$;W^Q}zsY2Y#+2S&Bw$Jmq5{y@ha
zSi=cz18Hx)c9%{yuSc6R81cb2X_~_g++;vq$iZgMhHx53u|!*#p8^TwIntWiX)Ykq
zU%$-tj+eV(n15rh0kiENbQ=iqXKv(wyob_`=P88dV
zvr$f&YbvMhm6M-h^es~Som(QjkHoV%ZA{oZ-y6@a_Q(6a?EmWPn_?Ll)y0(1AH$3f
z-hr9WH!ys2toK>ejRe$%`L**gR*0ta18|k25ZgbE0#BkakB1)IV!(RSQ6M`dU?J=T
zLQgOVorEc+kt`_nM3m4lgp~9WzovqOmg!bnHTejqu06n+&XEnAmAp1E+BxQr2R86}
i=Xs7d@MdfK`MmnaWHLyi!KPRwxKJR{+bDWZYySax?tSL~
literal 0
HcmV?d00001
diff --git a/mall_common/target/classes/com/mall/common/result/Result.class b/mall_common/target/classes/com/mall/common/result/Result.class
new file mode 100644
index 0000000000000000000000000000000000000000..259f12cfa20db981e954bf047bf000abe1b18382
GIT binary patch
literal 5116
zcmb_gTX$PW75v8XGoMehv05yoOIEp>ucYVfkA~3v`LVIg
z{JaKjGK8>(qsPb4Z+u8Q3Ep=@Vxrr^47<
zhj8c5FW$L*TOf2A=)yh?!QosXR~gmd@9ABXfrNqmI6!a9R%NWXWKm1cq#8P8;6Xg3
zhQ`f`siCt4W;OSSfunes`l)8RyxcU^^<`1ee#F2r8*P^61VWF2UL-X{a^?AIHfxp3
zHoOZ_^rJI`l!jO{Q=%tr-~>L#sjFfyzL`3ibjsk)f1FM&*$#MTIh+fEM+|%tpVAP{
znuW|WRWsj&-l{|6$n>8^jkx!xx)uyNusM(MY-s94KZ
ziMUsg3*oYXr-jBn4dR>`)Rik#7R`Ls5?!kX3Zg5JnVXxP3t>$|hrK3OOwU`ToSDzP
zU|z~IcVcC`yJ(flxnkk`&)zIb^2wP=<uRQmBYj^N))HOaZulj?a;)hidi$i
zXp#}K;UMYSD13g+9f(a^m6hVsIkRN0S`{*;;q(@$iE0}zT;Q1&z&$+FLwY+`p4b}6
zhgRoe3s|L6vD8HFjuFjlf#|;B4D{T`aid{&3mhL_nafMWT+6wq;zQepeD}R)xJu`?
zfXPt0f24Y4CC4yro3EJJr>D&|C&WX!az<@!pr_Z);$V-2>>{(j$g)watXSOlu&nO3
zPpgP6a@w|7olj9ESDmBVc$$<<4V;^soX)Vis%rsDg3=o3R!YLd*}QY)kG7`76F^R;
zD@jvvqpj$Cv0BPn6FDh$yVRB)mqLgmJiz*)p@<-_6VIT;c9|v4hYAvM-C{c-mlRvZ
z+)%URmcZUOH%OjiZ=HVujl*!ve9JcTqGM*3UmwRJ
zVy4eQ=e2Ukw$i00IaWAbt}e9PuovN&YcJxn?VYIG{5BU{X-P?YJl=wm!yZbm;5!c1
zQw}8&QrVt#miau4JnUgaA*}n~!17%iODmciSiA%r^C*ov1T@?hiR<N*rb-%>;{t
ze!|A$wLg+THh^!T)%Q2}ru!NE
zpRl`Z46-5&-jFeNMrYU?9n@3*z^;V;9`@XXkxJ+_JmyZ%3NAd?Q0B)Y7{yQ7(y_n`z|YtU-~yxL
z=WGQ%wWjLqu+s4h>X5WQf@moGAM6gnXMBLJ5c>HqtbKq7R5Mbi?={k=%L84}#<#D=
z7NbS@YECxgh6+13ccsQ$BPj2A>t^w~DAG7AVaHcBe5}_!tnVg5sTwA2d1g?TfrRdigk?uKbg(tk14_Tcw4b^EOR~lb9ZusqTRwEK
ze*cQF{YbHHz0Q{IxiE}7tO}QBq2DE;I=R#|(#NOeT`p_%DZYzN1l$Sk9DSpR(};kN
zX@`Y1qL4Z~@Gho!M9su!Yj{G4sNsD4v#LGHPyB*vXKMI-{7Y=tU^dqoZ&4j^ylzwh
zkw_H?f?tt>YPIwyeQW9rNW!Z0VgEAl9_#b<)
B-a!BW
literal 0
HcmV?d00001
diff --git a/mall_common/target/classes/com/mall/common/utils/IdUtils.class b/mall_common/target/classes/com/mall/common/utils/IdUtils.class
new file mode 100644
index 0000000000000000000000000000000000000000..87f2f9b88ee182f8970db0684193e4f800232b4b
GIT binary patch
literal 584
zcmaJ;%TB^T6g|VMP%B`?w}|h6iFV_z#tp=Tgy;fcKa>fS^r5x&yL5xbg&*KY8Sk_Z
zb)mDkGxyB7=iIsT@%i=+;2cLPQb;SvXviYRP@eEdZaCZ<88?H8utJ91h3(nlB}2O2
z=&Q)1pg`5I0F9v-)1%OKj9#zZVo(F_4ShFB^m?Q7n_$ZNqJ|R64EfOShJo#k7%FpS
z?3|!x9y$X%&7;Bq6{}cNu&!YPo4@*;Ybb%ZbGRiKTJ^*>7Hf`q&=vQQ@GN2eh0pr@
z>8@a#p=$ZA;c~|@=-~REA)oqSw1+*pGh~|nkPJ&5+Y{H3I}pJwA2@{Q9pBVW9
zZPS?+`k~Wro#}7tbb3}2M1GLiGnRK(yZ4@Z?zwmU&wqdX31A-k{fHo{phrb7`UHl{
z+P;=HHLH|~z_&tph#p+7;bOuN}CK
zfRb+*W>K#TT$-BBcG$D*zt0Td9EKDOt2mE@K=SOZ0&z!oS4_>Q(!tHCtOvB=8fJQ3
zt7Ts4C5{oip
zLu5|~NMLKK8zAlGUP+9k|C);HxWSweYfY00A7Rd3${>Ix6F;S58Y#lBX>~_t_hRSl
zZhEg7$t-RvxTPYEcLl~|p0<&E~^o`KNvcUCLjTLOmaW%`8GFu78P7HUcq6U-otfC)E_xDuX#{(`h
ziXF{t=mJaa(h5Aa%buu!gdR
zrEfH`ECoG*B4$#zsV=W*n{pd$>3C|at(66O^9rGJ>9E6hpf?`)UoA2{!FYpF
zQ*P8dpLV|7++_ov*m82NR;cjq@N}Sn?JRWp`S2;b#ex}JfBiYTQ7`EC3@N3-lV*NP
zqGGpBQmX)&mRA5r103^4~C<()^{M(VO}m;uj7g_=->Y8W_Y=K2?7MzQ#A4#qlk^
zL)1IG%U@}H;s{FW7=sbKz=anWKgQcp9OJ4$cIIckk9sy`(SR3S5@Vj-QU5HS;d`!2
zm>K~J+wPVilUvm(E}f)haJH-cTlV6Wmx#&DOv5^nMc?|9y4A|RZ(2r(=O{Dq7J
z5f1EfD6pjG_SA{St#OpF7cwq!tEnU0$<8EJj_~x^<7HnFraaBd+Uz}GESyAxZlSVw^iMz^|F*v8iDXT$#`Vu?8
SVq8|I2vz40XD-(wX#5Yi0+@{e
literal 0
HcmV?d00001
diff --git a/mall_common/target/classes/com/mall/common/utils/SecurityUtils.class b/mall_common/target/classes/com/mall/common/utils/SecurityUtils.class
new file mode 100644
index 0000000000000000000000000000000000000000..3337983c4e4387ad437eb75ad84dcfa1dd68feef
GIT binary patch
literal 1792
zcma)6T~icC6g|Cs42**iqDVlaMkKp@jVKayO^geuBrKwfBtTx8p=)={?966nHiZ9_
z2lBE|u_}4@N2PLlc7WBDDj#OL`}XZ~&pr2czx(g+e*nzk7ZVwD80fUng>Hd?H}ZFB
zd(to4FLvK3Cl=^_oj^x6w`rmWy#`DR7hnn8a)PQ|m7ZsFQVo2&9=l#-my}Zv
z-T2_OUJ01Wcfx~OTwJ;@u#jCni&2V0*DvSWExC4+iHqnrFks;`48F&-i9)98x4P5;
zFSo{M=8?~B_uvwfAPEygxME<~!WS437)|&@DQCN=qDYq2l3P|0)4xzw@robC(sz`=
zY%6lgKIQsxfV_dL0#`mvxlnh#Jr$Z5MTh=fw{QbDnS!j^lKd6}WoBrp09}-DL&~cwpe6
zg*+Y!3@3tp#8KcPyNQ4sr&$hZe(n8YfIU0@er?x+Qr)RM@yY?)vr=9D!%?-^4SWON
z3yho<=~dm2-Ksj>H}Mz+eMJ^Yt+g^6l`z)_Uj2kilqYI>i`Hcn?FS)yq^EW|9c<5^bRy}og9nN#t^|AQ
zGL%&ntB^7Kt1@;fDmue@(3(}+*zK6@mfSY4NGSKukTg%qz<4J-GgXqk);xR8EfL7<
z6a)mdN{O60o>wzU(pQS5^J`JoQbo;DP!ApT)J-%mwZ1|#y0`+?itnp%(IYqA^hVl#
zxXE`d!xs_g1Unwx{4a53a}*rACXOKf;v|D*{`EG{ho}5oO$R)~bFO-^LQ5t&{E(vt
z?VgxChH=PQ>*?X-^ib0SKj261YvfhV1d5#ZW@rWt8g>mY=&CtA=h(r~Okk%P==+na
zR_L(=`bN_W>nXIELh~eE(w0er^mWjo8RR9$Uj4AAfes1KN!$G3=f}8QoO+AVts`8U
zXyD69ehqxpz<2`_q%gB~jM?c1zBw$u#pA81BRu&x(Pfg4$+yJOs*Nx^V1|Di*ZGo+
zVV1jhF^zi(;kiWkalAr_48~ZJJJ{gaX|j5aP1?xiRH^wiou6oBJv@VPK2R-#pShXA
P7PdK>B(%VAJLvr%kpijm
literal 0
HcmV?d00001
diff --git a/mall_common/target/classes/com/mall/common/utils/StringUtils.class b/mall_common/target/classes/com/mall/common/utils/StringUtils.class
new file mode 100644
index 0000000000000000000000000000000000000000..58a5b4bd3bf9c0bb9ed56dd331c03c7088dfcc5f
GIT binary patch
literal 1805
zcma)7ZF3W46g^L}$u{ZI#sbko!B#+$v~+o?FEyorwJ4f|G7)C%2WPfnZ5B4WakEkR
zDewpQ(l35csLnWibH=~nzhD^k+}+J&?bN}{?33rYd+#~tzU0XtfBo_sfEC;+B7>|B
z%|H%$g|mLJYg&D))3wcx-|P9_z;rEd_lnsL1IOFF8#?YlA;0E$PPnd+tyJ$7F@b`P
zqJc>m3JZ)gdzR}a0On9)4#Ycy*3fkoj#nBFtnaLd!@Rxo!0v?g>h>h2Fs-9x;0??u
z9E)58#@z5-mp+c~Dd^5%v)2zFMJl#M#W4vuu5dDqy3w_Qw*BqU_BuAP#qUk=drM(9
z@jCz=DL8?XI_3o-^<+&MRmh4a|9jD%BrVMn_elG%i@&6Uk`Nz!EM*HECL5r>k&2
zU4z)Mo~m_Xsc!2q=`3v@^rge!1Xj=f-VYu|eKT)(;g%J4BTzdiVi{RkE*rQae7RoC
zrfvB5ZH4KE!rVx&%5Qx(
z#}S3cDGn{gaVo`8##O8n;ToSO4OW85)Rhn+_$>3wsZ{U-J{wG>A+E+<`
z^a+ZK&ryDiTy}49AF~S0rG30Da!zn_R^bIItqXLm(MQ{R`uCqv6=H>_p%bXWo41M*
z7E$Aca+$yM6Ik
z_mYyOn1u|3L8nn>UobP?VM)X8kU%J=f5q}w&v3E1R9pNRm!xZP-{p@>syD%!N$*7)
e-6L(>aMz$V-qg&iiPo5PlP?>56mE0PVCx@&TafYq
literal 0
HcmV?d00001
diff --git a/mall_modules/mall_back/src/main/java/com/mall/ColonelApplication.java b/mall_modules/mall_back/src/main/java/com/mall/ColonelApplication.java
new file mode 100644
index 0000000..b7c12f8
--- /dev/null
+++ b/mall_modules/mall_back/src/main/java/com/mall/ColonelApplication.java
@@ -0,0 +1,11 @@
+package com.mall;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class ColonelApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(ColonelApplication.class, args);
+ }
+}
diff --git a/mall_modules/mall_back/src/main/java/com/mall/config/XxlJobConfig.java b/mall_modules/mall_back/src/main/java/com/mall/config/XxlJobConfig.java
new file mode 100644
index 0000000..3761d24
--- /dev/null
+++ b/mall_modules/mall_back/src/main/java/com/mall/config/XxlJobConfig.java
@@ -0,0 +1,78 @@
+package com.mall.config;
+
+import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * xxl-job config
+ *
+ * @author xuxueli 2017-04-28
+ */
+@Configuration
+public class XxlJobConfig {
+ private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);
+
+ @Value("${xxl.job.admin.addresses}")
+ private String adminAddresses;
+
+ @Value("${xxl.job.accessToken}")
+ private String accessToken;
+
+ @Value("${xxl.job.executor.appname}")
+ private String appname;
+
+ @Value("${xxl.job.executor.address}")
+ private String address;
+
+ @Value("${xxl.job.executor.ip}")
+ private String ip;
+
+ @Value("${xxl.job.executor.port}")
+ private int port;
+
+ @Value("${xxl.job.executor.logpath}")
+ private String logPath;
+
+ @Value("${xxl.job.executor.logretentiondays}")
+ private int logRetentionDays;
+
+
+ @Bean
+ public XxlJobSpringExecutor xxlJobExecutor() {
+ logger.info(">>>>>>>>>>> xxl-job config init.");
+ XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
+ xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
+ xxlJobSpringExecutor.setAppname(appname);
+ xxlJobSpringExecutor.setAddress(address);
+ xxlJobSpringExecutor.setIp(ip);
+ xxlJobSpringExecutor.setPort(port);
+ xxlJobSpringExecutor.setAccessToken(accessToken);
+ xxlJobSpringExecutor.setLogPath(logPath);
+ xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
+
+ return xxlJobSpringExecutor;
+ }
+
+ /**
+ * 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP;
+ *
+ * 1、引入依赖:
+ *
+ * org.springframework.cloud
+ * spring-cloud-commons
+ * ${version}
+ *
+ *
+ * 2、配置文件,或者容器启动变量
+ * spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.'
+ *
+ * 3、获取IP
+ * String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
+ */
+
+
+}
\ No newline at end of file
diff --git a/mall_modules/mall_back/src/main/java/com/mall/controller/ColonelController.java b/mall_modules/mall_back/src/main/java/com/mall/controller/ColonelController.java
new file mode 100644
index 0000000..c7eb5cd
--- /dev/null
+++ b/mall_modules/mall_back/src/main/java/com/mall/controller/ColonelController.java
@@ -0,0 +1,35 @@
+package com.mall.controller;
+
+import com.mall.common.result.Result;
+import com.mall.domain.Colonel;
+import com.mall.service.ServiceColonel;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class ColonelController {
+
+ @Autowired
+ private ServiceColonel serviceColonel;
+
+ @PostMapping("/add/Colonel")
+ public Result addColonel(Colonel colonel){
+ Result result= serviceColonel.addColonel(colonel);
+ return Result.success(result);
+ }
+
+ @PostMapping("/update/Colonel")
+ public Result updateColonel(Colonel colonel){
+ Result result= serviceColonel.updateColonel(colonel);
+ return Result.success(result);
+ }
+
+ @PostMapping("/delete/Colonel")
+ public Result deleteColonel(Integer colonelId){
+ Result result= serviceColonel.deleteColonel(colonelId);
+ return Result.success(result);
+ }
+
+
+}
diff --git a/mall_modules/mall_back/src/main/java/com/mall/domain/Colonel.java b/mall_modules/mall_back/src/main/java/com/mall/domain/Colonel.java
new file mode 100644
index 0000000..1d5c1ac
--- /dev/null
+++ b/mall_modules/mall_back/src/main/java/com/mall/domain/Colonel.java
@@ -0,0 +1,74 @@
+package com.mall.domain;
+
+import io.swagger.models.auth.In;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+/**
+ * 团长表
+ * */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class Colonel {
+
+ /**
+ * id
+ * */
+ private Integer colonelId;
+ /**
+ * 用户id
+ * */
+ private Integer userId;
+ /**
+ * 公告/标题
+ * */
+ private String colonelTitle;
+ /**
+ * 开始时间
+ * */
+ private Date colonelStartTime;
+ /**
+ * 结束时间
+ * */
+ private Date colonelSendTime;
+ /**
+ * 团长申请海报
+ * */
+ private String colonelOneTmage;
+ /**
+ * 休市海报
+ * */
+ private String colonelTowTmage;
+ /**
+ * 供应商申请海报
+ * */
+ private String colonelThreeTmage;
+ /**
+ * 自定义团长名称
+ * */
+ private String colonelName;
+ /**
+ * 覆盖范围/公里
+ * */
+ private Integer colonelRadius;
+ /**
+ * 提现手续费/%
+ * */
+ private Double handlingCharge;
+ /**
+ * 最低提现金额/元
+ * */
+ private BigDecimal withdrawalAmount;
+ /**
+ * 团长佣金
+ * */
+ private Double colonelBrokerage;
+}
diff --git a/mall_modules/mall_back/src/main/java/com/mall/domain/RunningWater.java b/mall_modules/mall_back/src/main/java/com/mall/domain/RunningWater.java
new file mode 100644
index 0000000..2f8dcf0
--- /dev/null
+++ b/mall_modules/mall_back/src/main/java/com/mall/domain/RunningWater.java
@@ -0,0 +1,50 @@
+package com.mall.domain;
+
+import io.swagger.models.auth.In;
+import lombok.Data;
+import org.bouncycastle.jcajce.provider.symmetric.SM4;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 团长流水
+ * */
+@Data
+public class RunningWater {
+
+ /**
+ * 团长流水id
+ * */
+ private Integer waterId;
+ /**
+ * 头像
+ * */
+ private String avatar;
+ /**
+ * 团长属性id
+ * */
+ private Integer colonelId;
+ /**
+ * 佣金类型
+ * */
+ private String commissionType;
+ /**
+ * 所得佣金
+ * */
+ private BigDecimal commissionEarned;
+ /**
+ * 状态
+ * */
+ private Integer waterStasus;
+ /**
+ * 结束时间
+ * */
+ private Date stopTime;
+ /**
+ * 创建时间
+ * */
+ private Integer waterStasusOne;
+
+
+}
diff --git a/mall_modules/mall_back/src/main/java/com/mall/mapper/ColonelMapper.java b/mall_modules/mall_back/src/main/java/com/mall/mapper/ColonelMapper.java
new file mode 100644
index 0000000..3b254fa
--- /dev/null
+++ b/mall_modules/mall_back/src/main/java/com/mall/mapper/ColonelMapper.java
@@ -0,0 +1,9 @@
+package com.mall.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.mall.domain.Colonel;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface ColonelMapper extends BaseMapper{
+}
diff --git a/mall_modules/mall_back/src/main/java/com/mall/service/ServiceColonel.java b/mall_modules/mall_back/src/main/java/com/mall/service/ServiceColonel.java
new file mode 100644
index 0000000..103491e
--- /dev/null
+++ b/mall_modules/mall_back/src/main/java/com/mall/service/ServiceColonel.java
@@ -0,0 +1,16 @@
+package com.mall.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.mall.common.result.Result;
+import com.mall.domain.Colonel;
+
+
+public interface ServiceColonel extends IService {
+
+
+ Result addColonel(Colonel colonel);
+
+ Result updateColonel(Colonel colonel);
+
+ Result deleteColonel(Integer colonelId);
+}
diff --git a/mall_modules/mall_back/src/main/java/com/mall/service/impl/ServiceColonelimpl.java b/mall_modules/mall_back/src/main/java/com/mall/service/impl/ServiceColonelimpl.java
new file mode 100644
index 0000000..1836349
--- /dev/null
+++ b/mall_modules/mall_back/src/main/java/com/mall/service/impl/ServiceColonelimpl.java
@@ -0,0 +1,43 @@
+package com.mall.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.mall.common.result.Result;
+import com.mall.domain.Colonel;
+import com.mall.mapper.ColonelMapper;
+import com.mall.service.ServiceColonel;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class ServiceColonelimpl extends ServiceImpl
+ implements ServiceColonel {
+ @Autowired
+ private ColonelMapper colonelMapper;
+ @Override
+ public Result addColonel(Colonel colonel) {
+ if (colonel.getColonelId() != null){
+ return Result.error("添加失败");
+ }
+ boolean save = this.save(colonel);
+ return Result.success(save);
+ }
+
+ @Override
+ public Result updateColonel(Colonel colonel) {
+ if (colonel.getColonelId() == null){
+ return Result.error("修改失败");
+ }
+ boolean update = this.updateById(colonel);
+ return Result.success(update+"修改成功");
+ }
+
+ @Override
+ public Result deleteColonel(Integer colonelId) {
+ if (colonelId == null){
+ return Result.error("删除失败");
+ }
+ boolean delect = this.removeById(colonelId);
+ return Result.success(delect+"删除成功");
+ }
+
+}
diff --git a/mall_modules/mall_back/src/main/resources/bootstrap.yml b/mall_modules/mall_back/src/main/resources/bootstrap.yml
index c98fdb5..2934661 100644
--- a/mall_modules/mall_back/src/main/resources/bootstrap.yml
+++ b/mall_modules/mall_back/src/main/resources/bootstrap.yml
@@ -26,4 +26,22 @@ spring:
file-extension: yml
# 共享配置
shared-configs:
- - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
\ No newline at end of file
+ - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
+# xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
+xxl:
+ job:
+ admin:
+ addresses: http://127.0.0.1:8080/xxl-job-admin
+
+ # xxl-job, access token
+ accessToken: gtt_token
+
+ # xxl-job executor appname
+ executor:
+ appname: xxl-job-executor-sample
+ address:
+ server-info:
+ ip:
+ port: 9999
+ log-path: /data/applogs/xxl-job/jobhandler
+ log-retention-days: 30
diff --git a/mall_modules/mall_back/target/classes/bootstrap.yml b/mall_modules/mall_back/target/classes/bootstrap.yml
new file mode 100644
index 0000000..2934661
--- /dev/null
+++ b/mall_modules/mall_back/target/classes/bootstrap.yml
@@ -0,0 +1,47 @@
+# Tomcat
+server:
+ port: 9004
+# Spring
+spring:
+ main:
+ allow-circular-references: true
+ jackson:
+ date-format: yyyy-MM-dd HH:mm:ss
+ time-zone: GMT+8
+ application:
+ # 应用名称
+ name: czk-back
+ profiles:
+ # 环境配置
+ active: dev
+ cloud:
+ nacos:
+ discovery:
+ # 服务注册地址
+ server-addr: 42.192.106.69:8848
+ config:
+ # 配置中心地址
+ server-addr: 42.192.106.69:8848
+ # 配置文件格式
+ file-extension: yml
+ # 共享配置
+ shared-configs:
+ - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
+# xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
+xxl:
+ job:
+ admin:
+ addresses: http://127.0.0.1:8080/xxl-job-admin
+
+ # xxl-job, access token
+ accessToken: gtt_token
+
+ # xxl-job executor appname
+ executor:
+ appname: xxl-job-executor-sample
+ address:
+ server-info:
+ ip:
+ port: 9999
+ log-path: /data/applogs/xxl-job/jobhandler
+ log-retention-days: 30
diff --git a/mall_modules/mall_back/target/classes/com/mall/ColonelApplication.class b/mall_modules/mall_back/target/classes/com/mall/ColonelApplication.class
new file mode 100644
index 0000000000000000000000000000000000000000..dc612dd6d1c140897daad89cc9169474e083eb89
GIT binary patch
literal 726
zcmaJfgc5Ph2_aS{S;6KE+V2X1K&_)>8(ic})?WIjYtIB;4!8)w6MH(IZOztvL_
z2Yx_*6k^tmlt@Ha@{H!|&Fq`G`}6BJfJ+QIsNo<$y^98#3`Z;ejfaZsEPS7=MCurt
zucel5%y2Ngm<4DtoTnxabFNf4G0JG6uGVWMQ|_eE9dz&@K(~vBc*HO=HVccjl{#Bk
zo{R6sehm|2TsW}Fi7)veQm3boUC!fpEi%rVaj9cmLjkE5SvS1j*|9Q9v&AFrpoDBEP
zJEJ(a8Nu}Tgo*jL!Y$4G1NSsJVJWdQHKk3(we*9X{>$}C&lAJh$5K0)if3McY
zRl6XF@m`v$1@O`t;;Z6GY}WCHHnYQ5gck_tK>Sw&^Cv>`kgSk2Bi$I?g56Z%Ba%K0
zDmfK&uywexm((Tko&Y=LU2|TZ|S?a7zBC^f!oKQZ<}a
M@)^!a`?k-4znS8?R{#J2
literal 0
HcmV?d00001
diff --git a/mall_modules/mall_back/target/classes/com/mall/config/XxlJobConfig.class b/mall_modules/mall_back/target/classes/com/mall/config/XxlJobConfig.class
new file mode 100644
index 0000000000000000000000000000000000000000..0259980e5b3aff8c1f9b9fdc4ddf237e46e15143
GIT binary patch
literal 2008
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
Qe?`mxw*tSC(X$l)FX>Cs#Q*>R
literal 0
HcmV?d00001
diff --git a/mall_modules/mall_back/target/classes/com/mall/domain/RunningWater.class b/mall_modules/mall_back/target/classes/com/mall/domain/RunningWater.class
new file mode 100644
index 0000000000000000000000000000000000000000..ac7e16aca1c19e20f8cfd4198b7ecc1d8a1d40ce
GIT binary patch
literal 5026
zcmb_g`*Ryt75>(iv@3ZfOLA;yahke`OZ}`;QUYGb!A%^4!A?RPQc_-B+l#GKmRw10
zDNw@uQOf&KD9|6t43iliL*3yqO!U6nUZk{pF
zJ3etW4GU=#85@1D4IJ61?UZ)BN~N?}+wscP(&fEswOrkL*lYTA1Ll)5E^itbSZNC{
zSDXHpU!N1LoQ;0u`4Yai>5)>50N0vzYAIaN#(=yqy-};ws(xj8Q`mzxhJ>BtG)W$&rss^HtxeXB{sb3
z`N#LXih;rL$YOQ6=O!Kz@T83?OdH5-`AwBe$>HGmLFVSNsVqTLk|>UkSWcq=PJ>RPK9#gNi2hva41#@q1@=6u_0
zY@e%bvTSVPWfQ9ghT9FP=Y4jsT-o&N8LXh!!X@TA+RWoYE6+>(vW+!dk*?j{^{Xt+
zOtg|g8luJOc*C4XTos9jyO?1QM9SRBv~Z0Dm>$);W!}PjSmEi>)~2B6eN4J|q8ozl
z4=~$Nw@x+#9$R60G}5p1Z7{#nqhYVp!NgHC0%A|ly=B0dkkyoJT$gfN&6=LDfrQR?
z|4O;)U)bAO_v=@@^$LZGE42-;a@DJswU(|($VhRfq>d>Tp`J;BP3>XD07jl3w;$g5F}ya(0Dn@x?p$<)Z3isK;IK}hlQF+Prn_
zVIYege%cyP1rL|VjnXh;)I(d_^2#u0piR)S~NZG4he607(pK1C}<
z<-g+7v`n4}f5K;IS@;@W#Aj)x@f?1P&(X?YA791iY4zdPcm`jfW#ex=hn}I8#XsQV
zi?njQpqB6~t$rhg1$>EC-nf??_+?rJV+teq3auj5fOU+R*1wQ5VZDkW6FvO1j8}13
zo9X|98J=`cvq=;3(@!@kW|=HGJd@I$lH=$lsdKE)&SaQlX6*)N-fH_Bs_ps1hAtk*
zy~ilgN1?yx=T0Z)RdXN7&uz1{t^CwYm^1r$+oR$?;U*;DB!Y+~4X;Bd-J}Y!*A>Zf
zl40nSn^K`vE5se3S+lOGLTvtkWrm@7*HR&?72=lAtOYl%Lfj1jD;h#g$?v|W+jO~;~TVk*gk*6H<`R%9LF#4Em{ej!3+2{tt76o6`!M(
z;t9Wv@6a;YB&+x?Eek*5FX-oKrSUrq<9oC+(mck`kiShw!h~fQY#12EZN8xW+#`-b
zBtt-mNp!jbSSkW*BfGr;*z5$i@iBpbV!ejaX2r(>BLB~$7f5{cPpvm0{|1T=2lUJx
z;_bKpH$))PcW05d&i?>Wiao*Kr+UAzrYsrv%kHnRa_uEtC|=yhJ7wGK<6XsfYkQVM
z@eysG5dV9%Jum+EYkNWbk81m**z4L}6nj(Kr^Nms?R{)_f6a=1o!$+4*ueMIk?@26
E0HwU0?*IS*
literal 0
HcmV?d00001
diff --git a/mall_modules/mall_back/target/classes/com/mall/mapper/ColonelMapper.class b/mall_modules/mall_back/target/classes/com/mall/mapper/ColonelMapper.class
new file mode 100644
index 0000000000000000000000000000000000000000..c56a5e0e40745ed4ccb16bdd8c9d96d08987bb54
GIT binary patch
literal 376
zcmb7AJxc>Y5PcgpXQG1GrLeVh8@m%h1*?;Qft14BWjQzO$FU!Rf6c-l;Exg~8-i$O
zF<;EQH}mH6>-_`36;3LQ1kO8er6pt74TB2u-W%_fc`Q|heSy<8y^=KKdO2^`s!J8d
z0&)Xv$y>ehS=zUjl8%GPksCqn*zPE*EtSAzp?gOu2PN>_{3WfMe-d67KskNoEorwq
zy}qdhrVF1#ryjK7ZD+qkU2awj%$~AK+N!0Fx;5(7IiFaAcTwP?@u8PAQ1_ywF483Z
g49Kmdn%^L>$9BLU1!ooe5e_jaaf&03W9}aV-w+pa>i_@%
literal 0
HcmV?d00001
diff --git a/mall_modules/mall_back/target/classes/com/mall/service/ServiceColonel.class b/mall_modules/mall_back/target/classes/com/mall/service/ServiceColonel.class
new file mode 100644
index 0000000000000000000000000000000000000000..78036a16527f922249bdb80c9eeefb6a403b107f
GIT binary patch
literal 565
zcmb7BOHRWu5FNLakV2u*1F$U{yr3(J*dQTADgx0HIPoaB@~3i~3a-Y218^wBB#jb2
z8(7$*v1i_!H}C!9^$h@KFo~eY;52iF8=*BX&~H?Re7TJ`PCJV_f*l6qmDmWbh0XbW
zy230(u*=}0YE6YRO1hGpmsA8*taVv%d=6*}oBLO?l3$#`5?S77|<6CqHH@ggHgGbB4EojlBlVu&1cg^Cn~W4
zbM$}Uj2nVPGKiNdw<44t8Khs(wkw*~^Z#=_SDok|>$oPt!=)>IhPO%+*y86+_L6S9yEn5RR665(
zr%yikpilOpzB=uU188UTO=tW&gwcP(@!ZX3lT;`(KIERgx#ynqJHPXB|M=(UUjR(u
z^AtMJnLw9@ZuBtZE7I1>T-v4~1Kr*zbKmr8R^aL43tu>%DIMJt?z&kKx@p%ey;R>6
z=$oNu+H_2RmZ38{v64a(y$Pf=JOPbiNLjYIW$A{rx#{Q&(vps#TUu54(WYQ93}h#Y
z*ZDfvE$&qHg5!&-aPvt#Nt(M`4|nd|-MRPRuOGipp$~@>$Y|)t5r(6&efqEorYpR_
z^7Z9VFmwyol`g~CY>V}h@0w0EKT&+_<$MZ*7)szN4a0bvAscJ&MMV^fVuzv2D7`Pm&UbHrwR7h?Wn)U&c$wjJD}8a!
z_CY|DC3u4!;!YSimW7&C%-$l@BaPmy=Kre8fNi21?>u3u7^Q03`ZbL
zsfym@mU)YpEkSuqVlFmP2cN(K!`OeyBx;tp^3#=i4=gHZsd|tUh+(o$i7KMLJ8ke{t#}_Wekgk_?jI5`=
zrvpP+q!S-ZwU%IGC>=C67JR0p;*)C0tUBBeT%!G(FtYzSho_sg
z>{&(4<43rk%{Px48Er3FmB^9|+={qhs`40WKUOpEjA~1ok$V=SN309!Z`4HN;mG3z
z4c87Z%+s#}Z{jVI7wB>7A^A4RE|T;%(fSVUbdro@cWw*p0ey6!K&v_iG`t(Gp#t7R
zk#-D=xJX*+vO}_yO$|juXEVj8hF5<1-JD
zySjzvM>lag^WrAXZsL_aP>m3(Q9^Z$ypFY?%EhR1F{&Ya@EBAp_%I^pR)lJNQb9W3
zfHd6(>5Y9Mog}(WA%$^zkg_e1#$!n1xPq%hL?4E*+6pPvAnHm;+()!_;A4Ce%1`5B
H_zd_LEzeo_
literal 0
HcmV?d00001
diff --git a/mall_modules/mall_client/src/main/java/com/mall/CllentApplication.java b/mall_modules/mall_client/src/main/java/com/mall/CllentApplication.java
new file mode 100644
index 0000000..f3d6f1c
--- /dev/null
+++ b/mall_modules/mall_client/src/main/java/com/mall/CllentApplication.java
@@ -0,0 +1,13 @@
+package com.mall;
+
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+
+@SpringBootApplication
+public class CllentApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(CllentApplication.class, args);
+ }
+}
diff --git a/mall_modules/mall_client/src/main/java/com/mall/config/DesUtil.java b/mall_modules/mall_client/src/main/java/com/mall/config/DesUtil.java
new file mode 100644
index 0000000..1a555bd
--- /dev/null
+++ b/mall_modules/mall_client/src/main/java/com/mall/config/DesUtil.java
@@ -0,0 +1,250 @@
+package com.mall.config;
+
+import org.apache.tomcat.util.codec.binary.Base64;
+
+
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.charset.StandardCharsets;
+import java.security.Key;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.security.spec.AlgorithmParameterSpec;
+import javax.crypto.Cipher;
+import javax.crypto.CipherInputStream;
+import javax.crypto.CipherOutputStream;
+import javax.crypto.KeyGenerator;
+import javax.crypto.spec.IvParameterSpec;
+
+/**
+ * DES加密算法工具类
+ */
+public class DesUtil {
+
+ /**
+ * CFB
+ */
+ public static final String CFB = "CFB";
+
+ /**
+ * OFB
+ */
+ public static final String OFB = "OFB";
+
+ /**
+ * CBC
+ */
+ public static final String CBC = "CBC";
+
+ /**
+ * iv向量
+ */
+ private static final byte[] DESIV = {(byte) 0xCE, (byte) 0x35, (byte) 0x5,
+ (byte) 0xD, (byte) 0x98, (byte) 0x91, (byte) 0x8, (byte) 0xA};
+
+ /**
+ * AlgorithmParameterSpec
+ */
+ private static AlgorithmParameterSpec IV = null;
+
+ /**
+ * SHA1PRNG
+ */
+ private static final String SHA1PRNG = "SHA1PRNG";
+
+ /**
+ * DES默认模式
+ */
+ private static final String DES = "DES";
+
+ /**
+ * CBC加密模式
+ */
+ private static final String DES_CBC_PKCS5PADDING = "DES/CBC/PKCS5Padding";
+
+ /**
+ * OFB加密模式
+ */
+ private static final String DES_OFB_PKCS5PADDING = "DES/OFB/PKCS5Padding";
+
+ /**
+ * CFB加密模式
+ */
+ private static final String DES_CFB_PKCS5_PADDING = "DES/CFB/PKCS5Padding";
+
+ /**
+ * 加密模式
+ */
+ private static final int ENCRYPT_MODE = 1;
+
+ /**
+ * 解密模式
+ */
+ private static final int DECRYPT_MODE = 2;
+
+ /**
+ * 密钥
+ */
+ private Key key;
+
+ public void DesUtil(String str) {
+ getKey(str);
+ }
+
+ public Key getKey() {
+ return key;
+ }
+
+ public void setKey(Key key) {
+ this.key = key;
+ }
+
+ /**
+ * 通过密钥获得key
+ *
+ * @param secretKey 密钥
+ */
+ public void getKey(String secretKey) {
+ try {
+ SecureRandom secureRandom = SecureRandom.getInstance(SHA1PRNG);
+ secureRandom.setSeed(secretKey.getBytes());
+ KeyGenerator generator;
+ try {
+ generator = KeyGenerator.getInstance(DES);
+ generator.init(secureRandom);
+ IV = new IvParameterSpec(DESIV);
+ this.key = generator.generateKey();
+ } catch (NoSuchAlgorithmException e) {
+ e.printStackTrace();
+ }
+ } catch (Exception e) {
+ throw new RuntimeException("Error in getKey(String secretKey), Cause: " + e);
+ }
+ }
+
+ /**
+ * 字符串des加密
+ *
+ * @param data 需要加密的字符串
+ * @param encryptType 加密模式 (ECB/CBC/OFB/CFB)
+ * @return 加密结果
+ * @throws Exception 异常
+ */
+ public String encrypt(String data, String encryptType) throws Exception {
+ Cipher cipher = getPattern(encryptType, ENCRYPT_MODE);
+ byte[] pasByte = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
+ return Base64.encodeBase64String(pasByte);
+ }
+
+ /**
+ * 字符串des解密
+ *
+ * @param data 需要解密的字符串
+ * @param decryptType 解密模式 (ECB/CBC/OFB/CFB)
+ * @return 解密结果
+ * @throws Exception 异常
+ */
+ public String decrypt(String data, String decryptType) throws Exception {
+ Cipher cipher = getPattern(decryptType, DECRYPT_MODE);
+ byte[] pasByte = cipher.doFinal(Base64.decodeBase64(data));
+ return new String(pasByte, StandardCharsets.UTF_8);
+ }
+
+ /**
+ * 初始化cipher
+ *
+ * @param type 加密/解密模式 (ECB/CBC/OFB/CFB)
+ * @param cipherMode cipher工作模式 1:加密; 2:解密
+ * @return cipher
+ * @throws Exception 异常
+ */
+ private Cipher getPattern(String type, int cipherMode) throws Exception {
+ Cipher cipher;
+ switch (type) {
+ case CBC:
+ cipher = Cipher.getInstance(DES_CBC_PKCS5PADDING);
+ cipher.init(cipherMode, key, IV);
+ break;
+ case OFB:
+ cipher = Cipher.getInstance(DES_OFB_PKCS5PADDING);
+ cipher.init(cipherMode, key, IV);
+ break;
+ case CFB:
+ cipher = Cipher.getInstance(DES_CFB_PKCS5_PADDING);
+ cipher.init(cipherMode, key, IV);
+ break;
+ default:
+ cipher = Cipher.getInstance(DES);
+ cipher.init(cipherMode, key);
+ break;
+ }
+ return cipher;
+ }
+
+ /**
+ * 文件 file 进行加密并保存目标文件 destFile 中
+ *
+ * @param file 要加密的文件 如 c:/test/file.txt
+ * @param destFile 加密后存放的文件名 如 c:/ 加密后文件 .txt
+ * @param encryptType 加密模式 (ECB/CBC/OFB/CFB)
+ * @return 加密结果 0:异常 1:加密成功; 5:未找到需要加密的文件
+ */
+ public int encryptFile(String file, String destFile, String encryptType) {
+ int result = 0;
+ try {
+ Cipher cipher = getPattern(encryptType, ENCRYPT_MODE);
+ InputStream is = new FileInputStream(file);
+ OutputStream out = new FileOutputStream(destFile);
+ CipherInputStream cis = new CipherInputStream(is, cipher);
+ byte[] buffer = new byte[1024];
+ int r;
+ while ((r = cis.read(buffer)) > 0) {
+ out.write(buffer, 0, r);
+ }
+ cis.close();
+ is.close();
+ out.close();
+ result = 1;
+ } catch (FileNotFoundException e) {
+ result = 5;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return result;
+ }
+
+ /**
+ * 文件 file 进行解密并保存目标文件 destFile 中
+ *
+ * @param file 要解密的文件 如 c:/test/file.txt
+ * @param destFile 解密后存放的文件名 如 c:/ 解密后文件 .txt
+ * @param decryptType 解密模式 (ECB/CBC/OFB/CFB)
+ * @return 解密结果 0:解密异常;1:解密正常;5:未找到需要解密的文件
+ */
+ public int decryptFile(String file, String destFile, String decryptType) {
+ int result = 0;
+ try {
+ Cipher cipher = getPattern(decryptType, DECRYPT_MODE);
+ InputStream is = new FileInputStream(file);
+ OutputStream out = new FileOutputStream(destFile);
+ CipherOutputStream cos = new CipherOutputStream(out, cipher);
+ byte[] buffer = new byte[1024];
+ int r;
+ while ((r = is.read(buffer)) >= 0) {
+ cos.write(buffer, 0, r);
+ }
+ cos.close();
+ out.close();
+ is.close();
+ result = 1;
+ } catch (FileNotFoundException e) {
+ result = 5;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return result;
+ }
+}
diff --git a/mall_modules/mall_client/src/main/java/com/mall/config/SnowFlakeUtil.java b/mall_modules/mall_client/src/main/java/com/mall/config/SnowFlakeUtil.java
new file mode 100644
index 0000000..d7e61ed
--- /dev/null
+++ b/mall_modules/mall_client/src/main/java/com/mall/config/SnowFlakeUtil.java
@@ -0,0 +1,158 @@
+package com.mall.config;
+
+
+
+/**
+ * @author ChenYanbing
+ * @title: UniqueOrderGenerate
+ * @projectName tencent-demo
+ * @description: TODO
+ * @date 2019/8/19:39
+ */
+
+/**
+ * 雪花算法
+ *
+ * Twitter_Snowflake
+ * SnowFlake的结构如下(每部分用-分开):
+ * 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000
+ * 1位标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0
+ * 41位时间截(毫秒级),注意,41位时间截不是存储当前时间的时间截,而是存储时间截的差值(当前时间截 - 开始时间截)
+ * 得到的值),这里的的开始时间截,一般是我们的id生成器开始使用的时间,由我们程序来指定的(如下下面程序IdWorker类的startTime属性)。41位的时间截,可以使用69年,年T = (1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69
+ * 10位的数据机器位,可以部署在1024个节点,包括5位datacenterId和5位workerId
+ * 12位序列,毫秒内的计数,12位的计数顺序号支持每个节点每毫秒(同一机器,同一时间截)产生4096个ID序号
+ * 加起来刚好64位,为一个Long型。
+ * SnowFlake的优点是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由数据中心ID和机器ID作区分),并且效率较高,经测试,SnowFlake每秒能够产生26万ID左右。
+ */
+public class SnowFlakeUtil {
+// ==============================Fields===========================================
+ /** 开始时间截 (2019-08-01) */
+
+ private final long twepoch = 1564625329000L;
+
+ /** 机器id所占的位数 */
+ private final long workerIdBits = 5L;
+
+ /** 数据标识id所占的位数 */
+ private final long datacenterIdBits = 5L;
+
+ /** 支持的最大机器id,结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数) */
+ private final long maxWorkerId = -1L ^ (-1L << workerIdBits);
+
+ /** 支持的最大数据标识id,结果是31 */
+ private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);
+
+ /** 序列在id中占的位数 */
+ private final long sequenceBits = 12L;
+
+ /** 机器ID向左移12位 */
+ private final long workerIdShift = sequenceBits;
+
+ /** 数据标识id向左移17位(12+5) */
+ private final long datacenterIdShift = sequenceBits + workerIdBits;
+
+ /** 时间截向左移22位(5+5+12) */
+ private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
+
+ /** 生成序列的掩码,这里为4095 (0b111111111111=0xfff=4095) */
+ private final long sequenceMask = -1L ^ (-1L << sequenceBits);
+
+ /** 工作机器ID(0~31) */
+ private long workerId;
+
+ /** 数据中心ID(0~31) */
+ private long datacenterId;
+
+ /** 毫秒内序列(0~4095) */
+ private long sequence = 0L;
+
+ /** 上次生成ID的时间截 */
+ private long lastTimestamp = -1L;
+
+ //==============================Constructors=====================================
+ /**
+ * 构造函数
+ * @param workerId 工作ID (0~31)
+ * @param datacenterId 数据中心ID (0~31)
+ */
+ public SnowFlakeUtil(long workerId, long datacenterId) {
+ if (workerId > maxWorkerId || workerId < 0) {
+ throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
+ }
+ if (datacenterId > maxDatacenterId || datacenterId < 0) {
+ throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));
+ }
+ this.workerId = workerId;
+ this.datacenterId = datacenterId;
+ }
+
+ // ==============================Methods==========================================
+ /**
+ * 获得下一个ID (该方法是线程安全的)
+ * @return SnowflakeId
+ */
+ public synchronized long nextId() {
+ long timestamp = timeGen();
+
+ //如果当前时间小于上一次ID生成的时间戳,说明系统时钟回退过这个时候应当抛出异常
+ if (timestamp < lastTimestamp) {
+ throw new RuntimeException(
+ String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
+ }
+
+ //如果是同一时间生成的,则进行毫秒内序列
+ if (lastTimestamp == timestamp) {
+ sequence = (sequence + 1) & sequenceMask;
+ //毫秒内序列溢出
+ if (sequence == 0) {
+ //阻塞到下一个毫秒,获得新的时间戳
+ timestamp = tilNextMillis(lastTimestamp);
+ }
+ }
+ //时间戳改变,毫秒内序列重置
+ else {
+ sequence = 0L;
+ }
+
+ //上次生成ID的时间截
+ lastTimestamp = timestamp;
+
+ //移位并通过或运算拼到一起组成64位的ID
+ return (((timestamp - twepoch) << timestampLeftShift) //
+ | (datacenterId << datacenterIdShift) //
+ | (workerId << workerIdShift) //
+ | sequence);
+ }
+
+ /**
+ * 阻塞到下一个毫秒,直到获得新的时间戳
+ * @param lastTimestamp 上次生成ID的时间截
+ * @return 当前时间戳
+ */
+ protected long tilNextMillis(long lastTimestamp) {
+ long timestamp = timeGen();
+ while (timestamp <= lastTimestamp) {
+ timestamp = timeGen();
+ }
+ return timestamp;
+ }
+
+ /**
+ * 返回以毫秒为单位的当前时间
+ * @return 当前时间(毫秒)
+ */
+ protected long timeGen() {
+ return System.currentTimeMillis();
+ }
+
+ //==============================Test=============================================
+ /** 测试 */
+ public static void main(String[] args) {
+ SnowFlakeUtil idWorker = new SnowFlakeUtil(0, 0);
+ for (int i = 0; i < 10; i++) {
+ long id = idWorker.nextId();
+ //System.out.println(Long.toBinaryString(id));
+ System.out.println(id);
+ }
+ }
+}
diff --git a/mall_modules/mall_client/src/main/java/com/mall/config/Snowflake.java b/mall_modules/mall_client/src/main/java/com/mall/config/Snowflake.java
new file mode 100644
index 0000000..efa98a4
--- /dev/null
+++ b/mall_modules/mall_client/src/main/java/com/mall/config/Snowflake.java
@@ -0,0 +1,88 @@
+package com.mall.config;
+
+/**
+ * 雪花算法
+ * */
+public class Snowflake {
+ // 起始时间戳
+ private final static long START_TIMESTAMP = 1480166465631L;
+
+ // 机器ID所占的位数
+ private final static long MACHINE_BIT = 5;
+
+ // 序列号所占的位数
+ private final static long SEQUENCE_BIT = 12;
+
+ // 机器ID最大值
+ private final static long MAX_MACHINE_NUM = -1L ^ (-1L << MACHINE_BIT);
+
+ // 序列号最大值
+ private final static long MAX_SEQUENCE_NUM = -1L ^ (-1L << SEQUENCE_BIT);
+
+ // 机器ID左移位数
+ private final static long MACHINE_LEFT_SHIFT = SEQUENCE_BIT;
+
+ // 时间戳左移位数
+ private final static long TIMESTAMP_LEFT_SHIFT = MACHINE_LEFT_SHIFT + MACHINE_BIT;
+
+ // 上一个时间戳
+ private static long lastTimestamp = -1L;
+
+ // 序列号
+ private static long sequenceNum = 0L;
+
+ // 机器ID
+ private long machineId;
+
+ /**
+ * 构造函数
+ */
+ public Snowflake() {
+ if (machineId > MAX_MACHINE_NUM || machineId < 0) {
+ throw new IllegalArgumentException("machineId can't be greater than " + MAX_MACHINE_NUM + " or less than 0");
+ }
+ this.machineId = machineId;
+ }
+
+ /**
+ * 获取下一个唯一ID
+ * @return 唯一ID
+ */
+ public synchronized long getNextId() {
+ long timestamp = System.currentTimeMillis();
+ if (timestamp < lastTimestamp) {
+ throw new RuntimeException("Clock moved backwards. Refusing to generate id");
+ }
+ if (timestamp == lastTimestamp) {
+ sequenceNum = (sequenceNum + 1) & MAX_SEQUENCE_NUM;
+ if (sequenceNum == 0) {
+ timestamp = waitNextMillis(lastTimestamp);
+ }
+ } else {
+ sequenceNum = 0L;
+ }
+ lastTimestamp = timestamp;
+ return ((timestamp - START_TIMESTAMP) << TIMESTAMP_LEFT_SHIFT) | (machineId << MACHINE_LEFT_SHIFT) | sequenceNum;
+ }
+
+ /**
+ * 等待下一个毫秒
+ * @param lastTimestamp 上一个时间戳
+ * @return 当前时间戳
+ */
+ private long waitNextMillis(long lastTimestamp) {
+ long timestamp = System.currentTimeMillis();
+ while (timestamp <= lastTimestamp) {
+ timestamp = System.currentTimeMillis();
+ }
+ return timestamp;
+ }
+
+ public static void main(String[] args) {
+ Snowflake snowflake = new Snowflake();
+ System.out.println(snowflake.getNextId());
+ SnowFlakeUtil snowFlakeUtil = new SnowFlakeUtil(0, 1);
+ System.out.println(snowFlakeUtil.nextId());
+ }
+
+}
diff --git a/mall_modules/mall_client/src/main/java/com/mall/controller/BargainController.java b/mall_modules/mall_client/src/main/java/com/mall/controller/BargainController.java
new file mode 100644
index 0000000..c6c8d19
--- /dev/null
+++ b/mall_modules/mall_client/src/main/java/com/mall/controller/BargainController.java
@@ -0,0 +1,65 @@
+package com.mall.controller;
+
+
+import com.mall.common.result.Result;
+import com.mall.domin.PmsBargain;
+import com.mall.domin.PmsBargainRecord;
+import com.mall.domin.PmsSku;
+import com.mall.service.BargainService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+/**
+ * 砍价
+ * */
+@RestController
+public class BargainController {
+
+ @Autowired
+ private BargainService bargainService;
+
+ @PostMapping("/select/bargain")
+ public Result> selectBargain(){
+ return bargainService.selectBargain();
+ }
+
+ @PostMapping("/add/bargain")
+ public Result addBargain(PmsBargain pmsBargain){
+ return bargainService.addBargain(pmsBargain);
+ }
+
+ @PostMapping("/update/bargain")
+ public Result updateBargain(PmsBargain pmsBargain){
+ return bargainService.updateBargain(pmsBargain);
+ }
+
+ @PostMapping("/delete/bargain")
+ public Result deleteBargain(Integer bargainId){
+ return bargainService.deleteBargain(bargainId);
+ }
+
+ @PostMapping("/select/cut/")
+ public Result> selectCut(PmsSku pmsSku){
+ List pmsBargains=bargainService.selectCut(pmsSku);
+ return Result.success(pmsBargains);
+ }
+
+
+ @PostMapping("/initiate")
+ public Result initiateBargain(@RequestParam Long userId, @RequestParam Long productId) {
+ String bargainLink = bargainService.initiateBargain(userId, productId);
+ return Result.success(bargainLink);
+ }
+
+ @GetMapping("/records")
+ public Result getBargainRecords(@RequestParam Long userId) {
+ List records = bargainService.getBargainRecords(userId);
+ return Result.success(records);
+ }
+
+
+}
diff --git a/mall_modules/mall_client/src/main/java/com/mall/controller/BargainRecordController.java b/mall_modules/mall_client/src/main/java/com/mall/controller/BargainRecordController.java
new file mode 100644
index 0000000..a022725
--- /dev/null
+++ b/mall_modules/mall_client/src/main/java/com/mall/controller/BargainRecordController.java
@@ -0,0 +1,26 @@
+package com.mall.controller;
+
+import com.mall.common.result.Result;
+import com.mall.domin.PmsBargainRecord;
+import com.mall.service.BargainRecordServie;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 砍价记录
+ * */
+@RestController
+public class BargainRecordController {
+
+ @Autowired
+ private BargainRecordServie bargainRecordService;
+
+
+ @PostMapping("/select/bargain/record/")
+ public Result> selectBargainRecord() {
+ return Result.success(bargainRecordService.list());
+ }
+}
diff --git a/mall_modules/mall_client/src/main/java/com/mall/controller/CategoryController.java b/mall_modules/mall_client/src/main/java/com/mall/controller/CategoryController.java
new file mode 100644
index 0000000..ae7f9cb
--- /dev/null
+++ b/mall_modules/mall_client/src/main/java/com/mall/controller/CategoryController.java
@@ -0,0 +1,33 @@
+package com.mall.controller;
+
+import com.mall.common.result.Result;
+import com.mall.domin.PmsCategory;
+import com.mall.service.CategoryService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 三级分类
+ * */
+@RestController
+public class CategoryController {
+
+ @Autowired
+ private CategoryService categoryService;
+
+
+ /**
+ * 三级分类
+ * */
+ @RequestMapping("/list/tree")
+ public Result list(){
+ List categories=categoryService.listWithTree();
+ return Result.success(categories);
+ }
+
+
+
+}
diff --git a/mall_modules/mall_client/src/main/java/com/mall/controller/SkuController.java b/mall_modules/mall_client/src/main/java/com/mall/controller/SkuController.java
new file mode 100644
index 0000000..7055a96
--- /dev/null
+++ b/mall_modules/mall_client/src/main/java/com/mall/controller/SkuController.java
@@ -0,0 +1,32 @@
+package com.mall.controller;
+
+import com.mall.common.result.Result;
+import com.mall.domin.PmsBargain;
+import com.mall.domin.PmsSku;
+import com.mall.service.SkuService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 商品
+ * */
+@RestController
+public class SkuController {
+ @Autowired
+ private SkuService skuService;
+
+ @PostMapping("/select/sku")
+ public Result> selectSku() {
+ return Result.success(skuService.list());
+ }
+
+ @PostMapping("/select/sku/bargain")
+ public Result> selectSkuBargain(PmsBargain pmsBargain) {
+ List skuList = skuService.selectSkuBargain(pmsBargain);
+ return Result.success(skuList);
+ }
+
+}
diff --git a/mall_modules/mall_client/src/main/java/com/mall/domin/PmsBargain.java b/mall_modules/mall_client/src/main/java/com/mall/domin/PmsBargain.java
new file mode 100644
index 0000000..ac3401a
--- /dev/null
+++ b/mall_modules/mall_client/src/main/java/com/mall/domin/PmsBargain.java
@@ -0,0 +1,92 @@
+package com.mall.domin;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.util.Date;
+/**
+ * 砍价
+ * */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class PmsBargain{
+
+ /**
+ * 砍价表id
+ * */
+ private Integer id;
+ /**
+ * 砍价图片
+ * */
+ private String bargainImg;
+ /**
+ * 砍价名称(加(梁))
+ * */
+ private String bargainName;
+ /**
+ * 砍价价格(改(梁))
+ * */
+ private BigDecimal bargainPrice;
+ /**
+ * 最低价
+ * */
+ private BigDecimal bargainMinPrice;
+ /**
+ * 参与人数
+ * */
+ private Integer bargainNum;
+ /**
+ * 帮忙砍价人数
+ * */
+ private Integer bargainHelpNum;
+ /**
+ * 参加成功人数
+ * */
+ private Integer bargainSuccessNum;
+ /**
+ * 限量
+ * */
+ private Integer bargainLimited;
+ /**
+ * 限量剩余
+ * */
+ private Integer bargainLimitedRemainder;
+ /**
+ * 结束时间
+ * */
+ private Date bargainEndTime;
+ /**
+ * 砍价状态(0未砍价1砍价中2砍价成功3已放弃)
+ * */
+ private Integer bargainStaus;
+ /**
+ * id删除(0未删除2已删除)
+ * */
+ private Integer bargainDelid;
+ /**
+ * 商品介绍(加(梁))
+ * */
+ private String bargainIntroduce;
+ /**
+ * 总共砍次数(加(梁))
+ * */
+ private Integer bargainAltogether;
+ /**
+ * 剩余砍次数(加(梁))
+ * */
+ private Integer bargainSurplus;
+ /**
+ * 砍价开始时间(加(梁))
+ * */
+ private Date bargainStopTime;
+ /**
+ * 砍价结束时间(加(梁))
+ * */
+ private Date bargainSendTime;
+
+}
diff --git a/mall_modules/mall_client/src/main/java/com/mall/domin/PmsBargainRecord.java b/mall_modules/mall_client/src/main/java/com/mall/domin/PmsBargainRecord.java
new file mode 100644
index 0000000..032ffe7
--- /dev/null
+++ b/mall_modules/mall_client/src/main/java/com/mall/domin/PmsBargainRecord.java
@@ -0,0 +1,52 @@
+package com.mall.domin;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+/**
+ * 砍价记录
+ * */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class PmsBargainRecord {
+
+ /**
+ * id
+ * */
+ private Integer id;
+ /**
+ * 砍价id
+ * */
+ private Integer bargainId;
+ /**
+ * 商品id
+ * */
+ private Integer skuId;
+ /**
+ * 用户id
+ * */
+ private Integer userId;
+ /**
+ * 砍价比率
+ * */
+ private Integer bargainRatio;
+ /**
+ * 砍价金额
+ * */
+ private Integer bargainAmount;
+ /**
+ * 砍价时间
+ * */
+ private Date bargainingTime;
+ /**
+ * 是否为砍价发起人(0发起人 1帮砍人)
+ * */
+ private Integer state;
+
+}
diff --git a/mall_modules/mall_client/src/main/java/com/mall/domin/PmsCategory.java b/mall_modules/mall_client/src/main/java/com/mall/domin/PmsCategory.java
new file mode 100644
index 0000000..07bd6e1
--- /dev/null
+++ b/mall_modules/mall_client/src/main/java/com/mall/domin/PmsCategory.java
@@ -0,0 +1,52 @@
+package com.mall.domin;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * 三级分类递归
+ * */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class PmsCategory {
+
+ /**
+ * 分类id
+ * */
+ private Integer id;
+ /**
+ * 分类名称
+ * */
+ private String name;
+ /**
+ * 父分类id
+ * */
+ private Integer parentId;
+ /**
+ * 是否显示[0-不显示,1显示]
+ * */
+ private Integer status;
+ /**
+ * 排序
+ * */
+ private Integer sort;
+ /**
+ * 图标地址
+ * */
+ private String icon;
+ /**
+ * 计量单位
+ * */
+ private String unit;
+
+ @TableField(exist = false)
+ private List children;
+
+}
diff --git a/mall_modules/mall_client/src/main/java/com/mall/domin/PmsSku.java b/mall_modules/mall_client/src/main/java/com/mall/domin/PmsSku.java
new file mode 100644
index 0000000..cfe1e9b
--- /dev/null
+++ b/mall_modules/mall_client/src/main/java/com/mall/domin/PmsSku.java
@@ -0,0 +1,84 @@
+package com.mall.domin;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+/**
+ *sku信息表
+ * */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class PmsSku {
+
+ /**
+ * skuId
+ * */
+ private Integer id;
+ /**
+ * spuId
+ * */
+ private Integer spuId;
+ /**
+ * sku名称
+ * */
+ private String name;
+ /**
+ * 所属分类id
+ * */
+ private Integer categoryId;
+ /**
+ * 品牌id
+ * */
+ private Integer brandId;
+ /**
+ * 默认图片
+ * */
+ private String defaultImage;
+ /**
+ * 标题
+ * */
+ private String title;
+ /**
+ * 副标题
+ * */
+ private String subtitle;
+ /**
+ * 价格
+ * */
+ private BigDecimal price;
+ /**
+ * 活动价格
+ * */
+ private BigDecimal activityPrice;
+ /**
+ * 重量(克)
+ * */
+ private Integer weight;
+ /**
+ * 库存
+ * */
+ private Integer inventory;
+ /**
+ * 库存限制量
+ * */
+ private Integer inventoryRestrict;
+ /**
+ * 秒杀id(0未开启秒杀)
+ * */
+ private Integer spikesId;
+ /**
+ * 砍价id(0未开启砍价)
+ * */
+ private Integer bargainId;
+ /**
+ * 拼团id(0未开启拼团)
+ * */
+ private Integer groupId;
+
+}
diff --git a/mall_modules/mall_client/src/main/java/com/mall/domin/PmsSkuImage.java b/mall_modules/mall_client/src/main/java/com/mall/domin/PmsSkuImage.java
new file mode 100644
index 0000000..eaf4753
--- /dev/null
+++ b/mall_modules/mall_client/src/main/java/com/mall/domin/PmsSkuImage.java
@@ -0,0 +1,39 @@
+package com.mall.domin;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * sku图片信息表
+ * */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class PmsSkuImage {
+
+ /**
+ * id
+ * */
+ private Integer id;
+ /**
+ * sku_id
+ * */
+ private Integer skuId;
+ /**
+ * 图片地址
+ * */
+ private String url;
+ /**
+ * 排序
+ * */
+ private Integer sort;
+ /**
+ * 默认图[0 - 不是默认图,1 - 是默认图]
+ * */
+ private Integer defaulStatus;
+
+
+}
diff --git a/mall_modules/mall_client/src/main/java/com/mall/domin/PmsSpu.java b/mall_modules/mall_client/src/main/java/com/mall/domin/PmsSpu.java
new file mode 100644
index 0000000..900feb8
--- /dev/null
+++ b/mall_modules/mall_client/src/main/java/com/mall/domin/PmsSpu.java
@@ -0,0 +1,48 @@
+package com.mall.domin;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+/**
+ * spu信息表
+ * */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class PmsSpu {
+
+ /**
+ * 商品id
+ * */
+ private Integer id;
+ /**
+ * 商品名称
+ * */
+ private String name;
+ /**
+ * 所属分类id
+ * */
+ private Integer categoryId;
+ /**
+ * 品牌id
+ * */
+ private Integer brandId;
+ /**
+ * 上架状态[0 - 下架,1 - 上架]
+ * */
+ private Integer publishStatus;
+ /**
+ * 创建时间
+ * */
+ private Date createTime;
+ /**
+ * 更新时间
+ * */
+ private Date updateTime;
+
+}
diff --git a/mall_modules/mall_client/src/main/java/com/mall/domin/vo/PmsBargainVo.java b/mall_modules/mall_client/src/main/java/com/mall/domin/vo/PmsBargainVo.java
new file mode 100644
index 0000000..b4419d9
--- /dev/null
+++ b/mall_modules/mall_client/src/main/java/com/mall/domin/vo/PmsBargainVo.java
@@ -0,0 +1,55 @@
+package com.mall.domin.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class PmsBargainVo {
+
+
+ /**
+ * 砍价图片
+ * */
+ private String bargainImg;
+ /**
+ * 砍价名称(加(梁))
+ * */
+ private String bargainName;
+ /**
+ * 商品介绍(加(梁))
+ * */
+ private String bargainIntroduce;
+ /**
+ * 砍价价格(改(梁))
+ * */
+ private BigDecimal bargainPrice;
+ /**
+ * 总共砍次数(加(梁))
+ * */
+ private Integer bargainAltogether;
+ /**
+ * 剩余砍次数(加(梁))
+ * */
+ private Integer bargainSurplus;
+ /**
+ * 砍价开始时间(加(梁))
+ * */
+ private Date bargainStopTime;
+ /**
+ * 砍价结束时间(加(梁))
+ * */
+ private Date bargainSendTime;
+ /**
+ * 砍价状态(0未砍价1砍价中2砍价成功3已放弃)
+ * */
+ private Integer bargainStaus;
+
+}
diff --git a/mall_modules/mall_client/src/main/java/com/mall/domin/vo/SkuVo.java b/mall_modules/mall_client/src/main/java/com/mall/domin/vo/SkuVo.java
new file mode 100644
index 0000000..e40240b
--- /dev/null
+++ b/mall_modules/mall_client/src/main/java/com/mall/domin/vo/SkuVo.java
@@ -0,0 +1,24 @@
+package com.mall.domin.vo;
+
+import lombok.Data;
+
+@Data
+public class SkuVo {
+
+ /**
+ * 商品名称
+ * */
+ private String name;
+ /**
+ * 标题
+ * */
+ private String title;
+ /**
+ * 副标题
+ * */
+ private String subtitle;
+ /**
+ * 砍价id(0未开启砍价)
+ * */
+ private Integer bargainId;
+}
diff --git a/mall_modules/mall_client/src/main/java/com/mall/mapper/BargainMapper.java b/mall_modules/mall_client/src/main/java/com/mall/mapper/BargainMapper.java
new file mode 100644
index 0000000..d491816
--- /dev/null
+++ b/mall_modules/mall_client/src/main/java/com/mall/mapper/BargainMapper.java
@@ -0,0 +1,9 @@
+package com.mall.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.mall.domin.PmsBargain;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface BargainMapper extends BaseMapper {
+}
diff --git a/mall_modules/mall_client/src/main/java/com/mall/mapper/BargainRecordMapper.java b/mall_modules/mall_client/src/main/java/com/mall/mapper/BargainRecordMapper.java
new file mode 100644
index 0000000..6ce672c
--- /dev/null
+++ b/mall_modules/mall_client/src/main/java/com/mall/mapper/BargainRecordMapper.java
@@ -0,0 +1,9 @@
+package com.mall.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.mall.domin.PmsBargainRecord;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface BargainRecordMapper extends BaseMapper {
+}
diff --git a/mall_modules/mall_client/src/main/java/com/mall/mapper/CategoryMapper.java b/mall_modules/mall_client/src/main/java/com/mall/mapper/CategoryMapper.java
new file mode 100644
index 0000000..66e6f72
--- /dev/null
+++ b/mall_modules/mall_client/src/main/java/com/mall/mapper/CategoryMapper.java
@@ -0,0 +1,9 @@
+package com.mall.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.mall.domin.PmsCategory;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface CategoryMapper extends BaseMapper {
+}
diff --git a/mall_modules/mall_client/src/main/java/com/mall/mapper/PamSkuMapper.java b/mall_modules/mall_client/src/main/java/com/mall/mapper/PamSkuMapper.java
new file mode 100644
index 0000000..ed64a7a
--- /dev/null
+++ b/mall_modules/mall_client/src/main/java/com/mall/mapper/PamSkuMapper.java
@@ -0,0 +1,9 @@
+package com.mall.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.mall.domin.PmsSku;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface PamSkuMapper extends BaseMapper {
+}
diff --git a/mall_modules/mall_client/src/main/java/com/mall/service/BargainRecordServie.java b/mall_modules/mall_client/src/main/java/com/mall/service/BargainRecordServie.java
new file mode 100644
index 0000000..2eec708
--- /dev/null
+++ b/mall_modules/mall_client/src/main/java/com/mall/service/BargainRecordServie.java
@@ -0,0 +1,15 @@
+package com.mall.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.mall.domin.PmsBargain;
+import com.mall.domin.PmsBargainRecord;
+
+import java.util.List;
+
+public interface BargainRecordServie extends IService {
+
+
+
+
+
+}
diff --git a/mall_modules/mall_client/src/main/java/com/mall/service/BargainService.java b/mall_modules/mall_client/src/main/java/com/mall/service/BargainService.java
new file mode 100644
index 0000000..abcea7b
--- /dev/null
+++ b/mall_modules/mall_client/src/main/java/com/mall/service/BargainService.java
@@ -0,0 +1,29 @@
+package com.mall.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.mall.common.result.Result;
+import com.mall.domin.PmsBargain;
+import com.mall.domin.PmsBargainRecord;
+import com.mall.domin.PmsSku;
+
+
+import java.util.List;
+
+
+public interface BargainService extends IService {
+
+ Result> selectBargain();
+
+ Result addBargain(PmsBargain pmsBargain);
+
+ Result updateBargain(PmsBargain pmsBargain);
+
+ Result deleteBargain(Integer bargainId);
+
+
+ List selectCut(PmsSku pmsSku);
+
+ String initiateBargain(Long userId, Long productId);
+
+ List getBargainRecords(Long userId);
+}
diff --git a/mall_modules/mall_client/src/main/java/com/mall/service/CategoryService.java b/mall_modules/mall_client/src/main/java/com/mall/service/CategoryService.java
new file mode 100644
index 0000000..06d2e20
--- /dev/null
+++ b/mall_modules/mall_client/src/main/java/com/mall/service/CategoryService.java
@@ -0,0 +1,13 @@
+package com.mall.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.mall.domin.PmsCategory;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+public interface CategoryService extends IService {
+
+
+ List listWithTree();
+}
diff --git a/mall_modules/mall_client/src/main/java/com/mall/service/SkuService.java b/mall_modules/mall_client/src/main/java/com/mall/service/SkuService.java
new file mode 100644
index 0000000..e0f7af6
--- /dev/null
+++ b/mall_modules/mall_client/src/main/java/com/mall/service/SkuService.java
@@ -0,0 +1,15 @@
+package com.mall.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.mall.domin.PmsBargain;
+import com.mall.domin.PmsSku;
+import com.mall.service.impl.SkuServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.List;
+
+public interface SkuService extends IService {
+
+
+ List selectSkuBargain(PmsBargain pmsBargain);
+}
diff --git a/mall_modules/mall_client/src/main/java/com/mall/service/impl/BargainRecordServieimpl.java b/mall_modules/mall_client/src/main/java/com/mall/service/impl/BargainRecordServieimpl.java
new file mode 100644
index 0000000..fff1af7
--- /dev/null
+++ b/mall_modules/mall_client/src/main/java/com/mall/service/impl/BargainRecordServieimpl.java
@@ -0,0 +1,26 @@
+package com.mall.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.mall.domin.PmsBargainRecord;
+import com.mall.mapper.BargainRecordMapper;
+import com.mall.service.BargainRecordServie;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class BargainRecordServieimpl extends ServiceImpl
+ implements BargainRecordServie {
+
+
+
+
+
+ public List findByUserId(Long userId) {
+ LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
+ wrapper.eq(PmsBargainRecord::getUserId,userId);
+ List list = this.list(wrapper);
+ return list;
+ }
+}
diff --git a/mall_modules/mall_client/src/main/java/com/mall/service/impl/BargainServiceimpl.java b/mall_modules/mall_client/src/main/java/com/mall/service/impl/BargainServiceimpl.java
new file mode 100644
index 0000000..a2706ae
--- /dev/null
+++ b/mall_modules/mall_client/src/main/java/com/mall/service/impl/BargainServiceimpl.java
@@ -0,0 +1,118 @@
+package com.mall.service.impl;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.mall.common.result.Result;
+import com.mall.config.DesUtil;
+import com.mall.config.Snowflake;
+import com.mall.domin.PmsBargain;
+import com.mall.domin.PmsBargainRecord;
+import com.mall.domin.PmsSku;
+import com.mall.mapper.BargainMapper;
+import com.mall.service.BargainService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+
+@Service
+public class BargainServiceimpl extends ServiceImpl
+ implements BargainService {
+
+ @Autowired
+ private BargainMapper bargainMapper;
+
+
+ @Override
+ public Result> selectBargain() {
+ List bargainList = this.list();
+ return Result.success(bargainList);
+ }
+
+ @Override
+ public Result addBargain(PmsBargain pmsBargain) {
+ boolean save = this.save(pmsBargain);
+ return Result.success(save);
+ }
+
+ @Override
+ public Result updateBargain(PmsBargain pmsBargain) {
+ boolean update = this.updateById(pmsBargain);
+ return Result.success(update);
+ }
+
+ @Override
+ public Result deleteBargain(Integer bargainId) {
+ boolean b = this.removeById(bargainId);
+ return Result.success(b);
+ }
+
+ @Override
+ public List selectCut(PmsSku pmsSku) {
+ LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
+ queryWrapper.eq(PmsBargain::getId, pmsSku.getBargainId());
+ List bargainList = this.list();
+ return bargainList;
+ }
+
+
+ @Autowired
+ private RedisTemplate redisTemplate;
+
+ @Autowired
+ private BargainRecordServieimpl bargainRecordServieimpl;
+
+ public String initiateBargain(Long userId, Long productId) {
+ // 生成砍价订单
+ String orderNumber = generateOrderNumber(userId, productId);
+ // 生成砍价链接
+ String bargainLink = generateBargainLink(orderNumber);
+ // 将砍价订单信息存入Redis
+ redisTemplate.opsForValue().set(orderNumber, getBasePrice(productId));
+
+ return bargainLink;
+ }
+
+ public List getBargainRecords(Long userId) {
+ //从数据库或缓存中获取用户的砍价记录
+ return bargainRecordServieimpl.findByUserId(userId);
+ }
+
+ private String generateOrderNumber(Long userId, Long productId) {
+ // 生成唯一订单号,可以使用Snowflake算法
+ Snowflake snowflake = new Snowflake();
+ long nextId = snowflake.getNextId();
+
+ // 省略具体实现
+ return "202306090001";
+ }
+
+ private BigDecimal getBasePrice(Long productId) {
+ // 从数据库中获取商品底价
+ // 省略具体实现
+ return new BigDecimal("100");
+ }
+
+ private String generateBargainLink(String orderNumber) {
+ // 生成砍价链接,可以加入签名等安全机制
+ DesUtil desUtil = new DesUtil();
+ try {
+ String encryptStr = desUtil.encrypt("https://yourdomain.com/bargain/link?orderNumber","DEC");
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ return "https://yourdomain.com/bargain/link?orderNumber=" + orderNumber;
+ }
+
+
+
+
+
+
+
+}
diff --git a/mall_modules/mall_client/src/main/java/com/mall/service/impl/CategoryServiceimpl.java b/mall_modules/mall_client/src/main/java/com/mall/service/impl/CategoryServiceimpl.java
new file mode 100644
index 0000000..d17053e
--- /dev/null
+++ b/mall_modules/mall_client/src/main/java/com/mall/service/impl/CategoryServiceimpl.java
@@ -0,0 +1,50 @@
+package com.mall.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.mall.domin.PmsCategory;
+import com.mall.mapper.CategoryMapper;
+import com.mall.service.CategoryService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.stream.Collectors;
+@Service
+public class CategoryServiceimpl extends ServiceImpl
+ implements CategoryService {
+
+
+ public List listWithTree() {
+ // 1、一条sql 查询出所有分类商品列表
+ List entities = baseMapper.selectList(null);
+
+ List level1Menus = entities.stream().filter(pmsCategory ->
+ // 2、过滤出所有的 一级 类目
+ pmsCategory.getParentId() == 0
+ ).map((menu) -> {
+ // 3、递归找出所有的 子类目
+ menu.setChildren(getChildrens(menu, entities));
+ return menu;
+ }).sorted((menu1, menu2) -> {
+ // 4、将两个类目前后的排序之差作为排序规则
+ return (menu1.getSort() == null ? 0 : menu1.getSort()) - (menu2.getSort() == null ? 0 : menu2.getSort());
+ }).collect(Collectors.toList()); // 5、收集整理好的三级分类列表数据集合
+ return level1Menus;
+ }
+
+ private List getChildrens(PmsCategory currentMenu, List allMenus) {
+ List children = allMenus.stream().filter(pmsCategory -> {
+ // 父子关系:下一页的父分类id == 当前页的分类id
+ return pmsCategory.getParentId() == currentMenu.getId();
+ }).map(categoryEntity -> {
+ // 递归遍历是否还有下一级
+ categoryEntity.setChildren(getChildrens(categoryEntity, allMenus));
+ return categoryEntity;
+ }).sorted((menu1, menu2) -> {
+ return (menu1.getSort() == null ? 0 : menu1.getSort()) - (menu2.getSort() == null ? 0 : menu2.getSort());
+ }).collect(Collectors.toList());
+ return children;
+ }
+
+
+
+}
diff --git a/mall_modules/mall_client/src/main/java/com/mall/service/impl/SkuServiceImpl.java b/mall_modules/mall_client/src/main/java/com/mall/service/impl/SkuServiceImpl.java
new file mode 100644
index 0000000..63b596f
--- /dev/null
+++ b/mall_modules/mall_client/src/main/java/com/mall/service/impl/SkuServiceImpl.java
@@ -0,0 +1,27 @@
+package com.mall.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.mall.domin.PmsBargain;
+import com.mall.domin.PmsSku;
+import com.mall.mapper.PamSkuMapper;
+import com.mall.service.BargainService;
+import com.mall.service.SkuService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class SkuServiceImpl extends ServiceImpl
+ implements SkuService {
+ @Autowired
+ private BargainService bargainService;
+ @Override
+ public List selectSkuBargain(PmsBargain pmsBargain) {
+ LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
+ wrapper.eq(PmsSku::getBargainId, pmsBargain.getId());
+ List list = this.list(wrapper);
+ return list;
+ }
+}
diff --git a/mall_modules/mall_client/target/classes/bootstrap.yml b/mall_modules/mall_client/target/classes/bootstrap.yml
new file mode 100644
index 0000000..df7b88e
--- /dev/null
+++ b/mall_modules/mall_client/target/classes/bootstrap.yml
@@ -0,0 +1,29 @@
+# Tomcat
+server:
+ port: 9003
+# Spring
+spring:
+ main:
+ allow-circular-references: true
+ jackson:
+ date-format: yyyy-MM-dd HH:mm:ss
+ time-zone: GMT+8
+ application:
+ # 应用名称
+ name: czk-client
+ profiles:
+ # 环境配置
+ active: dev
+ cloud:
+ nacos:
+ discovery:
+ # 服务注册地址
+ server-addr: 42.192.106.69:8848
+ config:
+ # 配置中心地址
+ server-addr: 42.192.106.69:8848
+ # 配置文件格式
+ file-extension: yml
+ # 共享配置
+ shared-configs:
+ - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
\ No newline at end of file
diff --git a/mall_modules/mall_client/target/classes/com/mall/CllentApplication.class b/mall_modules/mall_client/target/classes/com/mall/CllentApplication.class
new file mode 100644
index 0000000000000000000000000000000000000000..f44539655b417761958410107534ba0c4f5049c4
GIT binary patch
literal 723
zcmZ`%O-~y!5Pc2_8^ZF@04ZNR^cHfcFI6u=NF`EF3#}TI9(wXFW-;~Jk=NVyZ}n8v
zLw`Vj6k@zZVkN>#J0riDc{6^Ve|LZW0(gs8J+!bCp&g@xWrocg@m+8&OwK>1H!|}K
z%g4$nf5NadJeo!5GVEuz;DykdPqdcCzn{;w%7jDv94!h9Mm$k26fPD9iEJ1~T=5Y6
zSiuXj@&5$$u~lQ+*ddZo{H`Vgy8UQ$igDcSs0wE$r2H
L9|z<^+e6?UZ7{hU
literal 0
HcmV?d00001
diff --git a/mall_modules/mall_client/target/classes/com/mall/config/DesUtil.class b/mall_modules/mall_client/target/classes/com/mall/config/DesUtil.class
new file mode 100644
index 0000000000000000000000000000000000000000..61451f719addaea17e2e0d48550699edbace110e
GIT binary patch
literal 5969
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
Id784Q@GcXttu`_)$Y0}djdU~?p
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
H&=