b&mc^^TnD{AQ$=4;mLhlRkby2=H zaX%d-^A$S$8R)QrUH=HB_xcset6^H5TBlVXOXF%i{0zJ_V&HN*RILn*>2#WnAVUN@ z(FNJ&v>y+gm~2CmQmfHTUb5}E7D$Iz1pMWtCB;RE!^8K7NNg-!$G5KCpbrz@jQkmLolCw?-jCXbte<0@lEWI7Uaf)ymbH9MGdQ zkgiYDs?-L=>hTUeo6vEMX8y%4i^YL_ip2(lA^DRnA{bZ_8HchkX0bS)606#4mpy&4 z-yV(i^~GMkD%O`M>f|E>17dY(h0d+c)~(TL`c?$-2>BHBMS@bS(r|c<0e%G#1!#0^ zB2y#rEGT~La+@%5#3fbPun5xA(?%FM86a+xYH?Ya&s$be24oi(c}snzg>JYUt{l4n zxz=dTHVX*|7amwmzN7%e3lWHy73@I|?JD$=@N1~oU`ugOc2-E0Z8_W8U$J7Zp5M>M zmhQHOU<@^8Rpp)LgNakTSJjc9c=5DUm6l U;gWh v??>j&RW6s ze{ZgxfjXLNXNcc?>A616*I1gi)lN-CwpM5BmRxea@DWtR^QuhHo*kr=2RpDo+>-;Y zcjrL@O9Kc;q-oXa%nTJ-@M^Y2uS2S4p7R}!g8W>U!|8Aer~MrNXA54!RtWJcLYK(> zQ~qBLs!OzXuf51?S7jbrd1|1!|Irn(%`0Q8ukMTWUp*9CIiB$8^|R~B6JK3dBZLCU z>ftC~pSX{UYazU=s-n+6`>Z0r|9_0VM%cL2C*1`#pm`Vp*J?j6s#jap_58`iwUTD` zBYx#wSDlHSxr+2p6m>Tw>q4Sc`-_U|i>!!aZkYW@(j>0shsUYvU9^WJ!Yd)?USL+% zAbfYf)qseq9#RB*F(}xIPzB0}T+n+8WEsh9na`_axyYmE6vw2LccHdk7 !J8 ztp#BO>1~Mt9Zw^Mal>Tsvox8dA#4Kmf%hojbc5?P irfn|OZ> z# 6u{jQIyprU{d_`7- zu2VacQX18wRUzLYOx#qHkbHc}u3&k+DsM7e+h1%i`p4yYIfs1)r`6S1GJN}GqhHxH z^bgU-f&8M)ll!0CaqO2z_kDLSPuyFSYjad=bmr8TxEgb~eou3Gadwu!t9e6xTh-90 zruaz5dY2=|Rk5~X?H$8g9^AC aWks z2Z77t9f1cCrz*tzDIs=`ViTH6TyWY|HPxP6ya_F^jNRTB-j%T`*!)IDq}a%vOg)Ru z5tMCVjzMhl!)qMM1%($2X#@AUdNOQHSeVIbfCt&?;jp8s%8O86Rj8`LTj{L;Xoaqd z!Zfj`D7g#`AyC=8w8mm+w0N^FXwljk+0Y1%QS8SQD#5ytHEk bf<7U$N`?!;7GTUUNgv#+)0pX)+$w5O`MeQS7NU5QjVR#`VxQ@gUdygU#o zc(85BwHr=IGe~sz!mjst{j+i3&-0r~8afG&$bHJ2#5 g9bs;r38{pd6bN= Gzi!t8fKEgj*eMt`}};c%6eH?_34wS@wuE{DTe#&;C?x|es9dbJKsDBRMx zaWvHIDQM6*wB8cZ8w+q5#`gzC1U6UJP>>OcFGS$+qS`UIYfRD-PPGhS?KGIp2-D~g zPq_f4j1Bg8E^2NhR0V72QEK=vqO=$)rUbzNyj+R|AS3~qKMKKlrS`{n?j&UH*a2jw z*_=*W0J*?OM{`qo!0vF^1OCS5j!3ArbS!Ul_3-e(lXc!~qxF}&(v4{u&YWEr;jp!x znqvE;!&x2(HHAA`8Y;>NqoqH}`qJ&U^E
vDh ;!*djF2K@>uUi)jC;TnYfE@S(*4AZ%_1bYvNDhcpN%oYVLdN zWyIEGmfRbFaZ`zH3Q5u405g27sVTYX;~V6I^eGhB51BtiP9_UqYv}@4jj&z##>KT# znUdSLd$=lN{bj2Qv(*-rk(+h$z#49bUKxz*A(JkA3~8l2zUWD+;V`5bZ5mi?%ak%S zDouv!82oxOGaJ}3*@_oXRQxhM!m(MB%A!$C+VR#uNbWKd*O{5_G6zQ{%3v{1;#$Wx zrfK2N=tS&_py{SQk+E9Xr(PplRa|t(Rg)%rwoausqr-DOiCd7MqBCTfFtv1a*887! z_P-2U#{c#C{$GP`7(e0GBS$uDSc%QDN3K0`;;JiS2M P_VYDqNFH4H~B((j_%?Y(vihVX>wBJDH*sxeRI5ttA$U4& LbebO|J4Xh6$u2%Xj>*M)smDJ4)(!;2;4fofxHt7t` z1{OlQKDi$Ee}Ln&EK~Y2vq@ja{XgS%+~=7|x*P5AjT}5Hk)qg-v=Q~f;vA4xFc0rx z8tHOeuZO+tfXzFEOy5dTUMAmyy10)vN;{nS9k_O*-63Wa&w7{^aA>7!92Gb`EEli_ z_!$ 1CStj)(S7Xc;=HxrsglKmods(^>bywnyxj}A| z?2bssaD5Et&*S`g+((>W`jAZlm&fHY9OJlWPM+7}*=tyr*H9maY6Z@J#+>fO`CiPG z`n?yp{{aigUq+dZf5v>TCvG=$S-%-4aKf_;^^5Oezk#3cqgxYA9 zZ l%rH3 C*8s zw>#3^KhVFl*G+%AmZ31z-PyNv+2Uor!|u*yl>ztSp{{|hwOc2qCi{j~PE20Db8KHt zWp#CR3w@8RW&Tk`^4a_ick;%XiGBOG?VfUrM)Ob4Rd;tzOifShb9YVb-!?h5c=y!g zVH#}5 X_9<1EHxpI8>uI-!0D>sYhboJB&k3RUz*(YB5@gI{zz+2wU_Tb}c``9+P z!duxi;+W%zrMdANVcp_OUj6uzS1+yya7Cpqe6>rtGlUwQ$nG!2oy9nM*)ZyLqEv~U z3vS#SLhS(@Yti=va#NG2J;YX`JjpI+JJ}dUu0ic;@!Nti2SojrOSG!Epxwp&x-Y1) z2IK6*hvT+kmQ#S|+(;L K zN08Xj;8ht4$mo$!OJ|R;Q+SmxlV`E}@ohCDvK407!Y86nX(Z9)|Q8y+2|Dx+NjR9)a9Z941hj+A@mS1T=W z{_5$KUbr71bYkA4?(UP`F vCs3}N_$=5Zfdq4E6G7B)&J zqVq-`GU#QHhs*03F85T#GXgV`)E(bE)>RSD3}6CocRZtWfaZmQH!>X0q^p&<%EVPg zJPX}q3zWElfpLHx&*~g?pB#0^vw*aUcy?fLC_1Cs+%@crXH0kxRm6>f!4=WLRmx45 z2lvh5z9}%nvO8BtXR@<9<9sX<&+-$MgPI~U8T2O;f8yMRm5_^;M`wuifvm_$tS^Sm zEcbZPEL8?I&~s`6=Aoy IhFH88{JYy+O@ zY!A%Hban)0RCLY>%&6(?49sZg> 6{yw(a||CFq1~-vH-B4;61Jx1%|!u$~Ye( z2C0abFL-F1f4En9=wI-#c>du& h4~d=e))jQjrq~pgZa_95c8w67xSaD z5A&mQ5#~qdV$6@uC72(bOEEt>2LkR^!9EoMpw%?$?!?-T5-p7391jq!RtDk~{&)qr zunG*&3rf8t8+ykYy(B~bZVixOMZ7w-v@_|tZlbh!Rr!pXTf3u>f3%7<3()gPb!r3d zdI5P5y(#^4Uo0FTb1n%j-DkE(gih&d_cqSdax2ZX4*0+XF4<-jOfuG35w8za+FL8) z4gXnH5cD{zhp l)pa_87)h&ZWp%!TskFyz98ZN>l^q`tRj ztkLDg2tAl5PGS`FcZop&2nk{pga;Nw4T6K-xBwFLIEKbW0toztULy&5ZY&T>a|#!3 zK%g#8;= it8Xm-0mK4FAYko*qVAKCZk|F&W56u?pEk-f?iT?qSN`Mh-->) z)sIK>W`eSa7gOFSGAClS0B=RSEj60JesZ}+$(Fcq%Bdx8hy17{EcV2WozdkkXi|6U zaOF%Tw}5Xu&U?DjwfwxN;q#uR+Ai$x!WN4H@kal`3aLh^0V9EUlm8?pL^O61oc>9$ zVL>b7l>o6*Oqs~ISi$^QT#+j z;hW@GtGChRSwJtI;Ut{h5WtQ86jpk0)#Ufknh{=-vzbRhFHm4r*d8_sINV$ruLGC& zeZu{IbjK~`cs=S21mYo_1__JZK)1UG$~T3r#Q`Gd_#n`{B=8VpT_`L?fm2~w;2|#V zEJs1ySwVHW@n|L0p~5PvLxmx#Lxt6Whan9Yp|l1iE=rdL9_GruC`!t`VXDWe-dd_B zO6#beD6OY@qBKHdcB0w_8j}heX-q1N(wI~jqdGk(Y@#|;7^gZ^*i3b(Fd^WIptME6 zMWsmr7nQaOxTv&Ez(u9)0xl};5O7gxr+|w}yMW{7`30O3SMhc{*sT;hP~1aEr)u#q zuJ%ILqDXc2DMhNYU(}%oRA(BETjqPcTwIA32b3bUIH(k<`XThwqI4Nkid5mSQltt; zP`7oyzoX(x^mm0)r0U0%B2~W FNpHrx1|}Uq22L7*!~5amvGt8Y#W}aXxn text { + color: #666; + } + .unit { + font-size: $font-size-tag; + margin-right: 4rpx; + } + .money { + font-size: $font-size-base; + } + .img-wrap { + width: 83rpx; + height: 34rpx; + font-size: $font-size-goods-tag; + border-radius: 6rpx; + display: inline-block; + vertical-align: text-top; + margin-right: 10rpx; + image { + width: 100%; + height: 100%; + } + } + } + .sku-name-wrap, + .introduction { + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + // -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + } + .sku-name-wrap { + font-weight: bold; + font-size: $font-size-toolbar; + line-height: 1.6; + } + .introduction { + margin: $margin-updown 0; + font-size: $font-size-base; + } + + .logistics-wrap { + display: flex; + margin-top: 20rpx; + text { + flex: 1; + font-size: $font-size-tag; + color: $color-tip; + text-align: center; + &:last-of-type { + text-align: right; + } + &:first-of-type { + text-align: left; + } + } + } + } + + .market-price-wrap { + margin-left: 20rpx; + color: $color-tip; + text-decoration: line-through; + display: inline-block; + vertical-align: sub; + line-height: initial; + .unit { + margin-right: 4rpx; + font-size: $font-size-tag; + } + .money { + font-size: $font-size-base; + } + } +} + +.follow-and-share { + position: absolute; + right: 0; + top: 50%; + transform: translateY(-50%); + .iconfont { + font-weight: bold; + margin-right: 30rpx; + font-size: $font-size-toolbar; + vertical-align: middle; + line-height: 1; + &:first-child { + font-size: 36rpx; + // color: #28C445; + // font-weight: normal; + } + &:last-child { + margin-right: 0; + } + } + .fenxiao { + display: block; + position: absolute; + font-size: $font-size-tag; + font-weight: bold; + width: 140%; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + left: -80rpx; + text-align: right; + } +} + +.goods-cell { + display: flex; + padding: 20rpx 0; + align-items: center; + background: #fff; + line-height: 40rpx; + justify-content: space-between; + + .tit { + color: $color-tip; + font-size: $font-size-base; + margin-right: 20rpx; + width: 70rpx; + } + + .box { + width: 90%; + font-size: $font-size-base; + line-height: inherit; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } +} + +.goods-evaluate { + padding: 20rpx 0; + background: #fff; + + .tit { + display: flex; + align-items: center; + font-size: $font-size-tag; + &.active { + padding-bottom: 20rpx; + border-bottom: 1rpx solid $color-line; + } + + view { + flex: 1; + line-height: 40rpx; + text-align: left; + } + } + + .evaluate-item { + padding: 30rpx 0 0; + .evaluator { + display: flex; + align-items: center; + justify-content: space-between; + .evaluator-info { + display: flex; + align-items: center; + } + .evaluator-face { + width: 80rpx; + height: 80rpx; + border-radius: 50%; + overflow: hidden; + + image { + width: 100%; + height: 100%; + border-radius: 50%; + } + } + .evaluator-name-wrap { + margin-left: 20rpx; + line-height: 1; + } + .evaluator-name { + display: block; + width: 230rpx; + font-size: $font-size-base; + white-space: nowrap; + } + .time { + font-size: $font-size-goods-tag; + } + } + + .cont { + text-align: justify; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + -webkit-box-pack: center; + overflow: hidden; + word-break: break-all; + font-size: $font-size-tag; + } + + .evaluate-img { + display: inline-flex; + margin-top: 20rpx; + + .img-box { + width: 100rpx; + height: 100rpx; + overflow: hidden; + margin: 0 20rpx 20rpx 0; + border-radius: $border-radius; + + image { + width: 100%; + height: 100%; + } + } + } + } + .evaluate-item-empty { + float: right; + color: $color-tip; + text:first-child { + margin-right: 30rpx; + } + .iconfont { + margin-top: 2rpx; + } + } +} + +.goods-action-button { + flex: 1; + margin-left: 20rpx; +} +.goods-action-button:last-child { + margin-right: 20rpx; +} + +// 商家服务 +.goods-merchants-service-popup-layer { + height: 660rpx; + scroll-view { + position: absolute; + left: 0; + right: 0; + height: 65%; + .item { + padding: 0 30rpx; + border-bottom: 2rpx solid $color-line; + display: flex; + align-items: center; + &:last-child { + border-bottom: none; + } + .item-icon { + height: 100%; + display: flex; + align-items: flex-start; + padding-top: 4rpx; + box-sizing: border-box; + width: 60rpx; + &.empty-desc { + padding-top: 0; + align-items: center; + .icon-img { + margin-top: 0 !important; + } + .icon-box { + margin-top: 0 !important; + } + } + } + .iconfont { + display: inline-block; + margin-right: 20rpx; + font-size: 40rpx; + vertical-align: top; + height: 50rpx; + line-height: 50rpx; + } + .icon-img { + width: 35rpx; + height: 35rpx; + margin-right: 20rpx; + margin-top: 12rpx; + } + .icon-box { + width: 48rpx; + height: 48rpx; + text-align: center; + display: flex; + margin-right: 20rpx; + line-height: 1; + margin-top: 0; + font-size: 36rpx; + padding: 2rpx; + } + .info-wrap { + display: inline-block; + vertical-align: middle; + width: 90%; + + .title { + display: block; + font-size: $font-size-base; + } + .describe { + font-size: $font-size-tag; + color: $color-tip; + display: block; + padding-bottom: 10rpx; + line-height: 1.5; + } + } + &.empty-desc { + height: 100rpx; + .iconfont { + vertical-align: middle; + } + } + } + } +} + +// 门店列表 +.store-list-wrap { + scroll-view { + position: absolute; + left: 0; + right: 0; + height: 80%; + } + .store-list-content { + width: 100%; + background: #ffffff; + border-radius: 20rpx; + box-sizing: border-box; + overflow: hidden; + + .list-item { + width: 100%; + padding: 35rpx 24rpx; + box-sizing: border-box; + + .item-box { + width: 100%; + height: 100%; + display: flex; + background: #ffffff; + align-items: center; + + .item-image { + width: 88rpx; + height: 88rpx; + border-radius: 50%; + align-self: start; + + image { + width: 88rpx; + height: 88rpx; + border-radius: 50%; + } + } + + .item-info { + width: 520rpx; + height: 100%; + padding-left: 20rpx; + box-sizing: border-box; + display: flex; + flex-direction: column; + margin-right: 24rpx; + font-size: $font-size-tag; + + .item-title { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 10rpx; + + .title { + max-width: 240rpx; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-size: $font-size-base; + color: $color-title; + } + + .distance { + font-size: $font-size-activity-tag; + } + } + + .item-time { + font-size: $font-size-activity-tag; + color: $color-tip; + margin-bottom: 10rpx; + } + + .item-address { + font-size: $font-size-tag; + color: $color-title; + line-height: 42rpx; + + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; + } + } + + .item-right { + flex-grow: 1; + height: 100%; + display: flex; + justify-content: center; + align-items: center; + + .iconfont { + color: #acacac; + } + } + } + } + } +} + +// 商品属性 +.goods-attribute-popup-layer { + height: 660rpx; + + .goods-attribute-body { + position: absolute; + left: 0; + right: 0; + height: 60%; + .item { + padding: $padding 0; + margin: 0 30rpx; + border-bottom: 2rpx solid $color-line; + .attr-name { + color: $color-tip; + display: inline-block; + width: 150rpx; + overflow: hidden; + vertical-align: text-top; + } + .value-name { + margin-left: 20rpx; + vertical-align: text-top; + } + &:last-child { + border-bottom: none; + } + } + } +} + +.goods-attr { + margin: 0 24rpx 20rpx; + background-color: #fff; + border-radius: 16rpx; + overflow: hidden; + + .title { + height: 70rpx; + color: $color-sub; + line-height: 70rpx; + box-sizing: border-box; + font-size: 32rpx; + margin: 0 20rpx; + } + + .attr-action { + text-align: center; + line-height: 70rpx; + font-size: 24rpx; + } + + .attr-wrap { + margin: 20rpx; + border: 2rpx solid #f1f1f1; + border-radius: 16rpx; + overflow: hidden; + + .item { + display: flex; + border-bottom: 2rpx solid #f1f1f1; + + &:last-child { + border-bottom: 0; + } + + .attr-name { + width: 180rpx; + padding: 16rpx 20rpx; + background-color: #fbfafa; + white-space: pre-wrap; + border-right: 2rpx solid #f1f1f1; + line-height: 1.3; + font-size: 26rpx; + } + + .value-name { + padding: 10rpx 20rpx; + white-space: pre-wrap; + line-height: 1.5; + font-size: 26rpx; + flex: 1; + width: 0; + } + } + } +} + +// 详情 +.goods-detail-tab { + margin: 0 24rpx 20rpx; + background-color: #fff; + border-radius: 16rpx; + overflow: hidden; + .detail-tab { + display: flex; + align-items: center; + margin-top: 10rpx; + // width: 100%; + // display: flex; + // justify-content: center; + // align-items: center; + .tab-item { + height: 70rpx; + color: $color-sub; + line-height: 70rpx; + box-sizing: border-box; + font-size: 32rpx; + margin: 0 20rpx; + } + .tab-item.active { + // position: relative; + } + .tab-item.active::after { + // content: ''; + // display: inline-block; + // width: 100%; + // height: 4rpx; + // position: absolute; + // left: 0; + // bottom: 0; + // border-radius: 3rpx; + } + .tab-item:nth-child(1) { + // margin-right: 25%; + } + } + .detail-content { + border-radius: 30rpx; + width: 100%; + overflow: hidden; + } + .goods-details { + padding: 10rpx $padding $padding; + margin-bottom: 100rpx; + overflow: hidden; + * { + max-width: 100% !important; + } + } + .goods-details.active { + min-height: 150rpx; + width: 100%; + display: flex; + justify-content: center; + align-items: center; + color: $color-tip; + } +} + +// 海报 +// .uni-popup__wrapper-box +.poster-layer { + .generate-poster { + padding: 40rpx 0; + .iconfont { + font-size: 80rpx; + color: #07c160; + line-height: initial; + } + > view { + text-align: center; + &:last-child { + margin-top: 20rpx; + } + } + } + .image-wrap { + width: 64%; + height: 854rpx; + margin: 60rpx auto 40rpx auto; + box-shadow: 0 0 32rpx rgba(100, 100, 100, 0.3); + image { + width: 480rpx; + height: 854rpx; + } + } + .msg { + padding: 40rpx; + } + .save { + text-align: center; + height: 80rpx; + line-height: 80rpx; + } + .close { + position: absolute; + top: 0; + right: 20rpx; + width: 40rpx; + height: 80rpx; + font-size: 50rpx; + } +} + +.share-popup, +.uni-popup__wrapper-box { + .share-title { + line-height: 60rpx; + font-size: $font-size-toolbar; + padding: 15rpx 0; + text-align: center; + } + + .share-content { + display: flex; + display: -webkit-flex; + -webkit-flex-wrap: wrap; + -moz-flex-wrap: wrap; + -ms-flex-wrap: wrap; + -o-flex-wrap: wrap; + flex-wrap: wrap; + padding: 80rpx 15rpx; + + .share-box { + flex: 1; + text-align: center; + + .share-btn { + margin: 0; + padding: 0; + border: none; + line-height: 1; + height: auto; + text { + margin-top: 20rpx; + font-size: $font-size-tag; + display: block; + color: $color-title; + } + } + + .iconfont { + font-size: 80rpx; + line-height: initial; + } + .icon-fuzhilianjie, + .icon-pengyouquan, + .icon-haowuquan, + .icon-share-friend { + color: #07c160; + } + } + } + + .share-footer { + height: 90rpx; + line-height: 90rpx; + border-top: 2rpx solid $color-line; + text-align: center; + } +} + +.newdetail { + padding: 0 30rpx; + background: #ffffff; + margin: 0 24rpx; + border-radius: 16rpx; + .item { + height: 74rpx; + display: flex; + align-items: center; + // border-bottom: 1rpx solid $color-line; + .label { + width: 70rpx; + color: $color-tip; + font-size: $font-size-base; + margin-right: 20rpx; + } + &:last-child { + border-bottom: none; + } + &.free { + .free-tip { + border: 0 solid; + padding: 2rpx 14rpx; + border-radius: $border-radius; + margin-right: 10rpx; + font-size: $font-size-tag; + font-weight: bold; + color: var(--main-color); + background-color: var(--main-color-shallow); + } + .value { + display: inline-block; + width: 70%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + } + &.service { + .list-wrap { + margin-right: 20rpx; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + flex: 1; + display: flex; + .item-wrap { + display: inline; + font-size: $font-size-base; + margin-right: 20rpx; + &:last-child { + margin-right: 0; + } + .item-wrap-box { + display: flex; + align-items: center; + font-size: 26rpx; + .item-wrap-icon { + display: flex; + align-items: center; + font-size: 34rpx; + padding: 2rpx; + } + .icon-dui { + font-size: $font-size-base; + margin-right: 6rpx; + line-height: 30rpx; + color: $base-color; + } + .icon-img { + width: 28rpx; + height: 28rpx; + margin-right: 6rpx; + } + .icon-box { + width: 32rpx; + height: 32rpx; + text-align: center; + display: flex; + margin-right: 6rpx; + line-height: 1; + padding: 2rpx; + } + } + } + } + } + + &.selected-sku-spec { + .box { + flex: 1; + margin-right: 60rpx; + width: 80%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + text { + margin-right: 10rpx; + &:last-child { + margin-right: 0; + } + } + } + } + + &.delivery-type { + .box { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + + text { + padding-right: 30rpx; + position: relative; + + &:after { + content: ' '; + width: 6rpx; + height: 6rpx; + border-radius: 50%; + background: #000; + position: absolute; + top: 50%; + right: 0; + transform: translate(-12rpx, -50%); + } + + &:last-child:after { + content: ''; + display: none; + } + } + } + } + + &.goods-attribute { + .box { + flex: 1; + margin-right: 60rpx; + width: 80%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + text { + margin-right: 20rpx; + &:last-child { + margin-right: 0; + } + } + } + } + + &.store-wrap { + height: auto; + .list-wrap { + padding: 10rpx 0 16rpx; + } + .name-wrap { + display: flex; + align-items: center; + line-height: 1; + .icondiy { + font-weight: bold; + font-size: $font-size-base; + } + .name { + margin-left: 2rpx; + font-size: $font-size-tag; + } + } + .other-wrap { + display: flex; + align-items: center; + font-size: $font-size-tag; + line-height: 1; + margin-top: 12rpx; + .decorate { + position: relative; + top: -8rpx; + margin: 0 10rpx; + } + .address { + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + max-width: 400rpx; + line-height: 1; + font-size: $font-size-tag; + } + } + } + + .img-wrap { + width: 38rpx; + height: 38rpx; + position: absolute; + right: 30rpx; + image { + width: 100%; + height: 100%; + } + } + } +} + +.popup-layer { + background: #fff; + .head-wrap { + font-size: $font-size-toolbar; + line-height: 100rpx; + height: 100rpx; + display: block; + text-align: center; + .iconfont { + position: absolute; + float: right; + right: 44rpx; + font-size: $font-size-toolbar; + } + } + .button-box { + width: 100%; + position: absolute; + bottom: 0; + z-index: 1; + margin-bottom: 30rpx; + button { + height: 80rpx; + background-color: var(--goods-btn-color); + } + } +} + +.deliverytype-popup-layer { + .type-body { + padding: 30rpx; + box-sizing: border-box; + } + + .type-item { + display: flex; + margin-bottom: 40rpx; + + .iconfont { + margin-right: 30rpx; + color: $base-color; + } + + .title { + font-weight: bold; + margin-bottom: 20rpx; + } + .desc { + font-size: 24rpx; + } + + &.not-support { + .title, + .desc, + .iconfont { + color: #aaa; + } + } + } +} + +.icon-right { + color: $color-tip; + font-size: $font-size-base; + position: absolute; + right: 30rpx; +} + +.promotion-tag { + color: #fff; + font-size: $font-size-activity-tag; + border-top-left-radius: 30rpx; + border-bottom-left-radius: 30rpx; + padding: 4rpx 10rpx; + margin-right: 10rpx; + vertical-align: middle; + background-color: var(--promotion-tag); + display: none; +} + +//社群 +.detail-community { + background: #fff; + padding: 30rpx; + margin-bottom: 20rpx; + display: flex; + align-items: center; + justify-content: space-between; + + .community-box { + display: flex; + align-items: center; + + image { + width: 70rpx; + height: 70rpx; + border-radius: 10rpx; + margin-right: 20rpx; + } + .community-title { + font-family: PingFang-SC-Medium; + font-size: 28rpx; + // line-height: 36rpx; + color: #303133; + } + .community-txt { + font-family: PingFang-SC-Medium; + font-size: 24rpx; + color: #909399; + width: 450rpx; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + } + .community-btn { + width: 100rpx; + height: 50rpx; + line-height: 50rpx; + background-color: #03bd04; + border-radius: 10rpx; + text-align: center; + font-family: PingFang-SC-Medium; + font-size: 24rpx; + color: #ffffff; + } +} + +.community-model { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100vh; + background: rgba(0, 0, 0, 0.4); + z-index: 9999; + + .community-model-content { + width: 500rpx; + height: 600rpx; + background-color: #ffffff; + border-radius: 10rpx; + margin: 35% auto 0; + position: relative; + overflow: hidden; + + .community-model-content-radius { + width: 600rpx; + height: 240rpx; + border-radius: 100%; + background: $base-color; + position: absolute; + left: -50rpx; + top: -60rpx; + + view { + margin-top: 120rpx; + text-align: center; + font-family: PingFang-SC-Bold; + font-size: 30rpx; + color: #ffffff; + } + } + + .community-model-content-draw { + width: 260rpx; + height: 260rpx; + margin: 214rpx auto 0; + + image { + width: 100%; + height: 100%; + } + } + .community-model-content-text { + font-family: PingFang-SC-Medium; + font-size: 24rpx; + color: #909399; + text-align: center; + margin-top: 20rpx; + } + } + .community-model-close { + width: 56rpx; + height: 56rpx; + border: 2rpx solid #fff; + border-radius: 50%; + margin: 50rpx auto 0; + text-align: center; + color: #fff; + } +} +.to-top { + position: fixed; + right: 50rpx; + bottom: 200rpx; + background-color: rgba(0, 0, 0, 0.5); + border-radius: 50%; + display: flex; + width: 80rpx; + height: 80rpx; + align-items: center; + justify-content: center; + z-index: 90; + color: #fff; +} + +// 活动步骤 +.diy-process-step { + padding: 30rpx 30rpx; + background-color: #fff; + margin-top: 20rpx; + border-radius: 16rpx; + margin: 0 24rpx 20rpx; + .goods-img-content { + font-size: 32rpx; + font-weight: 800; + color: $color-title; + line-height: 36rpx; + margin-right: 14rpx; + text-align: left; + margin-top: 20rpx; + } + .process-step-box { + display: flex; + flex-direction: column; + margin-top: 30rpx; + .process-step-item { + display: flex; + align-items: center; + .process-step-icon { + background-color: $base-color; + color: #fff; + width: 90rpx; + height: 90rpx; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + margin-right: 20rpx; + line-height: 1; + .iconfont { + font-size: 48rpx; + } + } + .process-step-content { + view { + font-size: 30rpx; + &:last-child { + color: #999; + font-size: 24rpx; + margin-top: 10rpx; + } + } + } + } + .process-step-line { + width: 100%; + height: 60rpx; + display: flex; + align-items: center; + view { + width: 60rpx; + height: 50rpx; + border-left: 4rpx dotted $base-color; + margin-left: 45rpx; + border-left-image-width: 4rpx; + } + } + } +} + +// 卡项套餐 +.card-info { + padding-bottom: 30rpx; + .card-title { + padding: 20rpx 0 10rpx; + text-align: center; + font-weight: bold; + } + .card-desc { + padding-left: 10rpx; + margin-bottom: 20rpx; + font-size: $font-size-tag; + color: $color-sub; + } + .card-content { + overflow: hidden; + } + .card-item { + margin-bottom: 28rpx; + display: flex; + padding: 20rpx; + background-color: #fbf9fc; + border-radius: 12rpx; + &:last-of-type { + margin-bottom: 0; + } + image { + overflow: hidden; + margin-right: 24rpx; + width: 160rpx; + height: 160rpx; + border-radius: 10rpx; + } + .content { + position: relative; + flex: 1; + .name { + padding-right: 30rpx; + } + .price { + font-size: $font-size-tag; + color: $color-sub; + } + .num { + position: absolute; + top: 10rpx; + right: 4rpx; + font-size: $font-size-tag; + } + } + } + .card-off { + display: flex; + justify-content: center; + align-items: center; + margin-top: 20rpx; + line-height: 1; + text { + font-size: $font-size-tag; + &:last-of-type { + margin-left: 6rpx; + font-size: $font-size-tag; + } + } + } +} diff --git a/common/css/icon/extend.css b/common/css/icon/extend.css new file mode 100644 index 0000000..e69de29 diff --git a/common/css/icondiy.css b/common/css/icondiy.css new file mode 100644 index 0000000..4529450 --- /dev/null +++ b/common/css/icondiy.css @@ -0,0 +1,5472 @@ +@font-face { + font-family: "icondiy"; + src: url('https://cdn3.codesign.qq.com/icons/MQmlyZwl3GjWRA1/latest/iconfont.eot?t=e6a9e2bd200c98b07a86d8f4f51b5aa1'); /* IE9 */ + src: url('https://cdn3.codesign.qq.com/icons/MQmlyZwl3GjWRA1/latest/iconfont.eot?t=e6a9e2bd200c98b07a86d8f4f51b5aa1#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('https://cdn3.codesign.qq.com/icons/MQmlyZwl3GjWRA1/latest/iconfont.woff?t=e6a9e2bd200c98b07a86d8f4f51b5aa1') format('woff2'), + url('https://cdn3.codesign.qq.com/icons/MQmlyZwl3GjWRA1/latest/iconfont.woff?t=e6a9e2bd200c98b07a86d8f4f51b5aa1') format('woff'), /* chrome、firefox */ + url('https://cdn3.codesign.qq.com/icons/MQmlyZwl3GjWRA1/latest/iconfont.ttf?t=e6a9e2bd200c98b07a86d8f4f51b5aa1') format('truetype'), /* chrome、firefox、opera、Safari, Android, iOS 4.2+*/ + url('https://cdn3.codesign.qq.com/icons/MQmlyZwl3GjWRA1/latest/iconfont.svg?t=e6a9e2bd200c98b07a86d8f4f51b5aa1#icondiy') format('svg'); /* iOS 4.1- */ +} + +.icondiy { + font-family: "icondiy" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-system-daifahuo:before { + content: "\e00c"; +} +.icon-system-daifukuan:before { + content: "\e00d"; +} +.icon-system-daipingjie:before { + content: "\e010"; +} +.icon-system-shuhou:before { + content: "\e011"; +} +.icon-system-daishouhuo:before { + content: "\e012"; +} +.icon-system-home:before { + content: "\e015"; +} +.icon-system-my-selected:before { + content: "\e016"; +} +.icon-system-category:before { + content: "\e017"; +} +.icon-system-cart-selected:before { + content: "\e019"; +} +.icon-system-home-selected:before { + content: "\e01a"; +} +.icon-system-cart:before { + content: "\e01b"; +} +.icon-system-category-selected:before { + content: "\e01c"; +} +.icon-system-bargain-one:before { + content: "\e01d"; +} +.icon-system-search:before { + content: "\e01f"; +} +.icon-system-video:before { + content: "\e020"; +} +.icon-system-img-one:before { + content: "\e022"; +} +.icon-system-weizhi:before { + content: "\e023"; +} +.icon-system-yushou:before { + content: "\e024"; +} +.icon-system-fanlibaojia:before { + content: "\e025"; +} +.icon-system-tuwendaohang:before { + content: "\e026"; +} +.icon-system-youhuiquan:before { + content: "\e027"; +} +.icon-system-menu:before { + content: "\e028"; +} +.icon-system-live-one:before { + content: "\e029"; +} +.icon-system-mofang:before { + content: "\e02a"; +} +.icon-system-booking-management:before { + content: "\e02b"; +} +.icon-system-category-one:before { + content: "\e02c"; +} +.icon-system-agent:before { + content: "\e02d"; +} +.icon-system-fans-management:before { + content: "\e02e"; +} +.icon-system-edit:before { + content: "\e02f"; +} +.icon-system-cart-one:before { + content: "\e030"; +} +.icon-system-miaosha:before { + content: "\e031"; +} +.icon-system-qrcode:before { + content: "\e032"; +} +.icon-system-many-goods:before { + content: "\e033"; +} +.icon-system-manual-choose:before { + content: "\e034"; +} +.icon-system-servicer:before { + content: "\e035"; +} +.icon-system-share:before { + content: "\e036"; +} +.icon-system-download:before { + content: "\e037"; +} +.icon-system-piliangfahuo:before { + content: "\e038"; +} +.icon-system-exclusive-sales:before { + content: "\e039"; +} +.icon-system-quick-reply-set:before { + content: "\e03a"; +} +.icon-system-jiaoyi:before { + content: "\e03b"; +} +.icon-system-pintuan:before { + content: "\e03c"; +} +.icon-system-compass:before { + content: "\e03d"; +} +.icon-system-financial-management:before { + content: "\e03e"; +} +.icon-system-service-project:before { + content: "\e03f"; +} +.icon-system-notice:before { + content: "\e040"; +} +.icon-system-inventory-center:before { + content: "\e041"; +} +.icon-system-customer-service:before { + content: "\e042"; +} +.icon-system-gift:before { + content: "\e043"; +} +.icon-system-fast-delivery:before { + content: "\e044"; +} +.icon-system-picture:before { + content: "\e045"; +} +.icon-system-countdown:before { + content: "\e046"; +} +.icon-system-datab-oard:before { + content: "\e047"; +} +.icon-system-withdrawal:before { + content: "\e048"; +} +.icon-system-everybody:before { + content: "\e049"; +} +.icon-system-zhifupeizhi:before { + content: "\e04a"; +} +.icon-system-asset-management:before { + content: "\e04b"; +} +.icon-system-applet:before { + content: "\e04c"; +} +.icon-system-enterprise-set:before { + content: "\e04d"; +} +.icon-system-deal-set:before { + content: "\e04e"; +} +.icon-system-customer-stat:before { + content: "\e04f"; +} +.icon-system-set:before { + content: "\e050"; +} +.icon-system-shop:before { + content: "\e058"; +} +.icon-system-daifukuan2:before { + content: "\e059"; +} +.icon-system-shuhou2:before { + content: "\e05a"; +} +.icon-system-daifahuo2:before { + content: "\e05b"; +} +.icon-system-daipingjie2:before { + content: "\e05c"; +} +.icon-system-daishouhuo2:before { + content: "\e05d"; +} +.icon-system-huangguan:before { + content: "\e05e"; +} +.icon-system-tuijian:before { + content: "\e060"; +} +.icon-system-erweima:before { + content: "\e069"; +} +.icon-system-my:before { + content: "\e06a"; +} +.icon-system-liwu:before { + content: "\e06b"; +} +.icon-system-coupon:before { + content: "\e06c"; +} +.icon-system-bargain:before { + content: "\e06d"; +} +.icon-system-miaosha-time:before { + content: "\e06e"; +} +.icon-system-fenxiao-center:before { + content: "\e06f"; +} +.icon-system-firend-coupon:before { + content: "\e070"; +} +.icon-system-liebian-red-envelope:before { + content: "\e071"; +} +.icon-system-pinqiufanli:before { + content: "\e072"; +} +.icon-system-gift-card:before { + content: "\e073"; +} +.icon-system-my-bargain:before { + content: "\e074"; +} +.icon-system-my-pintuan:before { + content: "\e075"; +} +.icon-system-my-footprint:before { + content: "\e076"; +} +.icon-system-idcard:before { + content: "\e077"; +} +.icon-system-my-focus:before { + content: "\e078"; +} +.icon-system-account-list:before { + content: "\e079"; +} +.icon-system-check-station:before { + content: "\e07a"; +} +.icon-system-my-presale:before { + content: "\e07b"; +} +.icon-system-delivery-address:before { + content: "\e07c"; +} +.icon-system-blind-box:before { + content: "\e07d"; +} +.icon-system-member-recommend:before { + content: "\e07e"; +} +.icon-system-signin:before { + content: "\e07f"; +} +.icon-system-seckill-time:before { + content: "\e082"; +} +.icon-system-help:before { + content: "\e083"; +} +.icon-system-pintuan-nav:before { + content: "\e084"; +} +.icon-system-get-coupon:before { + content: "\e085"; +} +.icon-system-groupbuy-nav:before { + content: "\e086"; +} +.icon-system-topic-nav:before { + content: "\e087"; +} +.icon-system-notice-nav:before { + content: "\e088"; +} +.icon-system-point-nav:before { + content: "\e089"; +} +.icon-system-bargain-nav:before { + content: "\e08a"; +} +.icon-system-live-nav:before { + content: "\e08b"; +} +.icon-emoji-chijing:before { + content: "\e0a3"; +} +.icon-emoji-bao:before { + content: "\e0a4"; +} +.icon-emoji-zhawen:before { + content: "\e0a6"; +} +.icon-emoji-kaixin:before { + content: "\e0a7"; +} +.icon-emoji-jingbao:before { + content: "\e0a8"; +} +.icon-emoji-kaixin1:before { + content: "\e0a9"; +} +.icon-emoji-chihuan:before { + content: "\e0ac"; +} +.icon-emoji-qifen:before { + content: "\e0ad"; +} +.icon-emoji-mamu:before { + content: "\e0ae"; +} +.icon-emoji-bishi:before { + content: "\e0af"; +} +.icon-emoji-zhouma:before { + content: "\e0b0"; +} +.icon-emoji-ganga:before { + content: "\e0b1"; +} +.icon-emoji-mogui:before { + content: "\e0b2"; +} +.icon-emoji-qifen1:before { + content: "\e0b3"; +} +.icon-emoji-guanghu:before { + content: "\e0b4"; +} +.icon-clothes-panshenqun:before { + content: "\e0b5"; +} +.icon-clothes-duanku2:before { + content: "\e0b7"; +} +.icon-clothes-paopao:before { + content: "\e0b8"; +} +.icon-clothes-duanku1:before { + content: "\e0bb"; +} +.icon-clothes-yifu1:before { + content: "\e0bc"; +} +.icon-clothes-wenjing1:before { + content: "\e0bd"; +} +.icon-clothes-duanxiu1:before { + content: "\e0be"; +} +.icon-clothes-kuzi:before { + content: "\e0bf"; +} +.icon-clothes-jiubei:before { + content: "\e0c0"; +} +.icon-clothes-duanku:before { + content: "\e0c1"; +} +.icon-clothes-lianyiqun:before { + content: "\e0c4"; +} +.icon-system-naozhong4:before { + content: "\e0c5"; +} +.icon-clothes-jiubei1:before { + content: "\e0c6"; +} +.icon-system-naozhong3:before { + content: "\e0c7"; +} +.icon-clothes-yijia:before { + content: "\e0c8"; +} +.icon-clothes-gongzhuangku:before { + content: "\e0c9"; +} +.icon-clothes-yifu2:before { + content: "\e0ca"; +} +.icon-clothes-niuziku:before { + content: "\e0cb"; +} +.icon-system-naozhong2:before { + content: "\e0cd"; +} +.icon-clothes-wenjing2:before { + content: "\e0ce"; +} +.icon-clothes-tuowa:before { + content: "\e0cf"; +} +.icon-clothes-wazi1:before { + content: "\e0d1"; +} +.icon-system-naozhong1:before { + content: "\e0d2"; +} +.icon-clothes-zhangxiu:before { + content: "\e0d4"; +} +.icon-clothes-yongyi:before { + content: "\e0d5"; +} +.icon-clothes-maozi1:before { + content: "\e0d6"; +} +.icon-clothes-maozi:before { + content: "\e0d7"; +} +.icon-clothes-duanxiu2:before { + content: "\e0d8"; +} +.icon-system-huangguan1:before { + content: "\e0d9"; +} +.icon-clothes-Txu:before { + content: "\e0da"; +} +.icon-clothes-weijin:before { + content: "\e0db"; +} +.icon-clothes-shangyi1:before { + content: "\e0dc"; +} +.icon-clothes-lianyiqun1:before { + content: "\e0dd"; +} +.icon-clothes-weiyi:before { + content: "\e0de"; +} +.icon-clothes-shangyi:before { + content: "\e0df"; +} +.icon-clothes-majia:before { + content: "\e0e0"; +} +.icon-clothes-wazi:before { + content: "\e0e1"; +} +.icon-clothes-hurongfu:before { + content: "\e0e2"; +} +.icon-clothes-duanxiu:before { + content: "\e0e3"; +} +.icon-system-huangguan2:before { + content: "\e0e4"; +} +.icon-edu-huihua:before { + content: "\e0e7"; +} +.icon-edu-jiankangchangshi:before { + content: "\e0e8"; +} +.icon-edu-lishi:before { + content: "\e0eb"; +} +.icon-edu-meishu:before { + content: "\e0ec"; +} +.icon-edu-shengwu:before { + content: "\e0ee"; +} +.icon-edu-shu:before { + content: "\e0ef"; +} +.icon-edu-shuxue:before { + content: "\e0f3"; +} +.icon-edu-benyu:before { + content: "\e0f4"; +} +.icon-edu-wuli:before { + content: "\e0f7"; +} +.icon-edu-xiangpi:before { + content: "\e0f8"; +} +.icon-edu-yingyu:before { + content: "\e0fb"; +} +.icon-edu-yuwen:before { + content: "\e0fc"; +} +.icon-edu-chezi:before { + content: "\e100"; +} +.icon-edu-deli:before { + content: "\e101"; +} +.icon-edu-zhengzhi:before { + content: "\e102"; +} +.icon-tourism-lvxingpao:before { + content: "\e106"; +} +.icon-tourism-guanguanglanche:before { + content: "\e107"; +} +.icon-tourism-lvxingxiang:before { + content: "\e108"; +} +.icon-tourism-suotanyi:before { + content: "\e109"; +} +.icon-sport-lanqiu1:before { + content: "\e168"; +} +.icon-sport-jutong:before { + content: "\e169"; +} +.icon-sport-kualan:before { + content: "\e16a"; +} +.icon-sport-lanqiu:before { + content: "\e16b"; +} +.icon-sport-motuo:before { + content: "\e16c"; +} +.icon-sport-baiqiu:before { + content: "\e16d"; +} +.icon-sport-humaoqiu:before { + content: "\e16e"; +} +.icon-sport-boku:before { + content: "\e16f"; +} +.icon-sport-shouqiu:before { + content: "\e170"; +} +.icon-sport-shejihuan:before { + content: "\e171"; +} +.icon-sport-siqiu:before { + content: "\e172"; +} +.icon-sport-baolingqiu:before { + content: "\e173"; +} +.icon-sport-juqiu:before { + content: "\e174"; +} +.icon-sport-bingqiu:before { + content: "\e175"; +} +.icon-sport-bangqiu:before { + content: "\e176"; +} +.icon-sport-bobu:before { + content: "\e177"; +} +.icon-sport-humaoqiubo:before { + content: "\e178"; +} +.icon-sport-wangqiu:before { + content: "\e179"; +} +.icon-sport-yaling:before { + content: "\e17a"; +} +.icon-sport-zixingche:before { + content: "\e17b"; +} +.icon-sport-wudao:before { + content: "\e17c"; +} +.icon-sport-qugunqiu:before { + content: "\e17d"; +} +.icon-sport-zixingche1:before { + content: "\e17e"; +} +.icon-sport-tiaosheng:before { + content: "\e17f"; +} +.icon-sport-xiangpu:before { + content: "\e180"; +} +.icon-sport-wangqiu1:before { + content: "\e181"; +} +.icon-sport-pingpangqiu:before { + content: "\e182"; +} +.icon-sport-chonglang:before { + content: "\e183"; +} +.icon-sport-chonglang1:before { + content: "\e184"; +} +.icon-weather-duoyun1:before { + content: "\e185"; +} +.icon-weather-duoyun2:before { + content: "\e186"; +} +.icon-weather-duoyun3:before { + content: "\e187"; +} +.icon-weather-feng:before { + content: "\e188"; +} +.icon-weather-shandian:before { + content: "\e189"; +} +.icon-weather-duoyun4:before { + content: "\e18a"; +} +.icon-weather-feng1:before { + content: "\e18b"; +} +.icon-weather-leiyujiaojia:before { + content: "\e18c"; +} +.icon-weather-wanshang:before { + content: "\e18d"; +} +.icon-weather-leidian:before { + content: "\e18e"; +} +.icon-weather-xiaoyu:before { + content: "\e18f"; +} +.icon-weather-mai:before { + content: "\e190"; +} +.icon-weather-wu:before { + content: "\e191"; +} +.icon-weather-xiaxiaoxue:before { + content: "\e192"; +} +.icon-weather-qing:before { + content: "\e193"; +} +.icon-weather-xiaoyu1:before { + content: "\e194"; +} +.icon-weather-tayang:before { + content: "\e195"; +} +.icon-weather-xuehua:before { + content: "\e196"; +} +.icon-weather-yugaxue:before { + content: "\e197"; +} +.icon-weather-yugaxue1:before { + content: "\e198"; +} +.icon-weather-yangchen:before { + content: "\e199"; +} +.icon-weather-ruliang:before { + content: "\e19a"; +} +.icon-weather-yun:before { + content: "\e19b"; +} +.icon-weather-zhongxue:before { + content: "\e19c"; +} +.icon-weather-zhongxue1:before { + content: "\e19d"; +} +.icon-weather-taixue1:before { + content: "\e19e"; +} +.icon-weather-taiyu:before { + content: "\e19f"; +} +.icon-weather-taixue:before { + content: "\e1a0"; +} +.icon-weather-zhongyu:before { + content: "\e1a1"; +} +.icon-weather-taiyu1:before { + content: "\e1a2"; +} +.icon-weather-duoyun:before { + content: "\e1a3"; +} +.icon-system-xiangzuojiantou:before { + content: "\e1a4"; +} +.icon-system-xiaoxi1:before { + content: "\e1a5"; +} +.icon-system-xiangzuo:before { + content: "\e1a6"; +} +.icon-system-xiaoxi2:before { + content: "\e1a7"; +} +.icon-system-yinle2:before { + content: "\e1a9"; +} +.icon-system-yinle1:before { + content: "\e1aa"; +} +.icon-system-liuhu1:before { + content: "\e1ab"; +} +.icon-system-youshang:before { + content: "\e1ac"; +} +.icon-system-youshangjiantou:before { + content: "\e1ad"; +} +.icon-system-liuhu2:before { + content: "\e1ae"; +} +.icon-system-youxiajiantou:before { + content: "\e1af"; +} +.icon-system-yunduanshangzhuan:before { + content: "\e1b0"; +} +.icon-system-yunduanxiazai:before { + content: "\e1b1"; +} +.icon-system-zhaopian2:before { + content: "\e1b2"; +} +.icon-system-zuoshangjiantou:before { + content: "\e1b3"; +} +.icon-system-zhaopian1:before { + content: "\e1b4"; +} +.icon-system-zuoxiajiantou:before { + content: "\e1b6"; +} +.icon-system-android:before { + content: "\e1b7"; +} +.icon-system-android-light:before { + content: "\e1b8"; +} +.icon-system-caishan1:before { + content: "\e1ba"; +} +.icon-system-bianji:before { + content: "\e1bb"; +} +.icon-system-caishan2:before { + content: "\e1bc"; +} +.icon-system-youxia:before { + content: "\e1bf"; +} +.icon-system-dianpu:before { + content: "\e1c0"; +} +.icon-system-dianpu1:before { + content: "\e1c1"; +} +.icon-system-guanbi:before { + content: "\e1c4"; +} +.icon-system-fangxiao:before { + content: "\e1c5"; +} +.icon-system-erweima-1:before { + content: "\e1c7"; +} +.icon-system-jiesuo:before { + content: "\e1c8"; +} +.icon-system-fangtai:before { + content: "\e1c9"; +} +.icon-system-fenlei1:before { + content: "\e1ca"; +} +.icon-system-fenlei2:before { + content: "\e1cb"; +} +.icon-system-guanbi1:before { + content: "\e1cc"; +} +.icon-system-guanzhu1:before { + content: "\e1cf"; +} +.icon-system-guanzhu2:before { + content: "\e1d0"; +} +.icon-system-jiantoushang:before { + content: "\e1d3"; +} +.icon-system-jiantouxia:before { + content: "\e1d4"; +} +.icon-system-jiantouyou:before { + content: "\e1d5"; +} +.icon-system-xiangji1:before { + content: "\e1d6"; +} +.icon-system-xiayibu:before { + content: "\e1d7"; +} +.icon-system-xiangshang:before { + content: "\e1d8"; +} +.icon-system-xiangji2:before { + content: "\e1da"; +} +.icon-system-qiafu1:before { + content: "\e1db"; +} +.icon-system-qiafu2:before { + content: "\e1dc"; +} +.icon-system-xiangxia:before { + content: "\e1dd"; +} +.icon-system-xiangxiajiantou:before { + content: "\e1de"; +} +.icon-system-xiangyoujiantou:before { + content: "\e1df"; +} +.icon-system-lajietong:before { + content: "\e1e0"; +} +.icon-system-lajietong1:before { + content: "\e1e1"; +} +.icon-system-liuyin2:before { + content: "\e1e2"; +} +.icon-system-libiao:before { + content: "\e1e3"; +} +.icon-system-liuyin1:before { + content: "\e1e4"; +} +.icon-system-piaoju1:before { + content: "\e1e5"; +} +.icon-system-laya2:before { + content: "\e1e6"; +} +.icon-system-pengluo:before { + content: "\e1e7"; +} +.icon-system-qianpao1:before { + content: "\e1e8"; +} +.icon-system-qianpao2:before { + content: "\e1ea"; +} +.icon-system-shanglajiantou:before { + content: "\e1ec"; +} +.icon-system-shouye1:before { + content: "\e1ee"; +} +.icon-system-shezhi2:before { + content: "\e1ef"; +} +.icon-system-shangyibu:before { + content: "\e1f0"; +} +.icon-system-piaoju:before { + content: "\e1f1"; +} +.icon-system-leimu:before { + content: "\e1f2"; +} +.icon-system-xiaosuo1:before { + content: "\e1f3"; +} +.icon-system-suoding:before { + content: "\e1f5"; +} +.icon-system-laya1:before { + content: "\e1f6"; +} +.icon-system-shouzang1:before { + content: "\e1f7"; +} +.icon-system-xiaosuo2:before { + content: "\e1f8"; +} +.icon-system-shouye2:before { + content: "\e1f9"; +} +.icon-system-tongzhi:before { + content: "\e1fa"; +} +.icon-system-tubiao1:before { + content: "\e1fb"; +} +.icon-system-tubiao2:before { + content: "\e1fc"; +} +.icon-system-tubiao6:before { + content: "\e1fd"; +} +.icon-system-tubiao9:before { + content: "\e1fe"; +} +.icon-system-tubiao7:before { + content: "\e1ff"; +} +.icon-system-tubiao5:before { + content: "\e201"; +} +.icon-system-tubiao11:before { + content: "\e202"; +} +.icon-system-tongzhi1:before { + content: "\e203"; +} +.icon-system-wodi1:before { + content: "\e204"; +} +.icon-system-tubiao10:before { + content: "\e205"; +} +.icon-system-tubiao8:before { + content: "\e206"; +} +.icon-system-wodi2:before { + content: "\e207"; +} +.icon-system-wodi4:before { + content: "\e208"; +} +.icon-system-xialajiantou:before { + content: "\e209"; +} +.icon-system-tubiao3:before { + content: "\e20b"; +} +.icon-system-shezhi3:before { + content: "\e20d"; +} +.icon-system-tubiao12:before { + content: "\e20e"; +} +.icon-system-shouzang:before { + content: "\e20f"; +} +.icon-system-tubiao4:before { + content: "\e210"; +} +.icon-system-wodi3:before { + content: "\e211"; +} +.icon-system-7days-return:before { + content: "\e212"; +} +.icon-system-lightning-refund:before { + content: "\e213"; +} +.icon-system-gongyi:before { + content: "\e214"; +} +.icon-system-cash-delivery:before { + content: "\e215"; +} +.icon-system-freight:before { + content: "\e216"; +} +.icon-system-add-fill:before { + content: "\e218"; +} +.icon-system-add-circle-line:before { + content: "\e219"; +} +.icon-system-add-line:before { + content: "\e21a"; +} +.icon-system-admin-fill:before { + content: "\e21b"; +} +.icon-system-advertisement-fill:before { + content: "\e21c"; +} +.icon-system-advertisement-line:before { + content: "\e21d"; +} +.icon-system-admin-line:before { + content: "\e21e"; +} +.icon-system-airplay-fill:before { + content: "\e21f"; +} +.icon-system-alarm-fill:before { + content: "\e220"; +} +.icon-system-alarm-line:before { + content: "\e221"; +} +.icon-system-airplay-line:before { + content: "\e222"; +} +.icon-system-alarm-warning-fill:before { + content: "\e223"; +} +.icon-system-album-fill:before { + content: "\e224"; +} +.icon-system-alarm-warning-line:before { + content: "\e225"; +} +.icon-system-album-line:before { + content: "\e226"; +} +.icon-system-alert-fill:before { + content: "\e227"; +} +.icon-system-alert-line:before { + content: "\e228"; +} +.icon-system-align-bottom:before { + content: "\e22b"; +} +.icon-system-align-justify:before { + content: "\e22c"; +} +.icon-system-align-left:before { + content: "\e22d"; +} +.icon-system-align-center:before { + content: "\e22e"; +} +.icon-system-align-right:before { + content: "\e22f"; +} +.icon-system-align-top:before { + content: "\e230"; +} +.icon-system-align-vertically:before { + content: "\e231"; +} +.icon-system-alipay-fill:before { + content: "\e232"; +} +.icon-system-alipay-line:before { + content: "\e233"; +} +.icon-system-ancient-pavilion-line:before { + content: "\e234"; +} +.icon-system-android-fill:before { + content: "\e235"; +} +.icon-system-24-hours-fill:before { + content: "\e236"; +} +.icon-system-24-hours-line:before { + content: "\e237"; +} +.icon-system-a-b:before { + content: "\e238"; +} +.icon-system-account-circle-fill:before { + content: "\e239"; +} +.icon-system-account-box-fill:before { + content: "\e23a"; +} +.icon-system-account-box-line:before { + content: "\e23b"; +} +.icon-system-amazon-fill:before { + content: "\e23c"; +} +.icon-system-amazon-line:before { + content: "\e23d"; +} +.icon-system-anchor-fill:before { + content: "\e23e"; +} +.icon-system-ancient-gate-fill:before { + content: "\e23f"; +} +.icon-system-anchor-line:before { + content: "\e240"; +} +.icon-system-ancient-gate-line:before { + content: "\e241"; +} +.icon-system-4k-fill:before { + content: "\e242"; +} +.icon-system-ancient-pavilion-fill:before { + content: "\e243"; +} +.icon-system-account-circle-line:before { + content: "\e244"; +} +.icon-system-android-line:before { + content: "\e245"; +} +.icon-system-angularjs-fill:before { + content: "\e246"; +} +.icon-system-account-pin-box-fill:before { + content: "\e247"; +} +.icon-system-4k-line:before { + content: "\e248"; +} +.icon-system-account-pin-box-line:before { + content: "\e249"; +} +.icon-system-account-pin-circle-fill:before { + content: "\e24a"; +} +.icon-system-add-box-fill:before { + content: "\e24b"; +} +.icon-system-account-pin-circle-line:before { + content: "\e24c"; +} +.icon-system-add-box-line:before { + content: "\e24d"; +} +.icon-system-add-circle-fill:before { + content: "\e24e"; +} +.icon-system-anticlockwise-fill:before { + content: "\e24f"; +} +.icon-system-anticlockwise-line:before { + content: "\e250"; +} +.icon-system-apple-line:before { + content: "\e251"; +} +.icon-system-apps-2-line:before { + content: "\e252"; +} +.icon-system-apps-2-fill:before { + content: "\e253"; +} +.icon-system-apple-fill:before { + content: "\e254"; +} +.icon-system-arrow-drop-up-fill:before { + content: "\e255"; +} +.icon-system-apps-line:before { + content: "\e256"; +} +.icon-system-apps-fill:before { + content: "\e257"; +} +.icon-system-arrow-drop-right-fill:before { + content: "\e258"; +} +.icon-system-app-store-fill:before { + content: "\e259"; +} +.icon-system-archive-line:before { + content: "\e25a"; +} +.icon-system-arrow-drop-down-fill:before { + content: "\e25b"; +} +.icon-system-arrow-down-circle-fill:before { + content: "\e25c"; +} +.icon-system-app-store-line:before { + content: "\e25d"; +} +.icon-system-archive-drawer-fill:before { + content: "\e25e"; +} +.icon-system-archive-drawer-line:before { + content: "\e25f"; +} +.icon-system-archive-fill:before { + content: "\e260"; +} +.icon-system-arrow-drop-left-line:before { + content: "\e261"; +} +.icon-system-arrow-down-circle-line:before { + content: "\e262"; +} +.icon-system-arrow-down-fill:before { + content: "\e263"; +} +.icon-system-arrow-go-back-fill:before { + content: "\e264"; +} +.icon-system-arrow-down-line:before { + content: "\e265"; +} +.icon-system-arrow-down-s-fill:before { + content: "\e266"; +} +.icon-system-arrow-drop-right-line:before { + content: "\e267"; +} +.icon-system-arrow-drop-down-line:before { + content: "\e268"; +} +.icon-system-arrow-drop-left-fill:before { + content: "\e269"; +} +.icon-system-arrow-down-s-line:before { + content: "\e26a"; +} +.icon-system-arrow-drop-up-line:before { + content: "\e26b"; +} +.icon-system-arrow-go-back-line:before { + content: "\e26c"; +} +.icon-system-arrow-left-circle-fill:before { + content: "\e26d"; +} +.icon-system-arrow-go-forward-line:before { + content: "\e26e"; +} +.icon-system-arrow-left-circle-line:before { + content: "\e26f"; +} +.icon-system-arrow-up-fill:before { + content: "\e270"; +} +.icon-system-arrow-left-down-fill:before { + content: "\e271"; +} +.icon-system-arrow-left-down-line:before { + content: "\e272"; +} +.icon-system-arrow-left-fill:before { + content: "\e273"; +} +.icon-system-arrow-left-line:before { + content: "\e274"; +} +.icon-system-arrow-go-forward-fill:before { + content: "\e275"; +} +.icon-system-arrow-left-right-line:before { + content: "\e276"; +} +.icon-system-artboard-2-fill:before { + content: "\e277"; +} +.icon-system-artboard-2-line:before { + content: "\e278"; +} +.icon-system-arrow-up-line:before { + content: "\e279"; +} +.icon-food-chenzi:before { + content: "\e130"; +} +.icon-food-hanpu:before { + content: "\e131"; +} +.icon-beauty-fangshaizhuang:before { + content: "\e133"; +} +.icon-beauty-fenshua:before { + content: "\e134"; +} +.icon-beauty-huazhuangjing:before { + content: "\e135"; +} +.icon-beauty-jimiantaozhuang:before { + content: "\e136"; +} +.icon-beauty-hufa:before { + content: "\e137"; +} +.icon-beauty-jinghua1:before { + content: "\e139"; +} +.icon-beauty-kougong:before { + content: "\e13c"; +} +.icon-beauty-meibi:before { + content: "\e13d"; +} +.icon-beauty-meitong:before { + content: "\e13e"; +} +.icon-beauty-mianmo:before { + content: "\e13f"; +} +.icon-beauty-wenying1:before { + content: "\e141"; +} +.icon-beauty-shuzhuangjing:before { + content: "\e145"; +} +.icon-tourism-reqiqiu:before { + content: "\e10a"; +} +.icon-tourism-zijialiu:before { + content: "\e10c"; +} +.icon-tourism-liulun:before { + content: "\e10d"; +} +.icon-tourism-daoyu:before { + content: "\e10e"; +} +.icon-tourism-fanchuan:before { + content: "\e10f"; +} +.icon-tourism-feiji:before { + content: "\e110"; +} +.icon-tourism-gaotie:before { + content: "\e111"; +} +.icon-food-lajiao:before { + content: "\e112"; +} +.icon-food-lamei:before { + content: "\e114"; +} +.icon-food-liulian:before { + content: "\e115"; +} +.icon-food-liqi:before { + content: "\e116"; +} +.icon-food-luobu:before { + content: "\e117"; +} +.icon-food-zhumeng:before { + content: "\e118"; +} +.icon-food-huangluo:before { + content: "\e119"; +} +.icon-food-niuyouluo:before { + content: "\e11a"; +} +.icon-food-pengluo:before { + content: "\e11b"; +} +.icon-food-pisa:before { + content: "\e11c"; +} +.icon-food-beitao:before { + content: "\e11d"; +} +.icon-food-jiazi:before { + content: "\e11f"; +} +.icon-food-regou:before { + content: "\e120"; +} +.icon-food-shanzhu:before { + content: "\e121"; +} +.icon-food-tiantianjuan:before { + content: "\e122"; +} +.icon-food-qiaokeli:before { + content: "\e123"; +} +.icon-food-zhaozi:before { + content: "\e124"; +} +.icon-food-yangzhao:before { + content: "\e125"; +} +.icon-food-xiangcong:before { + content: "\e126"; +} +.icon-food-xigua:before { + content: "\e127"; +} +.icon-food-yingzhao:before { + content: "\e128"; +} +.icon-food-xilahua:before { + content: "\e129"; +} +.icon-food-bomihua:before { + content: "\e12a"; +} +.icon-food-yezi:before { + content: "\e12b"; +} +.icon-food-boluo:before { + content: "\e12c"; +} +.icon-food-binggan:before { + content: "\e12d"; +} +.icon-food-caomei:before { + content: "\e12e"; +} +.icon-food-fanjia:before { + content: "\e12f"; +} +.icon-beauty-baoshizhuang:before { + content: "\e146"; +} +.icon-beauty-mianshuang:before { + content: "\e14a"; +} +.icon-beauty-zhencai:before { + content: "\e14b"; +} +.icon-sport-ganlanqiu1:before { + content: "\e15d"; +} +.icon-sport-ganlanqiu:before { + content: "\e15e"; +} +.icon-sport-deshan:before { + content: "\e15f"; +} +.icon-sport-gangling:before { + content: "\e160"; +} +.icon-sport-gaoerfu:before { + content: "\e161"; +} +.icon-sport-gaoerfuqiu:before { + content: "\e162"; +} +.icon-sport-gongjian:before { + content: "\e163"; +} +.icon-sport-huaban:before { + content: "\e164"; +} +.icon-sport-jijian:before { + content: "\e165"; +} +.icon-sport-huaban1:before { + content: "\e166"; +} +.icon-sport-jijian1:before { + content: "\e167"; +} +.icon-system-arrow-left-right-fill:before { + content: "\e27a"; +} +.icon-system-arrow-up-s-fill:before { + content: "\e27b"; +} +.icon-system-arrow-left-s-line:before { + content: "\e27c"; +} +.icon-system-arrow-up-s-line:before { + content: "\e27d"; +} +.icon-system-artboard-fill:before { + content: "\e27e"; +} +.icon-system-arrow-right-circle-fill:before { + content: "\e27f"; +} +.icon-system-artboard-line:before { + content: "\e280"; +} +.icon-system-arrow-right-circle-line:before { + content: "\e281"; +} +.icon-system-arrow-left-up-fill:before { + content: "\e282"; +} +.icon-system-arrow-left-s-fill:before { + content: "\e283"; +} +.icon-system-arrow-right-down-fill:before { + content: "\e284"; +} +.icon-system-arrow-left-up-line:before { + content: "\e285"; +} +.icon-system-arrow-right-down-line:before { + content: "\e286"; +} +.icon-system-arrow-right-line:before { + content: "\e287"; +} +.icon-system-arrow-right-fill:before { + content: "\e288"; +} +.icon-system-arrow-right-s-fill:before { + content: "\e289"; +} +.icon-system-arrow-right-s-line:before { + content: "\e28a"; +} +.icon-system-arrow-right-up-fill:before { + content: "\e28b"; +} +.icon-system-article-fill:before { + content: "\e28c"; +} +.icon-system-arrow-right-up-line:before { + content: "\e28d"; +} +.icon-system-arrow-up-circle-fill:before { + content: "\e28e"; +} +.icon-system-arrow-up-circle-line:before { + content: "\e28f"; +} +.icon-system-arrow-up-down-fill:before { + content: "\e290"; +} +.icon-system-arrow-up-down-line:before { + content: "\e291"; +} +.icon-system-article-line:before { + content: "\e292"; +} +.icon-system-asterisk:before { + content: "\e293"; +} +.icon-system-at-fill:before { + content: "\e294"; +} +.icon-system-aspect-ratio-line:before { + content: "\e295"; +} +.icon-system-aspect-ratio-fill:before { + content: "\e296"; +} +.icon-system-at-line:before { + content: "\e297"; +} +.icon-system-attachment-2:before { + content: "\e298"; +} +.icon-system-attachment-fill:before { + content: "\e299"; +} +.icon-system-auction-fill:before { + content: "\e29a"; +} +.icon-system-award-fill:before { + content: "\e29b"; +} +.icon-system-award-line:before { + content: "\e29c"; +} +.icon-system-attachment-line:before { + content: "\e29d"; +} +.icon-system-auction-line:before { + content: "\e29e"; +} +.icon-system-angularjs-line:before { + content: "\e2a0"; +} +.icon-system-anticlockwise-2-fill:before { + content: "\e2a2"; +} +.icon-system-anticlockwise-2-line:before { + content: "\e2a3"; +} +.icon-system-bank-card-2-fill:before { + content: "\e2a4"; +} +.icon-system-bank-card-2-line:before { + content: "\e2a5"; +} +.icon-system-bank-card-fill:before { + content: "\e2a6"; +} +.icon-system-bank-fill:before { + content: "\e2a7"; +} +.icon-system-bank-card-line:before { + content: "\e2a8"; +} +.icon-system-bank-line:before { + content: "\e2a9"; +} +.icon-system-bar-chart-box-fill:before { + content: "\e2aa"; +} +.icon-system-bar-chart-box-line:before { + content: "\e2ab"; +} +.icon-system-bar-chart-fill:before { + content: "\e2ac"; +} +.icon-system-bar-chart-grouped-fill:before { + content: "\e2ad"; +} +.icon-system-bar-chart-grouped-line:before { + content: "\e2ae"; +} +.icon-system-bar-chart-2-fill:before { + content: "\e2af"; +} +.icon-system-barcode-line:before { + content: "\e2b0"; +} +.icon-system-bar-chart-horizontal-fill:before { + content: "\e2b1"; +} +.icon-system-barcode-box-line:before { + content: "\e2b2"; +} +.icon-system-barcode-box-fill:before { + content: "\e2b3"; +} +.icon-system-barcode-fill:before { + content: "\e2b4"; +} +.icon-system-bar-chart-horizontal-line:before { + content: "\e2b5"; +} +.icon-system-bar-chart-line:before { + content: "\e2b6"; +} +.icon-system-barricade-fill:before { + content: "\e2b7"; +} +.icon-system-base-station-fill:before { + content: "\e2b8"; +} +.icon-system-barricade-line:before { + content: "\e2b9"; +} +.icon-system-bar-chart-2-line:before { + content: "\e2ba"; +} +.icon-system-base-station-line:before { + content: "\e2bb"; +} +.icon-system-battery-2-charge-line:before { + content: "\e2bc"; +} +.icon-system-battery-2-charge-fill:before { + content: "\e2bd"; +} +.icon-system-basketball-line:before { + content: "\e2be"; +} +.icon-system-basketball-fill:before { + content: "\e2bf"; +} +.icon-system-battery-2-fill:before { + content: "\e2c0"; +} +.icon-system-battery-charge-fill:before { + content: "\e2c1"; +} +.icon-system-battery-2-line:before { + content: "\e2c2"; +} +.icon-system-blur-off-fill:before { + content: "\e2c3"; +} +.icon-system-battery-saver-fill:before { + content: "\e2c4"; +} +.icon-system-battery-share-fill:before { + content: "\e2c5"; +} +.icon-system-battery-saver-line:before { + content: "\e2c6"; +} +.icon-system-bear-smile-fill:before { + content: "\e2c7"; +} +.icon-system-battery-share-line:before { + content: "\e2c8"; +} +.icon-system-bear-smile-line:before { + content: "\e2c9"; +} +.icon-system-battery-charge-line:before { + content: "\e2cb"; +} +.icon-system-battery-line:before { + content: "\e2cc"; +} +.icon-system-battery-fill:before { + content: "\e2cd"; +} +.icon-system-battery-low-line:before { + content: "\e2ce"; +} +.icon-system-bell-fill:before { + content: "\e2cf"; +} +.icon-system-battery-low-fill:before { + content: "\e2d1"; +} +.icon-tourism-bike-fill:before { + content: "\e2d2"; +} +.icon-system-bell-line:before { + content: "\e2d3"; +} +.icon-system-bilibili-fill:before { + content: "\e2d4"; +} +.icon-tourism-bike-line:before { + content: "\e2d5"; +} +.icon-system-bilibili-line:before { + content: "\e2d6"; +} +.icon-system-bill-fill:before { + content: "\e2d7"; +} +.icon-system-billiards-fill:before { + content: "\e2d8"; +} +.icon-system-billiards-line:before { + content: "\e2d9"; +} +.icon-system-bill-line:before { + content: "\e2da"; +} +.icon-system-bit-coin-fill:before { + content: "\e2db"; +} +.icon-system-bit-coin-line:before { + content: "\e2dc"; +} +.icon-system-bluetooth-connect-fill:before { + content: "\e2dd"; +} +.icon-system-bluetooth-connect-line:before { + content: "\e2de"; +} +.icon-system-bluetooth-fill:before { + content: "\e2df"; +} +.icon-system-blur-off-line:before { + content: "\e2e0"; +} +.icon-system-bluetooth-line:before { + content: "\e2e1"; +} +.icon-system-booklet-fill:before { + content: "\e2e2"; +} +.icon-system-body-scan-fill:before { + content: "\e2e3"; +} +.icon-system-booklet-line:before { + content: "\e2e4"; +} +.icon-system-body-scan-line:before { + content: "\e2e5"; +} +.icon-system-bold:before { + content: "\e2e6"; +} +.icon-system-book-2-fill:before { + content: "\e2e7"; +} +.icon-system-book-2-line:before { + content: "\e2e8"; +} +.icon-system-book-3-fill:before { + content: "\e2e9"; +} +.icon-system-book-3-line:before { + content: "\e2ea"; +} +.icon-system-brush-4-fill:before { + content: "\e2eb"; +} +.icon-system-book-fill:before { + content: "\e2ec"; +} +.icon-system-brush-4-line:before { + content: "\e2ed"; +} +.icon-system-brush-fill:before { + content: "\e2ee"; +} +.icon-system-book-line:before { + content: "\e2ef"; +} +.icon-system-brush-line:before { + content: "\e2f0"; +} +.icon-system-ball-pen-fill:before { + content: "\e2f1"; +} +.icon-system-bookmark-3-fill:before { + content: "\e2f2"; +} +.icon-system-bookmark-2-line:before { + content: "\e2f3"; +} +.icon-system-bookmark-2-fill:before { + content: "\e2f4"; +} +.icon-system-ball-pen-line:before { + content: "\e2f5"; +} +.icon-system-bookmark-3-line:before { + content: "\e2f6"; +} +.icon-system-bookmark-fill:before { + content: "\e2f7"; +} +.icon-system-book-mark-fill:before { + content: "\e2f8"; +} +.icon-system-book-mark-line:before { + content: "\e2f9"; +} +.icon-system-bookmark-line:before { + content: "\e2fa"; +} +.icon-system-book-open-fill:before { + content: "\e2fb"; +} +.icon-system-book-read-line:before { + content: "\e2fc"; +} +.icon-system-book-open-line:before { + content: "\e2fd"; +} +.icon-system-boxing-line:before { + content: "\e2ff"; +} +.icon-system-book-read-fill:before { + content: "\e300"; +} +.icon-system-boxing-fill:before { + content: "\e301"; +} +.icon-system-briefcase-2-line:before { + content: "\e302"; +} +.icon-system-briefcase-3-fill:before { + content: "\e303"; +} +.icon-system-briefcase-3-line:before { + content: "\e304"; +} +.icon-system-briefcase-4-line:before { + content: "\e305"; +} +.icon-system-briefcase-4-fill:before { + content: "\e306"; +} +.icon-system-briefcase-5-fill:before { + content: "\e307"; +} +.icon-system-briefcase-2-fill:before { + content: "\e308"; +} +.icon-system-briefcase-line:before { + content: "\e309"; +} +.icon-system-bring-forward:before { + content: "\e30a"; +} +.icon-system-bring-to-front:before { + content: "\e30b"; +} +.icon-system-broadcast-fill:before { + content: "\e30d"; +} +.icon-system-brush-2-fill:before { + content: "\e30f"; +} +.icon-system-briefcase-5-line:before { + content: "\e310"; +} +.icon-system-broadcast-line:before { + content: "\e311"; +} +.icon-system-briefcase-fill:before { + content: "\e312"; +} +.icon-system-brush-3-fill:before { + content: "\e314"; +} +.icon-system-brush-2-line:before { + content: "\e315"; +} +.icon-system-brush-3-line:before { + content: "\e316"; +} +.icon-system-calendar-2-fill:before { + content: "\e317"; +} +.icon-system-calendar-2-line:before { + content: "\e318"; +} +.icon-system-calendar-check-fill:before { + content: "\e319"; +} +.icon-system-calendar-check-line:before { + content: "\e31a"; +} +.icon-system-calendar-event-fill:before { + content: "\e31b"; +} +.icon-system-calendar-event-line:before { + content: "\e31c"; +} +.icon-system-calendar-line:before { + content: "\e31d"; +} +.icon-system-calendar-todo-fill:before { + content: "\e31e"; +} +.icon-system-calendar-todo-line:before { + content: "\e31f"; +} +.icon-system-calendar-fill:before { + content: "\e320"; +} +.icon-system-camera-3-fill:before { + content: "\e321"; +} +.icon-system-camera-3-line:before { + content: "\e322"; +} +.icon-system-camera-fill:before { + content: "\e323"; +} +.icon-system-camera-2-line:before { + content: "\e324"; +} +.icon-system-camera-lens-fill:before { + content: "\e325"; +} +.icon-system-camera-2-fill:before { + content: "\e326"; +} +.icon-system-camera-lens-line:before { + content: "\e327"; +} +.icon-system-camera-off-fill:before { + content: "\e328"; +} +.icon-system-camera-switch-fill:before { + content: "\e329"; +} +.icon-system-camera-switch-line:before { + content: "\e32a"; +} +.icon-system-capsule-fill:before { + content: "\e32b"; +} +.icon-tourism-caravan-fill:before { + content: "\e32c"; +} +.icon-tourism-caravan-line:before { + content: "\e32d"; +} +.icon-tourism-car-washing-fill:before { + content: "\e32e"; +} +.icon-tourism-car-washing-line:before { + content: "\e32f"; +} +.icon-system-cast-fill:before { + content: "\e330"; +} +.icon-system-cast-line:before { + content: "\e331"; +} +.icon-system-cellphone-fill:before { + content: "\e332"; +} +.icon-system-capsule-line:before { + content: "\e333"; +} +.icon-system-camera-line:before { + content: "\e334"; +} +.icon-system-camera-off-line:before { + content: "\e335"; +} +.icon-system-cellphone-line:before { + content: "\e336"; +} +.icon-system-centos-fill:before { + content: "\e337"; +} +.icon-system-car-fill:before { + content: "\e338"; +} +.icon-system-car-line:before { + content: "\e339"; +} +.icon-system-centos-line:before { + content: "\e33a"; +} +.icon-system-character-recognition-fill:before { + content: "\e33b"; +} +.icon-system-charging-pile-2-fill:before { + content: "\e33c"; +} +.icon-system-charging-pile-2-line:before { + content: "\e33d"; +} +.icon-system-chat-check-fill:before { + content: "\e33e"; +} +.icon-system-chat-delete-fill:before { + content: "\e33f"; +} +.icon-system-chat-check-line:before { + content: "\e340"; +} +.icon-system-bubble-chart-line:before { + content: "\e341"; +} +.icon-system-bug-line:before { + content: "\e342"; +} +.icon-system-building-2-fill:before { + content: "\e343"; +} +.icon-system-building-2-line:before { + content: "\e344"; +} +.icon-system-chat-delete-line:before { + content: "\e345"; +} +.icon-system-bubble-chart-fill:before { + content: "\e346"; +} +.icon-system-bug-2-fill:before { + content: "\e347"; +} +.icon-system-bug-fill:before { + content: "\e348"; +} +.icon-system-bug-2-line:before { + content: "\e349"; +} +.icon-system-building-3-fill:before { + content: "\e34a"; +} +.icon-system-building-3-line:before { + content: "\e34b"; +} +.icon-system-building-4-line:before { + content: "\e34c"; +} +.icon-system-building-4-fill:before { + content: "\e34d"; +} +.icon-system-building-fill:before { + content: "\e34e"; +} +.icon-system-building-line:before { + content: "\e34f"; +} +.icon-system-bus-2-fill:before { + content: "\e350"; +} +.icon-system-chat-1-line:before { + content: "\e351"; +} +.icon-system-chat-2-line:before { + content: "\e352"; +} +.icon-tourism-bus-wifi-fill:before { + content: "\e353"; +} +.icon-system-charging-pile-fill:before { + content: "\e354"; +} +.icon-tourism-bus-wifi-line:before { + content: "\e355"; +} +.icon-system-chat-4-line:before { + content: "\e356"; +} +.icon-system-chat-1-fill:before { + content: "\e357"; +} +.icon-system-bus-line:before { + content: "\e358"; +} +.icon-system-character-recognition-line:before { + content: "\e359"; +} +.icon-system-chat-download-fill:before { + content: "\e35a"; +} +.icon-system-charging-pile-line:before { + content: "\e35b"; +} +.icon-system-chat-4-fill:before { + content: "\e35c"; +} +.icon-system-cactus-fill:before { + content: "\e35d"; +} +.icon-system-cake-2-line:before { + content: "\e35e"; +} +.icon-system-cake-3-line:before { + content: "\e35f"; +} +.icon-system-chat-2-fill:before { + content: "\e360"; +} +.icon-system-cake-3-fill:before { + content: "\e361"; +} +.icon-system-cake-fill:before { + content: "\e362"; +} +.icon-system-cake-line:before { + content: "\e363"; +} +.icon-system-calculator-fill:before { + content: "\e364"; +} +.icon-system-chat-3-line:before { + content: "\e365"; +} +.icon-system-chat-3-fill:before { + content: "\e366"; +} +.icon-system-cake-2-fill:before { + content: "\e367"; +} +.icon-system-cactus-line:before { + content: "\e368"; +} +.icon-system-calculator-line:before { + content: "\e369"; +} +.icon-tourism-bus-2-line:before { + content: "\e36a"; +} +.icon-tourism-bus-fill:before { + content: "\e36b"; +} +.icon-system-chat-history-line:before { + content: "\e36c"; +} +.icon-system-chat-new-fill:before { + content: "\e36d"; +} +.icon-system-chat-off-fill:before { + content: "\e36e"; +} +.icon-system-chat-off-line:before { + content: "\e36f"; +} +.icon-system-chat-poll-fill:before { + content: "\e370"; +} +.icon-system-chat-poll-line:before { + content: "\e371"; +} +.icon-system-chat-private-fill:before { + content: "\e372"; +} +.icon-system-chat-new-line:before { + content: "\e373"; +} +.icon-system-chat-private-line:before { + content: "\e374"; +} +.icon-system-chat-quote-fill:before { + content: "\e375"; +} +.icon-system-chat-quote-line:before { + content: "\e376"; +} +.icon-system-chat-settings-line:before { + content: "\e377"; +} +.icon-system-chat-settings-fill:before { + content: "\e378"; +} +.icon-system-chat-smile-2-fill:before { + content: "\e379"; +} +.icon-system-chat-smile-2-line:before { + content: "\e37a"; +} +.icon-system-chat-upload-line:before { + content: "\e37b"; +} +.icon-system-chat-smile-3-line:before { + content: "\e37c"; +} +.icon-system-chat-smile-3-fill:before { + content: "\e37d"; +} +.icon-system-chat-smile-fill:before { + content: "\e37e"; +} +.icon-system-chat-upload-fill:before { + content: "\e37f"; +} +.icon-system-chat-smile-line:before { + content: "\e380"; +} +.icon-system-chat-voice-fill:before { + content: "\e381"; +} +.icon-system-chat-voice-line:before { + content: "\e382"; +} +.icon-system-checkbox-blank-circle-fill:before { + content: "\e383"; +} +.icon-system-checkbox-circle-fill:before { + content: "\e384"; +} +.icon-system-checkbox-blank-circle-line:before { + content: "\e385"; +} +.icon-system-checkbox-blank-fill:before { + content: "\e386"; +} +.icon-system-checkbox-blank-line:before { + content: "\e387"; +} +.icon-system-checkbox-circle-line:before { + content: "\e388"; +} +.icon-system-checkbox-indeterminate-fill:before { + content: "\e389"; +} +.icon-system-checkbox-fill:before { + content: "\e38a"; +} +.icon-system-checkbox-indeterminate-line:before { + content: "\e38b"; +} +.icon-system-checkbox-line:before { + content: "\e38c"; +} +.icon-system-checkbox-multiple-fill:before { + content: "\e38d"; +} +.icon-system-checkbox-multiple-blank-line:before { + content: "\e38e"; +} +.icon-system-checkbox-multiple-blank-fill:before { + content: "\e38f"; +} +.icon-system-checkbox-multiple-line:before { + content: "\e390"; +} +.icon-system-check-double-fill:before { + content: "\e391"; +} +.icon-system-close-circle-line:before { + content: "\e392"; +} +.icon-system-check-double-line:before { + content: "\e393"; +} +.icon-system-check-fill:before { + content: "\e394"; +} +.icon-system-closed-captioning-fill:before { + content: "\e395"; +} +.icon-system-check-line:before { + content: "\e396"; +} +.icon-system-china-railway-fill:before { + content: "\e397"; +} +.icon-system-closed-captioning-line:before { + content: "\e398"; +} +.icon-system-chrome-fill:before { + content: "\e399"; +} +.icon-system-close-fill:before { + content: "\e39a"; +} +.icon-system-clapperboard-fill:before { + content: "\e39b"; +} +.icon-system-china-railway-line:before { + content: "\e39c"; +} +.icon-system-clapperboard-line:before { + content: "\e39d"; +} +.icon-system-chrome-line:before { + content: "\e39e"; +} +.icon-system-clipboard-fill:before { + content: "\e39f"; +} +.icon-system-clipboard-line:before { + content: "\e3a0"; +} +.icon-system-clockwise-2-fill:before { + content: "\e3a1"; +} +.icon-system-close-line:before { + content: "\e3a2"; +} +.icon-system-clockwise-fill:before { + content: "\e3a3"; +} +.icon-system-cloud-fill:before { + content: "\e3a4"; +} +.icon-system-clockwise-line:before { + content: "\e3a5"; +} +.icon-system-clockwise-2-line:before { + content: "\e3a6"; +} +.icon-system-close-circle-fill:before { + content: "\e3a7"; +} +.icon-system-cloud-line:before { + content: "\e3a8"; +} +.icon-system-cloud-off-line:before { + content: "\e3a9"; +} +.icon-system-code-box-fill:before { + content: "\e3aa"; +} +.icon-system-cloud-off-fill:before { + content: "\e3ab"; +} +.icon-system-code-fill:before { + content: "\e3ac"; +} +.icon-system-code-line:before { + content: "\e3ad"; +} +.icon-system-code-box-line:before { + content: "\e3ae"; +} +.icon-system-chat-follow-up-fill:before { + content: "\e3af"; +} +.icon-system-chat-download-line:before { + content: "\e3b0"; +} +.icon-system-codepen-fill:before { + content: "\e3b1"; +} +.icon-system-chat-forward-fill:before { + content: "\e3b2"; +} +.icon-system-chat-follow-up-line:before { + content: "\e3b3"; +} +.icon-system-chat-forward-line:before { + content: "\e3b4"; +} +.icon-system-chat-heart-fill:before { + content: "\e3b5"; +} +.icon-system-chat-heart-line:before { + content: "\e3b6"; +} +.icon-system-chat-history-fill:before { + content: "\e3b7"; +} +.icon-system-contacts-book-line:before { + content: "\e3b8"; +} +.icon-system-compasses-line:before { + content: "\e3b9"; +} +.icon-system-computer-line:before { + content: "\e3ba"; +} +.icon-system-compass-fill:before { + content: "\e3bb"; +} +.icon-system-compass-line:before { + content: "\e3bc"; +} +.icon-system-contacts-book-2-line:before { + content: "\e3bd"; +} +.icon-system-compasses-2-line:before { + content: "\e3be"; +} +.icon-system-contacts-book-fill:before { + content: "\e3bf"; +} +.icon-system-contacts-book-upload-line:before { + content: "\e3c0"; +} +.icon-system-compasses-fill:before { + content: "\e3c1"; +} +.icon-system-computer-fill:before { + content: "\e3c2"; +} +.icon-system-contacts-book-2-fill:before { + content: "\e3c3"; +} +.icon-system-contacts-book-upload-fill:before { + content: "\e3c4"; +} +.icon-system-contrast-fill:before { + content: "\e3c5"; +} +.icon-system-contacts-fill:before { + content: "\e3c6"; +} +.icon-system-contrast-2-line:before { + content: "\e3c7"; +} +.icon-system-contrast-2-fill:before { + content: "\e3c8"; +} +.icon-system-contrast-drop-line:before { + content: "\e3c9"; +} +.icon-system-contrast-drop-2-fill:before { + content: "\e3ca"; +} +.icon-system-contacts-line:before { + content: "\e3cb"; +} +.icon-system-contrast-line:before { + content: "\e3cc"; +} +.icon-system-contrast-drop-2-line:before { + content: "\e3cd"; +} +.icon-system-contrast-drop-fill:before { + content: "\e3ce"; +} +.icon-system-copper-coin-fill:before { + content: "\e3cf"; +} +.icon-system-copper-diamond-line:before { + content: "\e3d0"; +} +.icon-system-copper-coin-line:before { + content: "\e3d1"; +} +.icon-system-copper-diamond-fill:before { + content: "\e3d2"; +} +.icon-system-copyleft-fill:before { + content: "\e3d3"; +} +.icon-system-copyright-fill:before { + content: "\e3d4"; +} +.icon-system-coreos-line:before { + content: "\e3d5"; +} +.icon-system-coreos-fill:before { + content: "\e3d6"; +} +.icon-system-coupon-2-fill:before { + content: "\e3d7"; +} +.icon-system-copyright-line:before { + content: "\e3d8"; +} +.icon-system-coupon-2-line:before { + content: "\e3d9"; +} +.icon-system-copyleft-line:before { + content: "\e3da"; +} +.icon-system-coupon-4-fill:before { + content: "\e3db"; +} +.icon-system-coupon-3-fill:before { + content: "\e3dc"; +} +.icon-system-coupon-3-line:before { + content: "\e3dd"; +} +.icon-system-cpu-fill:before { + content: "\e3de"; +} +.icon-system-creative-commons-by-line:before { + content: "\e3df"; +} +.icon-system-creative-commons-fill:before { + content: "\e3e0"; +} +.icon-system-coupon-5-line:before { + content: "\e3e1"; +} +.icon-system-creative-commons-line:before { + content: "\e3e3"; +} +.icon-system-creative-commons-nd-fill:before { + content: "\e3e4"; +} +.icon-system-cpu-line:before { + content: "\e3e5"; +} +.icon-system-creative-commons-nd-line:before { + content: "\e3e7"; +} +.icon-system-coupon-4-line:before { + content: "\e3e8"; +} +.icon-system-creative-commons-by-fill:before { + content: "\e3e9"; +} +.icon-system-coupon-fill:before { + content: "\e3ea"; +} +.icon-system-coupon-line:before { + content: "\e3eb"; +} +.icon-system-coupon-5-fill:before { + content: "\e3ec"; +} +.icon-system-creative-commons-sa-fill:before { + content: "\e3ed"; +} +.icon-system-creative-commons-zero-fill:before { + content: "\e3ee"; +} +.icon-system-creative-commons-zero-line:before { + content: "\e3ef"; +} +.icon-system-criminal-line:before { + content: "\e3f0"; +} +.icon-system-crop-2-fill:before { + content: "\e3f1"; +} +.icon-system-crop-2-line:before { + content: "\e3f2"; +} +.icon-system-creative-commons-sa-line:before { + content: "\e3f3"; +} +.icon-system-crop-fill:before { + content: "\e3f4"; +} +.icon-system-criminal-fill:before { + content: "\e3f5"; +} +.icon-system-cup-line:before { + content: "\e3f6"; +} +.icon-system-crop-line:before { + content: "\e3f7"; +} +.icon-system-css3-fill:before { + content: "\e3f8"; +} +.icon-system-cup-fill:before { + content: "\e3f9"; +} +.icon-system-css3-line:before { + content: "\e3fa"; +} +.icon-system-currency-fill:before { + content: "\e3fb"; +} +.icon-system-cursor-fill:before { + content: "\e3fc"; +} +.icon-system-currency-line:before { + content: "\e3fd"; +} +.icon-system-cursor-line:before { + content: "\e3fe"; +} +.icon-system-customer-service-2-line:before { + content: "\e3ff"; +} +.icon-system-dashboard-2-fill:before { + content: "\e400"; +} +.icon-system-dashboard-2-line:before { + content: "\e401"; +} +.icon-system-dashboard-3-fill:before { + content: "\e402"; +} +.icon-system-dashboard-3-line:before { + content: "\e403"; +} +.icon-system-dashboard-fill:before { + content: "\e404"; +} +.icon-system-database-2-fill:before { + content: "\e405"; +} +.icon-system-customer-service-fill:before { + content: "\e406"; +} +.icon-system-customer-service-2-fill:before { + content: "\e407"; +} +.icon-system-database-line:before { + content: "\e408"; +} +.icon-system-database-2-line:before { + content: "\e409"; +} +.icon-system-customer-service-line:before { + content: "\e40a"; +} +.icon-system-dashboard-line:before { + content: "\e40b"; +} +.icon-system-database-fill:before { + content: "\e40c"; +} +.icon-system-delete-back-fill:before { + content: "\e40d"; +} +.icon-system-delete-back-line:before { + content: "\e40e"; +} +.icon-system-delete-bin-2-fill:before { + content: "\e40f"; +} +.icon-system-delete-bin-3-fill:before { + content: "\e410"; +} +.icon-system-delete-bin-2-line:before { + content: "\e411"; +} +.icon-system-delete-bin-4-line:before { + content: "\e412"; +} +.icon-system-delete-bin-5-fill:before { + content: "\e413"; +} +.icon-system-delete-back-2-fill:before { + content: "\e414"; +} +.icon-system-delete-bin-6-fill:before { + content: "\e415"; +} +.icon-system-delete-bin-7-fill:before { + content: "\e416"; +} +.icon-system-delete-bin-3-line:before { + content: "\e417"; +} +.icon-system-delete-bin-5-line:before { + content: "\e418"; +} +.icon-system-delete-bin-7-line:before { + content: "\e419"; +} +.icon-system-delete-bin-4-fill:before { + content: "\e41a"; +} +.icon-system-delete-bin-6-line:before { + content: "\e41b"; +} +.icon-system-delete-bin-fill:before { + content: "\e41c"; +} +.icon-system-codepen-line:before { + content: "\e41f"; +} +.icon-system-coin-fill:before { + content: "\e423"; +} +.icon-system-coin-line:before { + content: "\e424"; +} +.icon-system-coins-fill:before { + content: "\e425"; +} +.icon-system-coins-line:before { + content: "\e426"; +} +.icon-system-collage-line:before { + content: "\e427"; +} +.icon-system-command-fill:before { + content: "\e428"; +} +.icon-system-community-fill:before { + content: "\e429"; +} +.icon-system-compass-2-fill:before { + content: "\e42a"; +} +.icon-system-compass-4-fill:before { + content: "\e42b"; +} +.icon-system-compass-4-line:before { + content: "\e42c"; +} +.icon-system-delete-back-2-line:before { + content: "\e42d"; +} +.icon-system-compass-3-line:before { + content: "\e42e"; +} +.icon-system-collage-fill:before { + content: "\e42f"; +} +.icon-system-command-line:before { + content: "\e430"; +} +.icon-system-community-line:before { + content: "\e431"; +} +.icon-system-compass-2-line:before { + content: "\e432"; +} +.icon-system-compass-3-fill:before { + content: "\e433"; +} +.icon-system-compass-discover-line:before { + content: "\e434"; +} +.icon-system-compass-discover-fill:before { + content: "\e435"; +} +.icon-system-compasses-2-fill:before { + content: "\e436"; +} +.icon-system-dingding-fill:before { + content: "\e438"; +} +.icon-system-dingding-line:before { + content: "\e439"; +} +.icon-system-direction-fill:before { + content: "\e43a"; +} +.icon-system-discord-line:before { + content: "\e43b"; +} +.icon-system-discord-fill:before { + content: "\e43c"; +} +.icon-system-disc-line:before { + content: "\e43d"; +} +.icon-system-discuss-fill:before { + content: "\e43e"; +} +.icon-system-discuss-line:before { + content: "\e43f"; +} +.icon-system-direction-line:before { + content: "\e440"; +} +.icon-system-dislike-fill:before { + content: "\e441"; +} +.icon-system-disqus-fill:before { + content: "\e442"; +} +.icon-system-dislike-line:before { + content: "\e443"; +} +.icon-system-disqus-line:before { + content: "\e444"; +} +.icon-system-donut-chart-line:before { + content: "\e447"; +} +.icon-system-donut-chart-fill:before { + content: "\e448"; +} +.icon-system-door-closed-fill:before { + content: "\e449"; +} +.icon-system-disc-fill:before { + content: "\e44a"; +} +.icon-system-drag-drop-line:before { + content: "\e44b"; +} +.icon-system-dribbble-fill:before { + content: "\e44d"; +} +.icon-system-door-fill:before { + content: "\e44e"; +} +.icon-system-door-closed-line:before { + content: "\e450"; +} +.icon-system-download-2-fill:before { + content: "\e451"; +} +.icon-system-download-2-line:before { + content: "\e453"; +} +.icon-system-door-lock-box-fill:before { + content: "\e454"; +} +.icon-system-door-lock-box-line:before { + content: "\e455"; +} +.icon-system-door-lock-fill:before { + content: "\e456"; +} +.icon-system-door-lock-line:before { + content: "\e457"; +} +.icon-system-door-open-fill:before { + content: "\e458"; +} +.icon-system-dv-line:before { + content: "\e459"; +} +.icon-system-download-cloud-2-fill:before { + content: "\e45a"; +} +.icon-system-download-cloud-fill:before { + content: "\e45b"; +} +.icon-system-download-line:before { + content: "\e45c"; +} +.icon-system-draft-line:before { + content: "\e45d"; +} +.icon-system-door-open-line:before { + content: "\e45e"; +} +.icon-system-dossier-fill:before { + content: "\e45f"; +} +.icon-system-dossier-line:before { + content: "\e460"; +} +.icon-system-download-cloud-2-line:before { + content: "\e462"; +} +.icon-system-dvd-fill:before { + content: "\e464"; +} +.icon-system-drive-fill:before { + content: "\e465"; +} +.icon-system-dribbble-line:before { + content: "\e466"; +} +.icon-system-door-line:before { + content: "\e467"; +} +.icon-system-dropbox-fill:before { + content: "\e468"; +} +.icon-system-drive-line:before { + content: "\e469"; +} +.icon-system-dropbox-line:before { + content: "\e46a"; +} +.icon-system-drop-fill:before { + content: "\e46b"; +} +.icon-system-download-cloud-line:before { + content: "\e46c"; +} +.icon-system-drop-line:before { + content: "\e46d"; +} +.icon-system-draft-fill:before { + content: "\e46e"; +} +.icon-system-download-fill:before { + content: "\e46f"; +} +.icon-system-drag-drop-fill:before { + content: "\e470"; +} +.icon-system-drag-move-2-fill:before { + content: "\e471"; +} +.icon-system-drag-move-2-line:before { + content: "\e472"; +} +.icon-system-drag-move-fill:before { + content: "\e473"; +} +.icon-system-e-bike-2-line:before { + content: "\e474"; +} +.icon-system-drag-move-line:before { + content: "\e475"; +} +.icon-tourism-e-bike-fill:before { + content: "\e476"; +} +.icon-tourism-e-bike-line:before { + content: "\e477"; +} +.icon-system-edit-2-fill:before { + content: "\e479"; +} +.icon-system-dvd-line:before { + content: "\e47a"; +} +.icon-system-dv-fill:before { + content: "\e47b"; +} +.icon-system-earth-fill:before { + content: "\e47c"; +} +.icon-system-earth-line:before { + content: "\e47e"; +} +.icon-system-e-bike-2-fill:before { + content: "\e47f"; +} +.icon-emoji-emotion-fill:before { + content: "\e482"; +} +.icon-emoji-emotion-happy-line:before { + content: "\e484"; +} +.icon-emoji-emotion-happy-fill:before { + content: "\e485"; +} +.icon-emoji-emotion-laugh-fill:before { + content: "\e486"; +} +.icon-emoji-emotion-laugh-line:before { + content: "\e487"; +} +.icon-emoji-emotion-line:before { + content: "\e488"; +} +.icon-emoji-emotion-normal-fill:before { + content: "\e489"; +} +.icon-emoji-emotion-normal-line:before { + content: "\e48a"; +} +.icon-system-edit-box-fill:before { + content: "\e48b"; +} +.icon-system-edit-box-line:before { + content: "\e48c"; +} +.icon-system-edit-2-line:before { + content: "\e48d"; +} +.icon-system-edit-circle-line:before { + content: "\e48e"; +} +.icon-system-edit-circle-fill:before { + content: "\e48f"; +} +.icon-system-edit-line:before { + content: "\e490"; +} +.icon-system-eject-fill:before { + content: "\e491"; +} +.icon-system-edit-fill:before { + content: "\e492"; +} +.icon-system-eject-line:before { + content: "\e493"; +} +.icon-system-emotion-2-fill:before { + content: "\e494"; +} +.icon-system-emotion-2-line:before { + content: "\e495"; +} +.icon-system-empathize-line:before { + content: "\e496"; +} +.icon-system-eye-line:before { + content: "\e497"; +} +.icon-system-eye-fill:before { + content: "\e498"; +} +.icon-system-emphasis:before { + content: "\e499"; +} +.icon-system-eye-close-fill:before { + content: "\e49a"; +} +.icon-system-eye-2-line:before { + content: "\e49b"; +} +.icon-system-eye-2-fill:before { + content: "\e49c"; +} +.icon-system-eye-close-line:before { + content: "\e49d"; +} +.icon-system-external-link-fill:before { + content: "\e49e"; +} +.icon-system-eye-off-fill:before { + content: "\e49f"; +} +.icon-system-eye-off-line:before { + content: "\e4a0"; +} +.icon-emoji-emotion-sad-fill:before { + content: "\e4a1"; +} +.icon-emoji-emotion-unhappy-line:before { + content: "\e4a2"; +} +.icon-emoji-emotion-unhappy-fill:before { + content: "\e4a3"; +} +.icon-emoji-emotion-sad-line:before { + content: "\e4a4"; +} +.icon-system-empathize-fill:before { + content: "\e4a5"; +} +.icon-system-exchange-box-line:before { + content: "\e4a8"; +} +.icon-system-exchange-box-fill:before { + content: "\e4a9"; +} +.icon-system-exchange-fill:before { + content: "\e4ad"; +} +.icon-system-exchange-cny-fill:before { + content: "\e4ae"; +} +.icon-system-exchange-funds-line:before { + content: "\e4af"; +} +.icon-system-exchange-line:before { + content: "\e4b0"; +} +.icon-system-exchange-funds-fill:before { + content: "\e4b1"; +} +.icon-system-external-link-line:before { + content: "\e4b2"; +} +.icon-system-facebook-box-fill:before { + content: "\e4b3"; +} +.icon-system-facebook-circle-line:before { + content: "\e4b4"; +} +.icon-system-facebook-box-line:before { + content: "\e4b5"; +} +.icon-system-facebook-circle-fill:before { + content: "\e4b6"; +} +.icon-system-feedback-fill:before { + content: "\e4b7"; +} +.icon-system-facebook-fill:before { + content: "\e4b8"; +} +.icon-system-facebook-line:before { + content: "\e4b9"; +} +.icon-system-feedback-line:before { + content: "\e4ba"; +} +.icon-system-file-2-fill:before { + content: "\e4bb"; +} +.icon-system-file-2-line:before { + content: "\e4bc"; +} +.icon-system-emphasis-cn:before { + content: "\e4bd"; +} +.icon-system-file-3-fill:before { + content: "\e4be"; +} +.icon-system-equalizer-fill:before { + content: "\e4bf"; +} +.icon-system-english-input:before { + content: "\e4c0"; +} +.icon-system-file-4-fill:before { + content: "\e4c1"; +} +.icon-system-file-4-line:before { + content: "\e4c2"; +} +.icon-system-file-3-line:before { + content: "\e4c3"; +} +.icon-system-file-add-line:before { + content: "\e4c4"; +} +.icon-system-file-add-fill:before { + content: "\e4c5"; +} +.icon-system-file-chart-2-fill:before { + content: "\e4c6"; +} +.icon-system-file-chart-fill:before { + content: "\e4c7"; +} +.icon-system-file-chart-2-line:before { + content: "\e4c8"; +} +.icon-system-delete-bin-line:before { + content: "\e4c9"; +} +.icon-system-device-fill:before { + content: "\e4ca"; +} +.icon-system-device-recover-fill:before { + content: "\e4cb"; +} +.icon-system-delete-row:before { + content: "\e4cc"; +} +.icon-system-delete-column:before { + content: "\e4cd"; +} +.icon-system-device-line:before { + content: "\e4ce"; +} +.icon-system-equalizer-line:before { + content: "\e4cf"; +} +.icon-system-eraser-fill:before { + content: "\e4d0"; +} +.icon-system-eraser-line:before { + content: "\e4d1"; +} +.icon-system-error-warning-fill:before { + content: "\e4d2"; +} +.icon-system-error-warning-line:before { + content: "\e4d3"; +} +.icon-system-file-list-3-fill:before { + content: "\e4fd"; +} +.icon-system-file-list-3-line:before { + content: "\e4fe"; +} +.icon-system-file-list-fill:before { + content: "\e4ff"; +} +.icon-system-file-list-2-line-1:before { + content: "\e500"; +} +.icon-system-file-pdf-fill-1:before { + content: "\e501"; +} +.icon-system-file-list-line:before { + content: "\e502"; +} +.icon-system-file-lock-fill:before { + content: "\e503"; +} +.icon-system-file-lock-line:before { + content: "\e504"; +} +.icon-system-file-copy-2-fill:before { + content: "\e505"; +} +.icon-system-file-mark-fill:before { + content: "\e506"; +} +.icon-system-file-paper-2-line:before { + content: "\e507"; +} +.icon-system-file-mark-line:before { + content: "\e508"; +} +.icon-system-file-music-line:before { + content: "\e509"; +} +.icon-system-file-reduce-fill:before { + content: "\e50a"; +} +.icon-system-file-ppt-2-line:before { + content: "\e50b"; +} +.icon-system-file-paper-fill:before { + content: "\e50c"; +} +.icon-system-file-paper-2-fill:before { + content: "\e50d"; +} +.icon-system-file-music-fill:before { + content: "\e50e"; +} +.icon-system-file-paper-line:before { + content: "\e50f"; +} +.icon-system-file-ppt-line-1:before { + content: "\e510"; +} +.icon-system-file-pdf-line-1:before { + content: "\e511"; +} +.icon-system-file-ppt-2-fill:before { + content: "\e512"; +} +.icon-system-file-chart-line:before { + content: "\e513"; +} +.icon-system-file-ppt-fill:before { + content: "\e514"; +} +.icon-system-file-code-fill:before { + content: "\e515"; +} +.icon-system-file-code-line:before { + content: "\e516"; +} +.icon-system-file-cloud-line:before { + content: "\e517"; +} +.icon-system-file-copy-fill:before { + content: "\e518"; +} +.icon-system-file-copy-2-line:before { + content: "\e519"; +} +.icon-system-file-cloud-fill:before { + content: "\e51a"; +} +.icon-system-file-edit-line:before { + content: "\e51b"; +} +.icon-system-file-excel-2-fill:before { + content: "\e51c"; +} +.icon-system-file-copy-line:before { + content: "\e51d"; +} +.icon-system-file-excel-2-line:before { + content: "\e51e"; +} +.icon-system-file-excel-fill:before { + content: "\e51f"; +} +.icon-system-file-excel-line:before { + content: "\e520"; +} +.icon-system-file-fill:before { + content: "\e521"; +} +.icon-system-file-forbid-fill:before { + content: "\e522"; +} +.icon-system-file-damage-line:before { + content: "\e523"; +} +.icon-system-file-history-line:before { + content: "\e524"; +} +.icon-system-file-hwp-fill:before { + content: "\e525"; +} +.icon-system-file-forbid-line:before { + content: "\e526"; +} +.icon-system-file-gif-fill:before { + content: "\e527"; +} +.icon-system-file-damage-fill:before { + content: "\e528"; +} +.icon-system-file-gif-line:before { + content: "\e529"; +} +.icon-system-file-download-fill:before { + content: "\e52a"; +} +.icon-system-file-download-line:before { + content: "\e52b"; +} +.icon-system-file-edit-fill:before { + content: "\e52c"; +} +.icon-system-file-history-fill:before { + content: "\e52d"; +} +.icon-system-file-line-1:before { + content: "\e52e"; +} +.icon-system-file-hwp-line:before { + content: "\e52f"; +} +.icon-system-file-info-line:before { + content: "\e530"; +} +.icon-system-file-info-fill:before { + content: "\e531"; +} +.icon-system-file-list-2-fill:before { + content: "\e532"; +} +.icon-system-ghost-2-line:before { + content: "\e533"; +} +.icon-system-ghost-fill:before { + content: "\e534"; +} +.icon-system-ghost-line:before { + content: "\e535"; +} +.icon-system-gift-2-fill:before { + content: "\e536"; +} +.icon-system-ghost-smile-line:before { + content: "\e537"; +} +.icon-system-ghost-smile-fill:before { + content: "\e538"; +} +.icon-system-gift-fill:before { + content: "\e539"; +} +.icon-system-gift-2-line:before { + content: "\e53a"; +} +.icon-system-gift-line:before { + content: "\e53b"; +} +.icon-system-git-commit-fill:before { + content: "\e53c"; +} +.icon-system-git-branch-fill:before { + content: "\e53d"; +} +.icon-system-git-branch-line:before { + content: "\e53e"; +} +.icon-system-git-commit-line:before { + content: "\e53f"; +} +.icon-system-git-merge-fill:before { + content: "\e544"; +} +.icon-system-git-merge-line:before { + content: "\e545"; +} +.icon-system-git-pull-request-fill:before { + content: "\e546"; +} +.icon-system-git-pull-request-line:before { + content: "\e547"; +} +.icon-system-folder-zip-fill:before { + content: "\e548"; +} +.icon-system-football-line:before { + content: "\e549"; +} +.icon-system-git-repository-commits-fill:before { + content: "\e54a"; +} +.icon-system-git-repository-commits-line:before { + content: "\e54b"; +} +.icon-system-git-repository-fill:before { + content: "\e54c"; +} +.icon-system-folder-upload-line:before { + content: "\e54d"; +} +.icon-system-folder-user-fill:before { + content: "\e54e"; +} +.icon-system-folder-warning-line:before { + content: "\e54f"; +} +.icon-system-folder-user-line:before { + content: "\e550"; +} +.icon-system-folder-warning-fill:before { + content: "\e551"; +} +.icon-system-folder-zip-line:before { + content: "\e552"; +} +.icon-system-font-color:before { + content: "\e553"; +} +.icon-system-font-size-2:before { + content: "\e554"; +} +.icon-system-font-size:before { + content: "\e555"; +} +.icon-system-football-fill:before { + content: "\e556"; +} +.icon-system-footprint-fill:before { + content: "\e557"; +} +.icon-system-funds-line:before { + content: "\e558"; +} +.icon-system-footprint-line:before { + content: "\e559"; +} +.icon-system-gallery-fill:before { + content: "\e55a"; +} +.icon-system-gallery-line:before { + content: "\e55b"; +} +.icon-system-gallery-upload-line:before { + content: "\e55c"; +} +.icon-system-game-line:before { + content: "\e55d"; +} +.icon-system-gamepad-fill:before { + content: "\e55e"; +} +.icon-system-gallery-upload-fill:before { + content: "\e55f"; +} +.icon-system-gamepad-line:before { + content: "\e560"; +} +.icon-system-gas-station-fill:before { + content: "\e561"; +} +.icon-system-game-fill:before { + content: "\e562"; +} +.icon-system-gas-station-line:before { + content: "\e563"; +} +.icon-system-forbid-2-line:before { + content: "\e564"; +} +.icon-system-forbid-fill:before { + content: "\e565"; +} +.icon-system-forbid-2-fill:before { + content: "\e566"; +} +.icon-system-forbid-line:before { + content: "\e567"; +} +.icon-system-fullscreen-fill:before { + content: "\e568"; +} +.icon-system-fullscreen-exit-line:before { + content: "\e569"; +} +.icon-system-function-fill:before { + content: "\e56b"; +} +.icon-system-function-line:before { + content: "\e56c"; +} +.icon-system-genderless-fill:before { + content: "\e56d"; +} +.icon-system-gatsby-fill:before { + content: "\e56e"; +} +.icon-system-gatsby-line:before { + content: "\e570"; +} +.icon-system-fridge-line:before { + content: "\e571"; +} +.icon-system-fullscreen-line:before { + content: "\e572"; +} +.icon-system-fridge-fill:before { + content: "\e573"; +} +.icon-system-ghost-2-fill:before { + content: "\e574"; +} +.icon-system-genderless-line:before { + content: "\e575"; +} +.icon-system-funds-box-line:before { + content: "\e576"; +} +.icon-system-funds-box-fill:before { + content: "\e577"; +} +.icon-system-functions:before { + content: "\e578"; +} +.icon-system-funds-fill:before { + content: "\e579"; +} +.icon-weather-drizzle-fill:before { + content: "\e57a"; +} +.icon-weather-cloudy-fill:before { + content: "\e57b"; +} +.icon-weather-fahrenheit-line:before { + content: "\e57c"; +} +.icon-weather-fire-fill:before { + content: "\e57d"; +} +.icon-weather-cloudy-2-line:before { + content: "\e57e"; +} +.icon-weather-drizzle-line:before { + content: "\e57f"; +} +.icon-weather-cloudy-line:before { + content: "\e580"; +} +.icon-weather-fire-line:before { + content: "\e581"; +} +.icon-weather-earthquake-fill:before { + content: "\e582"; +} +.icon-weather-earthquake-line:before { + content: "\e583"; +} +.icon-weather-fahrenheit-fill:before { + content: "\e584"; +} +.icon-weather-hail-line:before { + content: "\e585"; +} +.icon-weather-haze-2-line:before { + content: "\e586"; +} +.icon-weather-flood-line:before { + content: "\e587"; +} +.icon-weather-flood-fill:before { + content: "\e588"; +} +.icon-weather-haze-fill:before { + content: "\e589"; +} +.icon-weather-hail-fill:before { + content: "\e58a"; +} +.icon-weather-haze-2-fill:before { + content: "\e58b"; +} +.icon-weather-haze-line:before { + content: "\e58c"; +} +.icon-weather-flashlight-line:before { + content: "\e58d"; +} +.icon-weather-foggy-line:before { + content: "\e58e"; +} +.icon-weather-flashlight-fill:before { + content: "\e58f"; +} +.icon-weather-foggy-fill:before { + content: "\e590"; +} +.icon-weather-heavy-showers-fill:before { + content: "\e591"; +} +.icon-weather-heavy-showers-line:before { + content: "\e592"; +} +.icon-weather-meteor-fill:before { + content: "\e593"; +} +.icon-weather-meteor-line:before { + content: "\e594"; +} +.icon-weather-mist-fill:before { + content: "\e595"; +} +.icon-weather-mist-line:before { + content: "\e596"; +} +.icon-weather-moon-clear-fill:before { + content: "\e597"; +} +.icon-weather-moon-clear-line:before { + content: "\e598"; +} +.icon-weather-moon-cloudy-line:before { + content: "\e599"; +} +.icon-weather-moon-cloudy-fill:before { + content: "\e59a"; +} +.icon-weather-blaze-fill:before { + content: "\e59b"; +} +.icon-weather-blaze-line:before { + content: "\e59c"; +} +.icon-weather-celsius-fill:before { + content: "\e59d"; +} +.icon-weather-celsius-line:before { + content: "\e59e"; +} +.icon-weather-cloud-windy-fill:before { + content: "\e59f"; +} +.icon-weather-cloud-windy-line:before { + content: "\e5a0"; +} +.icon-weather-cloudy-2-fill:before { + content: "\e5a1"; +} +.icon-weather-sun-cloudy-fill:before { + content: "\e5a2"; +} +.icon-weather-sun-cloudy-line:before { + content: "\e5a3"; +} +.icon-weather-sun-foggy-fill:before { + content: "\e5a4"; +} +.icon-weather-sun-foggy-line:before { + content: "\e5a5"; +} +.icon-weather-sun-fill:before { + content: "\e5a6"; +} +.icon-weather-sun-line:before { + content: "\e5a7"; +} +.icon-weather-temp-cold-fill:before { + content: "\e5a8"; +} +.icon-weather-temp-hot-line:before { + content: "\e5a9"; +} +.icon-weather-temp-cold-line:before { + content: "\e5aa"; +} +.icon-weather-temp-hot-fill:before { + content: "\e5ab"; +} +.icon-weather-thunderstorms-fill:before { + content: "\e5ac"; +} +.icon-weather-tornado-fill:before { + content: "\e5ad"; +} +.icon-weather-thunderstorms-line:before { + content: "\e5ae"; +} +.icon-weather-tornado-line:before { + content: "\e5af"; +} +.icon-weather-typhoon-fill:before { + content: "\e5b0"; +} +.icon-weather-typhoon-line:before { + content: "\e5b1"; +} +.icon-weather-windy-fill:before { + content: "\e5b2"; +} +.icon-weather-windy-line:before { + content: "\e5b3"; +} +.icon-weather-moon-fill:before { + content: "\e5b4"; +} +.icon-weather-moon-foggy-fill:before { + content: "\e5b5"; +} +.icon-weather-moon-foggy-line:before { + content: "\e5b6"; +} +.icon-weather-rainbow-line:before { + content: "\e5b7"; +} +.icon-weather-moon-line:before { + content: "\e5b8"; +} +.icon-weather-rainbow-fill:before { + content: "\e5b9"; +} +.icon-weather-rainy-line:before { + content: "\e5ba"; +} +.icon-weather-rainy-fill:before { + content: "\e5bb"; +} +.icon-weather-showers-fill:before { + content: "\e5bc"; +} +.icon-weather-snowy-fill:before { + content: "\e5bd"; +} +.icon-weather-showers-line:before { + content: "\e5be"; +} +.icon-weather-snowy-line:before { + content: "\e5bf"; +} +.icon-system-google-fill:before { + content: "\e5c0"; +} +.icon-system-google-line:before { + content: "\e5c1"; +} +.icon-system-google-play-fill:before { + content: "\e5c2"; +} +.icon-system-government-fill:before { + content: "\e5c3"; +} +.icon-system-google-play-line:before { + content: "\e5c4"; +} +.icon-system-government-line:before { + content: "\e5c5"; +} +.icon-system-gps-fill:before { + content: "\e5c6"; +} +.icon-system-gps-line:before { + content: "\e5c7"; +} +.icon-system-gradienter-fill:before { + content: "\e5c8"; +} +.icon-system-gradienter-line:before { + content: "\e5c9"; +} +.icon-system-grid-fill:before { + content: "\e5ca"; +} +.icon-system-grid-line:before { + content: "\e5cb"; +} +.icon-system-group-2-fill:before { + content: "\e5cc"; +} +.icon-system-group-2-line:before { + content: "\e5cd"; +} +.icon-system-guide-line:before { + content: "\e5ce"; +} +.icon-system-group-fill:before { + content: "\e5d0"; +} +.icon-system-guide-fill:before { + content: "\e5d5"; +} +.icon-system-handbag-fill:before { + content: "\e5d7"; +} +.icon-system-group-line:before { + content: "\e5d8"; +} +.icon-system-hand-heart-line:before { + content: "\e5d9"; +} +.icon-system-hammer-fill:before { + content: "\e5da"; +} +.icon-system-hammer-line:before { + content: "\e5db"; +} +.icon-system-hand-sanitizer-fill:before { + content: "\e5dc"; +} +.icon-system-handbag-line:before { + content: "\e5dd"; +} +.icon-system-hand-coin-fill:before { + content: "\e5de"; +} +.icon-system-hand-heart-fill:before { + content: "\e5df"; +} +.icon-system-hard-drive-2-fill:before { + content: "\e5e0"; +} +.icon-system-hand-coin-line:before { + content: "\e5e1"; +} +.icon-system-hand-sanitizer-line:before { + content: "\e5e2"; +} +.icon-system-hard-drive-line:before { + content: "\e5e3"; +} +.icon-system-hard-drive-fill:before { + content: "\e5e4"; +} +.icon-system-history-line:before { + content: "\e5e5"; +} +.icon-system-hard-drive-2-line:before { + content: "\e5e6"; +} +.icon-system-home-2-line:before { + content: "\e5e7"; +} +.icon-system-home-2-fill:before { + content: "\e5e8"; +} +.icon-system-hashtag:before { + content: "\e5e9"; +} +.icon-system-git-repository-line:before { + content: "\e5ea"; +} +.icon-system-git-repository-private-fill:before { + content: "\e5eb"; +} +.icon-system-git-repository-private-line:before { + content: "\e5ec"; +} +.icon-system-global-fill:before { + content: "\e5ed"; +} +.icon-system-globe-line:before { + content: "\e5ee"; +} +.icon-system-globe-fill:before { + content: "\e5ef"; +} +.icon-system-hd-fill:before { + content: "\e5f0"; +} +.icon-system-goblet-fill:before { + content: "\e5f1"; +} +.icon-system-global-line:before { + content: "\e5f2"; +} +.icon-system-goblet-line:before { + content: "\e5f3"; +} +.icon-system-health-book-fill:before { + content: "\e5f4"; +} +.icon-system-headphone-line:before { + content: "\e5f5"; +} +.icon-system-heart-2-fill:before { + content: "\e5f6"; +} +.icon-system-headphone-fill:before { + content: "\e5f7"; +} +.icon-system-heading:before { + content: "\e5f8"; +} +.icon-system-hd-line:before { + content: "\e5f9"; +} +.icon-system-health-book-line:before { + content: "\e5fa"; +} +.icon-system-heart-3-fill:before { + content: "\e5fb"; +} +.icon-system-heart-3-line:before { + content: "\e5fc"; +} +.icon-system-heart-2-line:before { + content: "\e5fd"; +} +.icon-system-heart-fill:before { + content: "\e5fe"; +} +.icon-system-heart-add-fill:before { + content: "\e5ff"; +} +.icon-system-heart-pulse-fill:before { + content: "\e600"; +} +.icon-system-heart-line:before { + content: "\e601"; +} +.icon-system-heart-add-line:before { + content: "\e602"; +} +.icon-system-heart-pulse-line:before { + content: "\e603"; +} +.icon-system-hearts-line:before { + content: "\e604"; +} +.icon-system-hearts-fill:before { + content: "\e605"; +} +.icon-system-history-fill:before { + content: "\e606"; +} +.icon-system-home-6-fill:before { + content: "\e607"; +} +.icon-system-home-7-fill:before { + content: "\e608"; +} +.icon-system-home-7-line:before { + content: "\e609"; +} +.icon-system-home-6-line:before { + content: "\e60a"; +} +.icon-system-home-8-fill:before { + content: "\e60b"; +} +.icon-system-hq-line:before { + content: "\e60c"; +} +.icon-system-html5-fill:before { + content: "\e60d"; +} +.icon-system-image-2-line:before { + content: "\e60e"; +} +.icon-system-inbox-unarchive-line:before { + content: "\e60f"; +} +.icon-system-ie-fill:before { + content: "\e610"; +} +.icon-system-home-heart-line:before { + content: "\e611"; +} +.icon-system-image-2-fill:before { + content: "\e612"; +} +.icon-system-home-8-line:before { + content: "\e613"; +} +.icon-system-home-fill:before { + content: "\e614"; +} +.icon-system-home-gear-fill:before { + content: "\e615"; +} +.icon-system-home-gear-line:before { + content: "\e616"; +} +.icon-system-hotspot-fill:before { + content: "\e617"; +} +.icon-system-home-heart-fill:before { + content: "\e618"; +} +.icon-system-home-line:before { + content: "\e619"; +} +.icon-system-home-wifi-line:before { + content: "\e61a"; +} +.icon-system-honor-of-kings-fill:before { + content: "\e61b"; +} +.icon-system-home-smile-line:before { + content: "\e61c"; +} +.icon-system-inbox-fill:before { + content: "\e61d"; +} +.icon-system-home-smile-fill:before { + content: "\e61e"; +} +.icon-system-home-smile-2-line:before { + content: "\e61f"; +} +.icon-system-home-wifi-fill:before { + content: "\e620"; +} +.icon-system-honor-of-kings-line:before { + content: "\e621"; +} +.icon-system-home-smile-2-fill:before { + content: "\e622"; +} +.icon-system-honour-line:before { + content: "\e623"; +} +.icon-system-honour-fill:before { + content: "\e624"; +} +.icon-system-hotel-bed-fill:before { + content: "\e625"; +} +.icon-system-hotel-bed-line:before { + content: "\e626"; +} +.icon-system-hospital-line:before { + content: "\e627"; +} +.icon-system-hospital-fill:before { + content: "\e628"; +} +.icon-system-hotel-line:before { + content: "\e629"; +} +.icon-system-hotel-fill:before { + content: "\e62a"; +} +.icon-system-hotspot-line:before { + content: "\e62b"; +} +.icon-system-html5-line:before { + content: "\e62c"; +} +.icon-system-ie-line:before { + content: "\e62d"; +} +.icon-system-hq-fill:before { + content: "\e62e"; +} +.icon-system-image-add-fill:before { + content: "\e62f"; +} +.icon-system-image-edit-fill:before { + content: "\e630"; +} +.icon-system-image-add-line:before { + content: "\e631"; +} +.icon-system-image-edit-line:before { + content: "\e632"; +} +.icon-system-image-fill:before { + content: "\e633"; +} +.icon-system-image-line:before { + content: "\e634"; +} +.icon-system-increase-decrease-line:before { + content: "\e635"; +} +.icon-system-inbox-archive-line:before { + content: "\e636"; +} +.icon-system-increase-decrease-fill:before { + content: "\e637"; +} +.icon-system-inbox-archive-fill:before { + content: "\e638"; +} +.icon-system-inbox-line:before { + content: "\e639"; +} +.icon-system-inbox-unarchive-fill:before { + content: "\e63a"; +} +.icon-system-indent-decrease:before { + content: "\e63b"; +} +.icon-system-indent-increase:before { + content: "\e63c"; +} +.icon-system-indeterminate-circle-line:before { + content: "\e63d"; +} +.icon-system-information-fill:before { + content: "\e63e"; +} +.icon-system-information-line:before { + content: "\e63f"; +} +.icon-system-indeterminate-circle-fill:before { + content: "\e640"; +} +.icon-system-infrared-thermometer-fill:before { + content: "\e641"; +} +.icon-system-ink-bottle-fill:before { + content: "\e642"; +} +.icon-system-infrared-thermometer-line:before { + content: "\e643"; +} +.icon-system-ink-bottle-line:before { + content: "\e644"; +} +.icon-system-input-cursor-move:before { + content: "\e645"; +} +.icon-system-input-method-fill:before { + content: "\e646"; +} +.icon-system-input-method-line:before { + content: "\e647"; +} +.icon-system-home-3-fill:before { + content: "\e648"; +} +.icon-system-home-4-fill:before { + content: "\e649"; +} +.icon-system-home-3-line:before { + content: "\e64a"; +} +.icon-system-home-4-line:before { + content: "\e64b"; +} +.icon-system-home-5-line:before { + content: "\e64c"; +} +.icon-system-home-5-fill:before { + content: "\e64d"; +} +.icon-system-layout-right-2-fill:before { + content: "\e64e"; +} +.icon-system-layout-right-fill:before { + content: "\e64f"; +} +.icon-system-layout-right-2-line:before { + content: "\e650"; +} +.icon-system-layout-row-fill:before { + content: "\e651"; +} +.icon-system-layout-right-line:before { + content: "\e652"; +} +.icon-system-layout-row-line:before { + content: "\e653"; +} +.icon-system-layout-top-2-fill:before { + content: "\e654"; +} +.icon-system-layout-top-2-line:before { + content: "\e655"; +} +.icon-system-layout-top-fill:before { + content: "\e656"; +} +.icon-system-layout-top-line:before { + content: "\e657"; +} +.icon-system-leaf-fill:before { + content: "\e658"; +} +.icon-system-leaf-line:before { + content: "\e659"; +} +.icon-system-lifebuoy-fill:before { + content: "\e65a"; +} +.icon-system-lightbulb-fill:before { + content: "\e65b"; +} +.icon-system-lifebuoy-line:before { + content: "\e65c"; +} +.icon-system-lightbulb-flash-fill:before { + content: "\e65d"; +} +.icon-system-lightbulb-flash-line:before { + content: "\e65e"; +} +.icon-system-lightbulb-line:before { + content: "\e65f"; +} +.icon-system-line-chart-fill:before { + content: "\e660"; +} +.icon-system-line-chart-line:before { + content: "\e661"; +} +.icon-system-line-fill:before { + content: "\e662"; +} +.icon-system-line-height:before { + content: "\e663"; +} +.icon-system-link:before { + content: "\e664"; +} +.icon-system-line-line:before { + content: "\e665"; +} +.icon-system-linkedin-box-line:before { + content: "\e666"; +} +.icon-system-linkedin-box-fill:before { + content: "\e667"; +} +.icon-system-linkedin-line:before { + content: "\e668"; +} +.icon-system-linkedin-fill:before { + content: "\e669"; +} +.icon-system-link-m:before { + content: "\e66a"; +} +.icon-system-links-fill:before { + content: "\e66b"; +} +.icon-system-links-line:before { + content: "\e66c"; +} +.icon-system-list-ordered:before { + content: "\e66d"; +} +.icon-system-link-unlink:before { + content: "\e66e"; +} +.icon-system-link-unlink-m:before { + content: "\e66f"; +} +.icon-system-list-settings-fill:before { + content: "\e670"; +} +.icon-system-list-check-2:before { + content: "\e671"; +} +.icon-system-list-check:before { + content: "\e672"; +} +.icon-system-list-settings-line:before { + content: "\e673"; +} +.icon-system-live-fill:before { + content: "\e674"; +} +.icon-system-list-unordered:before { + content: "\e675"; +} +.icon-system-loader-3-fill:before { + content: "\e676"; +} +.icon-system-loader-2-fill:before { + content: "\e677"; +} +.icon-system-loader-2-line:before { + content: "\e678"; +} +.icon-system-live-line:before { + content: "\e679"; +} +.icon-system-loader-4-fill:before { + content: "\e67a"; +} +.icon-system-loader-3-line:before { + content: "\e67b"; +} +.icon-system-loader-4-line:before { + content: "\e67c"; +} +.icon-system-loader-fill:before { + content: "\e67f"; +} +.icon-system-loader-line:before { + content: "\e680"; +} +.icon-system-lock-2-line:before { + content: "\e681"; +} +.icon-system-lock-2-fill:before { + content: "\e682"; +} +.icon-system-lock-fill:before { + content: "\e683"; +} +.icon-system-lock-line:before { + content: "\e684"; +} +.icon-system-lock-password-fill:before { + content: "\e685"; +} +.icon-system-lock-password-line:before { + content: "\e686"; +} +.icon-system-lock-unlock-fill:before { + content: "\e687"; +} +.icon-system-lock-unlock-line:before { + content: "\e688"; +} +.icon-system-login-box-fill:before { + content: "\e689"; +} +.icon-system-login-box-line:before { + content: "\e68a"; +} +.icon-system-layout-fill:before { + content: "\e68b"; +} +.icon-system-layout-grid-fill:before { + content: "\e68c"; +} +.icon-system-layout-grid-line:before { + content: "\e68d"; +} +.icon-system-layout-left-2-fill:before { + content: "\e68e"; +} +.icon-system-layout-left-line:before { + content: "\e68f"; +} +.icon-system-layout-left-fill:before { + content: "\e690"; +} +.icon-system-layout-left-2-line:before { + content: "\e691"; +} +.icon-system-layout-line:before { + content: "\e692"; +} +.icon-system-layout-masonry-fill:before { + content: "\e693"; +} +.icon-system-layout-masonry-line:before { + content: "\e694"; +} +.icon-system-file-shield-2-line:before { + content: "\e695"; +} +.icon-system-file-shield-2-fill:before { + content: "\e696"; +} +.icon-system-file-shield-fill:before { + content: "\e697"; +} +.icon-system-file-shield-line:before { + content: "\e698"; +} +.icon-system-file-shred-fill:before { + content: "\e699"; +} +.icon-system-file-text-fill:before { + content: "\e69a"; +} +.icon-system-file-upload-fill:before { + content: "\e69b"; +} +.icon-system-file-transfer-fill:before { + content: "\e69c"; +} +.icon-system-file-upload-line:before { + content: "\e69d"; +} +.icon-system-file-user-fill:before { + content: "\e69e"; +} +.icon-system-file-user-line:before { + content: "\e69f"; +} +.icon-system-file-warning-fill:before { + content: "\e6a0"; +} +.icon-system-file-text-line:before { + content: "\e6a1"; +} +.icon-system-file-warning-line:before { + content: "\e6a2"; +} +.icon-system-file-shred-line:before { + content: "\e6a3"; +} +.icon-system-file-word-2-fill:before { + content: "\e6a4"; +} +.icon-system-file-word-2-line:before { + content: "\e6a5"; +} +.icon-system-file-word-fill:before { + content: "\e6a6"; +} +.icon-system-file-word-line:before { + content: "\e6a7"; +} +.icon-system-filter-3-line:before { + content: "\e6a8"; +} +.icon-system-file-unknow-fill:before { + content: "\e6a9"; +} +.icon-system-file-transfer-line:before { + content: "\e6aa"; +} +.icon-system-file-unknow-line:before { + content: "\e6ab"; +} +.icon-system-file-zip-fill:before { + content: "\e6ac"; +} +.icon-system-file-zip-line:before { + content: "\e6ad"; +} +.icon-system-film-fill:before { + content: "\e6ae"; +} +.icon-system-film-line:before { + content: "\e6af"; +} +.icon-system-filter-2-line:before { + content: "\e6b0"; +} +.icon-system-filter-2-fill:before { + content: "\e6b1"; +} +.icon-system-filter-3-fill:before { + content: "\e6b2"; +} +.icon-system-filter-line:before { + content: "\e6b3"; +} +.icon-system-filter-off-fill:before { + content: "\e6b4"; +} +.icon-system-filter-off-line:before { + content: "\e6b5"; +} +.icon-system-filter-fill:before { + content: "\e6b9"; +} +.icon-system-fingerprint-2-fill:before { + content: "\e6bb"; +} +.icon-system-fingerprint-fill:before { + content: "\e6bc"; +} +.icon-system-fingerprint-line:before { + content: "\e6be"; +} +.icon-system-first-aid-kit-fill:before { + content: "\e6c0"; +} +.icon-system-first-aid-kit-line:before { + content: "\e6c1"; +} +.icon-system-flag-2-fill:before { + content: "\e6c2"; +} +.icon-system-flag-line:before { + content: "\e6c3"; +} +.icon-system-fingerprint-2-line:before { + content: "\e6c4"; +} +.icon-system-flask-fill:before { + content: "\e6c5"; +} +.icon-system-flag-fill:before { + content: "\e6c6"; +} +.icon-tourism-flight-land-fill:before { + content: "\e6c7"; +} +.icon-system-flag-2-line:before { + content: "\e6c8"; +} +.icon-tourism-flight-takeoff-line:before { + content: "\e6c9"; +} +.icon-system-flask-line:before { + content: "\e6ca"; +} +.icon-tourism-flight-takeoff-fill:before { + content: "\e6cb"; +} +.icon-tourism-flight-land-line:before { + content: "\e6cc"; +} +.icon-system-flow-chart:before { + content: "\e6cd"; +} +.icon-system-file-search-fill:before { + content: "\e6ce"; +} +.icon-system-file-reduce-line:before { + content: "\e6cf"; +} +.icon-system-file-search-line:before { + content: "\e6d0"; +} +.icon-system-file-settings-fill:before { + content: "\e6d1"; +} +.icon-system-file-settings-line:before { + content: "\e6d2"; +} +.icon-system-folder-4-fill:before { + content: "\e6d3"; +} +.icon-system-folder-4-line:before { + content: "\e6d4"; +} +.icon-system-folder-5-fill:before { + content: "\e6d5"; +} +.icon-system-folder-5-line:before { + content: "\e6d6"; +} +.icon-system-folder-chart-2-line:before { + content: "\e6d7"; +} +.icon-system-folder-history-fill:before { + content: "\e6d8"; +} +.icon-system-folder-history-line:before { + content: "\e6d9"; +} +.icon-system-folder-chart-fill:before { + content: "\e6da"; +} +.icon-system-folder-chart-2-fill:before { + content: "\e6db"; +} +.icon-system-folder-chart-line:before { + content: "\e6dc"; +} +.icon-system-folder-add-fill:before { + content: "\e6dd"; +} +.icon-system-folder-add-line:before { + content: "\e6de"; +} +.icon-system-folder-download-fill:before { + content: "\e6df"; +} +.icon-system-folder-keyhole-line:before { + content: "\e6e0"; +} +.icon-system-folder-keyhole-fill:before { + content: "\e6e1"; +} +.icon-system-folder-info-line:before { + content: "\e6e2"; +} +.icon-system-folder-info-fill:before { + content: "\e6e3"; +} +.icon-system-folder-shield-line:before { + content: "\e6e4"; +} +.icon-system-folder-lock-fill:before { + content: "\e6e5"; +} +.icon-system-folder-line:before { + content: "\e6e6"; +} +.icon-system-folder-download-line:before { + content: "\e6e7"; +} +.icon-system-folder-forbid-line:before { + content: "\e6e8"; +} +.icon-system-folder-lock-line:before { + content: "\e6e9"; +} +.icon-system-folder-transfer-fill:before { + content: "\e6ea"; +} +.icon-system-folder-fill:before { + content: "\e6eb"; +} +.icon-system-folder-music-fill:before { + content: "\e6ec"; +} +.icon-system-folder-music-line:before { + content: "\e6ed"; +} +.icon-system-folder-open-line:before { + content: "\e6ee"; +} +.icon-system-folder-received-fill:before { + content: "\e6ef"; +} +.icon-system-folder-received-line:before { + content: "\e6f0"; +} +.icon-system-folder-reduce-fill:before { + content: "\e6f1"; +} +.icon-system-folder-reduce-line:before { + content: "\e6f2"; +} +.icon-system-folder-forbid-fill:before { + content: "\e6f3"; +} +.icon-system-folder-open-fill:before { + content: "\e6f4"; +} +.icon-system-folders-fill:before { + content: "\e6f5"; +} +.icon-system-login-circle-fill:before { + content: "\e6f7"; +} +.icon-system-login-circle-line:before { + content: "\e6f8"; +} +.icon-system-folder-upload-fill:before { + content: "\e6f9"; +} +.icon-system-folder-shared-line:before { + content: "\e6fd"; +} +.icon-system-folder-shared-fill:before { + content: "\e6fe"; +} +.icon-system-folder-shield-2-fill:before { + content: "\e6ff"; +} +.icon-system-folder-shield-2-line:before { + content: "\e700"; +} +.icon-system-folder-shield-fill:before { + content: "\e701"; +} +.icon-system-folders-line:before { + content: "\e702"; +} +.icon-system-folder-transfer-line:before { + content: "\e703"; +} +.icon-system-logout-box-fill:before { + content: "\e704"; +} +.icon-system-logout-box-r-fill:before { + content: "\e705"; +} +.icon-system-logout-box-line:before { + content: "\e706"; +} +.icon-system-logout-box-r-line:before { + content: "\e707"; +} +.icon-system-logout-circle-line:before { + content: "\e708"; +} +.icon-system-logout-circle-r-fill:before { + content: "\e709"; +} +.icon-system-logout-circle-fill:before { + content: "\e70a"; +} +.icon-system-logout-circle-r-line:before { + content: "\e70b"; +} +.icon-system-flutter-fill:before { + content: "\e70c"; +} +.icon-system-flutter-line:before { + content: "\e70d"; +} +.icon-system-luggage-cart-fill:before { + content: "\e70e"; +} +.icon-system-luggage-cart-line:before { + content: "\e70f"; +} +.icon-system-luggage-deposit-fill:before { + content: "\e710"; +} +.icon-system-focus-2-fill:before { + content: "\e711"; +} +.icon-system-focus-2-line:before { + content: "\e712"; +} +.icon-system-focus-fill:before { + content: "\e713"; +} +.icon-system-focus-3-line:before { + content: "\e714"; +} +.icon-system-focus-3-fill:before { + content: "\e715"; +} +.icon-system-focus-line:before { + content: "\e716"; +} +.icon-system-folder-2-line:before { + content: "\e717"; +} +.icon-system-folder-3-fill:before { + content: "\e718"; +} +.icon-system-folder-2-fill:before { + content: "\e719"; +} +.icon-system-folder-3-line:before { + content: "\e71a"; +} +.icon-system-mac-line:before { + content: "\e71b"; +} +.icon-system-magic-line:before { + content: "\e71c"; +} +.icon-system-mail-add-fill:before { + content: "\e71d"; +} +.icon-system-mail-add-line:before { + content: "\e71e"; +} +.icon-system-mail-check-fill:before { + content: "\e71f"; +} +.icon-system-mail-check-line:before { + content: "\e720"; +} +.icon-system-mail-close-fill:before { + content: "\e721"; +} +.icon-system-mail-close-line:before { + content: "\e722"; +} +.icon-system-magic-fill:before { + content: "\e723"; +} +.icon-system-mail-download-fill:before { + content: "\e724"; +} +.icon-system-mail-fill:before { + content: "\e725"; +} +.icon-system-mail-download-line:before { + content: "\e726"; +} +.icon-system-mail-forbid-fill:before { + content: "\e727"; +} +.icon-system-mail-forbid-line:before { + content: "\e728"; +} +.icon-system-mail-settings-line:before { + content: "\e729"; +} +.icon-system-notification-off-fill:before { + content: "\e72a"; +} +.icon-system-mail-send-line:before { + content: "\e72b"; +} +.icon-system-mail-star-fill:before { + content: "\e72c"; +} +.icon-system-mail-star-line:before { + content: "\e72d"; +} +.icon-system-mail-unread-line:before { + content: "\e72e"; +} +.icon-system-mail-unread-fill:before { + content: "\e72f"; +} +.icon-system-notification-line:before { + content: "\e730"; +} +.icon-system-notification-off-line:before { + content: "\e731"; +} +.icon-system-mail-line:before { + content: "\e732"; +} +.icon-system-mail-settings-fill:before { + content: "\e733"; +} +.icon-system-mail-lock-fill:before { + content: "\e734"; +} +.icon-system-mail-open-fill:before { + content: "\e735"; +} +.icon-system-mail-lock-line:before { + content: "\e736"; +} +.icon-system-mail-send-fill:before { + content: "\e737"; +} +.icon-system-mail-open-line:before { + content: "\e738"; +} +.icon-system-npmjs-fill:before { + content: "\e73b"; +} +.icon-system-npmjs-line:before { + content: "\e73e"; +} +.icon-system-numbers-fill:before { + content: "\e73f"; +} +.icon-system-numbers-line:before { + content: "\e740"; +} +.icon-system-oil-fill:before { + content: "\e741"; +} +.icon-system-phone-camera-line:before { + content: "\e743"; +} +.icon-system-phone-fill:before { + content: "\e744"; +} +.icon-system-phone-find-fill:before { + content: "\e745"; +} +.icon-system-phone-line:before { + content: "\e747"; +} +.icon-system-phone-lock-fill:before { + content: "\e748"; +} +.icon-system-percent-fill:before { + content: "\e749"; +} +.icon-system-nurse-line:before { + content: "\e74a"; +} +.icon-system-phone-find-line:before { + content: "\e74d"; +} +.icon-system-phone-camera-fill:before { + content: "\e750"; +} +.icon-system-phone-lock-line:before { + content: "\e752"; +} +.icon-system-luggage-deposit-line:before { + content: "\e753"; +} +.icon-system-nurse-fill:before { + content: "\e754"; +} +.icon-system-lungs-fill:before { + content: "\e755"; +} +.icon-system-lungs-line:before { + content: "\e756"; +} +.icon-system-macbook-fill:before { + content: "\e757"; +} +.icon-system-macbook-line:before { + content: "\e758"; +} +.icon-system-mac-fill:before { + content: "\e759"; +} +.icon-system-pie-chart-line:before { + content: "\e75a"; +} +.icon-system-pie-chart-fill:before { + content: "\e75b"; +} +.icon-system-pin-distance-fill:before { + content: "\e75c"; +} +.icon-system-pin-distance-line:before { + content: "\e75d"; +} +.icon-system-pixelfed-fill:before { + content: "\e75e"; +} +.icon-tourism-plane-line:before { + content: "\e75f"; +} +.icon-system-pinterest-line:before { + content: "\e760"; +} +.icon-system-pinterest-fill:before { + content: "\e761"; +} +.icon-system-pixelfed-line:before { + content: "\e762"; +} +.icon-tourism-plane-fill:before { + content: "\e763"; +} +.icon-system-pinyin-input:before { + content: "\e764"; +} +.icon-system-plant-fill:before { + content: "\e765"; +} +.icon-system-plant-line:before { + content: "\e766"; +} +.icon-system-play-circle-line:before { + content: "\e767"; +} +.icon-system-play-circle-fill:before { + content: "\e768"; +} +.icon-system-play-fill:before { + content: "\e769"; +} +.icon-system-play-line:before { + content: "\e76a"; +} +.icon-system-play-list-2-line:before { + content: "\e76b"; +} +.icon-system-picture-in-picture-exit-line:before { + content: "\e76c"; +} +.icon-system-play-list-add-fill:before { + content: "\e76d"; +} +.icon-system-picture-in-picture-line:before { + content: "\e76e"; +} +.icon-system-play-mini-line:before { + content: "\e76f"; +} +.icon-system-pie-chart-2-fill:before { + content: "\e770"; +} +.icon-system-plug-2-fill:before { + content: "\e771"; +} +.icon-system-pie-chart-2-line:before { + content: "\e772"; +} +.icon-system-play-list-2-fill:before { + content: "\e773"; +} +.icon-system-plug-fill:before { + content: "\e774"; +} +.icon-system-pie-chart-box-fill:before { + content: "\e775"; +} +.icon-system-plug-2-line:before { + content: "\e776"; +} +.icon-system-play-list-add-line:before { + content: "\e777"; +} +.icon-system-play-mini-fill:before { + content: "\e778"; +} +.icon-system-plug-line:before { + content: "\e779"; +} +.icon-system-polaroid-2-fill:before { + content: "\e77b"; +} +.icon-system-polaroid-2-line:before { + content: "\e77c"; +} +.icon-tourism-police-car-line:before { + content: "\e77f"; +} +.icon-system-price-tag-2-fill:before { + content: "\e780"; +} +.icon-tourism-police-car-fill:before { + content: "\e781"; +} +.icon-system-picture-in-picture-fill:before { + content: "\e785"; +} +.icon-system-order-play-line:before { + content: "\e786"; +} +.icon-system-organization-chart:before { + content: "\e787"; +} +.icon-system-outlet-2-fill:before { + content: "\e788"; +} +.icon-system-outlet-2-line:before { + content: "\e789"; +} +.icon-system-outlet-fill:before { + content: "\e78a"; +} +.icon-system-paint-brush-fill:before { + content: "\e78b"; +} +.icon-system-outlet-line:before { + content: "\e78c"; +} +.icon-system-page-separator:before { + content: "\e78d"; +} +.icon-system-paint-line:before { + content: "\e78e"; +} +.icon-system-palette-line:before { + content: "\e78f"; +} +.icon-system-palette-fill:before { + content: "\e790"; +} +.icon-system-pages-fill:before { + content: "\e791"; +} +.icon-system-pages-line:before { + content: "\e792"; +} +.icon-system-paint-brush-line:before { + content: "\e793"; +} +.icon-system-parent-fill:before { + content: "\e794"; +} +.icon-system-parking-box-fill:before { + content: "\e795"; +} +.icon-system-parking-box-line:before { + content: "\e796"; +} +.icon-system-passport-line:before { + content: "\e797"; +} +.icon-system-passport-fill:before { + content: "\e798"; +} +.icon-system-pause-circle-fill:before { + content: "\e79a"; +} +.icon-system-parent-line:before { + content: "\e79b"; +} +.icon-system-open-arm-fill:before { + content: "\e79c"; +} +.icon-system-open-arm-line:before { + content: "\e79d"; +} +.icon-system-open-source-fill:before { + content: "\e79e"; +} +.icon-system-paypal-line:before { + content: "\e79f"; +} +.icon-system-pencil-fill:before { + content: "\e7a0"; +} +.icon-system-pencil-ruler-2-fill:before { + content: "\e7a1"; +} +.icon-system-pencil-line:before { + content: "\e7a2"; +} +.icon-system-pencil-ruler-2-line:before { + content: "\e7a3"; +} +.icon-system-pencil-ruler-line:before { + content: "\e7a4"; +} +.icon-system-pen-nib-fill:before { + content: "\e7a5"; +} +.icon-system-pencil-ruler-fill:before { + content: "\e7a7"; +} +.icon-system-open-source-line:before { + content: "\e7a8"; +} +.icon-system-pen-nib-line:before { + content: "\e7a9"; +} +.icon-system-oil-line:before { + content: "\e7aa"; +} +.icon-system-order-play-fill:before { + content: "\e7ad"; +} +.icon-system-music-2-fill:before { + content: "\e7ae"; +} +.icon-system-music-line:before { + content: "\e7af"; +} +.icon-system-music-2-line:before { + content: "\e7b0"; +} +.icon-system-mv-fill:before { + content: "\e7b1"; +} +.icon-system-music-fill:before { + content: "\e7b2"; +} +.icon-system-mv-line:before { + content: "\e7b3"; +} +.icon-system-navigation-line:before { + content: "\e7b4"; +} +.icon-system-navigation-fill:before { + content: "\e7b7"; +} +.icon-system-notification-fill:before { + content: "\e7b8"; +} +.icon-system-map-fill:before { + content: "\e7bc"; +} +.icon-system-notification-4-fill:before { + content: "\e7bd"; +} +.icon-system-notification-3-line:before { + content: "\e7be"; +} +.icon-system-node-tree:before { + content: "\e7c0"; +} +.icon-system-notification-2-line:before { + content: "\e7c1"; +} +.icon-system-notification-2-fill:before { + content: "\e7c2"; +} +.icon-system-map-line:before { + content: "\e7c3"; +} +.icon-system-notification-badge-fill:before { + content: "\e7c4"; +} +.icon-system-notification-3-fill:before { + content: "\e7c5"; +} +.icon-system-notification-4-line:before { + content: "\e7c6"; +} +.icon-system-notification-badge-line:before { + content: "\e7c7"; +} +.icon-system-mail-volume-fill:before { + content: "\e7c8"; +} +.icon-system-map-2-line:before { + content: "\e7c9"; +} +.icon-system-map-2-fill:before { + content: "\e7ca"; +} +.icon-system-map-pin-5-fill:before { + content: "\e7cb"; +} +.icon-system-map-pin-5-line:before { + content: "\e7cc"; +} +.icon-system-map-pin-2-fill:before { + content: "\e7cd"; +} +.icon-system-map-pin-2-line:before { + content: "\e7ce"; +} +.icon-system-map-pin-add-fill:before { + content: "\e7cf"; +} +.icon-system-map-pin-4-fill:before { + content: "\e7d0"; +} +.icon-system-mark-pen-fill:before { + content: "\e7d1"; +} +.icon-system-markup-line:before { + content: "\e7d2"; +} +.icon-system-map-pin-fill:before { + content: "\e7d4"; +} +.icon-system-medal-2-fill:before { + content: "\e7d5"; +} +.icon-system-map-pin-add-line:before { + content: "\e7d6"; +} +.icon-system-map-pin-line:before { + content: "\e7d7"; +} +.icon-system-map-pin-range-line:before { + content: "\e7d8"; +} +.icon-system-map-pin-time-fill:before { + content: "\e7d9"; +} +.icon-system-map-pin-user-fill:before { + content: "\e7da"; +} +.icon-system-map-pin-range-fill:before { + content: "\e7db"; +} +.icon-system-map-pin-4-line:before { + content: "\e7dc"; +} +.icon-system-map-pin-time-line:before { + content: "\e7dd"; +} +.icon-system-map-pin-user-line:before { + content: "\e7de"; +} +.icon-system-medal-2-line:before { + content: "\e7df"; +} +.icon-system-markdown-fill:before { + content: "\e7e0"; +} +.icon-system-medal-fill:before { + content: "\e7e1"; +} +.icon-system-medium-line:before { + content: "\e7e2"; +} +.icon-system-markdown-line:before { + content: "\e7e3"; +} +.icon-system-medal-line:before { + content: "\e7e4"; +} +.icon-system-medium-fill:before { + content: "\e7e5"; +} +.icon-system-men-line:before { + content: "\e7e6"; +} +.icon-system-men-fill:before { + content: "\e7e7"; +} +.icon-system-menu-5-line:before { + content: "\e7e8"; +} +.icon-system-medicine-bottle-line:before { + content: "\e7e9"; +} +.icon-system-markup-fill:before { + content: "\e7ea"; +} +.icon-system-menu-add-fill:before { + content: "\e7eb"; +} +.icon-system-menu-add-line:before { + content: "\e7ed"; +} +.icon-system-menu-2-fill:before { + content: "\e7f0"; +} +.icon-system-mark-pen-line:before { + content: "\e7f1"; +} +.icon-system-menu-2-line:before { + content: "\e7f2"; +} +.icon-system-menu-fill:before { + content: "\e7f3"; +} +.icon-system-movie-line:before { + content: "\e7f4"; +} +.icon-system-menu-3-fill:before { + content: "\e7f5"; +} +.icon-system-menu-4-line:before { + content: "\e7f6"; +} +.icon-system-menu-3-line:before { + content: "\e7f7"; +} +.icon-system-menu-4-fill:before { + content: "\e7f8"; +} +.icon-system-menu-5-fill:before { + content: "\e7f9"; +} +.icon-system-message-3-line:before { + content: "\e7fa"; +} +.icon-system-message-fill:before { + content: "\e7fb"; +} +.icon-system-message-3-fill:before { + content: "\e7fc"; +} +.icon-system-messenger-line:before { + content: "\e7fd"; +} +.icon-system-mic-2-fill:before { + content: "\e7fe"; +} +.icon-system-message-line:before { + content: "\e7ff"; +} +.icon-system-mic-fill:before { + content: "\e800"; +} +.icon-system-messenger-fill:before { + content: "\e801"; +} +.icon-system-mic-2-line:before { + content: "\e804"; +} +.icon-system-mic-off-fill:before { + content: "\e805"; +} +.icon-system-mic-line:before { + content: "\e806"; +} +.icon-system-microsoft-fill:before { + content: "\e809"; +} +.icon-system-microsoft-line:before { + content: "\e80a"; +} +.icon-system-mind-map:before { + content: "\e80b"; +} +.icon-system-money-cny-box-line:before { + content: "\e80c"; +} +.icon-system-money-cny-circle-fill:before { + content: "\e80d"; +} +.icon-system-mini-program-line:before { + content: "\e80e"; +} +.icon-system-money-cny-box-fill:before { + content: "\e80f"; +} +.icon-system-mic-off-line:before { + content: "\e810"; +} +.icon-system-mini-program-fill:before { + content: "\e811"; +} +.icon-system-money-cny-circle-line:before { + content: "\e812"; +} +.icon-system-more-2-fill:before { + content: "\e813"; +} +.icon-system-more-fill:before { + content: "\e814"; +} +.icon-system-more-2-line:before { + content: "\e815"; +} +.icon-system-more-line:before { + content: "\e816"; +} +.icon-tourism-motorbike-line:before { + content: "\e817"; +} +.icon-tourism-motorbike-fill:before { + content: "\e818"; +} +.icon-system-mouse-line:before { + content: "\e819"; +} +.icon-system-mouse-fill:before { + content: "\e81a"; +} +.icon-system-movie-2-fill:before { + content: "\e81b"; +} +.icon-system-movie-2-line:before { + content: "\e81c"; +} +.icon-system-movie-fill:before { + content: "\e81d"; +} +.icon-system-message-2-fill:before { + content: "\e81e"; +} +.icon-system-fenleiweixuanzhongbeifen2:before { + content: "\e82f"; +} +.icon-system-fenleixuanzhongbeifen1:before { + content: "\e830"; +} +.icon-system-shouyexuanzhongbeifen2:before { + content: "\e831"; +} +.icon-system-shouyeweixuanzhongbeifen:before { + content: "\e832"; +} +.icon-system-article-nav:before { + content: "\e833"; +} +.icon-rili:before { + content: "\e834"; +} +.icon-shijian:before { + content: "\e835"; +} +.icon-xuanzhaijishi:before { + content: "\e836"; +} +.icon-qiafu:before { + content: "\e837"; +} +.icon-shouzang:before { + content: "\e838"; +} +.icon-shouye:before { + content: "\e839"; +} +.icon-fenxiang:before { + content: "\e83a"; +} +.icon-gongqi_gaoliang:before { + content: "\e83b"; +} +.icon-system-daishiyong:before { + content: "\e83e"; +} +.icon-system-daishiyong2:before { + content: "\e83f"; +} \ No newline at end of file diff --git a/common/css/iconfont.css b/common/css/iconfont.css new file mode 100644 index 0000000..78c0597 --- /dev/null +++ b/common/css/iconfont.css @@ -0,0 +1,160 @@ +/* ttf字体文件转换base64:https://transfonter.org */ + +@font-face { + font-family: "iconfont"; + /* #ifdef MP */ + src: url('data:font/ttf;charset=utf-8;base64,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AAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAAEAAgBbAQIBAwEEAQUBBgEHAQgBCQEKAQsBDAENAQ4BDwEQAREBEgETARQBFQEWARcBGAEZARoBGwEcAR0BHgEfASABIQEiASMBJAElASYBJwEoASkBKgErASwBLQEuAS8BMAExATIBMwE0ATUAqwE2ATcBOAE5AToBOwE8AT0BPgE/AUABQQFCAUMBRAFFAUYBRwFIAUkBSgFLAUwBTQFOAU8BUAFRAVIBUwFUAVUBVgFXAVgBWQFaAVsBXAFdAV4BXwFgAWEBYgFjAWQBZQFmAWcBaAFpAWoBawFsAW0BbgFvAXABcQFyAXMBdAF1AXYBdwF4AXkBegF7AXwBfQF+AX8BgAGBAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAVmdXRvdQljaGVuZ2dvbmcIZGluZ2RhbjQMZnV4dWFua3VhbmcxCWdhbnRhbmhhbwxmdXh1YW5rdWFuZzIEa2VmdQZrYW5qaWEPa2FuamlhY2hlbmdnb25nBnFyY29kZQdnb25nZ2FvCHBpbnR1YW4yCHNoYW5ncGluBnJpZ2h0MQdzb3VzdW8zCHR1dGVjaGFuB3R1YW5nb3USeGlhbmdzaGFuZ3poYW5oYW5nDXlhb3FpbmdoYW95b3UPYmlhb3FpbmdfbmFuZ3VvCWZlbnhpYW5nNARmb2xkCmdhbnRhbmhhbzEEaWNvbgdodWl5dWFuBGppYW4McGludHVhbmZhbmxpA2ppYQdzZWNraWxsDHdvZGUtdHVhbmdvdQdzaHVheGluCndvZGV5dXNob3ULeW91aHVpcXVhbjEOemh1YW50aWh1b2RvbmcHeml5dWFuMQd5b25naHUzBmNhaWRhbgdlcndlaW1hEWRhbnh1YW4teHVhbnpob25nCGRpbmdkYW4yB3NhbmppYW8Jc2hhbmdwaW4tB3Nob3V5ZTERc2hhbmdzYW5qaWFvLWNvcHkVdGVkaWFucXVhbmNoYW5nYmFveW91Bndlbmhhbwd3ZWl4aW4xA3l1ZQZ6aGVrb3UNZmFuZ2t1YWktZmlsbAt6aGlib2ppZXNodQlnb3V3dWNoZTIHZ3VhbnpodQZqaWZlbi0IZGlhbmh1YTIHaG9uZ2JhbwhxaWFuZGFvMQZqaWZlbjIGamlmZW4zDGZ1emhpbGlhbmppZQhqaWFoYW8wMQRsaWtlCGxpa2VmaWxsBGxpc3QFcmlnaHQLcm91bmQtY2xvc2UKc2hhbmdjaHVhbgZ0dXBpYW4JeHVhbnpodWFuBGFkZDEGd2VpemhpDGNsb3NlLWd1YW5iaQRhcHBzCGJpYW9xaW5nBmJpYW5qaQdjYXJ0LW9uBWNsb3NlDWNoZWNrYm94YmxhbmsHZGlhbnphbghkaW5nd2VpMQ1pY29uYW5nbGVkb3duBWRpemhpBnNob3VqaQVpY29uNxJpY29uYW5nbGVkb3duLWNvcHkKeW91aHVpcXVhbgZ6aXl1YW4Lemhhb3hpYW5namkNeXVhbl9jaGVja2JveApiYWNrX2xpZ2h0DHl1YW5fY2hlY2tlZAdiYW5nemh1BmRlbGV0ZQhkaWFuemFuMQZkaWFucHUHbWVuZGlhbghzaGFpeHVhbgdzaGlqaWFuCHNoaWppYW4xBnNvdXN1bwZzaGV6aGkHZGlhbmh1YQNkdWkHeWFvcWluZwx6aG9uZ2NoYXBpbmcIZmVueGlhbmcFZnV6aGkGaGV4aWFvBXNoYXJlCGhhb3BpbmcxCGdvdXd1Y2hlDHNoYXJlLWZyaWVuZApqaWFuZy1jb3B5CGxvY2F0aW9uCGppYW5zaGFvBmd1YW5iaQJnegloYW93dXF1YW4Gc2VhcmNoBGppbHULcGVuZ3lvdXF1YW4Fc2FvbWEHc2hvdWppMQ5zaHVydXRpYW54aWViaRF0aWFveGluZ21hc2FvbWlhbwVzaHVydQZ1bmZvbGQIZGlhbmh1YTEGd2VpeGluBnlvbmdodQhiYW5nemh1MQ56aGlmdWJhb3poaWZ1LQhhZGQtZmlsbAp6aGlib3pob25nBHdhcm4Hc3VvZGluZwtiYWl4aW5nYmVuZwdmZW54aWFvDWh1b2Rvbmd0dWl5YW4AAAAAAAH//wACAAEAAAAMAAAAFgAAAAIAAQADAI8AAQAEAAAAAgAAAAAAAAABAAAAANWkJwgAAAAA34KW1QAAAADfgpbV') format('truetype'); + /* #endif */ + + /* #ifndef MP */ + src: url('https://cdn3.codesign.qq.com/icons/1Yyg5Zpxm6Z2lKv/latest/iconfont.eot?t=1a4474d1fa0fe7c3cdff9aa0cc9c7258'); /* IE9 */ + src: url('https://cdn3.codesign.qq.com/icons/1Yyg5Zpxm6Z2lKv/latest/iconfont.eot?t=1a4474d1fa0fe7c3cdff9aa0cc9c7258#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('https://cdn3.codesign.qq.com/icons/1Yyg5Zpxm6Z2lKv/latest/iconfont.woff?t=1a4474d1fa0fe7c3cdff9aa0cc9c7258') format('woff2'), + url('https://cdn3.codesign.qq.com/icons/1Yyg5Zpxm6Z2lKv/latest/iconfont.woff?t=1a4474d1fa0fe7c3cdff9aa0cc9c7258') format('woff'), /* chrome、firefox */ + url('https://cdn3.codesign.qq.com/icons/1Yyg5Zpxm6Z2lKv/latest/iconfont.ttf?t=1a4474d1fa0fe7c3cdff9aa0cc9c7258') format('truetype'), /* chrome、firefox、opera、Safari, Android, iOS 4.2+*/ + url('https://cdn3.codesign.qq.com/icons/1Yyg5Zpxm6Z2lKv/latest/iconfont.svg?t=1a4474d1fa0fe7c3cdff9aa0cc9c7258#iconfont') format('svg'); /* iOS 4.1- */ + /* #endif */ +} + +.iconfont{font-family:"iconfont" !important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale} +.icon-futou:before{content:"\e003"} +.icon-chenggong:before{content:"\e004"} +.icon-dingdan4:before{content:"\e005"} +.icon-fuxuankuang1:before{content:"\e006"} +.icon-gantanhao:before{content:"\e007"} +.icon-fuxuankuang2:before{content:"\e008"} +.icon-kefu:before{content:"\e009"} +.icon-kanjia:before{content:"\e00a"} +.icon-kanjiachenggong:before{content:"\e00b"} +.icon-qrcode:before{content:"\e00c"} +.icon-gonggao:before{content:"\e00d"} +.icon-pintuan2:before{content:"\e00e"} +.icon-shangpin:before{content:"\e00f"} +.icon-right1:before{content:"\e010"} +.icon-sousuo3:before{content:"\e011"} +.icon-tutechan:before{content:"\e012"} +.icon-tuangou:before{content:"\e013"} +.icon-xiangshangzhanhang:before{content:"\e014"} +.icon-yaoqinghaoyou:before{content:"\e015"} +.icon-biaoqing_nanguo:before{content:"\e016"} +.icon-fenxiang4:before{content:"\e017"} +.icon-fold:before{content:"\e018"} +.icon-gantanhao1:before{content:"\e019"} +.icon-icon:before{content:"\e01a"} +.icon-huiyuan:before{content:"\e01b"} +.icon-jian:before{content:"\e01c"} +.icon-pintuanfanli:before{content:"\e01d"} +.icon-jia:before{content:"\e01e"} +.icon-seckill:before{content:"\e01f"} +.icon-wode-tuangou:before{content:"\e020"} +.icon-shuaxin:before{content:"\e021"} +.icon-wodeyushou:before{content:"\e022"} +.icon-youhuiquan1:before{content:"\e023"} +.icon-zhuantihuodong:before{content:"\e024"} +.icon-ziyuan1:before{content:"\e025"} +.icon-yonghu3:before{content:"\e026"} +.icon-caidan:before{content:"\e027"} +.icon-erweima:before{content:"\e028"} +.icon-danxuan-xuanzhong:before{content:"\e029"} +.icon-dingdan2:before{content:"\e02a"} +.icon-sanjiao:before{content:"\e02b"} +.icon-shangpin-:before{content:"\e02c"} +.icon-shouye1:before{content:"\e02d"} +.icon-shangsanjiao-copy:before{content:"\e02e"} +.icon-tedianquanchangbaoyou:before{content:"\e02f"} +.icon-wenhao:before{content:"\e030"} +.icon-weixin1:before{content:"\e031"} +.icon-yue:before{content:"\e032"} +.icon-zhekou:before{content:"\e033"} +.icon-fangkuai-fill:before{content:"\e034"} +.icon-zhibojieshu:before{content:"\e035"} +.icon-gouwuche2:before{content:"\e036"} +.icon-ellipsis:before{content:"\e037"} +.icon-guanzhu:before{content:"\e038"} +.icon-jifen-:before{content:"\e039"} +.icon-dianhua2:before{content:"\e03a"} +.icon-hongbao:before{content:"\e03b"} +.icon-qiandao1:before{content:"\e03c"} +.icon-jifen2:before{content:"\e03d"} +.icon-jifen3:before{content:"\e03e"} +.icon-fuzhilianjie:before{content:"\e03f"} +.icon-jiahao01:before{content:"\e040"} +.icon-like:before{content:"\e041"} +.icon-likefill:before{content:"\e042"} +.icon-list:before{content:"\e043"} +.icon-right:before{content:"\e044"} +.icon-round-close:before{content:"\e045"} +.icon-shangchuan:before{content:"\e046"} +.icon-tupian:before{content:"\e047"} +.icon-xuanzhuan:before{content:"\e048"} +.icon-add1:before{content:"\e049"} +.icon-weizhi:before{content:"\e04a"} +.icon-close-guanbi:before{content:"\e04b"} +.icon-apps:before{content:"\e04c"} +.icon-biaoqing:before{content:"\e04d"} +.icon-bianji:before{content:"\e04e"} +.icon-cart-on:before{content:"\e04f"} +.icon-close:before{content:"\e050"} +.icon-checkboxblank:before{content:"\e051"} +.icon-dianzan:before{content:"\e052"} +.icon-dingwei1:before{content:"\e053"} +.icon-iconangledown:before{content:"\e055"} +.icon-dizhi:before{content:"\e056"} +.icon-shouji:before{content:"\e058"} +.icon-icon7:before{content:"\e059"} +.icon-iconangledown-copy:before{content:"\e05a"} +.icon-youhuiquan:before{content:"\e05c"} +.icon-ziyuan:before{content:"\e05d"} +.icon-zhaoxiangji:before{content:"\e05e"} +.icon-yuan_checkbox:before{content:"\e05f"} +.icon-back_light:before{content:"\e060"} +.icon-yuan_checked:before{content:"\e061"} +.icon-bangzhu:before{content:"\e062"} +.icon-delete:before{content:"\e064"} +.icon-dianzan1:before{content:"\e065"} +.icon-dianpu:before{content:"\e066"} +.icon-mendian:before{content:"\e067"} +.icon-shaixuan:before{content:"\e069"} +.icon-shijian:before{content:"\e06a"} +.icon-shijian1:before{content:"\e06b"} +.icon-sousuo:before{content:"\e06c"} +.icon-shezhi:before{content:"\e06d"} +.icon-dianhua:before{content:"\e06e"} +.icon-dui:before{content:"\e06f"} +.icon-yaoqing:before{content:"\e070"} +.icon-zhongchaping:before{content:"\e071"} +.icon-fenxiang:before{content:"\e072"} +.icon-fuzhi:before{content:"\e073"} +.icon-hexiao:before{content:"\e074"} +.icon-share:before{content:"\e075"} +.icon-haoping1:before{content:"\e076"} +.icon-gouwuche:before{content:"\e077"} +.icon-share-friend:before{content:"\e078"} +.icon-jiang-copy:before{content:"\e079"} +.icon-location:before{content:"\e07a"} +.icon-jianshao:before{content:"\e07b"} +.icon-guanbi:before{content:"\e07c"} +.icon-gz:before{content:"\e07d"} +.icon-haowuquan:before{content:"\e07e"} +.icon-search:before{content:"\e07f"} +.icon-jilu:before{content:"\e080"} +.icon-pengyouquan:before{content:"\e081"} +.icon-saoma:before{content:"\e083"} +.icon-shouji1:before{content:"\e084"} +.icon-shurutianxiebi:before{content:"\e085"} +.icon-tiaoxingmasaomiao:before{content:"\e087"} +.icon-shuru:before{content:"\e088"} +.icon-unfold:before{content:"\e089"} +.icon-dianhua1:before{content:"\e08a"} +.icon-weixin:before{content:"\e08b"} +.icon-yonghu:before{content:"\e08c"} +.icon-bangzhu1:before{content:"\e08d"} +.icon-zhifubaozhifu-:before{content:"\e08e"} +.icon-add-fill:before{content:"\e08f"} +.icon-zhibozhong:before{content:"\e090"} +.icon-warn:before{content:"\e091"} +.icon-suoding:before{content:"\e092"} +.icon-wenxiao:before{content:"\e093"} +.icon-baixingbeng:before{content:"\e094"} +.icon-fenxiao:before{content:"\e095"} +.icon-huodongtuiyan:before{content:"\e096"} \ No newline at end of file diff --git a/common/css/main.scss b/common/css/main.scss new file mode 100644 index 0000000..1a2e107 --- /dev/null +++ b/common/css/main.scss @@ -0,0 +1,607 @@ +@font-face { + font-family: 'myFont'; + /* #ifdef MP */ + src: url('data:font/ttf;charset=utf-8;base64,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/+8ALP/LADH/7wAz/+8ANf/3ADYACgA3/8sAOAAKADkACgA6AAcAOwAKAED/3QBC/90AQ//dAET/3QBF//QARv/dAEz/6gBN/+oATv/dAE//6gBQ/90AUf/qAFL/3wBT//UAVP/sAFUACwBX//UAWP/1AFn/7wAPACMACAAl//IAKf/yADH/8gAz//IAQv/1AEP/9QBE//UARv/1AE7/9QBQ//UAVP/1AFX/8gBW//IAWP/yAAIAVf/3AFj/9wAEAFX/+gBX//gAWP/6AFn/+AACAFX/9QBY//kABQBC//MAQ//zAET/8wBG//MAUP/zAAYAQv/1AEP/9QBE//UARv/1AEj/9QBQ//UABABV//gAV//1AFj/+ABZ//cACgBA/+QAQv/kAEP/6gBE/+QARQALAEb/6gBO/+EAUP/qAFMAHABYAAoAAgBE//UATv/uAAgAQP/4AEL/+ABD//gARP/1AEUACABG//gATv/4AFD/+AAGAEL/9QBD//UARP/1AEb/9QBO/+oAUP/1AAgAQP/4AEL/+ABD//gARP/4AEUACABG//gATv/vAFD/+AAGAEL/9wBD//cARP/3AEb/9wBO//cAUP/3AAIACwAjACgAAAAqADQABgA2ADwAEQBAAEEAGABEAEUAGgBKAEoAHABOAE8AHQBRAFEAHwBTAFMAIABVAFUAIQBXAFkAIgAAAAAAAQAAAADVpCcIAAAAANbRI74AAAAA2D0KNg==') format('truetype'); + /* #endif */ + /* #ifndef MP */ + src: url('@/common/css/custom.ttf') format('truetype'); + /* #endif */ +} + +view { + line-height: 1.8; + font-family: 'PingFang SC', 'Roboto Medium'; + font-size: $font-size-base; + color: $color-title; +} +page { + background-color: $color-bg; +} + +:root { + $base-color: #ff4544; + $base-help-color: #ffb644; //辅助颜色 + --tab-bar-height: 112rpx; +} + +.uni-input-input:-webkit-autofill { + -webkit-transition-delay: 111111s; + -webkit-transition: color 11111s ease-out, background-color 111111s ease-out; +} + +.color-base-text { + color: $base-color !important; +} + +//背景色 +.color-base-bg { + background-color: $base-color !important; +} + +.color-base-bg-before { + &::after, + &::before { + background: $base-color !important; + } +} + +.color-base-text-before { + &::after, + &::before { + color: $base-color !important; + } +} + +// 浅主色调背景 +.color-base-bg-light { + // background-color: lighten($base-color, 35%) !important; +} + +//边框 +.color-base-border { + border-color: $base-color !important; + &-top { + border-top-color: $base-color !important; + } + &-bottom { + border-bottom-color: $base-color !important; + } + &-right { + border-right-color: $base-color !important; + } + &-left { + border-left-color: $base-color !important; + } +} + +// ***************文字颜色*************** + +// 主标题 +.color-title { + color: $color-title !important; +} + +// 副标题 +.color-sub { + color: $color-sub !important; +} + +// 辅助提示色 +.color-tip { + color: $color-tip !important; +} + +// 灰背景色 +.color-bg { + background-color: $color-bg !important; +} + +// 分割线 +.color-line { + color: $color-line !important; +} + +// 分割线边框 +.color-line-border { + border-color: $color-line !important; +} + +// 禁用色 +.color-disabled { + color: $color-disabled !important; +} + +// ***************文字大小*************** +input { + max-height: unset; + min-height: unset; + font-size: $font-size-base; +} + +// 14px,正文文字 +.font-size-base { + font-size: $font-size-base !important; +} + +// 16px,用于标题、导航栏 +.font-size-toolbar { + font-size: $font-size-toolbar !important; +} + +// 13px,副标题 +.font-size-sub { + font-size: $font-size-sub !important; +} + +// 12px,辅助性文字/大标签 +.font-size-tag { + font-size: $font-size-tag !important; +} + +// 11px,商品列表角标 +.font-size-goods-tag { + font-size: $font-size-goods-tag !important; +} + +// 10px,活动角标(拼团等角标)/小标签文字 +.font-size-activity-tag { + font-size: $font-size-activity-tag !important; +} + +//内边距 +.padding { + padding: $padding !important; + &-top { + padding-top: $padding !important; + } + &-right { + padding-right: $padding !important; + } + &-bottom { + padding-bottom: $padding !important; + } + &-left { + padding-left: $padding !important; + } +} + +//外边距 +.margin { + margin: $margin-updown $margin-both !important; + &-top { + margin-top: $margin-updown !important; + } + &-right { + margin-right: $margin-both !important; + } + &-bottom { + margin-bottom: $margin-updown !important; + } + &-left { + margin-left: $margin-both !important; + } +} + +/** + * 按钮 + * size='mini' 小规格的 + * type='default' 普通的 + * type='primary' 主色背景+白色字 + * .button-border 主色边框+主色字 + * .shadow 主色阴影 + * .default 去除margin + * .disabled 禁止状态 + */ +button { + margin: 0 30rpx; + font-size: $font-size-base; + border-radius: 10rpx; + line-height: 2.8; + &[type='primary'] { + background-color: $base-color; + color: var(--btn-text-color); + &[plain] { + background-color: transparent; + color: $base-color; + border-color: $base-color; + } + } + &[type='default'] { + background: #fff; + border: 2rpx solid $color-line; + } + &[size='mini'] { + margin: 0 !important; + line-height: 2.3; + font-size: $font-size-tag; + &[type='default'] { + background-color: #fff; + } + } + &.button-hover[type='primary'] { + background-color: $base-color; + } + &[type='primary'][plain], + &.button-hover[type='primary'][plain] { + color: $base-color; + border-color: $base-color; + } + &.button-hover[type='primary'] { + color: var(--btn-text-color); + } + + &[disabled], + &.disabled { + background: $color-line !important; + color: rgba(0, 0, 0, 0.3) !important; + border-color: $color-line !important; + } + &::after { + border: none !important; + } +} + +uni-button:after { + border: none !important; +} + +// 复选框 +uni-checkbox .uni-checkbox-input.uni-checkbox-input-checked { + color: $base-color !important; +} + +uni-checkbox:not([disabled]) .uni-checkbox-input:hover { + border-color: $base-color !important; +} + +.form-component uni-checkbox .uni-checkbox-input.uni-checkbox-input-checked { + background-color: $base-color !important; + border-color: $base-color !important; +} + +// 开关 +uni-switch .uni-switch-input.uni-switch-input-checked { + background-color: $base-color !important; + border-color: $base-color !important; +} + +// 单选 +uni-radio .uni-radio-input-checked { + background-color: $base-color !important; + border-color: $base-color !important; +} + +// 滑块 +uni-slider .uni-slider-track { + background-color: $base-color !important; +} + +.uni-tag--primary { + color: #fff !important; + background-color: $base-color !important; + border-color: $base-color !important; +} + +.uni-tag--primary.uni-tag--inverted { + color: $base-color !important; + background-color: #fff !important; + border-color: $base-color !important; +} + +// 圆角 +.border-radius { + border-radius: $border-radius !important; +} + +.uni-tag--inverted { + border-color: $color-line !important; + color: $color-title !important; +} + +// ***************商品详情*************** +//商品详情,优惠券弹出层,项 +// .goods-coupon-popup-layer .coupon-body .item { +// background-color: lighten($base-color, 45%) !important; +// view { +// color: lighten($base-color, 10%) !important; +// } +// } + +// 商品详情加入购物车背景色 +.color-join-cart { + background-color: $base-help-color !important; +} + +// 商品详情,sku选中 +.sku-layer .body-item .sku-list-wrap { + .items { + // background-color: #f5f5f5 !important; + &.selected { + // background-color: lighten($base-color, 35%) !important; + // background-color: lighten($base-color, 45%) !important; + color: $base-color !important; + border-color: $base-color !important; + } + &.disabled { + color: $color-sub !important; + cursor: not-allowed !important; + pointer-events: none !important; + opacity: 0.5 !important; + box-shadow: none !important; + filter: grayscale(100%); + } + } +} + +.goods-detail .goods-coupon-popup-layer .coupon-info button { + // background: linear-gradient(to right, #ff4544, lighten(#ff4544, 10%)); + // background: linear-gradient(to right, $base-color, lighten($base-color, 10%)); +} + +// 秒杀商品详情 +.goods-detail .seckill-wrap { + // background: linear-gradient(to right, $base-color, lighten($base-color, 20%)) !important; +} + +.goods-detail .goods-module-wrap .original-price .seckill-save-price { + // background: lighten($base-color, 40%) !important; + color: $base-color !important; +} + +// 拼团商品详情 +.goods-detail .goods-pintuan { + background: rgba($base-color, 0.2); + .price-info { + // background: linear-gradient(to right, $base-color, lighten($base-color, 10%)) !important; + } +} + +// 预售商品详情 +.goods-detail .presale-rule { + .process-item .number { + background: rgba($base-color, 0.2); + } +} + +// 专题商品详情 +.goods-detail .topic-wrap .price-info { + // background: linear-gradient(to right, $base-color, #ff7877) !important; +} + +// 团购商品详情 +.goods-detail .goods-groupbuy { + background: rgba($base-color, 0.2); + .price-info { + // background: linear-gradient(to right, $base-color, lighten($base-color, 10%)) !important; + } +} + +// 商品详情优惠券 +.newdetail .coupon .coupon-item { + &::after, + &::before { + border-color: $base-color !important; + } +} + +// 商品详情,数量加减 +.sku-layer .body-item .number-wrap .number { + button, + input { + border-color: rgba(229, 229, 229, 0.5) !important; + background-color: rgba(229, 229, 229, 0.4) !important; + } +} + +// ***************订单*************** +// 订单列表按钮样式 +.order-box-btn { + &.order-pay { + background: $base-color; + } +} + +.ns-gradient-otherpages-fenxiao-apply-apply-bg { + // background: linear-gradient(to left, $base-color, lighten($base-color, 20%)); +} + +.ns-gradient-otherpages-member-widthdrawal-withdrawal { + // background: linear-gradient(to left, $base-color, lighten($base-color, 20%)); +} + +.ns-gradient-otherpages-member-balance-balance-rechange { + // background: linear-gradient(to bottom, $base-color, #fd7e4b); +} + +.ns-gradient-pages-member-index-index { + // background: linear-gradient(to left, lighten($base-color, 10%), darken($base-color, 1%)); +} + +.ns-gradient-promotionpages-pintuan-share-share { + // background-image: linear-gradient(to right, mix($base-color, #fff), $base-color); +} + +.ns-gradient-promotionpages-payment { + // background: linear-gradient(to right, mix($base-color, #fff), $base-color) !important; +} + +.ns-gradient-promotionpages-pintuan-payment { + background: rgba($base-color, 0.08) !important; +} + +.ns-gradient-diy-goods-list { + border-color: rgba($base-color, 0.2) !important; +} + +.ns-gradient-detail-coupons-right-border { + border-right-color: rgba($base-color, 0.2) !important; +} + +.ns-gradient-detail-coupons { + background-color: rgba($base-color, 0.8) !important; +} + +.ns-pages-goods-category-category { + // background-image: linear-gradient(135deg, $base-color, #ff7444) !important; +} + +.ns-gradient-pintuan-border-color { + border-color: rgba($base-color, 0.2) !important; +} + +.goods-list.single-column .pro-info button, +.goods-list.single-column .pro-info .buy-btn { + // background: linear-gradient(to right, mix($base-color, #fff), $base-color) !important; +} + +.goods-list.single-column .pintuan-info .pintuan-num { + // background: mix($base-color, #fff, 30%) !important; +} +.goods-list.single-column .pintuan-info .pinfan-num { + // background: mix($base-color, #fff, 10%) !important; +} + +.order-box-btn { + display: inline-block; + line-height: 56rpx; + padding: 0 30rpx; + font-size: 26rpx; + color: $color-title; + border: 1.5px solid #999; + box-sizing: border-box; + border-radius: 60rpx; + margin-left: $margin-both; + &.order-pay { + color: #fff; + border-color: #fff; + } + &.color-base-bg { + color: #fff; + } +} + +// ***************余额*************** +// 余额背景色渐变 +.balance-wrap { + // background: linear-gradient(to right, $base-color, mix($base-color, #fff, 70%)) !important; +} + +.color-base-text-light { + // color: mix($base-color, #fff, 50%) !important; +} +//瓜分红包规则背景 +.ns-rule-bg { + background: rgba(#fff, 0.1) !important; +} + +// 解决uni.showModal弹窗标题继承父级样式 +uni-modal .uni-modal__hd { + font-size: 36rpx; +} + +// 解决弹框的字体大小 +uni-toast { + .uni-simple-toast__text { + font-size: 26rpx; + padding: 20rpx 40rpx; + border-radius: 10rpx; + } + .uni-toast { + width: 200rpx; + } + .uni-icon_toast.uni-loading { + margin: 40rpx 0 0; + width: 76rpx; + height: 76rpx; + } + .uni-toast__content { + font-size: 28rpx; + margin: 0 0 30rpx; + } +} + +.iconfont { + font-size: 32rpx; +} + +/* 兼容苹果X以上的手机样式 */ +.iphone-x { + /* padding-bottom: 68rpx !important; */ + padding-bottom: constant(safe-area-inset-bottom); + padding-bottom: env(safe-area-inset-bottom); +} + +.iphone-x-fixed { + bottom: 68rpx !important; +} + +// ***************其他*************** +/* 隐藏滚动条 */ +::-webkit-scrollbar { + width: 0; + height: 0; + color: transparent; +} + +scroll-view ::-webkit-scrollbar { + width: 0; + height: 0; + background-color: transparent; +} + +/deep/::-webkit-scrollbar { + width: 0; + height: 0; + background-color: transparent; + display: none; +} + +/* 单行超出隐藏 */ +.using-hidden { + word-break: break-all; + text-overflow: ellipsis; + overflow: hidden; + display: -webkit-box; + -webkit-line-clamp: 1; + -webkit-box-orient: vertical; + white-space: break-spaces; +} +/* 多行超出隐藏 */ +.multi-hidden { + word-break: break-all; + text-overflow: ellipsis; + overflow: hidden; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; +} + +// 价格样式 +.price-color{ + color: var(--price-color)!important; +} +.price-style{ + font-family: 'myFont','-apple-system', 'BlinkMacSystemFont', 'Helvetica Neue', 'Helvetica', 'Segoe UI', 'Arial', 'Roboto', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft Yahei','sans-serif'; + // font-family: 'PingFang SC', 'Roboto Medium'; + color: var(--price-color)!important; + font-weight: 500!important; + &.large{ + font-size: 32rpx!important; + } + &.small{ + font-size: 24rpx!important; + } +} + +.price-font{ + font-family: 'myFont','-apple-system', 'BlinkMacSystemFont', 'Helvetica Neue', 'Helvetica', 'Segoe UI', 'Arial', 'Roboto', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft Yahei','sans-serif'; + // font-family: 'PingFang SC', 'Roboto Medium'; + font-weight: 500!important; +} + +/deep/ .reward-popup .uni-popup__wrapper-box { + background: none !important; + max-width: unset !important; + max-height: unset !important; + overflow: unset !important; +} \ No newline at end of file diff --git a/common/css/order_parment.scss b/common/css/order_parment.scss new file mode 100644 index 0000000..29d68c1 --- /dev/null +++ b/common/css/order_parment.scss @@ -0,0 +1,1418 @@ +@mixin wrap { + margin: 20rpx 24rpx 0; + border-radius: 0; + background: #fff; + padding: 30rpx 24rpx; + border-radius: 16rpx; +} + +$margin-both: 24rpx; + +input, +view { + font-size: $font-size-tag; +} + +.font-bold { + font-weight: bold; +} + +.order-container { + width: 100vw; + height: 100vh; + display: flex; + flex-direction: column; + background: linear-gradient(180deg, $base-color 10%, $color-bg 100%); + background-size: 100% 260rpx; + background-repeat: no-repeat; + + // #ifdef MP-WEIXIN + background-size: 100% 380rpx; + // #endif + + .order-scroll-container { + width: 100%; + height: 0; + flex: 1; + } + + // #ifdef H5 + .payment-navbar-block { + height: 60rpx; + } + // #endif +} + +.payment-navbar { + width: 100vw; + padding-bottom: 20rpx; + display: flex; + align-items: center; + justify-content: center; + position: fixed; + left: 0; + top: 0; + z-index: 100; + background: linear-gradient(180deg, $base-color 10%, $color-bg 100%); + background-size: 100% 260rpx; + + // #ifdef MP-WEIXIN + background-size: 100% 380rpx; + // #endif + + .navbar-title { + color: #fff; + font-size: 32rpx; + } +} + +.payment-navbar-block { + padding-bottom: 20rpx; +} + +.mobile-wrap { + @include wrap; + .tips { + font-size: $font-size-goods-tag; + margin-bottom: 30rpx; + background: var(--main-color-shallow); + border-radius: $border-radius; + padding: 20rpx 30rpx; + line-height: 1; + display: flex; + align-items: center; + .iconfont{ + margin-right: 5rpx; + } + } + &.local-mobile{ + border-bottom: 2rpx solid #F4F4F6; + margin: 0; + } + &.store-mobile{ + border-top: 2rpx solid #F4F4F6; + margin: 20rpx 0 0 0; + padding: 20rpx 0; + border-radius: 0; + } + .form-group { + display: flex; + align-items: center; + width: 100%; + .iconfont { + margin-right: 26rpx; + font-size: $font-size-toolbar; + } + .text { + display: inline-block; + line-height: 50rpx; + padding-right: 10rpx; + font-size: $font-size-base; + font-weight: bold; + } + + .placeholder { + line-height: 50rpx; + } + + .input { + flex: 1; + height: 50rpx; + line-height: 50rpx; + text-align: right; + font-size: $font-size-base; + } + } +} + +.order-cell { + display: flex; + margin: 0 0 30rpx 0; + align-items: center; + background: #fff; + line-height: 40rpx; + position: relative; + + &.clear-flex { + display: block; + } + &.textarea-box{ + display: flex; + align-items: baseline; + font-size: 28rpx; + + } + text { + font-size: 28rpx; + } + .tit { + text-align: left; + font-size: $font-size-base; + min-width: 160rpx; + color: #000; + font-weight: bold; + text { + font-size: $font-size-base; + } + .tit-content{ + max-width: 540rpx; + font-size: 24rpx; + line-height: 35rpx; + margin-bottom: 10rpx; + } + } + + .box { + flex: 1; + padding: 0 10rpx; + line-height: inherit; + text-align: right; + &.text-overflow { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + .money { + overflow: hidden; + max-width: 40%; + display: inline-block; + text-overflow: ellipsis; + vertical-align: top; + + } + } + + .icon-right{ + color: #303133; + margin-left: 20rpx; + } + .operator { + font-size: $font-size-tag; + margin-right: 6rpx; + font-weight: bold; + color: var(--price-color); + } + textarea{ + width: auto; + height: 60px; + font-size: 28rpx; + } + } + + .iconfont { + color: $color-tip; + line-height: initial; + font-size: $font-size-tag; + } + + .unit { + margin-right: 4rpx; + font-weight: bold; + font-size: 28rpx !important; + margin-left: 4rpx; + color: var(--price-color); + } + .money { + font-size: 28rpx !important; + font-weight: bold; + color: var(--price-color); + } +} + +.site-wrap { + @include wrap; + padding: 40rpx 0; + &.order-goods{ + padding: 0; + } + .site-body { + margin: 0 $margin-both; + .goods-item { + border-bottom: 2rpx solid #F4F4F6; + &:last-child { + border-bottom: 0; + } + + .error-tips { + color: #ff443f; + padding: 10rpx 20rpx; + display: inline-flex; + align-items: center; + line-height: 1; + background: #ffecec; + margin-top: 20rpx; + border-radius: 12rpx; + width: auto; + + .iconfont { + margin-right: 10rpx; + } + } + } + .goods-wrap { + display: flex; + position: relative; + padding: 30rpx 0; + + .goods-img { + width: 180rpx; + height: 180rpx; + margin-right: 20rpx; + border-radius: $border-radius; + overflow: hidden; + image { + width: 100%; + height: 100%; + border-radius: $border-radius; + } + } + + .goods-info { + flex: 1; + position: relative; + width: 0; + margin-top: -4rpx; + display: flex; + flex-direction: column; + justify-content: space-between; + + .goods-name { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; + line-height: 1.5; + font-size: $font-size-base; + font-weight: bold; + } + + .sku { + display: flex; + line-height: 1; + margin-top: 8rpx; + + .goods-spec { + color: $color-tip; + font-size: $font-size-goods-tag; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + flex: 1; + display: flex; + view{ + background-color: #F4F4F4; + color: #666666; + padding: 6rpx 10rpx; + margin-right: 12rpx; + line-height: 1; + } + } + } + + .goods-sub-section { + .unit { + font-size: $font-size-tag; + margin-right: 4rpx; + font-weight: bold; + color: var(--price-color); + } + + .goods-price { + font-weight: bold; + font-size: $font-size-toolbar; + color: var(--price-color); + } + + view { + &:first-of-type { + width: 80%; + overflow: hidden; + text-overflow: ellipsis; + } + + &:last-of-type { + text-align: right; + position: absolute; + right: 0; + bottom: 0; + font-weight: bold; + } + } + } + } + } + } + + .site-footer { + margin: 0 $margin-both 0; + .order-cell { + &:last-of-type { + margin-bottom: 0; + } + } + } +} + +/deep/ .goods-form { + display: flex; + align-items: center; + position: relative; + + ns-form { + display: flex; + width: 100%; + } + + .shade { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + z-index: 5; + } + + .cell-more { + margin-left: 50rpx; + float: right; + color: #909399; + font-size: 24rpx; + } + + .form-wrap { + flex: 1; + width: 0; + + .icon-right { + display: none; + } + } + .form-wrap > view, .form-wrap > picker { + display: none; + } + .form-wrap > view:first-child, .form-wrap > picker:first-child { + display: block; + border-bottom: none; + + .required { + display: none; + } + } + .order-cell .name { + width: auto; + } + .order-cell .tit { + font-weight: bold; + } + .order-cell .tit:after { + content: ":"; + } +} + +.member-goods-card { + margin-bottom: 0; + padding-bottom: 30rpx; + + .text { + margin-right: 10rpx; + color: #999; + } + + .price-font { + color: var(--price-color); + } +} + +.order-money { + @include wrap; + .order-cell:last-child { + margin-bottom: 0; + } +} +.error-message{ + position: fixed; + z-index: 5; + left: 0; + bottom: 100rpx; + width: 100vw; + background: #f6f6cb; + text-align: left; + padding: 10rpx 20rpx; + color: #FF0000; +} +.order-submit { + position: fixed; + z-index: 5; + left: 0; + bottom: 0; + width: 100vw; + height: 100rpx; + background: #fff; + text-align: right; + display: flex; + align-items: center; + padding-bottom: constant(safe-area-inset-bottom); + padding-bottom: env(safe-area-inset-bottom); + + .order-settlement-info { + flex: 1; + height: 100rpx; + line-height: 100rpx; + display: flex; + padding-left: 30rpx; + align-items: baseline; + .unit { + font-weight: bold; + font-size: $font-size-tag; + margin-right: 4rpx; + color: var(--price-color); + } + .money { + font-weight: bold; + font-size: $font-size-toolbar; + color: var(--price-color); + } + } + + .submit-btn { + height: 80rpx; + margin: 0 30rpx; + display: flex; + justify-content: center; + align-items: center; + button { + line-height: 70rpx; + width: 180rpx; + height: 70rpx; + padding: 0; + font-size: $font-size-base; + font-weight: bold; + } + .no-submit{ + width: unset; + background-color: rgb(204, 204, 204); + color: #FFFFFF; + padding: 0 20rpx; + font-size: $font-size-base; + } + } +} +.order-submit-block { + height: 120rpx; + padding-bottom: constant(safe-area-inset-bottom); + padding-bottom: env(safe-area-inset-bottom); +} + +.popup { + width: 100vw; + background: #fff; + border-top-left-radius: 24rpx; + border-top-right-radius: 24rpx; + + .popup-header { + display: flex; + border-bottom: 2rpx solid $color-line; + position: relative; + padding: 40rpx; + + .tit { + flex: 1; + font-size: $font-size-toolbar; + line-height: 1; + text-align: center; + } + .iconfont { + line-height: 1; + position: absolute; + right: 30rpx; + top: 50%; + transform: translate(0, -50%); + color: $color-tip; + font-size: $font-size-toolbar; + } + } + + .popup-body { + height: calc(100% - 250rpx); + &.store-popup { + height: calc(100% - 120rpx); + } + &.safe-area { + height: calc(100% - 270rpx); + } + &.store-popup.safe-area { + height: calc(100% - 140rpx); + } + } + + .popup-footer { + height: 120rpx; + + .confirm-btn { + height: 80rpx; + line-height: 80rpx; + color: #fff; + text-align: center; + margin: 20rpx 32rpx 40rpx; + border-radius: $border-radius; + font-size: $font-size-base; + &.color-base-bg{ + color: var(--btn-text-color); + } + } + + &.bottom-safe-area { + padding-bottom: constant(safe-area-inset-bottom); + padding-bottom: env(safe-area-inset-bottom); + } + } +} + +.invoice-popup { + height: 83vh; + padding: 18rpx 0; + box-sizing: border-box; + position: relative; + + .invoice-close { + position: absolute; + line-height: 1; + top: 48rpx; + right: 48rpx; + font-size: $font-size-toolbar; + z-index: 9; + } + .popup-body { + .invoice-cell { + padding: 30rpx 0; + border-top: 2rpx solid $color-line; + margin: 0 48rpx; + + &:first-of-type { + border-top: none; + } + + .tit { + font-size: $font-size-base; + } + + .option-grpup { + padding-top: 20rpx; + + .option-item { + height: 54rpx; + line-height: 54rpx; + display: inline-block; + font-size: $font-size-goods-tag; + padding: 0 36rpx; + background: $color-bg; + border: 2rpx solid $color-line; + border-radius: $border-radius; + margin-right: 30rpx; + + &.active { + color: var(--btn-text-color); + } + &.content { + margin-bottom: 20rpx; + &:last-child { + margin-bottom: 0; + } + } + } + } + + .invoice-form-group { + input { + background: $color-bg; + border-radius: 10rpx; + height: 66rpx; + margin-top: 22rpx; + padding: 0 32rpx; + font-size: $font-size-tag; + } + } + } + .invoice-tops { + font-size: $font-size-activity-tag; + margin: 0 48rpx; + color: $color-tip; + } + } +} + + +.buyermessag-popup { + box-sizing: border-box; + position: relative; + + .buyermessag-close { + position: absolute; + line-height: 1; + top: 48rpx; + right: 48rpx; + font-size: $font-size-toolbar; + z-index: 9; + } + .popup-body { + .buyermessag-cell { + padding: 30rpx 0; + border-top: 2rpx solid $color-line; + margin: 0 32rpx; + + &:first-of-type { + border-top: none; + } + .buyermessag-form-group{ + textarea{ + display: flex; + align-items: baseline; + font-size: 28rpx; + width: 100%; + background-color: $color-bg; + padding: 20rpx; + box-sizing: border-box; + border-radius: 10rpx; + } + } + + + } + + } +} + + +.coupon-popup { + height: 65vh; + + .popup-body { + background: #fff; + } + + .coupon-item { + @include wrap; + margin: $margin-updown 32rpx 0; + padding: 0; + position: relative; + background-color: #fff2f0; + &:before, + &:after { + position: absolute; + content: ''; + background-color: #fff; + top: 50%; + width: 30rpx; + height: 30rpx; + border-radius: 50%; + z-index: 5; + } + &:before { + left: 0; + transform: translate(-50%, -50%); + } + &:after { + right: 0; + transform: translate(50%, -50%); + } + + .coupon-info { + height: 190rpx; + display: flex; + width: 100%; + position: relative; + + .info-wrap { + width: 220rpx; + height: 190rpx; + display: flex; + justify-content: center; + align-items: center; + margin-right: 20rpx; + background-repeat: no-repeat; + background-size: 100% 100%; + position: relative; + background: linear-gradient(to left, var(--bg-color), var(--bg-color-shallow)); + .coupon-line{ + position: absolute; + right: 0; + top: 0; + height: 100%; + } + .coupon-money { + color: #fff; + text-align: center; + line-height: 1; + .unit { + font-size: 30rpx; + } + .money { + font-size: 60rpx; + } + } + .at-least { + font-size: $font-size-tag; + color: #fff; + text-align: center; + margin-top: 20rpx; + } + } + + .desc-wrap { + flex: 1; + max-width: calc(100% - 360rpx); + + view { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .coupon-name { + margin-top: 10rpx; + margin-bottom: 4rpx; + font-size: $font-size-base; + } + .limit { + font-size: $font-size-activity-tag; + } + .time { + border-top: 2rpx dashed $color-disabled; + position: absolute; + bottom: 30rpx; + color: $color-tip; + padding-top: 10rpx; + line-height: 1.5; + font-size: $font-size-activity-tag; + } + } + + .iconfont { + font-size: 44rpx; + position: absolute; + top: 50%; + right: 20rpx; + transform: translate(-50%, -50%); + } + .icon-yuan_checkbox { + color: $color-tip; + } + } + } +} + +.promotion-popup { + height: 40vh; + + .order-cell { + margin: 30rpx 30rpx; + + .tit { + width: auto; + min-width: unset; + } + + .promotion-mark { + padding: 4rpx 10rpx; + line-height: 1; + border-radius: $border-radius; + font-size: $font-size-tag; + margin-right: 10rpx; + color: var(--main-color); + background-color: var(--main-color-shallow); + } + } +} + +.delivery-popup { + height: 80vh; + box-sizing: border-box; + + .delivery-content { + height: 100%; + overflow-y: scroll; + padding: 30rpx 0; + box-sizing: border-box; + + .item-wrap { + padding: 20rpx 0; + box-sizing: border-box; + border-top: 2rpx solid $color-line; + display: flex; + justify-content: space-between; + align-items: center; + margin: 0 48rpx; + .detail { + width: 90%; + .name { + display: flex; + text { + font-size: $font-size-base; + } + } + .info { + line-height: 1.2; + view { + font-size: $font-size-tag; + } + } + } + + .icon { + flex: 1; + text-align: right; + max-height: 50rpx; + .iconfont { + line-height: 1; + font-size: 44rpx; + } + } + + &:first-of-type { + padding-top: 0; + border-top: none; + } + } + .empty { + text-align: center; + font-size: $font-size-tag; + } + } +} + +.balance-switch { + transform: scale(0.8); +} + +// 收货地址 +.address-box { + margin: 0 24rpx 0; + background-color: #fff; + position: relative; + overflow: hidden; + border-bottom-left-radius: 16rpx; + border-bottom-right-radius: 16rpx; + padding: 30rpx 24rpx; + + &.not-delivery-type { + border-radius: 16rpx; + } + + .address-line{ + position: absolute; + bottom: 0rpx; + left: 0; + width: 100%; + height: 6rpx; + } + .info-wrap { + display: flex; + align-items: center; + + &.local { + padding-bottom: 20rpx; + } + .content { + flex: 1; + .name { + margin-right: 10rpx; + font-weight: bold; + font-size: 28rpx; + } + .mobile { + font-weight: bold; + font-size: 28rpx; + } + } + .desc-wrap { + word-break: break-word; + font-size: 26rpx; + color: #666; + } + } + .icon-wrap { + width: 24rpx; + height: 42rpx; + position: relative; + margin-right: 26rpx; + align-self: flex-start; + padding-top: 6rpx; + &.empty{ + padding-top: 0; + } + .iconfont { + font-size: $font-size-toolbar; + display: inline-block; + vertical-align: middle; + } + } + .empty-wrap { + height: 80rpx; + line-height: 80rpx; + display: flex; + align-items: center; + + .info { + flex: 1; + font-size: $font-size-base; + } + } + .cell-more { + margin-left: 50rpx; + float: right; + color: $color-tip; + font-size: $font-size-tag; + .iconfont{ + color: $color-tip; + } + } + .local-delivery-store { + display: flex; + align-items: center; + padding-bottom: 20rpx; + margin-bottom: 20rpx; + border-bottom: 2rpx solid #eeeeee; + + .info { + flex: 1; + width: 0; + font-size: 28rpx; + } + .store-name { + color: $base-color; + margin: 0 10rpx; + } + .cell-more { + font-size: 28rpx; + display: flex; + align-items: center; + } + .icon-right { + float: right; + color: #909399; + font-size: 24rpx + } + } +} + +// 外卖配送 +.local-box { + border-top: 2rpx solid $color-line; + .order-cell { + padding-top: 30rpx; + margin-bottom: 0; + + .box { + padding: 0; + } + } + .pick-block { + padding-top: 20rpx; + display: flex; + align-items: center; + + > view { + flex: 1; + } + .title { + font-weight: bold; + } + + .time-picker { + display: flex; + align-items: center; + justify-content: flex-end; + .cell-more { + float: right; + margin-left: 10rpx; + color: $color-tip; + font-size: $font-size-tag; + .iconfont{ + color: $color-tip; + } + } + text { + white-space: nowrap; + } + } + } +} + +// 配送方式 +.delivery-mode { + margin: 0 24rpx; + overflow: hidden; + border-top-left-radius: 16rpx; + border-top-right-radius: 16rpx; + background-color: $base-color; + + .action { + display: flex; + background: var(--base-color-light-7); + + > view { + flex: 1; + text-align: center; + height: 76rpx; + line-height: 76rpx; + font-size: 30rpx; + color: #000; + position: relative; + + &:nth-child(2), &:nth-child(3) { + &.active { + border-top-left-radius: 16rpx; + } + } + + .out-radio:after,.out-radio:before { + position: absolute; + content: ""; + width: 20rpx; + height: 20rpx; + background-color: #fff; + bottom: 0px; + display: none; + } + + .out-radio:after { + transform: translateX(100%); + right: 0; + } + .out-radio:before { + left: 0; + transform: translateX(-100%); + } + } + + .active { + background: #fff; + color: $base-color; + border-top-right-radius: 16rpx; + + &:after, &:before { + position: absolute; + content: ""; + width: 40rpx; + height: 40rpx; + background-color: var(--base-color-light-7); + bottom: 0px; + transform: translateX(100%); + border-radius: 50%; + z-index: 5; + } + &:after{ + transform: translateX(100%); + right: 0; + } + &:before { + left: 0; + transform: translateX(-100%); + } + .out-radio:after,.out-radio:before { + display: block; + } + } + } +} + +// 门店自提 +.store-box { + position: relative; + padding: 30rpx 24rpx; + margin: 0 24rpx 0; + background-color: #fff; + border-bottom-left-radius: 16rpx; + border-bottom-right-radius: 16rpx; + overflow: hidden; + + &.not-delivery-type { + border-radius: 16rpx; + } + + .address-line{ + position: absolute; + bottom: 0px; + left: 0; + width: 100%; + height: 6rpx; + } + .store-info { + display: flex; + align-items: baseline; + .icon { + position: relative; + margin-right: 12rpx; + align-self: flex-start; + margin-top: -2rpx; + &.img { + background-color: unset; + margin-right: 8rpx; + width: 46rpx; + height: 46rpx; + border-radius: 50%; + margin-top: 12rpx; + image { + width: 100%; + height: 100%; + } + } + .iconfont { + font-size: $font-size-toolbar; + } + } + .store-address-info{ + width: 100%; + display: flex; + align-items: center; + .info-wrap { + flex: 1; + width: 0; + .title { + margin-bottom: 10rpx; + font-size: $font-size-base; + font-weight: bold; + .cell-more { + float: right; + margin-left: 50rpx; + color: $color-tip; + font-size: 24rpx; + font-weight: 500; + } + } + .store-detail view { + word-break: break-word; + font-size: 26rpx; + } + .store-detail{ + .address{ + color: $color-sub; + width: 100%; + overflow:hidden; + white-space: nowrap; + text-overflow: ellipsis; + -o-text-overflow:ellipsis; + } + } + } + .cell-more{ + color: $color-tip; + } + } + + } + + .empty { + text-align: center; + } + .store-time{ + border-top:2rpx solid #F4F4F6; + display: flex; + align-items: center; + justify-content: space-between; + padding: 20rpx 0 0; + box-sizing: border-box; + view{ + font-size: 28rpx; + } + .left { + font-weight: bold; + } + .right{ + display: flex; + align-items: center; + line-height: 1; + .iconfont{ + font-size: 24rpx; + margin-left: 14rpx; + color: #909399; + } + } + } +} + +.buyer-message { + padding: 30rpx 24rpx; + + .order-cell { + margin-bottom: 0; + } +} + +.member-card-wrap { + background-color: #FFFBF4; + padding: 0 30rpx!important; + + .head { + display: flex; + align-items: center; + height: 80rpx; + } + + .icon-yuan_checked,.icon-yuan_checkbox { + font-size: 32rpx; + } + + .icon-huiyuan { + margin-right: 10rpx; + line-height: 1; + font-size: 36rpx; + background-image:linear-gradient(156deg, #814635 0%, #3A221B 100%); + -webkit-background-clip:text; + -webkit-text-fill-color:transparent; + } + + .info{ + text-align: left; + flex: 1; + color: #e5ce75; + font-size: $font-size-tag; + color: #333; + } + + .body { + display: flex; + overflow-x: scroll; + padding: 10rpx 0 20rpx 0; + + .item { + padding: 20rpx 0 30rpx 0; + width: calc((100% - 60rpx) / 4); + text-align: center; + background: #fff; + margin-right: 20rpx; + border: 4rpx solid #fff; + border-radius: 10rpx; + position: relative; + overflow: hidden; + + .icon-icon { + position: absolute; + right: 0; + bottom: 0; + font-size: 32rpx; + display: none; + line-height: 1; + } + &:last-child{ + margin-right: 0; + } + + .title { + margin-top: 20rpx; + font-weight: bold; + } + + .price { + margin-top: 10rpx; + } + } + + .active .icon-icon { + display: block; + } + } +} + +.system-form-wrap { + @include wrap; + padding: 0; + overflow: hidden; + + .order-cell { + padding: 30rpx 24rpx; + margin-bottom: 0; + border-bottom: 2rpx solid #F4F4F6; + } + + /deep/ .form-wrap { + margin: 0 24rpx; + + .icon-right { + color: #909399; + font-size: 24rpx; + } + } +} + +.agreement { + margin: 20rpx $margin-both 0; + + text { + color: $base-color; + } +} + +.agreement-conten-box { + background: #fff; + padding:30rpx 30rpx; + + .title { + text-align: center; + margin-bottom: 20rpx; + font-weight: bolder; + } + .close { + position: absolute; + right: 30rpx; + top: 10rpx; + } + .con { + height: 60vh; + } +} +.icon{ + line-height: 1; + margin-right: 14rpx; + max-height: 50rpx; +} +.icon image{ + width: 38rpx; + margin: -6rpx auto; + max-height: 50rpx; +} + +.form-popup { + height: 60vh!important; + .popup-body { + padding: 20rpx 30rpx; + box-sizing: border-box; + } +} + +.goods-card-popup { + .card-item { + display: flex; + padding: 30rpx; + background: var(--base-color-light-9); + margin: 24rpx 20rpx; + border-radius: 18rpx; + + .content { + flex: 1; + width: 0; + margin-right: 30rpx; + + .title { + line-height: 40rpx; + font-size: 28rpx; + font-weight: 600; + } + + .info text { + line-height: 1; + font-size: 24rpx; + color: #666666; + margin-top: 20rpx; + margin-right: 8rpx; + display: inline-block; + } + } + + .iconfont { + font-size: 44rpx; + } + .icon-yuan_checkbox { + color: $color-tip; + } + } +} \ No newline at end of file diff --git a/common/js/auth.js b/common/js/auth.js new file mode 100644 index 0000000..d17513a --- /dev/null +++ b/common/js/auth.js @@ -0,0 +1,64 @@ +export default { + data() { + return { + authInfo: {} + } + }, + methods: { + /** + * 获取用户登录凭证code + */ + getCode(callback) { + // 微信小程序 + // #ifdef MP-WEIXIN + uni.login({ + provider: 'weixin', + timeout: 3000, + success: res => { + if (res.code) { + this.$api.sendRequest({ + url: '/weapp/api/weapp/authcodetoopenid', + data: { + code: res.code + }, + success: res => { + if (res.code >= 0) { + if (res.data.openid) this.authInfo.weapp_openid = res.data.openid; + if (res.data.unionid) this.authInfo.wx_unionid = res.data.unionid; + typeof callback == 'function' && callback(this.authInfo); + } else { + this.$util.showToast({ + title: res.message ? res.message : '小程序配置错误' + }); + } + } + }) + } + }, + fail: () => { + this.$util.showToast({ + title: '请求失败' + }); + } + }) + // #endif + + // #ifdef H5 + if (this.$util.isWeiXin()){ + this.$api.sendRequest({ + url: '/wechat/api/wechat/authcode', + data: { + redirect_url: location.href, + scopes: 'snsapi_userinfo' + }, + success: res => { + if (res.code >= 0) { + location.href = res.data; + } + } + }); + } + // #endif + } + } +} \ No newline at end of file diff --git a/common/js/config.js b/common/js/config.js new file mode 100644 index 0000000..543e393 --- /dev/null +++ b/common/js/config.js @@ -0,0 +1,16 @@ +var config = { + // api请求地址 + baseUrl: '', + // 图片域名 + imgDomain: '', + // H5端域名 + h5Domain: '', + // 腾讯地图key + mpKey: '', + //客服地址 + webSocket : '', + //本地端主动给服务器ping的时间, 0 则不开启 , 单位秒 + pingInterval: 1500 +}; + +export default config; \ No newline at end of file diff --git a/common/js/diy.js b/common/js/diy.js new file mode 100644 index 0000000..f25185d --- /dev/null +++ b/common/js/diy.js @@ -0,0 +1,368 @@ +import WxMap from 'common/js/map-wx-jssdk.js'; + +let systemInfo = uni.getSystemInfoSync(); +export default { + data() { + return { + diyData: { + global: { + title: '', + popWindow: { + imageUrl: '', + count: -1, + link: {}, + imgWidth: '', + imgHeight: '' + } + } + }, + memberId: 0, + name: '', + isDefault: '', + + store: {}, //首页展示的门店详情 + storeId: 0, //首页展示的门店id + + pageHeight: '0', + headerHeight: '0', + bottomHeight: '0', + topIndexValue: null, + statusBarHeight: systemInfo.statusBarHeight, + collectTop: 44, + showTip: false, + mpCollect: false, + mpShareData: null, //小程序分享数据 + scrollTop: 0, // 滚动位置 + paddingTop: (44 + systemInfo.statusBarHeight) + 'px', + marginTop: -(44 + systemInfo.statusBarHeight) + 'px', + pullDownRefresh: true, //下拉刷新 + followOfficialAccount: null, // 关注公众号组件 + isLoad: false // 检测是否刷新 + }; + }, + onLoad(data) { + uni.hideTabBar(); + this.name = data.name || ''; + this.isDefault = data.is_default || ''; + + if (data.source_member) uni.setStorageSync('source_member', data.source_member); + + // 小程序扫码进入 + if (data.scene) { + var sceneParams = decodeURIComponent(data.scene); + sceneParams = sceneParams.split('&'); + if (sceneParams.length) { + sceneParams.forEach(item => { + if (item.indexOf('m') != -1) uni.setStorageSync('source_member', item.split('-')[1]); + }); + } + } + + }, + onShow() { + if (uni.getStorageSync('token')) { + this.$util.getMemberId().then(resolve => { + this.memberId = resolve; + }); + } + + this.store = uni.getStorageSync('store') ? uni.getStorageSync('store') : null; + if (this.store) this.storeId = this.store.store_id; + + this.getDiyInfo(); + this.getHeight(); + + //记录分享关系 + if (uni.getStorageSync('token') && uni.getStorageSync('source_member')) { + this.$util.onSourceMember(uni.getStorageSync('source_member')); + } + + //小程序分享 + // #ifdef MP-WEIXIN + this.$util.getMpShare().then(res => { + this.mpShareData = res; + }); + // #endif + + }, + computed: { + bgColor() { + let str = ''; + if (this.diyData && this.diyData.global) { + str = this.diyData.global.pageBgColor; + } + return str; + }, + bgImg() { + let str = ''; + if (this.diyData && this.diyData.global) { + str = this.diyData.global.topNavBg ? 'url(' + this.$util.img(this.diyData.global.bgUrl) + ')' : this + .diyData.global.pageBgColor; + } + return str; + }, + bgUrl() { + let str = ''; + if (this.diyData && this.diyData.global) { + str = this.diyData.global.topNavBg ? 'transparent' : this.diyData.global.bgUrl; + } + return str; + }, + bgNav() { + if (this.diyData.global.topNavColor) { + return { + background: this.diyData.global.topNavColor + }; + } else { + return { + background: '#ffffff' + }; + } + }, + backgroundUrl() { + var str = this.diyData.global.bgUrl && this.diyData.global.bgUrl != 'transparent' ? 'url(' + this.$util.img( + this.diyData.global.bgUrl) + ') ' : ''; + return str; + }, + textNavColor() { + if (this.diyData && this.diyData.global && this.diyData.global.textNavColor) { + return this.diyData.global.textNavColor; + } else { + return '#ffffff'; + } + }, + openBottomNav() { + let str = false; + if (this.diyData && this.diyData.global) { + str = this.diyData.global.openBottomNav; + } + return str; + }, + globalS() { + return this.diyData.global; + }, + //计算首页弹框的显示宽高 + popWindowStyle() { + // 做大展示宽高 + let max_width = 290; + let max_height = 410; + // 参照宽高 + let refer_width = 290; + let refer_height = 290; + + let scale = this.diyData.global.popWindow.imgHeight / this.diyData.global.popWindow.imgWidth; + let width, height; + if (scale < refer_height / refer_width) { + width = max_width; + height = width * scale; + } else { + height = max_height; + width = height / scale; + } + + let obj = ''; + if (this.diyData.global.popWindow && this.diyData.global.popWindow.count != -1 && this.diyData.global + .popWindow.imageUrl) { + obj += 'height:' + (height * 2) + 'rpx;'; + obj += 'width:' + (width * 2) + 'rpx;'; + } + return obj; + }, + scrollHeight() { + if (this.pageHeight != undefined && this.headerHeight != undefined && this.bottomHeight != undefined) { + return 'calc(' + this.pageHeight * 2 + 'rpx - ' + this.headerHeight + ' - ' + this.bottomHeight + ')'; + } else { + return '100vh'; + } + }, + scrollTopHeight() { + if (this.pageHeight != undefined && this.headerHeight != undefined && this.bottomHeight != undefined) { + return 'calc(' + this.pageHeight * 2 + 'rpx - ' + this.headerHeight + ' - ' + this.bottomHeight + + ' - 80rpx)'; + } else { + return '100vh'; + } + } + }, + methods: { + scroll(e) { + this.scrollTop = e.detail.scrollTop; + }, + callback() { + if (this.$refs.indexPage) { + this.$refs.indexPage.initPageIndex(); + } + }, + //计算高度 + getHeight() { + var self = this; + //获取页面可用区域的高度 + uni.getSystemInfo({ + success: res => { + this.pageHeight = res.screenHeight; + } + }); + // #ifdef MP || APP-PLUS + this.$nextTick(() => { + const query = uni.createSelectorQuery().in(this); + query + .select('.page-header') + .boundingClientRect(data => { + if (data) { + this.headerHeight = data.height * 2 + 'rpx'; + // 从状态栏高度开始算 + this.paddingTop = data.height + 'px'; + this.marginTop = -data.height + 'px'; + } + }) + .exec(); + }); + // #endif + this.$nextTick(() => { + const query = uni.createSelectorQuery().in(this); + query + .select('.page-bottom') + .boundingClientRect(data => { + this.bottomHeight = 110 + 'rpx'; + }) + .exec(); + }); + + }, + getDiyInfo() { + this.isLoad = false; + this.$api.sendRequest({ + url: '/api/diyview/info', + data: { + name: this.name, + is_default: this.isDefault + }, + success: res => { + if (res.code != 0 || !res.data) { + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + this.$util.showToast({ + title: '未配置自定义页面数据' + }); + this.diyData = {}; + return; + } + + let diyDatavalue = res.data; + // console.log(JSON.parse(diyDatavalue.value)) + //处理后台组件input输入单引号问题 -- 英文状态下 + // diyDatavalue.value = diyDatavalue.value.replace(/\@/g, "'"); + if (diyDatavalue.value) { + // uni.setStorageSync(this.name, diyDatavalue.value); + this.diyData = JSON.parse(diyDatavalue.value); + this.$langConfig.title(this.diyData.global.title); + this.mpCollect = this.diyData.global.mpCollect; + if (this.diyData.global.popWindow && this.diyData.global.popWindow.imageUrl) { + // 弹框形式,首次弹出 1,每次弹出 0 + setTimeout(() => { + if (this.diyData.global.popWindow.count == 1) { + var popwindow_count = uni.getStorageSync(this.name + + '_popwindow_count'); + if ((this.$refs.uniPopupWindow && popwindow_count == '') || ( + this.$refs.uniPopupWindow && popwindow_count == 1)) { + this.$refs.uniPopupWindow.open(); + uni.setStorageSync(this.name + '_popwindow_count', 1); + } + } else if (this.diyData.global.popWindow.count == 0) { + this.$refs.uniPopupWindow.open(); + uni.setStorageSync(this.name + '_popwindow_count', 0); + } + }, 500); + } + + for (var i = 0; i < this.diyData.value.length; i++) { + if (this.diyData.value[i].componentName == 'TopCategory') { + this.topIndexValue = this.diyData.value[i]; + break; + } + // 关注公众号组件 + if (this.diyData.value[i].componentName == 'FollowOfficialAccount') { + this.followOfficialAccount = this.diyData.value[i]; + break; + } + } + + // #ifdef MP + //小程序收藏 + if (!uni.getStorageSync('isCollect') && this.diyData.global.mpCollect) { + this.$refs.collectPopupWindow.open(); + this.showTip = true; + } + // #endif + } + + if (!this.pullDownRefresh) { + setTimeout(() => { + this.$refs.diyGroup.refresh(this.diyData); + }); + this.pullDownRefresh = true; + } + + setTimeout(() => { + uni.stopPullDownRefresh(); + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + this.isLoad = true; + }, 150); + } + }); + }, + closePopupWindow() { + this.$refs.uniPopupWindow.close(); + uni.setStorageSync(this.name + '_popwindow_count', -1); + }, + closeCollectPopupWindow() { + this.$refs.collectPopupWindow.close(); + uni.setStorageSync('isCollect', true); + }, + uniPopupWindowFn() { + this.$util.diyRedirectTo(this.diyData.global.popWindow.link); + this.closePopupWindow(); + } + }, + onPageScroll(e) { + if (this.$refs.topNav) { + if (e.scrollTop >= 20) { + this.$refs.topNav.navTopBg(); + } else { + this.$refs.topNav.unSetnavTopBg(); + } + } + }, + onPullDownRefresh() { + this.pullDownRefresh = false; + if (uni.getStorageSync('token')) { + this.$util.getMemberId().then(resolve => { + this.memberId = resolve; + }); + } + this.store = uni.getStorageSync('store') ? uni.getStorageSync('store') : null; + if (this.store) this.storeId = this.store.store_id; + + this.getDiyInfo(); + this.getHeight(); + + //记录分享关系 + if (uni.getStorageSync('token') && uni.getStorageSync('source_member')) { + this.$util.onSourceMember(uni.getStorageSync('source_member')); + } + + //小程序分享 + // #ifdef MP-WEIXIN + this.$util.getMpShare().then(res => { + this.mpShareData = res; + }); + // #endif + }, + //分享给好友 + onShareAppMessage() { + return this.mpShareData.appMessage; + }, + //分享到朋友圈 + onShareTimeline() { + return this.mpShareData.timeLine; + } +} diff --git a/common/js/emjoy.js b/common/js/emjoy.js new file mode 100644 index 0000000..c0116e6 --- /dev/null +++ b/common/js/emjoy.js @@ -0,0 +1,55 @@ +export default { + emjoyList: { + "[emjoy_01]": 'public/static/img/emjoy/emjoy_01.gif', + "[emjoy_02]": 'public/static/img/emjoy/emjoy_02.gif', + "[emjoy_03]": 'public/static/img/emjoy/emjoy_03.gif', + "[emjoy_04]": 'public/static/img/emjoy/emjoy_04.gif', + "[emjoy_05]": 'public/static/img/emjoy/emjoy_05.gif', + "[emjoy_06]": 'public/static/img/emjoy/emjoy_06.gif', + "[emjoy_07]": 'public/static/img/emjoy/emjoy_07.gif', + "[emjoy_08]": 'public/static/img/emjoy/emjoy_08.gif', + "[emjoy_09]": 'public/static/img/emjoy/emjoy_09.gif', + + "[emjoy_10]": 'public/static/img/emjoy/emjoy_10.gif', + "[emjoy_11]": 'public/static/img/emjoy/emjoy_11.gif', + "[emjoy_12]": 'public/static/img/emjoy/emjoy_12.gif', + "[emjoy_13]": 'public/static/img/emjoy/emjoy_13.gif', + "[emjoy_14]": 'public/static/img/emjoy/emjoy_14.gif', + "[emjoy_15]": 'public/static/img/emjoy/emjoy_15.gif', + "[emjoy_16]": 'public/static/img/emjoy/emjoy_16.gif', + "[emjoy_17]": 'public/static/img/emjoy/emjoy_17.gif', + "[emjoy_18]": 'public/static/img/emjoy/emjoy_18.gif', + "[emjoy_19]": 'public/static/img/emjoy/emjoy_19.gif', + + "[emjoy_20]": 'public/static/img/emjoy/emjoy_20.gif', + "[emjoy_21]": 'public/static/img/emjoy/emjoy_21.gif', + "[emjoy_22]": 'public/static/img/emjoy/emjoy_22.gif', + "[emjoy_23]": 'public/static/img/emjoy/emjoy_23.gif', + "[emjoy_24]": 'public/static/img/emjoy/emjoy_24.gif', + "[emjoy_25]": 'public/static/img/emjoy/emjoy_25.gif', + "[emjoy_26]": 'public/static/img/emjoy/emjoy_26.gif', + "[emjoy_27]": 'public/static/img/emjoy/emjoy_27.gif', + "[emjoy_28]": 'public/static/img/emjoy/emjoy_28.gif', + "[emjoy_29]": 'public/static/img/emjoy/emjoy_29.gif', + + "[emjoy_30]": 'public/static/img/emjoy/emjoy_30.gif', + "[emjoy_31]": 'public/static/img/emjoy/emjoy_31.gif', + "[emjoy_32]": 'public/static/img/emjoy/emjoy_32.gif', + "[emjoy_33]": 'public/static/img/emjoy/emjoy_33.gif', + "[emjoy_34]": 'public/static/img/emjoy/emjoy_34.gif', + "[emjoy_35]": 'public/static/img/emjoy/emjoy_35.gif', + "[emjoy_36]": 'public/static/img/emjoy/emjoy_36.gif', + "[emjoy_37]": 'public/static/img/emjoy/emjoy_37.gif', + "[emjoy_38]": 'public/static/img/emjoy/emjoy_38.gif', + "[emjoy_39]": 'public/static/img/emjoy/emjoy_39.gif', + + "[emjoy_40]": 'public/static/img/emjoy/emjoy_40.gif', + "[emjoy_41]": 'public/static/img/emjoy/emjoy_41.gif', + "[emjoy_42]": 'public/static/img/emjoy/emjoy_42.gif', + "[emjoy_43]": 'public/static/img/emjoy/emjoy_43.gif', + "[emjoy_44]": 'public/static/img/emjoy/emjoy_44.gif', + "[emjoy_45]": 'public/static/img/emjoy/emjoy_45.gif', + "[emjoy_46]": 'public/static/img/emjoy/emjoy_46.gif', + "[emjoy_47]": 'public/static/img/emjoy/emjoy_47.gif', + } +} diff --git a/common/js/fenxiao-words.js b/common/js/fenxiao-words.js new file mode 100644 index 0000000..69bf003 --- /dev/null +++ b/common/js/fenxiao-words.js @@ -0,0 +1,24 @@ +export default { + data() { + return { + fenxiaoWords: {} + } + }, + methods: { + getFenxiaoWrods() { + this.$api.sendRequest({ + url: '/fenxiao/api/config/words', + success: res => { + if (res.code >= 0 && res.data) { + this.fenxiaoWords = res.data; + uni.setStorageSync('fenxiaoWords', res.data); + } + } + }) + } + }, + onShow() { + if (uni.getStorageSync('fenxiaoWords')) this.fenxiaoWords = uni.getStorageSync('fenxiaoWords'); + this.getFenxiaoWrods(); + } +} diff --git a/common/js/golbalConfig.js b/common/js/golbalConfig.js new file mode 100644 index 0000000..446c454 --- /dev/null +++ b/common/js/golbalConfig.js @@ -0,0 +1,129 @@ +export default { + data() { + return { + // 页面样式,动态设置主色调 + themeColor: '', //''--base-color:#fa5d14;--base-help-color:#ff7e00;' + tabBarHeight: '0px' + } + }, + onLoad() {}, + onShow() { + // 刷新多语言 + this.$langConfig.refresh(); + let time = setInterval(() => { + let theme = uni.getStorageSync('theme_style'); + if (theme.main_color) { + this.themeColorSet() + clearInterval(time); + } + }, 50); + if (this.themeColor) this.getTabbarHeight(); + }, + computed: { + themeStyle() { + return uni.getStorageSync('theme_style'); + }, + //插件是否存在 + addonIsExist() { + return uni.getStorageSync('addon_is_exist'); + }, + tabBarList() { + // return uni.getStorageSync('bottomNav'); + return this.$store.state.tabBarList; + }, + siteInfo() { + return uni.getStorageSync('siteInfo'); + // return this.$store.state.siteInfo; + }, + storeToken() { + return this.$store.state.token; + }, + bottomNavHidden() { + return this.$store.state.bottomNavHidden; + // return uni.getStorageSync('bottomNavHidden'); + } + }, + methods: { + themeColorSet() { + let theme = uni.getStorageSync('theme_style'); + this.themeColor = + `--base-color:${theme.main_color};--base-help-color:${theme.aux_color};--tab-bar-height:${this.tabBarHeight};`; + Object.keys(theme).forEach(key => { + let data = theme[key]; + if (typeof(data) == "object") { + Object.keys(data).forEach(k => { + this.themeColor += '--' + k.replace(/_/g, "-") + ':' + data[k] + ';'; + }); + } else if (typeof(key) == "string" && key) { + this.themeColor += '--' + key.replace(/_/g, "-") + ':' + data + ';'; + } + }); + for (let i = 9; i >= 5; i--) { + let color = this.$util.colourBlend(theme.main_color, '#ffffff', (i / 10)); + this.themeColor += `--base-color-light-${i}:${color};`; + } + }, + // 颜色变浅(>0)、变深函数(<0) + lightenDarkenColor(color, amount) { + + var usePound = false; + + if (color[0] == "#") { + color = color.slice(1); + usePound = true; + } + + var num = parseInt(color, 16); + + var r = (num >> 16) + amount; + + if (r > 255) r = 255; + else if (r < 0) r = 0; + + var b = ((num >> 8) & 0x00FF) + amount; + + if (b > 255) b = 255; + else if (b < 0) b = 0; + + var g = (num & 0x0000FF) + amount; + + if (g > 255) g = 255; + else if (g < 0) g = 0; + + return (usePound ? "#" : "") + (g | (b << 8) | (r << 16)).toString(16); + + }, + /** + * 获取tabbar高度 + */ + getTabbarHeight() { + try { + const query = uni.createSelectorQuery().in(this); + query.select('#tab-bar').boundingClientRect(data => { + if (data) { + this.tabBarHeight = data.height + 'px' + this.themeColorSet(); + } + }).exec(); + } catch (e) {} + } + }, + filters: { + /** + * 金额格式化输出 + * @param {Object} money + */ + moneyFormat(money) { + if (isNaN(parseFloat(money))) return money; + return parseFloat(money).toFixed(2); + } + }, + onReady() { + let num = 0; + let timer = setInterval(() => { + this.getTabbarHeight() + num += 1; + if (this.tabBarHeight != '0px' || num == 10) clearInterval(timer) + }, 100) + } +} diff --git a/common/js/goods_detail_base.js b/common/js/goods_detail_base.js new file mode 100644 index 0000000..375cdd6 --- /dev/null +++ b/common/js/goods_detail_base.js @@ -0,0 +1,408 @@ +// 商品详情业务 +import htmlParser from '@/common/js/html-parser'; +export default { + data() { + return { + skuId: 0, + goodsId: 0, + // 商品详情 + goodsSkuDetail: { + goods_id: 0, + goods_service: [] + }, + preview: 0, //是否开启预览,0:不开启,1:开启 + token: "", + //评价 + contactData: { + title: '', + path: '', + img: '' + }, + + shareQuery: '', // 分享参数 + shareUrl: '', // 分享链接 + + source_member: 0, //分享人的id + chatRoomParams: {}, // 联系客服参数 + isIphoneX: false, //判断手机是否是iphoneX以上 + // cartCount: 0, // 购物车商品数量 + whetherCollection: 0, + memberId: 0, + posterParams: {}, //海报所需参数 + shareImg: '', + globalS: { + title: '', + topNavColor: "#ffffff", + topNavBg: false, + navBarSwitch: true, // 导航栏是否显示 + textNavColor: "#333333", + moreLink: { + name: "" + }, + navStyle: 1, + bgUrl: '', + }, + } + }, + onLoad(data) { + this.preview = data.preview || 0; + this.token = uni.getStorageSync('token'); + this.isIphoneX = this.$util.uniappIsIPhoneX(); + + if (data.source_member) { + uni.setStorageSync('source_member', data.source_member); + this.source_member = data.source_member; + } + //记录分享关系 + if (this.token && uni.getStorageSync('source_member')) { + this.$util.onSourceMember(uni.getStorageSync('source_member')); + } + + // 小程序扫码进入 + if (data.scene) { + var sceneParams = decodeURIComponent(data.scene); + sceneParams = sceneParams.split('&'); + if (sceneParams.length) { + sceneParams.forEach(item => { + if (item.indexOf('m') != -1) uni.setStorageSync('source_member', item.split('-')[1]); + if (item.indexOf('is_test') != -1) uni.setStorageSync('is_test', 1); + }); + } + } + }, + computed: { + cartCount() { + return this.$store.state.cartNumber; + }, + }, + onShow() { + if (this.token) { + this.getCartCount(); + + this.$util.getMemberId().then(resolve => { + this.memberId = resolve; + }); + } + }, + watch: { + memberId: function() { + if (this.goodsSkuDetail.goods_id) this.setPublicShare(); + } + }, + methods: { + // 处理商品详情数据 + handleGoodsSkuData() { + this.$langConfig.title(this.goodsSkuDetail.goods_name); + this.globalS.title = this.goodsSkuDetail.goods_name; + if (this.goodsSkuDetail.config) { + this.globalS.navBarSwitch = this.goodsSkuDetail.config.nav_bar_switch; + } + + this.modifyGoodsInfo(); + this.getWhetherCollection(); + + // 初始化商品详情视图数据 + this.$refs.goodsDetailView.init({ + sku_id: this.skuId, + goods_id: this.goodsSkuDetail.goods_id, + preview: this.preview, + source_member: this.source_member, + posterParams: this.posterParams, + posterApi: this.posterApi, + shareUrl: this.shareUrl, + memberId: this.memberId, + goodsRoute: this.goodsRoute, + isVirtual:this.goodsSkuDetail.is_virtual + }); + + //媒体 + if (this.goodsSkuDetail.video_url) this.switchMedia = "video"; + + if (!Array.isArray(this.goodsSkuDetail.sku_images)) { + if (this.goodsSkuDetail.sku_images) this.goodsSkuDetail.sku_images = this.goodsSkuDetail.sku_images + .split(","); + else this.goodsSkuDetail.sku_images = []; + } + + // 多规格时合并主图 + if (this.goodsSkuDetail.goods_spec_format && this.goodsSkuDetail.goods_image) { + + if (!Array.isArray(this.goodsSkuDetail.goods_image)) this.goodsSkuDetail.goods_image = this + .goodsSkuDetail.goods_image.split(","); + + this.goodsSkuDetail.sku_images = this.goodsSkuDetail + .goods_image.concat(this.goodsSkuDetail.sku_images); + } + + let maxHeight = ''; + this.goodsSkuDetail.goods_image_list.forEach((item, index) => { + if (typeof item.pic_spec == "string") + item.pic_spec = item.pic_spec.split('*'); + + uni.getSystemInfo({ + success: (res) => { + let ratio = item.pic_spec[0] / res.windowWidth; + item.pic_spec[0] = item.pic_spec[0] / ratio; + item.pic_spec[1] = item.pic_spec[1] / ratio; + } + }); + + if (!maxHeight || maxHeight < item.pic_spec[1]) { + maxHeight = item.pic_spec[1]; + } + }) + this.goodsSkuDetail.swiperHeight = maxHeight + 'px'; + + this.goodsSkuDetail.unit = this.goodsSkuDetail.unit || "件"; + + // 当前商品SKU规格 + if (this.goodsSkuDetail.sku_spec_format) this.goodsSkuDetail.sku_spec_format = JSON.parse(this + .goodsSkuDetail.sku_spec_format); + + // 商品属性 + if (this.goodsSkuDetail.goods_attr_format) { + let goods_attr_format = JSON.parse(this.goodsSkuDetail.goods_attr_format); + this.goodsSkuDetail.goods_attr_format = this.$util.unique(goods_attr_format, "attr_id"); + for (var i = 0; i < this.goodsSkuDetail.goods_attr_format.length; i++) { + for (var j = 0; j < goods_attr_format.length; j++) { + if (this.goodsSkuDetail.goods_attr_format[i].attr_id == goods_attr_format[j].attr_id && + this.goodsSkuDetail.goods_attr_format[ + i].attr_value_id != goods_attr_format[j].attr_value_id) { + this.goodsSkuDetail.goods_attr_format[i].attr_value_name += "、" + goods_attr_format[ + j].attr_value_name; + } + } + } + } + + // 商品SKU格式 + if (this.goodsSkuDetail.goods_spec_format) this.goodsSkuDetail.goods_spec_format = JSON.parse(this + .goodsSkuDetail.goods_spec_format); + + // 商品详情 + if (this.goodsSkuDetail.goods_content) this.goodsSkuDetail.goods_content = htmlParser(this + .goodsSkuDetail.goods_content); + + //商品服务 + if (this.goodsSkuDetail.goods_service) { + for (let i in this.goodsSkuDetail.goods_service) { + this.goodsSkuDetail.goods_service[i]['icon'] = this.goodsSkuDetail.goods_service[i]['icon'] ? JSON + .parse(this.goodsSkuDetail.goods_service[i]['icon']) : ''; + } + } + + this.contactData = { + title: this.goodsSkuDetail.sku_name, + path: this.shareUrl, + img: this.$util.img(this.goodsSkuDetail.sku_image, { + size: 'big' + }) + } + if (this.$refs.goodsPromotion) this.$refs.goodsPromotion.refresh(this.goodsSkuDetail + .goods_promotion); + + if (this.goodsRoute != '/pages/goods/detail') this.setPublicShare(); + + this.getBarrageData(); + this.getGoodsForm(); + }, + /** + * 刷新商品详情数据 + * @param {Object} goodsSkuDetail + */ + refreshGoodsSkuDetail(data) { + this.goodsSkuDetail = Object.assign({}, this.goodsSkuDetail, data); + if (this.$refs.goodsPromotion) this.$refs.goodsPromotion.refresh(this.goodsSkuDetail.goods_promotion); + if (this.$refs.goodsDetailView) { + + // 初始化商品详情视图数据 + this.goodsSkuDetail.unit = this.goodsSkuDetail.unit || "件"; + + // 解决轮播图数量不一致时,切换到第一个 + if (this.swiperCurrent > this.goodsSkuDetail.sku_images.length) { + this.swiperAutoplay = true; + this.swiperCurrent = 1; + setTimeout(() => { + this.swiperAutoplay = false; + }, 40); + } + + } + this.$langConfig.title(this.goodsSkuDetail.sku_name); + + if (typeof this.getMemberCardInfo == 'function') this.getMemberCardInfo(); + }, + goodsDetailViewInit() { + // 初始化商品详情视图数据 + this.$refs.goodsDetailView.init({ + sku_id: this.skuId, + goods_id: this.goodsSkuDetail.goods_id, + preview: this.preview, + source_member: this.source_member, + posterParams: this.posterParams, + posterApi: this.posterApi, + shareUrl: this.shareUrl, + memberId: this.memberId, + goodsRoute: this.goodsRoute + }); + }, + goHome() { + if (this.preview) return; // 开启预览,禁止任何操作和跳转 + this.$util.redirectTo('/pages/index/index'); + }, + goCart() { + if (this.preview) return; // 开启预览,禁止任何操作和跳转 + this.$util.redirectTo('/pages/goods/cart'); + }, + //获取购物车数量 + getCartCount() { + this.$store.dispatch('getCartNumber'); + }, + + //-------------------------------------关注------------------------------------- + //更新商品信息 + modifyGoodsInfo() { + if (this.preview) return; // 开启预览,禁止任何操作和跳转 + //更新商品点击量 + this.$api.sendRequest({ + url: "/api/goods/modifyclicks", + data: { + sku_id: this.skuId + }, + success: res => {} + }); + + //添加足迹 + this.$api.sendRequest({ + url: "/api/goodsbrowse/add", + data: { + goods_id: this.goodsSkuDetail.goods_id, + sku_id: this.skuId + }, + success: res => {} + }); + }, + //-------------------------------------关注------------------------------------- + + //获取用户是否关注 + getWhetherCollection() { + this.$api.sendRequest({ + url: "/api/goodscollect/iscollect", + data: { + goods_id: this.goodsSkuDetail.goods_id + }, + success: res => { + this.whetherCollection = res.data; + } + }); + }, + editCollection() { + if (this.$refs.goodsDetailView) { + this.whetherCollection = this.$refs.goodsDetailView.collection(); + } + }, + openSharePopup() { + if (this.$refs.goodsDetailView) { + this.$refs.goodsDetailView.openSharePopup(); + } + }, + getMemberId() { + this.$api.sendRequest({ + url: "/api/member/id", + success: res => { + if (res.code >= 0) { + this.memberId = res.data; + } + } + }); + }, + + //弹幕 + getBarrageData() { + this.$api.sendRequest({ + url: '/api/goods/goodsbarrage', + data: { + goods_id: this.goodsSkuDetail.goods_id + }, + success: res => { + if (res.code == 0 && res.data) { + let barrageData = []; + for (let i in res.data.list) { + if (res.data.list[i]['title']) { + let title = res.data.list[i]['title'].substr(0, 1) + '*' + res.data.list[i][ + 'title' + ].substr(res.data.list[i]['title'].length - 1, 1) + barrageData.push({ + 'img': res.data.list[i]['img'] ? res.data.list[i]['img'] : this + .$util.getDefaultImage().head, + 'title': title + '已下单' + }); + } + } + this.goodsSkuDetail.barrageData = barrageData; + } + } + }); + }, + /** + * 设置公众号分享 + */ + setPublicShare() { + let shareUrl = this.$config.h5Domain + this.shareUrl; + if (this.memberId) shareUrl += '&source_member=' + this.memberId; + + this.$util.setPublicShare({ + title: this.goodsSkuDetail.goods_name, + desc: '', + link: shareUrl, + imgUrl: typeof this.goodsSkuDetail.goods_image == 'object' ? this.goodsSkuDetail.goods_image[ + 0] : this.goodsSkuDetail.goods_image.split(',')[0] + }) + }, + /** + * 获取商品表单 + */ + getGoodsForm() { + this.$api.sendRequest({ + url: "/form/api/form/goodsform", + data: { + goods_id: this.goodsSkuDetail.goods_id + }, + success: res => { + if (res.code == 0 && res.data) this.$set(this.goodsSkuDetail, 'goods_form', res.data); + } + }); + } + }, + /** + * 自定义分享内容 + * @param {Object} res + */ + onShareAppMessage(res) { + var path = this.shareUrl; + if (this.memberId) path += '&source_member=' + this.memberId; + return { + title: this.goodsSkuDetail.sku_name, + imageUrl: this.shareImg ? this.$util.img(this.shareImg) : this.$util.img(this.goodsSkuDetail.sku_image, { + size: 'big' + }), + path: path, + success: res => {}, + fail: res => {} + }; + }, + // 分享到微信朋友圈 + // #ifdef MP-WEIXIN + onShareTimeline() { + let query = this.shareQuery; + if (this.memberId) query += '&source_member=' + this.memberId; + return { + title: this.goodsSkuDetail.sku_name, + query: query, + imageUrl: this.$util.img(this.goodsSkuDetail.sku_image, { + size: 'big' + }) + }; + } + // #endif +} diff --git a/common/js/html-parser.js b/common/js/html-parser.js new file mode 100644 index 0000000..eed8311 --- /dev/null +++ b/common/js/html-parser.js @@ -0,0 +1,411 @@ +import util from './util.js' +/* + * HTML5 Parser By Sam Blowes + * + * Designed for HTML5 documents + * + * Original code by John Resig (ejohn.org) + * http://ejohn.org/blog/pure-javascript-html-parser/ + * Original code by Erik Arvidsson, Mozilla Public License + * http://erik.eae.net/simplehtmlparser/simplehtmlparser.js + * + * ---------------------------------------------------------------------------- + * License + * ---------------------------------------------------------------------------- + * + * This code is triple licensed using Apache Software License 2.0, + * Mozilla Public License or GNU Public License + * + * //////////////////////////////////////////////////////////////////////////// + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * //////////////////////////////////////////////////////////////////////////// + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the + * License for the specific language governing rights and limitations + * under the License. + * + * The Original Code is Simple HTML Parser. + * + * The Initial Developer of the Original Code is Erik Arvidsson. + * Portions created by Erik Arvidssson are Copyright (C) 2004. All Rights + * Reserved. + * + * //////////////////////////////////////////////////////////////////////////// + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * ---------------------------------------------------------------------------- + * Usage + * ---------------------------------------------------------------------------- + * + * // Use like so: + * HTMLParser(htmlString, { + * start: function(tag, attrs, unary) {}, + * end: function(tag) {}, + * chars: function(text) {}, + * comment: function(text) {} + * }); + * + * // or to get an XML string: + * HTMLtoXML(htmlString); + * + * // or to get an XML DOM Document + * HTMLtoDOM(htmlString); + * + * // or to inject into an existing document/DOM node + * HTMLtoDOM(htmlString, document); + * HTMLtoDOM(htmlString, document.body); + * + */ +// Regular Expressions for parsing tags and attributes +var startTag = + /^<([-A-Za-z0-9_]+)((?:\s+[a-zA-Z_:][-a-zA-Z0-9_:.]*(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/; +var endTag = /^<\/([-A-Za-z0-9_]+)[^>]*>/; +var attr = /([a-zA-Z_:][-a-zA-Z0-9_:.]*)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g; // Empty Elements - HTML 5 + +var empty = makeMap( + 'area,base,basefont,br,col,frame,hr,img,input,link,meta,param,embed,command,keygen,source,track,wbr'); // Block Elements - HTML 5 +// fixed by xxx 将 ins 标签从块级名单中移除 + +var block = makeMap( + 'a,address,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video' +); // Inline Elements - HTML 5 + +var inline = makeMap( + 'abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var' +); // Elements that you can, intentionally, leave open +// (and which close themselves) + +var closeSelf = makeMap('colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr'); // Attributes that have their values filled in disabled="disabled" + +var fillAttrs = makeMap( + 'checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected'); // Special Elements (can contain anything) + +var special = makeMap('script,style'); + +function HTMLParser(html, handler) { + var index; + var chars; + var match; + var stack = []; + var last = html; + + stack.last = function() { + return this[this.length - 1]; + }; + + while (html) { + chars = true; // Make sure we're not in a script or style element + if (!stack.last() || !special[stack.last()]) { + // Comment + if (html.indexOf(''); + + if (index >= 0) { + if (handler.comment) { + handler.comment(html.substring(4, index)); + } + + html = html.substring(index + 3); + chars = false; + } // end tag + + } else if (html.indexOf('') == 0) { + match = html.match(endTag); + + if (match) { + html = html.substring(match[0].length); + match[0].replace(endTag, parseEndTag); + chars = false; + } // start tag + + } else if (html.indexOf('<') == 0) { + match = html.match(startTag); + + if (match) { + html = html.substring(match[0].length); + match[0].replace(startTag, parseStartTag); + chars = false; + } + } + + if (chars) { + index = html.indexOf('<'); + var text = index < 0 ? html : html.substring(0, index); + html = index < 0 ? '' : html.substring(index); + + if (handler.chars) { + handler.chars(text); + } + } + } else { + html = html.replace(new RegExp('([\\s\\S]*?)<\/' + stack.last() + '[^>]*>'), function(all, text) { + text = text.replace(/|/g, '$1$2'); + + if (handler.chars) { + handler.chars(text); + } + + return ''; + }); + parseEndTag('', stack.last()); + } + + + if (html == last) { + throw 'Parse Error: ' + html; + } + + last = html; + } // Clean up any remaining tags + + + parseEndTag(); + + function parseStartTag(tag, tagName, rest, unary) { + tagName = tagName.toLowerCase(); + + if (block[tagName]) { + while (stack.last() && inline[stack.last()]) { + parseEndTag('', stack.last()); + } + } + + if (closeSelf[tagName] && stack.last() == tagName) { + parseEndTag('', tagName); + } + + unary = empty[tagName] || !!unary; + + if (!unary) { + stack.push(tagName); + } + + if (handler.start) { + var attrs = []; + rest.replace(attr, function(match, name) { + var value = arguments[2] ? arguments[2] : arguments[3] ? arguments[3] : arguments[4] ? arguments[4] : fillAttrs[ + name] ? name : ''; + attrs.push({ + name: name, + value: value, + escaped: value.replace(/(^|[^\\])"/g, '$1\\\"') // " + + }); + }); + + if (handler.start) { + handler.start(tagName, attrs, unary); + } + } + } + + function parseEndTag(tag, tagName) { + // If no tag name is provided, clean shop + if (!tagName) { + var pos = 0; + } // Find the closest opened tag of the same type + else { + for (var pos = stack.length - 1; pos >= 0; pos--) { + if (stack[pos] == tagName) { + break; + } + } + } + + if (pos >= 0) { + // Close all the open elements, up the stack + for (var i = stack.length - 1; i >= pos; i--) { + if (handler.end) { + handler.end(stack[i]); + } + } // Remove the open elements from the stack + + + stack.length = pos; + } + } +} + +function makeMap(str) { + var obj = {}; + var items = str.split(','); + + for (var i = 0; i < items.length; i++) { + obj[items[i]] = true; + } + + return obj; +} + +function removeDOCTYPE(html) { + return html.replace(/<\?xml.*\?>\n/, '').replace(/\n/, '').replace(/\n/, ''); +} + +/** + * 忽略注释 + * @param {Object} html + */ +function replaceAnnotation(html) { + var html = html.replace(//gi, ''); + return html; +} + +/** + * 替换图片 + * @param {Object} html + */ +function replaceImage(html) { + // #ifdef MP + let info = uni.getSystemInfoSync(); + var screenWidth = info.safeArea.width || info.screenWidth; + screenWidth -= 20; + screenWidth += 'px'; + // #endif + + // #ifdef H5 + var screenWidth = '100%'; + // #endif + + let rep = ` ]*src=['"]([^'"]+)[^>]*>/gi, (match, capture) => { + return rep + ' src="' + util.img(capture) + '"/>'; + }); + return html; +} + +/** + * 将style属性中的双引号改为单引号 + * @param {Object} html + */ +function replaceStyleQuotes(html) { + var html = html.replace(/style\s*=\s*["][^>]*;[^"]?/gi, (match, capture) => { + match = match.replace(/[:](\s?)[\s\S]*/gi, (a, b) => { + return a.replace(/"/g, "'"); + }); + return match; + }); + return html; +} + +function parseAttrs(attrs) { + return attrs.reduce(function(pre, attr) { + var value = attr.value; + var name = attr.name; + + if (pre[name]) { + pre[name] = pre[name] + " " + value; + } else { + pre[name] = value; + } + + return pre; + }, {}); +} + +function parseHtml(html) { + html = removeDOCTYPE(html); + html = replaceAnnotation(html); //忽略注释 + html = replaceImage(html); //替换图片 + html = replaceStyleQuotes(html); //将style属性中的双引号改为单引号 + var stacks = []; + var results = { + node: 'root', + children: [] + }; + HTMLParser(html, { + start: function start(tag, attrs, unary) { + var node = { + name: tag + }; + + if (attrs.length !== 0) { + node.attrs = parseAttrs(attrs); + } + + if (unary) { + var parent = stacks[0] || results; + + if (!parent.children) { + parent.children = []; + } + + parent.children.push(node); + } else { + stacks.unshift(node); + } + }, + end: function end(tag) { + var node = stacks.shift(); + if (node.name !== tag) console.error('invalid state: mismatch end tag'); + if (stacks.length === 0) { + results.children.push(node); + } else { + var parent = stacks[0]; + + if (!parent.children) { + parent.children = []; + } + + parent.children.push(node); + } + }, + chars: function chars(text) { + var node = { + type: 'text', + text: text + }; + + if (stacks.length === 0) { + results.children.push(node); + } else { + var parent = stacks[0]; + + if (!parent.children) { + parent.children = []; + } + + parent.children.push(node); + } + }, + comment: function comment(text) { + var node = { + node: 'comment', + text: text + }; + var parent = stacks[0]; + + if (!parent.children) { + parent.children = []; + } + + parent.children.push(node); + } + }); + return results.children; +} + +export default parseHtml; diff --git a/common/js/http.js b/common/js/http.js new file mode 100644 index 0000000..5f43583 --- /dev/null +++ b/common/js/http.js @@ -0,0 +1,171 @@ +import Config from './config.js' +import Util from './util.js' +import store from '@/store/index.js' + +// #ifdef H5 +const app_type = Util.isWeiXin() ? 'wechat' : 'h5'; +const app_type_name = Util.isWeiXin() ? '微信公众号' : 'H5'; +// #endif + +// #ifdef MP-WEIXIN +const app_type = 'weapp'; +const app_type_name = '微信小程序'; +// #endif + +// #ifdef MP-ALIPAY +const app_type = 'aliapp'; +const app_type_name = '支付宝小程序'; +// #endif + +// #ifdef MP-BAIDU +const app_type = 'baiduapp'; +const app_type_name = '百度小程序'; +// #endif + +// #ifdef MP-TOUTIAO +const app_type = 'MP-TOUTIAO'; +const app_type_name = '头条小程序'; +// #endif + +// #ifdef MP-QQ +const app_type = 'MP-QQ'; +const app_type_name = 'QQ小程序'; +// #endif + +// #ifdef APP-PLUS +const app_type = 'app'; +const app_type_name = 'APP'; +// #endif + +export default { + sendRequest(params) { + if (!Config.baseUrl) { + uni.showToast({ title: '未配置请求域名', 'icon': 'none', duration: 10000}); + return; + } + + var method = params.data != undefined ? 'POST' : 'GET', // 请求方式 + url = Config.baseUrl + params.url, // 请求路径 + data = { + app_type, + app_type_name + }; + + // token + if (uni.getStorageSync('token')) data.token = uni.getStorageSync('token'); + + // 门店id + if (uni.getStorageSync('store')) data.store_id = uni.getStorageSync('store').store_id; + + // 参数 + if (params.data != undefined) Object.assign(data, params.data); + + if (params.async === false) { + //同步 + return new Promise((resolve, reject) => { + uni.request({ + url: url, + method: method, + data: data, + header: params.header || { + // 'Accept': 'application/json', + 'content-type': 'application/x-www-form-urlencoded;application/json' + }, + dataType: params.dataType || 'json', + responseType: params.responseType || 'text', + success: (res) => { + // try { + // res.data = JSON.parse(res.data); + // } catch (e) { + // //TODO handle the exception + // console.log('api error:', e); + // } + if (res.data.code == -3 && store.state.siteState > 0) { + store.commit('setSiteState', -3) + Util.redirectTo('/pages_tool/storeclose/storeclose', {}, 'reLaunch'); + return; + } + if (res.data.refreshtoken) { + uni.setStorage({ + key: 'token', + data: res.data.refreshtoken + }); + } + if (res.data.code == -10009 || res.data.code == -10010) { + uni.removeStorage({ + key: 'token' + }) + } + resolve(res.data); + }, + fail: (res) => { + if (res.errMsg && res.errMsg == 'request:fail url not in domain list') { + uni.showToast({ title: Config.baseUrl + '不在request 合法域名列表中', 'icon': 'none', duration: 10000}); + return; + } + reject(res); + }, + complete: (res) => { + if ((res.errMsg && res.errMsg != "request:ok") || (res.statusCode && [200, 500].indexOf(res.statusCode) == -1)) { + uni.showToast({ title: Config.baseUrl + '请求失败', 'icon': 'none', duration: 10000}) + return; + } + reject(res); + } + }); + }); + } else { + //异步 + uni.request({ + url: url, + method: method, + data: data, + header: params.header || { + // 'Accept': 'application/json', + 'content-type': 'application/x-www-form-urlencoded;application/json' + }, + dataType: params.dataType || 'json', + responseType: params.responseType || 'text', + success: (res) => { + // try { + // res.data = JSON.parse(res.data); + // } catch (e) { + // //TODO handle the exception + // console.log('api error:', e); + // } + if (res.data.code == -3 && store.state.siteState > 0) { + store.commit('setSiteState', -3) + Util.redirectTo('/pages_tool/storeclose/storeclose', {}, 'reLaunch'); + return; + } + if (res.data.refreshtoken) { + uni.setStorage({ + key: 'token', + data: res.data.refreshtoken + }); + } + if (res.data.code == -10009 || res.data.code == -10010) { + uni.removeStorage({ + key: 'token' + }) + } + typeof params.success == 'function' && params.success(res.data); + }, + fail: (res) => { + if (res.errMsg && res.errMsg == 'request:fail url not in domain list') { + uni.showToast({ title: Config.baseUrl + '不在request 合法域名列表中', 'icon': 'none', duration: 10000}); + return; + } + typeof params.fail == 'function' && params.fail(res); + }, + complete: (res) => { + if ((res.errMsg && res.errMsg != "request:ok") || (res.statusCode && [200, 500].indexOf(res.statusCode) == -1)) { + uni.showToast({ title: Config.baseUrl + '请求失败', 'icon': 'none', duration: 10000}) + return; + } + typeof params.complete == 'function' && params.complete(res); + } + }); + } + } +} diff --git a/common/js/lang.js b/common/js/lang.js new file mode 100644 index 0000000..7c80e98 --- /dev/null +++ b/common/js/lang.js @@ -0,0 +1,127 @@ +const langList = ['zh-cn', 'en-us']; + +var locale = uni.getStorageSync('lang') || "zh-cn"; //设置语言 + +export default { + langList: ['zh-cn', 'en-us'], + /** + * * 解析多语言 + * @param {Object} field + */ + lang(field) { + let _this = getCurrentPages()[getCurrentPages().length - 1]; + if (!_this) return; + + var value = ''; + let newRoute; + try { + //公共语言包 + var lang = require('../../lang/' + locale + '/common.js').lang; + + //当前页面语言包 + let route = _this.route.split("/"); + newRoute = route.slice(1, route.length); + let currentPageLang = require('../../lang/' + locale + '/' + newRoute.join("/") + '.js').lang; + + for (let f in currentPageLang) { + lang[f] = currentPageLang[f]; + } + + var arr = field.split("."); + if (arr.length > 1) { + for (let i in arr) { + var next = parseInt(i) + 1; + if (next < arr.length) { + value = lang[arr[i]][arr[next]]; + } + } + } else { + value = lang[field]; + } + } catch (e) { + + if (field.indexOf("common.") != -1 || field.indexOf("tabBar.") != -1) { + value = lang[field]; + } else { + value = field; + } + } + + if (arguments.length > 1) { + //有参数,需要替换 + for (var i = 1; i < arguments.length; i++) { + value = value.replace("{" + (i - 1) + "}", arguments[i]); + } + } + + if (value == undefined || (value == 'title' && field == 'title')) value = ''; // field + return value; + }, + //切换语言 + change(value) { + let _this = getCurrentPages()[getCurrentPages().length - 1]; + if (!_this) return; + + uni.setStorageSync("lang", value); + locale = uni.getStorageSync('lang') || "zh-cn"; //设置语言 + + this.refresh(); + + uni.reLaunch({ + url: '/pages/member/index' + }); + }, + //刷新标题、tabbar + refresh() { + let _this = getCurrentPages()[getCurrentPages().length - 1]; + if (!_this) return; + + this.title(this.lang("title")); + + //设置tabbar的文字语言 + uni.setTabBarItem({ + index: 0, + text: this.lang("tabBar.home") + }); + uni.setTabBarItem({ + index: 1, + text: this.lang("tabBar.category") + }); + uni.setTabBarItem({ + index: 2, + text: this.lang("tabBar.cart") + }); + uni.setTabBarItem({ + index: 3, + text: this.lang("tabBar.member") + }); + }, + title(str) { + if (str) { + uni.setNavigationBarTitle({ + title: str, + success: function(res){ + }, + fail: function(err){ + } + }); + } + }, + // 获取语言包列表 + list() { + var list = []; + try { + //公共语言包 + for (var i = 0; i < langList.length; i++) { + let item = require('../../lang/' + langList[i] + '/common.js').lang + list.push({ + name: item.common.name, + value: langList[i] + }); + } + } catch (e) { + // "没有找到语言包:", '../../lang/' + locale + '/common.js' + } + return list; + } +} diff --git a/common/js/map-wx-jssdk.js b/common/js/map-wx-jssdk.js new file mode 100644 index 0000000..ba44070 --- /dev/null +++ b/common/js/map-wx-jssdk.js @@ -0,0 +1,1123 @@ +/** + * 微信小程序JavaScriptSDK + * + * @version 1.2 + * @date 2019-03-06 + * @author v_ylyue@tencent.com + */ + +var ERROR_CONF = { + KEY_ERR: 311, + KEY_ERR_MSG: 'key格式错误', + PARAM_ERR: 310, + PARAM_ERR_MSG: '请求参数信息有误', + SYSTEM_ERR: 600, + SYSTEM_ERR_MSG: '系统错误', + WX_ERR_CODE: 1000, + WX_OK_CODE: 200 +}; +var BASE_URL = 'https://apis.map.qq.com/ws/'; +var URL_SEARCH = BASE_URL + 'place/v1/search'; +var URL_SUGGESTION = BASE_URL + 'place/v1/suggestion'; +var URL_GET_GEOCODER = BASE_URL + 'geocoder/v1/'; +var URL_CITY_LIST = BASE_URL + 'district/v1/list'; +var URL_AREA_LIST = BASE_URL + 'district/v1/getchildren'; +var URL_DISTANCE = BASE_URL + 'distance/v1/'; +var URL_DIRECTION = BASE_URL + 'direction/v1/'; +var MODE = { + driving: 'driving', + transit: 'transit' +}; +var EARTH_RADIUS = 6378136.49; +var Utils = { + /** + * md5加密方法 + * 版权所有©2011 Sebastian Tschan,https://blueimp.net + */ + safeAdd(x, y) { + var lsw = (x & 0xffff) + (y & 0xffff); + var msw = (x >> 16) + (y >> 16) + (lsw >> 16); + return (msw << 16) | (lsw & 0xffff); + }, + bitRotateLeft(num, cnt) { + return (num << cnt) | (num >>> (32 - cnt)); + }, + md5cmn(q, a, b, x, s, t) { + return this.safeAdd(this.bitRotateLeft(this.safeAdd(this.safeAdd(a, q), this.safeAdd(x, t)), s), b); + }, + md5ff(a, b, c, d, x, s, t) { + return this.md5cmn((b & c) | (~b & d), a, b, x, s, t); + }, + md5gg(a, b, c, d, x, s, t) { + return this.md5cmn((b & d) | (c & ~d), a, b, x, s, t); + }, + md5hh(a, b, c, d, x, s, t) { + return this.md5cmn(b ^ c ^ d, a, b, x, s, t); + }, + md5ii(a, b, c, d, x, s, t) { + return this.md5cmn(c ^ (b | ~d), a, b, x, s, t); + }, + binlMD5(x, len) { + /* append padding */ + x[len >> 5] |= 0x80 << (len % 32); + x[((len + 64) >>> 9 << 4) + 14] = len; + + var i; + var olda; + var oldb; + var oldc; + var oldd; + var a = 1732584193; + var b = -271733879; + var c = -1732584194; + var d = 271733878; + + for (i = 0; i < x.length; i += 16) { + olda = a; + oldb = b; + oldc = c; + oldd = d; + + a = this.md5ff(a, b, c, d, x[i], 7, -680876936); + d = this.md5ff(d, a, b, c, x[i + 1], 12, -389564586); + c = this.md5ff(c, d, a, b, x[i + 2], 17, 606105819); + b = this.md5ff(b, c, d, a, x[i + 3], 22, -1044525330); + a = this.md5ff(a, b, c, d, x[i + 4], 7, -176418897); + d = this.md5ff(d, a, b, c, x[i + 5], 12, 1200080426); + c = this.md5ff(c, d, a, b, x[i + 6], 17, -1473231341); + b = this.md5ff(b, c, d, a, x[i + 7], 22, -45705983); + a = this.md5ff(a, b, c, d, x[i + 8], 7, 1770035416); + d = this.md5ff(d, a, b, c, x[i + 9], 12, -1958414417); + c = this.md5ff(c, d, a, b, x[i + 10], 17, -42063); + b = this.md5ff(b, c, d, a, x[i + 11], 22, -1990404162); + a = this.md5ff(a, b, c, d, x[i + 12], 7, 1804603682); + d = this.md5ff(d, a, b, c, x[i + 13], 12, -40341101); + c = this.md5ff(c, d, a, b, x[i + 14], 17, -1502002290); + b = this.md5ff(b, c, d, a, x[i + 15], 22, 1236535329); + + a = this.md5gg(a, b, c, d, x[i + 1], 5, -165796510); + d = this.md5gg(d, a, b, c, x[i + 6], 9, -1069501632); + c = this.md5gg(c, d, a, b, x[i + 11], 14, 643717713); + b = this.md5gg(b, c, d, a, x[i], 20, -373897302); + a = this.md5gg(a, b, c, d, x[i + 5], 5, -701558691); + d = this.md5gg(d, a, b, c, x[i + 10], 9, 38016083); + c = this.md5gg(c, d, a, b, x[i + 15], 14, -660478335); + b = this.md5gg(b, c, d, a, x[i + 4], 20, -405537848); + a = this.md5gg(a, b, c, d, x[i + 9], 5, 568446438); + d = this.md5gg(d, a, b, c, x[i + 14], 9, -1019803690); + c = this.md5gg(c, d, a, b, x[i + 3], 14, -187363961); + b = this.md5gg(b, c, d, a, x[i + 8], 20, 1163531501); + a = this.md5gg(a, b, c, d, x[i + 13], 5, -1444681467); + d = this.md5gg(d, a, b, c, x[i + 2], 9, -51403784); + c = this.md5gg(c, d, a, b, x[i + 7], 14, 1735328473); + b = this.md5gg(b, c, d, a, x[i + 12], 20, -1926607734); + + a = this.md5hh(a, b, c, d, x[i + 5], 4, -378558); + d = this.md5hh(d, a, b, c, x[i + 8], 11, -2022574463); + c = this.md5hh(c, d, a, b, x[i + 11], 16, 1839030562); + b = this.md5hh(b, c, d, a, x[i + 14], 23, -35309556); + a = this.md5hh(a, b, c, d, x[i + 1], 4, -1530992060); + d = this.md5hh(d, a, b, c, x[i + 4], 11, 1272893353); + c = this.md5hh(c, d, a, b, x[i + 7], 16, -155497632); + b = this.md5hh(b, c, d, a, x[i + 10], 23, -1094730640); + a = this.md5hh(a, b, c, d, x[i + 13], 4, 681279174); + d = this.md5hh(d, a, b, c, x[i], 11, -358537222); + c = this.md5hh(c, d, a, b, x[i + 3], 16, -722521979); + b = this.md5hh(b, c, d, a, x[i + 6], 23, 76029189); + a = this.md5hh(a, b, c, d, x[i + 9], 4, -640364487); + d = this.md5hh(d, a, b, c, x[i + 12], 11, -421815835); + c = this.md5hh(c, d, a, b, x[i + 15], 16, 530742520); + b = this.md5hh(b, c, d, a, x[i + 2], 23, -995338651); + + a = this.md5ii(a, b, c, d, x[i], 6, -198630844); + d = this.md5ii(d, a, b, c, x[i + 7], 10, 1126891415); + c = this.md5ii(c, d, a, b, x[i + 14], 15, -1416354905); + b = this.md5ii(b, c, d, a, x[i + 5], 21, -57434055); + a = this.md5ii(a, b, c, d, x[i + 12], 6, 1700485571); + d = this.md5ii(d, a, b, c, x[i + 3], 10, -1894986606); + c = this.md5ii(c, d, a, b, x[i + 10], 15, -1051523); + b = this.md5ii(b, c, d, a, x[i + 1], 21, -2054922799); + a = this.md5ii(a, b, c, d, x[i + 8], 6, 1873313359); + d = this.md5ii(d, a, b, c, x[i + 15], 10, -30611744); + c = this.md5ii(c, d, a, b, x[i + 6], 15, -1560198380); + b = this.md5ii(b, c, d, a, x[i + 13], 21, 1309151649); + a = this.md5ii(a, b, c, d, x[i + 4], 6, -145523070); + d = this.md5ii(d, a, b, c, x[i + 11], 10, -1120210379); + c = this.md5ii(c, d, a, b, x[i + 2], 15, 718787259); + b = this.md5ii(b, c, d, a, x[i + 9], 21, -343485551); + + a = this.safeAdd(a, olda); + b = this.safeAdd(b, oldb); + c = this.safeAdd(c, oldc); + d = this.safeAdd(d, oldd); + } + return [a, b, c, d]; + }, + binl2rstr(input) { + var i; + var output = ''; + var length32 = input.length * 32; + for (i = 0; i < length32; i += 8) { + output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xff); + } + return output; + }, + rstr2binl(input) { + var i; + var output = []; + output[(input.length >> 2) - 1] = undefined; + for (i = 0; i < output.length; i += 1) { + output[i] = 0; + } + var length8 = input.length * 8; + for (i = 0; i < length8; i += 8) { + output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << (i % 32); + } + return output; + }, + rstrMD5(s) { + return this.binl2rstr(this.binlMD5(this.rstr2binl(s), s.length * 8)); + }, + rstrHMACMD5(key, data) { + var i; + var bkey = this.rstr2binl(key); + var ipad = []; + var opad = []; + var hash; + ipad[15] = opad[15] = undefined; + if (bkey.length > 16) { + bkey = this.binlMD5(bkey, key.length * 8); + } + for (i = 0; i < 16; i += 1) { + ipad[i] = bkey[i] ^ 0x36363636; + opad[i] = bkey[i] ^ 0x5c5c5c5c; + } + hash = this.binlMD5(ipad.concat(this.rstr2binl(data)), 512 + data.length * 8); + return this.binl2rstr(this.binlMD5(opad.concat(hash), 512 + 128)); + }, + rstr2hex(input) { + var hexTab = '0123456789abcdef'; + var output = ''; + var x; + var i; + for (i = 0; i < input.length; i += 1) { + x = input.charCodeAt(i); + output += hexTab.charAt((x >>> 4) & 0x0f) + hexTab.charAt(x & 0x0f); + } + return output; + }, + str2rstrUTF8(input) { + return unescape(encodeURIComponent(input)); + }, + rawMD5(s) { + return this.rstrMD5(this.str2rstrUTF8(s)); + }, + hexMD5(s) { + return this.rstr2hex(this.rawMD5(s)); + }, + rawHMACMD5(k, d) { + return this.rstrHMACMD5(this.str2rstrUTF8(k), str2rstrUTF8(d)); + }, + hexHMACMD5(k, d) { + return this.rstr2hex(this.rawHMACMD5(k, d)); + }, + + md5(string, key, raw) { + if (!key) { + if (!raw) { + return this.hexMD5(string); + } + return this.rawMD5(string); + } + if (!raw) { + return this.hexHMACMD5(key, string); + } + return this.rawHMACMD5(key, string); + }, + /** + * 得到md5加密后的sig参数 + * @param {Object} requestParam 接口参数 + * @param {String} sk签名字符串 + * @param {String} featrue 方法名 + * @return 返回加密后的sig参数 + */ + getSig(requestParam, sk, feature, mode) { + var sig = null; + var requestArr = []; + Object.keys(requestParam).sort().forEach(function(key){ + requestArr.push(key + '=' + requestParam[key]); + }); + if (feature == 'search') { + sig = '/ws/place/v1/search?' + requestArr.join('&') + sk; + } + if (feature == 'suggest') { + sig = '/ws/place/v1/suggestion?' + requestArr.join('&') + sk; + } + if (feature == 'reverseGeocoder') { + sig = '/ws/geocoder/v1/?' + requestArr.join('&') + sk; + } + if (feature == 'geocoder') { + sig = '/ws/geocoder/v1/?' + requestArr.join('&') + sk; + } + if (feature == 'getCityList') { + sig = '/ws/district/v1/list?' + requestArr.join('&') + sk; + } + if (feature == 'getDistrictByCityId') { + sig = '/ws/district/v1/getchildren?' + requestArr.join('&') + sk; + } + if (feature == 'calculateDistance') { + sig = '/ws/distance/v1/?' + requestArr.join('&') + sk; + } + if (feature == 'direction') { + sig = '/ws/direction/v1/' + mode + '?' + requestArr.join('&') + sk; + } + sig = this.md5(sig); + return sig; + }, + /** + * 得到终点query字符串 + * @param {Array|String} 检索数据 + */ + location2query(data) { + if (typeof data == 'string') { + return data; + } + var query = ''; + for (var i = 0; i < data.length; i++) { + var d = data[i]; + if (!!query) { + query += ';'; + } + if (d.location) { + query = query + d.location.lat + ',' + d.location.lng; + } + if (d.latitude && d.longitude) { + query = query + d.latitude + ',' + d.longitude; + } + } + return query; + }, + + /** + * 计算角度 + */ + rad(d) { + return d * Math.PI / 180.0; + }, + /** + * 处理终点location数组 + * @return 返回终点数组 + */ + getEndLocation(location){ + var to = location.split(';'); + var endLocation = []; + for (var i = 0; i < to.length; i++) { + endLocation.push({ + lat: parseFloat(to[i].split(',')[0]), + lng: parseFloat(to[i].split(',')[1]) + }) + } + return endLocation; + }, + + /** + * 计算两点间直线距离 + * @param a 表示纬度差 + * @param b 表示经度差 + * @return 返回的是距离,单位m + */ + getDistance(latFrom, lngFrom, latTo, lngTo) { + var radLatFrom = this.rad(latFrom); + var radLatTo = this.rad(latTo); + var a = radLatFrom - radLatTo; + var b = this.rad(lngFrom) - this.rad(lngTo); + var distance = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLatFrom) * Math.cos(radLatTo) * Math.pow(Math.sin(b / 2), 2))); + distance = distance * EARTH_RADIUS; + distance = Math.round(distance * 10000) / 10000; + return parseFloat(distance.toFixed(0)); + }, + /** + * 使用微信接口进行定位 + */ + getWXLocation(success, fail, complete) { + this.$util.getLocation({ + type: 'gcj02', + success: success, + fail: fail, + complete: complete + }) + }, + + /** + * 获取location参数 + */ + getLocationParam(location) { + if (typeof location == 'string') { + var locationArr = location.split(','); + if (locationArr.length === 2) { + location = { + latitude: location.split(',')[0], + longitude: location.split(',')[1] + }; + } else { + location = {}; + } + } + return location; + }, + + /** + * 回调函数默认处理 + */ + polyfillParam(param) { + param.success = param.success || function () { }; + param.fail = param.fail || function () { }; + param.complete = param.complete || function () { }; + }, + + /** + * 验证param对应的key值是否为空 + * + * @param {Object} param 接口参数 + * @param {String} key 对应参数的key + */ + checkParamKeyEmpty(param, key) { + if (!param[key]) { + var errconf = this.buildErrorConfig(ERROR_CONF.PARAM_ERR, ERROR_CONF.PARAM_ERR_MSG + key +'参数格式有误'); + param.fail(errconf); + param.complete(errconf); + return true; + } + return false; + }, + + /** + * 验证参数中是否存在检索词keyword + * + * @param {Object} param 接口参数 + */ + checkKeyword(param){ + return !this.checkParamKeyEmpty(param, 'keyword'); + }, + + /** + * 验证location值 + * + * @param {Object} param 接口参数 + */ + checkLocation(param) { + var location = this.getLocationParam(param.location); + if (!location || !location.latitude || !location.longitude) { + var errconf = this.buildErrorConfig(ERROR_CONF.PARAM_ERR, ERROR_CONF.PARAM_ERR_MSG + ' location参数格式有误'); + param.fail(errconf); + param.complete(errconf); + return false; + } + return true; + }, + + /** + * 构造错误数据结构 + * @param {Number} errCode 错误码 + * @param {Number} errMsg 错误描述 + */ + buildErrorConfig(errCode, errMsg) { + return { + status: errCode, + message: errMsg + }; + }, + + /** + * + * 数据处理函数 + * 根据传入参数不同处理不同数据 + * @param {String} feature 功能名称 + * search 地点搜索 + * suggest关键词提示 + * reverseGeocoder逆地址解析 + * geocoder地址解析 + * getCityList获取城市列表:父集 + * getDistrictByCityId获取区县列表:子集 + * calculateDistance距离计算 + * @param {Object} param 接口参数 + * @param {Object} data 数据 + */ + handleData(param,data,feature){ + if (feature == 'search') { + var searchResult = data.data; + var searchSimplify = []; + for (var i = 0; i < searchResult.length; i++) { + searchSimplify.push({ + id: searchResult[i].id || null, + title: searchResult[i].title || null, + latitude: searchResult[i].location && searchResult[i].location.lat || null, + longitude: searchResult[i].location && searchResult[i].location.lng || null, + address: searchResult[i].address || null, + category: searchResult[i].category || null, + tel: searchResult[i].tel || null, + adcode: searchResult[i].ad_info && searchResult[i].ad_info.adcode || null, + city: searchResult[i].ad_info && searchResult[i].ad_info.city || null, + district: searchResult[i].ad_info && searchResult[i].ad_info.district || null, + province: searchResult[i].ad_info && searchResult[i].ad_info.province || null + }) + } + param.success(data, { + searchResult: searchResult, + searchSimplify: searchSimplify + }) + } else if (feature == 'suggest') { + var suggestResult = data.data; + var suggestSimplify = []; + for (var i = 0; i < suggestResult.length; i++) { + suggestSimplify.push({ + adcode: suggestResult[i].adcode || null, + address: suggestResult[i].address || null, + category: suggestResult[i].category || null, + city: suggestResult[i].city || null, + district: suggestResult[i].district || null, + id: suggestResult[i].id || null, + latitude: suggestResult[i].location && suggestResult[i].location.lat || null, + longitude: suggestResult[i].location && suggestResult[i].location.lng || null, + province: suggestResult[i].province || null, + title: suggestResult[i].title || null, + type: suggestResult[i].type || null + }) + } + param.success(data, { + suggestResult: suggestResult, + suggestSimplify: suggestSimplify + }) + } else if (feature == 'reverseGeocoder') { + var reverseGeocoderResult = data.result; + var reverseGeocoderSimplify = { + address: reverseGeocoderResult.address || null, + latitude: reverseGeocoderResult.location && reverseGeocoderResult.location.lat || null, + longitude: reverseGeocoderResult.location && reverseGeocoderResult.location.lng || null, + adcode: reverseGeocoderResult.ad_info && reverseGeocoderResult.ad_info.adcode || null, + city: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.city || null, + district: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.district || null, + nation: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.nation || null, + province: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.province || null, + street: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.street || null, + street_number: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.street_number || null, + recommend: reverseGeocoderResult.formatted_addresses && reverseGeocoderResult.formatted_addresses.recommend || null, + rough: reverseGeocoderResult.formatted_addresses && reverseGeocoderResult.formatted_addresses.rough || null + }; + if (reverseGeocoderResult.pois) {//判断是否返回周边poi + var pois = reverseGeocoderResult.pois; + var poisSimplify = []; + for (var i = 0;i < pois.length;i++) { + poisSimplify.push({ + id: pois[i].id || null, + title: pois[i].title || null, + latitude: pois[i].location && pois[i].location.lat || null, + longitude: pois[i].location && pois[i].location.lng || null, + address: pois[i].address || null, + category: pois[i].category || null, + adcode: pois[i].ad_info && pois[i].ad_info.adcode || null, + city: pois[i].ad_info && pois[i].ad_info.city || null, + district: pois[i].ad_info && pois[i].ad_info.district || null, + province: pois[i].ad_info && pois[i].ad_info.province || null + }) + } + param.success(data,{ + reverseGeocoderResult: reverseGeocoderResult, + reverseGeocoderSimplify: reverseGeocoderSimplify, + pois: pois, + poisSimplify: poisSimplify + }) + } else { + param.success(data, { + reverseGeocoderResult: reverseGeocoderResult, + reverseGeocoderSimplify: reverseGeocoderSimplify + }) + } + } else if (feature == 'geocoder') { + var geocoderResult = data.result; + var geocoderSimplify = { + title: geocoderResult.title || null, + latitude: geocoderResult.location && geocoderResult.location.lat || null, + longitude: geocoderResult.location && geocoderResult.location.lng || null, + adcode: geocoderResult.ad_info && geocoderResult.ad_info.adcode || null, + province: geocoderResult.address_components && geocoderResult.address_components.province || null, + city: geocoderResult.address_components && geocoderResult.address_components.city || null, + district: geocoderResult.address_components && geocoderResult.address_components.district || null, + street: geocoderResult.address_components && geocoderResult.address_components.street || null, + street_number: geocoderResult.address_components && geocoderResult.address_components.street_number || null, + level: geocoderResult.level || null + }; + param.success(data,{ + geocoderResult: geocoderResult, + geocoderSimplify: geocoderSimplify + }); + } else if (feature == 'getCityList') { + var provinceResult = data.result[0]; + var cityResult = data.result[1]; + var districtResult = data.result[2]; + param.success(data,{ + provinceResult: provinceResult, + cityResult: cityResult, + districtResult: districtResult + }); + } else if (feature == 'getDistrictByCityId') { + var districtByCity = data.result[0]; + param.success(data, districtByCity); + } else if (feature == 'calculateDistance') { + var calculateDistanceResult = data.result.elements; + var distance = []; + for (var i = 0; i < calculateDistanceResult.length; i++){ + distance.push(calculateDistanceResult[i].distance); + } + param.success(data, { + calculateDistanceResult: calculateDistanceResult, + distance: distance + }); + } else if (feature == 'direction') { + var direction = data.result.routes; + param.success(data,direction); + } else { + param.success(data); + } + }, + + /** + * 构造微信请求参数,公共属性处理 + * + * @param {Object} param 接口参数 + * @param {Object} param 配置项 + * @param {String} feature 方法名 + */ + buildWxRequestConfig(param, options, feature) { + var that = this; + options.header = { "content-type": "application/json" }; + options.method = 'GET'; + options.success = function (res) { + var data = res.data; + if (data.status === 0) { + that.handleData(param, data, feature); + } else { + param.fail(data); + } + }; + options.fail = function (res) { + res.statusCode = ERROR_CONF.WX_ERR_CODE; + param.fail(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg)); + }; + options.complete = function (res) { + var statusCode = +res.statusCode; + switch(statusCode) { + case ERROR_CONF.WX_ERR_CODE: { + param.complete(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg)); + break; + } + case ERROR_CONF.WX_OK_CODE: { + var data = res.data; + if (data.status === 0) { + param.complete(data); + } else { + param.complete(that.buildErrorConfig(data.status, data.message)); + } + break; + } + default:{ + param.complete(that.buildErrorConfig(ERROR_CONF.SYSTEM_ERR, ERROR_CONF.SYSTEM_ERR_MSG)); + } + + } + }; + return options; + }, + + /** + * 处理用户参数是否传入坐标进行不同的处理 + */ + locationProcess(param, locationsuccess, locationfail, locationcomplete) { + var that = this; + locationfail = locationfail || function (res) { + res.statusCode = ERROR_CONF.WX_ERR_CODE; + param.fail(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg)); + }; + locationcomplete = locationcomplete || function (res) { + if (res.statusCode == ERROR_CONF.WX_ERR_CODE) { + param.complete(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg)); + } + }; + if (!param.location) { + that.getWXLocation(locationsuccess, locationfail, locationcomplete); + } else if (that.checkLocation(param)) { + var location = Utils.getLocationParam(param.location); + locationsuccess(location); + } + } +}; + + +class QQMapWX { + + /** + * 构造函数 + * + * @param {Object} options 接口参数,key 为必选参数 + */ + constructor(options) { + if (!options.key) { + throw Error('key值不能为空'); + } + this.key = options.key; + }; + + /** + * POI周边检索 + * + * @param {Object} options 接口参数对象 + * + * 参数对象结构可以参考 + * @see http://lbs.qq.com/webservice_v1/guide-search.html + */ + search(options) { + var that = this; + options = options || {}; + + Utils.polyfillParam(options); + + if (!Utils.checkKeyword(options)) { + return; + } + + var requestParam = { + keyword: options.keyword, + orderby: options.orderby || '_distance', + page_size: options.page_size || 10, + page_index: options.page_index || 1, + output: 'json', + key: that.key + }; + + if (options.address_format) { + requestParam.address_format = options.address_format; + } + + if (options.filter) { + requestParam.filter = options.filter; + } + + var distance = options.distance || "1000"; + var auto_extend = options.auto_extend || 1; + var region = null; + var rectangle = null; + + //判断城市限定参数 + if (options.region) { + region = options.region; + } + + //矩形限定坐标(暂时只支持字符串格式) + if (options.rectangle) { + rectangle = options.rectangle; + } + + var locationsuccess = function (result) { + if (region && !rectangle) { + //城市限定参数拼接 + requestParam.boundary = "region(" + region + "," + auto_extend + "," + result.latitude + "," + result.longitude + ")"; + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'search'); + } + } else if (rectangle && !region) { + //矩形搜索 + requestParam.boundary = "rectangle(" + rectangle + ")"; + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'search'); + } + } else { + requestParam.boundary = "nearby(" + result.latitude + "," + result.longitude + "," + distance + "," + auto_extend + ")"; + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'search'); + } + } + wx.request(Utils.buildWxRequestConfig(options, { + url: URL_SEARCH, + data: requestParam + }, 'search')); + }; + Utils.locationProcess(options, locationsuccess); + }; + + /** + * sug模糊检索 + * + * @param {Object} options 接口参数对象 + * + * 参数对象结构可以参考 + * http://lbs.qq.com/webservice_v1/guide-suggestion.html + */ + getSuggestion(options) { + var that = this; + options = options || {}; + Utils.polyfillParam(options); + + if (!Utils.checkKeyword(options)) { + return; + } + + var requestParam = { + keyword: options.keyword, + region: options.region || '全国', + region_fix: options.region_fix || 0, + policy: options.policy || 0, + page_size: options.page_size || 10,//控制显示条数 + page_index: options.page_index || 1,//控制页数 + get_subpois : options.get_subpois || 0,//返回子地点 + output: 'json', + key: that.key + }; + //长地址 + if (options.address_format) { + requestParam.address_format = options.address_format; + } + //过滤 + if (options.filter) { + requestParam.filter = options.filter; + } + //排序 + if (options.location) { + var locationsuccess = function (result) { + requestParam.location = result.latitude + ',' + result.longitude; + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'suggest'); + } + wx.request(Utils.buildWxRequestConfig(options, { + url: URL_SUGGESTION, + data: requestParam + }, "suggest")); + }; + Utils.locationProcess(options, locationsuccess); + } else { + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'suggest'); + } + wx.request(Utils.buildWxRequestConfig(options, { + url: URL_SUGGESTION, + data: requestParam + }, "suggest")); + } + }; + + /** + * 逆地址解析 + * + * @param {Object} options 接口参数对象 + * + * 请求参数结构可以参考 + * http://lbs.qq.com/webservice_v1/guide-gcoder.html + */ + reverseGeocoder(options) { + var that = this; + options = options || {}; + Utils.polyfillParam(options); + var requestParam = { + coord_type: options.coord_type || 5, + get_poi: options.get_poi || 0, + output: 'json', + key: that.key + }; + if (options.poi_options) { + requestParam.poi_options = options.poi_options + } + + var locationsuccess = function (result) { + requestParam.location = result.latitude + ',' + result.longitude; + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'reverseGeocoder'); + } + wx.request(Utils.buildWxRequestConfig(options, { + url: URL_GET_GEOCODER, + data: requestParam + }, 'reverseGeocoder')); + }; + Utils.locationProcess(options, locationsuccess); + }; + + /** + * 地址解析 + * + * @param {Object} options 接口参数对象 + * + * 请求参数结构可以参考 + * http://lbs.qq.com/webservice_v1/guide-geocoder.html + */ + geocoder(options) { + var that = this; + options = options || {}; + Utils.polyfillParam(options); + + if (Utils.checkParamKeyEmpty(options, 'address')) { + return; + } + + var requestParam = { + address: options.address, + output: 'json', + key: that.key + }; + + //城市限定 + if (options.region) { + requestParam.region = options.region; + } + + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'geocoder'); + } + + wx.request(Utils.buildWxRequestConfig(options, { + url: URL_GET_GEOCODER, + data: requestParam + },'geocoder')); + }; + + + /** + * 获取城市列表 + * + * @param {Object} options 接口参数对象 + * + * 请求参数结构可以参考 + * http://lbs.qq.com/webservice_v1/guide-region.html + */ + getCityList(options) { + var that = this; + options = options || {}; + Utils.polyfillParam(options); + var requestParam = { + output: 'json', + key: that.key + }; + + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'getCityList'); + } + + wx.request(Utils.buildWxRequestConfig(options, { + url: URL_CITY_LIST, + data: requestParam + },'getCityList')); + }; + + /** + * 获取对应城市ID的区县列表 + * + * @param {Object} options 接口参数对象 + * + * 请求参数结构可以参考 + * http://lbs.qq.com/webservice_v1/guide-region.html + */ + getDistrictByCityId(options) { + var that = this; + options = options || {}; + Utils.polyfillParam(options); + + if (Utils.checkParamKeyEmpty(options, 'id')) { + return; + } + + var requestParam = { + id: options.id || '', + output: 'json', + key: that.key + }; + + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'getDistrictByCityId'); + } + + wx.request(Utils.buildWxRequestConfig(options, { + url: URL_AREA_LIST, + data: requestParam + },'getDistrictByCityId')); + }; + + /** + * 用于单起点到多终点的路线距离(非直线距离)计算: + * 支持两种距离计算方式:步行和驾车。 + * 起点到终点最大限制直线距离10公里。 + * + * 新增直线距离计算。 + * + * @param {Object} options 接口参数对象 + * + * 请求参数结构可以参考 + * http://lbs.qq.com/webservice_v1/guide-distance.html + */ + calculateDistance(options) { + var that = this; + options = options || {}; + Utils.polyfillParam(options); + + if (Utils.checkParamKeyEmpty(options, 'to')) { + return; + } + + var requestParam = { + mode: options.mode || 'walking', + to: Utils.location2query(options.to), + output: 'json', + key: that.key + }; + + if (options.from) { + options.location = options.from; + } + + //计算直线距离 + if(requestParam.mode == 'straight'){ + var locationsuccess = function (result) { + var locationTo = Utils.getEndLocation(requestParam.to);//处理终点坐标 + var data = { + message:"query ok", + result:{ + elements:[] + }, + status:0 + }; + for (var i = 0; i < locationTo.length; i++) { + data.result.elements.push({//将坐标存入 + distance: Utils.getDistance(result.latitude, result.longitude, locationTo[i].lat, locationTo[i].lng), + duration:0, + from:{ + lat: result.latitude, + lng:result.longitude + }, + to:{ + lat: locationTo[i].lat, + lng: locationTo[i].lng + } + }); + } + var calculateResult = data.result.elements; + var distanceResult = []; + for (var i = 0; i < calculateResult.length; i++) { + distanceResult.push(calculateResult[i].distance); + } + return options.success(data,{ + calculateResult: calculateResult, + distanceResult: distanceResult + }); + }; + + Utils.locationProcess(options, locationsuccess); + } else { + var locationsuccess = function (result) { + requestParam.from = result.latitude + ',' + result.longitude; + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'calculateDistance'); + } + wx.request(Utils.buildWxRequestConfig(options, { + url: URL_DISTANCE, + data: requestParam + },'calculateDistance')); + }; + + Utils.locationProcess(options, locationsuccess); + } + }; + + /** + * 路线规划: + * + * @param {Object} options 接口参数对象 + * + * 请求参数结构可以参考 + * https://lbs.qq.com/webservice_v1/guide-road.html + */ + direction(options) { + var that = this; + options = options || {}; + Utils.polyfillParam(options); + + if (Utils.checkParamKeyEmpty(options, 'to')) { + return; + } + + var requestParam = { + output: 'json', + key: that.key + }; + + //to格式处理 + if (typeof options.to == 'string') { + requestParam.to = options.to; + } else { + requestParam.to = options.to.latitude + ',' + options.to.longitude; + } + //初始化局部请求域名 + var SET_URL_DIRECTION = null; + //设置默认mode属性 + options.mode = options.mode || MODE.driving; + + //设置请求域名 + SET_URL_DIRECTION = URL_DIRECTION + options.mode; + + if (options.from) { + options.location = options.from; + } + + if (options.mode == MODE.driving) { + if (options.from_poi) { + requestParam.from_poi = options.from_poi; + } + if (options.heading) { + requestParam.heading = options.heading; + } + if (options.speed) { + requestParam.speed = options.speed; + } + if (options.accuracy) { + requestParam.accuracy = options.accuracy; + } + if (options.road_type) { + requestParam.road_type = options.road_type; + } + if (options.to_poi) { + requestParam.to_poi = options.to_poi; + } + if (options.from_track) { + requestParam.from_track = options.from_track; + } + if (options.waypoints) { + requestParam.waypoints = options.waypoints; + } + if (options.policy) { + requestParam.policy = options.policy; + } + if (options.plate_number) { + requestParam.plate_number = options.plate_number; + } + } + + if (options.mode == MODE.transit) { + if (options.departure_time) { + requestParam.departure_time = options.departure_time; + } + if (options.policy) { + requestParam.policy = options.policy; + } + } + + var locationsuccess = function (result) { + requestParam.from = result.latitude + ',' + result.longitude; + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'direction',options.mode); + } + wx.request(Utils.buildWxRequestConfig(options, { + url: SET_URL_DIRECTION, + data: requestParam + }, 'direction')); + }; + + Utils.locationProcess(options, locationsuccess); + } +}; + +module.exports = QQMapWX; \ No newline at end of file diff --git a/common/js/map/openMap.js b/common/js/map/openMap.js new file mode 100644 index 0000000..3757fd6 --- /dev/null +++ b/common/js/map/openMap.js @@ -0,0 +1,107 @@ +import TransformCoordinate from './transformCoordinate.js' + +function openMapByDefault(latitude, longitude, name) { + uni.openLocation({ + latitude: latitude, + longitude: longitude, + name: name, + fail: (e) => { + uni.showModal({ + content: '打开地图失败,请稍后重试' + }) + }, + }) +} + +function openMapByAndroid(latitude, longitude, name) { + let url = ''; // 回调地址 + let identity = ''; // 程序名称 + if (plus.runtime.isApplicationExist({ + pname: 'com.baidu.BaiduMap' + })) { // baidumap + url = + `baidumap://map/marker?location=${latitude},${longitude}&title=${name}&coord_type=gcj02&src=andr.baidu.openAPIdemo` + identity = 'com.baidu.BaiduMap' + openURL(url, identity) + } else if (plus.runtime.isApplicationExist({ + pname: 'com.autonavi.minimap' + })) { // 高德 + url = `androidamap://viewMap?sourceApplication=appname&poiname=${name}&lat=${latitude}&lon=${longitude}&dev=0` + identity = 'com.autonavi.minimap' + openURL(url, identity) + } else { + openMapByDefault(latitude, longitude, name) + } +} + +function openMapByIos(latitude, longitude, name) { + let url = ''; // 回调地址 + let errorCB = ''; // url失败的回调地址 + let identity = ''; // 程序名称 + + if (plus.runtime.isApplicationExist({ + action: 'baidumap://' + })) { // baidumap + url = + `baidumap://map/marker?location=${latitude},${longitude}&title=${name}&content=${name}&src=ios.baidu.openAPIdemo&coord_type=gcj02`; + openURL(url, identity) + } else if (plus.runtime.isApplicationExist({ + action: 'iosamap://' + })) { // 高德 + url = `iosamap://viewMap?sourceApplication=applicationName&poiname=${name}&lat=${latitude}&lon=${longitude}&dev=0` + openURL(url, identity) + } else { + openMapByDefault(latitude, longitude, name) + } +} + +function openURL(url, identity) { + let newurl = encodeURI(url); + plus.runtime.openURL(newurl, function(res) { + uni.showModal({ + content: res.message + }) + }, identity); +} + +function getCoordByType(longitude, latitude, coord_type) { + switch (coord_type) { + case 'gcj02': + return [longitude, latitude] + break; + case 'bd09': + return TransformCoordinate.bd09togcj02(longitude, latitude) + break; + case 'wgs84': + return TransformCoordinate.wgs84togcj02(longitude, latitude) + break; + default: + return [longitude, latitude] + break; + } +} +export default { + /* 打开地图 */ + openMap(latitude, longitude, name, coord_type = 'gcj02') { + let arr = getCoordByType(longitude, latitude, coord_type) + // #ifdef APP-PLUS + switch (uni.getSystemInfoSync().platform) { + case 'android': + console.log('运行Android上') + openMapByAndroid(arr[1], arr[0], name) + break; + case 'ios': + console.log('运行iOS上') + openMapByIos(arr[1], arr[0], name) + break; + default: + openMapByDefault(arr[1], arr[0], name) + console.log('运行在开发者工具上') + break; + } + // #endif + // #ifndef APP-PLUS + openMapByDefault(arr[1], arr[0], name) + // #endif + } +} diff --git a/common/js/map/transformCoordinate.js b/common/js/map/transformCoordinate.js new file mode 100644 index 0000000..0dec3d4 --- /dev/null +++ b/common/js/map/transformCoordinate.js @@ -0,0 +1,124 @@ +/** + * Created by Wandergis on 2015/7/8. + * 提供了百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换 + */ + +//定义一些常量 +var x_PI = 3.14159265358979324 * 3000.0 / 180.0; +var PI = 3.1415926535897932384626; +var a = 6378245.0; +var ee = 0.00669342162296594323; + +/** + * 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换 + * 即 百度 转 谷歌、高德 + * @param bd_lon + * @param bd_lat + * @returns {*[]} + */ +function bd09togcj02(bd_lon, bd_lat) { + var x_pi = 3.14159265358979324 * 3000.0 / 180.0; + var x = bd_lon - 0.0065; + var y = bd_lat - 0.006; + var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi); + var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi); + var gg_lng = z * Math.cos(theta); + var gg_lat = z * Math.sin(theta); + return [gg_lng, gg_lat] +} + +/** + * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换 + * 即谷歌、高德 转 百度 + * @param lng + * @param lat + * @returns {*[]} + */ +function gcj02tobd09(lng, lat) { + var z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * x_PI); + var theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * x_PI); + var bd_lng = z * Math.cos(theta) + 0.0065; + var bd_lat = z * Math.sin(theta) + 0.006; + return [bd_lng, bd_lat] +} + +/** + * WGS84转GCj02 + * @param lng + * @param lat + * @returns {*[]} + */ +function wgs84togcj02(lng, lat) { + if (out_of_china(lng, lat)) { + return [lng, lat] + } else { + var dlat = transformlat(lng - 105.0, lat - 35.0); + var dlng = transformlng(lng - 105.0, lat - 35.0); + var radlat = lat / 180.0 * PI; + var magic = Math.sin(radlat); + magic = 1 - ee * magic * magic; + var sqrtmagic = Math.sqrt(magic); + dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI); + dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI); + var mglat = lat + dlat; + var mglng = lng + dlng; + return [mglng, mglat] + } +} + +/** + * GCJ02 转换为 WGS84 + * @param lng + * @param lat + * @returns {*[]} + */ +function gcj02towgs84(lng, lat) { + if (out_of_china(lng, lat)) { + return [lng, lat] + } else { + var dlat = transformlat(lng - 105.0, lat - 35.0); + var dlng = transformlng(lng - 105.0, lat - 35.0); + var radlat = lat / 180.0 * PI; + var magic = Math.sin(radlat); + magic = 1 - ee * magic * magic; + var sqrtmagic = Math.sqrt(magic); + dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI); + dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI); + mglat = lat + dlat; + mglng = lng + dlng; + return [lng * 2 - mglng, lat * 2 - mglat] + } +} + +function transformlat(lng, lat) { + var ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng)); + ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0; + ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0; + ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0; + return ret +} + +function transformlng(lng, lat) { + var ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng)); + ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0; + ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0; + ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0; + return ret +} + +/** + * 判断是否在国内,不在国内则不做偏移 + * @param lng + * @param lat + * @returns {boolean} + */ +function out_of_china(lng, lat) { + return (lng < 72.004 || lng > 137.8347) || ((lat < 0.8293 || lat > 55.8271) || false); +} + +export default { + bd09togcj02: bd09togcj02, // 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换 + gcj02tobd09: gcj02tobd09, // 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换 + wgs84togcj02: wgs84togcj02, // + gcj02towgs84: gcj02towgs84, +} diff --git a/common/js/pc.js b/common/js/pc.js new file mode 100644 index 0000000..9e08408 --- /dev/null +++ b/common/js/pc.js @@ -0,0 +1,10 @@ +(function() { + var u = navigator.userAgent, + w = window.innerWidth; + if (w >= 960) { + window.innerWidth = 960; + window.onload = function() { + window.innerWidth = 960; + } + } +})(); diff --git a/common/js/scroll-view.js b/common/js/scroll-view.js new file mode 100644 index 0000000..431e278 --- /dev/null +++ b/common/js/scroll-view.js @@ -0,0 +1,28 @@ +export default { + data() { + return { + showTop: false, + scrollTop: 0, + oldLocation: 0 + } + }, + methods: { + scrollToTopNative() { + uni.pageScrollTo({ + duration: 200, + scrollTop: 0 + }); + } + }, + onReachBottom() { + if(this.$refs.goodrecommend) this.$refs.goodrecommend.getLikeList(10) + }, + onPageScroll(e) { + this.oldLocation = e.scrollTop; + if (e.scrollTop > 400) { + this.showTop = true; + } else { + this.showTop = false; + } + } +} diff --git a/common/js/socketTest.js b/common/js/socketTest.js new file mode 100644 index 0000000..cd5c87e --- /dev/null +++ b/common/js/socketTest.js @@ -0,0 +1,207 @@ +import config from './config.js' +export default { + data() { + return { + timeoutObj: null, //ping定时器 + servicer_id: null, //绑定 + pingInterval: config.pingInterval //本地端主动给服务器ping的时间, 0 则不开启 + } + }, + onLoad() { + let that = this; + // 因为图片上传,所以不能onhide关闭长链接,但是每次打开客服都会有重复请求,所以优先关闭再去打开长链接 + uni.closeSocket(); + // .判断是否已连接 + that.checkOpenSocket(); + // uni.onSocketClose(function(res) { + // console.log('WebSocket 已关闭!'); + // }); + }, + methods: { + // 判断是否已连接 + checkOpenSocket() { + console.log('判断是否已连接') + // alert('判断是否已连接') + let self = this; + uni.sendSocketMessage({ + data: 'ping', + success: (res) => { + console.log('连接成功,检查') + // alert('连接成功,检查') + // self.getChatList(); + return; + }, + fail: (err) => { // 未连接打开websocket连接 + console.log('连接失败') + // alert('连接失败') + self.openConnection(); + } + }); + }, + openConnection() { // 打开连接 + console.log('打开连接') + // alert('打开连接') + // uni.closeSocket(); // 确保已经关闭后再重新打开 + uni.connectSocket({ + url: config.webSocket, + method: 'POST', + success(res) { + console.log('连接成功 connectSocket=', res); + // alert('连接成功 connectSocket=', res); + }, + fail(err) { + console.log('连接失败 connectSocket=', err); + } + }); + // uni.onSocketOpen((res) => { + // console.log('连接成功', res); + // }); + this.onSocketMessage(); // 打开成功监听服务器返回的消息 + }, + // 打开成功监听服务器返回的消息 + onSocketMessage() { // 消息 + console.log("开始监听"); + + let that = this; + this.pingInterval = config.pingInterval; + this.timeoutObj = null; + uni.onSocketMessage((res) => { //type:init,connect,close,string,order,goods + let msg = JSON.parse(res.data); + console.log("监听该服务器消息", res) + if (msg.type == 'close') { + clearInterval(that.timeoutObj); + that.timeoutObj = null; + uni.closeSocket(); + return; + } + this.reset(); + this.getSocketMsg(res.data); // 监听到有新服务器消息 + }); + }, + // 监听到有新服务器消息 + getSocketMsg(reData) { // 监听到服务器消息 + let that = this; + // console.log(reData) + let giveMsg = JSON.parse(reData); + let data = { + isItMe: false, + }; + data.contentType = giveMsg.type; + // alert(data.contentType) + if (giveMsg.type == 'init') { + // alert(123) + that.$api.sendRequest({ + url: '/servicer/api/chat/bind', + data: { + client_id: giveMsg.data.client_id, + site_id: that.siteId + }, + success(res) { + if (res.code == 0) { + that.servicer_id = res.data.servicer_id; + } else { + that.servicer_id = 0; + } + that.getChatList(); + } + }) + } else if (giveMsg.type == 'connect') { + // that.servicer_id = giveMsg.data.servicer_id; + // let NewArr = that.messageList; + // let index = null; + // for (let i = 0; i < NewArr.length; i++) { + // if (NewArr[i].contentType == 'online' || NewArr[i].contentType == 'noline') { + // index = i; + // } + // } + // NewArr.splice(index, 1) + // that.messageList = NewArr; + // let obj = {} + // if (that.servicer_id > 0) { + // obj.contentType = 'online'; + // } else if (that.servicer_id == 0) { + // obj.contentType = 'noline'; + // } + // that.messageList.push(obj); + return false; + } else if (giveMsg.type == 'string') { + data.content = giveMsg.data.servicer_say; + } else if (giveMsg.type == 'image') { + data.image = giveMsg.data.servicer_say; + } else if (giveMsg.type == 'order') { + data.order_id = giveMsg.data.order_id; + } else if (giveMsg.type == 'goodssku') { + data.sku_id = giveMsg.data.goods_sku_id; + } + if (giveMsg.type == 'init') return; + that.messageList.push(data); + that.$nextTick(() => { + that.setPageScrollTo() + }) + }, + // 检测心跳reset + reset() { + console.log("检测心跳") + clearInterval(this.timeoutObj); + this.start(); // 启动心跳 + }, + // 启动心跳 start + start() { + console.log("启动心跳") + let self = this; + this.timeoutObj = setInterval(function() { + uni.sendSocketMessage({ + data: 'ping', + success: (res) => { + console.log('连接中....'); + }, + fail: (err) => { + console.log('连接失败重新连接....'); + self.openConnection(); + } + }); + }, this.pingInterval); + } + }, + // onHide() { + // // alert("关闭") + // // 改之前的 + // // console.log("我出发了") + // // this.checkOpenSocket(); + // clearInterval(this.timeoutObj); + // this.timeoutObj = null; + // this.$api.sendRequest({ + // url: '/servicer/api/chat/bye', + // data: { + // servicer_id: this.servicer_id, + // site_id: this.siteId + // }, + // success(res) { + // uni.closeSocket(); + // }, + // fail: (err) => { + // uni.closeSocket(); + // } + // }); + // }, + onUnload() { + // alert("关闭") + clearInterval(this.timeoutObj); + this.timeoutObj = null; + this.$api.sendRequest({ + url: '/servicer/api/chat/bye', + data: { + servicer_id: this.servicer_id, + site_id: this.siteId + }, + success(res) { + // alert("关闭1") + uni.closeSocket(); + }, + fail: (err) => { + // alert("关闭2") + uni.closeSocket(); + } + }); + } +} diff --git a/common/js/style_color.js b/common/js/style_color.js new file mode 100644 index 0000000..88656b3 --- /dev/null +++ b/common/js/style_color.js @@ -0,0 +1,419 @@ +export default { + 'default':{ + //红色 + name:'default', + main_color : '#F4391c', + aux_color : '#F7B500', + bg_color: '#FF4646',//主题背景 + bg_color_shallow: '#FF4646',//主题背景渐变浅色 + promotion_color: '#FF4646',//活动背景 + promotion_aux_color: '#F7B500',//活动背景辅色 + main_color_shallow: '#FFF4F4',//淡背景 + price_color: 'rgb(252,82,39)',//价格颜色 + btn_text_color: '#FFFFFF',//按钮文字颜色 + goods_detail : { + goods_price : 'rgb(252,82,39,1)',//价格 + promotion_tag:'#FF4646', + goods_card_bg:'#201A18',//会员卡背景 + goods_card_bg_shallow:'#7C7878',//会员卡背景浅色 + goods_card_color:'#FFD792', + goods_coupon:'#FC5227', + goods_cart_num_corner :'#FC5227',//购物车数量角标 + goods_btn_color:'#FF4646',//按钮颜色 + goods_btn_color_shallow:'#F7B500',//副按钮颜色 + }, + pintuan:{ + pintuan_label_bg:'#F7B500', + pintuan_label_color:'#FFFFFF', + pintuan_color:'#FA6400', + pintuan_promotion_color: '#FA3A1D',//活动背景 + pintuan_promotion_aux_color: '#FD9A01',//活动背景辅色 + }, + super_member: { + super_member_start_bg: '#7c7878', + super_member_end_bg: '#201a18', + super_member_start_text_color: '#FFDBA6', + super_member_end_text_color: '#FFEBCA', + }, + bargain:{ + bargain_promotion_color: '#F0353E',//活动背景 + bargain_promotion_aux_color: '#FD9A01',//活动辅色 + }, + seckill:{ + seckill_promotion_color: '#F83530',//活动背景 + seckill_promotion_aux_color: '#FD9A01',//活动辅色 + }, + giftcard:{ + giftcard_promotion_color: '#FF3369',//活动背景 + giftcard_promotion_aux_color: '#F7B500',//活动辅色 + }, + groupby:{ + groupby_promotion_color: '#E64136',//活动背景 + groupby_promotion_aux_color: '#F7B500',//活动辅色 + }, + }, + 'green':{ + name:'green', + main_color : '#19C650', + aux_color : '#FA6400', + bg_color: '#19C650', + bg_color_shallow: '#19C650', + promotion_color: '#19C650', + promotion_aux_color: '#FA6400', + main_color_shallow: '#F0FFF5',//淡背景 + price_color: 'rgba(252,82,39,1)',//价格颜色 + btn_text_color: '#FFFFFF',//按钮文字颜色 + goods_detail : { + goods_price : 'rgba(252,82,39,1)',//价格 + promotion_tag:'#19C650', + goods_card_bg:'#201A18',//会员卡背景 + goods_card_bg_shallow:'#7C7878',//会员卡背景浅色 + goods_card_color:'#FFD792', + goods_coupon:'#FC5227', + goods_cart_num_corner :'#FC5227',//购物车数量角标 + goods_btn_color:'#19C650',//按钮颜色 + goods_btn_color_shallow:'#FA6400',//副按钮颜色 + }, + pintuan:{ + pintuan_label_bg:'#F7B500', + pintuan_label_color:'#FFFFFF', + pintuan_color:'#FA6400', + pintuan_promotion_color: '#FA3A1D',//活动背景 + pintuan_promotion_aux_color: '#FD9A01',//活动背景辅色 + }, + super_member: { + super_member_start_bg: '#7c7878', + super_member_end_bg: '#201a18', + super_member_start_text_color: '#FFDBA6', + super_member_end_text_color: '#FFEBCA', + }, + bargain:{ + bargain_promotion_color: '#F0353E',//活动背景 + bargain_promotion_aux_color: '#FD9A01',//活动辅色 + }, + seckill:{ + seckill_promotion_color: '#F83530',//活动背景 + seckill_promotion_aux_color: '#FD9A01',//活动辅色 + }, + giftcard:{ + giftcard_promotion_color: '#FF3369',//活动背景 + giftcard_promotion_aux_color: '#F7B500',//活动辅色 + }, + groupby:{ + groupby_promotion_color: '#E64136',//活动背景 + groupby_promotion_aux_color: '#F7B500',//活动辅色 + }, + }, + 'blue':{ + name:'blue', + main_color : '#36ABFF', + aux_color : '#FA6400', + bg_color: '#36ABFF', + bg_color_shallow: '#36ABFF', + promotion_color: '#36ABFF ', + promotion_aux_color: '#FA6400', + main_color_shallow: '#E2F3FF', + price_color: 'rgba(252,82,39,1)',//价格颜色 + btn_text_color: '#FFFFFF',//按钮文字颜色 + goods_detail : { + goods_price : 'rgba(252,82,39,1)',//价格 + promotion_tag:'#36ABFF', + goods_card_bg:'#201A18',//会员卡背景 + goods_card_bg_shallow:'#7C7878',//会员卡背景浅色 + goods_card_color:'#FFD792', + goods_coupon:'#FC5227', + goods_cart_num_corner :'#FC5227',//购物车数量角标 + goods_btn_color:'#36ABFF',//按钮颜色 + goods_btn_color_shallow:'#FA6400',//副按钮颜色 + }, + pintuan:{ + pintuan_label_bg:'#F7B500', + pintuan_label_color:'#FFFFFF', + pintuan_color:'#FA6400', + pintuan_promotion_color: '#FA3A1D',//活动背景 + pintuan_promotion_aux_color: '#FD9A01',//活动背景辅色 + }, + super_member: { + super_member_start_bg: '#7c7878', + super_member_end_bg: '#201a18', + super_member_start_text_color: '#FFDBA6', + super_member_end_text_color: '#FFEBCA', + }, + bargain:{ + bargain_promotion_color: '#F0353E',//活动背景 + bargain_promotion_aux_color: '#FD9A01',//活动辅色 + }, + seckill:{ + seckill_promotion_color: '#F83530',//活动背景 + seckill_promotion_aux_color: '#FD9A01',//活动辅色 + }, + giftcard:{ + giftcard_promotion_color: '#FF3369',//活动背景 + giftcard_promotion_aux_color: '#F7B500',//活动辅色 + }, + groupby:{ + groupby_promotion_color: '#E64136',//活动背景 + groupby_promotion_aux_color: '#F7B500',//活动辅色 + }, + }, + 'pink':{ + name:'pink', + main_color : '#FF407E', + aux_color : '#F7B500', + bg_color: '#FF407E',//主题背景 + bg_color_shallow: '#FF407E',//主题背景渐变浅色 + promotion_color: '#FF407E',//活动背景 + promotion_aux_color: '#F7B500',//活动背景辅色 + main_color_shallow: '#FFF5F8',//淡背景 + price_color: 'rgba(252,82,39,1)',//价格颜色 + btn_text_color: '#FFFFFF',//按钮文字颜色 + goods_detail : { + goods_price : 'rgba(252,82,39,1)',//价格 + promotion_tag:'#FF407E', + goods_card_bg:'#201A18',//会员卡背景 + goods_card_bg_shallow:'#7C7878',//会员卡背景浅色 + goods_card_color:'#FFD792', + goods_coupon:'#FC5227', + goods_cart_num_corner :'#FC5227',//购物车数量角标 + goods_btn_color:'#FF407E',//按钮颜色 + goods_btn_color_shallow:'#F7B500',//副按钮颜色 + }, + pintuan:{ + pintuan_label_bg:'#F7B500', + pintuan_label_color:'#FFFFFF', + pintuan_color:'#FA6400', + pintuan_promotion_color: '#FA3A1D',//活动背景 + pintuan_promotion_aux_color: '#FD9A01',//活动背景辅色 + }, + super_member: { + super_member_start_bg: '#7c7878', + super_member_end_bg: '#201a18', + super_member_start_text_color: '#FFDBA6', + super_member_end_text_color: '#FFEBCA', + }, + bargain:{ + bargain_promotion_color: '#F0353E',//活动背景 + bargain_promotion_aux_color: '#FD9A01',//活动辅色 + }, + seckill:{ + seckill_promotion_color: '#F83530',//活动背景 + seckill_promotion_aux_color: '#FD9A01',//活动辅色 + }, + giftcard:{ + giftcard_promotion_color: '#FF3369',//活动背景 + giftcard_promotion_aux_color: '#F7B500',//活动辅色 + }, + groupby:{ + groupby_promotion_color: '#E64136',//活动背景 + groupby_promotion_aux_color: '#F7B500',//活动辅色 + }, + }, + 'gold':{ + name:'gold', + main_color : '#CFAF70', + aux_color : '#444444', + bg_color: '#CFAF70',//主题背景 + bg_color_shallow: '#CFAF70',//主题背景渐变浅色 + promotion_color: '#CFAF70',//活动背景 + promotion_aux_color: '#444444',//活动背景辅色 + main_color_shallow: '#FFFAF1',//淡背景 + price_color: 'rgba(252,82,39,1)',//价格颜色 + btn_text_color: '#FFFFFF',//按钮文字颜色 + goods_detail : { + goods_price : 'rgba(252,82,39,1)',//价格 + promotion_tag:'#CFAF70', + goods_card_bg:'#201A18',//会员卡背景 + goods_card_bg_shallow:'#7C7878',//会员卡背景浅色 + goods_card_color:'#FFD792', + goods_coupon:'#FC5227', + goods_cart_num_corner :'#FC5227',//购物车数量角标 + goods_btn_color:'#CFAF70',//按钮颜色 + goods_btn_color_shallow:'#444444',//副按钮颜色 + }, + pintuan:{ + pintuan_label_bg:'#F7B500', + pintuan_label_color:'#FFFFFF', + pintuan_color:'#FA6400', + pintuan_promotion_color: '#FA3A1D',//活动背景 + pintuan_promotion_aux_color: '#FD9A01',//活动背景辅色 + }, + super_member: { + super_member_start_bg: '#7c7878', + super_member_end_bg: '#201a18', + super_member_start_text_color: '#FFDBA6', + super_member_end_text_color: '#FFEBCA', + }, + bargain:{ + bargain_promotion_color: '#F0353E',//活动背景 + bargain_promotion_aux_color: '#FD9A01',//活动辅色 + }, + seckill:{ + seckill_promotion_color: '#F83530',//活动背景 + seckill_promotion_aux_color: '#FD9A01',//活动辅色 + }, + giftcard:{ + giftcard_promotion_color: '#FF3369',//活动背景 + giftcard_promotion_aux_color: '#F7B500',//活动辅色 + }, + groupby:{ + groupby_promotion_color: '#E64136',//活动背景 + groupby_promotion_aux_color: '#F7B500',//活动辅色 + }, + }, + 'purple':{ + name:'purple', + main_color : '#A253FF', + aux_color : '#222222', + bg_color: '#A253FF',//主题背景 + bg_color_shallow: '#A253FF',//主题背景渐变浅色 + promotion_color: '#A253FF',//活动背景 + promotion_aux_color: '#222222',//活动背景辅色 + main_color_shallow: '#F8F3FF',//淡背景 + price_color: 'rgba(252,82,39,1)',//价格颜色 + btn_text_color: '#FFFFFF',//按钮文字颜色 + goods_detail : { + goods_price : 'rgba(252,82,39,1)',//价格 + promotion_tag:'#A253FF', + goods_card_bg:'#201A18',//会员卡背景 + goods_card_bg_shallow:'#7C7878',//会员卡背景浅色 + goods_card_color:'#FFD792', + goods_coupon:'#FC5227', + goods_cart_num_corner :'#FC5227',//购物车数量角标 + goods_btn_color:'#A253FF',//按钮颜色 + goods_btn_color_shallow:'#222222',//副按钮颜色 + }, + pintuan:{ + pintuan_label_bg:'#F7B500', + pintuan_label_color:'#FFFFFF', + pintuan_color:'#FA6400', + pintuan_promotion_color: '#FA3A1D',//活动背景 + pintuan_promotion_aux_color: '#FD9A01',//活动背景辅色 + }, + super_member: { + super_member_start_bg: '#7c7878', + super_member_end_bg: '#201a18', + super_member_start_text_color: '#FFDBA6', + super_member_end_text_color: '#FFEBCA', + }, + bargain:{ + bargain_promotion_color: '#F0353E',//活动背景 + bargain_promotion_aux_color: '#FD9A01',//活动辅色 + }, + seckill:{ + seckill_promotion_color: '#F83530',//活动背景 + seckill_promotion_aux_color: '#FD9A01',//活动辅色 + }, + giftcard:{ + giftcard_promotion_color: '#FF3369',//活动背景 + giftcard_promotion_aux_color: '#F7B500',//活动辅色 + }, + groupby:{ + groupby_promotion_color: '#E64136',//活动背景 + groupby_promotion_aux_color: '#F7B500',//活动辅色 + }, + }, + 'yellow':{ + name:'yellow', + main_color : '#FFD009', + aux_color : '#1D262E', + bg_color: '#FFD009',//主题背景 + bg_color_shallow: '#FFD009',//主题背景渐变浅色 + promotion_color: '#FFD009',//活动背景 + promotion_aux_color: '#1D262E',//活动背景辅色 + main_color_shallow: '#FFFBEF',//淡背景 + price_color: 'rgba(252,82,39,1)',//价格颜色 + btn_text_color: '#303133',//按钮文字颜色 + goods_detail : { + goods_price : 'rgba(252,82,39,1)',//价格 + promotion_tag:'#FFD009', + goods_card_bg:'#201A18',//会员卡背景 + goods_card_bg_shallow:'#7C7878',//会员卡背景浅色 + goods_card_color:'#FFD792', + goods_coupon:'#FC5227', + goods_cart_num_corner :'#FC5227',//购物车数量角标 + goods_btn_color:'#FFD009',//按钮颜色 + goods_btn_color_shallow:'#1D262E',//副按钮颜色 + }, + pintuan:{ + pintuan_label_bg:'#F7B500', + pintuan_label_color:'#FFFFFF', + pintuan_color:'#FA6400', + pintuan_promotion_color: '#FA3A1D',//活动背景 + pintuan_promotion_aux_color: '#FD9A01',//活动背景辅色 + }, + super_member: { + super_member_start_bg: '#7c7878', + super_member_end_bg: '#201a18', + super_member_start_text_color: '#FFDBA6', + super_member_end_text_color: '#FFEBCA', + }, + bargain:{ + bargain_promotion_color: '#F0353E',//活动背景 + bargain_promotion_aux_color: '#FD9A01',//活动辅色 + }, + seckill:{ + seckill_promotion_color: '#F83530',//活动背景 + seckill_promotion_aux_color: '#FD9A01',//活动辅色 + }, + giftcard:{ + giftcard_promotion_color: '#FF3369',//活动背景 + giftcard_promotion_aux_color: '#F7B500',//活动辅色 + }, + groupby:{ + groupby_promotion_color: '#E64136',//活动背景 + groupby_promotion_aux_color: '#F7B500',//活动辅色 + }, + }, + 'black':{ + name:'black', + main_color : '#222222', + aux_color : '#FFFFFF', + bg_color: '#222222',//主题背景 + bg_color_shallow: '#333333',//主题背景渐变浅色 + promotion_color: '#222222',//活动背景 + promotion_aux_color: '#FA8B00',//活动背景辅色 + main_color_shallow: '#efefef',//淡背景 + price_color: 'rgba(255,0,0,1)',//价格颜色 + btn_text_color: '#FFFFFF',//按钮文字颜色 + goods_detail : { + goods_price : 'rgba(255,0,0,1)',//价格 + promotion_tag:'#222222', + goods_card_bg:'#201A18',//会员卡背景 + goods_card_bg_shallow:'#7C7878',//会员卡背景浅色 + goods_card_color:'#FFD792', + goods_coupon:'#222222', + goods_cart_num_corner :'#FF0000',//购物车数量角标 + goods_btn_color:'#222222',//按钮颜色 + goods_btn_color_shallow:'#FA8B00',//副按钮颜色 + }, + pintuan:{ + pintuan_label_bg:'#F7B500', + pintuan_label_color:'#FFFFFF', + pintuan_color:'#FA6400', + pintuan_promotion_color: '#FA3A1D',//活动背景 + pintuan_promotion_aux_color: '#FD9A01',//活动背景辅色 + }, + super_member: { + super_member_start_bg: '#fadcb5', + super_member_end_bg: '#f6bd74', + super_member_start_text_color: '#ab6126', + super_member_end_text_color: '#d19336', + }, + bargain:{ + bargain_promotion_color: '#F0353E',//活动背景 + bargain_promotion_aux_color: '#FD9A01',//活动辅色 + }, + seckill:{ + seckill_promotion_color: '#F83530',//活动背景 + seckill_promotion_aux_color: '#FD9A01',//活动辅色 + }, + giftcard:{ + giftcard_promotion_color: '#FF3369',//活动背景 + giftcard_promotion_aux_color: '#F7B500',//活动辅色 + }, + groupby:{ + groupby_promotion_color: '#E64136',//活动背景 + groupby_promotion_aux_color: '#F7B500',//活动辅色 + }, + } +} diff --git a/common/js/util.js b/common/js/util.js new file mode 100644 index 0000000..a006df1 --- /dev/null +++ b/common/js/util.js @@ -0,0 +1,900 @@ +import Config from './config.js' +import store from '@/store/index.js' +import Http from './http.js' +import { + Weixin +} from 'common/js/wx-jssdk.js'; + +export default { + /** + * 页面跳转 + * @param {string} to 跳转链接 /pages/idnex/index + * @param {Object} param 参数 {key : value, ...} + * @param {string} mode 模式 + */ + redirectTo(to, param, mode) { + let url = to; + let tabbarList = ['/pages/index/index', '/pages/goods/category', '/pages/goods/cart', + '/pages/member/index' + ] + if (param != undefined) { + Object.keys(param).forEach(function(key) { + if (url.indexOf('?') != -1) { + url += "&" + key + "=" + param[key]; + } else { + url += "?" + key + "=" + param[key]; + } + }); + } + for (let i = 0; i < tabbarList.length; i++) { + if (url.indexOf(tabbarList[i]) == 0) { + uni.switchTab({ + url + }) + return; + } + } + switch (mode) { + case 'tabbar': + // 跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面。 + uni.switchTab({ + url + }) + break; + case 'redirectTo': + // 关闭当前页面,跳转到应用内的某个页面。 + uni.redirectTo({ + url + }); + break; + case 'reLaunch': + // 关闭所有页面,打开到应用内的某个页面。 + uni.reLaunch({ + url + }); + break; + default: + // 保留当前页面,跳转到应用内的某个页面 + uni.navigateTo({ + url + }); + } + }, + /** + * 图片路径转换 + * @param {String} img_path 图片地址 + * @param {Object} params 参数,针对商品、相册里面的图片区分大中小,size: big、mid、small + */ + img(img_path, params) { + var path = ""; + if (img_path != undefined && img_path != "") { + if (img_path.split(',').length > 1) { + img_path = img_path.split(',')[0]; + } + if (params && img_path != this.getDefaultImage().goods) { + // 过滤默认图 + let arr = img_path.split("."); + let suffix = arr[arr.length - 1]; + arr.pop(); + arr[arr.length - 1] = arr[arr.length - 1] + "_" + params.size.toUpperCase(); + arr.push(suffix); + img_path = arr.join("."); + } + if (img_path.indexOf("http://") == -1 && img_path.indexOf("https://") == -1) { + path = Config.imgDomain + "/" + img_path; + } else { + path = img_path; + } + // 处理商品助手的图片路径 + path = path.replace("addons/NsGoodsAssist/", "").replace("shop/goods/", ""); + } + // path += '?t=' + parseInt(new Date().getTime() / 1000); + return path; + }, + /** + * 时间戳转日期格式 + * @param {Object} timeStamp + */ + timeStampTurnTime(timeStamp, type = "") { + if (timeStamp != undefined && timeStamp != "" && timeStamp > 0) { + var date = new Date(); + date.setTime(timeStamp * 1000); + var y = date.getFullYear(); + var m = date.getMonth() + 1; + m = m < 10 ? ('0' + m) : m; + var d = date.getDate(); + d = d < 10 ? ('0' + d) : d; + var h = date.getHours(); + h = h < 10 ? ('0' + h) : h; + var minute = date.getMinutes(); + var second = date.getSeconds(); + minute = minute < 10 ? ('0' + minute) : minute; + second = second < 10 ? ('0' + second) : second; + if (type) { + if (type == 'yearMonthDay') { + return y + '年' + m + '月' + d + '日'; + } + return y + '-' + m + '-' + d; + } else { + return y + '-' + m + '-' + d + ' ' + h + ':' + minute + ':' + second; + } + + } else { + return ""; + } + }, + /** + * 日期格式转时间戳 + * @param {Object} timeStamp + */ + timeTurnTimeStamp(string) { + var f = string.split(' ', 2); + var d = (f[0] ? f[0] : '').split('-', 3); + var t = (f[1] ? f[1] : '').split(':', 3); + return (new Date( + parseInt(d[0], 10) || null, + (parseInt(d[1], 10) || 1) - 1, + parseInt(d[2], 10) || null, + parseInt(t[0], 10) || null, + parseInt(t[1], 10) || null, + parseInt(t[2], 10) || null + )).getTime() / 1000; + }, + /** + * 倒计时 + * @param {Object} seconds 秒 + */ + countDown(seconds) { + let [day, hour, minute, second] = [0, 0, 0, 0] + if (seconds > 0) { + day = Math.floor(seconds / (60 * 60 * 24)) + hour = Math.floor(seconds / (60 * 60)) - (day * 24) + minute = Math.floor(seconds / 60) - (day * 24 * 60) - (hour * 60) + second = Math.floor(seconds) - (day * 24 * 60 * 60) - (hour * 60 * 60) - (minute * 60) + } + if (day < 10) { + day = '0' + day + } + if (hour < 10) { + hour = '0' + hour + } + if (minute < 10) { + minute = '0' + minute + } + if (second < 10) { + second = '0' + second + } + return { + d: day, + h: hour, + i: minute, + s: second + }; + }, + /** + * 数值去重 + * @param {Array} arr 数组 + * @param {string} field 字段 + */ + unique(arr, field) { + const res = new Map(); + return arr.filter((a) => !res.has(a[field]) && res.set(a[field], 1)); + }, + /** + * 判断值是否在数组中 + * @param {Object} elem + * @param {Object} arr + * @param {Object} i + */ + inArray: function(elem, arr) { + return arr == null ? -1 : arr.indexOf(elem); + }, + /** + * 获取某天日期 + * @param {Object} day + */ + getDay: function(day) { + var today = new Date(); + var targetday_milliseconds = today.getTime() + 1000 * 60 * 60 * 24 * day; + today.setTime(targetday_milliseconds); + + const doHandleMonth = function(month) { + var m = month; + if (month.toString().length == 1) { + m = "0" + month; + } + return m + } + + var tYear = today.getFullYear(); + var tMonth = today.getMonth(); + var tDate = today.getDate(); + var tWeek = today.getDay(); + var time = parseInt(today.getTime() / 1000); + tMonth = doHandleMonth(tMonth + 1); + tDate = doHandleMonth(tDate); + + const week = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'] + return { + 't': time, + 'y': tYear, + 'm': tMonth, + 'd': tDate, + 'w': week[tWeek] + }; + }, + /** + * 图片选择加上传 + * @param number num + * @param {Object} params + * @param {Object} callback + * @param string url + * return array + */ + upload: function(num, params, callback, url) { + // #ifdef H5 + var app_type = this.isWeiXin() ? 'wechat' : 'h5'; + var app_type_name = this.isWeiXin() ? '微信公众号' : 'H5'; + // #endif + + // #ifdef MP-WEIXIN + var app_type = 'weapp'; + var app_type_name = '微信小程序'; + // #endif + + // #ifdef MP-ALIPAY + var app_type = 'aliapp'; + var app_type_name = '支付宝小程序'; + // #endif + + // #ifdef MP-BAIDU + var app_type = 'baiduapp'; + var app_type_name = '百度小程序'; + // #endif + + // #ifdef MP-TOUTIAO + var app_type = 'MP-TOUTIAO'; + var app_type_name = '头条小程序'; + // #endif + + // #ifdef MP-QQ + var app_type = 'MP-QQ'; + var app_type_name = 'QQ小程序'; + // #endif + var data = { + token: uni.getStorageSync('token'), + app_type: app_type, + app_type_name: app_type_name + } + data = Object.assign(data, params); + + var imgs_num = num; + var _self = this; + + uni.chooseImage({ + count: imgs_num, + sizeType: ['compressed'], //可以指定是原图还是压缩图,默认二者都有 + sourceType: ['album', 'camera'], //从相册或者拍照 + success: async function(res) { + const tempFilePaths = res.tempFilePaths; + var _data = data; + var imgs = []; + uni.showLoading({ + title: '图片上传中' + }) + for (var i = 0; i < tempFilePaths.length; i++) { + var path = await _self.upload_file_server(tempFilePaths[i], _data, params.path, + url); + imgs.push(path); + if (imgs.length == tempFilePaths.length) { + uni.hideLoading() + uni.showToast({ + title: '上传成功', + icon: 'none' + }) + typeof callback == 'function' && callback(imgs); + } + } + }, + fail: err => { + uni.hideLoading() + uni.showToast({ + title: '上传失败', + icon: 'none' + }) + } + }); + }, + //上传 + upload_file_server(tempFilePath, data, path, url = "", callback) { + if (url) { + var uploadUrl = Config.baseUrl + url + } else { + var uploadUrl = Config.baseUrl + '/api/upload/' + path + } + return new Promise((resolve, reject) => { + uni.uploadFile({ + url: uploadUrl, + filePath: tempFilePath, + name: 'file', + formData: data, + success: function(res) { + var path_str = JSON.parse(res.data); + if (path_str.code >= 0) { + resolve(path_str.data.pic_path); + typeof callback == 'function' && callback(path_str.data.pic_path); + } else { + reject("error"); + } + } + }); + + }); + + }, + /** + * 复制 + * @param {Object} message + * @param {Object} callback + */ + copy(value, callback) { + // #ifdef H5 + var oInput = document.createElement('input'); //创建一个隐藏input(重要!) + oInput.value = value; //赋值 + oInput.setAttribute("readonly", "readonly"); + document.body.appendChild(oInput); + oInput.select(); // 选择对象 + document.execCommand("Copy"); // 执行浏览器复制命令 + oInput.className = 'oInput'; + oInput.style.display = 'none'; + uni.hideKeyboard(); + this.showToast({ + title: '复制成功' + }); + + typeof callback == 'function' && callback(); + // #endif + + // #ifdef MP || APP-PLUS + uni.setClipboardData({ + data: value, + success: () => { + typeof callback == 'function' && callback(); + } + }); + // #endif + }, + /** + * 是否是微信浏览器 + */ + isWeiXin() { + // #ifndef H5 + return false; + // #endif + var ua = navigator.userAgent.toLowerCase(); + if (ua.match(/MicroMessenger/i) == "micromessenger") { + return true; + } else { + return false; + } + }, + /** + * 显示消息提示框 + * @param {Object} params 参数 + */ + showToast(params = {}) { + params.title = params.title || ""; + params.icon = params.icon || "none"; + // params.position = params.position || 'bottom'; + params.duration = params.duration || 1500; + uni.showToast(params); + if (params.success) params.success(); + }, + /** + * 检测苹果X以上的手机 + */ + isIPhoneX() { + let res = uni.getSystemInfoSync(); + if (res.model.search('iPhone X') != -1) { + return true; + } + return false; + }, + //判断安卓还是iOS + isAndroid() { + let platform = uni.getSystemInfoSync().platform + if (platform == 'ios') { + return false; + } else if (platform == 'android') { + return true; + } + }, + /** + * 深度拷贝对象 + * @param {Object} obj + */ + deepClone(obj) { + const isObject = function(obj) { + return typeof obj == 'object'; + } + + if (!isObject(obj)) { + throw new Error('obj 不是一个对象!') + } + //判断传进来的是对象还是数组 + let isArray = Array.isArray(obj) + let cloneObj = isArray ? [] : {} + //通过for...in来拷贝 + for (let key in obj) { + cloneObj[key] = isObject(obj[key]) ? this.deepClone(obj[key]) : obj[key] + } + return cloneObj + }, + /** + * 自定义模板的跳转链接 + * @param {Object} link + */ + diyRedirectTo(link) { + if (link == null || Object.keys(link).length == 1) return; + + if (link.wap_url && link.wap_url.indexOf('http') != -1 || link.wap_url && link.wap_url.indexOf('http') != -1) { + // #ifdef H5 + window.location.href = link.wap_url; + // #endif + // #ifdef MP + this.redirectTo('/pages_tool/webview/webview', { + src: encodeURIComponent(link.wap_url) + }); + // #endif + } else if (link.appid) { + uni.navigateToMiniProgram({ + appId: link.appid, + path: link.page + }) + } else if (link.name == 'MOBILE' && !link.wap_url) { + uni.makePhoneCall({ + phoneNumber: link.mobile, + success: (res) => {}, + fail: (res) => {} + }); + } else if (link.wap_url) { + this.redirectTo(link.wap_url); + } + }, + /** + * 获取默认图 + * @param {Object} link + */ + getDefaultImage() { + let defaultImg = uni.getStorageSync('default_img'); + if (defaultImg) { + defaultImg.goods = this.img(defaultImg.goods); + defaultImg.head = this.img(defaultImg.head); + defaultImg.store = this.img(defaultImg.store); + defaultImg.article = this.img(defaultImg.article); + return defaultImg; + } else { + return { + goods: '', + head: '', + store: '', + article: '' + }; + } + }, + /** + * 判断手机是否为iphoneX系列 + */ + uniappIsIPhoneX() { + let isIphoneX = false; + let systemInfo = uni.getSystemInfoSync(); + // #ifdef MP + if (systemInfo.model.search('iPhone X') != -1 || systemInfo.model.search('iPhone 11') != -1 || systemInfo.model + .search('iPhone 12') != -1 || systemInfo.model.search('iPhone 13') != -1) { + isIphoneX = true; + } + // #endif + + // #ifdef H5 + var u = navigator.userAgent; + var isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端 + if (isIOS) { + if (systemInfo.screenWidth == 375 && systemInfo.screenHeight == 812 && systemInfo.pixelRatio == 3) { + isIphoneX = true; + } else if (systemInfo.screenWidth == 414 && systemInfo.screenHeight == 896 && systemInfo.pixelRatio == 3) { + isIphoneX = true; + } else if (systemInfo.screenWidth == 414 && systemInfo.screenHeight == 896 && systemInfo.pixelRatio == 2) { + isIphoneX = true; + } + } + // #endif + return isIphoneX; + }, + /** + * 判断手机是否为iphone11系列 + */ + uniappIsIPhone11() { + let isIphone11 = false; + let systemInfo = uni.getSystemInfoSync(); + // #ifdef MP + if (systemInfo.model.search('iPhone 11') != -1) { + isIphone11 = true; + } + // #endif + return isIphone11; + }, + // #ifdef H5 + //判断该浏览器是否为safaria浏览器 + isSafari() { + let res = uni.getSystemInfoSync(); + var ua = navigator.userAgent.toLowerCase(); + if (ua.indexOf('applewebkit') > -1 && ua.indexOf('mobile') > -1 && ua.indexOf('safari') > -1 && + ua.indexOf('linux') === -1 && ua.indexOf('android') === -1 && ua.indexOf('chrome') === -1 && + ua.indexOf('ios') === -1 && ua.indexOf('browser') === -1) { + return true; + } else { + return false; + } + }, + // #endif + numberFixed(e, f) { + if (!f) { + f = 0; + } + return Number(e).toFixed(f); + }, + /** + * 获取url参数 + */ + getUrlCode(callback) { + var url = location.search; + var theRequest = new Object(); + if (url.indexOf('?') != -1) { + var str = url.substr(1); + var strs = str.split('&'); + for (var i = 0; i < strs.length; i++) { + theRequest[strs[i].split('=')[0]] = strs[i].split('=')[1]; + } + } + typeof callback == 'function' && callback(theRequest); + }, + /** + * 获取当前页面路由 + */ + getCurrRoute() { + let routes = getCurrentPages(); // 获取当前打开过的页面路由数组 + return routes.length ? routes[routes.length - 1].route : ''; + }, + goBack(backUrl = '/pages/index/index') { + if (getCurrentPages().length == 1) { + this.redirectTo(backUrl); + } else { + uni.navigateBack(); + } + }, + /** + * @param {Object} 转化时间字符串 (转化时分秒) + */ + getTimeStr(val) { + var h = parseInt(val / 3600).toString(); + var m = parseInt((val % 3600) / 60).toString(); + if (m.length == 1) { + m = '0' + m; + } + if (h.length == 1) { + h = '0' + h; + } + return h + ':' + m; + }, + /** + * 获取定位信息 + */ + getLocation(param = {}) { + uni.getLocation({ + type: param.type ?? 'gcj02', + success: res => { + store.commit('setLocation', res); + typeof param.success == 'function' && param.success(res); + }, + fail: res => { + typeof param.fail == 'function' && param.fail(res); + }, + complete: res => { + typeof param.complete == 'function' && param.complete(res); + } + }); + }, + // 计算两个经纬度之间的距离 + getDistance(lat1, lng1, lat2, lng2) { + var radLat1 = lat1 * Math.PI / 180.0; + var radLat2 = lat2 * Math.PI / 180.0; + var a = radLat1 - radLat2; + var b = lng1 * Math.PI / 180.0 - lng2 * Math.PI / 180.0; + var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2))); + s = s * 6378.137; // EARTH_RADIUS; + s = Math.round(s * 10000) / 10000; + return s; + }, + //记录分享人 + onSourceMember(source_member) { + Http.sendRequest({ + url: '/api/Member/alterShareRelation', + data: { + share_member: source_member, + }, + success: res => { + if (res.code >= 0) { + uni.removeStorage({ + key: 'source_member', + success: res => { + console.log('删除成功', res) + } + }) + } + } + }) + }, + /** + * 微信订阅消息 + */ + subscribeMessage(string) { + let keywords = string; + Http.sendRequest({ + url: '/weapp/api/weapp/messagetmplids', + data: { + keywords: keywords + }, + success: res => { + if (res.data.length) { + uni.requestSubscribeMessage({ + tmplIds: res.data, + success: (res) => { + console.log("res", res) + }, + fail: (res) => { + console.log('fail', res) + } + }) + } + } + }) + }, + /** + * 分享获取memberId,进行上下级绑定 + */ + getMemberId() { + return new Promise((resolve, reject) => { + Http.sendRequest({ + url: "/api/member/id", + success: res => { + if (res.code >= 0) { + resolve(res.data) + } else { + reject(res) + } + } + }); + }) + }, + /** + * 获取小程序分享内容数据 + */ + getMpShare(path) { + //如果没有特别指定 则获取当前页面的路由 + if (!path) { + let route = this.getCurrentRoute(); + path = route.path; + if(path == '/pages/member/index'){ + return new Promise((resolve, reject) => { resolve({}) }); + }; + } + return new Promise((resolve, reject) => { + Http.sendRequest({ + url: "/weapp/api/weapp/share", + data: { + path: path + }, + success: res => { + if (res.code >= 0) { + let shareConfig = res.data.data; + if (shareConfig) { + //分享给好友 + let appMessageData = { + title: shareConfig.title, + path: shareConfig.path, + imageUrl: shareConfig.imageUrl, + success: res => {}, + fail: res => {} + } + //分享到朋友圈 + let query = ''; + if (shareConfig.path.indexOf('?') > 0) { + query = shareConfig.path.split('?')[1]; + } + let timeLineData = { + title: shareConfig.title, + query: shareConfig.path, + imageUrl: shareConfig.imageUrl, + } + resolve({ + appMessage: appMessageData, + timeLine: timeLineData, + }) + } else { + reject(res.data); + } + } else { + reject(res.data) + } + } + }); + }) + }, + /** + * 设置公众号分享 + * @param {Object} shareData + */ + setPublicShare(shareData, callback) { + if (!this.isWeiXin()) return; + Http.sendRequest({ + url: '/wechat/api/wechat/jssdkconfig', + data: { + url: uni.getSystemInfoSync().platform == 'ios' ? uni.getStorageSync('initUrl') : window.location + .href + }, + success: res => { + if (res.code == 0) { + var wxJS = new Weixin(); + wxJS.init(res.data); + wxJS.weixin.showOptionMenu(); + + wxJS.setShareData({ + title: shareData.title ?? '', + desc: shareData.desc ?? '', + link: shareData.link ?? location.href, + imgUrl: shareData.imgUrl ? this.img(shareData.imgUrl) : '' + }, (res) => { + typeof callback == 'function' && callback(res); + }) + } + } + }) + }, + //获取当前路由 + getCurrentRoute() { + let currentRoutes = getCurrentPages(); // 获取当前打开过的页面路由数组 + let currentRoute = currentRoutes[currentRoutes.length - 1].route //获取当前页面路由 + let currentParam = currentRoutes[currentRoutes.length - 1].options; //获取路由参数 + // 拼接参数 + let param = []; + for (let key in currentParam) { + param.push(key + '=' + currentParam[key]) + } + let currentPath = '/' + currentRoute; + let currentQuery = param.join('&'); + if (currentQuery) currentPath += '?' + currentQuery; + + return { + path: currentPath, + query: currentQuery, + } + }, + //获取分享路由 + getCurrentShareRoute(member_id) { + let route = this.getCurrentRoute(); + //去掉原来的分享人数据 + route.path = route.path.replace(/[?|&]source_member=\d+/, ''); + if (member_id) { + //路径的处理 + if (route.path.indexOf('?') > 0) { + route.path += '&'; + } else { + route.path += '?'; + } + route.path += 'source_member=' + member_id; + //参数的处理 + if (route.query) { + route.query += '&'; + } + route.query += 'source_member=' + member_id; + } + return route; + }, + /** + * 对象转style字符串 + * @param {Object} obj + */ + objToStyle(obj) { + let s = []; + for (let i in obj) { + s.push(i + ':' + obj[i]); + } + return s.join(';') + }, + /** + * 颜色减值 + * @param {Object} c1 + * @param {Object} c2 + * @param {Object} ratio + */ + colourBlend(c1, c2, ratio) { + ratio = Math.max(Math.min(Number(ratio), 1), 0) + let r1 = parseInt(c1.substring(1, 3), 16) + let g1 = parseInt(c1.substring(3, 5), 16) + let b1 = parseInt(c1.substring(5, 7), 16) + let r2 = parseInt(c2.substring(1, 3), 16) + let g2 = parseInt(c2.substring(3, 5), 16) + let b2 = parseInt(c2.substring(5, 7), 16) + let r = Math.round(r1 * (1 - ratio) + r2 * ratio) + let g = Math.round(g1 * (1 - ratio) + g2 * ratio) + let b = Math.round(b1 * (1 - ratio) + b2 * ratio) + r = ('0' + (r || 0).toString(16)).slice(-2) + g = ('0' + (g || 0).toString(16)).slice(-2) + b = ('0' + (b || 0).toString(16)).slice(-2) + return '#' + r + g + b + }, + /** + * 生成贝塞尔曲线轨迹 + * @param {Object} points + * @param {Object} times + */ + bezier(points, times) { + var bezier_points = []; + var points_D = []; + var points_E = []; + const DIST_AB = Math.sqrt(Math.pow(points[1]['x'] - points[0]['x'], 2) + Math.pow(points[1]['y'] - points[0][ + 'y' + ], 2)); + // 邻控制BC点间距 + const DIST_BC = Math.sqrt(Math.pow(points[2]['x'] - points[1]['x'], 2) + Math.pow(points[2]['y'] - points[1][ + 'y' + ], 2)); + // D每次在AB方向上移动的距离 + const EACH_MOVE_AD = -(DIST_AB / times); + // E每次在BC方向上移动的距离 + const EACH_MOVE_BE = -(DIST_BC / times); + // 点AB的正切 + const TAN_AB = (points[1]['y'] - points[0]['y']) / (points[1]['x'] - points[0]['x']); + // 点BC的正切 + const TAN_BC = (points[2]['y'] - points[1]['y']) / (points[2]['x'] - points[1]['x']); + // 点AB的弧度值 + const RADIUS_AB = Math.atan(TAN_AB); + // 点BC的弧度值 + const RADIUS_BC = Math.atan(TAN_BC); + // 每次执行 + for (var i = 1; i <= times; i++) { + // AD的距离 + var dist_AD = EACH_MOVE_AD * i; + // BE的距离 + var dist_BE = EACH_MOVE_BE * i; + // D点的坐标 + var point_D = {}; + point_D['x'] = dist_AD * Math.cos(RADIUS_AB) + points[0]['x']; + point_D['y'] = dist_AD * Math.sin(RADIUS_AB) + points[0]['y']; + points_D.push(point_D); + // E点的坐标 + var point_E = {}; + point_E['x'] = dist_BE * Math.cos(RADIUS_BC) + points[1]['x']; + point_E['y'] = dist_BE * Math.sin(RADIUS_BC) + points[1]['y']; + points_E.push(point_E); + // 此时线段DE的正切值 + var tan_DE = (point_E['y'] - point_D['y']) / (point_E['x'] - point_D['x']); + // tan_DE的弧度值 + var radius_DE = Math.atan(tan_DE); + // 地市DE的间距 + var dist_DE = Math.sqrt(Math.pow((point_E['x'] - point_D['x']), 2) + Math.pow((point_E['y'] - point_D['y']), + 2)); + // 此时DF的距离 + var dist_DF = (dist_AD / DIST_AB) * dist_DE; + // 此时DF点的坐标 + var point_F = {}; + point_F['x'] = dist_DF * Math.cos(radius_DE) + point_D['x']; + point_F['y'] = dist_DF * Math.sin(radius_DE) + point_D['y']; + bezier_points.push(point_F); + } + return { + 'bezier_points': bezier_points + }; + } +} diff --git a/common/js/validate.js b/common/js/validate.js new file mode 100644 index 0000000..14f8a19 --- /dev/null +++ b/common/js/validate.js @@ -0,0 +1,166 @@ +/** +数据验证(表单验证) +*/ +module.exports = { + error: '', + check: function(data, rule) { + for (var i = 0; i < rule.length; i++) { + if (!rule[i].checkType) { + return true; + } + if (!rule[i].name) { + return true; + } + if (!rule[i].errorMsg) { + return true; + } + if (!data[rule[i].name]) { + this.error = rule[i].errorMsg; + return false; + } + switch (rule[i].checkType) { + case 'custom': + if (typeof rule[i].validate == 'function') { + if (!rule[i].validate(data[rule[i].name])) { + this.error = rule[i].errorMsg; + return false; + } + } + break; + case 'required': + var reg = new RegExp('/[\S]+/'); + if (reg.test(data[rule[i].name])) { + this.error = rule[i].errorMsg; + return false; + } + break; + case 'string': + var reg = new RegExp('^.{' + rule[i].checkRule + '}$'); + if (!reg.test(data[rule[i].name])) { + this.error = rule[i].errorMsg; + return false; + } + break; + case 'int': + var reg = new RegExp('^(-[1-9]|[1-9])[0-9]{' + rule[i].checkRule + '}$'); + if (!reg.test(data[rule[i].name])) { + this.error = rule[i].errorMsg; + return false; + } + break; + break; + case 'between': + if (!this.isNumber(data[rule[i].name])) { + this.error = rule[i].errorMsg; + return false; + } + var minMax = rule[i].checkRule.split(','); + minMax[0] = Number(minMax[0]); + minMax[1] = Number(minMax[1]); + if (data[rule[i].name] > minMax[1] || data[rule[i].name] < minMax[0]) { + this.error = rule[i].errorMsg; + return false; + } + break; + case 'betweenD': + var reg = /^-?[1-9][0-9]?$/; + if (!reg.test(data[rule[i].name])) { + this.error = rule[i].errorMsg; + return false; + } + var minMax = rule[i].checkRule.split(','); + minMax[0] = Number(minMax[0]); + minMax[1] = Number(minMax[1]); + if (data[rule[i].name] > minMax[1] || data[rule[i].name] < minMax[0]) { + this.error = rule[i].errorMsg; + return false; + } + break; + case 'betweenF': + var reg = /^-?[0-9][0-9]?.+[0-9]+$/; + if (!reg.test(data[rule[i].name])) { + this.error = rule[i].errorMsg; + return false; + } + var minMax = rule[i].checkRule.split(','); + minMax[0] = Number(minMax[0]); + minMax[1] = Number(minMax[1]); + if (data[rule[i].name] > minMax[1] || data[rule[i].name] < minMax[0]) { + this.error = rule[i].errorMsg; + return false; + } + break; + case 'same': + if (data[rule[i].name] != rule[i].checkRule) { + this.error = rule[i].errorMsg; + return false; + } + break; + case 'notsame': + if (data[rule[i].name] == rule[i].checkRule) { + this.error = rule[i].errorMsg; + return false; + } + break; + case 'email': + var reg = /^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/; + if (!reg.test(data[rule[i].name])) { + this.error = rule[i].errorMsg; + return false; + } + break; + case 'phoneno': + var reg = /^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][0-9]))[0-9]{8}$/; + if (!reg.test(data[rule[i].name])) { + this.error = rule[i].errorMsg; + return false; + } + break; + case 'zipcode': + var reg = /^[0-9]{6}$/; + if (!reg.test(data[rule[i].name])) { + this.error = rule[i].errorMsg; + return false; + } + break; + case 'reg': + var reg = new RegExp(rule[i].checkRule); + if (!reg.test(data[rule[i].name])) { + this.error = rule[i].errorMsg; + return false; + } + break; + case 'in': + if (rule[i].checkRule.indexOf(data[rule[i].name]) == -1) { + this.error = rule[i].errorMsg; + return false; + } + break; + case 'notnull': + if (data[rule[i].name] == 0 || data[rule[i].name] == undefined || data[rule[i].name] == null || data[rule[i].name] + .length < 1) { + this.error = rule[i].errorMsg; + return false; + } + break; + case 'lengthMin': + if (data[rule[i].name].length < rule[i].checkRule) { + this.error = rule[i].errorMsg; + return false; + } + break; + case 'lengthMax': + if (data[rule[i].name].length > rule[i].checkRule) { + this.error = rule[i].errorMsg; + return false; + } + break; + } + } + return true; + }, + isNumber: function(checkVal) { + var reg = /^-?[1-9][0-9]?.?[0-9]*$/; + return reg.test(checkVal); + } +} diff --git a/common/js/wx-jssdk.js b/common/js/wx-jssdk.js new file mode 100644 index 0000000..0a82b2c --- /dev/null +++ b/common/js/wx-jssdk.js @@ -0,0 +1,115 @@ +/** + * 微信jssdk调用 + */ +let Weixin = function() { + var wx = require('jweixin-module'); + + this.weixin = wx; + + this.init = function(params) { + wx.config({ + debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 + appId: params.appId, // 必填,公众号的唯一标识 + timestamp: params.timestamp, // 必填,生成签名的时间戳 + nonceStr: params.nonceStr, // 必填,生成签名的随机串 + signature: params.signature, // 必填,签名 + jsApiList: ['chooseWXPay', 'openAddress', 'updateAppMessageShareData', 'updateTimelineShareData', 'scanQRCode','hideMenuItems'] // 必填,需要使用的JS接口列表 + }); + } + + /** + * 发起支付 + * @param {Object} jsApiParame + * @param {Object} callback + */ + this.pay = function(jsApiParame, callback, cancel) { + wx.ready(function() { + wx.chooseWXPay({ + timestamp: jsApiParame.timestamp, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符 + nonceStr: jsApiParame.nonceStr, // 支付签名随机串,不长于 32 位 + package: jsApiParame.package, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*) + signType: jsApiParame.signType, // 签名方式,默认为'SHA1',使用新版支付需传入'MD5' + paySign: jsApiParame.paySign, // 支付签名 + success: function(res) { + typeof callback == 'function' && callback(res); + }, + cancel: function(res){ + typeof cancel == 'function' && cancel(res); + } + }); + }) + } + + /** + * 获取收货地址 + * @param {Object} callback + */ + this.openAddress = function(callback) { + wx.ready(function() { + wx.openAddress({ + success: function(res) { + typeof callback == 'function' && callback(res); + }, + fail: (res) => { + alert(JSON.stringify(res)) + } + }); + }) + } + + + /** + * 分享给好友 + * @param {Object} params + * @param {Object} callback + */ + this.setShareData = function(params, callback) { + + wx.ready(function() { + // 自定义“分享给朋友”及“分享到QQ”按钮的分享内容 + wx.updateAppMessageShareData({ + title: params.title || '', // 分享标题 + desc: params.desc || '', // 分享描述 + link: params.link || '', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 + imgUrl: params.imgUrl || '', // 分享图标 + success: function(res) { + typeof callback == 'function' && callback(res); + }, + fail:function(err){ + } + }) + + // 自定义“分享到朋友圈”及“分享到QQ空间”按钮的分享内容 + wx.updateTimelineShareData({ + title: params.title || '', // 分享标题 + link: params.link || '', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 + imgUrl: params.imgUrl || '', // 分享图标 + success: function(res) { + typeof callback == 'function' && callback(res); + } + }) + + }); + } + + /** + * 扫一扫 + * @param {Object} callback + */ + this.scanQRCode = function(callback) { + wx.ready(function() { + wx.scanQRCode({ + needResult: 1, + scanType: ["qrCode"], + success: function(res) { + typeof callback == 'function' && callback(res); + } + }); + }) + } + +} + +export { + Weixin +} diff --git a/components/chat-message/chat-message.vue b/components/chat-message/chat-message.vue new file mode 100644 index 0000000..c74c95f --- /dev/null +++ b/components/chat-message/chat-message.vue @@ -0,0 +1,338 @@ + + + + + + + diff --git a/components/common-payment/common-payment.vue b/components/common-payment/common-payment.vue new file mode 100644 index 0000000..dca6372 --- /dev/null +++ b/components/common-payment/common-payment.vue @@ -0,0 +1,742 @@ + +
+ + + + + + + diff --git a/components/common-payment/payment.js b/components/common-payment/payment.js new file mode 100644 index 0000000..6c8c261 --- /dev/null +++ b/components/common-payment/payment.js @@ -0,0 +1,836 @@ +export default { + options: { styleIsolation: 'shared' }, + data() { + return { + outTradeNo: '', + isIphoneX: false, + orderCreateData: { + is_balance: 0, + is_point: 1, + is_invoice: 0, // 是否需要发票 0 无发票 1 有发票 + invoice_type: 0, // 发票类型 1 纸质 2 电子 + invoice_title_type: 1, // 抬头类型 1 个人 2 企业 + is_tax_invoice: 0, // 是否需要增值税专用发票 0 不需要 1 需要 + coupon: { + coupon_id: 0 + }, + delivery: {}, + member_goods_card: {} // 会员次卡 + }, + paymentData: null, + calculateData: null, + tempData: null, + storeId: 0, + deliveryTime: '', // 提货时间 + memberAddress: null, // 会员收货地址 + localMemberAddress: null, // 会员本地配送收货地址 + isRepeat: false, + promotionInfo: null, + transactionAgreement: {}, // 购买须知 + tempFormData: null, + menuButtonBounding: {} ,// 小程序胶囊属性 + storeConfig: null, + localConfig: null, + selectGoodsCard: { + skuId: 0, + itemId: 0, + cardList: {} + } // 当前选择的次卡 + } + }, + inject: ['promotion'], + created(){ + // #ifdef MP + this.menuButtonBounding = uni.getMenuButtonBoundingClientRect(); + // #endif + this.isIphoneX = this.$util.uniappIsIPhoneX() + if (uni.getStorageSync('token')) { + Object.assign(this.orderCreateData, uni.getStorageSync(this.createDataKey)) + if (this.location) { + this.orderCreateData.latitude = this.location.latitude; + this.orderCreateData.longitude = this.location.longitude; + } + this.payment(); + } else { + setTimeout(() => { + this.$refs.loadingCover.hide(); + this.$refs.login.open(this.$util.getCurrentRoute().path) + }) + } + this.getTransactionAgreement(); + }, + computed: { + storeToken() { + return this.$store.state.token; + }, + goodsData(){ + if (this.paymentData) { + this.paymentData.shop_goods_list.goods_list.forEach(item => { + if (item.sku_spec_format) item.sku_spec_format = JSON.parse(item.sku_spec_format); + }) + return this.paymentData.shop_goods_list; + } + }, + calculateGoodsData(){ + if (this.calculateData) return this.calculateData.shop_goods_list; + }, + // 余额可抵扣金额 + balanceDeduct() { + if (this.calculateData) { + if (this.calculateData.member_account.balance_total <= parseFloat(this.calculateData.order_money).toFixed(2)) { + return parseFloat(this.calculateData.member_account.balance_total).toFixed(2); + } else { + return parseFloat(this.calculateData.order_money).toFixed(2); + } + } + }, + // 门店列表 + storeList(){ + let storeList = null; + if (this.orderCreateData.delivery) { + if (this.orderCreateData.delivery.delivery_type == 'local' && this.localConfig) { + storeList = this.localConfig.store_list; + storeList = storeList.reduce((res, item) => { + return {...res, [item.store_id]: item} + }, {}) + } + if (this.orderCreateData.delivery.delivery_type == 'store' && this.storeConfig) { + storeList = this.storeConfig.store_list; + storeList = storeList.reduce((res, item) => { + return {...res, [item.store_id]: item} + }, {}) + } + } + return storeList; + }, + // 门店信息 + storeInfo: { + get(){ + if (this.storeList && this.orderCreateData.delivery && this.orderCreateData.delivery.delivery_type != 'express' && this.storeId) { + return this.storeList[ this.orderCreateData.delivery.store_id ]; + } + }, + set(value){ + this.storeList[ this.orderCreateData.delivery.store_id ].store_image = value; + } + }, + // 会员卡购买周期 + cardChargeType(){ + if (this.paymentData.recommend_member_card) { + let charge_rule_arr = []; + let charge_rule = this.paymentData.recommend_member_card.charge_rule; + Object.keys(charge_rule).forEach((key, index)=>{ + switch (key) { + case 'week': + charge_rule_arr.push({'key': key, 'value': charge_rule[key], 'title' : '周卡', unit: '周'}); + break; + case 'month': + charge_rule_arr.push({'key': key, 'value': charge_rule[key], 'title' : '月卡', unit: '月'}); + break; + case 'quarter': + charge_rule_arr.push({'key': key, 'value': charge_rule[key], 'title' : '季卡', unit: '季'}); + break; + case 'year': + charge_rule_arr.push({'key': key, 'value': charge_rule[key], 'title' : '年卡', unit: '年'}); + break; + } + }) + return charge_rule_arr; + } + }, + // 定位信息 + location(){ + return this.$store.state.location; + } + }, + watch: { + storeToken: function(nVal, oVal) { + this.payment(); + }, + deliveryTime: function(nVal){ + if (!nVal) this.$refs.timePopup.refresh(); + }, + location: function(nVal){ + if (nVal) { + this.orderCreateData.latitude = nVal.latitude; + this.orderCreateData.longitude = nVal.longitude; + this.payment(); + } + } + }, + methods: { + /** + * 父级页面onShow调用 + */ + pageShow(){ + if (uni.getStorageSync('addressBack') ) { + uni.removeStorageSync('addressBack'); + this.payment(); + } + }, + /** + * 获取订单结算数据 + */ + payment(){ + this.$api.sendRequest({ + url: this.api.payment, + data: this.orderCreateData, + success: res => { + if (res.code == 0 && res.data) { + let data = res.data; + + // #ifdef MP-WEIXIN + var scene = uni.getStorageSync('is_test') ? 1175 : wx.getLaunchOptionsSync().scene; + if([1175, 1176, 1177, 1191, 1195].indexOf(scene) != -1 && data.shop_goods_list.express_type){ + data.shop_goods_list.express_type = data.shop_goods_list.express_type.filter(item => item.name == 'express' ); + } + // #endif + + if (data.shop_goods_list) { + // 配送方式 + if (data.shop_goods_list.express_type && data.shop_goods_list.express_type.length) { + let deliveryStorage = uni.getStorageSync('delivery'); + data.shop_goods_list.express_type.forEach(item => { + if (deliveryStorage) { + if (item.name == deliveryStorage.delivery_type) { + this.orderCreateData.delivery = deliveryStorage; + this.storeId = deliveryStorage.store_id ?? 0; + if (deliveryStorage.delivery_type == 'store') { + this.orderCreateData.member_address = {mobile: data.member_account.mobile ?? '' } + if (!this.location) this.$util.getLocation(); + } + if (deliveryStorage.delivery_type == 'local' && !this.location) this.$util.getLocation(); + } + } + if (item.name == 'local') this.localConfig = item; + if (item.name == 'store') this.storeConfig = item; + }) + + if (!this.orderCreateData.delivery.delivery_type) { + this.selectDeliveryType(data.shop_goods_list.express_type[0], false); + } + + if(uni.getStorageSync('deliveryTime') && uni.getStorageSync('deliveryTime')['delivery_type'] && uni.getStorageSync('deliveryTime')['delivery_type'] == this.orderCreateData.delivery.delivery_type){ + this.deliveryTime = uni.getStorageSync('deliveryTime')['deliveryTime']; + this.orderCreateData.buyer_ask_delivery_time = uni.getStorageSync('deliveryTime')['buyer_ask_delivery_time']; + } + } + + // 优惠券 + if (data.shop_goods_list.coupon_list && data.shop_goods_list.coupon_list[0]) + this.orderCreateData.coupon = {coupon_id: data.shop_goods_list.coupon_list[0].coupon_id }; + } + // 地址、手机号 + if (data.is_virtual) { + this.orderCreateData.member_address = ''; + } + + // 处理表单数据 + data = this.handleGoodsFormData(data); + + // 该方法在父级组件中 + this.promotionInfo = this.promotion(data); + + this.paymentData = data; + this.calculate(); + }else{ + this.$util.showToast({ + title: res.message + }); + + setTimeout(() => { + this.$util.redirectTo('/pages/index/index'); + }, 1000) + } + } + }) + }, + /** + * 处理商品表单数据 + * @param {Object} data + */ + handleGoodsFormData(data){ + let goodsFormData = uni.getStorageSync('goodFormData'); + data.shop_goods_list.goods_list.forEach(item => { + if (item.goods_form) { + let formData = {}; + if (item.form_data) { + item.form_data.map(formIem => { + formData[formIem.id] = formIem; + }) + } else if (goodsFormData && goodsFormData.goods_id == item.goods_id) { + goodsFormData.form_data.map(formIem => { + formData[formIem.id] = formIem; + }) + } + if (Object.keys(formData).length) { + item.goods_form.json_data.forEach(formIem => { + if (formData[formIem.id]) { + formIem.val = formData[formIem.id].val; + } + }) + } + } + }) + return data; + }, + /** + * 订单创建 + */ + calculate(){ + this.$api.sendRequest({ + url: this.api.calculate, + data: this.handleCreateData(), + success: res => { + if (this.$refs.loadingCover && this.$refs.loadingCover.isShow) this.$refs.loadingCover.hide(); + if (res.code == 0 && res.data) { + this.calculateData = res.data; + if (res.data.delivery) { + if (res.data.delivery.delivery_type == 'express') this.memberAddress = res.data.member_address; + if (res.data.delivery.delivery_type == 'local') this.localMemberAddress = res.data.member_address; + } + // 次卡 + res.data.shop_goods_list.goods_list.forEach(item => { + if (item.member_card_list) { + if (this.orderCreateData.member_goods_card[ item.sku_id ]) { + let itemId = this.orderCreateData.member_goods_card[ item.sku_id ]; + if (!item.member_card_list[itemId]) delete this.orderCreateData.member_goods_card[ item.sku_id ]; + } + } else if (this.orderCreateData.member_goods_card[ item.sku_id ]) { + delete this.orderCreateData.member_goods_card[ item.sku_id ]; + } + }) + if (!res.data.shop_goods_list.coupon_id) this.orderCreateData.coupon.coupon_id = 0; + else this.orderCreateData.coupon.coupon_id = res.data.shop_goods_list.coupon_id; + + this.$forceUpdate(); + } else { + this.$util.showToast({ + title: res.message + }); + } + } + }) + }, + /** + * 订单创建 + */ + create(){ + if (!this.verify() || this.isRepeat) return; + this.isRepeat = true; + uni.showLoading({title: ''}) + this.$api.sendRequest({ + url: this.api.create, + data: this.handleCreateData(), + success: res => { + uni.hideLoading(); + if (res.code == 0) { + this.outTradeNo = res.data; + uni.removeStorageSync('deliveryTime'); + uni.removeStorageSync('goodFormData'); + uni.setStorageSync('paySource', ''); + if (this.calculateData.pay_money == 0) { + // #ifdef MP-WEIXIN + if (this.paymentData.is_virtual || this.orderCreateData.delivery.delivery_type == 'store') { + this.$util.subscribeMessage('ORDER_VERIFY_OUT_TIME,VERIFY_CODE_EXPIRE,VERIFY'); + } + // #endif + this.$util.redirectTo('/pages_tool/pay/result', { + code: res.data + }, 'redirectTo'); + } else { + this.openChoosePayment(); + } + } else { + this.$util.showToast({ title: res.message }); + this.isRepeat = false; + } + // 更新购物车数量 + this.$store.dispatch('getCartNumber'); + } + }) + }, + /** + * 处理订单计算、创建传参 + */ + handleCreateData(){ + let data = this.$util.deepClone(this.orderCreateData); + // 订单表单 + if (this.$refs.form) { + data.form_data = { form_id: this.paymentData.system_form.id, form_data: this.$util.deepClone(this.$refs.form.formData) }; + } + // 商品表单 + if (this.$refs.goodsForm) { + if (!data.form_data) data.form_data = {}; + data.form_data.goods_form = {}; + this.$refs.goodsForm.forEach(item => { + data.form_data.goods_form[item._props.customAttr.sku_id] = { + form_id: item._props.customAttr.form_id, + form_data: this.$util.deepClone(item.formData) + } + }) + } + Object.keys(data).forEach((key) => { + let item = data[key]; + if (typeof item == 'object') data[key] = JSON.stringify(item); + }) + if (data.member_address && this.orderCreateData.delivery && this.orderCreateData.delivery.delivery_type != 'store' ) delete data.member_address; + return data; + }, + /** + * 打开支付弹窗 + */ + openChoosePayment(){ + // #ifdef MP-WEIXIN + if (this.paymentData.is_virtual) { + this.$util.subscribeMessage('ORDER_URGE_PAYMENT,ORDER_PAY'); + } else { + switch(this.orderCreateData.delivery.delivery_type){ + case 'express'://物流配送 + this.$util.subscribeMessage('ORDER_URGE_PAYMENT,ORDER_PAY,ORDER_DELIVERY'); + break; + case 'store'://门店自提 + this.$util.subscribeMessage('ORDER_URGE_PAYMENT,ORDER_PAY'); + break; + case 'local'://同城配送 + this.$util.subscribeMessage('ORDER_URGE_PAYMENT,ORDER_PAY,ORDER_DELIVERY'); + break; + } + } + + // #endif + this.$refs.choosePaymentPopup.getPayInfo(this.outTradeNo); + }, + verify(){ + if (this.paymentData.is_virtual == 0) { + if (!this.orderCreateData.delivery || !this.orderCreateData.delivery.delivery_type) { + this.$util.showToast({ title: '商家未设置配送方式' }); + return false; + } + if ( + (this.orderCreateData.delivery.delivery_type == 'express' && !this.memberAddress) || + (this.orderCreateData.delivery.delivery_type == 'local' && !this.localMemberAddress) + ) { + this.$util.showToast({ title: '请先选择您的收货地址' }); + return false; + } + + if (this.orderCreateData.delivery.delivery_type == 'store') { + if (!this.orderCreateData.delivery.store_id) { + this.$util.showToast({ + title: '没有可提货的门店,请选择其他配送方式' + }); + return false; + } + if (!this.orderCreateData.member_address.mobile) { + this.$util.showToast({ + title: '请输入预留手机' + }); + return false; + } + var reg = /^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$/; + if (!reg.test(this.orderCreateData.member_address.mobile)) { + this.$util.showToast({ + title: '请输入正确的手机号' + }); + return false; + } + if (!this.deliveryTime) { + this.$util.showToast({ + title: '请选择提货时间' + }); + return false; + } + } + + if (this.orderCreateData.delivery.delivery_type == 'local') { + if (!this.orderCreateData.delivery.store_id) { + this.$util.showToast({ + title: '没有可配送的门店,请选择其他配送方式' + }); + return false; + } + if (this.calculateGoodsData.local_config && this.calculateGoodsData.local_config.info.time_is_open == 1 && !this.deliveryTime) { + this.$util.showToast({ + title: '请选择送达时间' + }); + return false; + } + } + } + + if (this.$refs.goodsForm) { + let formVerify = true; + for (let i = 0; i < this.$refs.goodsForm.length; i++) { + let item = this.$refs.goodsForm[i]; + formVerify = item.verify(); + if (!formVerify) { + break; + } + } + if (!formVerify) return false; + } + if (this.paymentData.system_form) { + let formVerify = this.$refs.form.verify(); + if (!formVerify) return false; + } + return true; + }, + /** + * 选择收货地址 + */ + selectAddress() { + var params = { + back: this.$util.getCurrentRoute().path, + local: 0, + type: 1 + } + // 外卖配送需要定位地址 + if (this.orderCreateData.delivery.delivery_type == 'local') { + params.local = 1; + params.type = 2; + } + this.$util.redirectTo('/pages_tool/member/address', params); + }, + /** + * 选择配送方式 + * @param {Object} data + */ + selectDeliveryType(data, calculate = true){ + if (this.orderCreateData.delivery && this.orderCreateData.delivery.delivery_type == data.name) return; + + let delivery = { + delivery_type: data.name, + delivery_type_name: data.title + } + // 如果是门店配送 + if (data.name == 'store' || data.name == 'local') { + if(data.store_list[0]) { + delivery.store_id = data.store_list[0].store_id; + } + this.storeId = delivery.store_id ? delivery.store_id : 0; + if (!this.orderCreateData.member_address) this.orderCreateData.member_address = {mobile: this.paymentData && this.paymentData.member_account.mobile ? this.paymentData.member_account.mobile : '' } + } + this.$set(this.orderCreateData, 'delivery', delivery); + this.orderCreateData.buyer_ask_delivery_time = ''; + this.deliveryTime = ''; + uni.removeStorageSync('deliveryTime'); + uni.setStorageSync('delivery', delivery); + + // 配送方式不为门店配送时 + if (this.orderCreateData.delivery.delivery_type != 'express' && !this.location) this.$util.getLocation(); + if (calculate) this.calculate(); + }, + /** + * 图片错误 + * @param {Object} index + */ + imageError(index){ + this.paymentData.shop_goods_list.goods_list[index].sku_image = this.$util.getDefaultImage().goods; + this.$forceUpdate(); + }, + /** + * 选择门店 + * @param {Object} data + */ + selectPickupPoint(data) { + if (data.store_id != this.storeId) { + this.storeId = data.store_id; + this.orderCreateData.delivery.store_id = data.store_id; + this.calculate(); + this.resetDeliveryTime(); + // 存储所选门店 + let delivery = uni.getStorageSync('delivery'); + delivery.store_id = data.store_id; + uni.setStorageSync('delivery', delivery) + } + this.$refs.deliveryPopup.close(); + }, + /** + * 重置提货时间 + */ + resetDeliveryTime(){ + this.orderCreateData.buyer_ask_delivery_time = ''; + this.deliveryTime = ''; + uni.removeStorageSync('deliveryTime'); + }, + /** + * 门店 + */ + storetime(type = ''){ + if(this.storeInfo){ + let data = this.$util.deepClone(this.storeInfo); + if (data.delivery_time) { + data.delivery_time = JSON.parse(data.delivery_time); + data.end_time = data.delivery_time[ (data.delivery_time.length - 1) ].end_time; + } else { + data.delivery_time = [ {start_time: data.start_time, end_time: data.end_time} ] + } + let obj = { + delivery:this.orderCreateData.delivery, + dataTime:data + } + this.$refs.timePopup.open(obj,type); + this.$forceUpdate(); + } + }, + /** + * 选择自提时间 + * @param {Object} data + */ + selectPickupTime(data){ + this.deliveryTime = data.data.month + '('+ data.data.time +')'; + + let nowDate = new Date(); + let Year = nowDate.getFullYear(); + let timeData = data.data.month.split('月'); + let month = timeData[0]; + let date = timeData[1].split('日')[0]; + this.orderCreateData.buyer_ask_delivery_time = Year + '-' + month + '-' + date + ' ' + data.data.time + + //将时间缓存,避免切换地址时重置 + uni.setStorageSync('deliveryTime',{ + 'deliveryTime' : this.deliveryTime, + 'buyer_ask_delivery_time' : this.orderCreateData.buyer_ask_delivery_time, + 'delivery_type' : this.orderCreateData.delivery.delivery_type + }); + + }, + storeImgError(){ + this.storeInfo.store_image = this.$util.getDefaultImage().store; + }, + openPopup(ref) { + this.tempData = this.$util.deepClone(this.orderCreateData); + this.$refs[ref].open(); + }, + closePopup(ref) { + this.orderCreateData = this.$util.deepClone(this.tempData); + this.$refs[ref].close(); + this.tempData = null; + }, + /** + * 切换发票开关 + */ + changeIsInvoice() { + if (this.orderCreateData.is_invoice == 0) { + this.orderCreateData.is_invoice = 1; + if (!this.orderCreateData.invoice_type) this.orderCreateData.invoice_type = this.goodsData.invoice.invoice_type.split(',')[0]; + } else { + this.orderCreateData.is_invoice = 0; + } + }, + /** + * 切换发票类型 + * @param {Object} invoice_type + */ + changeInvoiceType(invoice_type) { + this.orderCreateData.invoice_type = invoice_type; + }, + /** + * 切换发票个人还是企业 + * @param {Object} invoice_title_type + */ + changeInvoiceTitleType(invoice_title_type) { + this.orderCreateData.invoice_title_type = invoice_title_type; + }, + /** + * 切换增值税专用发票开关 + */ + changeIsTaxInvoice() { + if (this.orderCreateData.is_tax_invoice == 0) this.orderCreateData.is_tax_invoice = 1; + else this.orderCreateData.is_tax_invoice = 0; + this.$forceUpdate(); + }, + /** + * 选择发票内容 + * @param {Object} invoice_content + */ + changeInvoiceContent(invoice_content) { + this.orderCreateData.invoice_content = invoice_content; + this.$forceUpdate(); + }, + /** + * 验证发票内容 + */ + invoiceVerify() { + if (!this.orderCreateData.invoice_title) { + this.$util.showToast({ + title: '请填写发票抬头' + }); + return false; + } + if (!this.orderCreateData.taxpayer_number && this.orderCreateData.invoice_title_type == 2) { + this.$util.showToast({ + title: '请填写纳税人识别号' + }); + return false; + } + if (this.orderCreateData.invoice_type == 1 && !this.orderCreateData.invoice_full_address && this.orderPaymentData.is_virtual ==1) { + this.$util.showToast({ + title: '请填写发票邮寄地址' + }); + return false; + } + if (this.orderCreateData.invoice_type == 2 && !this.orderCreateData.invoice_email) { + this.$util.showToast({ + title: '请填写邮箱' + }); + return false; + } + if (this.orderCreateData.invoice_type == 2) { + var reg = /^([a-zA-Z]|[0-9])(\w|\-)+@[a-zA-Z0-9]+\.([a-zA-Z]{2,4})$/; + if (!reg.test(this.orderCreateData.invoice_email)) { + this.$util.showToast({ + title: '请填写正确的邮箱' + }); + return false; + } + } + if (!this.orderCreateData.invoice_content) { + this.$util.showToast({ + title: '请选择发票内容' + }); + return false; + } + return true; + }, + /** + * 保存发票设置 + */ + saveInvoice(){ + if (this.orderCreateData.is_invoice == 1 && !this.invoiceVerify()) return; + this.calculate(); + this.$refs.invoicePopup.close(); + }, + /** + * 保存留言 + */ + saveBuyerMessage(){ + this.$refs.buyerMessagePopup.close(); + }, + /** + * 选择会员卡 + */ + selectMemberCard() { + this.orderCreateData.is_open_card = this.orderCreateData.is_open_card ? 0 : 1; + if (!this.orderCreateData.member_card_unit) this.orderCreateData.member_card_unit = this.cardChargeType[0].key; + this.calculate(); + }, + /** + * 选择会员卡充值类型 + * @param {Object} key + */ + selectMembercardUnit(key){ + this.orderCreateData.member_card_unit = key; + this.calculate(); + }, + /** + * 使用积分抵扣 + */ + usePoint() { + this.orderCreateData.is_point = this.orderCreateData.is_point ? 0 : 1; + this.calculate(); + }, + /** + * 支付弹窗关闭 + */ + payClose(){ + this.$util.redirectTo('/pages/order/detail', {order_id: this.$refs.choosePaymentPopup.payInfo.order_id}, 'redirectTo'); + }, + /** + * 选择优惠券 + * @param {Object} data + */ + selectCoupon(data){ + if (this.orderCreateData.coupon.coupon_id == data.coupon_id) this.orderCreateData.coupon = {coupon_id: 0}; + else this.orderCreateData.coupon = {coupon_id: data.coupon_id}; + }, + /** + * 使用优惠券 + */ + useCpopon(){ + this.$refs.couponPopup.close(); + this.calculate(); + }, + /** + * 同城配送送达时间 + */ + localtime(type = ''){ + let data = this.$util.deepClone(this.calculateGoodsData.local_config.info); + if (data.delivery_time) { + data.end_time = data.delivery_time[ (data.delivery_time.length - 1) ].end_time; + } + let obj = { + delivery: this.orderCreateData.delivery, + dataTime: data + } + this.$refs.timePopup.open(obj,type); + }, + /** + * 剩余起送价 + */ + surplusStartMoney(){ + let money = 0; + if (this.calculateData && this.calculateData.delivery && this.calculateData.delivery.delivery_type == 'local') { + let startDeliveryMoney = this.calculateGoodsData.delivery.start_money ?? 0; + money = parseFloat(startDeliveryMoney) - parseFloat(this.calculateData.goods_money); + money = money < 0 ? 0 : money; + } + return money; + }, + /** + * 交易协议 + */ + getTransactionAgreement(){ + this.$api.sendRequest({ + url: '/api/order/transactionagreement', + success: res => { + if (res.data) this.transactionAgreement = res.data; + } + }) + }, + editForm(index){ + this.tempFormData = { + index: index, + json_data: this.$util.deepClone(this.goodsData.goods_list[index].goods_form.json_data) + } + this.$refs.editFormPopup.open(); + }, + saveForm(){ + if (this.$refs.tempForm.verify()) { + this.$set(this.paymentData.shop_goods_list.goods_list[ this.tempFormData.index ].goods_form, 'json_data', this.$refs.tempForm.formData); + this.$refs.editFormPopup.close(); + } + }, + /** + * 切换次卡 + * @param {Object} index + */ + selectMemberGoodsCard(index){ + let sku_id = this.goodsData.goods_list[index].sku_id; + this.selectGoodsCard = { + skuId: sku_id, + itemId: this.orderCreateData.member_goods_card[sku_id] ? this.orderCreateData.member_goods_card[sku_id] : 0, + cardList: this.$util.deepClone(this.calculateGoodsData.goods_list[index].member_card_list), + click: (item_id) => { + this.selectGoodsCard.itemId = this.selectGoodsCard.itemId == item_id ? 0 : item_id; + } + } + this.$refs.memberGoodsCardPopup.open(); + }, + /** + * 选择次卡 + */ + saveMemberGoodsCard(){ + this.orderCreateData.member_goods_card[ this.selectGoodsCard.skuId ] = this.selectGoodsCard.itemId || 0; + this.$refs.memberGoodsCardPopup.close(); + this.calculate(); + } + }, + filters: { + // 金额格式化输出 + moneyFormat(money) { + return parseFloat(money).toFixed(2); + } + } +} \ No newline at end of file diff --git a/components/diy-components/diy-article.vue b/components/diy-components/diy-article.vue new file mode 100644 index 0000000..547e3f4 --- /dev/null +++ b/components/diy-components/diy-article.vue @@ -0,0 +1,185 @@ + ++ +确认订单 ++ + + + + ++ + + + + + ++ ++ {{ item.title }} + + ++ + + ++ ++ +{{ memberAddress.name ? memberAddress.name : '' }} +{{ memberAddress.mobile ? memberAddress.mobile : '' }} ++ {{ memberAddress.full_address ? memberAddress.full_address : '' }} {{ memberAddress.address ? memberAddress.address : '' }} + ++ + +请设置收货地址 ++ + + + + ++ ++ ++ ++ 由 + +{{ storeInfo.store_name }} + 提供配送 ++ +点击切换 ++ + ++ 您的附近没有可配送的门店,请选择其他配送方式 + ++ +{{ localMemberAddress.name ? localMemberAddress.name : '' }} +{{ localMemberAddress.mobile ? localMemberAddress.mobile : '' }} ++ {{ localMemberAddress.full_address ? localMemberAddress.full_address : '' }} + {{ localMemberAddress.address ? localMemberAddress.address : '' }} + ++ + ++ +送达时间 ++ +{{ deliveryTime ? deliveryTime : '请选择送达时间' }} ++ + + +请设置收货地址 ++ + + + + + ++ ++ ++ ++ ++ +{{ storeInfo.store_name }} ++ +营业时间:{{ storeInfo.open_date }} +{{ storeInfo.full_address }} {{ storeInfo.address }} ++ + ++ +预留手机 + ++ +提货时间 ++ {{ deliveryTime }} + ++ 当前无自提门店,请选择其它配送方式 ++ + + + + ++ + ++ ++ ++ ++ + ++ +{{ goodsItem.sku_name }} ++ ++ ++ +{{ x.spec_value_name }} ++ ++ ++ 该商品不支持{{ orderCreateData.delivery.delivery_type_name }} ++ ++ +{{ $lang('common.currencySymbol') }} + ++ {{ + parseFloat(goodsItem.price) + .toFixed(2) + .split('.')[0] + }} + ++ .{{ + parseFloat(goodsItem.price) + .toFixed(2) + .split('.')[1] + }} + ++ +x +{{ goodsItem.num }} ++ +次卡抵扣 ++ ++ ++ 次卡抵扣{{ calculateGoodsData.goods_list[goodsIndex].card_use_num }}张/{{ calculateGoodsData.goods_list[goodsIndex].card_use_num }}次 + +-¥{{ calculateGoodsData.goods_list[goodsIndex].card_promotion_money | moneyFormat }} +请选择次卡 ++ + ++ + + + + ++ +{{ paymentData.system_form.form_name }} ++ + + ++ ++ +优惠券 ++ + +已使用优惠券,优惠 +{{ $lang('common.currencySymbol') }} +{{ (calculateData && calculateData.coupon_money ? calculateData.coupon_money : 0) | moneyFormat }} + +不使用优惠券 ++ + +活动优惠 ++ +{{ promotionInfo.title }} ++ + ++ +使用{{ parseInt(calculateGoodsData.max_usable_point) }}积分可抵扣 +{{ $lang('common.currencySymbol') }} +{{ calculateData.point_money | moneyFormat }} ++ + + +发票 ++ ++ {{ orderCreateData.invoice_type == 1 ? '纸质' : '电子' }}发票({{ orderCreateData.invoice_content }}) + +无需发票 ++ + + + + ++ ++ + 开通{{ paymentData.recommend_member_card.level_name }} + +本单预计可省 +{{ paymentData.recommend_member_card.discount_money | moneyFormat }} +元 ++ + ++ +{{ item.title }} +{{ $lang('common.currencySymbol') }}{{ parseFloat(item.value) }}/{{ item.unit }} ++ + + ++ +商品金额 ++ +{{ $lang('common.currencySymbol') }} +{{ calculateData.goods_money | moneyFormat }} ++ +运费 ++ ++ +{{ $lang('common.currencySymbol') }} +{{ calculateData.delivery_money | moneyFormat }} ++ ++ +税费 +({{ goodsData.invoice.invoice_rate }}%) ++ ++ +{{ $lang('common.currencySymbol') }} +{{ calculateData.invoice_money | moneyFormat }} ++ +发票邮寄费 ++ ++ +{{ $lang('common.currencySymbol') }} +{{ calculateData.invoice_delivery_money | moneyFormat }} ++ +优惠 ++ +- +{{ $lang('common.currencySymbol') }} +{{ calculateData.promotion_money | moneyFormat }} ++ +优惠券 ++ +- +{{ $lang('common.currencySymbol') }} +{{ calculateData.coupon_money | moneyFormat }} ++ +积分抵扣 ++ +- +{{ $lang('common.currencySymbol') }} +{{ calculateData.point_money | moneyFormat }} ++ +会员卡 ++ ++ +{{ $lang('common.currencySymbol') }} +{{ calculateData.member_card_money | moneyFormat }} ++ 购买前请先阅读 + + +《{{ transactionAgreement.title }}》 + ,下单即代表同意该协议 ++ ++ +共{{ calculateData.goods_num }}件 +合计: +{{ $lang('common.currencySymbol') }} ++ {{ + parseFloat(calculateData.pay_money) + .toFixed(2) + .split('.')[0] + }} + ++ .{{ + parseFloat(calculateData.pay_money) + .toFixed(2) + .split('.')[1] + }} + ++ + + ++ + + + + + + + + ++ ++ +发票 ++ + ++ ++ +需要发票 ++ +不需要 +需要 ++ ++ +发票类型 ++ ++ {{ item == 1 ? '纸质' : '电子' }} + ++ +抬头类型 ++ ++ 个人 + ++ 企业 + ++ +发票信息 ++ + + + + ++ +发票内容 ++ ++ {{ item }} + +发票内容将以根据税法调整,具体请以展示为准,发票内容显示详细商品名 称及价格信息 ++ 确定 + + + ++ ++ +活动优惠 ++ + ++ ++ +{{ promotionInfo.title }} ++ + +确定 ++ + + ++ ++ +已为您甄选出附近所有相关门店 ++ + ++ ++ ++ ++ ++ +{{ item.store_name }} +({{ item.distance }}km) ++ ++ 营业时间:{{ item.open_date }} + ++ 地址:{{ item.full_address }}{{ item.address }} + ++ ++ 所选择收货地址附近没有可以自提的门店 ++ + + ++ ++ +买家留言 ++ + ++ ++ ++ + ++ 确定 + + + ++ ++ +优惠券 ++ + ++ ++ ++ ++ + + +{{ $lang('common.currencySymbol') }} +{{ parseFloat(couponItem.money) }} + + +{{ $lang('common.currencySymbol') }} +{{ parseFloat(couponItem.money) }} + + +{{ parseFloat(couponItem.discount) }} +折 + ++ + 满{{ couponItem.at_least }}可用 + + + 无门槛 + + ++ +{{ couponItem.coupon_name }} +最多可抵¥{{ couponItem.discount_limit }} +有效期:{{ couponItem.end_time ? $util.timeStampTurnTime(couponItem.end_time) : '长期有效' }} ++ + 确定 + + + ++ ++ ++ {{ transactionAgreement.title }} ++ ++ + + ++ ++ +买家信息 ++ + ++ + 确定 + + + ++ ++ +选择次卡 ++ + ++ ++ +{{ item.goods_name }} ++ +不限次数 +剩余{{ item.num - item.use_num }}次 +剩余{{ item.total_num - item.total_use_num }}次 +| +{{ item.end_time ? $util.timeStampTurnTime(item.end_time) : '长期有效' }} ++ + +确定 ++ + + + + + + + + + diff --git a/components/diy-components/diy-bargain.vue b/components/diy-components/diy-bargain.vue new file mode 100644 index 0000000..008e036 --- /dev/null +++ b/components/diy-components/diy-bargain.vue @@ -0,0 +1,660 @@ + ++ ++ ++ ++ + +{{ item.article_title }} ++ ++ ++ {{ item.category_name }} +{{ $util.timeStampTurnTime(item.create_time, 'date') }} ++ + + + + + + diff --git a/components/diy-components/diy-bottom-nav.vue b/components/diy-components/diy-bottom-nav.vue new file mode 100644 index 0000000..0b27af8 --- /dev/null +++ b/components/diy-components/diy-bottom-nav.vue @@ -0,0 +1,292 @@ + ++ + + ++ {{value.titleStyle.leftText}} ++ 低至0元免费拿 ++ +{{value.titleStyle.more}} ++ + + + + ++ ++ ++ ++ {{ item.goods_name }} + ++ ++ ++ ++ ++ 已砍 +¥{{(item.price - item.curr_price).toFixed(2)}} ,仅差 +¥{{item.curr_price}} ++ 最低可砍至 +¥{{item.floor_price}} ++ ++ + +¥ +{{ value.style=='style-2' ? item.price.split(".")[0] : item.floor_price.split(".")[0] }} +{{ value.style=='style-2' ? "."+item.price.split(".")[1] : "."+item.floor_price.split(".")[1] }} ++ + ++ ++ ++ + 已砍{{ item.sale_num }}件 + ++ ++ {{ item.goods_name }} + ++ +¥ +{{ item.floor_price.split(".")[0] }} +{{ "."+item.floor_price.split(".")[1] }} ++ ¥{{ item.price }} + ++ + ++ ++ ++ ++ + + 已砍{{ item.sale_num }}件 ++ ++ {{ item.goods_name }} + ++ +¥ +{{ item.floor_price.split(".")[0] }} +{{ "."+item.floor_price.split(".")[1] }} ++ ¥{{ item.price }} + ++ + + + + + diff --git a/components/diy-components/diy-category-item.vue b/components/diy-components/diy-category-item.vue new file mode 100644 index 0000000..481bfbb --- /dev/null +++ b/components/diy-components/diy-category-item.vue @@ -0,0 +1,1108 @@ + ++ + ++ + ++ ++ ++ ++ ++ + + ++ + + {{ cartNumber > 99 ? '99+' : cartNumber }} + ++ ++ ++ ++ + + ++ + + {{ item.text }} + ++ {{ item.text }} + ++ + + + + + + diff --git a/components/diy-components/diy-category.vue b/components/diy-components/diy-category.vue new file mode 100644 index 0000000..4abba7a --- /dev/null +++ b/components/diy-components/diy-category.vue @@ -0,0 +1,976 @@ + ++ + ++ + ++ + + +{{ category.category_name }} ++ ++ ++ {{ one.category_name }} ++ ++ +{{ one.category_name }} ++ ++ ++ {{ two.category_name }} ++ ++ + + ++ + ++ ++ +全部 ++ {{ one.category_name }} + ++ + ++ ++ +全部 ++ {{ one.category_name }} + ++ ++ ++ ++ ++ ++ {{ item.label_name }} ++ ++ +{{ item.goods_name }} ++ ++ +¥ ++ {{ + parseFloat(showPrice(item)) + .toFixed(2) + .split('.')[0] + }} + + ++ .{{ + parseFloat(showPrice(item)) + .toFixed(2) + .split('.')[1] + }} + ++ ++ + ++ + ++ ++ ++ +¥ + {{ item.market_price > 0 ? item.market_price : item.price }} ++ ++ 立即购买 + ++ 选规格 + +{{ cart['goods_' + item.goods_id].num }} ++ ++ ++ {{ cart['goods_' + item.goods_id]['sku_' + item.sku_id].num }} ++ ++ + + ++ + + 立即购买 + + 已经到底了~ + ++ ++ 上滑查看下一分类 + + + ++ ++ ++ ++ {{ item.label_name }} ++ ++ +{{ item.goods_name }} ++ ++ +¥ ++ {{ + parseFloat(showPrice(item)) + .toFixed(2) + .split('.')[0] + }} + + ++ .{{ + parseFloat(showPrice(item)) + .toFixed(2) + .split('.')[1] + }} + ++ ++ + ++ + ++ ++ ++ +¥ + {{ item.market_price > 0 ? item.market_price : item.price }} ++ ++ 立即购买 + ++ 选规格 + +{{ cart['goods_' + item.goods_id].num }} ++ ++ ++ {{ cart['goods_' + item.goods_id]['sku_' + item.sku_id].num }} ++ ++ + + ++ + + 立即购买 + + + + + + + diff --git a/components/diy-components/diy-comp-extend.vue b/components/diy-components/diy-comp-extend.vue new file mode 100644 index 0000000..7ff6eb7 --- /dev/null +++ b/components/diy-components/diy-comp-extend.vue @@ -0,0 +1,23 @@ + ++ ++ ++ + ++ 商品分类 ++ + + +商品分类 ++ ++ + ++ + + ++ + ++ + + ++ ++ ++ {{ item.category_name }} ++ ++ +展开 ++ + ++ ++ ++ ++ ++ {{ item.category_name }} ++ +点击收起 ++ + + ++ ++ + ++ ++ +{{ item.category_name }} ++ ++ + ++ ++ 已经到底了~ ++ ++ ++ + ++ 暂时没有分类哦! ++ + ++ ++ ++ {{ cartNumber < 99 ? cartNumber : '99+' }} ++ +总计: +¥ +{{ cartMoney[0] }} +.{{ cartMoney[1] ? cartMoney[1] : '00' }} ++ + + + + + + + + diff --git a/components/diy-components/diy-coupon.vue b/components/diy-components/diy-coupon.vue new file mode 100644 index 0000000..f80cfbc --- /dev/null +++ b/components/diy-components/diy-coupon.vue @@ -0,0 +1,1122 @@ + + + + + + + + + + diff --git a/components/diy-components/diy-fenxiao-goods-list.vue b/components/diy-components/diy-fenxiao-goods-list.vue new file mode 100644 index 0000000..c32ada5 --- /dev/null +++ b/components/diy-components/diy-fenxiao-goods-list.vue @@ -0,0 +1,419 @@ + ++ + + + ++ ++ ++ ++ +¥ +{{ item.money | moneyConduct }} ++ +{{ item.discount | moneyConduct }} +折 ++ {{ item.at_least > 0 ? '满' + Number(item.at_least) + '元可用' : '无门槛优惠券' }} + +{{ value.btnStyle.text }} +去使用 ++ + + + ++ ++ ++ ++ +¥ +{{ item.money | moneyConduct }} ++ +{{ item.discount | moneyConduct }} +折 ++ {{ item.at_least > 0 ? '满' + Number(item.at_least) + '元可用' : '无门槛优惠券' }} + +{{ value.btnStyle.text || '领取' }} +去使用 ++ + + + ++ ++ ++ +¥ +{{ item.money | moneyConduct }} ++ +{{ item.discount | moneyConduct }} +折 ++ + +{{ item.at_least > 0 ? '满' + Number(item.at_least) + '元可用' : '无门槛优惠券' }} +{{ item.goods_type == 1 ? '所有商品可用' : '指定商品可用' }} +{{ value.btnStyle.text || '领取' }} +去使用 ++ + + + ++ ++ ++ ++ +¥ +{{ item.money | moneyConduct }} ++ +{{ item.discount | moneyConduct }} +折 ++ {{ item.at_least > 0 ? '满' + Number(item.at_least) + '元可用' : '无门槛优惠券' }} + ++ {{ value.btnStyle.text || '立即使用' }} + +去使用 ++ + + + ++ ++ ++ ++ + ++ ++ +{{ item.money | moneyConduct }} +元 ++ +{{ item.discount | moneyConduct }} +折 ++ + ++ +{{ item.coupon_name }} +满{{ Number(item.at_least) }}元可用 +无门槛优惠券 ++ {{ value.btnStyle.text || '立即领取' }} + + +去使用 ++ + + + ++ ++ + ++ ++ +{{ (item.discount == '0.00' ? item.money : item.discount) | moneyConduct }} +{{ item.discount == '0.00' ? '元' : '折' }} +优惠券 ++ +{{ value.btnStyle.text }} ++ +去使用 +满{{ item.at_least | moneyConduct }}元使用 +无门槛使用 ++++ + + 暂无优惠券 ++ 去逛逛 ++ + ++ ++ + ++ ++ +{{ item.money | moneyConduct }} +元 ++ +{{ item.discount | moneyConduct }} +折 ++ +满{{ Number(item.at_least) }}元可用 +无门槛优惠券 +有效期至{{ $util.timeStampTurnTime(item.end_time,'yearmonthday') }} ++ + {{ value.btnStyle.text || '立即领取' }} + +去使用 ++ + + + + + + diff --git a/components/diy-components/diy-float-btn.vue b/components/diy-components/diy-float-btn.vue new file mode 100644 index 0000000..111942f --- /dev/null +++ b/components/diy-components/diy-float-btn.vue @@ -0,0 +1,102 @@ + ++ ++ ++ + ++ ++ {{ item.goods_name }} + ++ ++ ++ +赚 ¥ +{{ item.commission_money.split(".")[0] }} +{{ "."+item.commission_money.split(".")[1] }} ++ 关注 + ++ 取消关注 + ++ ¥{{ item.discount_price }} + ++ + + + + + diff --git a/components/diy-components/diy-goods-brand.vue b/components/diy-components/diy-goods-brand.vue new file mode 100644 index 0000000..526c53a --- /dev/null +++ b/components/diy-components/diy-goods-brand.vue @@ -0,0 +1,135 @@ + ++ ++ ++ + + + + + + + diff --git a/components/diy-components/diy-goods-list.vue b/components/diy-components/diy-goods-list.vue new file mode 100644 index 0000000..93aa44f --- /dev/null +++ b/components/diy-components/diy-goods-list.vue @@ -0,0 +1,1068 @@ + ++ +{{ value.title }} ++ ++ ++ + + + + + + + + diff --git a/components/diy-components/diy-goods-recommend.vue b/components/diy-components/diy-goods-recommend.vue new file mode 100644 index 0000000..7de45e6 --- /dev/null +++ b/components/diy-components/diy-goods-recommend.vue @@ -0,0 +1,438 @@ + ++ + ++ + ++ {{ item.goods_name }} + + ++ +{{ item.label_name }} ++ + +{{ goodsValue.tag.text }} ++ ++ + + + ++ +¥ +{{ showPrice(item).split(".")[0] }} +{{ '.'+showPrice(item).split(".")[1] }} ++ ++ + + ¥{{ item.market_price > 0 ? item.market_price : item.price }} + ++ 已售{{ item.sale_num }}{{ item.unit ? item.unit : '件' }} + ++ + + + + + + {{ goodsValue.btnStyle.text }} + + + ++ + + ++ + ++ ++ ++ ++ {{ item.goods_name }} + + ++ +{{ item.label_name }} ++ + +{{ goodsValue.tag.text }} ++ ++ ++ +¥ +{{ showPrice(item).split(".")[0] }} +{{ "."+showPrice(item).split(".")[1] }} ++ ++ + + ¥{{ item.market_price > 0 ? item.market_price : item.price }} + ++ 已售{{ item.sale_num }}{{ item.unit ? item.unit : '件' }} + ++ ++ ++ ++ + ++ {{ dataItem.goods_name }} + + ++ +{{ dataItem.label_name }} ++ + +{{ goodsValue.tag.text }} ++ ++ ++ +¥ +{{ showPrice(dataItem).split(".")[0] }} +{{"."+showPrice(dataItem).split(".")[1]}} ++ ++ + + ¥{{ dataItem.market_price > 0 ? dataItem.market_price : dataItem.price }} + ++ 已售{{ dataItem.sale_num }}{{ dataItem.unit ? dataItem.unit : '件' }} + ++ + + + + + diff --git a/components/diy-components/diy-graphic-nav.vue b/components/diy-components/diy-graphic-nav.vue new file mode 100644 index 0000000..aabc0f5 --- /dev/null +++ b/components/diy-components/diy-graphic-nav.vue @@ -0,0 +1,317 @@ + ++ ++ {{ goodsValue.topStyle.title }} ++ {{ goodsValue.topStyle.subTitle }} ++ ++ ++ ++ + ++ {{ dataItem.goods_name }} + ++ ++ ++ +¥ +{{ showPrice(dataItem).split(".")[0] }} +{{ "."+showPrice(dataItem).split(".")[1] }} ++ ¥{{ dataItem.market_price > 0 ? dataItem.market_price : dataItem.price }} + ++ 售{{ dataItem.sale_num }}{{ dataItem.unit ? dataItem.unit : '件' }} + ++ + + + + + diff --git a/components/diy-components/diy-group.vue b/components/diy-components/diy-group.vue new file mode 100644 index 0000000..5da9d55 --- /dev/null +++ b/components/diy-components/diy-group.vue @@ -0,0 +1,268 @@ + ++ ++ + ++ + ++ + + + + ++ ++ + + + + {{ item.label.text }} + ++ {{ item.title }} + ++ + ++ ++ + + ++ + + + + + ++ + + ++ ++ + + {{ item.label.text }} + ++ {{ item.title }} + ++ + + + + + + diff --git a/components/diy-components/diy-groupbuy.vue b/components/diy-components/diy-groupbuy.vue new file mode 100644 index 0000000..644723e --- /dev/null +++ b/components/diy-components/diy-groupbuy.vue @@ -0,0 +1,412 @@ + ++ ++ + + + + ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/components/diy-components/diy-horz-blank.vue b/components/diy-components/diy-horz-blank.vue new file mode 100644 index 0000000..9407a9e --- /dev/null +++ b/components/diy-components/diy-horz-blank.vue @@ -0,0 +1,36 @@ + ++ + + ++ ++ + ++ {{ item.goods_name }} + ++ + +¥ +{{ item.groupbuy_price.split(".")[0] }} +{{ "."+item.groupbuy_price.split(".")[1] }} ++ + ++ ++ ++ + 已团{{ item.sell_num }}件 ++ ++ {{ item.goods_name }} + ++ +¥ +{{ item.groupbuy_price.split(".")[0] }} +{{ "."+item.groupbuy_price.split(".")[1] }} ++ ¥{{ item.price }} + ++ + ++ ++ ++ ++ + 已团{{ item.sell_num }}件 ++ ++ {{ item.goods_name }} + ++ +¥ +{{ item.groupbuy_price.split(".")[1] }} +{{ "."+item.groupbuy_price.split(".")[1] }} ++ ¥{{ item.price }} + ++ + + + + diff --git a/components/diy-components/diy-horz-line.vue b/components/diy-components/diy-horz-line.vue new file mode 100644 index 0000000..17db8fd --- /dev/null +++ b/components/diy-components/diy-horz-line.vue @@ -0,0 +1,21 @@ + + + + + + + diff --git a/components/diy-components/diy-icon.vue b/components/diy-components/diy-icon.vue new file mode 100644 index 0000000..db5a648 --- /dev/null +++ b/components/diy-components/diy-icon.vue @@ -0,0 +1,84 @@ + + + + + + + + diff --git a/components/diy-components/diy-img-ads.vue b/components/diy-components/diy-img-ads.vue new file mode 100644 index 0000000..d92b463 --- /dev/null +++ b/components/diy-components/diy-img-ads.vue @@ -0,0 +1,329 @@ + ++ + + + + + + diff --git a/components/diy-components/diy-index-page.vue b/components/diy-components/diy-index-page.vue new file mode 100644 index 0000000..cb200be --- /dev/null +++ b/components/diy-components/diy-index-page.vue @@ -0,0 +1,693 @@ + ++ ++ ++ ++ + + ++ + + ++ ++ ++ + + ++ + + ++ + + + + + + diff --git a/components/diy-components/diy-live.vue b/components/diy-components/diy-live.vue new file mode 100644 index 0000000..6ee792f --- /dev/null +++ b/components/diy-components/diy-live.vue @@ -0,0 +1,235 @@ + ++ ++ + ++ + ++ ++ {{ cateList[0].short_name ? cateList[0].short_name : cateList[0].category_name }} + ++ {{ cateList[0].short_name ? cateList[0].short_name : cateList[0].category_name }} + ++ + ++ ++ {{ item.short_name ? item.short_name : item.category_name }} + ++ {{ item.short_name ? item.short_name : item.category_name }} + ++ + ++ + ++ + ++ + + ++ ++ ++ ++ ++ + {{ item.category_name }} ++ ++ ++ ++ ++ + {{ item.category_name }} ++ ++ ++ ++ ++ {{ item.category_name }} ++ ++ + + + ++ ++ ++ ++ {{ goodsTag(item) }} ++ + ++ +{{ item.goods_name }} ++ ++ +{{ $lang('common.currencySymbol') }} + {{ item.market_price > 0 ? item.market_price : item.price }} +已售{{ item.sale_num }}{{ item.unit ? item.unit : '件' }} ++ ++ +{{ $lang('common.currencySymbol') }} +{{ showPrice(item) }} ++ ++ + ++ + + + + + + + + + diff --git a/components/diy-components/diy-many-goods-list.vue b/components/diy-components/diy-many-goods-list.vue new file mode 100644 index 0000000..923ff5e --- /dev/null +++ b/components/diy-components/diy-many-goods-list.vue @@ -0,0 +1,143 @@ + ++ ++ ++ + + ++ ++ + {{ liveInfo.name }} ++ + {{ liveInfo.status_name }} + + ++ ++ 主播:{{ liveInfo.anchor_name }} +| ++ +直播商品:{{ liveInfo.goods.length }} ++ + + + + + diff --git a/components/diy-components/diy-member-info.vue b/components/diy-components/diy-member-info.vue new file mode 100644 index 0000000..57fdb07 --- /dev/null +++ b/components/diy-components/diy-member-info.vue @@ -0,0 +1,1037 @@ + ++ ++ ++ ++ + +{{ item.title }} +{{ item.desc }} ++ + + + + + + + diff --git a/components/diy-components/diy-member-my-order.vue b/components/diy-components/diy-member-my-order.vue new file mode 100644 index 0000000..2edcfea --- /dev/null +++ b/components/diy-components/diy-member-my-order.vue @@ -0,0 +1,248 @@ + ++ + + ++ + ++ + ++ ++ + + ++ ++ 点击完善会员资料 + +{{ memberInfo.nickname }} ++ ++ {{ memberInfo.member_level_name }} + + + + + ++ {{ memberInfo.member_level_name }} ++ ++ 点击获取微信头像 + +{{ memberInfo.nickname }} ++ ++ {{ memberInfo.member_level_name }} + + + ++ {{ memberInfo.member_level_name }} ++ + + + ++ + ++ 登录/注册 点击登录 享受更多精彩信息 ++ + + ++ +{{ memberInfo ? (parseFloat(memberInfo.balance) + parseFloat(memberInfo.balance_money)).toFixed(2) : '--' }} +余额 ++ + +{{ memberInfo ? parseFloat(memberInfo.point) : '--' }} +积分 ++ + +{{ memberInfo && memberInfo.coupon_num != undefined ? memberInfo.coupon_num : '--' }} +优惠券 ++ ++ ++ ++ 超级会员 ++ +查看特权 +会员可享更多权益 ++ + ++ ++ 开通可享更多权益 ++ +查看特权 +立即开通 ++ ++ +{{ memberInfo ? (parseFloat(memberInfo.balance) + parseFloat(memberInfo.balance_money)).toFixed(2) : '--' }} +余额 ++ + +{{ memberInfo ? parseFloat(memberInfo.point) : '--' }} +积分 ++ + +{{ memberInfo && memberInfo.coupon_num != undefined ? memberInfo.coupon_num : '--' }} +优惠券 ++ + + ++ ++ ++ ++ 会员码 ++ + 如遇到扫码失败请将屏幕调至最亮重新扫码 ++ + + ++ ++ ++ +获取您的昵称、头像 +获取用户头像、昵称完善个人资料,主要用于向用户提供具有辨识度的用户中心界面 ++ + +头像 + ++ + + +昵称 + ++ + + + + + + diff --git a/components/diy-components/diy-notes.vue b/components/diy-components/diy-notes.vue new file mode 100644 index 0000000..fe5a612 --- /dev/null +++ b/components/diy-components/diy-notes.vue @@ -0,0 +1,338 @@ + ++ ++ ++ ++ + ++ + + + + + {{ orderNum.waitpay > 99 ? '99+' : orderNum.waitpay }} +待付款 ++ ++ + ++ + + + + + {{ orderNum.waitsend > 99 ? '99+' : orderNum.waitsend }} +待发货 ++ ++ + ++ + + + + + {{ orderNum.waitconfirm > 99 ? '99+' : orderNum.waitconfirm }} +待收货 ++ ++ + ++ + + + + + {{ orderNum.wait_use > 99 ? '99+' : orderNum.wait_use }} +待使用 ++ ++ + ++ + + + + + {{ orderNum.refunding > 99 ? '99+' : orderNum.refunding }} +售后 ++ + + + + + + diff --git a/components/diy-components/diy-notice.vue b/components/diy-components/diy-notice.vue new file mode 100644 index 0000000..0eae353 --- /dev/null +++ b/components/diy-components/diy-notice.vue @@ -0,0 +1,182 @@ + ++ + ++ {{ value.title }} + +{{ value.more }} ++ + ++ ++ ++ + +{{ item.note_title }} ++ +{{ labelItem }} ++ +#{{ item.note_type == 'goods_item' ? '单品介绍' : '掌柜说' }}# + {{ item.note_abstract }} ++ + ++ + + ++ ++ +{{ item.update_time_day }} ++ +阅读 {{ item.initial_read_num + item.read_num }} ++ + + + + + diff --git a/components/diy-components/diy-pinfan.vue b/components/diy-components/diy-pinfan.vue new file mode 100644 index 0000000..f8c12fc --- /dev/null +++ b/components/diy-components/diy-pinfan.vue @@ -0,0 +1,501 @@ + ++ ++ + + + ++ + + + ++ + + + + ++ +{{ item.title }} ++ + ++ +{{ item.title }} ++ + + + + + + + diff --git a/components/diy-components/diy-pintuan.vue b/components/diy-components/diy-pintuan.vue new file mode 100644 index 0000000..c28ec61 --- /dev/null +++ b/components/diy-components/diy-pintuan.vue @@ -0,0 +1,696 @@ + ++ + + + ++ ++ + ++ {{ item.goods_name }} + ++ ++ ++ {{ item.pintuan_num }}人团 ++ +已拼{{ item.order_num }}件 ++ ++ +¥ +{{ item.pintuan_price.split(".")[0] }} +{{ "."+item.pintuan_price.split(".")[1] }} ++ ¥{{ item.price }} + + ++ + ++ ++ ++ + ++ {{ item.goods_name }} + ++ ++ {{ item.pintuan_num }}人团 + ++ 返{{ item.reward_type_num }}积分 + ++ 返¥{{ item.reward_type_num }} + +返优惠券 ++ +¥ +{{ item.pintuan_price.split('.')[0] }} +{{ "."+item.pintuan_price.split('.')[1] }} ++ + ++ ++ ++ ++ + ++ {{ item.goods_name }} + ++ ++ {{ item.pintuan_num }}人团 + ++ 返{{ item.reward_type_num }}积分 + ++ 返¥{{ item.reward_type_num }} + ++ 返优惠券 + ++ +¥ +{{ item.pintuan_price.split('.')[1] }} +{{ "."+item.pintuan_price.split('.')[1] }} ++ + + + + + diff --git a/components/diy-components/diy-presale.vue b/components/diy-components/diy-presale.vue new file mode 100644 index 0000000..5256bf2 --- /dev/null +++ b/components/diy-components/diy-presale.vue @@ -0,0 +1,377 @@ + ++ + + ++ {{value.titleStyle.leftText}} ++ + ++ ++ ++ + ++ ++ ++ +{{value.titleStyle.virtualNum || headData.pintuan_count}}人拼团成功 ++ +{{value.titleStyle.more}} ++ + + + + ++ ++ ++ ++ {{ item.goods_name }} + ++ + ++ ++ {{ item.pintuan_num }}人团 ++ +已拼{{ item.order_num }}件 ++ ++ + ++ +¥ +{{ item.pintuan_price.split(".")[0] }} +{{ "."+item.pintuan_price.split(".")[1] }} ++ ¥{{ item.price }} + ++ + ++ ++ ++ ++ {{ item.pintuan_num }}人团 + ++ ++ {{ item.goods_name }} + ++ +¥ +{{ item.pintuan_price.split(".")[0] }} +{{ "."+item.pintuan_price.split(".")[1] }} +已拼{{item.sale_num}}件 ++ + ++ ++ ++ ++ + {{ item.pintuan_num }}人团 + ++ ++ {{ item.goods_name }} + ++ +¥ +{{ item.pintuan_price.split(".")[0] }} +{{ "."+item.pintuan_price.split(".")[1] }} +已拼{{item.sale_num}}件 ++ + + + + + + diff --git a/components/diy-components/diy-rich-text.vue b/components/diy-components/diy-rich-text.vue new file mode 100644 index 0000000..d5cb5a3 --- /dev/null +++ b/components/diy-components/diy-rich-text.vue @@ -0,0 +1,50 @@ + ++ + + ++ ++ + ++ {{ item.goods_name }} + ++ + +¥ +{{ showPrice(item).split(".")[0] }} +{{ "."+showPrice(item).split(".")[1] }} ++ + ++ ++ ++ + ++ {{ item.goods_name }} + ++ +¥ +{{ showPrice(item).split(".")[0] }} +{{ "."+showPrice(item).split(".")[1] }} ++ + ++ ++ ++ ++ + ++ {{ item.goods_name }} + ++ +¥ +{{ showPrice(item).split(".")[0] }} +{{ "."+showPrice(item).split(".")[1] }} ++ + + + + diff --git a/components/diy-components/diy-rubik-cube.vue b/components/diy-components/diy-rubik-cube.vue new file mode 100644 index 0000000..463de5c --- /dev/null +++ b/components/diy-components/diy-rubik-cube.vue @@ -0,0 +1,542 @@ + + + + + + + + diff --git a/components/diy-components/diy-search.vue b/components/diy-components/diy-search.vue new file mode 100644 index 0000000..9bfb8d6 --- /dev/null +++ b/components/diy-components/diy-search.vue @@ -0,0 +1,130 @@ + ++ ++ + + + ++ + ++ ++ + + + + + + + ++ + + ++ + + ++ ++ + + + + ++ ++ + + + ++ + + ++ + + ++ + + + + + + diff --git a/components/diy-components/diy-seckill.vue b/components/diy-components/diy-seckill.vue new file mode 100644 index 0000000..335040c --- /dev/null +++ b/components/diy-components/diy-seckill.vue @@ -0,0 +1,1029 @@ + ++ + + + ++ + + + + + + diff --git a/components/diy-components/diy-store-info.vue b/components/diy-components/diy-store-info.vue new file mode 100644 index 0000000..45f387f --- /dev/null +++ b/components/diy-components/diy-store-info.vue @@ -0,0 +1,223 @@ + ++ + ++ {{ value.titleStyle.leftText }} + ++ 距离开始 ++ +{{isFuture ? '距离开始' : '距离结束'}} ++ {{ seckillH ? seckillH : '00' }} +: +{{ seckillI ? seckillI : '00' }} +: +{{ seckillS ? seckillS : '00' }} ++ +{{ value.titleStyle.more }} ++ + + ++ + + + ++ ++ ++ ++ {{ item.goods_name }} + ++ ++ ++ ++ ++ 已抢{{((item.goods_stock + item.sale_num) ? ((item.sale_num / (item.goods_stock + item.sale_num)) * 100).toFixed(2) : '0.00') }}% + ++ ++ + ++ +¥ +{{ item.seckill_price.split(".")[0] }} +{{ '.'+item.seckill_price.split(".")[1] }} ++ ¥{{ item.price }} + ++ +原价: +¥{{ item.price }} ++ + + + ++ ++ ++ ++ {{ item.goods_name }} + ++ +¥ +{{ item.seckill_price.split('.')[0] }} +{{ "."+item.seckill_price.split('.')[1] }} ++ ++ ¥{{ item.price }} + + ++ ++ ++ ++ + ++ {{ item.goods_name }} + ++ +¥ +{{ item.seckill_price.split('.')[0] }} +{{ "."+item.seckill_price.split('.')[1] }} ++ ¥{{ item.price }} + ++ + ++ ++ ++ ++ + ++ {{ item.goods_name }} + ++ +¥ +{{ item.seckill_price.split('.')[0] }} +{{ "."+item.seckill_price.split('.')[1] }} ++ ¥{{ item.price }} + ++ + + + + + diff --git a/components/diy-components/diy-store.vue b/components/diy-components/diy-store.vue new file mode 100644 index 0000000..2561e35 --- /dev/null +++ b/components/diy-components/diy-store.vue @@ -0,0 +1,381 @@ + ++ ++ ++ + + + + +{{ store.store_name }} ++ +营业时间: +{{ store.open_date }} ++ +联系电话: +{{ store.telphone }} ++ +门店地图 + ++ ++ +{{ store.full_address + store.address }} +距您当前位置{{ store.distance }}km ++ + + + + + + diff --git a/components/diy-components/diy-text-nav.vue b/components/diy-components/diy-text-nav.vue new file mode 100644 index 0000000..8449c49 --- /dev/null +++ b/components/diy-components/diy-text-nav.vue @@ -0,0 +1,100 @@ + ++ + ++ ++ ++ ++ +{{ store.store_name }} ++ +切换 ++ {{load && !storeList.length ? '没有附近门店' : '定位中...'}} ++ ++ ++ {{ store.full_address }}{{ store.address }} +获取当前位置... ++ ++ + + + ++ ++ ++ ++ + + ++ +{{ store.store_name }} ++ +切换 ++ {{load && !storeList.length ? '没有附近门店' : '定位中...'}} ++ + ++ ++ ++ ++ {{ store.store_name }} ++ {{load && !storeList.length ? '没有附近门店' : '定位中...'}} ++ + ++ + + + + + + + diff --git a/components/diy-components/diy-text.vue b/components/diy-components/diy-text.vue new file mode 100644 index 0000000..11f393b --- /dev/null +++ b/components/diy-components/diy-text.vue @@ -0,0 +1,980 @@ + ++ ++ {{ value.list[0].text }} + +{{ value.list[0].secondText }} + ++ ++ ++ {{ item.text }} + ++ + + + + + diff --git a/components/diy-components/diy-video.vue b/components/diy-components/diy-video.vue new file mode 100644 index 0000000..3846f50 --- /dev/null +++ b/components/diy-components/diy-video.vue @@ -0,0 +1,38 @@ + + + + + + + diff --git a/components/goods-detail-view/detail.js b/components/goods-detail-view/detail.js new file mode 100644 index 0000000..6d48bda --- /dev/null +++ b/components/goods-detail-view/detail.js @@ -0,0 +1,545 @@ +// 商品详情业务 +import { + Weixin +} from '@/common/js/wx-jssdk.js'; +export default { + data() { + return { + skuId: 0, + goodsId: 0, + isIphoneX: false, //判断手机是否是iphoneX以上 + whetherCollection: 0, + + //是否开启预览,0:不开启,1:开启 + preview: 0, + token: "", + videoContext: '', + + // 媒体,图片,视频 + + // 解决每个商品SKU图片数量不同时,无法切换到第一个,导致轮播图显示不出来 + swiperInterval: 1, + swiperAutoplay: false, + swiperCurrent: 1, + switchMedia: 'img', + + //评价 + goodsEvaluate: [{ + member_headimg: '', + member_name: '', + content: '', + images: [], + create_time: 0, + sku_name: '' + }], + evaluateConfig: { + evaluate_audit: 1, + evaluate_show: 0, + evaluate_status: 1 + }, + + // 是否可分享到好物圈 + goodsCircle: false, + memberId: 0, + service: null, + shareUrl: '', // 分享链接 + source_member: 0, //分享人的id + isCommunity: false, //社群弹窗 + + poster: "-1", //海报 + posterMsg: "", //海报错误信息 + posterHeight: 0, + posterParams: {}, //海报所需参数 + detailTab: 0, + goodsRoute: '', + posterApi: '', + goodsAttrShow: false, // 商品属性是否展开 + + storeList: { + data: [], + page: 1, + page_size: 10 + }, //门店列表 + latitude: null, // 纬度 + longitude: null, // 经度 + store: {}, + storeId: 0, + evaluateCount: 0, // 商品评论数量 + deliveryType: null, // 配送方式 + isVirtual: 0 //是否为虚拟商品 + } + }, + created() { + this.isIphoneX = this.$util.uniappIsIPhoneX(); + this.token = uni.getStorageSync('token'); + + // 门店信息 + this.store = uni.getStorageSync('store') ? uni.getStorageSync('store') : {}; + if (this.store) this.storeId = this.store.store_id; + + if (this.location) { + this.latitude = this.location.latitude; + this.longitude = this.location.longitude; + } else { + this.$util.getLocation(); + } + this.getStoreData(); + }, + computed: { + location() { + return this.$store.state.location; + } + }, + methods: { + init(params) { + this.skuId = params.sku_id; + this.goodsId = params.goods_id; + this.preview = params.preview; + this.source_member = params.source_member; + this.whetherCollection = params.whetherCollection; + this.posterParams = params.posterParams; + + this.shareUrl = params.shareUrl; + this.memberId = params.memberId; + this.goodsRoute = params.goodsRoute; + this.posterApi = params.posterApi; + this.isVirtual = params.isVirtual; + this.getService(); + + // 评价设置 + this.getEvaluateConfig(); + this.videoContext = uni.createVideoContext('goodsVideo'); + + // #ifdef MP-WEIXIN + this.goodsSyncToGoodsCircle(); + // #endif + + this.getWhetherCollection(); + + if (this.isVirtual == 0) this.getEnabledExpressType(); + }, + swiperChange(e) { + this.swiperCurrent = e.detail.current + 1; + }, + + //-------------------------------------服务------------------------------------- + + openMerchantsServicePopup() { + this.$refs.merchantsServicePopup.open(); + }, + closeMerchantsServicePopup() { + this.$refs.merchantsServicePopup.close(); + }, + + //-------------------------------------门店列表------------------------------------- + openStoreListPopup() { + this.$refs.storeListPopup.open(); + }, + closeStoreListPopup() { + this.$refs.storeListPopup.close(); + }, + getStoreData() { + //门店列表 + let data = { + page: this.storeList.page, + page_size: this.storeList.page_size + }; + if (this.latitude && this.longitude) { + data.latitude = this.latitude; + data.longitude = this.longitude; + } + this.$api.sendRequest({ + url: '/api/store/page', + data: data, + success: res => { + if (this.storeList.page == 1) this.storeList.data == []; + if (res.code >= 0 && res.data) { + this.storeList.data = this.storeList.data.concat(res.data.list); + } else { + this.$util.showToast({ + title: res.message + }); + } + } + }); + }, + selectStore(item) { + this.$util.diyRedirectTo({ + store_id: item.store_id, + wap_url: '/pages_tool/index/diy?name=' + 'DIY_STORE' + }); + this.closeStoreListPopup(); + }, + //-------------------------------------属性------------------------------------- + + switchGoodsAttr() { + this.goodsAttrShow = !this.goodsAttrShow; + }, + //获取用户是否关注 + async getWhetherCollection() { + this.$api.sendRequest({ + url: "/api/goodscollect/iscollect", + data: { + goods_id: this.goodsId + }, + success: res => { + this.whetherCollection = res.data; + } + }); + }, + //-------------------------------------评价------------------------------------- + //商品评论列表 + getGoodsEvaluate() { + + this.$api.sendRequest({ + url: "/api/goodsevaluate/firstinfo", + data: { + goods_id: this.goodsSkuDetail.goods_id + }, + success: res => { + let data = res.data; + if (data) { + this.goodsEvaluate = data; + this.goodsEvaluate.forEach((item, index) => { + if (this.goodsEvaluate[index].images) this.goodsEvaluate[index].images = + this.goodsEvaluate[index].images.split(","); + if (this.goodsEvaluate[index].is_anonymous == 1) this.goodsEvaluate[ + index].member_name = this.goodsEvaluate[index].member_name + .replace( + this.goodsEvaluate[index].member_name.substring(1, this + .goodsEvaluate[index].member_name.length - 1), '***') + }) + // if (this.goodsEvaluate.images) this.goodsEvaluate.images = this.goodsEvaluate.images.split(","); + // if (this.goodsEvaluate.is_anonymous == 1) this.goodsEvaluate.member_name = this.goodsEvaluate.member_name.replace( + // this.goodsEvaluate.member_name.substring(1, this.goodsEvaluate.member_name.length - 1), '***') + } + } + }); + }, + //商品评论列表 + getGoodsEvaluateCount() { + + this.$api.sendRequest({ + url: "/api/goodsevaluate/count", + data: { + goods_id: this.goodsSkuDetail.goods_id + }, + success: res => { + if (res.code >= 0) { + this.evaluateCount = res.data; + } + } + }); + }, + // 预览评价图片 + previewEvaluate(index, img_index, field) { + var paths = []; + for (let i = 0; i < this.goodsEvaluate[index][field].length; i++) { + paths.push(this.$util.img(this.goodsEvaluate[index][field][i])); + } + uni.previewImage({ + current: img_index, + urls: paths + }); + }, + //-------------------------------------关注------------------------------------- + editCollection() { + if (this.preview) return; // 开启预览,禁止任何操作和跳转 + + if (this.token) { + + //未关注添加关注 + if (this.whetherCollection == 0) { + this.$api.sendRequest({ + url: "/api/goodscollect/add", + data: { + sku_id: this.skuId, + goods_id: this.goodsSkuDetail.goods_id, + sku_name: this.goodsSkuDetail.sku_name, + sku_price: this.goodsSkuDetail.show_price, + sku_image: this.goodsSkuDetail.sku_image + }, + success: res => { + var data = res.data; + if (data > 0) { + this.whetherCollection = 1; + } + } + }); + } else { + //已关注取消关注 + this.$api.sendRequest({ + url: "/api/goodscollect/delete", + data: { + goods_id: this.goodsSkuDetail.goods_id + }, + success: res => { + var data = res.data; + if (data > 0) { + this.whetherCollection = 0; + } + } + }); + } + } else { + if (this.source_member) { + this.$refs.login.open(this.shareUrl + '&source_member=' + this.source_member); + } else { + this.$refs.login.open(this.shareUrl); + } + } + }, + + collection() { + if (this.preview) return; // 开启预览,禁止任何操作和跳转 + this.editCollection(); + if (this.token) { + return this.whetherCollection ? 0 : 1; + } + }, + //-------------------------------------分享------------------------------------- + // 打开分享弹出层 + openSharePopup() { + this.$refs.sharePopup.open(); + }, + // 关闭分享弹出层 + closeSharePopup() { + this.$refs.sharePopup.close(); + }, + copyUrl() { + let text = this.$config.h5Domain + this.shareUrl; + if (this.memberId) text += '&source_member=' + this.memberId; + this.$util.copy(text, () => { + this.closeSharePopup(); + }); + }, + + //-------------------------------------海报------------------------------------- + // 打开海报弹出层 + openPosterPopup() { + this.getGoodsPoster(); + this.$refs.sharePopup.close(); + this.$refs.posterPopup.open(); + if (this.poster != '-1') { + setTimeout(() => { + let view = uni.createSelectorQuery().in(this).select(".poster-layer .image-wrap"); + view.fields({ + size: true, + }, data => { + let posterWhith = data.width; + let ratio = parseFloat((740 / posterWhith).toFixed(2)); + if (this.token != '') { + this.posterHeight = parseInt(1240 / ratio); + } else { + this.posterHeight = parseInt(1100 / ratio); + } + }).exec(); + }, 100); + } + }, + // 关闭海报弹出层 + closePosterPopup() { + this.$refs.posterPopup.close(); + }, + //生成海报 + getGoodsPoster() { + uni.showLoading({ + 'title': '海报生成中...' + }) + //活动海报信息 + if (this.memberId) this.posterParams.source_member = this.memberId; + + this.$api.sendRequest({ + url: this.posterApi, + data: { + page: this.goodsRoute, + qrcode_param: JSON.stringify(this.posterParams) + }, + success: res => { + if (res.code == 0) { + this.poster = res.data.path + "?time=" + new Date().getTime(); + } else { + this.posterMsg = res.message; + } + uni.hideLoading(); + }, + fail: err => { + uni.hideLoading(); + } + }); + }, + // 预览图片 + previewMedia(index) { + var paths = []; + for (let i = 0; i < this.goodsSkuDetail.sku_images.length; i++) { + paths.push(this.$util.img(this.goodsSkuDetail.sku_images[i], { + size: 'big' + })); + } + uni.previewImage({ + current: index, + urls: paths, + // longPressActions: { + // itemList: ['发送给朋友', '保存图片', '关注'], + // success: function(data) { + // console.log('选中了第' + (data.tapIndex + 1) + '个按钮,第' + (data.index + 1) + '张图片'); + // }, + // fail: function(err) { + // console.log(err.errMsg); + // } + // } + }); + }, + swiperImageError(index) { + this.goodsSkuDetail.sku_images[index] = this.$util.getDefaultImage().goods; + this.$forceUpdate(); + }, + // #ifdef MP || APP-PLUS + //小程序中保存海报 + saveGoodsPoster() { + let url = this.$util.img(this.poster); + uni.downloadFile({ + url: url, + success: (res) => { + if (res.statusCode === 200) { + uni.saveImageToPhotosAlbum({ + filePath: res.tempFilePath, + success: () => { + this.$util.showToast({ + title: "保存成功" + }); + }, + fail: () => { + this.$util.showToast({ + title: "保存失败,请稍后重试" + }); + } + }); + } + } + }); + }, + // #endif + //售后保障查询 + getService() { + this.$api.sendRequest({ + url: '/api/goods/aftersale', + success: res => { + if (res.code == 0 && res.data) { + this.service = res.data; + } + } + }); + }, + + // #ifdef MP-WEIXIN + /** + * 将商品同步到微信圈子 + */ + goodsSyncToGoodsCircle() { + this.$api.sendRequest({ + url: '/goodscircle/api/goods/sync', + data: { + goods_id: this.goodsSkuDetail.goods_id + }, + success: res => { + if (res.code == 0) { + this.goodsCircle = true; + } + } + }) + }, + /** + * 将商品推荐到微信圈子 + */ + openBusinessView() { + if (wx.openBusinessView) { + wx.openBusinessView({ + businessType: 'friendGoodsRecommend', + extraData: { + product: { + item_code: this.goodsSkuDetail.goods_id, + title: this.goodsSkuDetail.sku_name, + image_list: this.goodsSkuDetail.sku_images.map((ele) => { + return this.$util.img(ele); + }) + } + }, + success: function(res) { + console.log('success', res); + }, + fail: function(res) { + console.log('fail', res); + } + }) + } + }, + // #endif + getEvaluateConfig() { + this.$api.sendRequest({ + url: '/api/goodsevaluate/config', + success: res => { + if (res.code == 0) { + var data = res.data; + this.evaluateConfig = data; + if (this.evaluateConfig.evaluate_show == 1) { + //商品评论 + this.getGoodsEvaluate(); + this.getGoodsEvaluateCount(); + } + } + } + }); + }, + toEvaluateDetail(id) { + this.$util.redirectTo('/pages_tool/goods/evaluate', { + goods_id: id + }); + }, + showImg(e) { + //拿到图片的路径里面的内容放在我们数组中 + let contentimg = e.target.dataset.nodes; + let arrImg = []; + for (var i = 0; i < contentimg.length; i++) { + var img = contentimg[i].children; + if (Array.isArray(img)) { + for (var j = 0; j < img.length; j++) { + if (img[j].attrs && img[j].name == "img") { + if (img[j].attrs.src) { + arrImg.push(img[j].attrs.src) + } + } + } + } + } + //最后一步就是把我们的所有图片放在预览的api中就可以了 + uni.previewImage({ + current: arrImg, + urls: arrImg, + }) + }, + + //-------------------------------------社群------------------------------------- + + //添加福利群 + onCommunity() { + this.isCommunity = true + }, + onCloseCommunity() { + this.isCommunity = false + }, + /** + * 查询启用的配送方式 + */ + getEnabledExpressType() { + this.$api.sendRequest({ + url: "/api/config/enabledexpresstype", + success: res => { + if (res.code == 0 && res.data) this.deliveryType = res.data; + } + }); + } + + } + +} diff --git a/components/goods-detail-view/goods-detail-view.vue b/components/goods-detail-view/goods-detail-view.vue new file mode 100644 index 0000000..2c43d21 --- /dev/null +++ b/components/goods-detail-view/goods-detail-view.vue @@ -0,0 +1,436 @@ + ++ ++ ++ ─── {{ value.text }} ++ ─── + ++ +{{ value.text }} ++ ++ + ++ +{{ value.text }} ++ + ++ +{{ value.text }} ++ ++ + + + ++ ++ +{{ value.text }} ++ + + ++ ++ +{{ value.text }} ++ + ++ ++ +{{ value.text }} ++ + ++ ++ +{{ value.text }} ++ + ++ ++ ++ ++ + {{ value.text }} + ++ + {{ value.more.text }} + ++ {{ value.subTitle.text }} ++ ++ ++ ++ ++ + + {{ value.text }} + ++ + {{ value.more.text }} + ++ {{ value.subTitle.text }} ++ ++ ++ ++ ++ ++ ++ {{ value.text }} + +{{ value.subTitle.text }} ++ {{ value.more.text }} + + ++ + + + + ++ {{ value.text }} + +{{ value.subTitle.text }} ++ +{{ value.more.text }} ++ + ++ + {{ value.text }} + ++ + + + ++ ++ ++ {{ value.text }} + +专区 ++ + + + {{ value.subTitle.text }} + ++ +{{ value.more.text }} ++ + + + ++ ++ ++ + + ++ + + {{ value.text }} + ++ ++ + + ++ + + {{ value.subTitle.text }} + ++ ++ {{ value.text }} + ++ ++ {{ value.subTitle.text }} ++ +{{ value.more.text }} ++ + + + + + + + diff --git a/components/img-cropping/cropping.vue b/components/img-cropping/cropping.vue new file mode 100644 index 0000000..bc32eec --- /dev/null +++ b/components/img-cropping/cropping.vue @@ -0,0 +1,1484 @@ + ++ + + ++ + ++ + + + + + + ++ + + ++ ++ ++ ++ + +{{ swiperCurrent }} +/{{ goodsSkuDetail.sku_images.length }} ++ + + + ++ +{{ $lang('video') }} +{{ $lang('image') }} ++ + ++ + + + + ++ + + + + + +配送 ++ ++ ++ +{{ item.name }} ++ + 商家未配置配送方式 + + +门店 ++ ++ ++ {{store.store_name}} ++ +距离{{ store.distance > 1 ? store.distance + 'km' : store.distance * 1000 + 'm' }} +. +{{ store.full_address + store.address }} ++ + + +服务 ++ ++ ++ ++ ++ + + {{ item.service_name }} ++ + + + + ++ ++ ++ +配送 ++ + ++ ++ ++ + +{{ item.name }} +{{ item.desc }} ++ + + ++ ++ ++ +商品服务 ++ + ++ ++ ++ + + + +{{ item.service_name }} +{{ item.desc }} ++ + + + ++ ++ ++ +门店列表 ++ + ++ ++ ++ ++ ++ + + ++ +{{ item.store_name }} ++ 距离{{ item.distance > 1 ? item.distance + 'km' : item.distance * 1000 + 'm' }} + +营业时间:{{ item.open_date }} +{{ item.full_address + item.address }} ++ + + + + + ++ ++ + +{{ goodsSkuDetail.qr_data.qr_name }} +{{ goodsSkuDetail.qr_data.community_describe }} +添加 ++ + + + ++ ++ 添加社群 + ++ 长按识别二维码,添加社群 ++ + + + + + ++ ++ + ++ ++ 评价 + +({{ evaluateCount }}) +暂无评价 ++ +查看全部 ++ + ++ ++ ++ ++ + + ++ {{ item.member_name[0] }}***{{ item.member_name[item.member_name.length - 1] }} + +{{ item.member_name }} ++ {{ $util.timeStampTurnTime(item.create_time) }} +{{ item.content }} ++ ++ ++ ++ + + + +规格属性 ++ ++ ++ +{{ item.attr_name }} +{{ item.attr_value_name }} ++ ++ 展开 ++ + 收起 ++ + + + ++ + + +商品详情 + + ++ ++ + ++ ++ 该商家暂无上传相关详情哦! ++ + + + + + + + ++ + ++ ++ + 保存图片 + + +长按保存图片 + ++ + {{ posterMsg }} ++ + ++ ++ +分享 ++ + ++ + + + + ++ + + + ++ + + ++ + + ++ 取消分享 + + + + + + + + + + diff --git a/components/l-time/l-time.vue b/components/l-time/l-time.vue new file mode 100644 index 0000000..4ba8dee --- /dev/null +++ b/components/l-time/l-time.vue @@ -0,0 +1,56 @@ + ++ + + + + ++ ++ ++ 取消 + + + + 上传 + ++ + 上传 {{ temp }} + + + + + diff --git a/components/l-time/time.js b/components/l-time/time.js new file mode 100644 index 0000000..76c5f4b --- /dev/null +++ b/components/l-time/time.js @@ -0,0 +1,161 @@ +Function.prototype.asyAfter = function(afterfn) { + var _self = this; + return function() { + var ret = _self.apply(this, arguments); + if (ret === 'next') { + return afterfn.apply(this, arguments); + } + return ret; + } +} + +Date.prototype.pattern = function(fmt) { + var o = { + "M+": this.getMonth() + 1, //月份 + "d+": this.getDate(), //日 + "h+": this.getHours() % 12 == 0 ? 12 : this.getHours() % 12, //小时 + "H+": this.getHours(), //小时 + "m+": this.getMinutes(), //分 + "s+": this.getSeconds(), //秒 + "q+": Math.floor((this.getMonth() + 3) / 3), //季度 + "S": this.getMilliseconds() //毫秒 + }; + var week = { + "0": "\u65e5", + "1": "\u4e00", + "2": "\u4e8c", + "3": "\u4e09", + "4": "\u56db", + "5": "\u4e94", + "6": "\u516d" + }; + if (/(y+)/.test(fmt)) { + fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length)); + } + if (/(E+)/.test(fmt)) { + fmt = fmt.replace(RegExp.$1, ((RegExp.$1.length > 1) ? (RegExp.$1.length > 2 ? "\u661f\u671f" : "\u5468") : + "") + + week[this.getDay() + ""]); + } + for (var k in o) { + if (new RegExp("(" + k + ")").test(fmt)) { + fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]) + .length))); + } + } + return fmt; +} + +const isType = type => (/^\[object\s(.*)\]$/.exec(Object.prototype.toString.call(type)))[1]; +let Time = function() {}; +let timeProto = Time.prototype; + +//获取当前时间戳 +timeProto.getUnix = function() { + return new Date().getTime(); +} + +//获取当天0点0分0秒时间戳 +timeProto.getTodayUnix = function() { + let date = new Date(); + let myDate = `${date.getFullYear()}/${(date.getMonth() + 1)}/${date.getDate()} 00:00:00`; + return new Date(myDate).getTime(); +} + +//获取今年1月1日0点0分0秒时间戳 +timeProto.getYearUnix = function() { + let date = new Date(); + date.setMonth(0); + date.setDate(1); + date.setHours(0); + date.setMinutes(0); + date.setSeconds(0); + date.setMilliseconds(0); + return date.getTime(); +} + +//获取当前时间标准年月日 +timeProto.getLastDate = function(constTime) { + if (!constTime) { + return; + } + let date = new Date(constTime); + if (date.pattern) { + return date.pattern("yyyy-MM-dd"); + } + + let month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1; + let day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate(); + return date.getFullYear() + '-' + month + '-' + day; +} + +const resDateStr = function(timer, constTime) { + let _just = function(timer) { + + if (timer <= 0 || Math.floor(timer / 60) <= 0) { + return "刚刚" + } else return 'next'; + } + + let _mm = function(timer) { + if (timer < 3600) { + return Math.floor(timer / 60) + "分钟前" + } else return 'next'; + } + let _hh = function(timer, constTime) { + let today = _time_.getTodayUnix(); + if (timer >= 3600 && (constTime - today >= 0)) { + //可切换显示模式 + // return "今天 " + new Date(constTime).pattern("HH:mm"); + return Math.floor(timer / 60 / 60) + "小时前"; + } else { + return 'next' + }; + } + let _dd = function(timer, constTime) { + let today = _time_.getTodayUnix(); + timer = (today - constTime) / 1000; + if (timer / 86400 <= 31) { + return Math.ceil(timer / 86400) + "天前" + } else return 'next'; + } + let _dlast = function(timer, constTime) { + return _time_.getLastDate(constTime); + } + + let dateFilter = _just.asyAfter(_mm).asyAfter(_hh).asyAfter(_dd).asyAfter(_dlast); + return dateFilter(timer, constTime); +} + + +//转换时间 +const reg = new RegExp("-", "g"); +timeProto.getFormatTime = function(constTime, max) { + if (!constTime) { + return ""; + } + + switch (isType(constTime)) { + case 'Date': + constTime = constTime.getTime(); + break; + case 'String': + constTime = constTime.replace(reg, "/"); + default: + constTime = new Date(constTime).getTime(); + break; + } + + let now = this.getUnix(); + let year = this.getYearUnix(); + let timer = (now - constTime) / 1000; + if (constTime > now && max) { + return this.getLastDate(constTime); + } + + let _t = this; + return resDateStr(timer, constTime); +} + +const _time_ = new Time(); +export default _time_; diff --git a/components/loading-cover/loading-cover.vue b/components/loading-cover/loading-cover.vue new file mode 100644 index 0000000..2409941 --- /dev/null +++ b/components/loading-cover/loading-cover.vue @@ -0,0 +1,113 @@ + ++ + + + + + diff --git a/components/mescroll/components/mescroll-down.css b/components/mescroll/components/mescroll-down.css new file mode 100644 index 0000000..1b31399 --- /dev/null +++ b/components/mescroll/components/mescroll-down.css @@ -0,0 +1,55 @@ +/* 下拉刷新区域 */ +.mescroll-downwarp { + position: absolute; + top: -100%; + left: 0; + width: 100%; + height: 100%; + text-align: center; +} + +/* 下拉刷新--内容区,定位于区域底部 */ +.mescroll-downwarp .downwarp-content { + position: absolute; + left: 0; + bottom: 0; + width: 100%; + min-height: 60rpx; + padding: 20rpx 0; + text-align: center; +} + +/* 下拉刷新--提示文本 */ +.mescroll-downwarp .downwarp-tip { + display: inline-block; + font-size: 28rpx; + color: gray; + vertical-align: middle; + margin-left: 16rpx; +} + +/* 下拉刷新--旋转进度条 */ +.mescroll-downwarp .downwarp-progress { + display: inline-block; + width: 32rpx; + height: 32rpx; + border-radius: 50%; + border: 2rpx solid gray; + border-bottom-color: transparent; + vertical-align: middle; +} + +/* 旋转动画 */ +.mescroll-downwarp .mescroll-rotate { + animation: mescrollDownRotate 0.6s linear infinite; +} + +@keyframes mescrollDownRotate { + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(360deg); + } +} diff --git a/components/mescroll/components/mescroll-down.vue b/components/mescroll/components/mescroll-down.vue new file mode 100644 index 0000000..b37b696 --- /dev/null +++ b/components/mescroll/components/mescroll-down.vue @@ -0,0 +1,52 @@ + + ++ ++ + + + + + + diff --git a/components/mescroll/components/mescroll-empty.vue b/components/mescroll/components/mescroll-empty.vue new file mode 100644 index 0000000..f34da7c --- /dev/null +++ b/components/mescroll/components/mescroll-empty.vue @@ -0,0 +1,90 @@ + + ++ ++ {{ downText }} ++ + + + + + diff --git a/components/mescroll/components/mescroll-top.vue b/components/mescroll/components/mescroll-top.vue new file mode 100644 index 0000000..3bc0641 --- /dev/null +++ b/components/mescroll/components/mescroll-top.vue @@ -0,0 +1,81 @@ + + ++ {{ tip }} +{{ option.btnText }} ++ + + + + diff --git a/components/mescroll/components/mescroll-up.css b/components/mescroll/components/mescroll-up.css new file mode 100644 index 0000000..ca835c3 --- /dev/null +++ b/components/mescroll/components/mescroll-up.css @@ -0,0 +1,47 @@ +/* 上拉加载区域 */ +.mescroll-upwarp { + min-height: 60rpx; + padding: 30rpx 0; + text-align: center; + clear: both; + margin-bottom: 20rpx; +} + +/*提示文本 */ +.mescroll-upwarp .upwarp-tip, +.mescroll-upwarp .upwarp-nodata { + display: inline-block; + font-size: 28rpx; + color: #b1b1b1; + vertical-align: middle; +} + +.mescroll-upwarp .upwarp-tip { + margin-left: 16rpx; +} + +/*旋转进度条 */ +.mescroll-upwarp .upwarp-progress { + display: inline-block; + width: 32rpx; + height: 32rpx; + border-radius: 50%; + border: 2rpx solid #b1b1b1; + border-bottom-color: transparent; + vertical-align: middle; +} + +/* 旋转动画 */ +.mescroll-upwarp .mescroll-rotate { + animation: mescrollUpRotate 0.6s linear infinite; +} + +@keyframes mescrollUpRotate { + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(360deg); + } +} diff --git a/components/mescroll/components/mescroll-up.vue b/components/mescroll/components/mescroll-up.vue new file mode 100644 index 0000000..beab032 --- /dev/null +++ b/components/mescroll/components/mescroll-up.vue @@ -0,0 +1,39 @@ + + + + + + + + + + diff --git a/components/mescroll/mescroll-body.css b/components/mescroll/mescroll-body.css new file mode 100644 index 0000000..86cd5f8 --- /dev/null +++ b/components/mescroll/mescroll-body.css @@ -0,0 +1,15 @@ +page { + -webkit-overflow-scrolling: touch; + /* 使iOS滚动流畅 */ +} + +.mescroll-body { + position: relative; + /* 下拉刷新区域相对自身定位 */ + height: auto; + /* 不可固定高度,否则overflow: hidden, 可通过设置最小高度使列表不满屏仍可下拉*/ + overflow: hidden; + /* 遮住顶部下拉刷新区域 */ + box-sizing: border-box; + /* 避免设置padding出现双滚动条的问题 */ +} diff --git a/components/mescroll/mescroll-body.vue b/components/mescroll/mescroll-body.vue new file mode 100644 index 0000000..f3199c0 --- /dev/null +++ b/components/mescroll/mescroll-body.vue @@ -0,0 +1,298 @@ + ++ + ++ {{ mOption.textLoading }} +{{ mOption.textNoMore }} ++ + + + + + diff --git a/components/mescroll/mescroll-mixins.js b/components/mescroll/mescroll-mixins.js new file mode 100644 index 0000000..4b3ba3f --- /dev/null +++ b/components/mescroll/mescroll-mixins.js @@ -0,0 +1,60 @@ +// mescroll-body 和 mescroll-uni 通用 + +// import MescrollUni from "./mescroll-uni.vue"; +// import MescrollBody from "./mescroll-body.vue"; + +const MescrollMixin = { + // components: { // 非H5端无法通过mixin注册组件, 只能在main.js中注册全局组件或具体界面中注册 + // MescrollUni, + // MescrollBody + // }, + data() { + return { + mescroll: null //mescroll实例对象 + } + }, + // 注册系统自带的下拉刷新 (配置down.native为true时生效, 还需在pages配置enablePullDownRefresh:true;详请参考mescroll-native的案例) + onPullDownRefresh() { + this.mescroll && this.mescroll.onPullDownRefresh(); + }, + // 注册列表滚动事件,用于判定在顶部可下拉刷新,在指定位置可显示隐藏回到顶部按钮 (此方法为页面生命周期,无法在子组件中触发, 仅在mescroll-body生效) + onPageScroll(e) { + this.mescroll && this.mescroll.onPageScroll(e); + }, + // 注册滚动到底部的事件,用于上拉加载 (此方法为页面生命周期,无法在子组件中触发, 仅在mescroll-body生效) + onReachBottom() { + this.mescroll && this.mescroll.onReachBottom(); + }, + methods: { + // mescroll组件初始化的回调,可获取到mescroll对象 + mescrollInit(mescroll) { + this.mescroll = mescroll; + this.mescrollInitByRef(); // 兼容字节跳动小程序 + }, + // 以ref的方式初始化mescroll对象 (兼容字节跳动小程序: http://www.mescroll.com/qa.html?v=20200107#q26) + mescrollInitByRef() { + if (!this.mescroll || !this.mescroll.resetUpScroll) { + let mescrollRef = this.$refs.mescrollRef; + if (mescrollRef) this.mescroll = mescrollRef.mescroll + } + }, + // 下拉刷新的回调 + downCallback() { + // mixin默认resetUpScroll + this.mescroll.resetUpScroll() + }, + // 上拉加载的回调 + upCallback() { + // mixin默认延时500自动结束加载 + setTimeout(() => { + this.mescroll.endErr(); + }, 500) + } + }, + mounted() { + this.mescrollInitByRef(); // 兼容字节跳动小程序, 避免未设置@init或@init此时未能取到ref的情况 + } + +} + +export default MescrollMixin; diff --git a/components/mescroll/mescroll-uni-option.js b/components/mescroll/mescroll-uni-option.js new file mode 100644 index 0000000..bfcd06d --- /dev/null +++ b/components/mescroll/mescroll-uni-option.js @@ -0,0 +1,35 @@ +// 全局配置 +// mescroll-body 和 mescroll-uni 通用 +const GlobalOption = { + down: { + // 其他down的配置参数也可以写,这里只展示了常用的配置: + textInOffset: '下拉刷新', // 下拉的距离在offset范围内的提示文本 + textOutOffset: '释放更新', // 下拉的距离大于offset范围的提示文本 + textLoading: '加载中 ...', // 加载中的提示文本 + offset: 80, // 在列表顶部,下拉大于80px,松手即可触发下拉刷新的回调 + native: false // 是否使用系统自带的下拉刷新; 默认false; 仅在mescroll-body生效 (值为true时,还需在pages配置enablePullDownRefresh:true;详请参考mescroll-native的案例) + }, + up: { + // 其他up的配置参数也可以写,这里只展示了常用的配置: + textLoading: '加载中 ...', // 加载中的提示文本 + textNoMore: '', // 没有更多数据的提示文本 + // textNoMore: '— 我是有底线的 —', // 没有更多数据的提示文本 + offset: 80, // 距底部多远时,触发upCallback + isBounce: false, // 默认禁止橡皮筋的回弹效果, 必读事项: http://www.mescroll.com/qa.html?v=190725#q25 + toTop: { + // 回到顶部按钮,需配置src才显示 + src: "http://www.mescroll.com/img/mescroll-totop.png?v=1", // 图片路径 (建议放入static目录, 如 /static/img/mescroll-totop.png ) + offset: 1000, // 列表滚动多少距离才显示回到顶部按钮,默认1000px + right: 20, // 到右边的距离, 默认20 (支持"20rpx", "20px", "20%"格式的值, 纯数字则默认单位rpx) + bottom: 120, // 到底部的距离, 默认120 (支持"20rpx", "20px", "20%"格式的值, 纯数字则默认单位rpx) + width: 72 // 回到顶部图标的宽度, 默认72 (支持"20rpx", "20px", "20%"格式的值, 纯数字则默认单位rpx) + }, + empty: { + use: true, // 是否显示空布局 + icon: "http://www.mescroll.com/img/mescroll-empty.png?v=1", // 图标路径 (建议放入static目录, 如 /static/img/mescroll-empty.png ) + tip: '~ 暂无相关数据 ~' // 提示 + } + } +} + +export default GlobalOption diff --git a/components/mescroll/mescroll-uni.css b/components/mescroll/mescroll-uni.css new file mode 100644 index 0000000..1c97a00 --- /dev/null +++ b/components/mescroll/mescroll-uni.css @@ -0,0 +1,33 @@ +page { + height: 100%; + box-sizing: border-box; + /* 避免设置padding出现双滚动条的问题 */ +} + +.mescroll-uni-warp { + height: 100%; +} + +.mescroll-uni { + position: relative; + width: 100%; + height: 100%; + min-height: 200rpx; + overflow-y: auto; + box-sizing: border-box; + /* 避免设置padding出现双滚动条的问题 */ +} + +/* 定位的方式固定高度 */ +.mescroll-uni-fixed { + z-index: 1; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + width: auto; + /* 使right生效 */ + height: auto; + /* 使bottom生效 */ +} diff --git a/components/mescroll/mescroll-uni.js b/components/mescroll/mescroll-uni.js new file mode 100644 index 0000000..1b2eb9d --- /dev/null +++ b/components/mescroll/mescroll-uni.js @@ -0,0 +1,841 @@ +/* mescroll + * version 1.2.3 + * 2020-02-18 wenju + * http://www.mescroll.com + */ + +export default function MeScroll(options, isScrollBody) { + let me = this; + me.version = '1.2.3'; // mescroll版本号 + me.options = options || {}; // 配置 + me.isScrollBody = isScrollBody || false; // 滚动区域是否为原生页面滚动; 默认为scroll-view + + me.isDownScrolling = false; // 是否在执行下拉刷新的回调 + me.isUpScrolling = false; // 是否在执行上拉加载的回调 + let hasDownCallback = me.options.down && me.options.down.callback; // 是否配置了down的callback + + // 初始化下拉刷新 + me.initDownScroll(); + // 初始化上拉加载,则初始化 + me.initUpScroll(); + + // 自动加载 + setTimeout(function() { // 待主线程执行完毕再执行,避免new MeScroll未初始化,在回调获取不到mescroll的实例 + // 自动触发下拉刷新 (只有配置了down的callback才自动触发下拉刷新) + if (me.optDown.use && me.optDown.auto && hasDownCallback) { + if (me.optDown.autoShowLoading) { + me.triggerDownScroll(); // 显示下拉进度,执行下拉回调 + } else { + me.optDown.callback && me.optDown.callback(me); // 不显示下拉进度,直接执行下拉回调 + } + } + // 自动触发上拉加载 + setTimeout(function() { // 延时确保先执行down的callback,再执行up的callback,因为部分小程序emit是异步,会导致isUpAutoLoad判断有误 + me.optUp.use && me.optUp.auto && !me.isUpAutoLoad && me.triggerUpScroll(); + }, 100) + }, 30); // 需让me.optDown.inited和me.optUp.inited先执行 +} + +/* 配置参数:下拉刷新 */ +MeScroll.prototype.extendDownScroll = function(optDown) { + // 下拉刷新的配置 + MeScroll.extend(optDown, { + use: true, // 是否启用下拉刷新; 默认true + auto: true, // 是否在初始化完毕之后自动执行下拉刷新的回调; 默认true + native: false, // 是否使用系统自带的下拉刷新; 默认false; 仅mescroll-body生效 (值为true时,还需在pages配置enablePullDownRefresh:true;详请参考mescroll-native的案例) + autoShowLoading: false, // 如果设置auto=true(在初始化完毕之后自动执行下拉刷新的回调),那么是否显示下拉刷新的进度; 默认false + isLock: false, // 是否锁定下拉刷新,默认false; + offset: 80, // 在列表顶部,下拉大于80px,松手即可触发下拉刷新的回调 + startTop: 100, // scroll-view滚动到顶部时,此时的scroll-top不一定为0, 此值用于控制最大的误差 + fps: 80, // 下拉节流 (值越大每秒刷新频率越高) + inOffsetRate: 1, // 在列表顶部,下拉的距离小于offset时,改变下拉区域高度比例;值小于1且越接近0,高度变化越小,表现为越往下越难拉 + outOffsetRate: 0.2, // 在列表顶部,下拉的距离大于offset时,改变下拉区域高度比例;值小于1且越接近0,高度变化越小,表现为越往下越难拉 + bottomOffset: 20, // 当手指touchmove位置在距离body底部20px范围内的时候结束上拉刷新,避免Webview嵌套导致touchend事件不执行 + minAngle: 45, // 向下滑动最少偏移的角度,取值区间 [0,90];默认45度,即向下滑动的角度大于45度则触发下拉;而小于45度,将不触发下拉,避免与左右滑动的轮播等组件冲突; + textInOffset: '下拉刷新', // 下拉的距离在offset范围内的提示文本 + textOutOffset: '释放更新', // 下拉的距离大于offset范围的提示文本 + textLoading: '加载中 ...', // 加载中的提示文本 + inited: null, // 下拉刷新初始化完毕的回调 + inOffset: null, // 下拉的距离进入offset范围内那一刻的回调 + outOffset: null, // 下拉的距离大于offset那一刻的回调 + onMoving: null, // 下拉过程中的回调,滑动过程一直在执行; rate下拉区域当前高度与指定距离的比值(inOffset: rate<1; outOffset: rate>=1); downHight当前下拉区域的高度 + beforeLoading: null, // 准备触发下拉刷新的回调: 如果return true,将不触发showLoading和callback回调; 常用来完全自定义下拉刷新, 参考案例【淘宝 v6.8.0】 + showLoading: null, // 显示下拉刷新进度的回调 + afterLoading: null, // 准备结束下拉的回调. 返回结束下拉的延时执行时间,默认0ms; 常用于结束下拉之前再显示另外一小段动画,才去隐藏下拉刷新的场景, 参考案例【dotJump】 + endDownScroll: null, // 结束下拉刷新的回调 + callback: function(mescroll) { + // 下拉刷新的回调;默认重置上拉加载列表为第一页 + mescroll.resetUpScroll(); + } + }) +} + +/* 配置参数:上拉加载 */ +MeScroll.prototype.extendUpScroll = function(optUp) { + // 上拉加载的配置 + MeScroll.extend(optUp, { + use: true, // 是否启用上拉加载; 默认true + auto: true, // 是否在初始化完毕之后自动执行上拉加载的回调; 默认true + isLock: false, // 是否锁定上拉加载,默认false; + isBoth: true, // 上拉加载时,如果滑动到列表顶部是否可以同时触发下拉刷新;默认true,两者可同时触发; + isBounce: false, // 默认禁止橡皮筋的回弹效果, 必读事项: http://www.mescroll.com/qa.html?v=190725#q25 + callback: null, // 上拉加载的回调;function(page,mescroll){ } + page: { + num: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始 + size: 10, // 每页数据的数量 + time: null // 加载第一页数据服务器返回的时间; 防止用户翻页时,后台新增了数据从而导致下一页数据重复; + }, + noMoreSize: 5, // 如果列表已无数据,可设置列表的总数量要大于等于5条才显示无更多数据;避免列表数据过少(比如只有一条数据),显示无更多数据会不好看 + offset: 80, // 距底部多远时,触发upCallback + textLoading: '加载中 ...', // 加载中的提示文本 + textNoMore: '-- END --', // 没有更多数据的提示文本 + inited: null, // 初始化完毕的回调 + showLoading: null, // 显示加载中的回调 + showNoMore: null, // 显示无更多数据的回调 + hideUpScroll: null, // 隐藏上拉加载的回调 + errDistance: 60, // endErr的时候需往上滑动一段距离,使其往下滑动时再次触发onReachBottom,仅mescroll-body生效 + toTop: { + // 回到顶部按钮,需配置src才显示 + src: null, // 图片路径,默认null (绝对路径或网络图) + offset: 1000, // 列表滚动多少距离才显示回到顶部按钮,默认1000 + duration: 300, // 回到顶部的动画时长,默认300ms (当值为0或300则使用系统自带回到顶部,更流畅; 其他值则通过step模拟,部分机型可能不够流畅,所以非特殊情况不建议修改此项) + btnClick: null, // 点击按钮的回调 + onShow: null, // 是否显示的回调 + zIndex: 9990, // fixed定位z-index值 + left: null, // 到左边的距离, 默认null. 此项有值时,right不生效. (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx) + right: 20, // 到右边的距离, 默认20 (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx) + bottom: 120, // 到底部的距离, 默认120 (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx) + safearea: false, // bottom的偏移量是否加上底部安全区的距离, 默认false, 需要适配iPhoneX时使用 (具体的界面如果不配置此项,则取本vue的safearea值) + width: 72, // 回到顶部图标的宽度, 默认72 (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx) + radius: "50%" // 圆角, 默认"50%" (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx) + }, + empty: { + use: true, // 是否显示空布局 + icon: null, // 图标路径 + tip: '~ 暂无相关数据 ~', // 提示 + btnText: '', // 按钮 + btnClick: null, // 点击按钮的回调 + onShow: null, // 是否显示的回调 + fixed: false, // 是否使用fixed定位,默认false; 配置fixed为true,以下的top和zIndex才生效 (transform会使fixed失效,最终会降级为absolute) + top: "100rpx", // fixed定位的top值 (完整的单位值,如 "10%"; "100rpx") + zIndex: 99 // fixed定位z-index值 + }, + onScroll: false // 是否监听滚动事件 + }) +} + +/* 配置参数 */ +MeScroll.extend = function(userOption, defaultOption) { + if (!userOption) return defaultOption; + for (let key in defaultOption) { + if (userOption[key] == null) { + let def = defaultOption[key]; + if (def != null && typeof def === 'object') { + userOption[key] = MeScroll.extend({}, def); // 深度匹配 + } else { + userOption[key] = def; + } + } else if (typeof userOption[key] === 'object') { + MeScroll.extend(userOption[key], defaultOption[key]); // 深度匹配 + } + } + return userOption; +} + +/* -------初始化下拉刷新------- */ +MeScroll.prototype.initDownScroll = function() { + let me = this; + // 配置参数 + me.optDown = me.options.down || {}; + me.extendDownScroll(me.optDown); + + // 如果是mescroll-body且配置了native,则禁止自定义的下拉刷新 + if (me.isScrollBody && me.optDown.native) { + me.optDown.use = false + } else { + me.optDown.native = false // 仅mescroll-body支持,mescroll-uni不支持 + } + + me.downHight = 0; // 下拉区域的高度 + + // 在页面中加入下拉布局 + if (me.optDown.use && me.optDown.inited) { + // 初始化完毕的回调 + setTimeout(function() { // 待主线程执行完毕再执行,避免new MeScroll未初始化,在回调获取不到mescroll的实例 + me.optDown.inited(me); + }, 0) + } +} + +/* 列表touchstart事件 */ +MeScroll.prototype.touchstartEvent = function(e) { + if (!this.optDown.use) return; + + this.startPoint = this.getPoint(e); // 记录起点 + this.startTop = this.getScrollTop(); // 记录此时的滚动条位置 + this.lastPoint = this.startPoint; // 重置上次move的点 + this.maxTouchmoveY = this.getBodyHeight() - this.optDown.bottomOffset; // 手指触摸的最大范围(写在touchstart避免body获取高度为0的情况) + this.inTouchend = false; // 标记不是touchend +} + +/* 列表touchmove事件 */ +MeScroll.prototype.touchmoveEvent = function(e) { + if (!this.optDown.use) return; + if (!this.startPoint) return; + let me = this; + + // 节流 + let t = new Date().getTime(); + if (me.moveTime && t - me.moveTime < me.moveTimeDiff) { // 小于节流时间,则不处理 + return; + } else { + me.moveTime = t + if (!me.moveTimeDiff) me.moveTimeDiff = 1000 / me.optDown.fps + } + + let scrollTop = me.getScrollTop(); // 当前滚动条的距离 + let curPoint = me.getPoint(e); // 当前点 + + let moveY = curPoint.y - me.startPoint.y; // 和起点比,移动的距离,大于0向下拉,小于0向上拉 + + // 向下拉 && 在顶部 + // mescroll-body,直接判定在顶部即可 + // scroll-view在滚动时不会触发touchmove,当触顶/底/左/右时,才会触发touchmove + // scroll-view滚动到顶部时,scrollTop不一定为0; 在iOS的APP中scrollTop可能为负数,不一定和startTop相等 + if (moveY > 0 && ( + (me.isScrollBody && scrollTop <= 0) || + (!me.isScrollBody && (scrollTop <= 0 || (scrollTop <= me.optDown.startTop && scrollTop === me.startTop))) + )) { + // 可下拉的条件 + if (!me.inTouchend && !me.isDownScrolling && !me.optDown.isLock && (!me.isUpScrolling || (me.isUpScrolling && + me.optUp.isBoth))) { + + // 下拉的角度是否在配置的范围内 + let angle = me.getAngle(me.lastPoint, curPoint); // 两点之间的角度,区间 [0,90] + if (angle < me.optDown.minAngle) return; // 如果小于配置的角度,则不往下执行下拉刷新 + + // 如果手指的位置超过配置的距离,则提前结束下拉,避免Webview嵌套导致touchend无法触发 + if (me.maxTouchmoveY > 0 && curPoint.y >= me.maxTouchmoveY) { + me.inTouchend = true; // 标记执行touchend + me.touchendEvent(); // 提前触发touchend + return; + } + + me.preventDefault(e); // 阻止默认事件 + + let diff = curPoint.y - me.lastPoint.y; // 和上次比,移动的距离 (大于0向下,小于0向上) + + // 下拉距离 < 指定距离 + if (me.downHight < me.optDown.offset) { + if (me.movetype !== 1) { + me.movetype = 1; // 加入标记,保证只执行一次 + me.optDown.inOffset && me.optDown.inOffset(me); // 进入指定距离范围内那一刻的回调,只执行一次 + me.isMoveDown = true; // 标记下拉区域高度改变,在touchend重置回来 + } + me.downHight += diff * me.optDown.inOffsetRate; // 越往下,高度变化越小 + + // 指定距离 <= 下拉距离 + } else { + if (me.movetype !== 2) { + me.movetype = 2; // 加入标记,保证只执行一次 + me.optDown.outOffset && me.optDown.outOffset(me); // 下拉超过指定距离那一刻的回调,只执行一次 + me.isMoveDown = true; // 标记下拉区域高度改变,在touchend重置回来 + } + if (diff > 0) { // 向下拉 + me.downHight += Math.round(diff * me.optDown.outOffsetRate); // 越往下,高度变化越小 + } else { // 向上收 + me.downHight += diff; // 向上收回高度,则向上滑多少收多少高度 + } + } + + let rate = me.downHight / me.optDown.offset; // 下拉区域当前高度与指定距离的比值 + me.optDown.onMoving && me.optDown.onMoving(me, rate, me.downHight); // 下拉过程中的回调,一直在执行 + } + } + + me.lastPoint = curPoint; // 记录本次移动的点 +} + +/* 列表touchend事件 */ +MeScroll.prototype.touchendEvent = function(e) { + if (!this.optDown.use) return; + // 如果下拉区域高度已改变,则需重置回来 + if (this.isMoveDown) { + if (this.downHight >= this.optDown.offset) { + // 符合触发刷新的条件 + this.triggerDownScroll(); + } else { + // 不符合的话 则重置 + this.downHight = 0; + this.optDown.endDownScroll && this.optDown.endDownScroll(this); + } + this.movetype = 0; + this.isMoveDown = false; + } else if (!this.isScrollBody && this.getScrollTop() === this.startTop) { // scroll-view到顶/左/右/底的滑动事件 + let isScrollUp = this.getPoint(e).y - this.startPoint.y < 0; // 和起点比,移动的距离,大于0向下拉,小于0向上拉 + // 上滑 + if (isScrollUp) { + // 需检查滑动的角度 + let angle = this.getAngle(this.getPoint(e), this.startPoint); // 两点之间的角度,区间 [0,90] + if (angle > 80) { + // 检查并触发上拉 + this.triggerUpScroll(true); + } + } + } +} + +/* 根据点击滑动事件获取第一个手指的坐标 */ +MeScroll.prototype.getPoint = function(e) { + if (!e) { + return { + x: 0, + y: 0 + } + } + if (e.touches && e.touches[0]) { + return { + x: e.touches[0].pageX, + y: e.touches[0].pageY + } + } else if (e.changedTouches && e.changedTouches[0]) { + return { + x: e.changedTouches[0].pageX, + y: e.changedTouches[0].pageY + } + } else { + return { + x: e.clientX, + y: e.clientY + } + } +} + +/* 计算两点之间的角度: 区间 [0,90]*/ +MeScroll.prototype.getAngle = function(p1, p2) { + let x = Math.abs(p1.x - p2.x); + let y = Math.abs(p1.y - p2.y); + let z = Math.sqrt(x * x + y * y); + let angle = 0; + if (z !== 0) { + angle = Math.asin(y / z) / Math.PI * 180; + } + return angle +} + +/* 触发下拉刷新 */ +MeScroll.prototype.triggerDownScroll = function() { + if (this.optDown.beforeLoading && this.optDown.beforeLoading(this)) { + //return true则处于完全自定义状态 + } else { + this.showDownScroll(); // 下拉刷新中... + this.optDown.callback && this.optDown.callback(this); // 执行回调,联网加载数据 + } +} + +/* 显示下拉进度布局 */ +MeScroll.prototype.showDownScroll = function() { + this.isDownScrolling = true; // 标记下拉中 + if (this.optDown.native) { + uni.startPullDownRefresh(); // 系统自带的下拉刷新 + this.optDown.showLoading && this.optDown.showLoading(this, 0); // 仍触发showLoading,因为上拉加载用到 + } else { + this.downHight = this.optDown.offset; // 更新下拉区域高度 + this.optDown.showLoading && this.optDown.showLoading(this, this.downHight); // 下拉刷新中... + } +} + +/* 显示系统自带的下拉刷新时需要处理的业务 */ +MeScroll.prototype.onPullDownRefresh = function() { + this.isDownScrolling = true; // 标记下拉中 + this.optDown.showLoading && this.optDown.showLoading(this, 0); // 仍触发showLoading,因为上拉加载用到 + this.optDown.callback && this.optDown.callback(this); // 执行回调,联网加载数据 +} + +/* 结束下拉刷新 */ +MeScroll.prototype.endDownScroll = function() { + if (this.optDown.native) { // 结束原生下拉刷新 + this.isDownScrolling = false; + this.optDown.endDownScroll && this.optDown.endDownScroll(this); + uni.stopPullDownRefresh(); + return + } + let me = this; + // 结束下拉刷新的方法 + let endScroll = function() { + me.downHight = 0; + me.isDownScrolling = false; + me.optDown.endDownScroll && me.optDown.endDownScroll(me); + !me.isScrollBody && me.setScrollHeight(0) // scroll-view重置滚动区域,使数据不满屏时仍可检查触发翻页 + } + // 结束下拉刷新时的回调 + let delay = 0; + if (me.optDown.afterLoading) delay = me.optDown.afterLoading(me); // 结束下拉刷新的延时,单位ms + if (typeof delay === 'number' && delay > 0) { + setTimeout(endScroll, delay); + } else { + endScroll(); + } +} + +/* 锁定下拉刷新:isLock=ture,null锁定;isLock=false解锁 */ +MeScroll.prototype.lockDownScroll = function(isLock) { + if (isLock == null) isLock = true; + this.optDown.isLock = isLock; +} + +/* 锁定上拉加载:isLock=ture,null锁定;isLock=false解锁 */ +MeScroll.prototype.lockUpScroll = function(isLock) { + if (isLock == null) isLock = true; + this.optUp.isLock = isLock; +} + +/* -------初始化上拉加载------- */ +MeScroll.prototype.initUpScroll = function() { + let me = this; + // 配置参数 + me.optUp = me.options.up || { + use: false + }; + me.extendUpScroll(me.optUp); + + if (!me.optUp.isBounce) me.setBounce(false); // 不允许bounce时,需禁止window的touchmove事件 + + if (me.optUp.use === false) return; // 配置不使用上拉加载时,则不初始化上拉布局 + me.optUp.hasNext = true; // 如果使用上拉,则默认有下一页 + me.startNum = me.optUp.page.num + 1; // 记录page开始的页码 + + // 初始化完毕的回调 + if (me.optUp.inited) { + setTimeout(function() { // 待主线程执行完毕再执行,避免new MeScroll未初始化,在回调获取不到mescroll的实例 + me.optUp.inited(me); + }, 0) + } +} + +/*滚动到底部的事件 (仅mescroll-body生效)*/ +MeScroll.prototype.onReachBottom = function() { + if (this.isScrollBody && !this.isUpScrolling) { // 只能支持下拉刷新的时候同时可以触发上拉加载,否则滚动到底部就需要上滑一点才能触发onReachBottom + if (!this.optUp.isLock && this.optUp.hasNext) { + this.triggerUpScroll(); + } + } +} + +/*列表滚动事件 (仅mescroll-body生效)*/ +MeScroll.prototype.onPageScroll = function(e) { + if (!this.isScrollBody) return; + + // 更新滚动条的位置 (主要用于判断下拉刷新时,滚动条是否在顶部) + this.setScrollTop(e.scrollTop); + + // 顶部按钮的显示隐藏 + if (e.scrollTop >= this.optUp.toTop.offset) { + this.showTopBtn(); + } else { + this.hideTopBtn(); + } +} + +/*列表滚动事件*/ +MeScroll.prototype.scroll = function(e, onScroll) { + // 更新滚动条的位置 + this.setScrollTop(e.scrollTop); + // 更新滚动内容高度 + this.setScrollHeight(e.scrollHeight); + + // 向上滑还是向下滑动 + if (this.preScrollY == null) this.preScrollY = 0; + this.isScrollUp = e.scrollTop - this.preScrollY > 0; + this.preScrollY = e.scrollTop; + + // 上滑 && 检查并触发上拉 + this.isScrollUp && this.triggerUpScroll(true); + + // 顶部按钮的显示隐藏 + if (e.scrollTop >= this.optUp.toTop.offset) { + this.showTopBtn(); + } else { + this.hideTopBtn(); + } + + // 滑动监听 + this.optUp.onScroll && onScroll && onScroll() +} + +/* 触发上拉加载 */ +MeScroll.prototype.triggerUpScroll = function(isCheck) { + if (!this.isUpScrolling && this.optUp.use && this.optUp.callback) { + // 是否校验在底部; 默认不校验 + if (isCheck === true) { + let canUp = false; + // 还有下一页 && 没有锁定 && 不在下拉中 + if (this.optUp.hasNext && !this.optUp.isLock && !this.isDownScrolling) { + if (this.getScrollBottom() <= this.optUp.offset) { // 到底部 + canUp = true; // 标记可上拉 + } + } + if (canUp === false) return; + } + this.showUpScroll(); // 上拉加载中... + this.optUp.page.num++; // 预先加一页,如果失败则减回 + this.isUpAutoLoad = true; // 标记上拉已经自动执行过,避免初始化时多次触发上拉回调 + this.num = this.optUp.page.num; // 把最新的页数赋值在mescroll上,避免对page的影响 + this.size = this.optUp.page.size; // 把最新的页码赋值在mescroll上,避免对page的影响 + this.time = this.optUp.page.time; // 把最新的页码赋值在mescroll上,避免对page的影响 + this.optUp.callback(this); // 执行回调,联网加载数据 + } +} + +/* 显示上拉加载中 */ +MeScroll.prototype.showUpScroll = function() { + this.isUpScrolling = true; // 标记上拉加载中 + this.optUp.showLoading && this.optUp.showLoading(this); // 回调 +} + +/* 显示上拉无更多数据 */ +MeScroll.prototype.showNoMore = function() { + this.optUp.hasNext = false; // 标记无更多数据 + this.optUp.showNoMore && this.optUp.showNoMore(this); // 回调 +} + +/* 隐藏上拉区域**/ +MeScroll.prototype.hideUpScroll = function() { + this.optUp.hideUpScroll && this.optUp.hideUpScroll(this); // 回调 +} + +/* 结束上拉加载 */ +MeScroll.prototype.endUpScroll = function(isShowNoMore) { + if (isShowNoMore != null) { // isShowNoMore=null,不处理下拉状态,下拉刷新的时候调用 + if (isShowNoMore) { + this.showNoMore(); // isShowNoMore=true,显示无更多数据 + } else { + this.hideUpScroll(); // isShowNoMore=false,隐藏上拉加载 + } + } + this.isUpScrolling = false; // 标记结束上拉加载 +} + +/* 重置上拉加载列表为第一页 + *isShowLoading 是否显示进度布局; + * 1.默认null,不传参,则显示上拉加载的进度布局 + * 2.传参true, 则显示下拉刷新的进度布局 + * 3.传参false,则不显示上拉和下拉的进度 (常用于静默更新列表数据) + */ +MeScroll.prototype.resetUpScroll = function(isShowLoading) { + if (this.optUp && this.optUp.use) { + let page = this.optUp.page; + this.prePageNum = page.num; // 缓存重置前的页码,加载失败可退回 + this.prePageTime = page.time; // 缓存重置前的时间,加载失败可退回 + page.num = this.startNum; // 重置为第一页 + page.time = null; // 重置时间为空 + if (!this.isDownScrolling && isShowLoading !== false) { // 如果不是下拉刷新触发的resetUpScroll并且不配置列表静默更新,则显示进度; + if (isShowLoading == null) { + this.removeEmpty(); // 移除空布局 + this.showUpScroll(); // 不传参,默认显示上拉加载的进度布局 + } else { + this.showDownScroll(); // 传true,显示下拉刷新的进度布局,不清空列表 + } + } + this.isUpAutoLoad = true; // 标记上拉已经自动执行过,避免初始化时多次触发上拉回调 + this.num = page.num; // 把最新的页数赋值在mescroll上,避免对page的影响 + this.size = page.size; // 把最新的页码赋值在mescroll上,避免对page的影响 + this.time = page.time; // 把最新的页码赋值在mescroll上,避免对page的影响 + this.optUp.callback && this.optUp.callback(this); // 执行上拉回调 + } +} + +/* 设置page.num的值 */ +MeScroll.prototype.setPageNum = function(num) { + this.optUp.page.num = num - 1; +} + +/* 设置page.size的值 */ +MeScroll.prototype.setPageSize = function(size) { + this.optUp.page.size = size; +} + +/* 联网回调成功,结束下拉刷新和上拉加载 + * dataSize: 当前页的数据量(必传) + * totalPage: 总页数(必传) + * systime: 服务器时间 (可空) + */ +MeScroll.prototype.endByPage = function(dataSize, totalPage, systime) { + let hasNext; + if (this.optUp.use && totalPage != null) hasNext = this.optUp.page.num < totalPage; // 是否还有下一页 + this.endSuccess(dataSize, hasNext, systime); +} + +/* 联网回调成功,结束下拉刷新和上拉加载 + * dataSize: 当前页的数据量(必传) + * totalSize: 列表所有数据总数量(必传) + * systime: 服务器时间 (可空) + */ +MeScroll.prototype.endBySize = function(dataSize, totalSize, systime) { + let hasNext; + if (this.optUp.use && totalSize != null) { + let loadSize = (this.optUp.page.num - 1) * this.optUp.page.size + dataSize; // 已加载的数据总数 + hasNext = loadSize < totalSize; // 是否还有下一页 + } + this.endSuccess(dataSize, hasNext, systime); +} + +/* 联网回调成功,结束下拉刷新和上拉加载 + * dataSize: 当前页的数据个数(不是所有页的数据总和),用于上拉加载判断是否还有下一页.如果不传,则会判断还有下一页 + * hasNext: 是否还有下一页,布尔类型;用来解决这个小问题:比如列表共有20条数据,每页加载10条,共2页.如果只根据dataSize判断,则需翻到第三页才会知道无更多数据,如果传了hasNext,则翻到第二页即可显示无更多数据. + * systime: 服务器时间(可空);用来解决这个小问题:当准备翻下一页时,数据库新增了几条记录,此时翻下一页,前面的几条数据会和上一页的重复;这里传入了systime,那么upCallback的page.time就会有值,把page.time传给服务器,让后台过滤新加入的那几条记录 + */ +MeScroll.prototype.endSuccess = function(dataSize, hasNext, systime) { + let me = this; + // 结束下拉刷新 + if (me.isDownScrolling) me.endDownScroll(); + + // 结束上拉加载 + if (me.optUp.use) { + let isShowNoMore; // 是否已无更多数据 + if (dataSize != null) { + let pageNum = me.optUp.page.num; // 当前页码 + let pageSize = me.optUp.page.size; // 每页长度 + // 如果是第一页 + if (pageNum === 1) { + if (systime) me.optUp.page.time = systime; // 设置加载列表数据第一页的时间 + } + if (dataSize < pageSize || hasNext === false) { + // 返回的数据不满一页时,则说明已无更多数据 + me.optUp.hasNext = false; + if (dataSize === 0 && pageNum === 1) { + // 如果第一页无任何数据且配置了空布局 + isShowNoMore = false; + me.showEmpty(); + } else { + // 总列表数少于配置的数量,则不显示无更多数据 + let allDataSize = (pageNum - 1) * pageSize + dataSize; + if (allDataSize < me.optUp.noMoreSize) { + isShowNoMore = false; + } else { + isShowNoMore = true; + } + me.removeEmpty(); // 移除空布局 + } + } else { + // 还有下一页 + isShowNoMore = false; + me.optUp.hasNext = true; + me.removeEmpty(); // 移除空布局 + } + } + + // 隐藏上拉 + me.endUpScroll(isShowNoMore); + } +} + +/* 回调失败,结束下拉刷新和上拉加载 */ +MeScroll.prototype.endErr = function(errDistance) { + // 结束下拉,回调失败重置回原来的页码和时间 + if (this.isDownScrolling) { + let page = this.optUp.page; + if (page && this.prePageNum) { + page.num = this.prePageNum; + page.time = this.prePageTime; + } + this.endDownScroll(); + } + // 结束上拉,回调失败重置回原来的页码 + if (this.isUpScrolling) { + this.optUp.page.num--; + this.endUpScroll(false); + // 如果是mescroll-body,则需往回滚一定距离 + if (this.isScrollBody && errDistance !== 0) { // 不处理0 + if (!errDistance) errDistance = this.optUp.errDistance; // 不传,则取默认 + this.scrollTo(this.getScrollTop() - errDistance, 0) // 往上回滚的距离 + } + } +} + +/* 显示空布局 */ +MeScroll.prototype.showEmpty = function() { + this.optUp.empty.use && this.optUp.empty.onShow && this.optUp.empty.onShow(true) +} + +/* 移除空布局 */ +MeScroll.prototype.removeEmpty = function() { + this.optUp.empty.use && this.optUp.empty.onShow && this.optUp.empty.onShow(false) +} + +/* 显示回到顶部的按钮 */ +MeScroll.prototype.showTopBtn = function() { + if (!this.topBtnShow) { + this.topBtnShow = true; + this.optUp.toTop.onShow && this.optUp.toTop.onShow(true); + } +} + +/* 隐藏回到顶部的按钮 */ +MeScroll.prototype.hideTopBtn = function() { + if (this.topBtnShow) { + this.topBtnShow = false; + this.optUp.toTop.onShow && this.optUp.toTop.onShow(false); + } +} + +/* 获取滚动条的位置 */ +MeScroll.prototype.getScrollTop = function() { + return this.scrollTop || 0 +} + +/* 记录滚动条的位置 */ +MeScroll.prototype.setScrollTop = function(y) { + this.scrollTop = y; +} + +/* 滚动到指定位置 */ +MeScroll.prototype.scrollTo = function(y, t) { + this.myScrollTo && this.myScrollTo(y, t) // scrollview需自定义回到顶部方法 +} + +/* 自定义scrollTo */ +MeScroll.prototype.resetScrollTo = function(myScrollTo) { + this.myScrollTo = myScrollTo +} + +/* 滚动条到底部的距离 */ +MeScroll.prototype.getScrollBottom = function() { + return this.getScrollHeight() - this.getClientHeight() - this.getScrollTop() +} + +/* 计步器 + star: 开始值 + end: 结束值 + callback(step,timer): 回调step值,计步器timer,可自行通过window.clearInterval(timer)结束计步器; + t: 计步时长,传0则直接回调end值;不传则默认300ms + rate: 周期;不传则默认30ms计步一次 + * */ +MeScroll.prototype.getStep = function(star, end, callback, t, rate) { + let diff = end - star; // 差值 + if (t === 0 || diff === 0) { + callback && callback(end); + return; + } + t = t || 300; // 时长 300ms + rate = rate || 30; // 周期 30ms + let count = t / rate; // 次数 + let step = diff / count; // 步长 + let i = 0; // 计数 + let timer = setInterval(function() { + if (i < count - 1) { + star += step; + callback && callback(star, timer); + i++; + } else { + callback && callback(end, timer); // 最后一次直接设置end,避免计算误差 + clearInterval(timer); + } + }, rate); +} + +/* 滚动容器的高度 */ +MeScroll.prototype.getClientHeight = function(isReal) { + let h = this.clientHeight || 0 + if (h === 0 && isReal !== true) { // 未获取到容器的高度,可临时取body的高度 (可能会有误差) + h = this.getBodyHeight() + } + return h +} +MeScroll.prototype.setClientHeight = function(h) { + this.clientHeight = h; +} + +/* 滚动内容的高度 */ +MeScroll.prototype.getScrollHeight = function() { + return this.scrollHeight || 0; +} +MeScroll.prototype.setScrollHeight = function(h) { + this.scrollHeight = h; +} + +/* body的高度 */ +MeScroll.prototype.getBodyHeight = function() { + return this.bodyHeight || 0; +} +MeScroll.prototype.setBodyHeight = function(h) { + this.bodyHeight = h; +} + +/* 阻止浏览器默认滚动事件 */ +MeScroll.prototype.preventDefault = function(e) { + // 小程序不支持e.preventDefault + // app的bounce只能通过配置pages.json的style.app-plus.bounce为"none"来禁止 + // cancelable:是否可以被禁用; defaultPrevented:是否已经被禁用 + if (e && e.cancelable && !e.defaultPrevented) e.preventDefault() +} + +/* 是否允许下拉回弹(橡皮筋效果); true或null为允许; false禁止bounce */ +MeScroll.prototype.setBounce = function(isBounce) { + // #ifdef H5 + if (isBounce === false) { + this.optUp.isBounce = false; // 禁止 + // 标记当前页使用了mescroll (需延时,确保page已切换) + setTimeout(function() { + let uniPageDom = document.getElementsByTagName('uni-page')[0]; + uniPageDom && uniPageDom.setAttribute('use_mescroll', true) + }, 30); + // 避免重复添加事件 + if (window.isSetBounce) return; + window.isSetBounce = true; + // 需禁止window的touchmove事件才能有效的阻止bounce + window.bounceTouchmove = function(e) { + let el = e.target; + // 当前touch的元素及父元素是否要拦截touchmove事件 + let isPrevent = true; + while (el !== document.body && el !== document) { + if (el.tagName === 'UNI-PAGE') { // 只扫描当前页 + if (!el.getAttribute('use_mescroll')) { + isPrevent = false; // 如果当前页没有使用mescroll,则不阻止 + } + break; + } + let cls = el.classList; + if (cls) { + if (cls.contains('mescroll-touch')) { // 采用scroll-view 此处不能过滤mescroll-uni,否则下拉仍然有回弹 + isPrevent = false; // mescroll-touch无需拦截touchmove事件 + break; + } else if (cls.contains('mescroll-touch-x') || cls.contains('mescroll-touch-y')) { + // 如果配置了水平或者垂直滑动 + let curX = e.touches ? e.touches[0].pageX : e.clientX; // 当前第一个手指距离列表顶部的距离x + let curY = e.touches ? e.touches[0].pageY : e.clientY; // 当前第一个手指距离列表顶部的距离y + if (!this.preWinX) this.preWinX = curX; // 设置上次移动的距离x + if (!this.preWinY) this.preWinY = curY; // 设置上次移动的距离y + // 计算两点之间的角度 + let x = Math.abs(this.preWinX - curX); + let y = Math.abs(this.preWinY - curY); + let z = Math.sqrt(x * x + y * y); + this.preWinX = curX; // 记录本次curX的值 + this.preWinY = curY; // 记录本次curY的值 + if (z !== 0) { + let angle = Math.asin(y / z) / Math.PI * 180; // 角度区间 [0,90] + if ((angle <= 45 && cls.contains('mescroll-touch-x')) || (angle > 45 && cls.contains('mescroll-touch-y'))) { + isPrevent = false; // 水平滑动或者垂直滑动,不拦截touchmove事件 + break; + } + } + } + } + el = el.parentNode; // 继续检查其父元素 + } + // 拦截touchmove事件:是否可以被禁用&&是否已经被禁用 (这里不使用me.preventDefault(e)的方法,因为某些情况下会报找不到方法的异常) + if (isPrevent && e.cancelable && !e.defaultPrevented && typeof e.preventDefault === "function") e.preventDefault(); + } + window.addEventListener('touchmove', window.bounceTouchmove, { + passive: false + }); + } else { + this.optUp.isBounce = true; // 允许 + if (window.bounceTouchmove) { + window.removeEventListener('touchmove', window.bounceTouchmove); + window.bounceTouchmove = null; + window.isSetBounce = false; + } + } + // #endif +} diff --git a/components/mescroll/mescroll-uni.vue b/components/mescroll/mescroll-uni.vue new file mode 100644 index 0000000..16352f3 --- /dev/null +++ b/components/mescroll/mescroll-uni.vue @@ -0,0 +1,416 @@ + ++ + + + + ++ + + ++ ++ {{ downText }} ++ + + + + + + + + ++ + ++ {{ mescroll.optUp.textLoading }} +{{ mescroll.optUp.textNoMore }} ++ + + + + + + diff --git a/components/mescroll/mixins/mescroll-comp.js b/components/mescroll/mixins/mescroll-comp.js new file mode 100644 index 0000000..5151dbc --- /dev/null +++ b/components/mescroll/mixins/mescroll-comp.js @@ -0,0 +1,23 @@ +/** + * mescroll-body写在子组件时,需通过mescroll的mixins补充子组件缺少的生命周期: + * 当一个页面只有一个mescroll-body写在子组件时, 则使用mescroll-comp.js (参考 mescroll-comp 案例) + * 当一个页面有多个mescroll-body写在子组件时, 则使用mescroll-more.js (参考 mescroll-more 案例) + */ +const MescrollCompMixin = { + // 因为子组件无onPageScroll和onReachBottom的页面生命周期,需在页面传递进到子组件 + onPageScroll(e) { + let item = this.$refs["mescrollItem"]; + if (item && item.mescroll) item.mescroll.onPageScroll(e); + }, + onReachBottom() { + let item = this.$refs["mescrollItem"]; + if (item && item.mescroll) item.mescroll.onReachBottom(); + }, + // 当down的native: true时, 还需传递此方法进到子组件 + onPullDownRefresh() { + let item = this.$refs["mescrollItem"]; + if (item && item.mescroll) item.mescroll.onPullDownRefresh(); + } +} + +export default MescrollCompMixin; diff --git a/components/mescroll/mixins/mescroll-more-item.js b/components/mescroll/mixins/mescroll-more-item.js new file mode 100644 index 0000000..acdd290 --- /dev/null +++ b/components/mescroll/mixins/mescroll-more-item.js @@ -0,0 +1,48 @@ +/** + * mescroll-more-item的mixins, 仅在多个 mescroll-body 写在子组件时使用 (参考 mescroll-more 案例) + */ +const MescrollMoreItemMixin = { + props: { + i: Number, // 每个tab页的专属下标 + index: { // 当前tab的下标 + type: Number, + default () { + return 0 + } + } + }, + data() { + return { + downOption: { + auto: false // 不自动加载 + }, + upOption: { + auto: false // 不自动加载 + }, + isInit: false // 当前tab是否已初始化 + } + }, + watch: { + // 监听下标的变化 + index(val) { + if (this.i === val && !this.isInit) { + this.isInit = true; // 标记为true + this.mescroll && this.mescroll.triggerDownScroll(); + } + } + }, + methods: { + // mescroll组件初始化的回调,可获取到mescroll对象 + mescrollInit(mescroll) { + this.mescroll = mescroll; + this.mescrollInitByRef && this.mescrollInitByRef(); // 兼容字节跳动小程序 (mescroll-mixins.js) + // 自动加载当前tab的数据 + if (this.i === this.index) { + this.isInit = true; // 标记为true + this.mescroll.triggerDownScroll(); + } + }, + } +} + +export default MescrollMoreItemMixin; diff --git a/components/mescroll/mixins/mescroll-more.js b/components/mescroll/mixins/mescroll-more.js new file mode 100644 index 0000000..8a11d40 --- /dev/null +++ b/components/mescroll/mixins/mescroll-more.js @@ -0,0 +1,56 @@ +/** + * mescroll-body写在子组件时,需通过mescroll的mixins补充子组件缺少的生命周期: + * 当一个页面只有一个mescroll-body写在子组件时, 则使用mescroll-comp.js (参考 mescroll-comp 案例) + * 当一个页面有多个mescroll-body写在子组件时, 则使用mescroll-more.js (参考 mescroll-more 案例) + */ +const MescrollMoreMixin = { + data() { + return { + tabIndex: 0 // 当前tab下标 + } + }, + // 因为子组件无onPageScroll和onReachBottom的页面生命周期,需在页面传递进到子组件 + onPageScroll(e) { + let mescroll = this.getMescroll(this.tabIndex); + mescroll && mescroll.onPageScroll(e); + }, + onReachBottom() { + let mescroll = this.getMescroll(this.tabIndex); + mescroll && mescroll.onReachBottom(); + }, + // 当down的native: true时, 还需传递此方法进到子组件 + onPullDownRefresh() { + let mescroll = this.getMescroll(this.tabIndex); + mescroll && mescroll.onPullDownRefresh(); + }, + methods: { + // 根据下标获取对应子组件的mescroll + getMescroll(i) { + if (!this.mescrollItems) this.mescrollItems = []; + if (!this.mescrollItems[i]) { + // v-for中的refs + let vForItem = this.$refs["mescrollItem"]; + if (vForItem) { + this.mescrollItems[i] = vForItem[i] + } else { + // 普通的refs,不可重复 + this.mescrollItems[i] = this.$refs["mescrollItem" + i]; + } + } + let item = this.mescrollItems[i] + return item ? item.mescroll : null + }, + // 切换tab,恢复滚动条位置 + tabChange(i) { + let mescroll = this.getMescroll(i); + if (mescroll) { + // 延时(比$nextTick靠谱一些),确保元素已渲染 + setTimeout(() => { + mescroll.scrollTo(mescroll.getScrollTop(), 0) + }, 30) + } + } + } +} + +export default MescrollMoreMixin; diff --git a/components/mescroll/my-list-mescroll.vue b/components/mescroll/my-list-mescroll.vue new file mode 100644 index 0000000..f03b404 --- /dev/null +++ b/components/mescroll/my-list-mescroll.vue @@ -0,0 +1,82 @@ + + ++ + + ++ + + ++ + + ++ + +{{ downText }} ++ + + + + + + + + ++ + + ++ {{ mescroll.optUp.textNoMore }} ++ + + + + + diff --git a/components/myp-one/myp-one.vue b/components/myp-one/myp-one.vue new file mode 100644 index 0000000..4b97fc6 --- /dev/null +++ b/components/myp-one/myp-one.vue @@ -0,0 +1,234 @@ + ++ + + + + + + diff --git a/components/ns-adv/ns-adv.vue b/components/ns-adv/ns-adv.vue new file mode 100644 index 0000000..a5e8d73 --- /dev/null +++ b/components/ns-adv/ns-adv.vue @@ -0,0 +1,95 @@ + ++ + ++ ++ ++ + + ● + +{{ codeArr[index] ? codeArr[index] : '' }} ++ + + + + + diff --git a/components/ns-birthday-gift/ns-birthday-gift.vue b/components/ns-birthday-gift/ns-birthday-gift.vue new file mode 100644 index 0000000..f6b7f7b --- /dev/null +++ b/components/ns-birthday-gift/ns-birthday-gift.vue @@ -0,0 +1,363 @@ + ++ ++ ++ + ++ + + + + + + + diff --git a/components/ns-chat/ns-chat-goods.vue b/components/ns-chat/ns-chat-goods.vue new file mode 100644 index 0000000..cfc0cea --- /dev/null +++ b/components/ns-chat/ns-chat-goods.vue @@ -0,0 +1,142 @@ + + + + + + + diff --git a/components/ns-chat/ns-chat-order.vue b/components/ns-chat/ns-chat-order.vue new file mode 100644 index 0000000..334c9fd --- /dev/null +++ b/components/ns-chat/ns-chat-order.vue @@ -0,0 +1,149 @@ + + + + + + + diff --git a/components/ns-chat/ns-chat-receiveGoods.vue b/components/ns-chat/ns-chat-receiveGoods.vue new file mode 100644 index 0000000..e65845d --- /dev/null +++ b/components/ns-chat/ns-chat-receiveGoods.vue @@ -0,0 +1,142 @@ + ++ ++ ++ ++ +Dear {{ birthday.nickname }} +{{ birthday.blessing_content }} +感谢您一直以来的支持,在您生日到来之际,特为您送上最真诚的祝福! ++ ++ 生日贺礼 ++ + ++ ++ ++ ++ {{ parseFloat(birthday.point) }} + +积分 +用于下单时抵现或兑换商品等 +立即查看 ++ ++ ++ {{ parseFloat(birthday.balance) }} + +元红包 +不可提现红包 +立即查看 ++ + ++ ++ {{ parseFloat(birthday.balance_money) }} + +元红包 +可提现红包 +立即查看 ++ ++ ++ ++ ++ ++ {{ parseFloat(item.money) }} + +元优惠劵 ++ ++ {{ item.discount }} + +折 +用于下单时抵现或兑换商品等 +立即查看 ++ + + + + + + diff --git a/components/ns-contact/ns-contact.vue b/components/ns-contact/ns-contact.vue new file mode 100644 index 0000000..e2a6286 --- /dev/null +++ b/components/ns-contact/ns-contact.vue @@ -0,0 +1,157 @@ + ++ ++ + +{{ goodsINfo.goods_name }} ++ 库存:{{ goodsINfo.stock }} + +销量:{{ goodsINfo.sale_num }} ++ ++ +¥ +{{ goodsINfo.price }} ++ 查看商品 + ++ + + + + + + + diff --git a/components/ns-copyright/ns-copyright.vue b/components/ns-copyright/ns-copyright.vue new file mode 100644 index 0000000..371f13f --- /dev/null +++ b/components/ns-copyright/ns-copyright.vue @@ -0,0 +1,74 @@ + ++ + + ++ ++ +联系客服 ++ + {{siteInfo.site_tel ? ('请联系客服,客服电话是'+siteInfo.site_tel) : '抱歉,商家暂无客服,请线下联系'}} + ++ + + + + + diff --git a/components/ns-empty/ns-empty.vue b/components/ns-empty/ns-empty.vue new file mode 100644 index 0000000..ec54d1d --- /dev/null +++ b/components/ns-empty/ns-empty.vue @@ -0,0 +1,95 @@ + ++ ++ + + ++ + + + + + + diff --git a/components/ns-fenxiao-goods-detail/ns-fenxiao-goods-detail.vue b/components/ns-fenxiao-goods-detail/ns-fenxiao-goods-detail.vue new file mode 100644 index 0000000..ca44b11 --- /dev/null +++ b/components/ns-fenxiao-goods-detail/ns-fenxiao-goods-detail.vue @@ -0,0 +1,120 @@ + ++ {{ text }} +{{ subText }} + ++ + + + + + diff --git a/components/ns-form/ns-form.vue b/components/ns-form/ns-form.vue new file mode 100644 index 0000000..3747f0c --- /dev/null +++ b/components/ns-form/ns-form.vue @@ -0,0 +1,846 @@ + ++ +{{ levelInfo.words_account }}详情 ++ ++ +一级{{ levelInfo.words_account }} ++ +¥ +{{ parseFloat(levelInfo.commission_money).toFixed(2).split(".")[0] }} +.{{ parseFloat(levelInfo.commission_money).toFixed(2).split(".")[1] }} ++ + + + + + diff --git a/components/ns-goods-action-button/ns-goods-action-button.vue b/components/ns-goods-action-button/ns-goods-action-button.vue new file mode 100644 index 0000000..b0cabe2 --- /dev/null +++ b/components/ns-goods-action-button/ns-goods-action-button.vue @@ -0,0 +1,96 @@ + ++ ++ + ++ ++ +{{ item.value.title }} +{{ item.value.required ? '*' : '' }} ++ + + ++ ++ +{{ item.value.title }} +{{ item.value.required ? '*' : '' }} ++ + + ++ ++ ++ +{{ item.value.title }} +{{ item.value.required ? '*' : '' }} ++ +{{ item.val }} +请选择 ++ + + ++ ++ +{{ item.value.title }} +{{ item.value.required ? '*' : '' }} ++ ++ + ++ + ++ ++ +{{ item.value.title }} +{{ item.value.required ? '*' : '' }} ++ ++ + ++ + ++ ++ +{{ item.value.title }} +{{ item.value.required ? '*' : '' }} ++ ++ ++ + + + + ++ ++ +{{ item.value.title }} +{{ item.value.required ? '*' : '' }} ++ ++ +{{ item.val ? item.val : item.value.placeholder }} ++ + + ++ ++ +{{ item.value.title }} +{{ item.value.required ? '*' : '' }} ++ ++ ++ ++ +{{ item.start_date ? item.start_date : item.value.placeholder_start }} ++ + ++ ++ +{{ item.end_date ? item.end_date : item.value.placeholder_end }} ++ + ++ ++ +{{ item.value.title }} +{{ item.value.required ? '*' : '' }} ++ ++ +{{ item.val ? item.val : item.value.placeholder }} ++ + + ++ ++ +{{ item.value.title }} +{{ item.value.required ? '*' : '' }} ++ ++ ++ ++ +{{ item.start_time ? item.start_time : item.value.placeholder_start }} ++ + ++ ++ +{{ item.end_time ? item.end_time : item.value.placeholder_end }} ++ ++ ++ +{{ item.value.title }} +{{ item.value.required ? '*' : '' }} ++ ++ ++ {{ item.val ? item.val : item.select_arr == '2' ? '请选择省市' : '请选择省市区/县' }} + ++ + + + + + + diff --git a/components/ns-goods-action-icon/ns-goods-action-icon.vue b/components/ns-goods-action-icon/ns-goods-action-icon.vue new file mode 100644 index 0000000..1b7d828 --- /dev/null +++ b/components/ns-goods-action-icon/ns-goods-action-icon.vue @@ -0,0 +1,142 @@ + +{{ disabledText }} ++ +{{ textPrice }} +{{ text }} ++ + + + + + diff --git a/components/ns-goods-action/ns-goods-action.vue b/components/ns-goods-action/ns-goods-action.vue new file mode 100644 index 0000000..47ccc59 --- /dev/null +++ b/components/ns-goods-action/ns-goods-action.vue @@ -0,0 +1,34 @@ + + ++ ++ ++ ++ {{ text }} +{{ cornerMark }} ++ ++ ++ {{ text }} +{{ cornerMark > 99 ? '99+' : cornerMark }} ++ + + + + diff --git a/components/ns-goods-promotion/ns-goods-promotion.vue b/components/ns-goods-promotion/ns-goods-promotion.vue new file mode 100644 index 0000000..cbc219e --- /dev/null +++ b/components/ns-goods-promotion/ns-goods-promotion.vue @@ -0,0 +1,125 @@ + + + + + + + + + diff --git a/components/ns-goods-recommend/ns-goods-recommend.vue b/components/ns-goods-recommend/ns-goods-recommend.vue new file mode 100644 index 0000000..f03a9b4 --- /dev/null +++ b/components/ns-goods-recommend/ns-goods-recommend.vue @@ -0,0 +1,346 @@ + ++ ++ +限时折扣 +当前商品正在参加{{ item.promotion_name }} ++ + + + +团购 +当前商品正在参加{{ item.promotion_name }} ++ + + +拼团 +当前商品正在参加{{ item.promotion_name }} ++ + + +秒杀 +当前商品正在参加{{ item.promotion_name }} ++ + + +专题活动 +当前商品正在参加{{ item.promotion_name }} ++ + + +砍价 +当前商品正在参加{{ item.promotion_name }} ++ + + +拼团返利 +当前商品正在参加{{ item.promotion_name }} ++ + + + + + + diff --git a/components/ns-goods-sku/ns-goods-sku-category.vue b/components/ns-goods-sku/ns-goods-sku-category.vue new file mode 100644 index 0000000..11adaf7 --- /dev/null +++ b/components/ns-goods-sku/ns-goods-sku-category.vue @@ -0,0 +1,819 @@ + ++ ++ + {{config.title}} + ++ ++ ++ {{ goodsTag(item) }} ++ ++ + +{{ item.goods_name }} ++ ++ +{{ $lang('common.currencySymbol') }} ++ {{ + parseFloat(showPrice(item)) + .toFixed(2) + .split('.')[0] + }} + ++ .{{ + parseFloat(showPrice(item)) + .toFixed(2) + .split('.')[1] + }} + ++ ++ + ++ + ++ ++ +{{ $lang('common.currencySymbol') }} + {{ item.market_price > 0 ? item.market_price : item.price }} +已售{{ item.sale_num }}{{ item.unit ? item.unit : '件' }} ++ + + + + + diff --git a/components/ns-goods-sku/ns-goods-sku.vue b/components/ns-goods-sku/ns-goods-sku.vue new file mode 100644 index 0000000..aad69e1 --- /dev/null +++ b/components/ns-goods-sku/ns-goods-sku.vue @@ -0,0 +1,1660 @@ + ++ + ++ ++ ++ ++ + +{{ goodsDetail.goods_name }} +库存{{ goodsDetail.stock }}{{ goodsDetail.unit }} ++ ++ ++ +{{ item.spec_name }} ++ ++ ++ {{ item_value.spec_value_name }} ++ ++ + 已选择: + ++ {{ item.spec_value_name }} {{ index != goodsDetail.sku_spec_format.length - 1 ? ' / ' : ' ' }} + + ++ ++ ++ +¥{{ goodsDetail.show_price }} ++ ++ ++ + ++ + + ++ + + ++ + + ++ + + + + + + + diff --git a/components/ns-loading/ns-loading.vue b/components/ns-loading/ns-loading.vue new file mode 100644 index 0000000..eb4507c --- /dev/null +++ b/components/ns-loading/ns-loading.vue @@ -0,0 +1,89 @@ + ++ ++ ++ + ++ ++ ++ + ++ + + ++ + + ++ ++ ++ +{{ goodsDetail.point }}积分 ++ ++ +{{ $lang('common.currencySymbol') }}{{ goodsDetail.exchange_price }} +库存{{ goodsDetail.stock }}{{ goodsDetail.unit }} ++ ++ +{{ goodsDetail.name }} ++ 积分: + +{{ goodsDetail.point }} ++ 库存: + +{{ goodsDetail.stock }}{{ goodsDetail.unit }} ++ ++ +¥ ++ {{ + parseFloat(goodsDetail.presale_deposit) + .toFixed(2) + .split('.')[0] + }} + ++ .{{ + parseFloat(goodsDetail.presale_deposit) + .toFixed(2) + .split('.')[1] + }} + ++ +尾款 +¥ +{{ balance }} ++ +库存{{ goodsDetail.stock }}{{ goodsDetail.unit }} ++ + ++ ++ + ++ +¥ ++ {{ + parseFloat(pintuanPrice(goodsDetail)) + .toFixed(2) + .split('.')[0] + }} + ++ .{{ + parseFloat(pintuanPrice(goodsDetail)) + .toFixed(2) + .split('.')[1] + }} + ++ +¥ ++ {{ + parseFloat(goodsDetail.promotion_price) + .toFixed(2) + .split('.')[0] + }} + ++ .{{ + parseFloat(goodsDetail.promotion_price) + .toFixed(2) + .split('.')[1] + }} + ++ +¥ ++ {{ + parseFloat(pintuanPrice(goodsDetail)) + .toFixed(2) + .split('.')[0] + }} + ++ .{{ + parseFloat(pintuanPrice(goodsDetail)) + .toFixed(2) + .split('.')[1] + }} + ++ +¥ + ++ {{ + parseFloat(goodsDetail.groupbuy_price) + .toFixed(2) + .split('.')[0] + }} + ++ .{{ + parseFloat(goodsDetail.groupbuy_price) + .toFixed(2) + .split('.')[1] + }} + ++ +¥ ++ {{ + parseFloat(goodsDetail.seckill_price) + .toFixed(2) + .split('.')[0] + }} + ++ .{{ + parseFloat(goodsDetail.seckill_price) + .toFixed(2) + .split('.')[1] + }} + ++ +¥ ++ ++ ++ {{ + parseFloat(goodsDetail.discount_price) + .toFixed(2) + .split('.')[0] + }} + ++ {{ + parseFloat(goodsDetail.member_price) + .toFixed(2) + .split('.')[0] + }} + ++ .{{ + parseFloat(goodsDetail.discount_price) + .toFixed(2) + .split('.')[1] + }} + ++ .{{ + parseFloat(goodsDetail.member_price) + .toFixed(2) + .split('.')[1] + }} + ++ ++ {{ + parseFloat(goodsDetail.discount_price) + .toFixed(2) + .split('.')[0] + }} + ++ {{ + parseFloat(goodsDetail.price) + .toFixed(2) + .split('.')[0] + }} + ++ .{{ + parseFloat(goodsDetail.discount_price) + .toFixed(2) + .split('.')[1] + }} + ++ .{{ + parseFloat(goodsDetail.price) + .toFixed(2) + .split('.')[1] + }} + ++ ++ {{ + parseFloat(goodsDetail.member_price) + .toFixed(2) + .split('.')[0] + }} + ++ {{ + parseFloat(goodsDetail.price) + .toFixed(2) + .split('.')[0] + }} + ++ .{{ + parseFloat(goodsDetail.member_price) + .toFixed(2) + .split('.')[1] + }} + ++ .{{ + parseFloat(goodsDetail.price) + .toFixed(2) + .split('.')[1] + }} + ++ +库存{{ goodsDetail.stock }}{{ goodsDetail.unit }} ++ +已选规格: +{{ item.spec_value_name }} ++ + ++ + ++ + ++ + +{{ goodsDetail.pintuan_num }}人团 ++ +{{ goodsDetail.pintuan_num_2 }}人团 ++ +{{ goodsDetail.pintuan_num_3 }}人团 ++ + +{{ item.spec_name }} ++ ++ {{ item_value.spec_value_name }} ++ + ++ +兑换数量 +购买数量 +(每人限购{{ limitNumber }}{{ goodsDetail.unit }}) ++ ({{ minBuy }}{{ goodsDetail.unit }}起售,限购{{ maxBuy }}{{ goodsDetail.unit }}) + +(限购{{ maxBuy }}{{ goodsDetail.unit }}) +({{ minBuy }}{{ goodsDetail.unit }}起售) ++ + + + + + ++ + + ++ + + + + + + + + + + + + + + ++ + + + + + + diff --git a/components/ns-login/ns-login.vue b/components/ns-login/ns-login.vue new file mode 100644 index 0000000..e8e9947 --- /dev/null +++ b/components/ns-login/ns-login.vue @@ -0,0 +1,685 @@ + ++ ++ {{ downText }} ++ + + + + + + + diff --git a/components/ns-navbar/ns-navbar.vue b/components/ns-navbar/ns-navbar.vue new file mode 100644 index 0000000..7d54e4f --- /dev/null +++ b/components/ns-navbar/ns-navbar.vue @@ -0,0 +1,337 @@ + + ++ + ++ ++ + + ++ +检测到您还未绑定手机号 +为了方便您接收订单等信息,需要绑定手机号 ++ + +手机号 + ++ +验证码 + ++ + + + + + + +动态码 + +{{ dynacodeData.codeText }} ++ ++ 获取您的昵称、头像 + + 、手机号 + + ++ 获取用户头像、昵称 + + 、手机号 + + 完善个人资料,主要用于向用户提供具有辨识度的用户中心界面 + ++ + +头像 + ++ +昵称 + ++ + + +手机号 + ++ + + + + + + + diff --git a/components/ns-new-gift/ns-new-gift.vue b/components/ns-new-gift/ns-new-gift.vue new file mode 100644 index 0000000..8b15123 --- /dev/null +++ b/components/ns-new-gift/ns-new-gift.vue @@ -0,0 +1,389 @@ + ++ + + ++ ++ ++ ++ + ++ +{{ globalS.title }} ++ ++ ++ ++ {{ globalS.title }} ++ ++ ++ ++ + ++ 请输入商品名称 + + + + + + + + + + diff --git a/components/ns-payment/ns-payment.vue b/components/ns-payment/ns-payment.vue new file mode 100644 index 0000000..4500e7a --- /dev/null +++ b/components/ns-payment/ns-payment.vue @@ -0,0 +1,576 @@ + ++ ++ ++ ++ ++ ++ {{ newgift.activity_name }} ++ Dear {{ userInfo.nickname }} +{{ newgift.remark }} ++ 感谢您一直以来的支持,为回馈会员,商城{{ newgift.activity_name ? newgift.activity_name : 'xx' }}节日,为您提供以下福利 + ++ ++ ++ ++ ++ {{ newgift.award_list.point }} + +积分 +用于参与活动购买商品时抵扣 +立即查看 ++ ++ ++ {{ newgift.award_list.balance | int }} + +元红包 +不可提现红包 +立即查看 ++ ++ ++ {{ newgift.award_list.balance_money | int }} + +元红包 +可提现红包 +立即查看 ++ ++ ++ ++ ++ {{ parseFloat(item.money) }} + +元优惠劵 ++ {{ item.discount | int }} + +折 +用于下单时抵现或兑换商品等 +立即查看 ++ + ++ + + + + + + + + diff --git a/components/ns-progress/ns-progress.vue b/components/ns-progress/ns-progress.vue new file mode 100644 index 0000000..e3afc36 --- /dev/null +++ b/components/ns-progress/ns-progress.vue @@ -0,0 +1,37 @@ + ++ ++ ++ +支付方式 ++ + ++ + +支付金额{{ payMoney | moneyFormat }}元 ++ ++ + +余额抵扣 +可用¥{{ balanceDeduct }} ++ + ++ ++ ++ {{ item.name }} ++ + 平台尚未配置支付方式! + 确认支付 + + + + + diff --git a/components/ns-select-time/ns-select-time.vue b/components/ns-select-time/ns-select-time.vue new file mode 100644 index 0000000..2f9ae10 --- /dev/null +++ b/components/ns-select-time/ns-select-time.vue @@ -0,0 +1,352 @@ + + + + + + + + diff --git a/components/ns-switch/ns-switch.vue b/components/ns-switch/ns-switch.vue new file mode 100644 index 0000000..8ce894b --- /dev/null +++ b/components/ns-switch/ns-switch.vue @@ -0,0 +1,69 @@ + ++ ++ ++ +选择送达时间 +选择自提时间 ++ + + ++ + ++ +{{ item.title }} +{{ item.month }} +{{ item.Day }} ++ ++ {{ item }} + ++ + + + + diff --git a/components/payment/payment.vue b/components/payment/payment.vue new file mode 100644 index 0000000..dc8e4e9 --- /dev/null +++ b/components/payment/payment.vue @@ -0,0 +1,643 @@ + ++ ++ + + + + + + + + + diff --git a/components/pengpai-fadein-out/pengpai-fadein-out.vue b/components/pengpai-fadein-out/pengpai-fadein-out.vue new file mode 100644 index 0000000..e761fa6 --- /dev/null +++ b/components/pengpai-fadein-out/pengpai-fadein-out.vue @@ -0,0 +1,264 @@ + ++ ++ ++ +支付方式 ++ + ++ + +支付金额{{ payMoney|moneyFormat }}元 ++ ++ + +余额抵扣 +可用¥{{ balanceDeduct|moneyFormat }} ++ + ++ ++ ++ {{ item.name }} ++ + +平台尚未配置支付方式! ++ +确认支付 ++ + + + + + + diff --git a/components/pick-regions/pick-regions.vue b/components/pick-regions/pick-regions.vue new file mode 100644 index 0000000..f3c72f0 --- /dev/null +++ b/components/pick-regions/pick-regions.vue @@ -0,0 +1,228 @@ + ++ + + + diff --git a/components/register-reward/register-reward.vue b/components/register-reward/register-reward.vue new file mode 100644 index 0000000..a156c4f --- /dev/null +++ b/components/register-reward/register-reward.vue @@ -0,0 +1,286 @@ + ++ + + + + + + + diff --git a/components/sx-rate/common.js b/components/sx-rate/common.js new file mode 100644 index 0000000..6e559dc --- /dev/null +++ b/components/sx-rate/common.js @@ -0,0 +1,6 @@ +export function getClientRect(selector, component) { + return new Promise((resolve, reject) => { + let query = component ? uni.createSelectorQuery().in(component) : uni.createSelectorQuery(); + return query.select(selector).boundingClientRect(resolve).exec() + }) +} diff --git a/components/sx-rate/index.vue b/components/sx-rate/index.vue new file mode 100644 index 0000000..6f99821 --- /dev/null +++ b/components/sx-rate/index.vue @@ -0,0 +1,218 @@ + ++ ++ ++ ++ + + + ++ ++ ++ ++ +积分奖励 ++ ++ ++ +{{ reward.point }} +积分 +用于下单时抵现或兑换商品等 +立即查看 ++ +成长值 ++ ++ ++ +{{ reward.growth }} +成长值 +用于提升会员等级 +立即查看 ++ +红包奖励 ++ ++ ++ +{{ reward.balance }} +元 +不可提现下单时可用 +立即查看 ++ +优惠券奖励 ++ ++ ++ +{{ item.coupon_name }} ++ 满{{ item.at_least }}{{ item.type == 'discount' ? '打' + item.discount + '折' : '减' + item.money }} + +无门槛,{{ item.type == 'discount' ? '打' + item.discount + '折' : '减' + item.money }} +立即查看 ++ + + + + + + + + diff --git a/components/sx-rate/sx-rate/iconfont.css b/components/sx-rate/sx-rate/iconfont.css new file mode 100644 index 0000000..5cd5397 --- /dev/null +++ b/components/sx-rate/sx-rate/iconfont.css @@ -0,0 +1,21 @@ +@font-face {font-family: "iconfont"; + src: url('~@/components/sx-rate/sx-rate/iconfont.eot?t=1574760464482'); /* IE9 */ + src: url('~@/components/sx-rate/sx-rate/iconfont.eot?t=1574760464482#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAAK8AAsAAAAABnAAAAJwAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCCcAp8gQgBNgIkAwgLBgAEIAWEbQcuG6wFyA4lTcHACOEZBUg8fL/2O3f3fTHEkoh28SSayCSxkkgQG6Uz3UvYITu9Qr5K0Vh6Ij6f+8CXKzVBHDvWa6d0lSfK57mc3gQ6kGt8oBz3ojUG9QLqxYEU6B4YRVYqecPYBS7hMYG6QWF0dlOycoGxxFoViFuxkALGuYAksXRVKNccTOJdSTV7zbSAt/D78Y8XxmRKOavq5CZZAOK+7u2svLVode0TggR0vIQc84BEXNQmjugJxumpJ/SNAvsqD77ui8K3i71aBPvrrNIm6IfSe5K58ltNZ3BbU40Blkf9OmKsIW/Un1qddc4dcSma3ArIX7PPXdlxK5l2zJ+aD6TXnQqmu330wqpeWkYN/OnNm/0trU+YvqNR4UN99f+x/tApIFTfR7u39X4gKPnb9pOX5RAQB6DYyc/zOKCD4OUp6KiiPeqnapbAp56NdegrdhLo5wKq+3UG/0fWcyDpCsuWJVVWO5oZO29bXR0FwJ4uV2ONvTeTCVW9I1wVAylyVeNkYudR0rCOsqoN1M1JPd7QDdMTqYZZXQChwwYybT6Q63BIJvYSJX1eUNYReqi7CrsLGyZDbJqIEUWQAPLroJhWKhjHQUyj8mwkrJJROKsI+XyENeIw5LI4xXQqUiA8xxZNtZBHCAMZrJTDFPAcksmUUIWVEkQTlogQVQSbzdS9iUUr5cDUDgyhEIgAxFcHEqMpKTD+eMK09PlsiFAVGQpu6atJ5kMwDfHsEBcLpweZqlX06ruXVzSqCfEQBANiYEpyUAqYh8jIKEGq+nkSCI1gEY2IqURg28OYvlrW+nr5152AOsuUhV2fSy+EwgAAAA==') format('woff2'), + url('~@/components/sx-rate/sx-rate/iconfont.woff?t=1574760464482') format('woff'), + url('~@/components/sx-rate/sx-rate/iconfont.ttf?t=1574760464482') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */ + url('~@/components/sx-rate/sx-rate/iconfont.svg?t=1574760464482#iconfont') format('svg'); /* iOS 4.1- */ +} + +.iconfont { + font-family: "iconfont" !important; + font-size: inherit; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-star:before { + content: "\e6e3"; +} + diff --git a/components/sx-rate/sx-rate/iconfont.eot b/components/sx-rate/sx-rate/iconfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..d9e69444b8eb918db65a9f9f657384bc14903134 GIT binary patch literal 1816 zcmd^AU2hvj6g{)Eb{xAVPEF!GwAE5tgNm_T3%RH*ZPY@-Lj+Y5A|WB6jkEr!yx#44 z6D6XRELDBriT)F+_NA@(_yZvE053o*q(~8>YTtN5iaE18Zd8+hz$A0$+;i{D+?l<; zGdBVFNkG7WY6cQA0%Yz8g_f?w`o4^4s`skbZ|$=qltTv%c<7-S$&iLua1{<(*gzLH z0y48$B@>`eZ{=&@G|H&ba?pIzYSRn`kf<&$e{$*W-u-7J-z9tL+ ++ pbmc6}ub^ z2l&jS3Q&%&Fw!ZEh#`CHdiCDtQ|JFiCieYRPUn bi`g6rA8F*c 4uW<%N(Mewp96NN@t+j2d)9`vtuNS6A;HuNw=-R IX>vXv~q86Q=6O7jBZ? dxc|6*a3vr2T4W5psOFEy)5j*?h8m*` z`DR$`0pA3dXhFXq4&RL~u?0V}UE?|pdY93TX8AbFa$I@w;*9*u(M#m2Jc*w-RSOSp PhA{X&&3 + + + diff --git a/components/sx-rate/sx-rate/iconfont.ttf b/components/sx-rate/sx-rate/iconfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..51da8df702c44d78abe5d9d741df53f15b54fab6 GIT binary patch literal 1648 zcmd^9U2hXd6g{)EHja&ngGrnR8g2P-5g0pI$W%Zf3Xt#+wG~MtAyuk2&iVs+y=J|M z5)~v%h=)G4|D=`rQczp|07yJQANUedq^N2HZ#*HzJ+nJTDDV#$duGl(_spGp$K!zj zkU|d RP5-w2`zt_vNp||1`BM3-tCt_szCnAj>e`)uQ-93Ue#YLZx7KTCo|{8} zT%i9(!?Blhhif_Fm+X}WiCr(`E#g1f4>jCiEkVGwk2oY+Ue(4qWy?7Zao1k!h%`#{ zkJGl=w(Fc**uF{sL%?u5UN;DCFRf8JMSl^@UH1Atd~ebOII3#iZ$`+Fy> )d^vZ+W04(f=CP4WZu*;P~iBqmURxHvPnz?D(p$Rk?K zx=l`7^eL|(BM{dtZ4=@b#E>w4GVYW8Ihw^5%7SYR#3b2|v~O#dmNB)tvAGe|FMH@w zrgCCaTj^wCgepcMqQrvMd`(uV3!GUMc@qah4O0R(H~OqI8fizlL#WI@^|m`afc^Ry z!n0B*MLRlub)Sj)cjZ$#rOs63#&WR {z@c@ h6td-oP$=rm-Y{NMn J7kA+}2nigI_f^um|@vmgFC3Y!W}$IEFF2(m0NckQyhkD6$%-kQdG5 z1>dm)XW3d>x0+S2UGv&OasaM4^_7 5==j~H*S1a+CkNE5({}tpobGD990WD1 z=6kL+!+=h! ZP0&*dNH0?T$_BjC6U3rkq%*hCc`+NgzN zK;2H}3iWlYpvATR2i~3PMXG&tsZ&ucoZyo;`N67Ls@kD)XFgr5a+G449L}?lY20 zG@~ vd9R_X?%~k;6gV?CRJvh{ffq{_&C~6GEP8 cGJ(CrjEI8yCtu8ShIoNP3cxkdTy+ns$JT=~7Ivgv>nKx^FXfKCEYU<|$@&W)7Gk zsKU;`u!eUf$c%)9R3K(cl2u4cOi18KOh{p1v|pg195H8RBe%}ELkn2K4l@bWfBW&j zUV`(<<_1qTH?y|D1I%iv3v3D^91WP28A9ZEz5>0-!0>+;^KE7a1|=XzTuhu*j**{{ zO $Wk*GHUqNE%vH_o8O@BC6v{Y+f$}{3`*@jknH0rd2@1RxRbtj*=G`m6 zE6&I!#97L%#jNvAfLV=2LvSar@W0>U5}ehXKqMi~$STacQ&62%jalHG2sHc{9zApF z&HnhuEM9U)q=dr*vCRt@n*QzYZf(5Dc;ab70#hdw!>e=bD 3r3T%8vYlJz~d Zo=%((ZHTGw8BH77gzh+1&-f_Ts1xtY;-gWp_tey$`MIe8W5 zYAes4Q)_R&y1**^{8Qk1@lLrGwWkru|F#`t>MLYzRpsk3bdpHvIQ8O%b!gg`^&6cJ z#Z`ydo_$^tEpp|5aVsO!m-8{fyEa{_wDNDXjh7B8Ez!<9J#UK1#JIDbLYti8u5Al( zdc|m#8r~;Z6?3uEUL)P(KLck}-U(n}gTgtffkBV$O+)9z&WSS{m+ny6*wM(yz~#<( H1t<>yp>SRY literal 0 HcmV?d00001 diff --git a/components/sx-rate/sx-rate/iconfont.woff2 b/components/sx-rate/sx-rate/iconfont.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..982419bb213e6a87a87bdb004f98eace64a91553 GIT binary patch literal 700 zcmV;t0z>_GPew8T0RR9100O)K3jhEB00wXX00M9T0RR9100000000000000000000 z0000SLIzd cxQ+=pGnFRw{YJ*aa@(F@d^4VRUv=vT}j3#99@ITd|M=#<_qb zv2;}^*BngZT}d^2&9s2G@cZ$P7sg~tIjidACRqUDzV7X;ytQa`?Gu6obi9Nd^MFKL z)FzJT3C8KEC-jX1`zjBaksG>dUr)rkKr=E>< z=qq*-=;s2e`*jBYN7i#7=?cr1B~?~Cni)H9TU{Lmz@9EwV~xExlL=M5BU}{&DRNcg zWMb!0(y)%Qstwf5Nj=`s4bu~;hFM(zp~D6;Z9b6ea7ZTh5+!|JP}UK8sJjZg3mYaw zY?_D>MUVjU>!6rcDj3H>Or!E_B&?EAII9Txe1tXPFyyj0#dIoCAUwwwO|_6m2m=|c zl*1J89FobDP=%EeL=%>X5LE=5&D6b#MJwgN)D8@x5QqT8R|gWKDJd}ic*3;w`D}<# z6&VU{>8nZRLof~T><||Vrw5s;RrKn+msd2Z3GomF17cuGa!?AGhsek%L8|(B5(tf8 i5siqcL}1&)n7&%p`g-}-oq#&al!aZNOD}}N0001)05+2V literal 0 HcmV?d00001 diff --git a/components/toTop/toTop.vue b/components/toTop/toTop.vue new file mode 100644 index 0000000..0eabd20 --- /dev/null +++ b/components/toTop/toTop.vue @@ -0,0 +1,58 @@ + + + + + + + + diff --git a/components/uni-badge/uni-badge.vue b/components/uni-badge/uni-badge.vue new file mode 100644 index 0000000..5a3cf68 --- /dev/null +++ b/components/uni-badge/uni-badge.vue @@ -0,0 +1,107 @@ + + + {{ text }} + + + + + + diff --git a/components/uni-calendar/calendar.js b/components/uni-calendar/calendar.js new file mode 100644 index 0000000..2331f75 --- /dev/null +++ b/components/uni-calendar/calendar.js @@ -0,0 +1,623 @@ +/** + * @1900-2100区间内的公历、农历互转 + * @charset UTF-8 + * @github https://github.com/jjonline/calendar.js + * @Author Jea杨(JJonline@JJonline.Cn) + * @Time 2014-7-21 + * @Time 2016-8-13 Fixed 2033hex、Attribution Annals + * @Time 2016-9-25 Fixed lunar LeapMonth Param Bug + * @Time 2017-7-24 Fixed use getTerm Func Param Error.use solar year,NOT lunar year + * @Version 1.0.3 + * @公历转农历:calendar.solar2lunar(1987,11,01); //[you can ignore params of prefix 0] + * @农历转公历:calendar.lunar2solar(1987,09,10); //[you can ignore params of prefix 0] + */ +/* eslint-disable */ +var calendar = { + + /** + * 农历1900-2100的润大小信息表 + * @Array Of Property + * @return Hex + */ + lunarInfo: [0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, + 0x055d2, // 1900-1909 + 0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977, // 1910-1919 + 0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970, // 1920-1929 + 0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950, // 1930-1939 + 0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557, // 1940-1949 + 0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5b0, 0x14573, 0x052b0, 0x0a9a8, 0x0e950, 0x06aa0, // 1950-1959 + 0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0, // 1960-1969 + 0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b6a0, 0x195a6, // 1970-1979 + 0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570, // 1980-1989 + 0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x05ac0, 0x0ab60, 0x096d5, 0x092e0, // 1990-1999 + 0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5, // 2000-2009 + 0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930, // 2010-2019 + 0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530, // 2020-2029 + 0x05aa0, 0x076a3, 0x096d0, 0x04afb, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45, // 2030-2039 + 0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0, // 2040-2049 + /** Add By JJonline@JJonline.Cn**/ + 0x14b63, 0x09370, 0x049f8, 0x04970, 0x064b0, 0x168a6, 0x0ea50, 0x06b20, 0x1a6c4, 0x0aae0, // 2050-2059 + 0x0a2e0, 0x0d2e3, 0x0c960, 0x0d557, 0x0d4a0, 0x0da50, 0x05d55, 0x056a0, 0x0a6d0, 0x055d4, // 2060-2069 + 0x052d0, 0x0a9b8, 0x0a950, 0x0b4a0, 0x0b6a6, 0x0ad50, 0x055a0, 0x0aba4, 0x0a5b0, 0x052b0, // 2070-2079 + 0x0b273, 0x06930, 0x07337, 0x06aa0, 0x0ad50, 0x14b55, 0x04b60, 0x0a570, 0x054e4, 0x0d160, // 2080-2089 + 0x0e968, 0x0d520, 0x0daa0, 0x16aa6, 0x056d0, 0x04ae0, 0x0a9d4, 0x0a2d0, 0x0d150, 0x0f252, // 2090-2099 + 0x0d520 + ], // 2100 + + /** + * 公历每个月份的天数普通表 + * @Array Of Property + * @return Number + */ + solarMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], + + /** + * 天干地支之天干速查表 + * @Array Of Property trans["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"] + * @return Cn string + */ + Gan: ['\u7532', '\u4e59', '\u4e19', '\u4e01', '\u620a', '\u5df1', '\u5e9a', '\u8f9b', '\u58ec', '\u7678'], + + /** + * 天干地支之地支速查表 + * @Array Of Property + * @trans["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"] + * @return Cn string + */ + Zhi: ['\u5b50', '\u4e11', '\u5bc5', '\u536f', '\u8fb0', '\u5df3', '\u5348', '\u672a', '\u7533', '\u9149', + '\u620c', + '\u4ea5' + ], + + /** + * 天干地支之地支速查表<=>生肖 + * @Array Of Property + * @trans["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"] + * @return Cn string + */ + Animals: ['\u9f20', '\u725b', '\u864e', '\u5154', '\u9f99', '\u86c7', '\u9a6c', '\u7f8a', '\u7334', '\u9e21', + '\u72d7', '\u732a' + ], + + /** + * 24节气速查表 + * @Array Of Property + * @trans["小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"] + * @return Cn string + */ + solarTerm: ['\u5c0f\u5bd2', '\u5927\u5bd2', '\u7acb\u6625', '\u96e8\u6c34', '\u60ca\u86f0', '\u6625\u5206', + '\u6e05\u660e', '\u8c37\u96e8', '\u7acb\u590f', '\u5c0f\u6ee1', '\u8292\u79cd', '\u590f\u81f3', + '\u5c0f\u6691', + '\u5927\u6691', '\u7acb\u79cb', '\u5904\u6691', '\u767d\u9732', '\u79cb\u5206', '\u5bd2\u9732', + '\u971c\u964d', + '\u7acb\u51ac', '\u5c0f\u96ea', '\u5927\u96ea', '\u51ac\u81f3' + ], + + /** + * 1900-2100各年的24节气日期速查表 + * @Array Of Property + * @return 0x string For splice + */ + sTermInfo: ['9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf97c3598082c95f8c965cc920f', + '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', + 'b027097bd097c36b0b6fc9274c91aa', '9778397bd19801ec9210c965cc920e', '97b6b97bd19801ec95f8c965cc920f', + '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd197c36c9210c9274c91aa', + '97b6b97bd19801ec95f8c965cc920e', '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', + '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec95f8c965cc920e', '97bcf97c3598082c95f8e1cfcc920f', + '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', + '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf97c359801ec95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd097bd07f595b0b6fc920fb0722', + '9778397bd097c36b0b6fc9210c8dc2', '9778397bd19801ec9210c9274c920e', '97b6b97bd19801ec95f8c965cc920f', + '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e', + '97b6b97bd19801ec95f8c965cc920f', '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', + '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bd07f1487f595b0b0bc920fb0722', + '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f531b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf7f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', + '9778397bd097c36b0b6fc9210c91aa', '97b6b97bd197c36c9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e', + '97b6b7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', + '9778397bd097c36b0b70c9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b7f0e47f531b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', + '9778397bd097c36b0b6fc9210c91aa', '97b6b7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '977837f0e37f149b0723b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c35b0b6fc9210c8dc2', + '977837f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc9210c8dc2', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '977837f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', + '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd', + '7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', + '977837f0e37f14998082b0723b06bd', '7f07e7f0e37f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f595b0b0bb0b6fb0722', '7f0e37f0e37f14898082b0723b02d5', + '7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f531b0b0bb0b6fb0722', + '7f0e37f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e37f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35', + '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f149b0723b0787b0721', + '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0723b06bd', + '7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', '7f0e37f0e366aa89801eb072297c35', + '7ec967f0e37f14998082b0723b06bd', '7f07e7f0e37f14998083b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', + '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14898082b0723b02d5', '7f07e7f0e37f14998082b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66aa89801e9808297c35', '665f67f0e37f14898082b0723b02d5', + '7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66a449801e9808297c35', + '665f67f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e36665b66a449801e9808297c35', '665f67f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', '7f0e26665b66a449801e9808297c35', '665f67f0e37f1489801eb072297c35', + '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722' + ], + + /** + * 数字转中文速查表 + * @Array Of Property + * @trans ['日','一','二','三','四','五','六','七','八','九','十'] + * @return Cn string + */ + nStr1: ['\u65e5', '\u4e00', '\u4e8c', '\u4e09', '\u56db', '\u4e94', '\u516d', '\u4e03', '\u516b', '\u4e5d', + '\u5341' + ], + + /** + * 日期转农历称呼速查表 + * @Array Of Property + * @trans ['初','十','廿','卅'] + * @return Cn string + */ + nStr2: ['\u521d', '\u5341', '\u5eff', '\u5345'], + + /** + * 月份转农历称呼速查表 + * @Array Of Property + * @trans ['正','一','二','三','四','五','六','七','八','九','十','冬','腊'] + * @return Cn string + */ + nStr3: ['\u6b63', '\u4e8c', '\u4e09', '\u56db', '\u4e94', '\u516d', '\u4e03', '\u516b', '\u4e5d', '\u5341', + '\u51ac', + '\u814a' + ], + + /** + * 返回农历y年一整年的总天数 + * @param lunar Year + * @return Number + * @eg:var count = calendar.lYearDays(1987) ;//count=387 + */ + lYearDays: function(y) { + var i; + var sum = 348 + for (i = 0x8000; i > 0x8; i >>= 1) { + sum += (this.lunarInfo[y - 1900] & i) ? 1 : 0 + } + return (sum + this.leapDays(y)) + }, + + /** + * 返回农历y年闰月是哪个月;若y年没有闰月 则返回0 + * @param lunar Year + * @return Number (0-12) + * @eg:var leapMonth = calendar.leapMonth(1987) ;//leapMonth=6 + */ + leapMonth: function(y) { // 闰字编码 \u95f0 + return (this.lunarInfo[y - 1900] & 0xf) + }, + + /** + * 返回农历y年闰月的天数 若该年没有闰月则返回0 + * @param lunar Year + * @return Number (0、29、30) + * @eg:var leapMonthDay = calendar.leapDays(1987) ;//leapMonthDay=29 + */ + leapDays: function(y) { + if (this.leapMonth(y)) { + return ((this.lunarInfo[y - 1900] & 0x10000) ? 30 : 29) + } + return (0) + }, + + /** + * 返回农历y年m月(非闰月)的总天数,计算m为闰月时的天数请使用leapDays方法 + * @param lunar Year + * @return Number (-1、29、30) + * @eg:var MonthDay = calendar.monthDays(1987,9) ;//MonthDay=29 + */ + monthDays: function(y, m) { + if (m > 12 || m < 1) { + return -1 + } // 月份参数从1至12,参数错误返回-1 + return ((this.lunarInfo[y - 1900] & (0x10000 >> m)) ? 30 : 29) + }, + + /** + * 返回公历(!)y年m月的天数 + * @param solar Year + * @return Number (-1、28、29、30、31) + * @eg:var solarMonthDay = calendar.leapDays(1987) ;//solarMonthDay=30 + */ + solarDays: function(y, m) { + if (m > 12 || m < 1) { + return -1 + } // 若参数错误 返回-1 + var ms = m - 1 + if (ms == 1) { // 2月份的闰平规律测算后确认返回28或29 + return (((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0)) ? 29 : 28) + } else { + return (this.solarMonth[ms]) + } + }, + + /** + * 农历年份转换为干支纪年 + * @param lYear 农历年的年份数 + * @return Cn string + */ + toGanZhiYear: function(lYear) { + var ganKey = (lYear - 3) % 10 + var zhiKey = (lYear - 3) % 12 + if (ganKey == 0) ganKey = 10 // 如果余数为0则为最后一个天干 + if (zhiKey == 0) zhiKey = 12 // 如果余数为0则为最后一个地支 + return this.Gan[ganKey - 1] + this.Zhi[zhiKey - 1] + }, + + /** + * 公历月、日判断所属星座 + * @param cMonth [description] + * @param cDay [description] + * @return Cn string + */ + toAstro: function(cMonth, cDay) { + var s = + '\u9b54\u7faf\u6c34\u74f6\u53cc\u9c7c\u767d\u7f8a\u91d1\u725b\u53cc\u5b50\u5de8\u87f9\u72ee\u5b50\u5904\u5973\u5929\u79e4\u5929\u874e\u5c04\u624b\u9b54\u7faf' + var arr = [20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22] + return s.substr(cMonth * 2 - (cDay < arr[cMonth - 1] ? 2 : 0), 2) + '\u5ea7' // 座 + }, + + /** + * 传入offset偏移量返回干支 + * @param offset 相对甲子的偏移量 + * @return Cn string + */ + toGanZhi: function(offset) { + return this.Gan[offset % 10] + this.Zhi[offset % 12] + }, + + /** + * 传入公历(!)y年获得该年第n个节气的公历日期 + * @param y公历年(1900-2100);n二十四节气中的第几个节气(1~24);从n=1(小寒)算起 + * @return day Number + * @eg:var _24 = calendar.getTerm(1987,3) ;//_24=4;意即1987年2月4日立春 + */ + getTerm: function(y, n) { + if (y < 1900 || y > 2100) { + return -1 + } + if (n < 1 || n > 24) { + return -1 + } + var _table = this.sTermInfo[y - 1900] + var _info = [ + parseInt('0x' + _table.substr(0, 5)).toString(), + parseInt('0x' + _table.substr(5, 5)).toString(), + parseInt('0x' + _table.substr(10, 5)).toString(), + parseInt('0x' + _table.substr(15, 5)).toString(), + parseInt('0x' + _table.substr(20, 5)).toString(), + parseInt('0x' + _table.substr(25, 5)).toString() + ] + var _calday = [ + _info[0].substr(0, 1), + _info[0].substr(1, 2), + _info[0].substr(3, 1), + _info[0].substr(4, 2), + + _info[1].substr(0, 1), + _info[1].substr(1, 2), + _info[1].substr(3, 1), + _info[1].substr(4, 2), + + _info[2].substr(0, 1), + _info[2].substr(1, 2), + _info[2].substr(3, 1), + _info[2].substr(4, 2), + + _info[3].substr(0, 1), + _info[3].substr(1, 2), + _info[3].substr(3, 1), + _info[3].substr(4, 2), + + _info[4].substr(0, 1), + _info[4].substr(1, 2), + _info[4].substr(3, 1), + _info[4].substr(4, 2), + + _info[5].substr(0, 1), + _info[5].substr(1, 2), + _info[5].substr(3, 1), + _info[5].substr(4, 2) + ] + return parseInt(_calday[n - 1]) + }, + + /** + * 传入农历数字月份返回汉语通俗表示法 + * @param lunar month + * @return Cn string + * @eg:var cnMonth = calendar.toChinaMonth(12) ;//cnMonth='腊月' + */ + toChinaMonth: function(m) { // 月 => \u6708 + if (m > 12 || m < 1) { + return -1 + } // 若参数错误 返回-1 + var s = this.nStr3[m - 1] + s += '\u6708' // 加上月字 + return s + }, + + /** + * 传入农历日期数字返回汉字表示法 + * @param lunar day + * @return Cn string + * @eg:var cnDay = calendar.toChinaDay(21) ;//cnMonth='廿一' + */ + toChinaDay: function(d) { // 日 => \u65e5 + var s + switch (d) { + case 10: + s = '\u521d\u5341'; + break + case 20: + s = '\u4e8c\u5341'; + break + break + case 30: + s = '\u4e09\u5341'; + break + break + default: + s = this.nStr2[Math.floor(d / 10)] + s += this.nStr1[d % 10] + } + return (s) + }, + + /** + * 年份转生肖[!仅能大致转换] => 精确划分生肖分界线是“立春” + * @param y year + * @return Cn string + * @eg:var animal = calendar.getAnimal(1987) ;//animal='兔' + */ + getAnimal: function(y) { + return this.Animals[(y - 4) % 12] + }, + + /** + * 传入阳历年月日获得详细的公历、农历object信息 <=>JSON + * @param y solar year + * @param m solar month + * @param d solar day + * @return JSON object + * @eg:console.log(calendar.solar2lunar(1987,11,01)); + */ + solar2lunar: function(y, m, d) { // 参数区间1900.1.31~2100.12.31 + // 年份限定、上限 + if (y < 1900 || y > 2100) { + return -1 // undefined转换为数字变为NaN + } + // 公历传参最下限 + if (y == 1900 && m == 1 && d < 31) { + return -1 + } + // 未传参 获得当天 + if (!y) { + var objDate = new Date() + } else { + var objDate = new Date(y, parseInt(m) - 1, d) + } + var i; + var leap = 0; + var temp = 0 + // 修正ymd参数 + var y = objDate.getFullYear() + var m = objDate.getMonth() + 1 + var d = objDate.getDate() + var offset = (Date.UTC(objDate.getFullYear(), objDate.getMonth(), objDate.getDate()) - Date.UTC(1900, 0, + 31)) / + 86400000 + for (i = 1900; i < 2101 && offset > 0; i++) { + temp = this.lYearDays(i) + offset -= temp + } + if (offset < 0) { + offset += temp; + i-- + } + + // 是否今天 + var isTodayObj = new Date() + var isToday = false + if (isTodayObj.getFullYear() == y && isTodayObj.getMonth() + 1 == m && isTodayObj.getDate() == d) { + isToday = true + } + // 星期几 + var nWeek = objDate.getDay() + var cWeek = this.nStr1[nWeek] + // 数字表示周几顺应天朝周一开始的惯例 + if (nWeek == 0) { + nWeek = 7 + } + // 农历年 + var year = i + var leap = this.leapMonth(i) // 闰哪个月 + var isLeap = false + + // 效验闰月 + for (i = 1; i < 13 && offset > 0; i++) { + // 闰月 + if (leap > 0 && i == (leap + 1) && isLeap == false) { + --i + isLeap = true; + temp = this.leapDays(year) // 计算农历闰月天数 + } else { + temp = this.monthDays(year, i) // 计算农历普通月天数 + } + // 解除闰月 + if (isLeap == true && i == (leap + 1)) { + isLeap = false + } + offset -= temp + } + // 闰月导致数组下标重叠取反 + if (offset == 0 && leap > 0 && i == leap + 1) { + if (isLeap) { + isLeap = false + } else { + isLeap = true; + --i + } + } + if (offset < 0) { + offset += temp; + --i + } + // 农历月 + var month = i + // 农历日 + var day = offset + 1 + // 天干地支处理 + var sm = m - 1 + var gzY = this.toGanZhiYear(year) + + // 当月的两个节气 + // bugfix-2017-7-24 11:03:38 use lunar Year Param `y` Not `year` + var firstNode = this.getTerm(y, (m * 2 - 1)) // 返回当月「节」为几日开始 + var secondNode = this.getTerm(y, (m * 2)) // 返回当月「节」为几日开始 + + // 依据12节气修正干支月 + var gzM = this.toGanZhi((y - 1900) * 12 + m + 11) + if (d >= firstNode) { + gzM = this.toGanZhi((y - 1900) * 12 + m + 12) + } + + // 传入的日期的节气与否 + var isTerm = false + var Term = null + if (firstNode == d) { + isTerm = true + Term = this.solarTerm[m * 2 - 2] + } + if (secondNode == d) { + isTerm = true + Term = this.solarTerm[m * 2 - 1] + } + // 日柱 当月一日与 1900/1/1 相差天数 + var dayCyclical = Date.UTC(y, sm, 1, 0, 0, 0, 0) / 86400000 + 25567 + 10 + var gzD = this.toGanZhi(dayCyclical + d - 1) + // 该日期所属的星座 + var astro = this.toAstro(m, d) + + return { + 'lYear': year, + 'lMonth': month, + 'lDay': day, + 'Animal': this.getAnimal(year), + 'IMonthCn': (isLeap ? '\u95f0' : '') + this.toChinaMonth(month), + 'IDayCn': this.toChinaDay(day), + 'cYear': y, + 'cMonth': m, + 'cDay': d, + 'gzYear': gzY, + 'gzMonth': gzM, + 'gzDay': gzD, + 'isToday': isToday, + 'isLeap': isLeap, + 'nWeek': nWeek, + 'ncWeek': '\u661f\u671f' + cWeek, + 'isTerm': isTerm, + 'Term': Term, + 'astro': astro + } + }, + + /** + * 传入农历年月日以及传入的月份是否闰月获得详细的公历、农历object信息 <=>JSON + * @param y lunar year + * @param m lunar month + * @param d lunar day + * @param isLeapMonth lunar month is leap or not.[如果是农历闰月第四个参数赋值true即可] + * @return JSON object + * @eg:console.log(calendar.lunar2solar(1987,9,10)); + */ + lunar2solar: function(y, m, d, isLeapMonth) { // 参数区间1900.1.31~2100.12.1 + var isLeapMonth = !!isLeapMonth + var leapOffset = 0 + var leapMonth = this.leapMonth(y) + var leapDay = this.leapDays(y) + if (isLeapMonth && (leapMonth != m)) { + return -1 + } // 传参要求计算该闰月公历 但该年得出的闰月与传参的月份并不同 + if (y == 2100 && m == 12 && d > 1 || y == 1900 && m == 1 && d < 31) { + return -1 + } // 超出了最大极限值 + var day = this.monthDays(y, m) + var _day = day + // bugFix 2016-9-25 + // if month is leap, _day use leapDays method + if (isLeapMonth) { + _day = this.leapDays(y, m) + } + if (y < 1900 || y > 2100 || d > _day) { + return -1 + } // 参数合法性效验 + + // 计算农历的时间差 + var offset = 0 + for (var i = 1900; i < y; i++) { + offset += this.lYearDays(i) + } + var leap = 0; + var isAdd = false + for (var i = 1; i < m; i++) { + leap = this.leapMonth(y) + if (!isAdd) { // 处理闰月 + if (leap <= i && leap > 0) { + offset += this.leapDays(y); + isAdd = true + } + } + offset += this.monthDays(y, i) + } + // 转换闰月农历 需补充该年闰月的前一个月的时差 + if (isLeapMonth) { + offset += day + } + // 1900年农历正月一日的公历时间为1900年1月30日0时0分0秒(该时间也是本农历的最开始起始点) + var stmap = Date.UTC(1900, 1, 30, 0, 0, 0) + var calObj = new Date((offset + d - 31) * 86400000 + stmap) + var cY = calObj.getUTCFullYear() + var cM = calObj.getUTCMonth() + 1 + var cD = calObj.getUTCDate() + + return this.solar2lunar(cY, cM, cD) + } +} + +export default calendar diff --git a/components/uni-calendar/uni-calendar-item.vue b/components/uni-calendar/uni-calendar-item.vue new file mode 100644 index 0000000..ae16c7f --- /dev/null +++ b/components/uni-calendar/uni-calendar-item.vue @@ -0,0 +1,193 @@ + ++ + + + + + diff --git a/components/uni-calendar/uni-calendar.vue b/components/uni-calendar/uni-calendar.vue new file mode 100644 index 0000000..6234826 --- /dev/null +++ b/components/uni-calendar/uni-calendar.vue @@ -0,0 +1,476 @@ + ++ ++ + {{ weeks.date }} + ++ + {{ weeks.isDay ? '今天' : weeks.lunar.IDayCn === '初一' ? weeks.lunar.IMonthCn : weeks.lunar.IDayCn }} + ++ {{ weeks.extraInfo.info }} + ++ + + + + + diff --git a/components/uni-calendar/util.js b/components/uni-calendar/util.js new file mode 100644 index 0000000..4b423f2 --- /dev/null +++ b/components/uni-calendar/util.js @@ -0,0 +1,354 @@ +import CALENDAR from './calendar.js' + +class Calendar { + constructor({ + date, + selected, + startDate, + endDate, + range + } = {}) { + // 当前日期 + this.date = this.getDate(new Date()) // 当前初入日期 + // 打点信息 + this.selected = selected || []; + // 范围开始 + this.startDate = startDate + // 范围结束 + this.endDate = endDate + this.range = range + // 多选状态 + this.cleanMultipleStatus() + // 每周日期 + this.weeks = {} + // this._getWeek(this.date.fullDate) + } + /** + * 设置日期 + * @param {Object} date + */ + setDate(date) { + this.selectDate = this.getDate(date) + this._getWeek(this.selectDate.fullDate) + } + + /** + * 清理多选状态 + */ + cleanMultipleStatus() { + this.multipleStatus = { + before: '', + after: '', + data: [] + } + } + + /** + * 重置开始日期 + */ + resetSatrtDate(startDate) { + // 范围开始 + this.startDate = startDate + + } + + /** + * 重置结束日期 + */ + resetEndDate(endDate) { + // 范围结束 + this.endDate = endDate + } + + /** + * 获取任意时间 + */ + getDate(date, AddDayCount = 0, str = 'day') { + if (!date) { + date = new Date() + } + if (typeof date !== 'object') { + date = date.replace(/-/g, '/') + } + const dd = new Date(date) + switch (str) { + case 'day': + dd.setDate(dd.getDate() + AddDayCount) // 获取AddDayCount天后的日期 + break + case 'month': + if (dd.getDate() === 31) { + dd.setDate(dd.getDate() + AddDayCount) + } else { + dd.setMonth(dd.getMonth() + AddDayCount) // 获取AddDayCount天后的日期 + } + break + case 'year': + dd.setFullYear(dd.getFullYear() + AddDayCount) // 获取AddDayCount天后的日期 + break + } + const y = dd.getFullYear() + const m = dd.getMonth() + 1 < 10 ? '0' + (dd.getMonth() + 1) : dd.getMonth() + 1 // 获取当前月份的日期,不足10补0 + const d = dd.getDate() < 10 ? '0' + dd.getDate() : dd.getDate() // 获取当前几号,不足10补0 + return { + fullDate: y + '-' + m + '-' + d, + year: y, + month: m, + date: d, + day: dd.getDay() + } + } + + + /** + * 获取上月剩余天数 + */ + _getLastMonthDays(firstDay, full) { + let dateArr = [] + for (let i = firstDay; i > 0; i--) { + const beforeDate = new Date(full.year, full.month - 1, -i + 1).getDate() + dateArr.push({ + date: beforeDate, + month: full.month - 1, + lunar: this.getlunar(full.year, full.month - 1, beforeDate), + disable: true + }) + } + return dateArr + } + /** + * 获取本月天数 + */ + _currentMonthDys(dateData, full) { + let dateArr = [] + let fullDate = this.date.fullDate + for (let i = 1; i <= dateData; i++) { + let isinfo = false + let nowDate = full.year + '-' + (full.month < 10 ? + full.month : full.month) + '-' + (i < 10 ? + '0' + i : i) + // 是否今天 + let isDay = fullDate === nowDate + // 获取打点信息 + let info = this.selected && this.selected.find((item) => { + if (this.dateEqual(nowDate, item.date)) { + return item + } + }) + + // 日期禁用 + let disableBefore = true + let disableAfter = true + if (this.startDate) { + let dateCompBefore = this.dateCompare(this.startDate, fullDate) + disableBefore = this.dateCompare(dateCompBefore ? this.startDate : fullDate, nowDate) + } + + if (this.endDate) { + let dateCompAfter = this.dateCompare(fullDate, this.endDate) + disableAfter = this.dateCompare(nowDate, dateCompAfter ? this.endDate : fullDate) + } + let multiples = this.multipleStatus.data + let checked = false + let multiplesStatus = -1 + if (this.range) { + if (multiples) { + multiplesStatus = multiples.findIndex((item) => { + return this.dateEqual(item, nowDate) + }) + } + if (multiplesStatus !== -1) { + checked = true + } + } + let data = { + fullDate: nowDate, + year: full.year, + date: i, + multiple: this.range ? checked : false, + beforeMultiple: this.dateEqual(this.multipleStatus.before, nowDate), + afterMultiple: this.dateEqual(this.multipleStatus.after, nowDate), + month: full.month, + lunar: this.getlunar(full.year, full.month, i), + disable: !disableBefore || !disableAfter, + isDay + } + if (info) { + data.extraInfo = info + } + + dateArr.push(data) + } + return dateArr + } + /** + * 获取下月天数 + */ + _getNextMonthDays(surplus, full) { + let dateArr = [] + for (let i = 1; i < surplus + 1; i++) { + dateArr.push({ + date: i, + month: Number(full.month) + 1, + lunar: this.getlunar(full.year, Number(full.month) + 1, i), + disable: true + }) + } + return dateArr + } + + /** + * 获取当前日期详情 + * @param {Object} date + */ + getInfo(date) { + if (!date) { + date = new Date() + } + const dateInfo = this.canlender.find(item => item.fullDate === this.getDate(date).fullDate) + return dateInfo + } + + /** + * 比较时间大小 + */ + dateCompare(startDate, endDate) { + // 计算截止时间 + startDate = new Date(startDate.replace('-', '/').replace('-', '/')) + // 计算详细项的截止时间 + endDate = new Date(endDate.replace('-', '/').replace('-', '/')) + if (startDate <= endDate) { + return true + } else { + return false + } + } + + /** + * 比较时间是否相等 + */ + dateEqual(before, after) { + // 计算截止时间 + before = new Date(before.replace('-', '/').replace('-', '/')) + // 计算详细项的截止时间 + after = new Date(after.replace('-', '/').replace('-', '/')) + if (before.getTime() - after.getTime() === 0) { + return true + } else { + return false + } + } + + + /** + * 获取日期范围内所有日期 + * @param {Object} begin + * @param {Object} end + */ + geDateAll(begin, end) { + var arr = [] + var ab = begin.split('-') + var ae = end.split('-') + var db = new Date() + db.setFullYear(ab[0], ab[1] - 1, ab[2]) + var de = new Date() + de.setFullYear(ae[0], ae[1] - 1, ae[2]) + var unixDb = db.getTime() - 24 * 60 * 60 * 1000 + var unixDe = de.getTime() - 24 * 60 * 60 * 1000 + for (var k = unixDb; k <= unixDe;) { + k = k + 24 * 60 * 60 * 1000 + arr.push(this.getDate(new Date(parseInt(k))).fullDate) + } + return arr + } + /** + * 计算阴历日期显示 + */ + getlunar(year, month, date) { + return CALENDAR.solar2lunar(year, month, date) + } + /** + * 设置打点 + */ + setSelectInfo(data, value) { + this.selected = value + this._getWeek(data) + } + + /** + * 获取多选状态 + */ + setMultiple(fullDate) { + let { + before, + after + } = this.multipleStatus + + if (!this.range) return + if (before && after) { + this.multipleStatus.before = '' + this.multipleStatus.after = '' + this.multipleStatus.data = [] + } else { + if (!before) { + this.multipleStatus.before = fullDate + } else { + this.multipleStatus.after = fullDate + if (this.dateCompare(this.multipleStatus.before, this.multipleStatus.after)) { + this.multipleStatus.data = this.geDateAll(this.multipleStatus.before, this.multipleStatus + .after); + } else { + this.multipleStatus.data = this.geDateAll(this.multipleStatus.after, this.multipleStatus + .before); + } + } + } + this._getWeek(fullDate) + } + + /** + * 获取每周数据 + * @param {Object} dateData + */ + _getWeek(dateData) { + const { + fullDate, + year, + month, + date, + day + } = this.getDate(dateData) + let firstDay = new Date(year, month - 1, 1).getDay() + let currentDay = new Date(year, month, 0).getDate() + let dates = { + lastMonthDays: this._getLastMonthDays(firstDay, this.getDate(dateData)), // 上个月末尾几天 + currentMonthDys: this._currentMonthDys(currentDay, this.getDate(dateData)), // 本月天数 + nextMonthDays: [], // 下个月开始几天 + weeks: [] + } + let canlender = [] + const surplus = 42 - (dates.lastMonthDays.length + dates.currentMonthDys.length) + dates.nextMonthDays = this._getNextMonthDays(surplus, this.getDate(dateData)) + canlender = canlender.concat(dates.lastMonthDays, dates.currentMonthDys, dates.nextMonthDays) + let weeks = {} + // 拼接数组 上个月开始几天 + 本月天数+ 下个月开始几天 + for (let i = 0; i < canlender.length; i++) { + if (i % 7 === 0) { + weeks[parseInt(i / 7)] = new Array(7) + } + weeks[parseInt(i / 7)][i % 7] = canlender[i] + } + this.canlender = canlender + this.weeks = weeks + } + + //静态方法 + // static init(date) { + // if (!this.instance) { + // this.instance = new Calendar(date); + // } + // return this.instance; + // } +} + + +export default Calendar diff --git a/components/uni-count-down/uni-count-down.vue b/components/uni-count-down/uni-count-down.vue new file mode 100644 index 0000000..67ee9f2 --- /dev/null +++ b/components/uni-count-down/uni-count-down.vue @@ -0,0 +1,254 @@ + ++ + ++ ++ 取消 + 确定 + ++ + ++ + +{{ (nowDate.year || '') + '年' + (nowDate.month || '') + '月' }} ++ + ++ + ++ +{{ nowDate.month }} ++ ++ 日 + 一 + 二 + 三 + 四 + 五 + 六 + ++ ++ + + + + diff --git a/components/uni-drawer/uni-drawer.vue b/components/uni-drawer/uni-drawer.vue new file mode 100644 index 0000000..ed5e1d2 --- /dev/null +++ b/components/uni-drawer/uni-drawer.vue @@ -0,0 +1,147 @@ + ++ {{ d }} + +{{ showColon ? '天' : '天' }} ++ {{ h }} + +{{ showColon ? ':' : '时' }} ++ {{ i }} + +{{ showColon ? ':' : '分' }} ++ {{ s }} + +秒 ++ + + + + + diff --git a/components/uni-grid-item/uni-grid-item.vue b/components/uni-grid-item/uni-grid-item.vue new file mode 100644 index 0000000..132ba08 --- /dev/null +++ b/components/uni-grid-item/uni-grid-item.vue @@ -0,0 +1,225 @@ + ++ + + + + + + + diff --git a/components/uni-grid/uni-grid.vue b/components/uni-grid/uni-grid.vue new file mode 100644 index 0000000..ab35835 --- /dev/null +++ b/components/uni-grid/uni-grid.vue @@ -0,0 +1,94 @@ + ++ ++ + ++ + ++ + + + + + + + diff --git a/components/uni-icons/icons.js b/components/uni-icons/icons.js new file mode 100644 index 0000000..1f5a778 --- /dev/null +++ b/components/uni-icons/icons.js @@ -0,0 +1,96 @@ +export default { + 'contact': '\ue100', + 'person': '\ue101', + 'personadd': '\ue102', + 'contact-filled': '\ue130', + 'person-filled': '\ue131', + 'personadd-filled': '\ue132', + 'phone': '\ue200', + 'email': '\ue201', + 'chatbubble': '\ue202', + 'chatboxes': '\ue203', + 'phone-filled': '\ue230', + 'email-filled': '\ue231', + 'chatbubble-filled': '\ue232', + 'chatboxes-filled': '\ue233', + 'weibo': '\ue260', + 'weixin': '\ue261', + 'pengyouquan': '\ue262', + 'chat': '\ue263', + 'qq': '\ue264', + 'videocam': '\ue300', + 'camera': '\ue301', + 'mic': '\ue302', + 'location': '\ue303', + 'mic-filled': '\ue332', + 'speech': '\ue332', + 'location-filled': '\ue333', + 'micoff': '\ue360', + 'image': '\ue363', + 'map': '\ue364', + 'compose': '\ue400', + 'trash': '\ue401', + 'upload': '\ue402', + 'download': '\ue403', + 'close': '\ue404', + 'redo': '\ue405', + 'undo': '\ue406', + 'refresh': '\ue407', + 'star': '\ue408', + 'plus': '\ue409', + 'minus': '\ue410', + 'circle': '\ue411', + 'checkbox': '\ue411', + 'close-filled': '\ue434', + 'clear': '\ue434', + 'refresh-filled': '\ue437', + 'star-filled': '\ue438', + 'plus-filled': '\ue439', + 'minus-filled': '\ue440', + 'circle-filled': '\ue441', + 'checkbox-filled': '\ue442', + 'closeempty': '\ue460', + 'refreshempty': '\ue461', + 'reload': '\ue462', + 'starhalf': '\ue463', + 'spinner': '\ue464', + 'spinner-cycle': '\ue465', + 'search': '\ue466', + 'plusempty': '\ue468', + 'forward': '\ue470', + 'back': '\ue471', + 'left-nav': '\ue471', + 'checkmarkempty': '\ue472', + 'home': '\ue500', + 'navigate': '\ue501', + 'gear': '\ue502', + 'paperplane': '\ue503', + 'info': '\ue504', + 'help': '\ue505', + 'locked': '\ue506', + 'more': '\ue507', + 'flag': '\ue508', + 'home-filled': '\ue530', + 'gear-filled': '\ue532', + 'info-filled': '\ue534', + 'help-filled': '\ue535', + 'more-filled': '\ue537', + 'settings': '\ue560', + 'list': '\ue562', + 'bars': '\ue563', + 'loop': '\ue565', + 'paperclip': '\ue567', + 'eye': '\ue568', + 'arrowup': '\ue580', + 'arrowdown': '\ue581', + 'arrowleft': '\ue582', + 'arrowright': '\ue583', + 'arrowthinup': '\ue584', + 'arrowthindown': '\ue585', + 'arrowthinleft': '\ue586', + 'arrowthinright': '\ue587', + 'pulldown': '\ue588', + 'closefill': '\ue589', + 'sound': '\ue590', + 'scan': '\ue612' +} diff --git a/components/uni-icons/uni-icons.vue b/components/uni-icons/uni-icons.vue new file mode 100644 index 0000000..bbf6631 --- /dev/null +++ b/components/uni-icons/uni-icons.vue @@ -0,0 +1,63 @@ + ++ {{ icons[type] }} + + + + + diff --git a/components/uni-nav-bar/uni-nav-bar.vue b/components/uni-nav-bar/uni-nav-bar.vue new file mode 100644 index 0000000..20e7486 --- /dev/null +++ b/components/uni-nav-bar/uni-nav-bar.vue @@ -0,0 +1,221 @@ + ++ + + + + + diff --git a/components/uni-number-box/uni-number-box.vue b/components/uni-number-box/uni-number-box.vue new file mode 100644 index 0000000..e07c085 --- /dev/null +++ b/components/uni-number-box/uni-number-box.vue @@ -0,0 +1,244 @@ + ++ ++ + ++ ++ + +{{ leftText }} ++ + ++ + +{{ title }} ++ + ++ + + +{{ rightText }} ++ + ++ + + + + + + + + + + + + + diff --git a/components/uni-popup/uni-popup-sku-new.vue b/components/uni-popup/uni-popup-sku-new.vue new file mode 100644 index 0000000..9d61138 --- /dev/null +++ b/components/uni-popup/uni-popup-sku-new.vue @@ -0,0 +1,228 @@ + ++ + + + + diff --git a/components/uni-popup/uni-popup-sku.vue b/components/uni-popup/uni-popup-sku.vue new file mode 100644 index 0000000..b67761f --- /dev/null +++ b/components/uni-popup/uni-popup-sku.vue @@ -0,0 +1,224 @@ + ++ + ++ + ++ + + + + + diff --git a/components/uni-popup/uni-popup.vue b/components/uni-popup/uni-popup.vue new file mode 100644 index 0000000..c54d3f3 --- /dev/null +++ b/components/uni-popup/uni-popup.vue @@ -0,0 +1,236 @@ + ++ + ++ + ++ + + + + + diff --git a/components/uni-status-bar/uni-status-bar.vue b/components/uni-status-bar/uni-status-bar.vue new file mode 100644 index 0000000..da1f445 --- /dev/null +++ b/components/uni-status-bar/uni-status-bar.vue @@ -0,0 +1,23 @@ + ++ + ++ + ++ + + + + + diff --git a/components/uni-tag/uni-tag.vue b/components/uni-tag/uni-tag.vue new file mode 100644 index 0000000..564013a --- /dev/null +++ b/components/uni-tag/uni-tag.vue @@ -0,0 +1,159 @@ + + + {{ text }} + + + + + + diff --git a/components/xiao-star-component/xiao-star-component.vue b/components/xiao-star-component/xiao-star-component.vue new file mode 100644 index 0000000..112cdcf --- /dev/null +++ b/components/xiao-star-component/xiao-star-component.vue @@ -0,0 +1,239 @@ + ++ + + + + + + diff --git a/components/yuyue-date/yuyue-date.js b/components/yuyue-date/yuyue-date.js new file mode 100644 index 0000000..bfe777e --- /dev/null +++ b/components/yuyue-date/yuyue-date.js @@ -0,0 +1,98 @@ +//字符串拼接 +export function strFormat(str) { + return str < 10 ? `0${str}` : str +} +// 获取当前时间 +export function currentTime() { + const myDate = new Date(); + const year = myDate.getFullYear() + const m = myDate.getMonth() + 1; + const d = myDate.getDate(); + // const date = year + '-' + strFormat(m) + '-' + strFormat(d); // 隐藏年 + const date = strFormat(m) + '-' + strFormat(d); + + const hour = myDate.getHours() + const min = myDate.getMinutes() + const secon = myDate.getSeconds() + const time = strFormat(hour) + ':' + strFormat(min) + ':' + strFormat(secon); + return { + year, + date, + time + } +} + +//时间戳转日期 +export function timeStamp(time) { + const dates = new Date(time) + const year = dates.getFullYear() + const month = dates.getMonth() + 1 + const date = dates.getDate() + const day = dates.getDay() + const hour = dates.getHours() + const min = dates.getMinutes() + const days = ['日', '一', '二', '三', '四', '五', '六'] + return { + allDate: `${year}/${strFormat(month)}/${strFormat(date)}`, + date: `${strFormat(month)}-${strFormat(date)}`, //返回的日期 07-01,${strFormat(year)}-${strFormat(month)}-${strFormat(date)} + day: `周${days[day]}`, //返回的礼拜天数 星期一 + hour: strFormat(hour) + ':' + strFormat(min) // + ':00' //返回的时钟 08:00 + } +} + +//获取最近7天的日期和礼拜天数 +export function initData(appointedDay = '') { + const time = [] + const date = appointedDay ? new Date(appointedDay) : new Date() + + const now = date.getTime() //获取当前日期的时间戳 + let timeStr = 3600 * 24 * 1000 //一天的时间戳 + let obj = { + 0: "今天", + 1: "明天", + 2: "后天" + } + for (let i = 0; i < 7; i++) { + const timeObj = {} + timeObj.date = timeStamp(now + timeStr * i).date //保存日期 + timeObj.timeStamp = now + timeStr * i //保存时间戳 + timeObj.week = appointedDay == '' ? (obj[i] ?? timeStamp(now + timeStr * i).day) : timeStamp(now + timeStr * i) + .day + time.push(timeObj) + } + return time +} + +//时间数组 +export function initTime(startTime = '09:00', endTime = '18:30', timeInterval = 1) { + const time = [] + const date = timeStamp(Date.now()).allDate + const startDate = `${date} ${startTime}` + const endDate = `${date} ${endTime}` + const startTimeStamp = new Date(startDate).getTime() + const endTimeStamp = new Date(endDate).getTime() + const timeStr = 3600 * 1000 * timeInterval + for (let i = startTimeStamp; i <= endTimeStamp; i = i + timeStr) { + const timeObj = {} + timeObj.time = timeStamp(i).hour + timeObj.disable = false + time.push(timeObj) + } + return time +} + +export function weekDate(){ + var now = new Date(); //当前日期 + var nowDayOfWeek = now.getDay(); //今天本周的第几天 + var nowDay = now.getDate(); //当前日 + var nowMonth = now.getMonth(); //当前月 + var nowYear = now.getYear(); //当前年 + + var weekStartDate = new Date(nowYear, nowMonth, nowDay - nowDayOfWeek + 1); + var weekEndDate = new Date(nowYear, nowMonth, nowDay + (7 - nowDayOfWeek)); + + var arr = []; + arr[0] = strFormat(weekStartDate.getMonth()+1) + '-' + strFormat(weekStartDate.getDate()); + arr[1] = strFormat(weekEndDate.getMonth()+1) + '-' + strFormat(weekEndDate.getDate()); + return arr; +} diff --git a/components/yuyue-date/yuyue-date.scss b/components/yuyue-date/yuyue-date.scss new file mode 100644 index 0000000..7e37727 --- /dev/null +++ b/components/yuyue-date/yuyue-date.scss @@ -0,0 +1,158 @@ +.content { + text-align: center; + height: 100%; + .head { + position: relative; + font-weight: bold; + padding: 32rpx 0 24rpx; + font-size: $font-size-toolbar; + .iconfont { + position: absolute; + right: 20rpx; + } + } + + .container { + view, + text, + image { + box-sizing: border-box; + } + .date-list-wrap { + display: flex; + align-items: center; + border-bottom: 2rpx solid #e6e6e6; + scroll-view { + width: 80%; + white-space: nowrap; + height: 100rpx; + line-height: 100rpx; + background-color: #fff; + position: relative; + .flex-box { + display: inline-block; + width: 25%; + + &.active { + .date-box { + border: none; + .days { + font-weight: bold; + color: #818181; + } + .date { + font-weight: bold; + color: #818181; + } + } + } + .date-box { + color: #909399; + text { + font-size: $font-size-tag; + } + } + } + } + .appointed-day { + flex: 1; + border-left: 2rpx solid #e6e6e6; + .day-box, + .iconfont { + font-size: $font-size-tag; + color: #909399; + } + .iconfont { + margin-left: 4rpx; + } + } + } + .time-box { + padding: 0 12rpx; + display: flex; + flex-wrap: wrap; + overflow: scroll; + background-color: #fff; + height: auto; + .item { + width: 25%; + padding: 0 8rpx; + margin-top: 30rpx; + &-box { + width: 100%; + height: 140rpx; + padding: 0 40rpx; + background: #fff; + color: #333; + border: 2rpx solid #eeeeee; + font-size: $font-size-base; + border-radius: 10rpx; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + &.disable { + background: #f1f3f6 !important; + color: #999 !important; + } + &.active { + background: $base-color; + color:#fff; + // background: #0094D7; + border: 2rpx solid $base-color; + font-weight: bold; + } + .all { + font-size: $font-size-tag; + padding-top: 10rpx; + } + // 自定义样式 + &.diy{ + height: 60rpx; + border-radius: 40rpx; + .all{ + display: none; + } + } + } + } + } + } + + .bottom { + display: flex; + flex-direction: row; + position: fixed; + align-items: center; + bottom: 0; + top: auto; + left: 0; + width: 100%; + background-color: #fff; + box-shadow: 0 -2rpx 20rpx #bcbcbc; + + .show-time { + width: 66%; + height: 100rpx; + line-height: 100rpx; + font-size: $font-size-base; + text-align: left; + margin-left: 40rpx; + } + + .submit-btn { + width: 25%; + height: 70rpx; + line-height: 70rpx; + font-size: $font-size-base; + } + } +} + +.yuyue-date-desc{ + padding-top: 2rpx; + padding-bottom: 4rpx; + font-size: $font-size-tag; + color: $color-sub; + text-align: center; +} diff --git a/components/yuyue-date/yuyue-date.vue b/components/yuyue-date/yuyue-date.vue new file mode 100644 index 0000000..a9cc02b --- /dev/null +++ b/components/yuyue-date/yuyue-date.vue @@ -0,0 +1,406 @@ + ++ + + + + + diff --git a/lang/en-us/common.js b/lang/en-us/common.js new file mode 100644 index 0000000..f9e4173 --- /dev/null +++ b/lang/en-us/common.js @@ -0,0 +1,21 @@ +export const lang = { + + // 底部选项卡 + tabBar: { + home: 'index', + category: 'category', + cart: 'cart', + member: 'member', + }, + + //公共 + common: { + //语言包名称 + name: '英文', + mescrollTextInOffset: 'pull to refresh', + mescrollTextOutOffset: 'Loading...', + mescrollEmpty: "No data available", + goodsRecommendTitle: 'Guess you like', + currencySymbol: '¥' + } +} diff --git a/lang/zh-cn/article/detail.js b/lang/zh-cn/article/detail.js new file mode 100644 index 0000000..2d9ca88 --- /dev/null +++ b/lang/zh-cn/article/detail.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '文章详情' +} diff --git a/lang/zh-cn/article/list.js b/lang/zh-cn/article/list.js new file mode 100644 index 0000000..129277a --- /dev/null +++ b/lang/zh-cn/article/list.js @@ -0,0 +1,5 @@ +export const lang = { + //title为每个页面的标题 + title: '文章列表', + emptyText:"当前暂无文章信息" +} diff --git a/lang/zh-cn/bale/detail.js b/lang/zh-cn/bale/detail.js new file mode 100644 index 0000000..02a0bea --- /dev/null +++ b/lang/zh-cn/bale/detail.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '' +} diff --git a/lang/zh-cn/bale/payment.js b/lang/zh-cn/bale/payment.js new file mode 100644 index 0000000..88657dd --- /dev/null +++ b/lang/zh-cn/bale/payment.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '待付款订单' +} diff --git a/lang/zh-cn/bargain/detail.js b/lang/zh-cn/bargain/detail.js new file mode 100644 index 0000000..c3c6999 --- /dev/null +++ b/lang/zh-cn/bargain/detail.js @@ -0,0 +1,10 @@ +export const lang = { + //title为每个页面的标题 + title: '', + select: '选择', + params: '参数', + service: '商品服务', + allGoods: '全部商品', + image: '图片', + video: '视频', +} diff --git a/lang/zh-cn/bargain/launch.js b/lang/zh-cn/bargain/launch.js new file mode 100644 index 0000000..4a271f2 --- /dev/null +++ b/lang/zh-cn/bargain/launch.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '砍价详情' +} diff --git a/lang/zh-cn/bargain/list.js b/lang/zh-cn/bargain/list.js new file mode 100644 index 0000000..efbd47b --- /dev/null +++ b/lang/zh-cn/bargain/list.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '砍价专区' +} diff --git a/lang/zh-cn/bargain/my_bargain.js b/lang/zh-cn/bargain/my_bargain.js new file mode 100644 index 0000000..bb9b398 --- /dev/null +++ b/lang/zh-cn/bargain/my_bargain.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '我的砍价' +} diff --git a/lang/zh-cn/bargain/payment.js b/lang/zh-cn/bargain/payment.js new file mode 100644 index 0000000..88657dd --- /dev/null +++ b/lang/zh-cn/bargain/payment.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '待付款订单' +} diff --git a/lang/zh-cn/combo/detail.js b/lang/zh-cn/combo/detail.js new file mode 100644 index 0000000..e67f6f4 --- /dev/null +++ b/lang/zh-cn/combo/detail.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '组合套餐' +} diff --git a/lang/zh-cn/combo/payment.js b/lang/zh-cn/combo/payment.js new file mode 100644 index 0000000..88657dd --- /dev/null +++ b/lang/zh-cn/combo/payment.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '待付款订单' +} diff --git a/lang/zh-cn/common.js b/lang/zh-cn/common.js new file mode 100644 index 0000000..f486d80 --- /dev/null +++ b/lang/zh-cn/common.js @@ -0,0 +1,22 @@ +export const lang = { + + // 底部选项卡 + tabBar: { + home: '首页', + category: '分类', + cart: '购物车', + member: '个人中心' + }, + + //公共 + common: { + //语言包名称 + name: '中文', + mescrollTextInOffset: '下拉刷新', + mescrollTextOutOffset: '释放更新', + mescrollEmpty: "暂无相关数据", + goodsRecommendTitle: '猜你喜欢', + currencySymbol: '¥', + submit: '提交' + } +} diff --git a/lang/zh-cn/diy/diy.js b/lang/zh-cn/diy/diy.js new file mode 100644 index 0000000..74eb5f5 --- /dev/null +++ b/lang/zh-cn/diy/diy.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '', +} diff --git a/lang/zh-cn/fenxiao/apply.js b/lang/zh-cn/fenxiao/apply.js new file mode 100644 index 0000000..46bed58 --- /dev/null +++ b/lang/zh-cn/fenxiao/apply.js @@ -0,0 +1,5 @@ +export const lang = { + //title为每个页面的标题 + // title: '分销商申请' + title: '' +} diff --git a/lang/zh-cn/fenxiao/bill.js b/lang/zh-cn/fenxiao/bill.js new file mode 100644 index 0000000..5deadae --- /dev/null +++ b/lang/zh-cn/fenxiao/bill.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '账单' +} diff --git a/lang/zh-cn/fenxiao/follow.js b/lang/zh-cn/fenxiao/follow.js new file mode 100644 index 0000000..7ba4f3f --- /dev/null +++ b/lang/zh-cn/fenxiao/follow.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '我的关注' +} diff --git a/lang/zh-cn/fenxiao/goods_list.js b/lang/zh-cn/fenxiao/goods_list.js new file mode 100644 index 0000000..2c765c5 --- /dev/null +++ b/lang/zh-cn/fenxiao/goods_list.js @@ -0,0 +1,5 @@ +export const lang = { + //title为每个页面的标题 + // title: '分销商品列表', + title: '' +} diff --git a/lang/zh-cn/fenxiao/index.js b/lang/zh-cn/fenxiao/index.js new file mode 100644 index 0000000..3f940bb --- /dev/null +++ b/lang/zh-cn/fenxiao/index.js @@ -0,0 +1,5 @@ +export const lang = { + //title为每个页面的标题 + // title: '分销中心', + title: '' +} diff --git a/lang/zh-cn/fenxiao/level.js b/lang/zh-cn/fenxiao/level.js new file mode 100644 index 0000000..a504074 --- /dev/null +++ b/lang/zh-cn/fenxiao/level.js @@ -0,0 +1,5 @@ +export const lang = { + //title为每个页面的标题 + // title: '分销商等级', + title: '' +} diff --git a/lang/zh-cn/fenxiao/order.js b/lang/zh-cn/fenxiao/order.js new file mode 100644 index 0000000..7db8bb1 --- /dev/null +++ b/lang/zh-cn/fenxiao/order.js @@ -0,0 +1,5 @@ +export const lang = { + //title为每个页面的标题 + // title: '分销订单', + title: '' +} diff --git a/lang/zh-cn/fenxiao/order_detail.js b/lang/zh-cn/fenxiao/order_detail.js new file mode 100644 index 0000000..6c02235 --- /dev/null +++ b/lang/zh-cn/fenxiao/order_detail.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '订单详情' +} diff --git a/lang/zh-cn/fenxiao/promote_code.js b/lang/zh-cn/fenxiao/promote_code.js new file mode 100644 index 0000000..e462f20 --- /dev/null +++ b/lang/zh-cn/fenxiao/promote_code.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '推广海报' +} diff --git a/lang/zh-cn/fenxiao/team.js b/lang/zh-cn/fenxiao/team.js new file mode 100644 index 0000000..26c1595 --- /dev/null +++ b/lang/zh-cn/fenxiao/team.js @@ -0,0 +1,5 @@ +export const lang = { + //title为每个页面的标题 + // title: '我的团队' + title: '' +} diff --git a/lang/zh-cn/fenxiao/withdraw_apply.js b/lang/zh-cn/fenxiao/withdraw_apply.js new file mode 100644 index 0000000..5ed3079 --- /dev/null +++ b/lang/zh-cn/fenxiao/withdraw_apply.js @@ -0,0 +1,5 @@ +export const lang = { + //title为每个页面的标题 + // title: '提现申请' + title: '' +} diff --git a/lang/zh-cn/fenxiao/withdraw_list.js b/lang/zh-cn/fenxiao/withdraw_list.js new file mode 100644 index 0000000..6b4a6ae --- /dev/null +++ b/lang/zh-cn/fenxiao/withdraw_list.js @@ -0,0 +1,5 @@ +export const lang = { + //title为每个页面的标题 + // title: '提现记录' + title: '' +} diff --git a/lang/zh-cn/game/cards.js b/lang/zh-cn/game/cards.js new file mode 100644 index 0000000..ce82d23 --- /dev/null +++ b/lang/zh-cn/game/cards.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '刮刮乐' +} diff --git a/lang/zh-cn/game/record.js b/lang/zh-cn/game/record.js new file mode 100644 index 0000000..de9a180 --- /dev/null +++ b/lang/zh-cn/game/record.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '中奖纪录' +} diff --git a/lang/zh-cn/game/smash_eggs.js b/lang/zh-cn/game/smash_eggs.js new file mode 100644 index 0000000..4acf085 --- /dev/null +++ b/lang/zh-cn/game/smash_eggs.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '砸金蛋' +} diff --git a/lang/zh-cn/game/turntable.js b/lang/zh-cn/game/turntable.js new file mode 100644 index 0000000..3ebe1ec --- /dev/null +++ b/lang/zh-cn/game/turntable.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '大转盘' +} diff --git a/lang/zh-cn/goods/brand.js b/lang/zh-cn/goods/brand.js new file mode 100644 index 0000000..68694de --- /dev/null +++ b/lang/zh-cn/goods/brand.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '品牌专区' +} diff --git a/lang/zh-cn/goods/cart.js b/lang/zh-cn/goods/cart.js new file mode 100644 index 0000000..85f4341 --- /dev/null +++ b/lang/zh-cn/goods/cart.js @@ -0,0 +1,13 @@ +export const lang = { + //title为每个页面的标题 + title: '购物车', + complete: '完成', + edit: '管理', + allElection: '全选', + total: '合计', + settlement: '结算', + emptyTips: '暂无商品', + goForStroll: '去逛逛', + del: '删除', + login: '去登录' +} diff --git a/lang/zh-cn/goods/category.js b/lang/zh-cn/goods/category.js new file mode 100644 index 0000000..f39978e --- /dev/null +++ b/lang/zh-cn/goods/category.js @@ -0,0 +1,5 @@ +export const lang = { + //title为每个页面的标题 + title: '商品分类', + seeMore : '查看更多' +} diff --git a/lang/zh-cn/goods/consult.js b/lang/zh-cn/goods/consult.js new file mode 100644 index 0000000..89b8e55 --- /dev/null +++ b/lang/zh-cn/goods/consult.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '商品咨询' +} diff --git a/lang/zh-cn/goods/consult_edit.js b/lang/zh-cn/goods/consult_edit.js new file mode 100644 index 0000000..c27770a --- /dev/null +++ b/lang/zh-cn/goods/consult_edit.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '我要咨询' +} diff --git a/lang/zh-cn/goods/coupon.js b/lang/zh-cn/goods/coupon.js new file mode 100644 index 0000000..0e6b51a --- /dev/null +++ b/lang/zh-cn/goods/coupon.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '优惠券领取' +} diff --git a/lang/zh-cn/goods/coupon_receive.js b/lang/zh-cn/goods/coupon_receive.js new file mode 100644 index 0000000..2bbf131 --- /dev/null +++ b/lang/zh-cn/goods/coupon_receive.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '领取优惠券' +} diff --git a/lang/zh-cn/goods/detail.js b/lang/zh-cn/goods/detail.js new file mode 100644 index 0000000..aa08c12 --- /dev/null +++ b/lang/zh-cn/goods/detail.js @@ -0,0 +1,10 @@ +export const lang = { + //title为每个页面的标题 + title: '', + select: '选择', + params: '参数', + service: '商品服务', + allGoods: '全部商品', + image: '图片', + video: '视频' +} diff --git a/lang/zh-cn/goods/evaluate.js b/lang/zh-cn/goods/evaluate.js new file mode 100644 index 0000000..3694418 --- /dev/null +++ b/lang/zh-cn/goods/evaluate.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '商品评价' +} diff --git a/lang/zh-cn/goods/list.js b/lang/zh-cn/goods/list.js new file mode 100644 index 0000000..d9a4482 --- /dev/null +++ b/lang/zh-cn/goods/list.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '商品列表' +} diff --git a/lang/zh-cn/goods/not_exist.js b/lang/zh-cn/goods/not_exist.js new file mode 100644 index 0000000..7690bf6 --- /dev/null +++ b/lang/zh-cn/goods/not_exist.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '商品找不到', +} diff --git a/lang/zh-cn/goods/point.js b/lang/zh-cn/goods/point.js new file mode 100644 index 0000000..4c12e0b --- /dev/null +++ b/lang/zh-cn/goods/point.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '积分中心' +} diff --git a/lang/zh-cn/goods/search.js b/lang/zh-cn/goods/search.js new file mode 100644 index 0000000..70059c1 --- /dev/null +++ b/lang/zh-cn/goods/search.js @@ -0,0 +1,9 @@ +export const lang = { + //title为每个页面的标题 + title: '搜索', + history: '历史搜索', + hot: '热门搜索', + find: '搜索发现', + hidefind: '当前搜索发现已隐藏', + inputPlaceholder: '搜索商品' +} diff --git a/lang/zh-cn/groupbuy/detail.js b/lang/zh-cn/groupbuy/detail.js new file mode 100644 index 0000000..aa08c12 --- /dev/null +++ b/lang/zh-cn/groupbuy/detail.js @@ -0,0 +1,10 @@ +export const lang = { + //title为每个页面的标题 + title: '', + select: '选择', + params: '参数', + service: '商品服务', + allGoods: '全部商品', + image: '图片', + video: '视频' +} diff --git a/lang/zh-cn/groupbuy/list.js b/lang/zh-cn/groupbuy/list.js new file mode 100644 index 0000000..98b8fd7 --- /dev/null +++ b/lang/zh-cn/groupbuy/list.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '团购专区' +} diff --git a/lang/zh-cn/groupbuy/payment.js b/lang/zh-cn/groupbuy/payment.js new file mode 100644 index 0000000..88657dd --- /dev/null +++ b/lang/zh-cn/groupbuy/payment.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '待付款订单' +} diff --git a/lang/zh-cn/help/detail.js b/lang/zh-cn/help/detail.js new file mode 100644 index 0000000..f872d86 --- /dev/null +++ b/lang/zh-cn/help/detail.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '帮助详情' +} diff --git a/lang/zh-cn/help/list.js b/lang/zh-cn/help/list.js new file mode 100644 index 0000000..34c12e0 --- /dev/null +++ b/lang/zh-cn/help/list.js @@ -0,0 +1,5 @@ +export const lang = { + //title为每个页面的标题 + title: '帮助中心', + emptyText:"当前暂无帮助信息" +} diff --git a/lang/zh-cn/hongbao/list.js b/lang/zh-cn/hongbao/list.js new file mode 100644 index 0000000..94882b2 --- /dev/null +++ b/lang/zh-cn/hongbao/list.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '瓜分红包列表' +} diff --git a/lang/zh-cn/hongbao/my_hongbao.js b/lang/zh-cn/hongbao/my_hongbao.js new file mode 100644 index 0000000..e541b7e --- /dev/null +++ b/lang/zh-cn/hongbao/my_hongbao.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '我的红包列表' +} diff --git a/lang/zh-cn/index/index.js b/lang/zh-cn/index/index.js new file mode 100644 index 0000000..74eb5f5 --- /dev/null +++ b/lang/zh-cn/index/index.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '', +} diff --git a/lang/zh-cn/live/list.js b/lang/zh-cn/live/list.js new file mode 100644 index 0000000..69c6591 --- /dev/null +++ b/lang/zh-cn/live/list.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '直播', +} diff --git a/lang/zh-cn/login/find.js b/lang/zh-cn/login/find.js new file mode 100644 index 0000000..6cd27dd --- /dev/null +++ b/lang/zh-cn/login/find.js @@ -0,0 +1,12 @@ +export const lang = { + //title为每个页面的标题 + title: '找回密码', + findPassword: '找回密码', + accountPlaceholder: '请输入手机号', + captchaPlaceholder: "请输入验证码", + dynacodePlaceholder: '请输入动态码', + passwordPlaceholder: '请输入新密码', + rePasswordPlaceholder: '请确认新密码', + next: '下一步', + save: '确认修改' +} diff --git a/lang/zh-cn/login/login.js b/lang/zh-cn/login/login.js new file mode 100644 index 0000000..14e5f68 --- /dev/null +++ b/lang/zh-cn/login/login.js @@ -0,0 +1,20 @@ +export const lang = { + //title为每个页面的标题 + title: '登录', + mobileLogin: '手机号登录', + accountLogin: '账号登录', + autoLogin: '一键授权登录', + login: '登录', + mobilePlaceholder: '手机号登录仅限中国大陆用户', + dynacodePlaceholder: '请输入动态码', + captchaPlaceholder: '请输入验证码', + accountPlaceholder: '请输入账号', + passwordPlaceholder: '请输入密码', + rePasswordPlaceholder: '请确认密码', + forgetPassword: '忘记密码', + register: '注册', + registerTips: '没有账号的用户快来', + registerTips1: '注册', + registerTips2: '吧', + newUserRegister: '新用户注册' +} diff --git a/lang/zh-cn/login/register.js b/lang/zh-cn/login/register.js new file mode 100644 index 0000000..503e921 --- /dev/null +++ b/lang/zh-cn/login/register.js @@ -0,0 +1,17 @@ +export const lang = { + //title为每个页面的标题 + title: '注册', + mobileRegister: '手机号注册', + accountRegister: '账号注册', + mobilePlaceholder: '手机号登录仅限中国大陆用户', + dynacodePlaceholder: '请输入动态码', + captchaPlaceholder: '请输入验证码', + accountPlaceholder: '请输入用户名', + passwordPlaceholder: '请输入密码', + rePasswordPlaceholder: '请确认密码', + completeRegister: '完成注册,并登录', + registerTips: '点击注册即代表您已同意', + registerAgreement: '注册协议', + next: '下一步', + save: '保存' +} diff --git a/lang/zh-cn/member/account.js b/lang/zh-cn/member/account.js new file mode 100644 index 0000000..79dde87 --- /dev/null +++ b/lang/zh-cn/member/account.js @@ -0,0 +1,13 @@ +export const lang = { + //title为每个页面的标题 + title: '账户列表', + name: '姓名', + accountType: '账号类型', + mobilePhone: '手机号码', + withdrawalAccount: '提现账号', + bankInfo: '支行信息', + newAddAccount: '新增账户', + del: '删除', + update: "修改", + emptyText:"当前暂无账户" +} diff --git a/lang/zh-cn/member/account_edit.js b/lang/zh-cn/member/account_edit.js new file mode 100644 index 0000000..5088b38 --- /dev/null +++ b/lang/zh-cn/member/account_edit.js @@ -0,0 +1,14 @@ +export const lang = { + //title为每个页面的标题 + title: '编辑账户', + name: '姓名', + namePlaceholder: '请输入真实姓名', + mobilePhone: '手机号码', + mobilePhonePlaceholder: '请输入手机号', + accountType: '账号类型', + bankInfo: '支行信息', + bankInfoPlaceholder: '请输入支行信息', + withdrawalAccount: '提现账号', + withdrawalAccountPlaceholder: '请输入提现账号', + save: '保存' +} diff --git a/lang/zh-cn/member/address.js b/lang/zh-cn/member/address.js new file mode 100644 index 0000000..08a97e8 --- /dev/null +++ b/lang/zh-cn/member/address.js @@ -0,0 +1,9 @@ +export const lang = { + //title为每个页面的标题 + title: '收货地址', + newAddAddress: '添加收货地址', + getAddress: '一键获取地址', + is_default: '默认', + modify: '编辑', + del: '删除' +} diff --git a/lang/zh-cn/member/address_edit.js b/lang/zh-cn/member/address_edit.js new file mode 100644 index 0000000..e93f405 --- /dev/null +++ b/lang/zh-cn/member/address_edit.js @@ -0,0 +1,14 @@ +export const lang = { + //title为每个页面的标题 + title: '编辑收货地址', + consignee: '姓名', + consigneePlaceholder: '收货人姓名', + mobile: '手机', + mobilePlaceholder: '收货人手机号', + telephone: '电话', + telephonePlaceholder: '收货人固定电话(选填)', + receivingCity: '地区', + address: '详细地址', + addressPlaceholder: '小区、街道、写字楼', + save: '保存' +} diff --git a/lang/zh-cn/member/apply_withdrawal.js b/lang/zh-cn/member/apply_withdrawal.js new file mode 100644 index 0000000..d2f5f7a --- /dev/null +++ b/lang/zh-cn/member/apply_withdrawal.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '申请提现' +} diff --git a/lang/zh-cn/member/assets.js b/lang/zh-cn/member/assets.js new file mode 100644 index 0000000..1702e20 --- /dev/null +++ b/lang/zh-cn/member/assets.js @@ -0,0 +1,3 @@ +export const lang = { + title: '账号注销', +} \ No newline at end of file diff --git a/lang/zh-cn/member/balance.js b/lang/zh-cn/member/balance.js new file mode 100644 index 0000000..49fb93d --- /dev/null +++ b/lang/zh-cn/member/balance.js @@ -0,0 +1,13 @@ +export const lang = { + //title为每个页面的标题 + title: '我的余额', + accountBalance: '账户余额 ', + money:' (元)', + recharge: '充值', + withdrawal: '提现', + balanceDetailed: '余额明细', + emptyTips: '暂无余额记录', + rechargeRecord:'充值记录', + ableAccountBalance:'现金余额 ', + noAccountBalance:'储值余额 ', +} diff --git a/lang/zh-cn/member/balance_detail.js b/lang/zh-cn/member/balance_detail.js new file mode 100644 index 0000000..538ab54 --- /dev/null +++ b/lang/zh-cn/member/balance_detail.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '余额明细' +} diff --git a/lang/zh-cn/member/cancellation.js b/lang/zh-cn/member/cancellation.js new file mode 100644 index 0000000..1702e20 --- /dev/null +++ b/lang/zh-cn/member/cancellation.js @@ -0,0 +1,3 @@ +export const lang = { + title: '账号注销', +} \ No newline at end of file diff --git a/lang/zh-cn/member/cancelrefuse.js b/lang/zh-cn/member/cancelrefuse.js new file mode 100644 index 0000000..1702e20 --- /dev/null +++ b/lang/zh-cn/member/cancelrefuse.js @@ -0,0 +1,3 @@ +export const lang = { + title: '账号注销', +} \ No newline at end of file diff --git a/lang/zh-cn/member/cancelstatus.js b/lang/zh-cn/member/cancelstatus.js new file mode 100644 index 0000000..1702e20 --- /dev/null +++ b/lang/zh-cn/member/cancelstatus.js @@ -0,0 +1,3 @@ +export const lang = { + title: '账号注销', +} \ No newline at end of file diff --git a/lang/zh-cn/member/cancelsuccess.js b/lang/zh-cn/member/cancelsuccess.js new file mode 100644 index 0000000..1702e20 --- /dev/null +++ b/lang/zh-cn/member/cancelsuccess.js @@ -0,0 +1,3 @@ +export const lang = { + title: '账号注销', +} \ No newline at end of file diff --git a/lang/zh-cn/member/card.js b/lang/zh-cn/member/card.js new file mode 100644 index 0000000..1aab742 --- /dev/null +++ b/lang/zh-cn/member/card.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '会员卡' +} diff --git a/lang/zh-cn/member/card_buy.js b/lang/zh-cn/member/card_buy.js new file mode 100644 index 0000000..1aab742 --- /dev/null +++ b/lang/zh-cn/member/card_buy.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '会员卡' +} diff --git a/lang/zh-cn/member/collection.js b/lang/zh-cn/member/collection.js new file mode 100644 index 0000000..7ba4f3f --- /dev/null +++ b/lang/zh-cn/member/collection.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '我的关注' +} diff --git a/lang/zh-cn/member/coupon.js b/lang/zh-cn/member/coupon.js new file mode 100644 index 0000000..3b4a64d --- /dev/null +++ b/lang/zh-cn/member/coupon.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '我的优惠券' +} diff --git a/lang/zh-cn/member/footprint.js b/lang/zh-cn/member/footprint.js new file mode 100644 index 0000000..2809ba2 --- /dev/null +++ b/lang/zh-cn/member/footprint.js @@ -0,0 +1,5 @@ +export const lang = { + //title为每个页面的标题 + title: '我的足迹', + emptyTpis: '您还未浏览过任何商品!' +} diff --git a/lang/zh-cn/member/gift.js b/lang/zh-cn/member/gift.js new file mode 100644 index 0000000..ebdcbda --- /dev/null +++ b/lang/zh-cn/member/gift.js @@ -0,0 +1,5 @@ +export const lang = { + //title为每个页面的标题 + title: '我的礼品', + emptyTips: '暂无礼品' +} diff --git a/lang/zh-cn/member/gift_detail.js b/lang/zh-cn/member/gift_detail.js new file mode 100644 index 0000000..492e1ae --- /dev/null +++ b/lang/zh-cn/member/gift_detail.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '礼品订单', +} diff --git a/lang/zh-cn/member/index.js b/lang/zh-cn/member/index.js new file mode 100644 index 0000000..197ce92 --- /dev/null +++ b/lang/zh-cn/member/index.js @@ -0,0 +1,42 @@ +export const lang = { + //title为每个页面的标题 + title: '会员中心', + login: '立即登录', + loginTpis: '登录体验更多功能', + memberLevel: '会员等级', + moreAuthority: '更多权限', + allOrders: '全部订单', + seeAllOrders: '查看全部订单', + waitPay: '待付款', + readyDelivery: '待发货', + waitDelivery: '待收货', + waitEvaluate: '待使用', + refunding: '退款', + // 会员中心入口 + sign: '签到', + personInfo: '个人资料', + receivingAddress: '收货地址', + accountList: '账户列表', + couponList: '优惠券', + mySpellList: '我的拼单', + myBargain: '我的砍价', + virtualCode: '虚拟码', + winningRecord: '我的礼品', + myCollection: '我的关注', + myTracks: '我的足迹', + pintuanOrder: '拼团订单', + yushouOrder: '预售订单', + message: '我的消息', + exchangeOrder: '积分兑换', + // 推广中心 + balance: '余额', + point: '积分', + coupon: '优惠券', + memberRecommend: '邀请有礼', + myPresale: '我的预售', + myGiftcard: '我的礼品卡', + myDivideticket: '我的瓜分券', + myRebate:'拼团返利', + myHongbao:'我的红包列表', + myBlindBox:'我的盲盒' +} diff --git a/lang/zh-cn/member/info.js b/lang/zh-cn/member/info.js new file mode 100644 index 0000000..52b220a --- /dev/null +++ b/lang/zh-cn/member/info.js @@ -0,0 +1,56 @@ +export const lang = { + //title为每个页面的标题 + title: '个人资料', + headImg: '头像', + account: '账号', + nickname: '昵称', + realName: '真实姓名', + sex: '性别', + birthday: '生日', + password: '密码', + paypassword: '支付密码', + mobilePhone: '手机', + bindMobile: '绑定手机', + cancellation: '注销账号', + lang: "语言", + logout: '退出登录', + save: "保存", + noset: '未设置', + + nickPlaceholder: "请输入新昵称", + pleaseRealName:"请输入真实姓名", + + nowPassword: "当前密码", + newPassword: "新密码", + confirmPassword: "确认新密码", + + phoneNumber: "手机号", + + confirmCode: "验证码", + confirmCodeInput: "请输入验证码", + confirmCodeInputerror: "验证码错误", + findanimateCode: "获取动态码", + animateCode: "动态码", + animateCodeInput: "请输入动态码", + + modifyNickname: "修改昵称", + modifyPassword: "修改密码", + bindPhone: "绑定手机", + + alikeNickname: "与原昵称一致,无需修改", + noEmityNickname: "昵称不能为空", + + updateSuccess: "修改成功", + + pleaseInputOldPassword: "请输入原始密码", + pleaseInputNewPassword: "请输入新密码", + passwordLength: "密码长度不能小于6位", + alikePassword: "两次密码不一致", + + samePassword: "新密码不能与原密码相同", + + surePhoneNumber: "请输入正确的手机号", + + alikePhone: "与原手机号一致,无需修改", + modify: '修改' +} diff --git a/lang/zh-cn/member/info_edit.js b/lang/zh-cn/member/info_edit.js new file mode 100644 index 0000000..9220f03 --- /dev/null +++ b/lang/zh-cn/member/info_edit.js @@ -0,0 +1,61 @@ +export const lang = { + //title为每个页面的标题 + title: '个人资料', + headImg: '头像', + account: '账号', + username: '用户名', + nickname: '昵称', + realName: '真实姓名', + sex: '性别', + birthday: '生日', + password: '密码', + paypassword: '支付密码', + mobilePhone: '手机', + bindMobile: '绑定手机', + cancellation: '注销账号', + lang: "语言", + logout: '退出登录', + save: "保存", + noset: '未设置', + + usernamePlaceholder: "请输入新用户名", + nickPlaceholder: "请输入新昵称", + pleaseRealName:"请输入真实姓名", + + nowPassword: "当前密码", + newPassword: "新密码", + confirmPassword: "确认新密码", + + phoneNumber: "手机号", + + confirmCode: "验证码", + confirmCodeInput: "请输入验证码", + confirmCodeInputerror: "验证码错误", + findanimateCode: "获取动态码", + animateCode: "动态码", + animateCodeInput: "请输入动态码", + + modifyNickname: "修改昵称", + modifyPassword: "修改密码", + bindPhone: "绑定手机", + + alikeusername: "与原用户名一致,无需修改", + noEmityUsername: "用户名不能为空", + + alikeNickname: "与原昵称一致,无需修改", + noEmityNickname: "昵称不能为空", + + updateSuccess: "修改成功", + + pleaseInputOldPassword: "请输入原始密码", + pleaseInputNewPassword: "请输入新密码", + passwordLength: "密码长度不能小于6位", + alikePassword: "两次密码不一致", + + samePassword: "新密码不能与原密码相同", + + surePhoneNumber: "请输入正确的手机号", + + alikePhone: "与原手机号一致,无需修改", + modify: '修改' +} diff --git a/lang/zh-cn/member/invite_friends.js b/lang/zh-cn/member/invite_friends.js new file mode 100644 index 0000000..5456928 --- /dev/null +++ b/lang/zh-cn/member/invite_friends.js @@ -0,0 +1,3 @@ +export const lang = { + title: '邀请好友', +} \ No newline at end of file diff --git a/lang/zh-cn/member/level.js b/lang/zh-cn/member/level.js new file mode 100644 index 0000000..a4a0e8d --- /dev/null +++ b/lang/zh-cn/member/level.js @@ -0,0 +1,17 @@ +export const lang = { + //title为每个页面的标题 + title: '会员等级', + defaultLevelTips: '您已经是最高级别的会员了!', + tag: '专属标签', + tagDesc: '标签达人', + discount: '专享折扣', + discountDesc: '专享{0}折', + service: '优质服务', + serviceDesc: '360度全方位', + memberLevel: '会员等级', + condition: '条件', + equity: '权益', + giftPackage: '升级礼包', + levelExplain: '等级说明', + upgradeTips: '升级会员,享专属权益' +} diff --git a/lang/zh-cn/member/message.js b/lang/zh-cn/member/message.js new file mode 100644 index 0000000..c970ecb --- /dev/null +++ b/lang/zh-cn/member/message.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '我的消息' +} diff --git a/lang/zh-cn/member/modify_face.js b/lang/zh-cn/member/modify_face.js new file mode 100644 index 0000000..cb7f76f --- /dev/null +++ b/lang/zh-cn/member/modify_face.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '修改头像' +} diff --git a/lang/zh-cn/member/pay_password.js b/lang/zh-cn/member/pay_password.js new file mode 100644 index 0000000..f699e06 --- /dev/null +++ b/lang/zh-cn/member/pay_password.js @@ -0,0 +1,3 @@ +export const lang = { + title: '支付密码', +} \ No newline at end of file diff --git a/lang/zh-cn/member/point.js b/lang/zh-cn/member/point.js new file mode 100644 index 0000000..bd74dd9 --- /dev/null +++ b/lang/zh-cn/member/point.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '我的积分' +} diff --git a/lang/zh-cn/member/point_detail.js b/lang/zh-cn/member/point_detail.js new file mode 100644 index 0000000..5c33ed8 --- /dev/null +++ b/lang/zh-cn/member/point_detail.js @@ -0,0 +1,6 @@ +export const lang = { + //title为每个页面的标题 + title: '积分明细', + emptyTpis: '您暂时还没有积分记录哦!', + pointExplain: '积分说明' +} diff --git a/lang/zh-cn/member/signin.js b/lang/zh-cn/member/signin.js new file mode 100644 index 0000000..00003a9 --- /dev/null +++ b/lang/zh-cn/member/signin.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '签到有礼' +} diff --git a/lang/zh-cn/member/withdrawal.js b/lang/zh-cn/member/withdrawal.js new file mode 100644 index 0000000..9b99202 --- /dev/null +++ b/lang/zh-cn/member/withdrawal.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '提现记录' +} diff --git a/lang/zh-cn/member/withdrawal_detail.js b/lang/zh-cn/member/withdrawal_detail.js new file mode 100644 index 0000000..8b822bb --- /dev/null +++ b/lang/zh-cn/member/withdrawal_detail.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '提现详情' +} diff --git a/lang/zh-cn/notice/detail.js b/lang/zh-cn/notice/detail.js new file mode 100644 index 0000000..d2d77c9 --- /dev/null +++ b/lang/zh-cn/notice/detail.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '公告详情' +} diff --git a/lang/zh-cn/notice/list.js b/lang/zh-cn/notice/list.js new file mode 100644 index 0000000..e2c2d7c --- /dev/null +++ b/lang/zh-cn/notice/list.js @@ -0,0 +1,6 @@ +export const lang = { + //title为每个页面的标题 + title: '公告列表', + emptyText:"当前暂无更多信息", + contentTitle:'升级公告' +} diff --git a/lang/zh-cn/order/activist.js b/lang/zh-cn/order/activist.js new file mode 100644 index 0000000..3113f05 --- /dev/null +++ b/lang/zh-cn/order/activist.js @@ -0,0 +1,6 @@ +export const lang = { + //title为每个页面的标题 + title: '退款', + checkDetail: '查看详情', + emptyTips: '暂无退款记录' +} diff --git a/lang/zh-cn/order/detail.js b/lang/zh-cn/order/detail.js new file mode 100644 index 0000000..6c02235 --- /dev/null +++ b/lang/zh-cn/order/detail.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '订单详情' +} diff --git a/lang/zh-cn/order/detail_local_delivery.js b/lang/zh-cn/order/detail_local_delivery.js new file mode 100644 index 0000000..6c02235 --- /dev/null +++ b/lang/zh-cn/order/detail_local_delivery.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '订单详情' +} diff --git a/lang/zh-cn/order/detail_pickup.js b/lang/zh-cn/order/detail_pickup.js new file mode 100644 index 0000000..6c02235 --- /dev/null +++ b/lang/zh-cn/order/detail_pickup.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '订单详情' +} diff --git a/lang/zh-cn/order/detail_point.js b/lang/zh-cn/order/detail_point.js new file mode 100644 index 0000000..6c02235 --- /dev/null +++ b/lang/zh-cn/order/detail_point.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '订单详情' +} diff --git a/lang/zh-cn/order/detail_virtual.js b/lang/zh-cn/order/detail_virtual.js new file mode 100644 index 0000000..6c02235 --- /dev/null +++ b/lang/zh-cn/order/detail_virtual.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '订单详情' +} diff --git a/lang/zh-cn/order/evaluate.js b/lang/zh-cn/order/evaluate.js new file mode 100644 index 0000000..73d6c04 --- /dev/null +++ b/lang/zh-cn/order/evaluate.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '我要评价' +} diff --git a/lang/zh-cn/order/list.js b/lang/zh-cn/order/list.js new file mode 100644 index 0000000..00d0479 --- /dev/null +++ b/lang/zh-cn/order/list.js @@ -0,0 +1,12 @@ +export const lang = { + //title为每个页面的标题 + title: '订单列表', + emptyTips: '暂无相关订单', + all: '全部', + waitPay: '待付款', + readyDelivery: '待发货', + waitDelivery: '待收货', + waitEvaluate: '待使用', + update: "释放刷新", + updateIng: "加载中..." +} diff --git a/lang/zh-cn/order/logistics.js b/lang/zh-cn/order/logistics.js new file mode 100644 index 0000000..3736635 --- /dev/null +++ b/lang/zh-cn/order/logistics.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '物流信息' +} diff --git a/lang/zh-cn/order/payment.js b/lang/zh-cn/order/payment.js new file mode 100644 index 0000000..88657dd --- /dev/null +++ b/lang/zh-cn/order/payment.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '待付款订单' +} diff --git a/lang/zh-cn/order/refund.js b/lang/zh-cn/order/refund.js new file mode 100644 index 0000000..d1b3c1d --- /dev/null +++ b/lang/zh-cn/order/refund.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '申请退款', +} diff --git a/lang/zh-cn/order/refund_batch.js b/lang/zh-cn/order/refund_batch.js new file mode 100644 index 0000000..d1b3c1d --- /dev/null +++ b/lang/zh-cn/order/refund_batch.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '申请退款', +} diff --git a/lang/zh-cn/order/refund_detail.js b/lang/zh-cn/order/refund_detail.js new file mode 100644 index 0000000..f931c6b --- /dev/null +++ b/lang/zh-cn/order/refund_detail.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '退款详情', +} diff --git a/lang/zh-cn/pay/index.js b/lang/zh-cn/pay/index.js new file mode 100644 index 0000000..60ddcaf --- /dev/null +++ b/lang/zh-cn/pay/index.js @@ -0,0 +1,7 @@ +export const lang = { + //title为每个页面的标题 + title: '支付方式', + paymentAmount: '支付金额', + confirmPayment: '确认支付', + seeOrder: '查看订单' +} diff --git a/lang/zh-cn/pay/result.js b/lang/zh-cn/pay/result.js new file mode 100644 index 0000000..294c202 --- /dev/null +++ b/lang/zh-cn/pay/result.js @@ -0,0 +1,10 @@ +export const lang = { + //title为每个页面的标题 + title: '支付结果', + paymentSuccess: '支付成功', + paymentFail: '支付失败', + goHome: '回到首页', + memberCenter: '会员中心', + payMoney: '支付金额', + unit: '元' +} diff --git a/lang/zh-cn/pintuan/detail.js b/lang/zh-cn/pintuan/detail.js new file mode 100644 index 0000000..aa08c12 --- /dev/null +++ b/lang/zh-cn/pintuan/detail.js @@ -0,0 +1,10 @@ +export const lang = { + //title为每个页面的标题 + title: '', + select: '选择', + params: '参数', + service: '商品服务', + allGoods: '全部商品', + image: '图片', + video: '视频' +} diff --git a/lang/zh-cn/pintuan/list.js b/lang/zh-cn/pintuan/list.js new file mode 100644 index 0000000..c9e868c --- /dev/null +++ b/lang/zh-cn/pintuan/list.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '拼团专区' +} diff --git a/lang/zh-cn/pintuan/my_spell.js b/lang/zh-cn/pintuan/my_spell.js new file mode 100644 index 0000000..ffb8d0f --- /dev/null +++ b/lang/zh-cn/pintuan/my_spell.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '我的拼单' +} diff --git a/lang/zh-cn/pintuan/payment.js b/lang/zh-cn/pintuan/payment.js new file mode 100644 index 0000000..88657dd --- /dev/null +++ b/lang/zh-cn/pintuan/payment.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '待付款订单' +} diff --git a/lang/zh-cn/pintuan/share.js b/lang/zh-cn/pintuan/share.js new file mode 100644 index 0000000..9b25eb4 --- /dev/null +++ b/lang/zh-cn/pintuan/share.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '拼团分享' +} diff --git a/lang/zh-cn/point/detail.js b/lang/zh-cn/point/detail.js new file mode 100644 index 0000000..17ad9f1 --- /dev/null +++ b/lang/zh-cn/point/detail.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '兑换' +} diff --git a/lang/zh-cn/point/goods_detail.js b/lang/zh-cn/point/goods_detail.js new file mode 100644 index 0000000..7c5e6bf --- /dev/null +++ b/lang/zh-cn/point/goods_detail.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + // title: '兑换' +} \ No newline at end of file diff --git a/lang/zh-cn/point/list.js b/lang/zh-cn/point/list.js new file mode 100644 index 0000000..35fa006 --- /dev/null +++ b/lang/zh-cn/point/list.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '积分商城' +} diff --git a/lang/zh-cn/point/order_detail.js b/lang/zh-cn/point/order_detail.js new file mode 100644 index 0000000..02b134b --- /dev/null +++ b/lang/zh-cn/point/order_detail.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '积分兑换订单详情' +} diff --git a/lang/zh-cn/point/order_list.js b/lang/zh-cn/point/order_list.js new file mode 100644 index 0000000..5139a9a --- /dev/null +++ b/lang/zh-cn/point/order_list.js @@ -0,0 +1,5 @@ +export const lang = { + //title为每个页面的标题 + title: '积分兑换', + emptyTips: '暂无更多数据了' +} diff --git a/lang/zh-cn/point/payment.js b/lang/zh-cn/point/payment.js new file mode 100644 index 0000000..88657dd --- /dev/null +++ b/lang/zh-cn/point/payment.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '待付款订单' +} diff --git a/lang/zh-cn/point/result.js b/lang/zh-cn/point/result.js new file mode 100644 index 0000000..fb9a581 --- /dev/null +++ b/lang/zh-cn/point/result.js @@ -0,0 +1,7 @@ +export const lang = { + //title为每个页面的标题 + title: '兑换结果', + exchangeSuccess: '兑换成功', + see: '查看兑换记录', + goHome: '回到首页' +} diff --git a/lang/zh-cn/presale/detail.js b/lang/zh-cn/presale/detail.js new file mode 100644 index 0000000..aa08c12 --- /dev/null +++ b/lang/zh-cn/presale/detail.js @@ -0,0 +1,10 @@ +export const lang = { + //title为每个页面的标题 + title: '', + select: '选择', + params: '参数', + service: '商品服务', + allGoods: '全部商品', + image: '图片', + video: '视频' +} diff --git a/lang/zh-cn/presale/list.js b/lang/zh-cn/presale/list.js new file mode 100644 index 0000000..6062102 --- /dev/null +++ b/lang/zh-cn/presale/list.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '预售专区' +} diff --git a/lang/zh-cn/presale/order_detail.js b/lang/zh-cn/presale/order_detail.js new file mode 100644 index 0000000..6c02235 --- /dev/null +++ b/lang/zh-cn/presale/order_detail.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '订单详情' +} diff --git a/lang/zh-cn/presale/order_list.js b/lang/zh-cn/presale/order_list.js new file mode 100644 index 0000000..33e46b3 --- /dev/null +++ b/lang/zh-cn/presale/order_list.js @@ -0,0 +1,7 @@ +export const lang = { + //title为每个页面的标题 + title: '我的预售', + emptyTips: '暂无相关预售订单', + update: "释放刷新", + updateIng: "加载中..." +} diff --git a/lang/zh-cn/presale/payment.js b/lang/zh-cn/presale/payment.js new file mode 100644 index 0000000..88657dd --- /dev/null +++ b/lang/zh-cn/presale/payment.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '待付款订单' +} diff --git a/lang/zh-cn/recharge/detail.js b/lang/zh-cn/recharge/detail.js new file mode 100644 index 0000000..7f56b11 --- /dev/null +++ b/lang/zh-cn/recharge/detail.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '充值详情' +} diff --git a/lang/zh-cn/recharge/list.js b/lang/zh-cn/recharge/list.js new file mode 100644 index 0000000..0247946 --- /dev/null +++ b/lang/zh-cn/recharge/list.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '充值列表' +} diff --git a/lang/zh-cn/recharge/order_list.js b/lang/zh-cn/recharge/order_list.js new file mode 100644 index 0000000..ccae5ec --- /dev/null +++ b/lang/zh-cn/recharge/order_list.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '充值记录', +} diff --git a/lang/zh-cn/seckill/detail.js b/lang/zh-cn/seckill/detail.js new file mode 100644 index 0000000..aa08c12 --- /dev/null +++ b/lang/zh-cn/seckill/detail.js @@ -0,0 +1,10 @@ +export const lang = { + //title为每个页面的标题 + title: '', + select: '选择', + params: '参数', + service: '商品服务', + allGoods: '全部商品', + image: '图片', + video: '视频' +} diff --git a/lang/zh-cn/seckill/list.js b/lang/zh-cn/seckill/list.js new file mode 100644 index 0000000..d546477 --- /dev/null +++ b/lang/zh-cn/seckill/list.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '秒杀专区' +} diff --git a/lang/zh-cn/seckill/payment.js b/lang/zh-cn/seckill/payment.js new file mode 100644 index 0000000..88657dd --- /dev/null +++ b/lang/zh-cn/seckill/payment.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '待付款订单' +} diff --git a/lang/zh-cn/store_notes/note_detail.js b/lang/zh-cn/store_notes/note_detail.js new file mode 100644 index 0000000..f776d19 --- /dev/null +++ b/lang/zh-cn/store_notes/note_detail.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '笔记详情' +} \ No newline at end of file diff --git a/lang/zh-cn/store_notes/note_list.js b/lang/zh-cn/store_notes/note_list.js new file mode 100644 index 0000000..daf0791 --- /dev/null +++ b/lang/zh-cn/store_notes/note_list.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '店铺笔记' +} \ No newline at end of file diff --git a/lang/zh-cn/storeclose/storeclose.js b/lang/zh-cn/storeclose/storeclose.js new file mode 100644 index 0000000..af147fc --- /dev/null +++ b/lang/zh-cn/storeclose/storeclose.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '店铺打烊' +} diff --git a/lang/zh-cn/topics/detail.js b/lang/zh-cn/topics/detail.js new file mode 100644 index 0000000..37300ef --- /dev/null +++ b/lang/zh-cn/topics/detail.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '专题活动详情' +} diff --git a/lang/zh-cn/topics/goods_detail.js b/lang/zh-cn/topics/goods_detail.js new file mode 100644 index 0000000..aa08c12 --- /dev/null +++ b/lang/zh-cn/topics/goods_detail.js @@ -0,0 +1,10 @@ +export const lang = { + //title为每个页面的标题 + title: '', + select: '选择', + params: '参数', + service: '商品服务', + allGoods: '全部商品', + image: '图片', + video: '视频' +} diff --git a/lang/zh-cn/topics/list.js b/lang/zh-cn/topics/list.js new file mode 100644 index 0000000..88fad9a --- /dev/null +++ b/lang/zh-cn/topics/list.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '专题活动列表' +} diff --git a/lang/zh-cn/topics/payment.js b/lang/zh-cn/topics/payment.js new file mode 100644 index 0000000..88657dd --- /dev/null +++ b/lang/zh-cn/topics/payment.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '待付款订单' +} diff --git a/main.js b/main.js new file mode 100644 index 0000000..11a6c68 --- /dev/null +++ b/main.js @@ -0,0 +1,50 @@ +// #ifdef H5 +import './common/js/pc' +// #endif +import Vue from 'vue' +import App from './App' +import store from './store' +import Util from './common/js/util.js' +import Http from './common/js/http.js' +import Lang from './common/js/lang.js' +import Config from './common/js/config.js' +import globalConfig from './common/js/golbalConfig.js'; + +Vue.prototype.$store = store //挂在vue + +Vue.config.productionTip = false + +Vue.prototype.$util = Util; +Vue.prototype.$api = Http; + +Vue.prototype.$langConfig = Lang; //语言包对象 +Vue.prototype.$lang = Lang.lang; //解析语言包 + +Vue.prototype.$config = Config; + +Vue.mixin(globalConfig); + +App.mpType = 'app' + +//常用组件 +import loadingCover from '@/components/loading-cover/loading-cover.vue'; +Vue.component('loading-cover', loadingCover); + +import nsEmpty from '@/components/ns-empty/ns-empty.vue'; +Vue.component('ns-empty', nsEmpty); + +import MescrollUni from "@/components/mescroll/my-list-mescroll.vue"; +Vue.component("mescroll-uni", MescrollUni); //上拉加载,下拉刷新组件 + +import MescrollBody from "@/components/mescroll/mescroll-body.vue" +Vue.component('mescroll-body', MescrollBody); + +import NsLogin from "@/components/ns-login/ns-login.vue" +Vue.component('ns-login', NsLogin); + +const app = new Vue({ + ...App, + store +}) + +app.$mount() diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..8472ef1 --- /dev/null +++ b/manifest.json @@ -0,0 +1,120 @@ +{ + "name" : "单商户V4", + "appid" : "__UNI__AFF44C0", + "description" : "", + "versionName" : "5.1.2", + "versionCode" : "100", + "transformPx" : false, + /* 5+App特有相关 */ + "app-plus" : { + "usingComponents" : true, + "nvueCompiler" : "uni-app", + "splashscreen" : { + "alwaysShowBeforeRender" : true, + "waiting" : true, + "autoclose" : true, + "delay" : 0 + }, + /* 模块配置 */ + "modules" : {}, + /* 应用发布信息 */ + "distribute" : { + /* android打包配置 */ + "android" : { + "permissions" : [ + "+ + + + ++ + ++ + + + ++ ++ ++++ +{{ item.week }} {{ item.date }} ++++ +指定日期 ++ + + + ++ ++ ++ + +{{ item.time }} + ++ ++ ++ ++ + +{{ item.time }} +{{ item.disable ? disableText : undisableText }} +", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ] + }, + /* ios打包配置 */ + "ios" : {}, + /* SDK配置 */ + "sdkConfigs" : { + "ad" : {} + } + } + }, + /* 快应用特有相关 */ + "quickapp" : {}, + /* 小程序特有相关 */ + "mp-weixin" : { + "appid" : "", + "setting" : { + "urlCheck" : false, + "postcss" : false, + "es6" : true, + "minified" : true + }, + "usingComponents" : true, + "permission" : { + "scope.userLocation" : { + "desc" : "为了更好地为您提供服务" + } + }, + "plugins" : { + "live-player-plugin" : { + "version" : "1.2.0", + "provider" : "wx2b03c6e691cd7370" + } + }, + "requiredPrivateInfos" : [ "chooseLocation", "getLocation", "chooseAddress" ] + }, + "mp-alipay" : { + "usingComponents" : true + }, + "mp-baidu" : { + "usingComponents" : true + }, + "mp-toutiao" : { + "usingComponents" : true + }, + "h5" : { + "sdkConfigs" : { + "maps" : { + "qqmap" : { + "key" : "" + } + } + }, + "router" : { + "mode" : "history", + "base" : "/h5/" + }, + "title" : " ", + "devServer" : { + "https" : false + }, + "optimization" : { + "treeShaking" : { + "enable" : false + } + }, + "domain" : " ", + "unipush" : { + "enable" : false + } + }, + "uniStatistics" : { + "version" : "2" + } +} diff --git a/node_modules/jweixin-module/README.md b/node_modules/jweixin-module/README.md new file mode 100644 index 0000000..f4e08bd --- /dev/null +++ b/node_modules/jweixin-module/README.md @@ -0,0 +1,30 @@ +# jweixin-module + +微信JS-SDK + +## 安装 + +### NPM + +```shell +npm install jweixin-module --save +``` + +### UMD + +```http +https://unpkg.com/jweixin-module/out/index.js +``` + +## 使用 + +```js +var wx = require('jweixin-module') +wx.ready(function(){ + // TODO +}); +``` + +## 完整API + +>[微信JS-SDK说明文档](https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115) diff --git a/node_modules/jweixin-module/out/index.js b/node_modules/jweixin-module/out/index.js new file mode 100644 index 0000000..807ab6a --- /dev/null +++ b/node_modules/jweixin-module/out/index.js @@ -0,0 +1 @@ +!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n(e):"function"==typeof define&&(define.amd||define.cmd)?define(function(){return n(e)}):n(e,!0)}(window,function(o,e){function c(n,e,i){o.WeixinJSBridge?WeixinJSBridge.invoke(n,r(e),function(e){a(n,e,i)}):d(n,i)}function i(n,i,t){o.WeixinJSBridge?WeixinJSBridge.on(n,function(e){t&&t.trigger&&t.trigger(e),a(n,e,i)}):d(n,t||i)}function r(e){return(e=e||{}).appId=M.appId,e.verifyAppId=M.appId,e.verifySignType="sha1",e.verifyTimestamp=M.timestamp+"",e.verifyNonceStr=M.nonceStr,e.verifySignature=M.signature,e}function n(e){return{timeStamp:e.timestamp+"",nonceStr:e.nonceStr,package:e.package,paySign:e.paySign,signType:e.signType||"SHA1"}}function a(e,n,i){"openEnterpriseChat"==e&&(n.errCode=n.err_code),delete n.err_code,delete n.err_desc,delete n.err_detail;var t=n.errMsg;t||(t=n.err_msg,delete n.err_msg,t=function(e,n){var i=e,t=f[i];t&&(i=t);var o="ok";if(n){var r=n.indexOf(":");"confirm"==(o=n.substring(r+1))&&(o="ok"),"failed"==o&&(o="fail"),-1!=o.indexOf("failed_")&&(o=o.substring(7)),-1!=o.indexOf("fail_")&&(o=o.substring(5)),"access denied"!=(o=(o=o.replace(/_/g," ")).toLowerCase())&&"no permission to execute"!=o||(o="permission denied"),"config"==i&&"function not exist"==o&&(o="ok"),""==o&&(o="fail")}return n=i+":"+o}(e,t),n.errMsg=t),(i=i||{})._complete&&(i._complete(n),delete i._complete),t=n.errMsg||"",M.debug&&!i.isInnerInvoke&&alert(JSON.stringify(n));var o=t.indexOf(":");switch(t.substring(o+1)){case"ok":i.success&&i.success(n);break;case"cancel":i.cancel&&i.cancel(n);break;default:i.fail&&i.fail(n)}i.complete&&i.complete(n)}function s(e){if(e){for(var n=0,i=e.length;n + + + + + + + + diff --git a/pages/goods/category.vue b/pages/goods/category.vue new file mode 100644 index 0000000..91d6cdc --- /dev/null +++ b/pages/goods/category.vue @@ -0,0 +1,106 @@ + ++ + + ++ ++ ++ +共{{ cartData[0].cartList.length }}种商品 +{{ isAction ? $lang('complete') : $lang('edit') }} ++ + ++ ++ +优惠券 +领券结算最高可减{{ discount.coupon_info.coupon_money | moneyFormat }}元 ++ 点击{{ discount.coupon_info.receive_type == 'wait' ? '领取' : '查看' }} + ++ + ++ ++ ++ + ++ + ++ +{{ item.goods_name }} ++ ++ ++ ++ {{ x.spec_name }}:{{ x.spec_value_name }} {{ i < item.sku_spec_format.length - 1 ? ';' : '' }} + ++ + ++ ++ ++ ++ +{{ $lang('common.currencySymbol') }} + {{ + parseFloat(item.member_price) + .toFixed(2) + .split('.')[0] + }} ++ .{{ + parseFloat(item.member_price) + .toFixed(2) + .split('.')[1] + }} + + ++ + ++ ++ +{{ $lang('common.currencySymbol') }} + {{ + parseFloat(item.discount_price) + .toFixed(2) + .split('.')[0] + }} ++ .{{ + parseFloat(item.discount_price) + .toFixed(2) + .split('.')[1] + }} + + ++ + ++ ++ ++ +{{ $lang('common.currencySymbol') }} + {{ + parseFloat(item.member_price) + .toFixed(2) + .split('.')[0] + }} ++ .{{ + parseFloat(item.member_price) + .toFixed(2) + .split('.')[1] + }} + ++ + ++ ++ +{{ $lang('common.currencySymbol') }} + {{ + parseFloat(item.price) + .toFixed(2) + .split('.')[0] + }} ++ .{{ + parseFloat(item.price) + .toFixed(2) + .split('.')[1] + }} + ++ + +满减 ++ ++ +{{ mitem.limit }}减{{ mitem.discount_money }} ++ {{ $lang('del') }} ++ ++ ++ +失效商品{{ invalidGoods.length }}件 +清空 ++ ++ ++ ++ + + +{{ goodsItem.sku_name }} ++ ++ ++ ++ {{ x.spec_name }}:{{ x.spec_value_name }} {{ i < goodsItem.sku_spec_format.length - 1 ? '; ' : '' }} + ++ ++ ++ + +{{ $lang('common.currencySymbol') }} + {{ + parseFloat(goodsItem.member_price) + .toFixed(2) + .split('.')[0] + }} ++ .{{ + parseFloat(goodsItem.member_price) + .toFixed(2) + .split('.')[1] + }} + ++ + + {{ $lang('common.currencySymbol') }} + {{ + parseFloat(goodsItem.discount_price) + .toFixed(2) + .split('.')[0] + }} ++ .{{ + parseFloat(goodsItem.discount_price) + .toFixed(2) + .split('.')[1] + }} + + +已失效 ++ ++ + ++ + + + + + ++ ++ +优惠明细 ++ + ++ +商品总额 +¥{{ discount.goods_money | moneyFormat }} ++ +优惠券 +-¥{{ discount.coupon_money | moneyFormat }} ++ +满减 +-¥{{ discount.promotion_money | moneyFormat }} ++ +合计 +¥{{ discount.order_money | moneyFormat }} ++ ++ ++ +优惠券 ++ + ++ ++ ++ ++ + + +{{ $lang('common.currencySymbol') }} +{{ parseFloat(discount.coupon_info.money) }} + + +{{ parseFloat(discount.coupon_info.discount) }} +折 + ++ + 满{{ discount.coupon_info.at_least }}可用 + + + 无门槛 + + ++ + + + +{{ discount.coupon_info.coupon_name }} ++ 最多可抵¥{{ discount.coupon_info.discount_limit }} + ++ 有效期:{{ $util.timeStampTurnTime(discount.coupon_info.end_time) }} + ++ 有效期:领取之日起{{ discount.coupon_info.fixed_term }}天内有效 + +有效期:长期有效 ++ ++ ++ {{ $lang('allElection') }} ++ ++ {{ $lang('total') }}: + +{{ $lang('common.currencySymbol') }} ++ ++ {{ + parseFloat(discount.order_money) + .toFixed(2) + .split('.')[0] + }} + ++ .{{ + parseFloat(discount.order_money) + .toFixed(2) + .split('.')[1] + }} + ++ ++ {{ + parseFloat(totalPrice) + .toFixed(2) + .split('.')[0] + }} + ++ .{{ + parseFloat(totalPrice) + .toFixed(2) + .split('.')[1] + }} + ++ 优惠明细 + ++ + + ++ + + ++ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages/goods/detail.vue b/pages/goods/detail.vue new file mode 100644 index 0000000..040fb04 --- /dev/null +++ b/pages/goods/detail.vue @@ -0,0 +1,587 @@ + ++ + ++ ++ ++ + + + + + ++ + + + + + + + + diff --git a/pages/goods/list.vue b/pages/goods/list.vue new file mode 100644 index 0000000..0b4b8b8 --- /dev/null +++ b/pages/goods/list.vue @@ -0,0 +1,202 @@ + ++ + + ++ + + + + ++ + ++ + ++ + +限时折扣 +已售{{ goodsSkuDetail.sale_num }}{{ goodsSkuDetail.unit }} ++ +距结束仅剩 ++ ++ + + + ++ + +{{ $lang('common.currencySymbol') }} ++ {{ + parseFloat(goodsSkuDetail.discount_price) + .toFixed(2) + .split('.')[0] + }} + ++ .{{ + parseFloat(goodsSkuDetail.discount_price) + .toFixed(2) + .split('.')[1] + }} + + + + ++ {{ $lang('common.currencySymbol') }} ++ {{ + parseFloat(goodsSkuDetail.member_price) + .toFixed(2) + .split('.')[0] + }} + ++ .{{ + parseFloat(goodsSkuDetail.member_price) + .toFixed(2) + .split('.')[1] + }} + ++ + + +原价 +{{ $lang('common.currencySymbol') }} +{{ goodsSkuDetail.price }} ++ {{ + parseFloat(goodsSkuDetail.price) + .toFixed(2) + .split('.')[0] + }} + ++ .{{ + parseFloat(goodsSkuDetail.price) + .toFixed(2) + .split('.')[1] + }} + + + ++ ++ {{ $lang('common.currencySymbol') }} + +{{ goodsSkuDetail.price }} +{{ goodsSkuDetail.market_price }} ++ ++ + + +{{ goodsSkuDetail.goods_name }} ++ {{ goodsSkuDetail.introduction }} + ++ + +库存 {{ goodsSkuDetail.stock }} {{ goodsSkuDetail.unit }} +销量 {{ goodsSkuDetail.sale_num }} {{ goodsSkuDetail.unit }} ++ ++ + 开通{{ membercard.level_name }} + +预计可省{{ memberCardDiscount }}元 +省更多! +立即开通 ++ + + + + + + + + +- 套餐包含以下的服务及商品 - ++ {{ goodsSkuDetail.card_info.card_type == 'commoncard' ? '卡项内项目/商品总的可用次数为' + goodsSkuDetail.card_info.common_num + ' ,' : '' }} + {{ goodsSkuDetail.card_info.card_type == 'timecard' ? '次数不限 ,' : '' }} 有效期为{{ + (goodsSkuDetail.card_info.validity_type == 0 && '永久') || + (goodsSkuDetail.card_info.validity_type == 1 && goodsSkuDetail.card_info.validity_day + '天') || + (goodsSkuDetail.card_info.validity_type == 2 && $util.timeStampTurnTime(goodsSkuDetail.card_info.validity_time)) + }} + ++ ++ ++ + +{{ item.sku_name }} +¥{{ item.price }} +x{{ item.num }} ++ +{{ cardOff ? '收起' : '展开' }} ++ + + +领券 ++ ++ ++ {{ + parseFloat(item.at_least) > 0 + ? '满' + decimalPointFormat(item.at_least) + '减' + decimalPointFormat(item.money) + : '无门槛使用' + decimalPointFormat(item.money) + }} + ++ + + +选择 ++ +{{ item.spec_name }}/{{ item.spec_value_name }} ++ + + + + + + + +促销 +满减 +{{ manjian.manjian_name }} ++ + + + + + + + ++ + ++ ++ +组合套餐 +{{ bundling[0].bl_name }} ++ + + ++ ++ ++ ++ + +{{ $lang('common.currencySymbol') }} +{{ goodsSkuDetail.price }} +{{ goodsSkuDetail.goods_name }} ++ + ++ + ++ ++ + +{{ $lang('common.currencySymbol') }} +{{ item.price }} +{{ item.sku_name }} ++ ++ ++ ++ +组合套餐 ++ + ++ ++ ++ ++ +{{ item.bl_name }} ++ + ++ ++ ++ ++ + +{{ $lang('common.currencySymbol') }} +{{ goodsSkuDetail.price }} +{{ goodsSkuDetail.goods_name }} ++ + ++ + ++ ++ + +{{ $lang('common.currencySymbol') }} +{{ goods.price }} +{{ goods.sku_name }} ++ +套餐价 +{{ $lang('common.currencySymbol') }} +{{ item.bl_price }} + ++ + + ++ ++ ++ +优惠券 ++ + ++ ++ ++ ++ + + +{{ $lang('common.currencySymbol') }} +{{ parseFloat(item.money) }} + + +{{ parseFloat(item.discount) }} +折 + ++ + 满{{ item.at_least }}可用 + + + 无门槛 + + ++ + + + + +{{ item.coupon_name }} +最多可抵¥{{ item.discount_limit }} +有效期:{{ $util.timeStampTurnTime(item.end_time) }} +有效期:领取之日起{{ item.fixed_term }}天内有效 +有效期:长期有效 ++ + + + + + + ++ ++ ++ +促销 ++ + ++ +满减 +{{ manjian.manjian }} ++ +满送 +{{ manjian.mansong }} ++ +包邮 +{{ manjian.free_shipping }} ++ + + + ++ + + + ++ + + + + ++ + + + + ++ + + + + + + + + + + + + + + + diff --git a/pages/goods/public/css/cart.scss b/pages/goods/public/css/cart.scss new file mode 100644 index 0000000..3b418bd --- /dev/null +++ b/pages/goods/public/css/cart.scss @@ -0,0 +1,619 @@ +.container { + width: 100vw; + height: calc(100vh - var(--tab-bar-height, 0)); + display: flex; + flex-direction: column; +} +.scroll-view { + flex: 1; + height: 0; + transform: translateX(0); +} +.cart-header { + padding: 20rpx 0; + display: flex; + align-items: center; + justify-content: space-between; + line-height: 36rpx; + background: #f7f7f7; + + .num-wrap { + margin-left: $margin-both; + color: #666666; + font-size: 26rpx; + } + + .cart-action { + line-height: inherit; + margin-right: $margin-both; + color: #666666; + font-size: 26rpx; + } + + &.invalid { + margin-left: $margin-both; + margin-top: $margin-updown; + flex: 1; + line-height: inherit; + } +} + +.cart-wrap { + margin: 0 24rpx 0; + border-radius: 16rpx; + overflow: hidden; + + .fixed-wrap { + height: 116rpx; + } + + .cart-goods { + background: #fff; + box-sizing: border-box; + position: relative; + padding: 30rpx 0 30rpx 30rpx; + &::after { + content: ''; + position: absolute; + left: 20rpx; + right: 20rpx; + height: 2rpx; + bottom: 0; + background-color: #f2f2f2; + } + &:last-of-type::after { + height: 0; + } + + .goods-wrap { + display: flex; + position: relative; + padding-left: 64rpx; + transition: all 0.1s; + & > .iconfont { + font-size: 40rpx; + position: absolute; + top: 50%; + left: 0; + transform: translateY(-50%); + transition: all 0.2s; + } + & > .icon-yuan_checkbox { + color: $color-disabled; + } + + &.edit { + transform: translateX(-70rpx); + > .iconfont { + opacity: 0; + } + } + + .goods-img { + width: 180rpx; + height: 180rpx; + + image { + width: 100%; + height: 100%; + border-radius: 8rpx; + } + } + + .goods-info { + flex: 1; + width: 0; + padding: 0 30rpx; + display: flex; + flex-direction: column; + justify-content: space-between; + + .goods-name { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; + line-height: 1.5; + font-size: $font-size-base; + } + + .sku-wrap { + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + width: 100%; + + .sku { + line-height: 1; + margin: 10rpx 0 18rpx 0; + display: inline-flex; + align-items: center; + background: #f4f4f4; + border-radius: 8rpx; + padding: 0 10rpx 0 20rpx; + + .goods-spec { + color: #666666; + font-size: 24rpx; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .iconfont { + font-size: 28rpx; + padding-left: 10rpx; + color: #666666; + } + } + } + + .goods-sub-section { + display: flex; + justify-content: space-between; + width: 100%; + align-items: center; + + .unit { + font-size: $font-size-tag; + margin-right: 4rpx; + } + + .goods-price { + display: flex; + flex-direction: row; + font-weight: bold; + color: var(--price-color); + .bottom-price { + width: 100%; + font-size: $font-size-toolbar; + line-height: 1; + color: var(--price-color); + image { + width: 56rpx; + height: 22rpx; + margin-left: 6rpx; + } + } + } + + /deep/ .decrease { + width: 52rpx; + height: 52rpx; + line-height: 48rpx; + font-size: 40rpx; + border-radius: 10rpx 0px 0px 10rpx; + } + /deep/ input { + height: 52rpx; + line-height: 52rpx; + } + /deep/ .increase { + width: 52rpx; + height: 52rpx; + line-height: 48rpx; + font-size: 40rpx; + border-radius: 0px 10rpx 10rpx 0px; + } + } + } + } + + .item-del { + position: absolute; + width: 0; + height: 99%; + color: #fff; + right: 0; + top: 0; + display: flex; + align-items: center; + justify-content: center; + transition: all 0.3s; + overflow: hidden; + white-space: nowrap; + font-size: $font-size-tag; + &.show { + width: 90rpx; + } + } + + &:first-child { + padding-top: 30rpx; + } + &:last-child { + .goods-info { + border-bottom: none; + padding-bottom: 0; + } + } + + .discount-wrap { + line-height: 1.5; + font-size: 24rpx; + margin-top: 20rpx; + display: flex; + + .discount-tag { + color: $base-color; + line-height: 1; + padding: 0 10rpx; + border-radius: $border-radius; + border: 1.5px solid $base-color; + margin-right: 10rpx; + white-space: nowrap; + line-height: 32rpx; + background: var(--main-color-shallow); + } + .interval { + height: 20rpx; + margin: 0 10rpx; + border-left: 2rpx solid #ddd; + white-space: nowrap; + margin-top: 10rpx; + &:last-child { + display: none; + } + } + .scroll-view { + flex: 1; + width: 0; + height: 100%; + white-space: nowrap; + } + } + } + + .invalid-goods { + .invalid-mark { + color: $color-tip; + padding: 6rpx 16rpx; + display: inline-block; + font-size: $font-size-goods-tag; + } + } +} +.invalid .cart-header + .cart-goods { + padding-top: 30rpx; +} + +.cart-bottom { + width: 100vw; + height: 100rpx; + background: #fff; + overflow: hidden; + display: flex; + z-index: 9; + .all-election { + height: 100rpx; + position: relative; + display: inline-block; + + & > .iconfont { + font-size: 40rpx; + position: absolute; + top: 50%; + left: 30rpx; + transform: translateY(-50%); + } + & > .icon-yuan_checkbox { + color: $color-disabled; + } + + & > text { + margin-left: 56rpx; + line-height: 100rpx; + padding-left: 30rpx; + } + } + + .settlement-info { + flex: 1; + width: 0; + padding-right: 10rpx; + display: flex; + flex-direction: column; + justify-content: center; + text-align: right; + + .money { + line-height: 1; + font-size: 32rpx; + + .value { + font-weight: bold; + color: var(--price-color); + } + + .unit { + font-size: $font-size-tag; + margin-right: 4rpx; + color: var(--price-color); + font-weight: bold; + } + } + .detail { + line-height: 1; + font-size: 22rpx; + color: #666666; + margin-top: 10rpx; + + .iconfont { + font-size: 28rpx; + margin-left: 6rpx; + transition: all 0.1s; + display: inline-block; + &.open { + transform: rotate(180deg); + } + } + } + } + + .action-btn { + // width: 200rpx; + height: 100rpx; + line-height: 100rpx; + border-radius: 0; + margin: 0; + display: flex; + justify-content: flex-end; + align-items: center; + margin-right: 30rpx; + white-space: nowrap; + + button { + padding: 0 30rpx; + height: 70rpx; + line-height: 70rpx; + font-size: $font-size-base; + font-weight: bold; + border-radius: 50rpx; + &.delete { + height: 50rpx; + line-height: 46rpx; + } + } + } +} +.cart-bottom.active { + bottom: calc(constant(safe-area-inset-bottom) + 110rpx) !important; + bottom: calc(env(safe-area-inset-bottom) + 110rpx) !important; +} +.cart-empty { + text-align: center; + padding: 140rpx $padding 80rpx $padding; + + image { + width: 380rpx; + } + + button { + min-width: 300rpx; + margin-top: 100rpx; + height: 70rpx; + line-height: 70rpx !important; + font-size: $font-size-base; + border-radius: 50rpx; + &.visit-the { + font-weight: bold; + } + } +} + +.popup { + width: 100vw; + background: #fff; + border-top-left-radius: 24rpx; + border-top-right-radius: 24rpx; + + .popup-header { + display: flex; + position: relative; + padding: 40rpx; + + .tit { + flex: 1; + font-size: $font-size-toolbar; + line-height: 1; + text-align: center; + } + .iconfont { + line-height: 1; + position: absolute; + right: 30rpx; + top: 50%; + transform: translate(0, -50%); + color: $color-tip; + font-size: $font-size-toolbar; + } + } + + .popup-body { + } +} + +.discount-popup { + .popup-body { + min-height: 300rpx; + } + + .detail-item { + height: 60rpx; + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 30rpx; + + .money { + font-weight: bold; + } + + .reduce { + color: var(--price-color); + } + } + + .total { + margin-top: 20rpx; + + .title { + font-size: 36rpx; + font-weight: bold; + } + } +} + +.coupon-use-tips { + padding: 30rpx; + line-height: 1; + background: #fff; + border-bottom: 2rpx solid #eee; + display: flex; + justify-content: space-between; + align-items: center; + + & view { + line-height: 1; + } + + .iconfont { + font-size: 28rpx; + margin-left: 4rpx; + } + .title { + font-size: 28rpx; + font-weight: 600; + } + .desc { + font-size: 26rpx; + margin-left: 24rpx; + } +} + +.coupon-item { + margin: $margin-updown $margin-both; + border-radius: 4rpx; + background: #fff; + padding: 0; + position: relative; + background-color: #fff2f0; + + &:before, + &:after { + position: absolute; + content: ''; + background-color: #fff; + top: 50%; + width: 30rpx; + height: 30rpx; + border-radius: 50%; + z-index: 5; + } + &:before { + left: 0; + transform: translate(-50%, -50%); + } + &:after { + right: 0; + transform: translate(50%, -50%); + } + + .coupon-info { + height: 190rpx; + display: flex; + width: 100%; + position: relative; + + .info-wrap { + width: 220rpx; + height: 190rpx; + display: flex; + justify-content: center; + align-items: center; + margin-right: 20rpx; + background-repeat: no-repeat; + background-size: 100% 100%; + background: linear-gradient(to left, var(--bg-color), var(--bg-color-shallow)); + position: relative; + .coupon-line { + position: absolute; + right: 0; + top: 0; + height: 100%; + } + .coupon-money { + color: #fff; + text-align: center; + line-height: 1; + .unit { + font-size: 30rpx; + } + .money { + font-size: 60rpx; + } + } + .at-least { + font-size: $font-size-tag; + color: #fff; + text-align: center; + margin-top: 20rpx; + } + } + + .desc-wrap { + flex: 1; + max-width: calc(100% - 400rpx); + + view { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .coupon-name { + margin-top: 10rpx; + margin-bottom: 4rpx; + font-size: $font-size-base; + } + .limit { + font-size: $font-size-activity-tag; + } + .time { + border-top: 2rpx dashed $color-disabled; + position: absolute; + bottom: 30rpx; + color: $color-tip; + padding-top: 10rpx; + line-height: 1.5; + font-size: $font-size-activity-tag; + } + } + + button { + font-size: $font-size-tag; + position: absolute; + top: 50%; + right: 20rpx; + transform: translate(0, -50%); + margin: 0; + height: 50rpx; + line-height: 50rpx; + width: 100rpx; + padding: 0; + &[disabled] { + background-color: #dedede !important; + } + } + } + + &.disabled { + background-color: #f2f2f2; + .coupon-money { + color: $color-tip !important; + } + .at-least { + color: $color-tip !important; + } + } +} diff --git a/pages/goods/public/css/detail.scss b/pages/goods/public/css/detail.scss new file mode 100644 index 0000000..9f5f0db --- /dev/null +++ b/pages/goods/public/css/detail.scss @@ -0,0 +1,541 @@ +// 优惠券弹出层 +.goods-coupon-popup-layer { + height: 800rpx; + .coupon-body { + position: absolute; + left: 0; + right: 0; + height: 65%; + + .coupon-item { + margin: $margin-updown $margin-both; + border-radius: 4rpx; + background: #fff; + padding: 0; + position: relative; + background-color: #fff2f0; + + &:before, + &:after { + position: absolute; + content: ''; + background-color: #fff; + top: 50%; + width: 30rpx; + height: 30rpx; + border-radius: 50%; + z-index: 5; + } + &:before { + left: 0; + transform: translate(-50%, -50%); + } + &:after { + right: 0; + transform: translate(50%, -50%); + } + + .coupon-info { + height: 190rpx; + display: flex; + width: 100%; + position: relative; + + .info-wrap { + width: 220rpx; + height: 190rpx; + display: flex; + justify-content: center; + align-items: center; + margin-right: 20rpx; + background-repeat: no-repeat; + background-size: 100% 100%; + background: linear-gradient(to left, var(--bg-color), var(--bg-color-shallow)); + position: relative; + &.disabled { + background: #dedede; + } + .coupon-line { + position: absolute; + right: 0; + top: 0; + height: 100%; + } + .coupon-money { + color: #fff; + text-align: center; + line-height: 1; + .unit { + font-size: 30rpx; + } + .money { + font-size: 60rpx; + } + } + .at-least { + font-size: $font-size-tag; + color: #fff; + text-align: center; + margin-top: 20rpx; + } + } + + .desc-wrap { + flex: 1; + max-width: calc(100% - 400rpx); + position: relative; + + view { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .coupon-name { + margin-top: 10rpx; + margin-bottom: 4rpx; + font-size: $font-size-base; + } + .limit { + font-size: $font-size-activity-tag; + } + .time { + width: 100%; + border-top: 2rpx dashed $color-disabled; + position: absolute; + bottom: 30rpx; + color: $color-tip; + padding-top: 10rpx; + line-height: 1.5; + font-size: $font-size-activity-tag; + } + } + + button { + font-size: $font-size-tag; + position: absolute; + top: 50%; + right: 20rpx; + transform: translate(0, -50%); + margin: 0; + height: 50rpx; + line-height: 50rpx; + width: 100rpx; + padding: 0; + &[disabled] { + background-color: #dedede !important; + } + } + } + + &.disabled { + background-color: #f2f2f2; + .coupon-money { + color: $color-tip !important; + } + .at-least { + color: $color-tip !important; + } + } + } + } +} + +// 满减 +.manjian-popup-layer { + height: 660rpx; + .free-tip { + min-width: 72rpx; + height: 36rpx; + line-height: 36rpx; + text-align: center; + border: 0px solid; + padding: 8rpx 8rpx; + border-radius: $border-radius; + margin-right: 20rpx; + font-size: $font-size-activity-tag; + display: inline-block; + font-weight: bold; + color: var(--main-color); + background-color: var(--main-color-shallow); + } + .manjian-body { + position: absolute; + left: 0; + right: 0; + height: 60%; + .item { + padding: $padding 0; + margin: 0 30rpx; + border-bottom: 1px solid $color-line; + .value { + margin-left: 20rpx; + } + &:last-child { + border-bottom: 0; + } + } + } +} + +// 组合套餐 +.combo-goods-wrap { + display: flex; + // width: calc(100% - 40rpx); + white-space: nowrap; + align-items: center; + padding: 20rpx 0; + + .goods-wrap { + display: flex; + align-items: center; + + .goods-item { + width: 25%; + display: inline-block; + margin-right: 30rpx; + position: relative; + vertical-align: middle; + .combo-img { + height: 160rpx; + width: 160rpx; + overflow: hidden; + border-radius: $border-radius; + position: relative; + + image { + width: 100%; + height: 100%; + } + .price-wrap { + position: absolute; + bottom: 0; + background: rgba(0, 0, 0, 0.4); + color: #fff; + left: 0; + width: 100%; + font-weight: bold; + .unit { + font-size: $font-size-tag; + margin-left: 10rpx; + } + .price { + font-size: $font-size-base; + } + } + } + + .name { + display: block; + height: 40rpx; + line-height: 40rpx; + font-size: $font-size-tag; + margin-top: 10rpx; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + } + } +} + +// 组合套餐 +.bundling-popup-layer { + height: 600rpx; + .bundling-body { + position: absolute; + left: 0; + right: 0; + height: 83%; + background-color: $color-bg; + + .bundling-view { + margin: 20rpx 30rpx; + border-radius: $border-radius; + + .bundling-item { + padding: $padding 30rpx; + background-color: #fff; + margin-bottom: 20rpx; + .title { + margin-bottom: 20rpx; + display: flex; + justify-content: space-between; + align-items: center; + .icon-right { + position: initial; + } + } + &:last-child { + margin-bottom: 0; + } + scroll-view { + width: 100%; + white-space: nowrap; + box-sizing: border-box; + .goods-wrap { + display: flex; + align-items: center; + + .goods-item { + width: 25%; + display: inline-block; + margin-right: 30rpx; + position: relative; + vertical-align: middle; + .combo-img { + height: 160rpx; + width: 160rpx; + overflow: hidden; + border-radius: $border-radius; + position: relative; + + image { + width: 100%; + height: 100%; + } + .price-wrap { + position: absolute; + bottom: 0; + background: rgba(0, 0, 0, 0.4); + color: #fff; + left: 0; + width: 100%; + font-weight: bold; + .unit { + font-size: $font-size-tag; + margin-left: 10rpx; + } + .price { + font-size: $font-size-base; + } + } + } + + .name { + display: block; + height: 40rpx; + line-height: 40rpx; + font-size: $font-size-tag; + margin-top: 10rpx; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + } + } + } + .bundling-price-wrap { + text-align: right; + margin-top: 20rpx; + .label { + font-size: $font-size-base; + vertical-align: middle; + margin-right: 20rpx; + } + .unit { + font-size: $font-size-tag; + vertical-align: middle; + margin-right: 4rpx; + font-weight: bold; + } + .price { + font-size: $font-size-toolbar; + vertical-align: middle; + font-weight: bold; + margin-right: 20rpx; + } + button { + vertical-align: middle; + background-color: var(--goods-btn-color); + } + } + } + } + } +} + +.newdetail { + .item { + &.coupon { + .coupon-list { + flex: 1; + overflow: hidden; + line-height: 1; + height: 60rpx; + // line-height: 40rpx; + max-width: 84%; + box-sizing: border-box; + } + .coupon-item { + margin-top: 8rpx; + margin-bottom: 10rpx; + padding: 3rpx 16rpx; + margin-right: 20rpx; + position: relative; + border: 1.5px solid; + background-size: cover; + border-radius: 6rpx; + display: inline-block; + // height: 40rpx; + // line-height: 34rpx; + box-sizing: border-box; + // &:nth-child(2) { + // margin-left: 0; + // } + border-color: var(--goods-coupon); + &::after, + &::before { + content: ''; + width: 12rpx; + height: 12rpx; + position: absolute; + top: 50%; + border-radius: $border-radius; + background: #fff; + border: 1px solid var(--goods-coupon) !important; + } + &::after { + left: -10rpx; + transform: translateY(-50%) rotate(-45deg); + border-top-color: transparent !important; + border-left-color: transparent !important; + } + &::before { + right: -10rpx; + transform: translateY(-50%) rotate(-45deg); + border-bottom-color: transparent !important; + border-right-color: transparent !important; + } + &:first-child { + margin-left: 0; + } + &:last-child { + margin-right: 0; + } + view { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-size: 24rpx; + text-align: center; + line-height: 1.5; + // height: 36rpx; + // height: 36rpx; + // line-height: 34rpx; + color: var(--goods-coupon); + font-weight: bold; + } + } + } + } +} + +.more-img-wrap { + width: 38rpx; + height: 38rpx; + position: absolute; + right: 30rpx; + image { + width: 100%; + height: 100%; + } +} + +// 会员卡 +.member-card-wrap { + margin-top: 20rpx; + height: 80rpx; + border-radius: 10rpx; + background: linear-gradient(to right, var(--goods-card-bg), var(--goods-card-bg-shallow)); + display: flex; + align-items: center; + padding: 0 20rpx; + color: var(--goods-card-color); + + .icon-huiyuan { + margin-right: 10rpx; + line-height: 1; + font-size: 32rpx; + } + + .info { + flex: 1; + color: #e5ce75; + font-size: $font-size-tag; + } + + .btn { + text-align: center; + line-height: 50rpx; + height: 50rpx; + border-radius: 6rpx; + width: 160rpx; + font-size: $font-size-tag; + color: #222; + font-weight: bold; + background: var(--goods-card-color); + } +} + +.goods-promotion { + background: var(--promotion-color); + height: 75px; + .price-info { + display: flex; + flex-direction: row; + align-items: center; + justify-content: flex-start; + .icon-box { + margin-right: 20rpx; + .iconfont { + font-size: 60rpx; + color: #ffffff; + } + } + .price-box { + display: flex; + align-items: flex-start; + flex-direction: column; + height: 100%; + justify-content: center; + .promotion-text { + font-size: 36rpx; + color: #fff; + line-height: 1; + } + .sale-num { + display: flex; + align-items: center; + margin-top: 18rpx; + view { + color: #ffffff; + line-height: 1; + } + } + } + } +} +.countdown { + width: 220rpx; + background: var(--promotion-aux-color); + .txt { + color: #ffffff !important; + font-size: 28rpx !important; + } + .clockrun { + margin-top: 16rpx !important; + } + &:after { + position: absolute; + content: ''; + top: calc(50% - 15rpx); + z-index: 5; + left: -15rpx; + width: 0; + height: 0; + border-style: solid; + border-width: 15rpx 15rpx 15rpx 0; + border-color: transparent var(--promotion-aux-color) transparent transparent; + } +} \ No newline at end of file diff --git a/pages/goods/public/css/list.scss b/pages/goods/public/css/list.scss new file mode 100644 index 0000000..5da1554 --- /dev/null +++ b/pages/goods/public/css/list.scss @@ -0,0 +1,563 @@ +.head-wrap { + background: #fff; + position: fixed; + width: 100%; + left: 0; + z-index: 1; + + .search-wrap { + flex: 0.5; + padding: 30rpx 30rpx 0; + font-size: $font-size-tag; + display: flex; + align-items: center; + .iconfont{ + margin-left: 16rpx; + font-size: 36rpx; + } + .input-wrap { + flex: 1; + display: flex; + justify-content: space-between; + align-items: center; + background: $color-bg; + height: 70rpx; + padding-left: 10rpx; + border-radius: 70rpx; + input { + width: 90%; + background: $color-bg; + font-size: $font-size-tag; + height: 50rpx; + padding: 10rpx 25rpx 10rpx 40rpx; + line-height: 50rpx; + border-radius: 40rpx; + } + text { + font-size: $font-size-toolbar; + color: $color-tip; + width: 80rpx; + text-align: center; + margin-right: 20rpx; + } + } + .category-wrap, + .list-style { + display: flex; + justify-content: center; + align-items: center; + .iconfont { + font-size: 50rpx; + color: $color-tip; + } + text { + display: block; + margin-top: 60rpx; + } + } + } + + .sort-wrap { + display: flex; + padding: 10rpx 20rpx 10rpx 0; + > view { + flex: 1; + text-align: center; + font-size: $font-size-base; + height: 60rpx; + line-height: 60rpx; + font-weight: bold; + } + .comprehensive-wrap { + display: flex; + justify-content: center; + align-items: center; + .iconfont-wrap { + display: inline-block; + margin-left: 10rpx; + width: 40rpx; + .iconfont { + font-size: $font-size-toolbar; + line-height: 1; + margin-bottom: 5rpx; + } + } + } + .price-wrap { + display: flex; + justify-content: center; + align-items: center; + .iconfont-wrap { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + width: 40rpx; + .iconfont { + position: relative; + float: left; + font-size: 32rpx; + line-height: 1; + height: 20rpx; + color: #909399; + &.asc{ + top: -2rpx; + } + &.desc{ + top: -6rpx; + } + } + } + } + .screen-wrap { + display: flex; + justify-content: center; + align-items: center; + .iconfont-wrap { + display: inline-block; + margin-left: 10rpx; + width: 40rpx; + .iconfont { + font-size: $font-size-toolbar; + line-height: 1; + } + } + } + } +} + +.category-list-wrap { + height: 100%; + .class-box { + display: flex; + flex-wrap: wrap; + padding: 0 $padding; + view { + width: calc((100% - 60rpx) / 3); + font-size: $font-size-goods-tag; + margin-right: 20rpx; + height: 60rpx; + line-height: 60rpx; + text-align: center; + margin-bottom: 12rpx; + flex-shrink: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + background: rgba(245, 245, 245, 1); + border-radius: 5rpx; + &:nth-of-type(3n) { + margin-right: 0; + } + } + } + .first { + font-size: $font-size-tag; + display: block; + // background: $page-color-base; + padding: 20rpx; + } + .second { + border-bottom: 2rpx solid $color-line; + padding: 20rpx; + display: block; + font-size: $font-size-tag; + } + .third { + padding: 0 20rpx 20rpx; + overflow: hidden; + font-size: $font-size-tag; + > view { + display: inline-block; + margin-right: 20rpx; + margin-top: 20rpx; + } + .uni-tag { + padding: 0 20rpx; + } + } +} + +.screen-wrap { + .title { + font-size: $font-size-tag; + padding: $padding; + background: #f6f4f5; + } + scroll-view { + height: 85%; + .item-wrap { + border-bottom: 1px solid #f0f0f0; + .label { + font-size: $font-size-tag; + padding: $padding; + view { + display: inline-block; + font-size: 60rpx; + height: 40rpx; + vertical-align: middle; + line-height: 40rpx; + } + } + + .list { + margin: $margin-updown $margin-both; + overflow: hidden; + > view { + display: inline-block; + margin-right: 25rpx; + margin-bottom: 25rpx; + } + .uni-tag { + padding: 0 $padding; + font-size: $font-size-goods-tag; + background: #f5f5f5; + height: 52rpx; + line-height: 52rpx; + border: 0; + } + } + .price-wrap { + display: flex; + justify-content: center; + align-items: center; + padding: $padding; + input { + flex: 1; + background: #f5f5f5; + height: 52rpx; + width: 182rpx; + line-height: 50rpx; + font-size: $font-size-goods-tag; + border-radius: 50rpx; + text-align: center; + &:first-child { + margin-right: 10rpx; + } + &:last-child { + margin-left: 10rpx; + } + } + } + } + } + .footer { + height: 90rpx; + display: flex; + justify-content: center; + align-items: flex-start; + display: flex; + //position: absolute; + bottom: 0; + width: 100%; + .footer-box { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + margin: 0; + width: 40%; + } + .footer-box1 { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + margin: 0; + width: 40%; + } + } +} +.safe-area { + bottom: 68rpx !important; +} +.empty { + margin-top: 100rpx; +} +.buy-num { + font-size: $font-size-activity-tag; +} +.icon { + width: 34rpx; + height: 30rpx; +} +.list-style-new { + display: flex; + align-items: center; + .line { + width: 4rpx; + height: 28rpx; + background-color: rgba(227, 227, 227, 1); + margin-right: 60rpx; + } +} +.h-line { + width: 37rpx; + height: 2rpx; + background-color: $color-tip; +} + +.lineheight-clear { +} +// 商品列表单列样式 +.goods-list.single-column { + display: none; + + &.show { + display: block; + } + + .goods-item { + padding: 26rpx; + background: #fff; + margin: $margin-updown $margin-both; + border-radius: $border-radius; + display: flex; + position: relative; + + .goods-img { + width: 200rpx; + height: 200rpx; + // overflow: hidden; + border-radius: $border-radius; + margin-right: 20rpx; + overflow: hidden; + + image { + width: 200rpx; + height: 200rpx; + } + } + + .goods-tag { + color: #fff; + line-height: 1; + padding: 8rpx 12rpx; + position: absolute; + border-top-left-radius: $border-radius; + border-bottom-right-radius: $border-radius; + top: 26rpx; + left: 26rpx; + font-size: $font-size-goods-tag; + } + + .goods-tag-img { + position: absolute; + border-top-left-radius: $border-radius; + width: 80rpx; + height: 80rpx; + top: 26rpx; + left: 26rpx; + z-index: 5; + overflow: hidden; + + image { + width: 100%; + height: 100%; + } + } + + .info-wrap { + flex: 1; + display: flex; + flex-direction: column; + } + + .name-wrap { + flex: 1; + } + + .goods-name { + font-size: $font-size-base; + line-height: 1.3; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + } + + .introduction { + line-height: 1; + margin-top: 10rpx; + } + + .discount-price { + display: inline-block; + font-weight: bold; + line-height: 1; + margin-top: 16rpx; + + .unit { + margin-right: 6rpx; + color: var(--price-color); + } + .price { + color: var(--price-color); + } + } + + .pro-info { + display: flex; + margin-top: auto; + + .delete-price { + text-decoration: line-through; + flex: 1; + + .unit { + margin-right: 0rpx; + } + } + + & > view { + line-height: 1; + font-size: $font-size-tag !important; + + &:nth-child(2) { + text-align: right; + } + } + } + + .member-price-tag { + display: inline-block; + width: 60rpx; + line-height: 1; + margin-left: 6rpx; + + image { + width: 100%; + display: flex; + max-height: 30rpx; + } + } + } +} +// 商品列表双列样式 +.goods-list.double-column { + display: none; + margin: 0 $margin-both; + padding-top: $margin-updown; + position: relative; + flex-wrap: wrap; + justify-content: space-between; + + &.show { + display: flex; + } + + .goods-item { + background-color: #fff; + width: calc(50% - 10rpx); + border-radius: $border-radius; + overflow: hidden; + + &:nth-child(2n+2) { + margin-right: 0; + } + + .goods-img { + position: relative; + overflow: hidden; + padding-top: 100%; + border-top-left-radius: $border-radius; + border-top-right-radius: $border-radius; + + image { + width: 100%; + position: absolute !important; + top: 50%; + left: 0; + transform: translateY(-50%); + } + } + + .goods-tag { + color: #fff; + line-height: 1; + padding: 8rpx 16rpx; + position: absolute; + border-bottom-right-radius: $border-radius; + top: 0; + left: 0; + font-size: $font-size-goods-tag; + } + + .goods-tag-img { + position: absolute; + border-top-left-radius: $border-radius; + width: 80rpx; + height: 80rpx; + top: 0; + left: 0; + z-index: 5; + overflow: hidden; + + image { + width: 100%; + height: 100%; + } + } + + .info-wrap { + padding: 0 26rpx 26rpx 26rpx; + } + + .goods-name { + font-size: $font-size-base; + line-height: 1.3; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + margin-top: 20rpx; + } + + .discount-price { + display: inline-block; + font-weight: bold; + line-height: 1; + margin-top: 16rpx; + + .unit { + margin-right: 6rpx; + color: var(--price-color); + } + .price { + color: var(--price-color); + } + } + + .pro-info { + display: flex; + margin-top: auto; + + .delete-price { + text-decoration: line-through; + flex: 1; + + .unit { + margin-right: 6rpx; + } + } + + & > view { + line-height: 1; + font-size: $font-size-tag !important; + + &:nth-child(2) { + text-align: right; + } + } + } + + .member-price-tag { + display: inline-block; + width: 60rpx; + line-height: 1; + margin-left: 6rpx; + + image { + width: 100%; + } + } + } +} diff --git a/pages/goods/public/js/cart.js b/pages/goods/public/js/cart.js new file mode 100644 index 0000000..90d6475 --- /dev/null +++ b/pages/goods/public/js/cart.js @@ -0,0 +1,589 @@ +export default { + data() { + return { + token: '', + cartData: [], // 购物车 + checkAll: true, + totalPrice: '0.00', + totalCount: 0, + modifyFlag: false, + isSub: false, + invalidGoods: [], // 失效商品集合 + isIphoneX: false, //判断手机是否是iphoneX以上, + cartBottom: '56px', + isAction: false, // 是否操作删除 + goodsSkuDetail: null, + discount: {}, + manjian: {}, + receiveSub: false, + discountPopupShow: false, + + startX: '', // 触摸开始位置 + endX: '', // 触摸结束位置 + refresherTriggered: false // 设置当前下拉刷新状态,true 表示下拉刷新已经被触发,false 表示下拉刷新未被触发 + }; + }, + onLoad() { + uni.hideTabBar(); + }, + onShow() { + if (uni.getStorageSync('token')) { + this.getCartData(); + } else { + this.token = ''; + this.cartData = []; + this.invalidGoods = []; + this.calculationTotalPrice(); + } + this.isIphoneX = this.$util.uniappIsIPhoneX(); + if (this.$util.uniappIsIPhone11()) { + this.cartBottom = '90px'; + } + }, + onReady() { + if (!uni.getStorageSync('token')) { + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + } + }, + computed: { + hasData() { + return this.cartData.length > 0 || this.invalidGoods.length > 0; + }, + storeToken() { + return this.$store.state.token; + } + }, + watch: { + storeToken: function(nVal, oVal) { + this.getCartData(); + } + }, + methods: { + initNum(item) { + let max_buy = item.max_buy > 0 && item.max_buy < item.stock ? item.max_buy : item.stock; + max_buy = max_buy == 0 ? 1 : max_buy; + if (item.num > max_buy) return max_buy; + return item.num; + }, + /** + * 获取购物车数据 + */ + getCartData() { + this.$api.sendRequest({ + url: '/api/cart/goodslists', + success: res => { + if (res.code >= 0) { + this.token = uni.getStorageSync('token'); + if (res.data.length) this.handleCartData(res.data); + else this.cartData = []; + } else { + this.token = ''; + } + this.refresherTriggered = false; + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + }, + fail: res => { + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + } + }); + }, + /** + * 处理购物车数据结构 + */ + handleCartData(data) { + this.invalidGoods = []; + this.cartData = []; + var temp = {}; + data.forEach((item, index) => { + if (item.goods_state == 1) { + // 如果最小限购超出库存则该商品失效 + if (item.min_buy > 0 && item.min_buy > item.stock) { + this.invalidGoods.push(item); + } else { + item.checked = true; + item.edit = false; + if (temp['site_' + item.site_id] != undefined) { + temp['site_' + item.site_id].cartList.push(item); + } else { + temp['site_' + item.site_id] = { + siteId: item.site_id, + siteName: item.site_name, + edit: false, + checked: true, + cartList: [item] + }; + } + } + } else { + this.invalidGoods.push(item); + } + }); + + this.cartData = []; + Object.keys(temp).forEach(key => { + this.cartData.push(temp[key]); + }); + this.calculationTotalPrice(); + if (this.cartData.length) { + this.cartData[0].cartList.forEach(v => { + if (v.sku_spec_format) { + v.sku_spec_format = JSON.parse(v.sku_spec_format); + } else { + v.sku_spec_format = []; + } + }); + } + if (this.invalidGoods.length) { + this.invalidGoods.forEach(v => { + if (v.sku_spec_format) { + v.sku_spec_format = JSON.parse(v.sku_spec_format); + } else { + v.sku_spec_format = []; + } + }); + } + }, + /** + * 单选 + * @param {Object} index + */ + singleElection(siteIndex, index) { + this.cartData[siteIndex].cartList[index].checked = !this.cartData[siteIndex].cartList[index].checked; + this.calculationTotalPrice(); + }, + /** + * 店铺全选 + * @param {Object} checked + */ + siteAllElection(checked, index) { + this.cartData[index].checked = checked; + this.cartData[index].cartList.forEach(item => { + item.checked = checked; + }); + this.calculationTotalPrice(); + }, + /** + * 全选 + */ + allElection(checked) { + if (typeof checked == 'boolean') { + this.checkAll = checked; + } else { + this.checkAll = !this.checkAll; + } + if (this.cartData.length) { + this.cartData.forEach(siteItem => { + siteItem.checked = this.checkAll; + siteItem.cartList.forEach(item => { + item.checked = this.checkAll; + }); + }); + } + this.calculationTotalPrice(); + }, + /** + * 计算购物车总价 + */ + calculationTotalPrice() { + if (this.cartData.length) { + let totalPrice = 0, + totalCount = 0, + siteAllElectionCount = 0; + + this.cartData.forEach(siteItem => { + let siteGoodsCount = 0; + siteItem.cartList.forEach(item => { + if (item.checked) { + siteGoodsCount += 1; + totalCount += parseInt(item.num); + if (Number(item.member_price) > 0 && Number(item.member_price) < Number(item + .discount_price)) { + totalPrice += item.member_price * item.num; + } else { + totalPrice += item.discount_price * item.num; + } + } + }); + if (siteItem.cartList.length == siteGoodsCount) { + siteItem.checked = true; + siteAllElectionCount += 1; + } else { + siteItem.checked = false; + } + }); + this.totalPrice = totalPrice.toFixed(2); + this.totalCount = totalCount; + this.checkAll = this.cartData.length == siteAllElectionCount; + } else { + this.totalPrice = '0.00'; + this.totalCount = 0; + } + this.modifyFlag = false; + this.discountCalculate(); + }, + /** + * 删除购物车 + * @param {Object} siteIndex + * @param {Object} cartIndex + */ + deleteCart(tag, siteIndex, cartIndex) { + var cart_id = []; + if (tag == 'all') { + for (let i = 0; i < this.cartData.length; i++) { + for (let j = 0; j < this.cartData[i].cartList.length; j++) { + if (this.cartData[i].cartList[j].checked) cart_id.push(this.cartData[i].cartList[j].cart_id); + } + } + } else { + cart_id.push(this.cartData[siteIndex].cartList[cartIndex].cart_id); + } + if (cart_id.length == 0) { + this.$util.showToast({ + title: '请选择要删除的商品' + }); + return; + } + + uni.showModal({ + title: '提示', + content: '确定要删除这些商品吗?', + success: res => { + if (res.confirm) { + cart_id = cart_id.toString(); + this.calculationTotalPrice(); + this.getCartNumber(); + this.$api.sendRequest({ + url: '/api/cart/delete', + data: { + cart_id + }, + success: res => { + if (res.code >= 0) { + if (tag == 'all') { + for (var i = 0; i < this.cartData.length; i++) { + for (var j = 0; j < this.cartData[i].cartList + .length; j++) { + var item = this.cartData[i].cartList[j]; + if (item.checked) { + this.cartData[i].cartList.splice(j, 1); + j = -1; + } + } + if (this.cartData[i].cartList.length == 0) { + this.cartData.splice(i, 1); + i = -1; + } + } + } else { + this.cartData[siteIndex].cartList.splice(cartIndex, 1); + if (this.cartData[siteIndex].cartList.length == 0) this + .cartData.splice(siteIndex, 1); + } + this.calculationTotalPrice(); + this.getCartNumber(); + } else { + this.$util.showToast({ + title: res.message + }); + } + } + }); + } + } + }); + }, + /** + * 变更购物车数量 + * @param {Object} params + */ + cartNumChange(num, params) { + if (isNaN(num)) return; + let data = this.cartData[params.siteIndex].cartList[params.cartIndex], + max_buy = data.is_limit && data.max_buy > 0 && data.max_buy < data.stock ? data.max_buy : data.stock, + min_buy = data.min_buy > 0 ? data.min_buy : 1; + if (num > max_buy) num = max_buy; + if (num < min_buy) num = min_buy; + + this.modifyFlag = true; + this.$api.sendRequest({ + url: '/api/cart/edit', + data: { + num, + cart_id: this.cartData[params.siteIndex].cartList[params.cartIndex].cart_id + }, + success: res => { + if (res.code >= 0) { + this.cartData[params.siteIndex].cartList[params.cartIndex].num = num; + this.calculationTotalPrice(); + this.getCartNumber(); + } else { + this.$util.showToast({ + title: res.message + }); + } + } + }); + }, + /** + * 结算 + */ + settlement() { + if (this.totalCount > 0) { + let cart_ids = []; + this.cartData.forEach(siteItem => { + siteItem.cartList.forEach(item => { + if (item.checked) { + cart_ids.push(item.cart_id); + } + }); + }); + + if (this.discount.coupon_info && this.discount.coupon_info.receive_type == 'wait') this.receiveCoupon( + this.discount.coupon_info.coupon_type_id, false); + + if (this.isSub) return; + this.isSub = true; + + uni.removeStorageSync('delivery'); + uni.setStorage({ + key: 'orderCreateData', + data: { + cart_ids: cart_ids.toString() + }, + success: () => { + this.$util.redirectTo('/pages/order/payment'); + this.isSub = false; + } + }); + } + }, + /** + * 清空失效商品 + */ + clearInvalidGoods() { + uni.showModal({ + title: '提示', + content: '确定要清空这些商品吗?', + success: res => { + if (res.confirm) { + var cart_ids = []; + this.invalidGoods.forEach(goodsItem => { + cart_ids.push(goodsItem.cart_id); + }); + if (cart_ids.length) { + this.$api.sendRequest({ + url: '/api/cart/delete', + data: { + cart_id: cart_ids.toString() + }, + success: res => { + if (res.code >= 0) { + this.invalidGoods = []; + this.getCartNumber(); + } else { + this.$util.showToast({ + title: res.message + }); + } + } + }); + } + } + } + }); + }, + imageError(siteIndex, cartIndex) { + this.cartData[siteIndex].cartList[cartIndex].sku_image = this.$util.getDefaultImage().goods; + this.$forceUpdate(); + }, + toGoodsDetail(item) { + this.$util.redirectTo('/pages/goods/detail', { + sku_id: item.sku_id + }); + }, + // 购物车数量 + getCartNumber() { + if (uni.getStorageSync('token')) { + this.$store.dispatch('getCartNumber'); + this.resetEditStatus(); + } + }, + goodsLimit(event, index) { + let data = this.cartData[0].cartList[index]; + if (event.type == 'plus') { + if (data.max_buy > 0 && data.max_buy < data.stock) { + this.$util.showToast({ + title: '该商品每人限购' + data.max_buy + '件' + }); + } else { + this.$util.showToast({ + title: '库存不足' + }); + } + } else { + this.$util.showToast({ + title: '最少购买' + event.value + '件' + }); + } + }, + toLogin() { + this.$refs.login.open(); + }, + // 重置编辑状态 + resetEditStatus() { + if (this.cartData.length) { + for (var i = 0; i < this.cartData[0].cartList.length; i++) { + this.cartData[0].cartList[i].edit = false; + } + this.$forceUpdate(); + } + }, + changeAction() { + this.isAction = !this.isAction; + this.resetEditStatus(); + }, + selectSku(data) { + let goodsSkuDetail = this.$util.deepClone(data); + if (goodsSkuDetail.goods_spec_format) goodsSkuDetail.goods_spec_format = JSON.parse(goodsSkuDetail + .goods_spec_format); + this.goodsSkuDetail = goodsSkuDetail; + + setTimeout(() => { + this.$refs.selectSku.show('confirm', (sku_id, num) => { + this.$api.sendRequest({ + url: '/api/cart/editcartsku', + data: { + cart_id: data.cart_id, + sku_id: sku_id, + num: num + }, + success: res => { + if (res.code >= 0) { + this.invalidGoods = []; + this.getCartData(); + this.getCartNumber(); + } else { + this.$util.showToast({ + title: res.message + }); + } + } + }); + }, this.goodsSkuDetail); + }) + }, + toggleDiscountPopup() { + if (this.$refs.discountPopup.showPopup) this.$refs.discountPopup.close(); + else this.$refs.discountPopup.open(); + this.discountPopupShow = !this.discountPopupShow; + }, + /** + * 优惠信息计算 + */ + discountCalculate() { + let skuIds = []; + this.cartData.forEach(siteItem => { + siteItem.cartList.forEach(item => { + if (item.checked) { + skuIds.push({ + sku_id: item.sku_id, + num: item.num + }); + } + }); + }); + if (!skuIds.length) { + this.discount = {}; + return; + } + this.$api.sendRequest({ + url: '/api/cartcalculate/calculate', + data: { + sku_ids: JSON.stringify(skuIds) + }, + success: res => { + if (res.code >= 0 && res.data && (res.data.coupon_money > 0 || res.data + .promotion_money > 0)) { + this.discount = res.data; + let manjian = {}; + res.data.goods_list.forEach(item => { + if (item.promotion && item.promotion.manjian) { + manjian['sku_' + item.sku_id] = JSON.parse(item.promotion.manjian + .rule_json); + } + }) + Object.assign(this.manjian, manjian); + this.refresherTriggered = false; + } else { + this.discount = {}; + } + } + }) + }, + /** + * 领取优惠券 + * tips 失败时是否提示 + * @param {Object} couponTypeId + */ + receiveCoupon(couponTypeId, tips = true) { + if (this.receiveSub) return; + this.receiveSub = true; + this.$api.sendRequest({ + url: '/coupon/api/coupon/receive', + data: { + coupon_type_id: couponTypeId, + get_type: 2 //获取方式:1订单2.直接领取3.活动领取 + }, + success: res => { + if (res.code == 0) { + this.$set(this.discount.coupon_info, 'receive_type', ''); + } else { + if (tips) this.$util.showToast({ + title: res.message + }); + this.receiveSub = false; + } + } + }); + }, + // 手指触摸事件 用于菜单左滑 + touchS(e) { + this.startX = e.touches[0].clientX; + // console.log('开始' + e.touches[0].clientX); + }, + touchE(e, cartIndex) { + this.endX = e.changedTouches[0].clientX; + // 触摸开始到停止的差值,小于0左滑,大于0右滑 + var disX = this.startX - this.endX; + // cartIndex.edit = disX > 50; + if (disX > 50) cartIndex.edit = true; + else if (disX < 0) cartIndex.edit = false; + this.$forceUpdate(); + }, + moneyFormat(money) { + if (isNaN(parseFloat(money))) return money; + return parseFloat(money).toFixed(2); + }, + refreshSkuDetail(goodsSkuDetail) { + this.goodsSkuDetail = goodsSkuDetail; + }, + onRefresh(e) { + this.refresherTriggered = true; + if (uni.getStorageSync('token')) { + this.getCartData(); + } else { + this.token = ''; + this.cartData = []; + this.invalidGoods = []; + this.calculationTotalPrice(); + } + this.isIphoneX = this.$util.uniappIsIPhoneX(); + if (this.$util.uniappIsIPhone11()) { + this.cartBottom = '90px'; + } + } + }, + onHide() { + this.isAction = false; + }, +} diff --git a/pages/goods/public/js/detail.js b/pages/goods/public/js/detail.js new file mode 100644 index 0000000..eb06b86 --- /dev/null +++ b/pages/goods/public/js/detail.js @@ -0,0 +1,577 @@ +export default { + data() { + return { + goodsRoute: '/pages/goods/detail', + couponList: [], //优惠券列表 + couponBtnSwitch: false, //获取优惠券防止重复提交 + + posterApi: '/api/goods/poster', + + //满减活动 + manjian: { + type: 0, + manjian_name: "", + rule_json: null + }, + //组合套餐 + bundlingType: false, + bundling: [{ + bundling_goods: { + bl_name: '', + sku_image: '' + } + }], + + levelInfo: {}, + showFenxiao: 0, + membercard: null, // 会员卡信息 + hackReset: true, + cardOff: false + } + }, + computed: { + showDiscount() { + var flag = false; + if ( + this.preview == 0 && + this.addonIsExist.discount && + this.goodsSkuDetail.promotion_type == 1 && + this.goodsSkuDetail.discountTimeMachine && + (!this.goodsSkuDetail.member_price || + (this.goodsSkuDetail.member_price > 0 && Number(this.goodsSkuDetail.member_price) > Number(this + .goodsSkuDetail.discount_price)) + ) + ) { + flag = true; + } + return flag; + }, + memberCardDiscount() { + let discount = 0, + showPrice = this.goodsSkuDetail.member_price > 0 && Number(this.goodsSkuDetail.member_price) < Number( + this.goodsSkuDetail + .discount_price) ? this.goodsSkuDetail.member_price : this.goodsSkuDetail.discount_price; + if (this.membercard && this.membercard.member_price > 0 && (parseFloat(showPrice) > parseFloat(this + .membercard.member_price))) { + discount = parseFloat(showPrice) - parseFloat(this.membercard.member_price); + } + return discount.toFixed(2); + }, + bgNav() { + if (this.globalS.topNavColor) { + return { + background: this.globalS.topNavColor + }; + } else { + return { + background: '#ffffff' + }; + } + }, + textNavColor() { + if (this.globalS && this.globalS.textNavColor) { + return this.globalS.textNavColor; + } else { + return '#ffffff'; + } + }, + + }, + onLoad(data) { + this.skuId = data.sku_id || 0; + this.goodsId = data.goods_id || 0; + // 小程序扫码进入 + if (data.scene) { + var sceneParams = decodeURIComponent(data.scene); + sceneParams = sceneParams.split('&'); + if (sceneParams.length) { + sceneParams.forEach(item => { + if (item.indexOf('goods_id') != -1) this.goodsId = item.split('-')[1]; + }); + } + } + // #ifdef MP-WEIXIN + this.getShareImg(); + // #endif + }, + async onShow() { + //同步获取商品详情 + await this.getGoodsSkuDetail(); + + // 开启预览,禁止任何操作和跳转 + if (this.preview == 0) { + this.getCoupon(); + + this.getManjian(); + + //组合套餐 + this.getBundling(); + + if (this.addonIsExist.fenxiao == 1) { + this.getFenxiaoGoodsDetail() + } + } + }, + onHide() { + this.couponBtnSwitch = false; + }, + methods: { + setSkuId(val) { + if (val) { + this.skuId = val; + this.getBundling(); + } + }, + //请求佣金详情 + getFenxiaoGoodsDetail() { + this.$api.sendRequest({ + url: '/fenxiao/api/goods/detail', + data: { + sku_id: this.skuId, + }, + success: res => { + if (res.code == 0 && res.data) { + this.levelInfo = res.data; + } + } + }); + }, + // 获取商品详情 + async getGoodsSkuDetail() { + let res = await this.$api.sendRequest({ + url: '/api/goodssku/detail', + async: false, + data: { + sku_id: this.skuId, + goods_id: this.goodsId, + } + }); + let data = res.data; + if (data.goods_sku_detail != null) { + if (data.goods_sku_detail.promotion_type == 'presale' && data.goods_sku_detail.presale_id) { + this.$util.redirectTo('/pages_promotion/presale/detail', { + id: data.goods_sku_detail.presale_id, + sku_id: this.skuId + }, 'reLaunch'); + return; + } + + this.goodsSkuDetail = data.goods_sku_detail; + if (!this.skuId) this.skuId = this.goodsSkuDetail.sku_id; + if (!this.goodsId) this.goodsId = this.goodsSkuDetail.goods_id; + // 分享参数、链接 + this.shareQuery = 'goods_id=' + this.goodsSkuDetail.goods_id; + this.shareUrl = this.goodsRoute + '?' + this.shareQuery; + + // 在线客服聊天参数 + this.chatRoomParams = { + sku_id: this.goodsSkuDetail.sku_id + }; + let typeId = this.goodsSkuDetail.goods_promotion[0]; + if (typeId) { + // 限时折扣 + if (typeId.discount_id) { + this.chatRoomParams.type = 'discount' + this.chatRoomParams.type_id = typeId.discount_id + } + } + + // 海报参数 + this.posterParams = { + goods_id: this.goodsId + }; + + // 处理商品数据 + this.handleGoodsSkuData(); + // 限时折扣 + if (this.goodsSkuDetail.promotion_type == 1 && this.addonIsExist.discount) { + //检测倒计时 + if ((this.goodsSkuDetail.end_time - res.timestamp) > 0) { + this.goodsSkuDetail.discountTimeMachine = this.$util.countDown(this.goodsSkuDetail + .end_time - res.timestamp); + } else { + this.goodsSkuDetail.promotion_type = 0; + } + } + if (this.goodsSkuDetail.promotion_type == 1 && this.goodsSkuDetail.discountTimeMachine) { + if (this.goodsSkuDetail.member_price > 0 && Number(this.goodsSkuDetail.member_price) <= Number( + this.goodsSkuDetail + .discount_price)) { + this.goodsSkuDetail.show_price = this.goodsSkuDetail.member_price; + } else { + this.goodsSkuDetail.show_price = this.goodsSkuDetail.discount_price; + } + } else { + if (this.goodsSkuDetail.member_price > 0) { + this.goodsSkuDetail.show_price = this.goodsSkuDetail.member_price; + } else { + this.goodsSkuDetail.show_price = this.goodsSkuDetail.price; + } + } + + if (this.token != '' && this.preview == 0) { + if (this.addonIsExist.supermember) { + this.getMemberInfo(); + } + } + + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + + } else { + this.$util.redirectTo('/pages_tool/goods/not_exist', {}, 'redirectTo'); + } + }, + refreshLevelInfo(data) { + if (data) { + this.$refs.refLeverInfo.levelInfo.commission_money = data.commission_money; + } + }, + choiceSku() { + this.$refs.goodsSku.show("buy_now", () => { + this.getCartCount(); + }); + }, + // 加入购物车 + joinCart() { + if (!uni.getStorageSync('token') && this.preview == 0) { + this.$refs.login.open(this.shareUrl); + return; + } + if (this.goodsSkuDetail.is_virtual == 1) { + this.$refs.goodsSku.show("buy_now", () => { + this.getCartCount(); + }); + } else { + this.$refs.goodsSku.show("join_cart", () => { + this.getCartCount(); + }); + } + }, + // 立即购买 + buyNow() { + if (!uni.getStorageSync('token') && this.preview == 0) { + this.$refs.login.open(this.shareUrl); + return; + } + this.$refs.goodsSku.show("buy_now", () => {}); + }, + + //-------------------------------------优惠券------------------------------------- + + getCoupon() { + this.$api.sendRequest({ + url: "/coupon/api/coupon/goodsCoupon", + data: { + goods_id: this.goodsSkuDetail.goods_id + }, + success: res => { + let data = res.data; + if (data) { + this.couponList = data; + + this.couponList.forEach(v => { + if (v.count == v.lead_count) v.useState = 2; + else if (v.max_fetch != 0 && v.member_coupon_num && v + .member_coupon_num >= v.max_fetch) v.useState = 1; + else v.useState = 0; + }); + this.couponList = this.couponList.sort(this.sortBy('useState')) + } + } + }); + }, + sortBy(field) { + //根据传过来的字段进行排序,y-x 得分从高到低,x-y 从低到高 + return (y, x) => { + return y[field] - x[field] + } + }, + + // 打开优惠券弹出层 + openCouponPopup() { + this.$refs.couponPopup.open(); + }, + // 关闭优惠券弹出层 + closeCouponPopup() { + this.$refs.couponPopup.close(); + }, + // 领取优惠券 + receiveCoupon(item) { + let that = this; + if (this.preview) return; // 开启预览,禁止任何操作和跳转 + if (this.couponBtnSwitch) return; + this.couponBtnSwitch = true; + if (this.token) { + this.$api.sendRequest({ + url: '/coupon/api/coupon/receive', + data: { + coupon_type_id: item.coupon_type_id, + get_type: 2 //获取方式:1订单2.直接领取3.活动领取 + }, + success: res => { + var data = res.data; + + let msg = ''; + + let list = this.couponList; + if (res.data.is_exist == 1 && res.code < 0) { + msg = '您已领取过该优惠券,快去使用吧'; + } else if (res.code == 0) { + msg = '领取成功,快去使用吧'; + } else { + msg = res.message; + } + if (res.data.is_exist == 1) { + for (let i = 0; i < list.length; i++) { + if (list[i].coupon_type_id == item.coupon_type_id) { + that.$set(that.couponList[i], 'useState', 1); + + } + } + } else { + for (let i = 0; i < list.length; i++) { + if (list[i].coupon_type_id == item.coupon_type_id) { + that.$set(that.couponList[i], 'useState', 2); + + } + + } + } + this.$util.showToast({ + title: msg + }); + that.$forceUpdate() + this.hackReset = false; + this.$nextTick(() => { + this.hackReset = true; + }) + + this.couponBtnSwitch = false; + }, + }); + } else { + this.$refs.login.open(this.shareUrl); + this.couponBtnSwitch = false; + } + }, + //更新优惠券信息 + refreshCoupon(couponTypeId) { + for (let i in this.couponList) { + var info = this.couponList[i] + if (couponTypeId == info.coupon_type_id) { + this.$set(this.couponList[i], 'is_lingqu', 1); + } + } + + this.$forceUpdate() + }, + + //-------------------------------------满减------------------------------------- + + //获取满减信息 + getManjian() { + this.$api.sendRequest({ + url: "/manjian/api/manjian/info", + data: { + goods_id: this.goodsSkuDetail.goods_id + }, + success: res => { + let data = res.data; + if (data) { + this.manjian = data; + let limit = data.type == 0 ? '元' : '件'; + Object.keys(data.rule_json).forEach((key) => { + var item = data.rule_json[key]; + if (item.coupon_data) { + for (var i = 0; i < item.coupon_data.length; i++) { + item.coupon_data[i].coupon_num = item.coupon_num[i] + } + } + item.limit = data.type == 0 ? parseFloat(item.limit).toFixed(2) : + parseInt(item.limit); + // 满减 + if (item.discount_money != undefined) { + if (this.manjian.manjian == undefined) { + this.manjian.manjian = '满' + item.limit + limit + '减' + item + .discount_money + '元'; + } else { + this.manjian.manjian += ';满' + item.limit + limit + '减' + item + .discount_money + '元'; + } + } + // 满送 + if (item.point != undefined || item.coupon != undefined) { + let text = ''; + if (item.point != undefined) { + text = '送' + item.point + '积分'; + } + if (item.coupon != undefined && item.coupon_data != undefined) { + item.coupon_data.forEach((couponItem, couponIndex) => { + if (couponItem.type == 'discount') { + if (text == '') text = '送' + item.coupon_num[ + couponIndex] + '张' + parseFloat( + couponItem.discount) + '折优惠券'; + else text += '、送' + item.coupon_num[ + couponIndex] + '张' + parseFloat( + couponItem + .discount) + '折优惠券'; + } else { + if (text == '') text = '送' + item.coupon_num[ + couponIndex] + '张' + parseFloat( + couponItem.money) + '元优惠券'; + else text += '、送' + item.coupon_num[ + couponIndex] + '张' + parseFloat( + couponItem + .money) + '元优惠券'; + } + }) + } + if (this.manjian.mansong == undefined) { + this.manjian.mansong = '满' + item.limit + limit + text; + } else { + this.manjian.mansong += ';' + '满' + item.limit + limit + text; + } + } + // 包邮 + if (item.free_shipping != undefined) { + if (this.manjian.free_shipping == undefined) { + this.manjian.free_shipping = '满' + item.limit + limit + '包邮'; + } else { + this.manjian.free_shipping += ';满' + item.limit + limit + '包邮'; + } + } + }) + } + } + }); + }, + openManjianPopup() { + this.$refs.manjianPopup.open(); + }, + closeManjianPopup() { + this.$refs.manjianPopup.close(); + }, + + //-------------------------------------组合套餐------------------------------------- + + //获取当前商品关联的组合套餐 + getBundling() { + this.$api.sendRequest({ + url: "/bundling/api/bundling/lists", + data: { + sku_id: this.skuId + }, + success: res => { + this.bundling = res.data; + if (res.data && res.data.length) { + + for (var i = 0; i < this.bundling[0].bundling_goods.length; i++) { + if (this.bundling[0].bundling_goods[i].sku_id == this.skuId) { + this.bundlingType = true; + break; + } else { + this.bundlingType = false; + } + } + + for (var i = 0; i < this.bundling.length; i++) { + for (var j = 0; j < this.bundling[i].bundling_goods.length; j++) { + if (this.bundling[i].bundling_goods[j].sku_id == this.skuId) { + this.bundling[i].bundling_goods.splice(j, 1); + } + } + } + } + } + }); + }, + // 打开组合套餐弹出层 + openBundlingPopup() { + this.$refs.bundlingPopup.open(); + }, + // 关闭组合套餐弹出层 + closeBundlingPopup() { + this.$refs.bundlingPopup.close(); + }, + imageError() { + this.goodsSkuDetail.sku_image = this.$util.getDefaultImage().goods; + this.$forceUpdate(); + }, + bundlingImageError(index, goods_index) { + this.bundling[index].bundling_goods[goods_index].sku_image = this.$util.getDefaultImage().goods; + this.$forceUpdate(); + }, + fenxiao() { + this.$refs.fenxiaoPopup.show() + }, + toGoodsDetail(item) { + this.$util.redirectTo(this.goodsRoute, { + sku_id: item + }); + }, + toComoDetail(id) { + this.$util.redirectTo('/pages_promotion/bundling/detail', { + bl_id: id + }); + }, + /** + * 获取会员信息 + */ + getMemberInfo() { + this.$api.sendRequest({ + url: '/api/member/info', + success: res => { + if (res.code == 0 && res.data && res.data.member_level_type == 0) this + .getMemberCardInfo(); + } + }); + }, + getMemberCardInfo() { + this.$api.sendRequest({ + url: '/supermember/api/membercard/recommendcard', + data: { + sku_id: this.goodsSkuDetail.sku_id + }, + success: res => { + if (res.code == 0 && res.data) { + this.membercard = res.data; + } + } + }); + }, + /** + * 获取分享图 + */ + getShareImg() { + let posterParams = { + goods_id: this.goodsId + }; + this.$api.sendRequest({ + url: '/api/goods/shareimg', + data: { + qrcode_param: JSON.stringify(posterParams) + }, + success: res => { + if (res.code == 0) this.shareImg = res.data.path + '?no=' + parseInt((new Date()).getTime() / 1000); + } + }) + }, + /** + * 金额格式化输出 + * @param {Object} money + */ + decimalPointFormat(money) { + if (isNaN(parseFloat(money))) return money; + let arr = money.toString().split("."); + let arr1 = arr[1].split("").reverse(); + let arr2 = []; + arr1.forEach((item,index)=>{ + if(item > 1){ + arr2 = arr1.splice(index); + } + }); + let str = arr2.length ? (arr[0] + "." + arr2.reverse().join("")) : arr[0]; + return str; + } + } +} diff --git a/pages/goods/public/js/list.js b/pages/goods/public/js/list.js new file mode 100644 index 0000000..7b42a3b --- /dev/null +++ b/pages/goods/public/js/list.js @@ -0,0 +1,409 @@ +export default { + data() { + return { + listStyle: '', + loadingType: 'loading', //加载更多状态 + orderType: '', + priceOrder: 'desc', //1 价格从低到高 2价格从高到低 + categoryList: [], //排序类型 + goodsList: [], + order: '', + sort: 'desc', + showScreen: false, + keyword: '', + categoryId: 0, + minPrice: '', + maxPrice: '', + isFreeShipping: false, //是否免邮 + isIphoneX: false, + coupon: 0, + emptyShow: false, + isList: true, //列表样式 + //分享建立上下级所需id + memberId: 0, + //分享所需标题 + share_title: '', + //搜索到多少件商品 + count: 0, + //当前分类名称 + category_title: '', + //优惠券数据 + coupon_name: '', + //列表瀑布流数据 + listHeight: [], + listPosition: [], + debounce: null, + brandId: 0, + brandList: [], //品牌筛选项 + } + }, + + onLoad(options) { + this.categoryId = options.category_id || 0; + this.keyword = options.keyword || ''; + this.coupon = options.coupon || 0; + this.goods_id_arr = options.goods_id_arr || 0; + this.brandId = options.brand_id || 0; + + this.loadCategoryList(this.categoryId); + this.getBrandList(); + this.isIphoneX = this.$util.uniappIsIPhoneX(); + + this.$util.getMemberId().then(resolve => { + this.memberId = resolve; + }); + //小程序分享接收source_member + if (options.source_member) { + uni.setStorageSync('source_member', options.source_member); + } + // 小程序扫码进入,接收source_member + if (options.scene) { + var sceneParams = decodeURIComponent(options.scene); + sceneParams = sceneParams.split('&'); + if (sceneParams.length) { + sceneParams.forEach(item => { + if (item.indexOf('sku_id') != -1) this.skuId = item.split('-')[1]; + if (item.indexOf('m') != -1) uni.setStorageSync('source_member', item.split('-')[1]); + if (item.indexOf('is_test') != -1) uni.setStorageSync('is_test', 1); + }); + } + } + + uni.onWindowResize(res => { + if (this.debounce) clearTimeout(this.debounce); + this.waterfallflow(0); + }) + }, + onShow() { + + + //记录分享关系 + if (uni.getStorageSync('token') && uni.getStorageSync('source_member')) { + this.$util.onSourceMember(uni.getStorageSync('source_member')); + } + setTimeout(() => { + //this.handle_share(); + }, 2000) + }, + /** + * 转发分享 + */ + onShareAppMessage(res) { + var title = '搜索到' + this.count + '件“' + this.keyword + this.category_title + this.coupon_name + '”相关的优质商品'; + let route = this.$util.getCurrentShareRoute(this.memberId); + var path = route.path; + return { + title: title, + path: path, + success: res => {}, + fail: res => {} + }; + }, + // 分享到微信朋友圈 + onShareTimeline() { + var title = '搜索到' + this.count + '件“' + this.keyword + this.category_title + this.coupon_name + '”相关的优质商品'; + let route = this.$util.getCurrentShareRoute(this.memberId); + var query = route.query; + return { + title: title, + query: query, + imageUrl: '' + }; + }, + methods: { + /** + * 获取优惠券数据 + */ + couponInfo(id) { + return new Promise(resolve => { + this.$api.sendRequest({ + url: '/coupon/api/coupon/typeinfo', + data: { + coupon_type_id: id + }, + success: res => { + if (res.code >= 0) { + resolve(res.data.coupon_name); + } + } + }); + }) + }, + /** + * 获取分类名称 + */ + share_select(data, id) { + return new Promise((resolve) => { + data.forEach((item) => { + if (item.category_id == id) { + resolve(item.category_name) + } + if (item.child_list && item.child_list.length > 0) { + item.child_list.forEach((v) => { + if (v.category_id == id) { + resolve(v.category_name) + } + if (v.child_list && v.child_list.length > 0) { + v.forEach((m) => { + if (m.category_id == id) { + resolve(m.category_name) + } + }) + + } + }) + } + }) + }) + }, + //加载分类 + loadCategoryList(fid, sid) { + this.$api.sendRequest({ + url: '/api/goodscategory/tree', + data: {}, + success: res => { + if (res.data != null) { + this.categoryList = res.data + }; + } + }); + }, + getGoodsList(mescroll) { + this.$api.sendRequest({ + url: '/api/goodssku/page', + data: { + page: mescroll.num, + page_size: mescroll.size, + keyword: this.keyword, + category_id: this.categoryId, + brand_id: this.brandId, + min_price: this.minPrice, + max_price: this.maxPrice, + is_free_shipping: (this.isFreeShipping ? 1 : 0), + order: this.order, + sort: this.sort, + coupon: this.coupon, + goods_id_arr: this.goods_id_arr + }, + success: res => { + let newArr = [] + let msg = res.message; + if (res.code == 0 && res.data) { + this.count = res.data.count; + if (res.data.page_count == 0) { + this.emptyShow = true + } + newArr = res.data.list; + } else { + this.$util.showToast({ + title: msg + }) + } + this.category_title = ''; + this.coupon_name = ''; + if (this.categoryId) { + this.share_select(this.categoryList, this.categoryId).then(resolve => { + this.category_title = resolve + }); + } + if (this.coupon) { + this.couponInfo(this.coupon).then(resolve => { + this.coupon_name = resolve + });; + } + mescroll.endSuccess(newArr.length); + //设置列表数据 + if (mescroll.num == 1) this.goodsList = []; //如果是第一页需手动制空列表 + this.goodsList = this.goodsList.concat(newArr); //追加新数据 + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + + this.waterfallflow((mescroll.num - 1) * 10); + }, + fail: res => { + //联网失败的回调 + mescroll.endErr(); + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + } + }); + }, + changeListStyle() { + this.isList = !this.isList; + this.waterfallflow(0); + }, + //筛选点击 + sortTabClick(tag) { + if (tag == 'sale_num') { + this.order = 'sale_num'; + this.sort = 'desc'; + } else if (tag == 'discount_price') { + this.order = 'discount_price'; + this.sort = 'desc'; + } else if (tag == 'screen') { + //筛选 + this.showScreen = true; + return; + } else { + this.order = ''; + this.sort = ''; + } + + if (this.orderType === tag && tag !== 'discount_price') return; + + this.orderType = tag; + if (tag === 'discount_price') { + this.priceOrder = this.priceOrder === 'asc' ? 'desc' : 'asc'; + this.sort = this.priceOrder; + } else { + this.priceOrder = ''; + } + this.emptyShow = false; + this.goodsList = []; + this.$refs.mescroll.refresh(); + }, + //商品详情 + toDetail(item) { + this.$util.redirectTo('/pages/goods/detail', { + goods_id: item.goods_id + }); + }, + search() { + this.emptyShow = false; + this.goodsList = []; + this.$refs.mescroll.refresh(); + }, + selectedCategory(categoryId) { + this.categoryId = categoryId; + }, + screenData() { + if (this.minPrice != '' || this.maxPrice != '') { + // if (!Number(this.minPrice) && this.minPrice) { + // this.$util.showToast({ + // title: '请输入最低价' + // }); + // return; + // } + if (!Number(this.maxPrice) && this.maxPrice) { + this.$util.showToast({ + title: '请输入最高价' + }); + return; + } + if (Number(this.minPrice) < 0 || Number(this.maxPrice) < 0) { + this.$util.showToast({ + title: '筛选价格不能小于0' + }); + return; + } + if (this.minPrice != '' && Number(this.minPrice) > Number(this.maxPrice) && this.maxPrice) { + + this.$util.showToast({ + title: '最低价不能大于最高价' + }); + return; + } + if (this.maxPrice != '' && Number(this.maxPrice) < Number(this.minPrice)) { + this.$util.showToast({ + title: '最高价不能小于最低价' + }); + return; + } + } + this.emptyShow = false; + this.goodsList = []; + this.$refs.mescroll.refresh(); + this.showScreen = false; + }, + //重置数据 + resetData() { + this.categoryId = 0 + this.minPrice = '' + this.maxPrice = '' + this.isFreeShipping = false + }, + goodsImg(imgStr) { + let imgs = imgStr.split(','); + return imgs[0] ? this.$util.img(imgs[0], { + size: 'mid' + }) : this.$util.getDefaultImage().goods; + }, + imgError(index) { + this.goodsList[index].goods_image = this.$util.getDefaultImage().goods; + }, + showPrice(data) { + let price = data.discount_price; + if (data.member_price && parseFloat(data.member_price) < parseFloat(price)) price = data.member_price; + return price; + }, + goodsTag(data) { + return data.label_name || ''; + }, + /** + * 瀑布流 + */ + waterfallflow(start = 0) { + if (!this.isList) { + //页面渲染完成后的事件 + this.$nextTick(() => { + setTimeout(() => { + let listHeight = []; + let listPosition = []; + if (start != 0) { + listHeight = this.listHeight; + listPosition = this.listPosition; + } + let column = 2; + const query = uni.createSelectorQuery().in(this); + query.selectAll('.double-column .goods-item').boundingClientRect(data => { + for (let i = start; i < data.length; i++) { + if (i < column) { + let position = {}; + position.top = uni.upx2px(20) + 'px'; + if (i % column == 0) { + position.left = data[i].width * i + "px"; + } else { + position.left = data[i].width * i + (i % column * uni + .upx2px(30)) + "px"; + } + listPosition[i] = position; + listHeight[i] = data[i].height + uni.upx2px(20); + } else { + let minHeight = Math.min(...listHeight); // 找到第一列的最小高度 + let minIndex = listHeight.findIndex(item => item === + minHeight) // 找到最小高度的索引 + //设置当前子元素项的位置 + let position = {}; + position.top = minHeight + uni.upx2px(20) + "px"; + position.left = listPosition[minIndex].left; + listPosition[i] = position; + //重新定义数组最小项的高度 进行累加 + listHeight[minIndex] += data[i].height + uni.upx2px(20); + } + } + this.listHeight = listHeight; + this.listPosition = listPosition; + }).exec(); + }, 50) + }) + } + }, + getBrandList() { + var data = { + page: 1, + page_size: 0 + }; + this.$api.sendRequest({ + url: '/api/goodsbrand/page', + data: data, + success: res => { + if (res.code == 0 && res.data) { + let data = res.data; + this.brandList = data.list; + } + } + }); + }, + }, + watch: { + + } +} diff --git a/pages/index/index.vue b/pages/index/index.vue new file mode 100644 index 0000000..8faea96 --- /dev/null +++ b/pages/index/index.vue @@ -0,0 +1,107 @@ + ++ + + ++ + + ++ + ++ + + ++ + +综合 +销量 + ++ + +价格 ++ ++ + + +筛选 ++ + + + ++ ++ ++ ++ ++ {{ goodsTag(item) }} ++ ++ + +{{ item.goods_name }} ++ ++ +{{ $lang('common.currencySymbol') }} +{{ parseFloat(showPrice(item)).toFixed(2).split(".")[0] }} +.{{ parseFloat(showPrice(item)).toFixed(2).split(".")[1] }} + ++ ++ + ++ + ++ ++ +{{ $lang('common.currencySymbol') }} + {{ item.market_price > 0 ? item.market_price : item.price }} +已售{{ item.sale_num }}{{ item.unit ? item.unit : '件' }} ++ ++ ++ ++ {{ goodsTag(item) }} ++ ++ + +{{ item.goods_name }} ++ ++ +{{ $lang('common.currencySymbol') }} +{{ parseFloat(showPrice(item)).toFixed(2).split(".")[0] }} +.{{ parseFloat(showPrice(item)).toFixed(2).split(".")[1] }} ++ ++ + ++ + ++ ++ +{{ $lang('common.currencySymbol') }} + {{ item.market_price > 0 ? item.market_price : item.price }} + +已售{{ item.sale_num }}{{ item.unit ? item.unit : '件' }} ++ + +筛选 ++ + ++ + + ++ 是否包邮 + + + + ++ 价格区间(元) + + ++ + + + + ++ 品牌 + ++ ++ + +全部分类 ++ ++ 全部 + +{{ item.category_name }} ++ + + ++ + + + + + + + + + diff --git a/pages/index/public/css/index.scss b/pages/index/public/css/index.scss new file mode 100644 index 0000000..799a109 --- /dev/null +++ b/pages/index/public/css/index.scss @@ -0,0 +1,88 @@ +.site-info-box { + padding: 20rpx 20rpx; + display: flex; + justify-content: space-between; + align-items: center; + background-color: rgba(0, 0, 0, 0.6); + position: fixed; + width: calc(100% - 40rpx); + z-index: 999; + .site-info { + display: flex; + align-items: center; + .img-box { + width: 70rpx; + height: 70rpx; + line-height: 70rpx; + border-radius: 50%; + overflow: hidden; + image { + width: 100%; + height: 100%; + } + } + .info-box { + display: flex; + flex-direction: column; + color: #fff; + justify-content: space-between; + margin-left: 20rpx; + text-align: left; + width: 400rpx; + text { + display: -webkit-box; + font-size: $font-size-tag; + overflow: hidden; + opacity: 0.8; + white-space: normal; + text-overflow: ellipsis; + -webkit-line-clamp: 1; + -webkit-box-orient: vertical; + line-height: 1.4; + &:nth-child(1) { + width: 300rpx; + font-weight: bold; + opacity: 1; + } + } + } + } + .dite-button { + background-color: #fff; + width: 180rpx; + height: 56rpx; + line-height: 56rpx; + text-align: center; + border-radius: 66rpx; + color: $base-color; + font-size: $font-size-tag; + } +} + +.official-accounts-inner /deep/ .uni-popup__wrapper.uni-custom.center .uni-popup__wrapper-box { + overflow: inherit; +} +.official-accounts-wrap { + display: flex; + align-items: center; + flex-direction: column; + padding: 30rpx; + .content { + width: 300rpx; + height: 300rpx; + } + .desc { + margin-top: 10rpx; + font-size: $font-size-tag; + color: $color-tip; + } + .close { + position: absolute; + left: 50%; + bottom: -130rpx; + transform: translateX(-50%); + z-index: 99; + color: #fff; + font-size: 70rpx; + } +} diff --git a/pages/index/public/js/index.js b/pages/index/public/js/index.js new file mode 100644 index 0000000..9612b82 --- /dev/null +++ b/pages/index/public/js/index.js @@ -0,0 +1,32 @@ +export default { + data() { + return { + wechatQrcode: '' // 公众号二维码 + }; + }, + onLoad(data) { + uni.hideTabBar(); + this.name = 'DIY_VIEW_INDEX'; + this.getFollowQrcode(); + }, + onShow() {}, + computed: {}, + methods: { + getFollowQrcode() { + this.$api.sendRequest({ + url: '/wechat/api/wechat/followqrcode', + success: res => { + if (res.code >= 0 && res.data) { + this.wechatQrcode = res.data.qrcode; + } + } + }); + }, + officialAccountsOpen() { + this.$refs.officialAccountsPopup.open(); + }, + officialAccountsClose() { + this.$refs.officialAccountsPopup.close(); + } + }, +} diff --git a/pages/member/index.vue b/pages/member/index.vue new file mode 100644 index 0000000..4d6d903 --- /dev/null +++ b/pages/member/index.vue @@ -0,0 +1,93 @@ + ++ + + ++ ++ + +{{ siteInfo.site_name }} +{{ followOfficialAccount.welcomeMsg }} +关注公众号 ++ + + ++ + + ++ + + + + ++ ++ + + + + + ++ ++ ++ + + + + + + + ++ ++ 我知道了 ++ + ++ ++ ++ 关注了解更多 ++ + + + + + + + + + + + diff --git a/pages/member/public/js/index.js b/pages/member/public/js/index.js new file mode 100644 index 0000000..15e2553 --- /dev/null +++ b/pages/member/public/js/index.js @@ -0,0 +1,144 @@ +export default { + data() { + return { + memberInfo: null, + }; + }, + computed: { + bottomNavHidden(){ + return this.$store.state.bottomNavHidden; + } + }, + watch: { + storeToken: function(nVal, oVal) { + if (nVal) { + this.getMemberInfo(); + if (uni.getStorageSync('source_member')) this.$util.onSourceMember(uni.getStorageSync( + 'source_member')); + } + } + }, + onLoad(data) { + uni.hideTabBar(); + this.name = 'DIY_VIEW_MEMBER_INDEX'; + + if (data.code) { + this.$api.sendRequest({ + url: '/wechat/api/wechat/authcodetoopenid', + data: { + code: data.code + }, + success: res => { + if (res.code >= 0) { + if (res.data.userinfo.nickName) this.modifyNickname(res.data.userinfo.nickName); + if (res.data.userinfo.avatarUrl) this.modifyHeadimg(res.data.userinfo + .avatarUrl); + } + } + }); + } + }, + onShow() { + // 刷新会员数据 + if (this.$refs.diyGroup) { + if (this.$refs.diyGroup.$refs.diyMemberIndex) this.$refs.diyGroup.$refs.diyMemberIndex[0].init(); + if (this.$refs.diyGroup.$refs.diyMemberMyOrder) this.$refs.diyGroup.$refs.diyMemberMyOrder[0].getOrderNum(); + } + }, + methods: { + /** + * 自定义跳转 + * @param {Object} data + */ + // diyRedirect(data) { + // if (data.wap_url && data.wap_url.indexOf('http') == -1 && data.wap_url.indexOf('https') == -1) { + // if (!uni.getStorageSync('token')) { + // this.$refs.login.open(data.wap_url); + // return; + // } + // } + // data.diy_name = data.name; + // this.$util.diyRedirectTo(data); + // }, + /** + * 查询会员信息 + */ + getMemberInfo() { + this.$api.sendRequest({ + url: '/api/member/info', + data: {}, + success: res => { + if (res.code == 0) { + if (!this.memberInfo) this.memberInfo = res.data; + else Object.assign(this.memberInfo, res.data); + if (this.addonIsExist.birthdaygift) this.getBirthdayGiftTo(); + if (this.addonIsExist.scenefestival) this.getHolidayGiftTo(); + } + } + }); + }, + /** + * 节日有礼 + */ + getHolidayGiftTo() { + this.$api.sendRequest({ + url: '/scenefestival/api/config/config', + success: res => { + if (res.code >= 0) { + if (res.data[0]) { + if (res.data[0].flag == true && this.$refs.nsNewGift) { + this.$refs.nsNewGift.open(); + } + } + } + }, + }); + }, + /** + * 生日有礼 + */ + getBirthdayGiftTo() { + this.$api.sendRequest({ + url: '/birthdaygift/api/Config/config', + success: res => { + if (res.code >= 0) { + if (res.data) { + if (this.$refs.birthdayGift && res.data.flag == true) { + this.$refs.birthdayGift.open(); + } + } + } + }, + }); + }, + /** + * 修改昵称 + * @param {Object} nickName + */ + modifyNickname(nickName) { + this.$api.sendRequest({ + url: '/api/member/modifynickname', + data: { + nickname: nickName + }, + success: res => { + if (res.code == 0) this.memberInfo.nickname = nickName; + } + }); + }, + /** + * 修改头像 + */ + modifyHeadimg(headimg) { + this.$api.sendRequest({ + url: '/api/member/modifyheadimg', + data: { + headimg: headimg + }, + success: res => { + if (res.code == 0) this.memberInfo.headimg = headimg; + } + }); + }, + }, +}; diff --git a/pages/order/detail.vue b/pages/order/detail.vue new file mode 100644 index 0000000..a5db067 --- /dev/null +++ b/pages/order/detail.vue @@ -0,0 +1,824 @@ + ++ + + ++ + + ++ + + + + ++ ++ + + + + + ++ ++ ++ + + + + + + ++ ++ 我知道了 ++ + + + + + + + + + + diff --git a/pages/order/detail_local_delivery.vue b/pages/order/detail_local_delivery.vue new file mode 100644 index 0000000..005f434 --- /dev/null +++ b/pages/order/detail_local_delivery.vue @@ -0,0 +1,22 @@ + ++ + + ++ ++ + ++ {{ orderData.order_status_name }} + +({{ orderData.promotion_status_name }}) ++ 预计{{ $util.timeStampTurnTime(orderData.predict_delivery_time, true) }}日后发货 + +订单关闭原因:{{ orderData.close_cause }} ++ 剩余时间: + ++ + + + + ++ + + ++ +{{ orderData.name }} {{ orderData.mobile }} ++ +收货地址:{{ orderData.full_address }} {{ orderData.address }} ++ +送达时间: +{{ orderData.buyer_ask_delivery_time.indexOf('-') != -1 ? orderData.buyer_ask_delivery_time : $util.timeStampTurnTime(orderData.buyer_ask_delivery_time) }} ++ +送达时间: +立即送达 ++ + ++ +配送员: +{{ orderData.package_list.deliverer }} ++ +外卖电话: +{{ orderData.package_list.deliverer_mobile }} ++ + ++ ++ ++ + ++ +{{ orderData.delivery_store_name }} ++ + +营业时间:{{ orderData.delivery_store_info.open_date }} +地址:{{ orderData.delivery_store_info.full_address }} ++ ++ 当前无自提门店 + +预留手机 + ++ +提货时间 ++ + ++ + ++ + + + ++ ++ ++ +提货码: + {{ orderData.delivery_code }} +复制 ++ ++ + + + + ++ ++ ++ + ++ ++ + +{{ goodsItem.sku_name }} ++ ++ ++ {{ x.spec_value_name }} {{ i < goodsItem.sku_spec_format.length - 1 ? '; ' : '' }} + ++ ++ ++ +{{ $lang('common.currencySymbol') }} ++ {{ + parseFloat(goodsItem.price) + .toFixed(2) + .split('.')[0] + }} + ++ .{{ + parseFloat(goodsItem.price) + .toFixed(2) + .split('.')[1] + }} + ++ ++ ++ {{ goodsItem.num }} + + 次卡抵扣 + ++ +-{{ $lang('common.currencySymbol') }} ++ {{ + parseFloat(goodsItem.card_promotion_money) + .toFixed(2) + .split('.')[0] + }} + ++ .{{ + parseFloat(goodsItem.card_promotion_money) + .toFixed(2) + .split('.')[1] + }} + ++ + ++ +{{ item.value.title }}: ++ ++ ++ + +{{ item.val }} ++ ++ ++ +{{ orderData.order_status == 10 ? '申请售后' : '申请退款' }} ++ +{{ orderData.order_status == 10 ? '查看售后' : '查看退款' }} ++ + ++ +订单编号: ++ +{{ orderData.order_no }} +复制 ++ +订单交易号: ++ +{{ orderData.out_trade_no }} ++ +创建时间: ++ +{{ $util.timeStampTurnTime(orderData.create_time) }} ++ +关闭时间: ++ +{{ $util.timeStampTurnTime(orderData.close_time) }} ++ ++ + +支付方式: ++ +{{ orderData.pay_type_name }} ++ +支付时间: ++ +{{ $util.timeStampTurnTime(orderData.pay_time) }} ++ +配送方式: ++ +{{ orderData.delivery_type_name }} ++ +买家留言: ++ +{{ orderData.buyer_message }} ++ +活动优惠: ++ +{{ orderData.promotion_type_name }} ++ ++ + +发票类型: ++ +{{ orderData.invoice_type == 1 ? '纸质发票' : '电子发票' }} ++ +发票抬头类型: ++ +{{ orderData.invoice_title_type == 1 ? '个人' : '企业' }} ++ + +发票抬头: ++ +{{ orderData.invoice_title }} ++ +发票内容: ++ +{{ orderData.invoice_content }} ++ +发票邮寄地址: ++ +{{ orderData.invoice_full_address }} ++ +发票接收邮件: ++ +{{ orderData.invoice_email }} ++ + ++ + +{{ item.value.title }}: ++ ++ ++ + +{{ item.val }} ++ + ++ +我的卡包: ++ +查看 ++ ++ ++ ++ 联系客服 ++ + ++ + ++ ++ + 请将条形码或二维码出示给核销员 ++ + +{{ orderData.virtual_code }} +复制 ++ + +核销信息 ++ +核销次数 ++ ++ 剩余{{ orderData.virtual_goods.verify_total_count - orderData.virtual_goods.verify_use_num }}次/共{{ orderData.virtual_goods.verify_total_count }}次 + ++ +有效期 ++ +{{ $util.timeStampTurnTime(orderData.virtual_goods.expire_time) }} +永久有效 ++ +核销记录 ++ ++ ++ +核销人 ++ +{{ item.verifier_name }} ++ +核销时间 ++ +{{ $util.timeStampTurnTime(item.verify_time) }} +暂无核销记录 ++ + + ++ +卡密信息 ++ ++ +卡号: ++ +{{ item.card_info.cardno }} +复制 ++ +密码: ++ +{{ item.card_info.password }} +复制 ++ + ++ + ++ ++ + 请将条形码或二维码出示给核销员 ++ + +{{ orderData.virtual_code }} +复制 ++ + +核销信息 ++ +核销次数 ++ ++ 剩余{{ orderData.virtual_goods.verify_total_count - orderData.virtual_goods.verify_use_num }}次/共{{ orderData.virtual_goods.verify_total_count }}次 + ++ +有效期 ++ +{{ $util.timeStampTurnTime(orderData.virtual_goods.expire_time) }} +永久有效 ++ +核销记录 ++ ++ ++ +核销人 ++ +{{ item.verifier_name }} ++ +核销时间 ++ +{{ $util.timeStampTurnTime(item.verify_time) }} +暂无核销记录 ++ + + ++ +商品金额 ++ ++ +{{ $lang('common.currencySymbol') }} + {{ orderData.goods_money }} ++ +运费 ++ ++ +{{ $lang('common.currencySymbol') }} +{{ orderData.delivery_money }} ++ +会员卡 ++ ++ +{{ $lang('common.currencySymbol') }} +{{ orderData.member_card_money }} ++ ++ 税费 + +({{ orderData.invoice_rate }}%) ++ ++ ++ +{{ $lang('common.currencySymbol') }} +{{ orderData.invoice_money }} ++ +发票邮寄费 ++ ++ ++ +{{ $lang('common.currencySymbol') }} +{{ orderData.invoice_delivery_money }} ++ +订单调整 ++ ++ +- ++ +{{ $lang('common.currencySymbol') }} +{{ orderData.adjust_money | abs }} ++ +优惠 ++ ++ +- +{{ $lang('common.currencySymbol') }} +{{ orderData.promotion_money }} ++ +优惠券 ++ ++ +- +{{ $lang('common.currencySymbol') }} +{{ orderData.coupon_money }} ++ +使用余额 ++ ++ +- +{{ $lang('common.currencySymbol') }} +{{ orderData.balance_money }} ++ +积分抵扣 ++ ++ +- +{{ $lang('common.currencySymbol') }} +{{ orderData.point_money }} ++ + ++ +实付金额: ++ +{{ $lang('common.currencySymbol') }} +{{ orderData.order_money }} ++ + ++ +评价 +追评 ++ ++ {{ operationItem.title }} + ++ ++ +评价 +追评 ++ + + + + + + + + + + + + diff --git a/pages/order/detail_pickup.vue b/pages/order/detail_pickup.vue new file mode 100644 index 0000000..005f434 --- /dev/null +++ b/pages/order/detail_pickup.vue @@ -0,0 +1,22 @@ + ++ + + + + + + + diff --git a/pages/order/detail_point.vue b/pages/order/detail_point.vue new file mode 100644 index 0000000..1074935 --- /dev/null +++ b/pages/order/detail_point.vue @@ -0,0 +1,283 @@ + ++ + + + + + + + + diff --git a/pages/order/list.vue b/pages/order/list.vue new file mode 100644 index 0000000..ffb5ebc --- /dev/null +++ b/pages/order/list.vue @@ -0,0 +1,454 @@ + ++ + + ++ ++ + + + ++ {{ orderData.order_status == 0 ? '待支付' : orderData.order_status == 1 ? '已完成' : orderData.order_status == -1 ? '已关闭' : '' }} + ++ + + ++ ++ ++ ++ ++ + +{{ orderData.exchange_name }} ++ ++ ++ ++ +{{ orderData.point }}积分 ++ + + +{{ $lang('common.currencySymbol') }} + {{ orderData.price }} ++ ++ ++ {{ orderData.num }} + + + + + ++ +订单编号: ++ +{{ orderData.order_no }} +复制 ++ +订单交易号: ++ +{{ orderData.out_trade_no }} ++ +创建时间: ++ +{{ $util.timeStampTurnTime(orderData.create_time) }} ++ + +关闭时间: ++ +{{ $util.timeStampTurnTime(orderData.close_time) }} ++ ++ ++ ++ 联系客服 ++ + ++ +使用积分 ++ ++ +{{ orderData.point }} ++ +运费 ++ ++ +{{ $lang('common.currencySymbol') }} +{{ orderData.delivery_price }} ++ + ++ +实付金额: ++ +{{ $lang('common.currencySymbol') }} +{{ orderData.order_money }} ++ +关闭 +支付 ++ + + + + + + + + + + + diff --git a/pages/order/payment.vue b/pages/order/payment.vue new file mode 100644 index 0000000..bc78e01 --- /dev/null +++ b/pages/order/payment.vue @@ -0,0 +1,110 @@ + ++ ++ + ++ + + + ++ ++ {{ statusItem.name }} + ++ + + + + + ++ ++ ++ ++ ++ 订单号:{{ orderItem.order_no }} +{{ orderItem.order_status_name }} ++ ++ ++ ++ ++ + ++ + +{{ goodsItem.goods_name }} +{{ goodsItem.sku_name }} ++ ++ ++ {{ x.spec_value_name }} {{ i < goodsItem.sku_spec_format.length - 1 ? '; ' : '' }} + ++ + ++ ++ ++ ++ ++ + ++ + ++ ++ +共{{ orderItem.goods_num }}件商品 ++ 实付款: + +{{ $lang('common.currencySymbol') }}{{ orderItem.order_money }} ++ ++ ++ 剩余时间: + + + +评价 +追评 ++ {{ operationItem.title }} + ++ ++ +评价 +追评 ++ 查看详情 + + + + +合并付款 ++ + + + + + + + + + + + diff --git a/pages/order/public/css/detail.scss b/pages/order/public/css/detail.scss new file mode 100644 index 0000000..9bebf72 --- /dev/null +++ b/pages/order/public/css/detail.scss @@ -0,0 +1,845 @@ +@mixin flex-row-center { + display: flex; + justify-content: center; + align-items: center; +} + +@mixin wrap { + margin: $margin-updown 24rpx; + padding: 30rpx; + border-radius: 16rpx; + background: #fff; + position: relative; +} +text, +view { + font-size: $font-size-tag; +} +.bottom-safe-area { + padding-bottom: calc(constant(safe-area-inset-bottom) + 10rpx)!important; + padding-bottom: calc(env(safe-area-inset-bottom) + 10rpx)!important; +} +.align-right { + text-align: right; +} + +.color-text-white { + color: #fff; +} + +.detail-container { + // height: 100vh; + .height-box { + display: block; + padding-bottom: 100rpx; + } + + &.safe-area { + .height-box { + display: block; + padding-bottom: 168rpx; + } + } +} + +.status-wrap { + background-size: 100% 100%; + padding: 40rpx; + height: 180rpx; + position: relative; + + image { + width: 104rpx; + height: 86rpx; + margin-right: 20rpx; + margin-top: 20rpx; + } + + .order-status-left { + display: flex; + } + + .order-time { + position: absolute; + top: 70rpx; + right: 30rpx; + display: flex; + align-items: center; + font-size: 10px; + color:#fff; + + image { + width: 26rpx; + height: 26rpx; + margin-right: 6rpx; + } + } + + & > view { + text-align: center; + color: #fff; + } + + .desc { + margin-left: 20rpx; + } + + .price { + font-weight: 600; + } + + .action-group { + text-align: center; + padding-top: 20rpx; + + .action-btn { + line-height: 1; + padding: 16rpx 50rpx; + display: inline-block; + border-radius: $border-radius; + background: #fff; + box-shadow: 0 0 14rpx rgba(158, 158, 158, 0.6); + } + } +} + +/deep/ #action-date .uni-countdown .uni-countdown__number { + border: none !important; + padding: 0 !important; + margin: 0 !important; + background: rgba(0,0,0,0) !important; +} + +.address-wrap { + @include wrap; + min-height: 100rpx; + margin-top: -69rpx; + + .icon { + position: absolute; + top: 20rpx; + margin-right: 20rpx; + + image { + width: 60rpx; + height: 60rpx; + } + + .iconfont { + line-height: 50rpx; + font-size: $font-size-base; + } + .icon-mendian { + font-size: $font-size-toolbar; + } + } + + .address-info { + padding-left: 40rpx; + + .info { + display: flex; + line-height: 1; + color: #333; + } + + .detail { + line-height: 1.3; + color: #333; + margin-top: 20rpx; + } + } + + .store-info { + padding-left: 100rpx; + } + + .cell-more { + position: absolute; + top: 50%; + transform: translateY(-50%); + right: 10rpx; + + .iconfont { + color: #999; + } + } +} + +.pickup-info { + @include wrap; + + .pickup-point-info { + .name { + display: flex; + height: 50rpx; + align-items: flex-end; + margin-bottom: 10px; + + text { + line-height: 1; + &.mark { + font-size: $font-size-activity-tag; + padding: 1px 10rpx; + border: 0.5px solid #ffffff; + border-radius: 4rpx; + margin-left: 10rpx; + } + } + } + + .address, + .time, + .contact { + font-size: $font-size-tag; + line-height: 1; + margin-top: 16rpx; + + .iconfont { + color: #999; + font-size: $font-size-tag; + line-height: 1; + margin-right: 10rpx; + } + } + } + .hr { + border-top: 1px dashed #e5e5e5; + margin: 20rpx 0; + } + + .pickup-code-info { + .info { + text-align: center; + } + + .code { + display: flex; + flex-direction: column; + align-items: center; + image.barcode { + width: 360rpx; + margin-top:20rpx; + } + image.qrcode { + width: 240rpx; + margin-top:20rpx; + } + } + + .copy { + font-size: $font-size-tag; + display: inline-block; + color: #666; + background: #f7f7f7; + line-height: 1; + padding: 6rpx 14rpx; + margin-left: 10rpx; + border-radius: $border-radius; + border: 0.5px solid #666; + } + } +} + +.virtual-mobile-wrap { + @include wrap; + margin-top: -69rpx; + display: flex; + + view:nth-child(2) { + flex: 1; + text-align: right; + } +} + +.verify-code-wrap { + @include wrap; + + .wrap { + text-align: center; + line-height: 2; + + .copy { + font-size: $font-size-tag; + display: inline-block; + color: #666; + background: #f7f7f7; + line-height: 1; + padding: 6rpx 14rpx; + margin-left: 10rpx; + border-radius: $border-radius; + border: 0.5px solid #666; + } + + .virtual-code { + font-weight: bold; + } + } + + .hr { + border-top: 1px dashed #e5e5e5; + margin: 20rpx 0; + } + + .code { + display:flex; + flex-direction: column; + align-items: center; + text-align: center; + + image.barcode{ + width: 400rpx; + margin-top:10rpx; + } + image.qrcode { + width: 300rpx; + margin-top:20rpx; + } + + text{ + margin-top: 20rpx; + } + } +} + +.verify-info-wrap { + @include wrap; + + .head { + font-size: $font-size-base; + border-bottom: 1px dashed #f7f7f7; + line-height: 1; + padding: 10rpx 0 30rpx 0; + } + + .order-cell { + .tit { + font-size: $font-size-base; + } + + .box text { + font-size: $font-size-base; + font-weight: bold; + } + } + + .record-empty { + text-align: center; + padding-top: 30rpx; + } + + .record-item { + margin-bottom: 40rpx; + + &:last-child { + margin-bottom: 0; + } + } +} + +.carmichael { + .order-cell { + .tit { + font-size: $font-size-base; + } + + .box text { + font-size: $font-size-base; + font-weight: normal; + } + + .copy { + font-size: $font-size-activity-tag; + display: inline-block; + background: #f7f7f7; + line-height: 1; + padding: 6rpx 10rpx; + margin-left: 10rpx; + border-radius: $border-radius; + border: 2rpx solid #d2d2d2; + } + } +} + +.site-wrap { + @include wrap; + padding: 10rpx 30rpx; + + .site-header { + display: flex; + align-items: center; + + .icon-dianpu { + display: inline-block; + line-height: 1; + margin-right: 12rpx; + font-size: $font-size-base; + } + } + + .site-body { + .goods-item { + padding-top: 20rpx; + border-bottom: 2rpx solid #f7f7f7; + &:last-child { + border-bottom: 0; + } + } + + .goods-wrap { + margin-bottom: 20rpx; + display: flex; + position: relative; + + &:last-of-type { + margin-bottom: 0; + } + + .goods-img { + width: 160rpx; + height: 160rpx; + margin-right: 20rpx; + + image { + width: 100%; + height: 100%; + border-radius: $border-radius; + } + } + + .goods-info { + flex: 1; + position: relative; + display: flex; + flex-direction: column; + justify-content: space-between; + max-width: calc(100% - 180rpx); + + .goods-name { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; + line-height: 1.5; + font-size: $font-size-base; + font-weight: bold; + } + + .goods-sub-section { + width: 100%; + line-height: 1.3; + display: flex; + margin-top: 20rpx; + + .goods-price { + font-weight: 700; + font-size: $font-size-activity-tag; + color: var(--price-color); + } + + .unit { + font-weight: 700; + font-size: $font-size-tag; + margin-right: 2rpx; + } + + view { + flex: 1; + line-height: 1.3; + &:last-of-type { + text-align: right; + font-weight: bold; + + .iconfont { + line-height: 1; + font-size: $font-size-tag; + } + } + } + } + + .goods-card { + text-align: right; + } + + } + } + + .goods-form { + .tit { + font-size: $font-size-base; + } + + .box { + display: flex; + align-items: center; + + text { + font-size: $font-size-base; + word-wrap: break-word; + word-break: break-all; + + } + } + } + + .goods-action { + text-align: right; + margin: 20rpx 0; + + navigator { + display: inline-block; + } + + .order-box-btn { + height: 48rpx !important; + line-height: 48rpx !important; + font-size: $font-size-tag !important; + display: inline-block; + background: #fff; + border: 2rpx solid #999; + margin-left: 10rpx; + box-sizing: content-box; + } + } + } +} + +.order-cell { + display: flex; + margin: 20rpx 0; + align-items: center; + background: #fff; + line-height: 40rpx; + + .tit { + text-align: left; + } + + .box { + flex: 1; + padding: 0 20rpx; + line-height: inherit; + + .textarea { + height: 40rpx; + } + } + + .img-box { + display: flex; + flex-wrap: wrap; + + .img { + width: 100rpx; + height: 100rpx; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + margin-right: 30rpx; + margin-bottom: 30rpx; + position: relative; + border-radius: $border-radius; + line-height: 1; + overflow: hidden; + + image { + width: 100%; + } + } + } + + .iconfont { + color: #bbb; + font-size: $font-size-base; + } + + .order-pay { + padding: 0; + + text { + display: inline-block; + margin-left: 6rpx; + } + } +} + +.order-summary { + @include wrap; + + .order-cell { + &:first-child { + margin-top: 0; + } + + .tit { + font-size: $font-size-base; + width: 190rpx; + } + + .box { + display: flex; + align-items: center; + + text { + font-size: $font-size-base; + word-wrap: break-word; + word-break: break-all; + + } + } + + .copy { + font-size: $font-size-activity-tag; + display: inline-block; + background: #f7f7f7; + line-height: 1; + padding: 6rpx 10rpx; + margin-left: 10rpx; + border-radius: $border-radius; + border: 2rpx solid #d2d2d2; + } + } + + .hr { + // width: calc(100% - 190rpx); + width: 100%; + height: 2rpx; + background: #f7f7f7; + margin-bottom: 20rpx; + } +} + +.order-money { + @include wrap; + + .order-cell { + .tit { + font-size: $font-size-base; + } + + .box { + font-weight: 600; + padding: 0; + + text { + font-size: $font-size-base; + font-weight: bold; + } + >text.color-text{ + color: var(--price-color); + } + + .operator { + font-size: $font-size-tag; + margin-right: 6rpx; + } + &.align-right{ + .color-base-text{ + text{ + color: var(--price-color); + } + } + } + } + } +} + +.kefu { + @include wrap; + margin: 30rpx 0 10rpx; + border-top: 2rpx solid #f7f7f7; + padding-bottom: 0; + padding-top: 30rpx; + & > view { + @include flex-row-center; + + .iconfont { + font-weight: bold; + margin-right: 10rpx; + font-size: $font-size-base; + line-height: 1; + } + } + + button { + width: 100%; + height: 100%; + // position: absolute; + border: none; + z-index: 1; + padding: 0; + margin: 0; + background: none; + height: 50rpx; + line-height: 50rpx; + display: flex; + justify-content: center; + &::after { + border: none !important; + } + .iconfont { + margin-right: 10rpx; + } + } +} + +.fixed-bottom-box { + height: 80rpx; +} +.order-action { + text-align: right; + + .order-box-btn { + margin-right: $margin-both; + margin-left: 0; + font-size: $font-size-tag; + height: 60rpx; + line-height: 60rpx; + box-sizing: content-box; + min-width: 60rpx; + text-align: center; + + &.color-base-bg { + color: var(--btn-text-color); + } + + &:last-child { + margin-right: 0; + } + } +} +.status-name { + view, text { + font-size: $font-size-toolbar; + color: #fff; + line-height: 1; + margin-top: 40rpx; + text-align: left; + } + + .desc { + font-size: $font-size-tag; + margin: 10rpx 0 0 0; + } +} + +.head-nav { + width: 100%; + height: var(--status-bar-height); +} + +.head-nav.active { + padding-top: 40rpx; +} + +.head-return { + height: 90rpx; + line-height: 90rpx; + color: #fff; + font-weight: 600; + font-size: $font-size-toolbar; + position: relative; + text-align: center; + text { + position: absolute; + top: 50%; + transform: translateY(-50%); + left: 20rpx; + display: inline-block; + margin-right: 10rpx; + font-size: $font-size-toolbar; + } +} + +.store-detail view { + font-size: $font-size-activity-tag; +} + +.store-wrap { + @include wrap; + margin-top: -76rpx; + + .store-info { + display: flex; + align-items: center; + padding-left: 50rpx; + position: relative; + + .icon { + left: 0; + position: absolute; + top: 4rpx; + + .iconfont { + line-height: 50rpx; + font-size: $font-size-base; + } + .icon-mendian { + font-size: $font-size-toolbar; + } + } + + .store-name { + display: flex; + + .name { + flex: 1; + } + } + + .store-info-detail { + flex: 1; + .store-detail view { + font-size: $font-size-goods-tag + 2rpx; + } + & > view:first-of-type { + font-size: $font-size-tag + 2rpx; + } + } + .cell-more { + margin-left: 50rpx; + } + } +} +.pick-block { + &.first-pick-block { + border-top: 2rpx solid #f1f1f1; + } + display: flex; + align-items: center; + margin-top: 20rpx; + padding-top: 20rpx; + input, + .last-child { + flex: 1; + text-align: right; + font-size: $font-size-tag; + } +} +.sku { + display: flex; + line-height: 1; + margin-top: 10rpx; + margin-bottom: 10rpx; +} +.goods-spec { + color: #838383; + font-size: $font-size-goods-tag; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + flex: 1; +} + +.fixed-bottom{ + width: 100%; + position: fixed; + left: 0; + bottom: 0; + padding: 10rpx 30rpx; + box-sizing: border-box; + background: #FFFFFF; + z-index: 5; +} \ No newline at end of file diff --git a/pages/order/public/css/list.scss b/pages/order/public/css/list.scss new file mode 100644 index 0000000..fb95ae5 --- /dev/null +++ b/pages/order/public/css/list.scss @@ -0,0 +1,406 @@ +$margin-both: 24rpx; + +.order-container { + width: 100vw; +} + +.align-right { + text-align: right; +} + +.cate-search { + width: calc(100% - 48rpx); + background: #ffffff; + padding: 10rpx 24rpx 0 24rpx; + /* #ifdef H5 */ + padding-top: 30rpx; + /* #endif */ + position: relative; + z-index: 998; + + input { + font-size: $font-size-base; + height: 76rpx; + padding: 0 25rpx 0 30rpx; + line-height: 60rpx; + width: calc(100% - 120rpx); + } + + text { + font-size: 32rpx; + color: $color-tip; + width: 120rpx; + text-align: center; + } + + .search-box { + width: 100%; + background: $color-bg; + display: flex; + justify-content: center; + align-items: center; + border-radius: 100rpx; + } +} + +.order-nav { + width: 100vw; + height: 80rpx; + flex-direction: row; + /* #ifndef APP-PLUS */ + white-space: nowrap; + /* #endif */ + background: #fff; + display: flex; + position: fixed; + left: 0; + z-index: 998; + justify-content: space-around; + border-radius: 0px 0px 24rpx 24rpx; + + .uni-tab-item { + width: 120rpx; + text-align: center; + } + + .uni-tab-item-title { + font-size: $font-size-base; + display: inline-block; + height: 80rpx; + line-height: 80rpx; + border-bottom: 1px solid #fff; + flex-wrap: nowrap; + /* #ifndef APP-PLUS */ + white-space: nowrap; + /* #endif */ + text-align: center; + font-size: 30rpx; + position: relative; + } + + .uni-tab-item-title-active::after { + content: " "; + display: block; + position: absolute; + left: 0; + bottom: 0; + width: 100%; + height: 6rpx; + background: linear-gradient(270deg, var(--base-color-light-9) 0%, var(--base-color) 100%); + } + + ::-webkit-scrollbar { + width: 0; + height: 0; + color: transparent; + } +} + +.order-item { + margin: $margin-updown $margin-both; + border-radius: 12rpx; + background: #fff; + position: relative; + + .order-header { + display: flex; + align-items: center; + position: relative; + padding: $padding 24rpx 26rpx 24rpx; + + &.waitpay { + padding-left: 70rpx; + + .icon-yuan_checked, + .icon-yuan_checkbox { + font-size: $font-size-toolbar; + position: absolute; + top: 48%; + left: 20rpx; + transform: translateY(-50%); + } + .icon-yuan_checkbox { + color: $color-tip; + } + } + + .icon-dianpu { + display: inline-block; + line-height: 1; + margin-right: 12rpx; + font-size: $font-size-base; + } + + .order-no { + font-size: 26rpx; + } + + .status-name { + flex: 1; + text-align: right; + font-size: 26rpx; + font-weight: 600; + } + } + + .order-body { + .goods-wrap { + display: flex; + position: relative; + padding: 0 24rpx 30rpx 24rpx; + + &:last-of-type { + margin-bottom: 0; + } + + .goods-img { + width: 160rpx; + height: 160rpx; + margin-right: 20rpx; + + image { + width: 100%; + height: 100%; + border-radius: $border-radius; + } + } + + .goods-info { + flex: 1; + position: relative; + max-width: calc(100% - 180rpx); + display: flex; + flex-direction: column; + + .pro-info { + flex: 1; + } + + .goods-name { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; + line-height: 1.5; + font-size: $font-size-base; + color: $color-title; + } + + .goods-sub-section { + width: 100%; + line-height: 1.3; + display: flex; + margin-top: 14rpx; + + .goods-price { + font-size: $font-size-tag; + color: var(--price-color); + flex: 1; + font-weight: bold; + } + .goods-num { + font-size: $font-size-tag; + color: $color-tip; + flex: 1; + text-align: right; + line-height: 1; + + .iconfont { + font-size: $font-size-tag; + } + } + .goods-type { + font-size: $font-size-tag; + } + + .unit { + font-size: $font-size-tag; + margin-right: 2rpx; + } + + view { + flex: 1; + line-height: 1.3; + display: flex; + flex-direction: column; + + &:last-of-type { + text-align: right; + + .iconfont { + line-height: 1; + font-size: $font-size-tag; + } + } + } + } + + .goods-action { + text-align: right; + + .action-btn { + line-height: 1; + padding: 14rpx 20rpx; + color: $color-title; + display: inline-block; + border-radius: $border-radius; + background: #fff; + border: 2rpx solid #999; + font-size: $font-size-tag; + margin-left: 10rpx; + } + } + } + } + + .multi-order-goods { + width: calc(100vw - 96rpx); + white-space: nowrap; + margin: 0 24rpx 30rpx 24rpx!important; + position: relative; + + .scroll-view { + width: 100%; + } + + .goods-wrap { + padding: 0; + } + + .goods-img { + min-width: 160rpx; + } + + .shade { + position: absolute; + z-index: 5; + height: 100%; + width: 44rpx; + right: 0; + top: 0; + + image { + width: 100%; + height: 100%; + } + } + } + } + + .order-footer { + .order-base-info { + .total { + padding: $padding; + font-size: $font-size-tag; + background: rgba(248, 248, 248, 0.5); + display: flex; + margin: 0 24rpx; + + & > text { + flex: 1; + line-height: 1; + margin-left: 10rpx; + } + } + + .order-type { + padding-top: 20rpx; + flex: 0.5; + + & > text { + line-height: 1; + } + } + } + + .order-action { + text-align: right; + padding: 30rpx 24rpx; + position: relative; + + .order-time { + position: absolute; + top: 35rpx; + left: 30rpx; + display: flex; + align-items: center; + font-size: 10px; + color:#b5b6b9; + + image { + width: 26rpx; + height: 26rpx; + margin-right: 6rpx; + } + } + + .action-btn { + line-height: 1; + padding: 20rpx 26rpx; + color: #333; + display: inline-block; + border-radius: $border-radius; + background: #fff; + border: 2rpx solid #999; + font-size: $font-size-tag; + margin-left: 10rpx; + } + } + } +} + +/deep/ #action-date .uni-countdown .uni-countdown__number { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} + +.order-batch-action { + position: fixed; + z-index: 5; + left: 0; + bottom: 0; + width: 100vw; + height: 100rpx; + background: #fff; + box-shadow: 0 0px 10px rgba(0, 0, 0, 0.1); + text-align: right; + + &.bottom-safe-area { + padding-bottom: constant(safe-area-inset-bottom); + padding-bottom: env(safe-area-inset-bottom); + } + + .action-btn { + height: 68rpx; + line-height: 68rpx; + background: #fff; + padding: 0 40rpx; + display: inline-block; + text-align: center; + margin: 16rpx 20rpx 16rpx 0; + border-radius: $border-radius; + border: 1px solid #ffffff; + + &.white { + height: 68rpx; + line-height: 68rpx; + color: #333; + border: 1px solid #999; + background: #fff; + } + } +} +.sku { + display: flex; + line-height: 1; + margin-top: 10rpx; +} +.goods-spec { + color: $color-tip; + font-size: $font-size-goods-tag; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + flex: 1; +} diff --git a/pages/order/public/js/orderMethod.js b/pages/order/public/js/orderMethod.js new file mode 100644 index 0000000..474927e --- /dev/null +++ b/pages/order/public/js/orderMethod.js @@ -0,0 +1,122 @@ +export default { + methods: { + /** + * 订单支付 + * @param {Object} out_trade_no + */ + orderPay(orderData) { + if (orderData.adjust_money == 0) { + this.pay(); + } else { + uni.showModal({ + title: '提示', + content: '商家已将支付金额调整为' + orderData.pay_money + '元,是否继续支付?', + success: res => { + if (res.confirm) { + this.pay(); + } + } + }) + } + }, + pay() { + this.$api.sendRequest({ + url: '/api/order/pay', + data: { + order_ids: this.orderData.order_id + }, + success: res => { + if (res.code >= 0) { + this.$refs.choosePaymentPopup.getPayInfo(res.data); + } else { + this.$util.showToast({ + title: res.message + }); + } + } + }) + }, + /** + * 关闭订单 + * @param {Object} order_id + */ + orderClose(order_id, callback) { + uni.showModal({ + title: '提示', + content: '您确定要关闭该订单吗?', + success: res => { + if (res.confirm) { + this.$api.sendRequest({ + url: '/api/order/close', + data: { + order_id + }, + success: res => { + if (res.code >= 0) { + typeof callback == 'function' && callback(); + } else { + this.$util.showToast({ + title: '当前订单可能存在拼团,维权等操作,' + res.message + '不可以关闭哦!', + duration: 2000 + }) + } + } + }) + } + } + }) + }, + /** + * 订单收货 + * @param {Object} order_id + */ + orderDelivery(order_id, callback) { + uni.showModal({ + title: '提示', + content: '您确定已经收到货物了吗?', + success: res => { + if (res.confirm) { + this.$api.sendRequest({ + url: '/api/order/takedelivery', + data: { + order_id + }, + success: res => { + this.$util.showToast({ + title: res.message + }) + typeof callback == 'function' && callback(); + } + }) + } + }, + }) + }, + /** + * 订单虚拟商品收货 + * @param {Object} order_id + */ + orderVirtualDelivery(order_id, callback) { + uni.showModal({ + title: '提示', + content: '您确定要进行收货吗操作?', + success: res => { + if (res.confirm) { + this.$api.sendRequest({ + url: '/api/order/membervirtualtakedelivery', + data: { + order_id + }, + success: res => { + this.$util.showToast({ + title: res.message + }) + typeof callback == 'function' && callback(); + } + }) + } + }, + }) + }, + } +} diff --git a/pages/order/public/js/refundMethod.js b/pages/order/public/js/refundMethod.js new file mode 100644 index 0000000..2feb464 --- /dev/null +++ b/pages/order/public/js/refundMethod.js @@ -0,0 +1,30 @@ +export default { + methods: { + /** + * 撤销退款申请 + * @param {Object} order_goods_id + * @param {Object} callback + */ + cancleRefund(order_goods_id, callback) { + uni.showModal({ + content: '撤销之后本次申请将会关闭,如后续仍有问题可再次发起申请。', + cancelText: '暂不撤销', + cancelColor: '#898989', + success: res => { + if (res.confirm) { + this.$api.sendRequest({ + url: '/api/orderrefund/cancel', + data: { + order_goods_id + }, + success: res => { + typeof callback == 'function' && callback(res); + } + }) + } + } + }) + }, + + } +} diff --git a/pages_promotion/bale/detail.vue b/pages_promotion/bale/detail.vue new file mode 100644 index 0000000..ef97504 --- /dev/null +++ b/pages_promotion/bale/detail.vue @@ -0,0 +1,206 @@ + ++ + + + + + + + + diff --git a/pages_promotion/bale/payment.vue b/pages_promotion/bale/payment.vue new file mode 100644 index 0000000..cf0aa6a --- /dev/null +++ b/pages_promotion/bale/payment.vue @@ -0,0 +1,49 @@ + ++ ++ ++ + +以下商品{{ info.price }}元任选{{ info.num }}件 +活动未开始 ++ 距离结束还剩 + ++ + ++ ++ ++ + +{{ item.goods_name }} +{{ item.introduction }} ++ ++ +{{ $lang('common.currencySymbol') }} + {{ + parseFloat(item.price) + .toFixed(2) + .split('.')[0] + }} ++ .{{ + parseFloat(item.price) + .toFixed(2) + .split('.')[1] + }} + ++ ++ ++ + ++ + + +选规格 ++ + ++ + ++ {{ cart['goods_' + item.goods_id].num }} ++ + ++ {{ cart['goods_' + item.goods_id].num }} ++ + + ++ ++ ++ ++ {{ totalNum }} ++ ++ +{{ $lang('common.currencySymbol') }} + {{ + parseFloat(totalPrice) + .toFixed(2) + .split('.')[0] + }} ++ .{{ + parseFloat(totalPrice) + .toFixed(2) + .split('.')[1] + }} + +{{ info.price }}元任选{{ info.num }}件 ++ +立即下单 +立即下单 ++ + ++ ++ 购物车 + ++ 清空购物车 ++ ++ ++ +{{ item.goods_name }} +{{ item | sku }} ++ +{{ $lang('common.currencySymbol') }} + {{ + parseFloat(item.price) + .toFixed(2) + .split('.')[0] + }} ++ .{{ + parseFloat(item.price) + .toFixed(2) + .split('.')[1] + }} + ++ ++ {{ item.num }} ++ + + + + + + + + + + diff --git a/pages_promotion/bale/public/css/detail.scss b/pages_promotion/bale/public/css/detail.scss new file mode 100644 index 0000000..a251965 --- /dev/null +++ b/pages_promotion/bale/public/css/detail.scss @@ -0,0 +1,361 @@ +.container{ + width: 100vw; + height: 100vh; +} + +.activity-head{ + padding: 0 40rpx 40rpx; + padding-top: 40rpx; + height: 160rpx; + + .activity-text{ + color: #fff; + line-height: 1; + } + + .time{ + color: #fff; + font-size: 24rpx; + margin-top: 6rpx; + } + .no-start{ + color: #fff; + font-size: 30rpx; + margin-top: 16rpx; + } +} + +.goods-wrap{ + background-color: #fff; + margin:0 20rpx; + margin-top: -80rpx; + border-radius: 8rpx; + + .goods-item{ + padding: 30rpx 0; + display: flex; + margin: 0 30rpx; + border-bottom: 1px solid #f8f8f8; + + &:last-child{ + border-bottom: 0; + } + + .goods-image{ + width: 200rpx; + height: 200rpx; + overflow: hidden; + margin-right: 20rpx; + border-radius: $border-radius; + + image{ + width: inherit; + } + } + + .goods-info{ + flex: 1; + position: relative; + + .name{ + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; + font-size: $font-size-base; + line-height: 36rpx; + font-weight: 600; + } + + .introduction{ + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 1; + overflow: hidden; + font-size: $font-size-base; + color: #999; + line-height: 28rpx; + margin-top: 10rpx; + height: 28rpx; + } + } + + .goods-bottom{ + display: flex; + position: absolute; + bottom: 0; + left: 0; + width: 100%; + + & > view{ + flex: 1; + } + + .price{ + line-height: 1; + display: flex; + align-items: baseline; + font-weight: bold; + + .unit{ + font-size: 24rpx; + } + } + + .num{ + line-height: 1; + + view{ + line-height: 1; + } + + .num-wrap{ + text-align: right; + } + + .goods-num{ + width: 60rpx; + padding: 0 10rpx; + display: inline-block; + text-align: center; + transform: translateY(-4rpx); + } + + .icon-jianshao{ + font-size: 40rpx; + color: #ccc; + } + .icon-add-fill{ + font-size: 40rpx; + } + + .select{ + color: #fff; + font-size: 24rpx; + padding: 0 20rpx; + height: 40rpx; + line-height: 40rpx; + border-radius: 36rpx; + display: inline-block; + } + } + } + } + +} + +.footer-wrap{ + position: fixed; + width: 100vw; + bottom: 0; + padding: 20rpx; + background: #fff; + box-shadow: 0 -2px 10px 0 rgba(125,126,128,.16); + display: flex; + box-sizing: border-box; + z-index: 10; + + & > view { + flex: 1; + } + + .left{ + display: flex; + + .cart-wrap{ + width: 80rpx; + height: 80rpx; + border-radius: 50%; + background-color: #ddd; + display: flex; + align-items: center; + justify-content: center; + position: relative; + margin-right: 30rpx; + + .iconfont{ + font-size: 40rpx; + color: #999; + } + + .num{ + position: absolute; + right: 0; + top: 0; + font-size: 20rpx; + transform: translateX(16rpx); + padding: 4rpx 10rpx; + line-height: 1; + color: #fff; + border-radius: 20rpx; + } + } + + .data{ + flex: 1; + + .price{ + line-height: 1; + display: flex; + align-items: baseline; + font-weight: 600; + font-size: $font-size-toolbar; + margin-top: 10rpx; + + .unit{ + font-size: 24rpx; + } + } + + .desc{ + margin-top: 10rpx; + font-size: $font-size-base; + color: #999; + line-height: 1; + } + } + } + + .right{ + text-align: right; + display: flex; + align-items: center; + justify-content: flex-end; + + .sub-btn{ + height: 70rpx; + line-height: 70rpx; + color: #fff; + text-align: center; + width: 200rpx; + border-radius: 50rpx; + font-size: 28rpx; + + &.disabled{ + background-color: #ccc; + color: #eee; + } + } + + } +} + +.cart-shade{ + position: fixed; + width: 100vw; + height: 100vh; + z-index: 4; + left: 0; + top: 0; +} + +.cart-popup{ + position: fixed; + width: 100vw; + height: 0; + background-color: #fff; + bottom: 120rpx; + background: #fff; + box-shadow: 0 -2px 10px 0 rgba(125,126,128,.16); + box-sizing: content-box; + z-index: 5; + transition: all .3s; + + &.show{ + height: 45vh; + } + + .header{ + width: 100%; + line-height: 1; + display: flex; + height: 80rpx; + background-color: #eee; + align-items: center; + + & > view { + flex: 1; + padding: 0 30rpx; + box-sizing: border-box; + font-size: 24rpx; + } + + .right{ + text-align: right; + + .iconfont{ + font-size: 24rpx; + margin-right: 6rpx; + } + } + } + + .cart-goods-wrap{ + width: 100%; + height: calc(100% - 80rpx); + overflow-y: scroll; + + .goods-item{ + padding: 20rpx 0; + margin: 0 30rpx; + border-bottom: 1px solid #eee; + display: flex; + align-items: center; + + &:last-child{ + border-bottom: none; + } + + .info{ + flex: 1; + + .goods-name{ + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; + font-size: 28rpx; + line-height: 36rpx; + font-weight: 600; + } + + .sku-name{ + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 1; + overflow: hidden; + font-size: $font-size-base; + line-height: 36rpx; + color: #999; + } + } + + .price{ + font-weight: bold; + padding: 0 40rpx; + + .unit{ + font-size: 24rpx; + } + } + + .num{ + .goods-num{ + width: 60rpx; + padding: 0 10rpx; + display: inline-block; + text-align: center; + transform: translateY(-4rpx); + } + + .icon-jianshao{ + font-size: 40rpx; + color: #ccc; + } + .icon-add-fill{ + font-size: 40rpx; + } + } + } + } +} \ No newline at end of file diff --git a/pages_promotion/bale/public/css/payment.scss b/pages_promotion/bale/public/css/payment.scss new file mode 100644 index 0000000..a472227 --- /dev/null +++ b/pages_promotion/bale/public/css/payment.scss @@ -0,0 +1,979 @@ +@mixin wrap { + margin: $margin-both $margin-updown; + padding: $padding; + border-radius: $border-radius; + background: #fff; + position: relative; +} +view, +input, +text, +textarea { + font-size: $font-size-base + 2rpx; +} +.popup-header { + .icon-close { + font-size: $font-size-toolbar; + } +} + +.inline { + display: inline !important; +} + +.order-container { + padding-bottom: 160rpx; + + &.safe-area { + padding-bottom: 188rpx; + } +} + +.address-wrap { + @include wrap; + min-height: 100rpx; + display: flex; + align-items: center; + margin-top: -76rpx; + padding: 24rpx; + + .icon { + width: 60rpx; + height: 60rpx; + display: flex; + justify-content: center; + align-items: center; + border-radius: 50%; + position: absolute; + top: 40rpx; + margin-right: 20rpx; + // background-color: $base-color; + image { + width: 60rpx; + height: 60rpx; + } + .iconfont { + line-height: 1; + color: #fff; + font-size: $font-size-toolbar; + } + .icon-mendian { + font-size: $font-size-toolbar; + } + } + + .address-info { + padding-left: 100rpx; + padding-right: 40rpx; + flex: 1; + + .info { + display: flex; + + text { + flex: 1; + + &:last-of-type { + text-align: right; + color: #999; + } + } + } + + .detail { + margin-top: 8rpx; + line-height: 1.3; + } + } + + .cell-more { + position: absolute; + top: 50%; + transform: translateY(-50%); + right: 10rpx; + + .iconfont { + color: #999; + font-size: $font-size-toolbar; + } + } +} + +.mobile-wrap { + @include wrap; + min-height: 100rpx; + display: flex; + align-items: center; + margin-top: -76rpx; + padding: 24rpx; + .icon { + width: 60rpx; + height: 60rpx; + display: flex; + justify-content: center; + align-items: center; + border-radius: 50%; + position: absolute; + top: 50%; + transform: translateY(-50%); + margin-right: 20rpx; + // background-color: $base-color; + image { + width: 60rpx; + height: 60rpx; + } + .iconfont { + line-height: 1; + color: #fff; + } + .icon-mendian { + font-size: $font-size-toolbar; + } + } + .mobile-info { + padding-left: 100rpx; + } + .form-group { + .form-item { + display: flex; + line-height: 50rpx; + + .text { + display: inline-block; + line-height: 50rpx; + padding-right: 10rpx; + } + + .placeholder { + line-height: 50rpx; + } + + .input { + flex: 1; + height: 50rpx; + line-height: 50rpx; + color: #838383; + } + } + } +} + +.order-cell { + display: flex; + margin: 20rpx 0; + align-items: center; + background: #fff; + line-height: 40rpx; + position: relative; + + .tit { + text-align: left; + } + + .box { + flex: 1; + padding: 0 10rpx; + line-height: inherit; + text-align: right; + + .textarea { + height: 40rpx; + font-size: $font-size-base !important; + } + + input { + font-size: $font-size-base !important; + } + } + + .iconfont { + color: #bbb; + font-size: $font-size-toolbar; + } + + .order-pay { + padding: 0; + + text { + display: inline-block; + margin-left: 6rpx; + } + } +} +.site-wrap { + @include wrap; + + .site-header { + display: flex; + align-items: center; + + .icon-dianpu { + display: inline-block; + line-height: 1; + margin-right: 12rpx; + font-size: $font-size-toolbar; + } + } + + .site-body { + .goods-wrap { + margin-bottom: 20rpx; + display: flex; + position: relative; + &:last-of-type { + margin-bottom: 0; + padding-bottom: $padding; + border-bottom: 2rpx solid #f1f1f1; + } + + .goods-img { + width: 124rpx; + height: 124rpx; + padding: 20rpx 0 0 0; + margin-right: 20rpx; + border-radius: $border-radius; + overflow: hidden; + image { + width: 100%; + height: 100%; + border-radius: $border-radius; + } + } + + .goods-info { + flex: 1; + position: relative; + padding: 20rpx 0 0 0; + display: flex; + flex-direction: column; + justify-content: space-between; + .goods-name { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; + line-height: 1.5; + } + + .goods-sub-section { + width: 100%; + line-height: 1.3; + display: flex; + align-items: center; + padding: 0 10rpx; + box-sizing: border-box; + .icon-close { + font-size: $font-size-base; + } + + .goods-price { + font-weight: 700; + font-size: $font-size-base; + } + + .unit { + font-weight: normal; + font-size: $font-size-base; + margin-right: 2rpx; + } + + view { + flex: 1; + line-height: 1.3; + font-weight: 500; + &:last-of-type { + text-align: right; + + .iconfont { + line-height: 1; + } + } + } + } + } + } + } + + .site-footer { + .order-cell { + .tit { + width: 180rpx; + text-align: left; + } + + .box { + input { + font-size: $font-size-base !important; + } + &.text-overflow { + text { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + display: block; + width: 100%; + } + } + } + + &:last-of-type { + margin-bottom: 0; + } + } + } +} + +.order-checkout { + @include wrap; + .order-cell { + .icon-yuan_checkbox, + .icon-yuan_checked { + font-size: $font-size-toolbar; + position: absolute; + top: 50%; + right: 0; + transform: translateY(-50%); + color: #aaa; + } + } +} + +.order-money { + @include wrap; + + .order-cell { + .box { + font-weight: 600; + padding: 0; + + .operator { + font-size: $font-size-base; + margin-right: 6rpx; + } + input { + font-size: $font-size-base !important; + } + } + } +} + +.order-submit { + position: fixed; + z-index: 5; + left: 0; + bottom: 0; + width: 100vw; + height: 100rpx; + background: #fff; + // box-shadow: 0 0px 10px rgba(0, 0, 0, 0.1); + text-align: right; + display: flex; + align-items: center; + + &.bottom-safe-area { + // padding-bottom: 68rpx !important; + padding-bottom: 0; + padding-bottom: constant(safe-area-inset-bottom); + padding-bottom: env(safe-area-inset-bottom); + } + + .order-settlement-info { + flex: 1; + height: 100rpx; + line-height: 100rpx; + } + + .submit-btn { + height: 80rpx; + margin: 0 20rpx 0 34rpx; + display: flex; + justify-content: center; + align-items: center; + button { + line-height: 54rpx; + width: 156rpx; + height: 54rpx; + text-align: center; + padding: 0; + } + } +} + +.popup { + width: 100vw; + background: #fff; + border-top-left-radius: 24rpx; + border-top-right-radius: 24rpx; + + .popup-header { + display: flex; + align-items: center; + justify-content: space-between; + border-bottom: 2rpx solid rgba(241, 241, 241, 1); + padding: 40rpx; + & > view { + line-height: 1; + } + + .tit { + flex: 1; + font-size: $font-size-toolbar; + } + .align-right { + display: flex; + align-items: center; + } + + .vice-tit { + margin-right: 20rpx; + } + } + + .popup-body { + height: calc(100% - 250rpx); + &.store-popup { + height: calc(100% - 120rpx); + } + &.safe-area { + height: calc(100% - 270rpx); + } + &.store-popup.safe-area { + height: calc(100% - 140rpx); + } + } + + .popup-footer { + height: 120rpx; + + .confirm-btn { + height: 72rpx; + line-height: 72rpx; + color: #fff; + text-align: center; + margin: 20rpx 40rpx; + border-radius: $border-radius; + } + + &.bottom-safe-area { + padding-bottom: 68rpx !important; + } + } +} + +.invoice-popup { + height: 83vh; + padding: 18rpx 0; + box-sizing: border-box; + position: relative; + + .invoice-close { + position: absolute; + line-height: 1; + top: 48rpx; + right: 48rpx; + font-size: $font-size-toolbar; + z-index: 9; + } + .popup-body { + .invoice-cell { + padding: 30rpx 0; + border-top: 1px solid #f5f5f5; + margin: 0 48rpx; + + &:first-of-type { + border-top: none; + } + + .tit { + font-size: $font-size-toolbar; + } + + .option-grpup { + padding-top: 20rpx; + + .option-item { + height: 54rpx; + line-height: 54rpx; + display: inline-block; + font-size: $font-size-tag; + padding: 0 36rpx; + background: #eee; + border: 1px solid #eee; + border-radius: 50px; + margin: 0 20rpx 20rpx 0; + + &:nth-of-type(1), + &:nth-of-type(2), + &:nth-of-type(3) { + margin-bottom: 0; + } + + &.active { + // background: $base-color; + color: #fff; + } + + &.disabled { + color: #aaa; + } + } + } + + .invoice-form-group { + input { + background: rgba(241, 241, 241, 1); + border-radius: 10rpx; + height: 66rpx; + margin-top: 22rpx; + padding: 0 32rpx; + } + } + } + .invoice-tops { + font-size: $font-size-tag; + margin: 0 48rpx; + } + } +} + +.coupon-popup { + height: 65vh; + + .popup-body { + background: #f5f5f5; + } + + .coupon-item { + @include wrap; + + & > .iconfont { + font-size: $font-size-toolbar; + position: absolute; + top: 50%; + right: 20rpx; + transform: translateY(-50%); + } + & > .icon-yuan_checkbox { + color: $color-tip; + } + + .circular { + position: absolute; + top: 50%; + left: 0; + transform: translate(-50%, -50%); + background: #f5f5f5; + width: 30rpx; + height: 30rpx; + border-radius: 50%; + z-index: 5; + } + + .coupon-info { + padding-right: 60rpx; + height: 140rpx; + display: flex; + width: 100%; + + .coupon-money { + width: 160rpx; + height: 140rpx; + display: flex; + justify-content: center; + align-items: center; + margin-right: 20rpx; + + text { + font-size: 50rpx; + } + } + + .info { + flex: 1; + max-width: calc(100% - 240rpx); + + view { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .ns-text-color-gray { + line-height: 1.5; + } + } + } + } +} + +.promotion-popup { + height: 65vh; + + .order-cell { + margin: 20rpx 30rpx; + + .promotion-mark { + padding: 4rpx 10rpx; + line-height: 1; + border-radius: 32rpx; + color: #fff; + font-size: $font-size-base; + margin-right: 10rpx; + } + } +} + +.delivery-popup { + height: 80vh; + // padding: 48rpx; + box-sizing: border-box; + + .delivery-cell { + padding: 30rpx 0; + box-sizing: border-box; + .tit { + font-size: $font-size-toolbar; + } + + .option-grpup { + .option-item { + display: inline-block; + line-height: 1; + font-size: $font-size-toolbar; + padding: 16rpx 40rpx; + border: 1px solid #eee; + border-radius: 32rpx; + margin: 0 20rpx 20rpx 0; + + &:nth-of-type(1), + &:nth-of-type(2), + &:nth-of-type(3) { + margin-bottom: 0; + } + + &.active { + // background: opacify($base-color-rgba, 0.01); + } + + &.disabled { + color: #aaa; + } + } + } + } + + .delivery-cont { + height: 100%; + overflow-y: scroll; + + .pickup-point { + padding: 20rpx 0; + box-sizing: border-box; + border-top: 1px solid #f5f5f5; + display: flex; + justify-content: space-between; + align-items: center; + margin: 0 48rpx; + + .color-active { + view, + text { + // color: $base-color; + } + } + .delivery-detail { + width: 90%; + } + .name { + display: flex; + text { + font-size: $font-size-toolbar; + } + } + + .icon { + flex: 1; + text-align: right; + + .iconfont { + line-height: 1; + font-size: $font-size-toolbar; + } + } + + &:first-of-type { + padding-top: 0; + border-top: none; + } + + .info { + line-height: 1.2; + view { + font-size: $font-size-tag; + } + } + } + } +} + +.pay-password { + width: 80vw; + background: #fff; + box-sizing: border-box; + border-radius: 10rpx; + overflow: hidden; + padding: 60rpx 40rpx; + transform: translateY(-200rpx); + + .title { + font-size: $font-size-toolbar; + text-align: center; + } + + .tips { + font-size: $font-size-base; + color: #999; + text-align: center; + } + + .btn { + width: 60%; + margin: 0 auto; + margin-top: 30rpx; + height: 70rpx; + line-height: 70rpx; + border-radius: $border-radius; + color: #fff; + text-align: center; + border: 1px solid #ffffff; + + &.white { + margin-top: 20rpx; + background-color: #fff !important; + } + } + + .password-wrap { + padding-top: 20rpx; + width: 90%; + margin: 0 auto; + + .forget-password { + margin-top: 20rpx; + display: inline-block; + } + } +} + +.head-nav { + width: 100%; + height: var(--status-bar-height); +} + +.head-nav.active { + padding-top: 40rpx; +} + +.head-return { + height: 90rpx; + line-height: 90rpx; + color: #fff; + font-weight: 600; + font-size: $font-size-toolbar; + width: 100%; + text-align: center; + position: relative; + text { + position: absolute; + top: 50%; + transform: translateY(-50%); + left: $margin-both; + display: inline-block; + margin-right: 10rpx; + font-size: $font-size-toolbar; + } +} +.payment-top { + width: 100%; + height: 180rpx; + overflow: hidden; +} + +/* 2020/6/1 新增样式 */ +.big-tit { + font-size: $font-size-toolbar; +} +.balance-switch { + transform: scale(0.8); +} +.margin-top { + margin-top: -76rpx; +} +.store-wrap { + background-color: #fff; + margin: -140rpx 20rpx 20rpx; + border-radius: $border-radius; + .delivery-box { + padding: 20rpx; + border-radius: $border-radius; + } + .store-info { + display: flex; + align-items: center; + .icon { + width: 60rpx; + height: 60rpx; + border-radius: 50%; + position: relative; + margin-right: 26rpx; + align-self: flex-start; + margin-top: 12rpx; + &.image-icon { + background-color: unset; + image { + width: 100%; + height: 100%; + } + } + .iconfont { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + font-size: 32rpx; + color: #fff; + } + } + .store-info-detail { + flex: 1; + .store-detail view { + font-size: $font-size-tag + 2rpx; + } + } + .cell-more { + margin-left: 50rpx; + } + } + .pick-block { + display: flex; + align-items: center; + margin-top: 20rpx; + padding-top: 20rpx; + border-top: 2rpx solid #f1f1f1; + >view{ + flex: 1; + } + .time-picker{ + display: flex; + align-items: center; + justify-content: flex-end; + view{ + text-align: center; + color: $color-tip; + } + } + } +} +// tabs +@mixin triangle { + content: ''; + position: absolute; + top: 1rpx; + width: 0; + height: 0; + border-bottom: 70rpx solid #fff; + z-index: 2; +} +@mixin triangle-left { + @include triangle; + left: calc(100% - 1rpx); + border-right: 16px solid transparent; +} +@mixin triangle-right { + @include triangle; + right: calc(100% - 1rpx); + border-left: 16px solid transparent; +} +.tabs { + border-radius: 23rpx; + background: rgba(255, 255, 255, 0.3); + display: flex; + align-items: center; + height: 70rpx; + position: relative; + margin-bottom: $margin-updown; + & > view { + color: #fff; + text-align: center; + font-size: $font-size-tag; + flex: 1; + height: 100%; + line-height: 70rpx; + opacity: 0.7; + position: relative; + &.active { + background-color: #fff !important; + opacity: 1; + transform: scaleY(1.2); + z-index: 2; + transform-origin: 0 100%; + -webkit-transform-origin: 0 100%; + border-top-left-radius: $border-radius; + border-top-right-radius: $border-radius; + // 字体放大后缩小 + .content { + color: #333; + transform: scaleY(0.83) translate3d(-50%, -50%, 0); + } + } + .content { + position: absolute; + top: 50%; + left: 50%; + transform: translate3d(-50%, -50%, 0); + color: #fff; + } + + &:not(:first-of-type):not(:last-of-type).active { + &:before { + @include triangle-left; + } + &:after { + @include triangle-right; + } + } + + &:first-of-type.active { + &:before { + @include triangle-left; + } + } + + &:last-of-type.active { + &:after { + @include triangle-right; + } + } + } +} +.text-right{ + text-align: right; +} +.sku { + display: flex; + line-height: 1; + margin-top: 10rpx; + margin-bottom: 10rpx; +} +.goods-spec{ + color: #838383; + font-size: $font-size-tag; + overflow:hidden; + text-overflow:ellipsis; + white-space:nowrap; + flex:1 +} +.address-empty { + line-height: 100rpx; + text-align: center; + } diff --git a/pages_promotion/bale/public/js/detail.js b/pages_promotion/bale/public/js/detail.js new file mode 100644 index 0000000..4999d35 --- /dev/null +++ b/pages_promotion/bale/public/js/detail.js @@ -0,0 +1,342 @@ +export default { + data() { + return { + info: null, + timeMachine: null, + page: 1, + goodsList: [], + cart: {}, + totalPrice: 0.00, + totalNum: 0, + goodsSkuDetail: null, + skuList: [], + cartShow: false, + isSub: false, + token: null, + //分享建立上下级所需id + memberId: 0, + }; + }, + onLoad(data) { + if (data.id) this.id = data.id; + if (data.scene) { + var sceneParams = decodeURIComponent(data.scene); + sceneParams = sceneParams.split('&'); + if (sceneParams.length) { + sceneParams.forEach(item => { + if (item.indexOf('id') != -1) this.id = item.split('-')[1]; + }); + } + } + //小程序分享接收source_member + if (data.source_member) { + uni.setStorageSync('source_member', data.source_member); + } + // 小程序扫码进入,接收source_member + if (data.scene) { + var sceneParams = decodeURIComponent(data.scene); + sceneParams = sceneParams.split('&'); + if (sceneParams.length) { + sceneParams.forEach(item => { + if (item.indexOf('sku_id') != -1) this.skuId = item.split('-')[1]; + if (item.indexOf('m') != -1) uni.setStorageSync('source_member', item.split('-')[1]); + if (item.indexOf('is_test') != -1) uni.setStorageSync('is_test', 1); + }); + } + } + + this.getBaleInfo(); + }, + onShow() { + //记录分享关系 + if (uni.getStorageSync('token') && uni.getStorageSync('source_member')) { + this.$util.onSourceMember(uni.getStorageSync('source_member')); + } + }, + methods: { + /** + * 查询活动信息 + */ + getBaleInfo() { + this.$api.sendRequest({ + url: '/bale/api/bale/detail', + data: { + bale_id: this.id + }, + success: res => { + if (res.code == 0 && res.data) { + this.info = res.data; + if (this.info.status == 1) { + this.timeMachine = this.$util.countDown(this.info.end_time - res.timestamp); + } else if (this.info.status == 2) { + this.$util.showToast({ + title: '该活动已关闭' + }); + setTimeout(() => { + this.$util.redirectTo('/pages/index/index'); + }, 1500); + } + } else { + this.$util.showToast({ + title: '未找到活动' + }); + setTimeout(() => { + this.$util.redirectTo('/pages/index/index'); + }, 1500); + } + }, + fail: res => { + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + } + }) + }, + /** + * 查询商品列表 + * @param {Object} mescroll + */ + getGoodsList(mescroll) { + let newArr = []; + if (this.info.sku_list_count == 0) { + this.emptyShow = true; + } else { + newArr = this.info.sku_list.splice(0, mescroll.size); + } + + mescroll.endSuccess(newArr.length); + //设置列表数据 + if (mescroll.num == 1) this.goodsList = []; //如果是第一页需手动制空列表 + this.goodsList = this.goodsList.concat(newArr); //追加新数据 + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + }, + imageError(index) { + this.goodsList[index].sku_image = this.$util.getDefaultImage().goods; + this.$forceUpdate(); + }, + /** + * 单规格数量增加 + * @param {Object} data + */ + singleSkuPlus(data) { + if (this.cart['goods_' + data.goods_id] != undefined) { + var num = this.cart['goods_' + data.goods_id].num; + if ((num + 1) > data.stock) { + this.$util.showToast({ + title: '库存不足' + }); + return; + } + this.cart['goods_' + data.goods_id].num += 1; + this.cart['goods_' + data.goods_id]['sku_' + data.sku_id].num += 1; + } else { + this.cart['goods_' + data.goods_id] = { + num: 1 + } + this.cart['goods_' + data.goods_id]['sku_' + data.sku_id] = data; + this.cart['goods_' + data.goods_id]['sku_' + data.sku_id].num = 1; + } + this.totalNum += 1; + this.cart = Object.assign({}, this.cart) + }, + /** + * 单规格数量减少 + * @param {Object} data + */ + singleSkuReduce(data) { + if (this.cart['goods_' + data.goods_id] != undefined) { + var num = this.cart['goods_' + data.goods_id]['sku_' + data.sku_id].num; + this.cart['goods_' + data.goods_id].num -= 1; + this.cart['goods_' + data.goods_id]['sku_' + data.sku_id].num -= 1; + this.totalNum -= 1; + if ((num - 1) == 0) { + delete this.cart['goods_' + data.goods_id]['sku_' + data.sku_id]; + if (Object.keys(this.cart['goods_' + data.goods_id]).length == 1) { + delete this.cart['goods_' + data.goods_id]; + } + } + this.cart = Object.assign({}, this.cart) + } + }, + /** + * 多规格选择 + */ + manySkuSelect(data) { + if (typeof data.sku_spec_format == 'string' && data.sku_spec_format) data.sku_spec_format = JSON.parse(data + .sku_spec_format); + if (typeof data.goods_sku_spec_format == 'string' && data.goods_sku_spec_format) data.goods_spec_format = + JSON.parse(data.goods_sku_spec_format); + data.bale_id = this.id; + data.activity_sku_ids = this.info.sku_ids.split(','); + + this.goodsSkuDetail = data; + + setTimeout(() => { + this.$refs.goodsSku.show("bale", () => {}); + }, 100) + }, + refreshGoodsSkuDetail(goodsSkuDetail) { + Object.assign(this.goodsSkuDetail, goodsSkuDetail); + }, + joinCart(data) { + + if (this.cart['goods_' + data.goods_id] != undefined) { + if (this.cart['goods_' + data.goods_id]['sku_' + data.sku_id] != undefined) { + this.cart['goods_' + data.goods_id].num += (data.num - this.cart['goods_' + data.goods_id]['sku_' + + data.sku_id + ].num); + this.totalNum += (data.num - this.cart['goods_' + data.goods_id]['sku_' + data.sku_id].num); + this.cart['goods_' + data.goods_id]['sku_' + data.sku_id].num = data.num; + } else { + this.cart['goods_' + data.goods_id]['sku_' + data.sku_id] = data.detail; + this.cart['goods_' + data.goods_id]['sku_' + data.sku_id].num = data.num; + this.cart['goods_' + data.goods_id].num += data.num; + this.totalNum += data.num; + } + } else { + this.cart['goods_' + data.goods_id] = { + num: data.num + } + this.cart['goods_' + data.goods_id]['sku_' + data.sku_id] = data.detail; + this.cart['goods_' + data.goods_id]['sku_' + data.sku_id].num = data.num; + this.totalNum += data.num; + } + this.cart = Object.assign({}, this.cart) + this.$refs.goodsSku.hide(); + }, + openCartPopup() { + if (!this.skuList.length) return; + this.cartShow = !this.cartShow; + }, + closeCartPopup() { + this.cartShow = false; + }, + clearCart() { + this.cart = {}; + this.totalNum = 0; + this.closeCartPopup(); + }, + submit() { + if (!uni.getStorageSync('token')) { + setTimeout(() => { + this.$refs.login.open('/pages_promotion/bale/detail?id=' + this.id); + }); + } else { + if (this.isSub) return; + this.isSub = true; + let sku = []; + this.skuList.forEach((item) => { + sku.push({ + sku_id: item.sku_id, + num: item.num + }) + }) + uni.setStorage({ + key: 'baleOrderCreateData', + data: { + bale_id: this.id, + sku_list_json: JSON.stringify(sku) + }, + success: () => { + this.isSub = false; + this.$util.redirectTo('/pages_promotion/bale/payment'); + } + }); + } + } + }, + filters: { + /** + * 金额格式化输出 + * @param {Object} money + */ + moneyFormat(money) { + return parseFloat(money).toFixed(2); + }, + /** + * 输出规格 + * @param {Object} money + */ + sku(data) { + let sku = ''; + if (data) { + sku = data.sku_name.replace(data.goods_name, ''); + } + return sku; + } + }, + watch: { + cart: { + deep: true, + handler: function(newV, oldV) { + let sku_list = [], + start = 1; + for (let key in this.cart) { + let goods = this.cart[key]; + + for (let skuKey in goods) { + if (skuKey.indexOf('num') == -1) { + let item = goods[skuKey]; + item.start = start; + item.end = start + item.num; + sku_list.push(goods[skuKey]); + + start += item.num; + } + } + } + this.skuList = sku_list; + } + }, + totalNum: function(newV) { + if (newV > 0) { + if (newV % this.info.num == 0) { + this.totalPrice = this.info.price * (newV / this.info.num); + } else { + let multiple = Math.floor(newV / this.info.num), + money = parseFloat(multiple * this.info.price), + num = multiple * this.info.num; + + for (let i = 0; i < newV % this.info.num; i++) { + num += 1; + for (let j = 0; j < this.skuList.length; j++) { + let item = this.skuList[j]; + if (num >= item.start && num < item.end) { + money += parseFloat(item.price); + break; + } + } + } + this.totalPrice = money; + } + } else { + this.totalPrice = 0; + } + } + }, + /** + * 自定义分享内容 + */ + onShareAppMessage() { + var route = this.$util.getCurrentShareRoute(this.memberId); + var path = route.path; + return { + title: '这些商品' + this.info.price + '元任选' + this.info.num + '件', + imageUrl: '', + path: path, + success: res => {}, + fail: res => {} + }; + }, + // 分享到微信朋友圈 + // #ifdef MP-WEIXIN + onShareTimeline() { + var title = '这些商品' + this.info.price + '元任选' + this.info.num + '件'; + var route = this.$util.getCurrentShareRoute(this.memberId); + var query = route.query; + return { + title: title, + query: query, + imageUrl: '', + }; + }, + // #endif +} diff --git a/pages_promotion/bargain/detail.vue b/pages_promotion/bargain/detail.vue new file mode 100644 index 0000000..d57beca --- /dev/null +++ b/pages_promotion/bargain/detail.vue @@ -0,0 +1,490 @@ + ++ + + + + + + + + diff --git a/pages_promotion/bargain/list.vue b/pages_promotion/bargain/list.vue new file mode 100644 index 0000000..db833e7 --- /dev/null +++ b/pages_promotion/bargain/list.vue @@ -0,0 +1,429 @@ + ++ +{{ goodsDetail ? goodsDetail.browse_num : 0 }}人查看 +| +{{ goodsDetail ? goodsDetail.share_num : 0 }}人分享 +| +{{ goodsDetail ? goodsDetail.join_num : 0 }}人参与 ++ + ++ + ++ ++ {{ launchInfo.nickname }} ++ + +“ +我发现一件好物,快来帮我砍一刀 +” ++ + ++ + +{{ goodsDetail.sku_name }} ++ ++ 原价 + +{{ $lang('common.currencySymbol') }}{{ launchInfo.price }} ++ 最低可砍至 + +{{ $lang('common.currencySymbol') }}{{ launchInfo.floor_price }} ++ 已有 + +{{ launchInfo.curr_num }} + 人帮砍 ++ 剩余数量 + +{{ goodsDetail.bargain_stock }} ++ ++ 后结束 ++ +{{ goodsDetail.sku_name }} ++ ++ 原价: + ++ +{{ $lang('common.currencySymbol') }} ++ {{ + parseFloat(goodsDetail.price) + .toFixed(2) + .split('.')[0] + }} + ++ .{{ + parseFloat(goodsDetail.price) + .toFixed(2) + .split('.')[1] + }} + ++ 最低可砍至: + +{{ $lang('common.currencySymbol') }}{{ goodsDetail.floor_price }} ++ + ++ + + + + ++ ++ 已砍 + ++ {{ $lang('common.currencySymbol') }}{{ parseFloat(parseFloat(launchInfo.price) - parseFloat(launchInfo.curr_price)).toFixed(2) }} + + , ++ 还剩 + ++ {{ $lang('common.currencySymbol') + }}{{ + parseFloat( + parseFloat(launchInfo.price) - parseFloat(launchInfo.floor_price) - (parseFloat(launchInfo.price) - parseFloat(launchInfo.curr_price)) + ).toFixed(2) + }} + ++ + ++ 已砍 + +{{ $lang('common.currencySymbol') }}0 + , ++ 还剩 + ++ {{ $lang('common.currencySymbol') }} {{ parseFloat(parseFloat(goodsDetail.price) - parseFloat(goodsDetail.floor_price)).toFixed(2) }} + ++ 免费拿 + + ++ ++ ++ 恭喜您砍价成功,快去支付吧 ++ ++ 很遗憾未能砍至最低价,可立即支付带走您心仪的宝贝 +很遗憾未能砍至最低价 +很遗憾砍价未成单 +恭喜您通过立即支付带走您心仪的宝贝 ++ ++ ++ ++ + + ++ + + ++ ++ + + + + + + + ++ + + + ++ + + ++ ++ + + ++ + ++ + + ++ ++ + + ++ + +帮砍记录 ++ ++ ++ ++ ++ + +{{ item.nickname[0] }}*{{item.nickname[item.nickname.length-1]}} +{{ $util.timeStampTurnTime(item.bargain_time) }} ++ ++ 帮砍 + ¥{{ item.money }} +加载更多 ++ 现在还没有砍价记录! + + +砍价流程 ++ ++ ++ ++ 发起商品砍价 ++ ++ 邀请好友砍价达要求 ++ ++ 领取商品带回家 ++ +砍成晒单 ++ ++ ++ ++ ++ ++ ++ + +{{ item.nickname[0] }}*{{item.nickname[item.nickname.length-1]}} +{{ $util.timeStampTurnTime(item.end_time) }} ++ 成功砍至 + +{{ parseFloat(item.curr_price).toFixed(2) }}元 ++ + +商品详情 ++ ++ ++ ++ 该商家暂无上传相关详情哦! ++ + + + + + ++ ++ + + ++ ++ ++ {{ launchInfo.nickname }} ++ +还剩 ++ 结束 ++ + + + ++ ++ + + +您已帮砍 +{{ bargainMoney }} +元,您也可以参与砍价,快去挑选心仪的宝贝吧~~~ ++ + + + ++ ++ + + + + + + + +您已砍掉 +{{ my_bargain_money }} +元,听说分享次数越多砍价成功的机会越大哦! ++ + + + ++ ++ +分享 ++ + ++ + + + ++ + + ++ + ++ 取消分享 + + + ++ + ++ ++ + 保存图片 + + +长按保存图片 + ++ + {{ posterMsg }} ++ + + ++ ++ 首页 ++ + ++ 我的 ++ + +快捷 +导航 ++ + + + + + + + + + + diff --git a/pages_promotion/bargain/my_bargain.vue b/pages_promotion/bargain/my_bargain.vue new file mode 100644 index 0000000..8f274bf --- /dev/null +++ b/pages_promotion/bargain/my_bargain.vue @@ -0,0 +1,438 @@ + ++ ++ ++ + + ++ ++ ++ ++ + ++ {{ goodsTag(item) }} ++ ++ + +{{ item.goods_name }} +已有{{ item.join_num }}人参与 ++ + ++ + ++ + ++ + ++ 已砍 + +{{ (item.price - item.curr_price).toFixed(2) }} + , ++ 还剩 + +{{ $lang('common.currencySymbol') }}{{ (item.curr_price - item.floor_price).toFixed(2) }} ++ 免费拿 + ++ ++ 后结束 ++ + ++ ++ ++ ++ {{ goodsTag(item) }} ++ ++ +{{ item.sku_name }} +已有{{ item.join_num }}人参与 ++ + ++ + ++ + +已砍{{ item.sale_num }}件 + ++ 免费拿 + ++ +底价: +{{ $lang('common.currencySymbol') }} ++ {{ + parseFloat(item.floor_price) + .toFixed(2) + .split('.')[0] + }} + ++ .{{ + parseFloat(item.floor_price) + .toFixed(2) + .split('.')[1] + }} + +{{ $lang('common.currencySymbol') }}{{ item.price }} ++ + + + + + + + + + + diff --git a/pages_promotion/bargain/payment.vue b/pages_promotion/bargain/payment.vue new file mode 100644 index 0000000..e4316fe --- /dev/null +++ b/pages_promotion/bargain/payment.vue @@ -0,0 +1,48 @@ + ++ ++ +{{ item.name }} ++ + ++ ++ ++ + ++ +发起砍价 {{ $util.timeStampTurnTime(item.start_time) }} +{{ bargainState[item.status].text }} ++ ++ ++ + +{{ item.sku_name }} +已砍至{{ item.curr_price }}元 ++ +{{ $lang('common.currencySymbol') }}{{ item.price }} ++ ++ 后结束 ++ ++ + ++ + ++ + + + + ++ + + + + + + + + + diff --git a/pages_promotion/bargain/public/css/detail.scss b/pages_promotion/bargain/public/css/detail.scss new file mode 100644 index 0000000..fa22ce9 --- /dev/null +++ b/pages_promotion/bargain/public/css/detail.scss @@ -0,0 +1,945 @@ +.bargain { + background-size: cover; + background-repeat: repeat-y; + padding-bottom: 100rpx; + background: var(--bargain-promotion-color); + .bargain_top { + height: 360rpx; + background-size: 100% auto; + background-repeat: no-repeat; + display: flex; + color: #fff; + justify-content: center; + position: relative; + line-height: 1; + view { + color: #fff; + line-height: 50rpx; + height: 50rpx; + display: flex; + align-items: center; + font-size: 24rpx; + margin: 26rpx 2rpx; + } + } + + .bargin_content { + background-color: #fff; + border-radius: 20rpx; + margin: 24rpx; + padding-bottom: 60rpx; + padding-top: 30rpx; + margin-top: 0; + .uer_info_base { + display: flex; + position: relative; + padding: 0 0; + flex-direction: column; + align-items: center; + justify-content: center; + margin-bottom: 20rpx; + + .user_info_img { + background-color: #fff; + width: 120rpx; + height: 120rpx; + margin-top: -80rpx; + margin-left: 0; + border-radius: 50%; + border: 2px solid #fff; + overflow: hidden; + + image { + width: 100%; + height: 100%; + } + } + + .user_info_name { + margin-left: 0; + color: $color-tip; + align-self: center; + } + + .rule_detail { + position: absolute; + height: 34rpx; + line-height: 34rpx; + padding: 0 12rpx; + line-height: 34rpx; + font-size: 18rpx; + border: 1px solid; + right: 24rpx; + top: 30rpx; + border-radius: 34rpx; + } + } + + .bargin_propaganda { + display: flex; + justify-content: space-between; + margin: 0 27rpx 30rpx; + font-size: 34rpx; + color: #333333; + font-weight: bold; + + .marks { + font-size: 60rpx; + line-height: 1; + color: #b0b0b0; + } + } + + .goods { + display: flex; + margin-top: 0; + margin-left: 24rpx; + margin-right: 24rpx; + padding: 24rpx; + background-color: #fafafa; + border-radius: 10rpx; + overflow: hidden; + + .goods_img { + min-width: 180rpx; + width: 230rpx; + height: 230rpx; + margin-right: 20rpx; + border-radius: 10rpx; + + image { + width: 100%; + height: 100%; + } + } + + .goods_content { + flex: 1; + overflow: hidden; + + .goods_title { + line-height: 1.3; + font-size: 30rpx; + margin-bottom: 10rpx; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + display: -moz-box; + -moz-line-clamp: 2; + -moz-box-orient: vertical; + word-wrap: break-word; + word-break: break-all; + white-space: normal; + height: 78rpx; + } + + .goods_price { + display: flex; + + > view { + color: #666666; + font-size: 22rpx; + + .original_price { + margin-left: 3rpx; + } + + .bottom_price { + color: var(--price-color); + margin-left: 3rpx; + } + &:first-child { + margin-right: 10rpx; + } + } + } + + .partake_num { + font-size: 22rpx; + color: #666666; + margin-top: 4rpx; + .residue-num { + margin-left: 10rpx; + } + + .ident { + color: #fe0b42; + } + } + .count-down { + color: #666666; + margin-top: 6rpx; + text { + margin-left: 16rpx; + } + } + &.launch { + .goods_price { + flex-direction: column; + .original_price { + text-decoration: unset; + color: var(--price-color); + } + } + } + } + } + + .progress_info { + display: flex; + justify-content: space-between; + margin: 40rpx 24rpx 0; + + > view { + font-size: $font-size-tag; + color: #666666; + + text { + color: var(--price-color); + } + } + } + + .progress { + position: relative; + margin: 40rpx 35rpx 0; + height: 20rpx; + + background-color: #fff4f4; + border-radius: 30rpx; + .progress_item { + width: 5%; + position: absolute; + left: 0; + border-radius: 30rpx; + height: 20rpx; + background: linear-gradient(to left, var(--bargain-promotion-color), var(--bargain-promotion-aux-color)); + animation: all 1s forwards; + + .iconfont { + position: absolute; + right: -20rpx; + top: -10rpx; + height: 40rpx; + width: 40rpx; + color: #fff; + background-color: var(--bargain-promotion-color); + display: flex; + align-items: center; + justify-content: center; + line-height: 1; + border-radius: 50%; + font-size: 24rpx; + z-index: 1; + } + } + .progress-point { + position: absolute; + background-color: var(--bargain-promotion-color); + height: 26rpx; + width: 26rpx; + border-radius: 50%; + right: -13rpx; + top: -4rpx; + } + } + .info-bottom { + display: flex; + justify-content: space-between; + margin: 10px 12px 0; + align-items: center; + .sale-box { + color: var(--bargain-promotion-color); + } + .price-box { + display: flex; + line-height: 1; + .discount-price { + display: flex; + font-size: 26rpx; + line-height: 1; + margin-top: 4rpx; + .price { + } + } + .delete-price { + display: flex; + font-size: 26rpx; + line-height: 1; + margin-top: 4rpx; + } + .price { + line-height: 1.2; + color: var(--bargain-promotion-color); + } + } + .pro-info { + line-height: 1; + display: flex; + align-items: center; + .button-border { + border: 2rpx solid var(--bargain-promotion-color); + color: var(--bargain-promotion-color); + font-size: 24rpx; + padding: 4rpx 6rpx; + line-height: 1; + border-radius: 4rpx; + background-color: #fff4f4; + position: relative; + border-top-right-radius: 0; + } + .button-border::before { + content: ''; + display: block; + position: absolute; + top: -10rpx; + right: -2rpx; + border-left: 10rpx solid transparent; + border-right: 0 solid transparent; + border-bottom: 10rpx solid var(--bargain-promotion-color); + } + .button-border::after { + content: ''; + display: block; + position: absolute; + top: -6rpx; + right: 0rpx; + border-left: 10rpx solid transparent; + border-right: 0 solid transparent; + + border-bottom: 10rpx solid #fff4f4; + } + } + } + + .bragain_recode { + display: flex; + align-items: center; + justify-content: space-between; + margin: 58rpx 24rpx 20rpx; + + .bragain_recode_list { + display: flex; + margin: 0 26rpx; + + .bragain_recode_add { + margin-left: 44rpx; + } + + image { + width: 84rpx; + height: 84rpx; + border: 4rpx solid #fe0b42; + border-radius: 50%; + margin-left: -22rpx; + + &:first-child { + margin-left: 0; + } + } + } + + .bragain_recode_more { + width: 84rpx; + height: 84rpx; + line-height: 84rpx; + text-align: center; + font-size: 12rpx; + color: #999999; + } + + .bragain_recode_add { + width: 84rpx; + height: 84rpx; + line-height: 76rpx; + text-align: center; + border-radius: 50%; + border: 1px dashed #e6e6e6; + font-size: 60rpx; + color: #e6e6e6; + } + } + + .bragain_recode_detail { + font-size: 24rpx; + color: #000; + margin: 0 34rpx 0; + + .iconfont { + font-size: 24rpx; + color: #333333; + } + } + + .invitation_peo { + margin-top: 40rpx; + margin: 28rpx 30rpx 0; + .bargain-success { + display: flex; + align-items: center; + justify-content: center; + font-size: $font-size-tag; + margin: 40rpx 0 0; + .iconfont { + margin-right: 8rpx; + color: rgb(250, 26, 26); + } + > view { + text-align: center; + } + } + .launch-success { + text-align: center; + font-size: $font-size-tag; + } + .tip { + text-align: center; + color: #fe0b42; + font-size: $font-size-goods-tag; + } + + .flex-box { + display: flex; + margin-top: 20rpx; + button { + flex: 1; + + &:nth-child(2) { + margin-left: 20rpx; + } + } + &.success { + flex-direction: column; + .btn { + margin: 0 !important; + } + .btn-vice { + background-color: #fff; + border: 2rpx solid var(--bargain-promotion-color); + color: var(--bargain-promotion-color); + margin: 0 !important; + margin-top: 20rpx !important; + } + } + } + + .btn { + height: 80rpx; + line-height: 80rpx; + background: var(--bargain-promotion-color); + border-radius: $border-radius; + text-align: center; + font-size: 30rpx; + color: #fff; + font-weight: bold; + margin: 20rpx 0; + } + + .btn-vice { + height: 80rpx; + line-height: 80rpx; + background: var(--bargain-promotion-aux-color); + border-radius: $border-radius; + text-align: center; + font-size: 30rpx; + color: #fff; + font-weight: bold; + margin: 20rpx 0; + color: #fff; + } + } + } + + .bargin_introduction { + margin: 24rpx; + background-color: #fff; + border-radius: 20rpx; + .record-empty { + text-align: center; + font-size: $font-size-tag; + color: #999; + padding: 100rpx 0; + background-color: #fff; + border-radius: 20rpx; + } + + .bargin_introduction_title { + display: flex; + align-items: center; + justify-content: center; + font-size: 34rpx; + color: #222222; + font-weight: 500; + padding: 36rpx 0 0; + font-weight: bold; + + &::before { + content: ''; + background-color: #222222; + width: 20rpx; + height: 5rpx; + display: block; + margin-right: 10rpx; + } + &::after { + content: ''; + background-color: #222222; + width: 20rpx; + height: 5rpx; + display: block; + margin-left: 10rpx; + } + } + .detail-content { + padding: 20rpx; + overflow: hidden; + * { + max-width: 100%; + } + img { + width: 100%; + } + } + .flow { + display: flex; + background-color: #fff; + border-radius: 20rpx; + padding: 40rpx 0; + + .flow_item { + position: relative; + flex: 1; + text-align: center; + + image { + width: 88rpx; + height: 88rpx; + margin-bottom: 20rpx; + } + + > view { + color: #333333; + font-size: 24rpx; + } + + &::after { + position: absolute; + content: ''; + height: 2rpx; + width: 100rpx; + background-color: #fd0742; + top: 44rpx; + right: -22%; + } + + &:last-child::after { + width: 0; + } + } + } + + .bargin_invitation { + background-color: #fff; + border-radius: 20rpx; + padding: 27rpx; + + .item { + display: flex; + align-items: center; + padding: 20rpx 0; + border-bottom: 2rpx solid rgba(237, 237, 237, 0.5); + &:last-child { + border-bottom: 0; + } + .item_left { + flex: 1; + display: flex; + overflow: hidden; + align-items: center; + image { + height: 70rpx; + width: 70rpx; + border: 2rpx solid #979797; + border-radius: 50%; + margin-right: 20rpx; + } + + > view { + overflow: hidden; + align-items: center; + display: flex; + + color: #6d7278; + white-space: nowrap; + /* 不换行 */ + overflow: hidden; + text-overflow: ellipsis; + + .tip { + font-size: 20rpx; + color: #666666; + } + } + .bargin_info { + display: flex; + flex-direction: column; + justify-content: left; + align-items: flex-start; + > view:last-child { + color: #999999; + font-size: $font-size-tag; + } + } + } + + .item_right { + min-width: 100rpx; + color: var(--bargain-promotion-color); + font-size: $font-size-base; + font-weight: bold; + display: flex; + align-items: center; + text { + font-size: $font-size-base; + color: var(--bargain-promotion-color); + font-weight: bold; + } + .bargain-icon { + width: 44rpx; + height: 44rpx; + margin-right: 14rpx; + } + } + } + + .item_more { + margin-top: 20rpx; + text-align: center; + font-size: $font-size-tag; + color: #999999; + } + } + .bargain-list { + padding: 40rpx 0; + margin: 0 24rpx; + swiper { + height: 360rpx; + &.swiper-1 { + height: 120rpx; + } + &.swiper-2 { + height: 240rpx; + } + } + .bargain-item { + background-color: #f2f2f2; + display: flex; + align-items: center; + justify-content: space-between; + padding: 16rpx 24rpx; + > view:first-child { + display: flex; + align-items: center; + } + .bargain-head { + width: 60rpx; + height: 60rpx; + margin-right: 20rpx; + border: 2rpx solid #979797; + border-radius: 50%; + overflow: hidden; + image { + width: 100%; + height: 100%; + } + } + .bargain-info { + .bargain-title { + font-size: 24rpx; + color: #333333; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + width: 260rpx; + } + .bargain-desc { + font-size: 22rpx; + color: #6d7278; + } + } + .bargain-price { + text { + color: var(--bargain-promotion-color); + margin-left: 4rpx; + } + } + } + } + } +} + +.bargain-popup { + width: 70vw; + background-color: #fff; + position: relative; + box-sizing: border-box; + border-radius: 20rpx; + height: 650rpx; + .head { + width: 55%; + position: absolute; + left: 50%; + top: 0; + transform: translate(-50%, -70%); + } + + .title { + text-align: center; + font-size: 38rpx; + margin-top: 40rpx; + } + + .money { + text-align: center; + + .num { + font-size: 36rpx; + font-weight: 600; + } + + .unit { + font-size: 24rpx; + margin-left: 8rpx; + } + } + &.self { + .head { + position: unset; + transform: unset; + top: 0; + left: 0; + width: 100%; + max-height: 350rpx; + } + .bargain-content { + text-align: center; + padding: 60rpx 40rpx; + .money { + font-weight: bold; + } + } + .bargain-btn { + width: max-content; + margin: 0 auto; + font-weight: bold; + padding: 0 60rpx; + background-color: var(--bargain-promotion-color); + color: #ffffff; + } + } + &.help { + .bargain-content { + .uer_info_base { + display: flex; + position: relative; + padding: 0 0; + flex-direction: column; + align-items: center; + justify-content: center; + margin-bottom: 20rpx; + + .user_info_img { + background-color: #fff; + width: 120rpx; + height: 120rpx; + margin-top: -240rpx; + margin-left: 0; + border-radius: 50%; + border: 2px solid var(--bargain-promotion-color); + overflow: hidden; + image { + width: 100%; + height: 100%; + } + } + .user_info_name { + margin-left: 0; + align-self: center; + font-size: 30rpx; + font-weight: bold; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + width: 100%; + } + } + .count-down { + > text { + color: #666; + margin: 0 6rpx; + } + } + } + } +} + +.icon-round-close { + display: block; + font-size: 60rpx; + color: #ffffff; + text-align: center; +} + +.share-popup, +.uni-popup__wrapper-box { + .share-title { + line-height: 60rpx; + font-size: $font-size-toolbar; + padding: 15rpx 0; + text-align: center; + } + + .share-content { + display: flex; + display: -webkit-flex; + -webkit-flex-wrap: wrap; + -moz-flex-wrap: wrap; + -ms-flex-wrap: wrap; + -o-flex-wrap: wrap; + flex-wrap: wrap; + padding: 15rpx; + + .share-box { + flex: 1; + text-align: center; + + .share-btn { + margin: 0; + padding: 0; + border: none; + line-height: 1; + height: auto; + + text { + margin-top: 20rpx; + font-size: $font-size-tag; + display: block; + color: $color-title; + } + } + + .iconfont { + font-size: 80rpx; + line-height: initial; + } + + .icon-fuzhilianjie, + .icon-pengyouquan, + .icon-haowuquan, + .icon-share-friend { + color: #07c160; + } + } + } + + .share-footer { + height: 90rpx; + line-height: 90rpx; + border-top: 2rpx #f5f5f5 solid; + text-align: center; + color: #666; + } +} + +.poster-layer { + .generate-poster { + padding: 40rpx 0; + .iconfont { + font-size: 80rpx; + color: #07c160; + line-height: initial; + } + > view { + text-align: center; + &:last-child { + margin-top: 20rpx; + } + } + } + .image-wrap { + width: 64%; + height: 854rpx; + margin: 60rpx auto 40rpx auto; + box-shadow: 0 0 32rpx rgba(100, 100, 100, 0.3); + image { + width: 480rpx; + height: 854rpx; + } + } + .msg { + padding: 40rpx; + } + .save { + text-align: center; + height: 80rpx; + line-height: 80rpx; + } + .close { + position: absolute; + top: 0; + right: 20rpx; + width: 40rpx; + height: 80rpx; + font-size: 50rpx; + } +} +.goods-details img { + max-width: 100%; +} + +//悬浮按钮 +.fixed-box { + position: fixed; + right: 20rpx; + bottom: 300rpx; + z-index: 10; + background: #fff; + box-shadow: 2rpx 2rpx 22rpx rgba(0, 0, 0, 0.3); + border-radius: 120rpx; + padding: 20rpx 0; + display: flex; + justify-content: center; + flex-direction: column; + width: 120rpx; + box-sizing: border-box; + transition: 0.3s; + overflow: hidden; + .btn-item { + display: flex; + justify-content: center; + text-align: center; + flex-direction: column; + line-height: 1; + margin: 14rpx 0; + transition: 0.1s; + text { + font-size: 44rpx; + font-weight: bold; + } + view { + font-size: 26rpx; + font-weight: bold; + } + &.show { + transform: rotate(180deg); + } + &.switch { + } + &.icon-xiala { + margin: 0; + margin-top: 0.1rpx; + } + } +} diff --git a/pages_promotion/bargain/public/css/list.scss b/pages_promotion/bargain/public/css/list.scss new file mode 100644 index 0000000..fc6b161 --- /dev/null +++ b/pages_promotion/bargain/public/css/list.scss @@ -0,0 +1,251 @@ +.page{ + width: 100%; + min-height: 100vh; + background: var(--bargain-promotion-color); +} +.ns-adv { + margin: 0; + border-radius: $border-radius; + overflow: hidden; + line-height: 1; + image { + width: 100%; + } +} + +.lineheight-clear { + line-height: 1!important; +} +// 商品列表单列样式 +.goods-list.single-column { + + .goods-item { + padding: 26rpx 26rpx 20rpx; + background: #fff; + margin: $margin-updown $margin-both; + border-radius: 24rpx; + display: flex; + position: relative; + flex-direction: column; + .goods-item-content{ + display: flex; + } + + .goods-item-bottom{ + display: flex; + justify-content: space-between; + margin-top: 10rpx; + line-height: 1; + .item-bottom-left{ + display: flex; + align-items: baseline; + margin-top: 10rpx; + .delete-pirce{ + text-decoration: line-through; + color: $color-sub; + margin-left: 20rpx; + } + .txt{ + margin-left: 10rpx; + font-weight: 26rpx; + } + .unit,.price{ + color: var(--bargain-promotion-color)!important; + } + } + .item-bottom-right{ + display: flex; + align-items: center; + font-weight: bold; + button{ + color: #fff; + background-color: var(--bargain-promotion-color); + } + } + } + + .goods-img { + width: 200rpx; + height: 200rpx; + overflow: hidden; + border-radius: $border-radius; + margin-right: 20rpx; + + image { + width: 100%; + height: 100%; + } + } + + .goods-tag{ + color: #fff; + line-height: 1; + padding: 8rpx 12rpx; + position: absolute; + border-top-left-radius: $border-radius; + border-bottom-right-radius: $border-radius; + top: 26rpx; + left: 26rpx; + font-size: $font-size-goods-tag; + } + + .info-wrap { + flex: 1; + display: flex; + flex-direction: column; + width: calc(100% - 220rpx); + .info-sub-title{ + color: $color-tip; + font-size: $font-size-tag; + margin-top: 6rpx; + } + } + .info-bottom{ + display: flex; + justify-content: space-between; + margin-top: 10rpx; + align-items: center; + .sale-box{ + color: var(--bargain-promotion-color); + } + .price-box{ + display: flex; + line-height: 1; + .discount-price{ + display: flex; + font-size: 26rpx; + line-height: 1; + margin-top: 4rpx; + } + .delete-price { + display: flex; + font-size: 26rpx; + line-height: 1; + margin-top: 4rpx; + } + .price{ + line-height: 1.2; + color: var(--bargain-promotion-color); + } + } + .pro-info{ + line-height: 1; + display: flex; + align-items: center; + .button-border{ + border: 2rpx solid var(--bargain-promotion-color); + color: var(--bargain-promotion-color); + font-size: 24rpx; + padding: 4rpx 6rpx; + line-height: 1; + border-radius: 4rpx; + background-color: var(--bargain-promotion-color-shallow); + position: relative; + border-top-right-radius: 0; + } + .button-border::before{ + content: ''; + display: block; + position: absolute; + top: -10rpx; + right: -2rpx; + border-left: 10rpx solid transparent ; + border-right: 0 solid transparent; + border-bottom: 10rpx solid var(--bargain-promotion-color); + } + .button-border::after{ + content: ''; + display: block; + position: absolute; + top: -6rpx; + right: 0rpx; + border-left: 10rpx solid transparent; + border-right: 0 solid transparent; + + border-bottom: 10rpx solid var(--bargain-promotion-color-shallow); + } + + } + } + + .name-wrap { + flex: 1; + } + + .goods-name { + font-size: $font-size-base; + line-height: 1.4; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + font-weight: bold; + word-wrap: break-word; + height: 80rpx; + } + + .progress-wrap { + display: flex; + position: relative; + width: calc(100% - 32rpx); + margin: 10rpx auto; + progress { + flex: 1; + } + .progress-point{ + background: var(--bargain-promotion-color); + width: 24rpx; + height: 24rpx; + border-radius: 50%; + position: absolute; + right: -12rpx; + top: -4rpx; + z-index: 1; + } + .progress-select{ + background-color: var(--bargain-promotion-color); + color: var(--bargain-promotion-aux-color); + width: 24rpx; + height: 24rpx; + border-radius: 50%; + position: absolute; + left: 0; + top: -4rpx; + font-size: 24rpx; + z-index: 11; + + &.icon{ + width: 34rpx; + height: 34rpx; + display: flex; + align-items: center; + justify-content: center; + top: -10rpx; + } + .iconfont{ + background-color: unset; + color: #fff; + font-size: 20rpx; + } + } + + .txt { + margin: 0 100rpx 0 20rpx; + } + } + + + .member-price-tag { + display: inline-block; + width: 60rpx; + line-height: 1; + margin-left: 6rpx; + + image { + width: 100%; + } + } + } + +} \ No newline at end of file diff --git a/pages_promotion/bargain/public/js/detail.js b/pages_promotion/bargain/public/js/detail.js new file mode 100644 index 0000000..b2263b7 --- /dev/null +++ b/pages_promotion/bargain/public/js/detail.js @@ -0,0 +1,508 @@ +import htmlParser from '@/common/js/html-parser'; +export default { + data() { + return { + windowHeight: 0, + launch_id: 0, + bargain_id: 0, + info: { + headimg: '' + }, + bargainRecord: [], + page: 1, + totalPage: 1, + load: false, + timeMachine: null, + memberId: 0, + bargainMoney: '0.00', + token: null, + poster: '-1', //海报 + posterMsg: '', //海报错误信息 + posterHeight: 0, + goodsDetail: null, + launchInfo: null, + maxBuy: 1, + launchList: null, + fixBtnShow: false, + showMore: false, + isOwn: 0, //是否自己砍了一刀 + my_bargain_money: 0, + shareImg: '' + }; + }, + onLoad(data) { + this.getHeight(); + if (data.l_id) this.launch_id = data.l_id; + if (data.b_id) this.bargain_id = data.b_id; + if (data.is_own) this.isOwn = data.is_own; + + if (data.scene) { + var sceneParams = decodeURIComponent(data.scene); + sceneParams = sceneParams.split('&'); + if (sceneParams.length) { + sceneParams.forEach(item => { + if (item.indexOf('m') != -1) uni.setStorageSync('source_member', item.split('-')[1]); + if (item.indexOf('l_id') != -1) this.id = item.split('-')[1]; + if (item.indexOf('b_id') != -1) this.bargain_id = item.split('-')[1]; + if (item.indexOf('is_own') != -1) this.isOwn = item.split('-')[1]; + }); + } + } + // #ifdef MP-WEIXIN + this.getShareImg(); + // #endif + }, + computed: { + progress() { + if (this.launchInfo && this.goodsDetail) { + let total = this.goodsDetail.price - this.launchInfo.floor_price, + progress = parseInt(((this.goodsDetail.price - this.launchInfo.curr_price) / total) * 100); + + return isNaN(progress) ? 0 : progress; + } else { + return 0; + } + }, + showNum() { + if (this.launchList && this.launchList.length < 3) { + return this.launchList.length; + } else { + return 3; + } + } + }, + onShow() { + this.getBargainInfo(); + if (uni.getStorageSync('token')) { + this.$util.getMemberId().then(resolve => { + this.memberId = resolve; + this.token = uni.getStorageSync('token'); + if (this.goodsDetail && this.goodsDetail.launch_id) this.setPublicShare(); + }); + } + + setTimeout(() => { + if (this.addonIsExist && !this.addonIsExist.bargain) { + this.$util.showToast({ + title: '商家未开启砍价', + mask: true, + duration: 2000 + }); + setTimeout(() => { + this.$util.redirectTo('/pages/index/index'); + }, 2000); + return; + } + }, 1000); + }, + onReady() {}, + methods: { + timeUp(){ + this.getBargainInfo(); + }, + getHeight() { + var self = this; + uni.getSystemInfo({ + success: function(res) { + self.windowHeight = res.windowHeight - 44; + if (self.iphoneX) { + self.windowHeight = self.windowHeight - 33; + } + } + }); + }, + getBargainInfo() { + if (this.load) return; + this.load = true; + this.$api.sendRequest({ + url: '/bargain/api/bargain/detail', + data: { + launch_id: this.launch_id, + bargain_id: this.bargain_id + }, + success: res => { + if (res.code == 0) { + this.goodsDetail = res.data.goods_sku_detail; + if (this.goodsDetail.sku_spec_format) this.goodsDetail.sku_spec_format = JSON.parse( + this.goodsDetail.sku_spec_format); + + this.$langConfig.title(this.goodsDetail.sku_name); + + // 商品SKU格式 + if (this.goodsDetail.goods_spec_format) this.goodsDetail.goods_spec_format = JSON + .parse(this.goodsDetail.goods_spec_format); + + if (this.goodsDetail.goods_content) this.goodsDetail.goods_content = htmlParser(this + .goodsDetail.goods_content); + + if (res.data.launch_info && Object.keys(res.data.launch_info).length > 0) { + this.launchInfo = res.data.launch_info; + if (this.launchInfo.status == 0) { + this.timeMachine = this.$util.countDown(this.launchInfo.end_time - res + .timestamp); + } + this.launch_id = this.launchInfo.launch_id; + } + if (res.data.launch_list && Object.keys(res.data.launch_list).length > 0) { + this.launchList = res.data.launch_list; + } + + //发起拼团后自砍一刀展示 + if (this.isOwn && this.goodsDetail.is_own > 0 && this.launchInfo && this.launchInfo + .self && this.launchInfo.my_bargain_money) { + this.my_bargain_money = this.launchInfo.my_bargain_money; + this.$refs.uniSelfBargainPopup.open(); + } + + //好友进来后帮砍弹出 + if (this.launchInfo && !this.launchInfo.self && !this.launchInfo.cut && this + .goodsDetail.bargain_status == 1) this.$refs.uniHelpPopup.open(); + + this.load = false; + this.getBargainRecord(1); + this.setPublicShare(); + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + } else { + this.load = false; + this.$util.redirectTo('/pages_promotion/bargain/my_bargain'); + } + }, + fail: res => { + this.load = false; + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + } + }); + }, + getBargainRecord(page) { + if (this.load) return; + + if (!this.launchInfo) return; + + this.load = true; + + this.$api.sendRequest({ + url: '/bargain/api/bargain/record', + data: { + page: page, + id: this.launchInfo.launch_id + }, + success: res => { + this.load = false; + this.totalPage = res.data.page_count; + this.page = page; + if (res.code == 0 && res.data.list.length) { + if (page == 1) { + this.bargainRecord = res.data.list; + } else { + this.bargainRecord = this.bargainRecord.concat(res.data.list); + } + } + this.showMore = false; + if (page < this.totalPage) { + this.showMore = true; + } + } + }); + }, + scrolltolower() { + let next = this.page + 1; + if (!this.load && next <= this.totalPage) { + this.getBargainRecord(next); + } + }, + browse() { + this.$api.sendRequest({ + url: '/bargain/api/bargain/browse', + data: { + bargain_id: this.goodsDetail.bargain_id + }, + success: res => {} + }); + }, + share() { + this.$api.sendRequest({ + url: '/bargain/api/bargain/share', + data: { + bargain_id: this.goodsDetail.bargain_id + }, + success: res => {} + }); + }, + /** + * 刷新商品详情数据 + * @param {Object} goodsSkuDetail + */ + refreshGoodsSkuDetail(goodsSkuDetail) { + Object.assign(this.goodsDetail, goodsSkuDetail); + }, + + // 发起砍价 + createBargain() { + if (!uni.getStorageSync('token')) { + this.$refs.login.open('/pages_promotion/bargain/detail?l_id=' + this.launch_id + '&b_id=' + this + .bargain_id); + return; + } + + // #ifdef MP-WEIXIN + this.$util.subscribeMessage('BARGAIN_COMPLETE'); + // #endif + + if (this.goodsDetail.sku_spec_format) { + this.$refs.goodsSku.show('bargain', () => {}); + } else { + this.$api.sendRequest({ + url: '/bargain/api/bargain/launch', + data: { + id: this.goodsDetail.id + }, + success: res => { + if (res.code == 0) { + let params = { + l_id: res.data, + b_id: this.bargain_id + }; + if (this.goodsDetail.is_own) params.is_own = 1; + + this.$util.redirectTo('/pages_promotion/bargain/detail', params, 'redirectTo'); + } else { + this.$util.showToast({ + title: res.message + }); + } + } + }); + } + }, + /** + * 立即购买 + */ + buyNow() { + uni.setStorage({ + key: 'bargainOrderCreateData', + data: { + launch_id: this.launchInfo.launch_id + }, + success: () => { + this.$util.redirectTo('/pages_promotion/bargain/payment'); + } + }); + }, + /** + * 帮好友砍价 + */ + bargain() { + if (uni.getStorageSync('token')) { + this.$api.sendRequest({ + url: '/bargain/api/bargain/bargain', + data: { + id: this.launchInfo.launch_id + }, + success: res => { + if (res.code == 0) { + this.bargainMoney = parseFloat(res.data.bargain_money).toFixed(2); + this.$refs.uniHelpPopup.close(); + this.$refs.uniPopup.open(); + this.getBargainInfo(); + } else { + this.$util.showToast({ + title: res.message + }); + } + } + }); + } else { + this.$refs.login.open('/pages_promotion/bargain/detail?l_id=' + this.launch_id + '&b_id=' + this + .bargain_id); + } + }, + closePopup() { + this.$refs.uniPopup.close(); + }, + closeSelfPop() { + this.$refs.uniSelfBargainPopup.close(); + }, + // 打开分享弹出层 + openSharePopup() { + this.$refs.uniSelfBargainPopup.close(); + this.$refs.sharePopup.open(); + this.share(); + }, + // 关闭分享弹出层 + closeSharePopup() { + this.$refs.sharePopup.close(); + }, + copyUrl() { + let text = '嘿!朋友就差你这一刀了,帮一下忙呗~' + this.$config.h5Domain + '/pages_promotion/bargain/detail?l_id=' + this + .launch_id + '&b_id=' + this.bargain_id; + if (this.memberId) text += '&source_member=' + this.memberId; + this.$util.copy(text, () => { + this.closeSharePopup(); + }); + }, + toBargainRecode() { + let view = uni.createSelectorQuery().select('.bargin_introduction'); + view.boundingClientRect(data => { + uni.pageScrollTo({ + duration: 100, + scrollTop: data.top + 100 + }); + }).exec(); + }, + /** + * 设置公众号分享 + */ + setPublicShare() { + let shareUrl = this.$config.h5Domain + '/pages_promotion/bargain/detail?l_id=' + this.launch_id + '&b_id=' + + this.bargain_id; + if (this.memberId) shareUrl += '&source_member=' + this.memberId; + + this.$util.setPublicShare({ + title: this.goodsDetail.sku_name, + desc: '嘿!朋友就差你这一刀了,帮一下忙呗~', + link: shareUrl, + imgUrl: this.goodsDetail.sku_image + }, + res => { + // console.log('公众号分享成功'); + // this.share(); + } + ); + }, + //-------------------------------------海报------------------------------------- + // 打开海报弹出层 + openPosterPopup() { + this.getGoodsPoster(); + this.$refs.sharePopup.close(); + this.$refs.posterPopup.open(); + if (this.poster != '-1') { + setTimeout(() => { + let view = uni + .createSelectorQuery() + .in(this) + .select('.poster-layer .image-wrap'); + view.fields({ + size: true + }, + data => { + let posterWhith = data.width; + let ratio = parseFloat((740 / posterWhith).toFixed(2)); + if (this.token != '') { + this.posterHeight = parseInt(1240 / ratio); + } else { + this.posterHeight = parseInt(1100 / ratio); + } + } + ).exec(); + }, 100); + } + }, + // 关闭海报弹出层 + closePosterPopup() { + this.$refs.posterPopup.close(); + }, + /** + * 获取海报 + */ + getGoodsPoster() { + uni.showLoading({ + title: '海报生成中...' + }); + //活动海报信息 + let posterParams = { + l_id: this.launch_id, + b_id: this.bargain_id, + bargain_id: this.goodsDetail.bargain_id + }; + + if (this.memberId) posterParams.source_member = this.memberId; + + this.$api.sendRequest({ + url: '/bargain/api/goods/poster', + data: { + page: '/pages_promotion/bargain/detail', + qrcode_param: JSON.stringify(posterParams) + }, + success: res => { + if (res.code == 0) { + this.poster = res.data.path + '?time=' + new Date().getTime(); + } else { + this.posterMsg = res.message; + } + uni.hideLoading(); + }, + fail: err => { + uni.hideLoading(); + } + }); + }, + getNewArray(array, subGroupLength) { + if (array) { + let index = 0; + let newArray = []; + while (index < array.length) { + newArray.push(array.slice(index, (index += subGroupLength))); + } + return newArray; + } + }, + toDetail(goods_id) { + this.$util.redirectTo('/pages/goods/detail', { + goods_id: goods_id + }); + }, + /** + * 获取分享图 + */ + getShareImg() { + let posterParams = { + l_id: this.launch_id, + b_id: this.bargain_id, + bargain_id: this.bargain_id + }; + + this.$api.sendRequest({ + url: '/bargain/api/goods/shareimg', + data: { + page: '/pages_promotion/bargain/launch', + qrcode_param: JSON.stringify(posterParams) + }, + success: res => { + if (res.code == 0) this.shareImg = res.data.path; + } + }); + } + }, + filters: { + /** + * 字符掩饰输出 + * @param {Object} str + */ + cover(str) { + if (typeof str == 'string' && str.length > 0) { + return str.substr(0, 1) + '******' + str.substr(-1); + } else { + return ''; + } + } + }, + /** + * 自定义分享内容 + */ + onShareAppMessage() { + let that = this; + var path = '/pages_promotion/bargain/detail?l_id=' + this.launch_id + '&b_id=' + this.bargain_id; + if (this.memberId) path += '&source_member=' + this.memberId; + that.share(); + return { + title: '嘿!朋友就差你这一刀了,帮一下忙呗~', + imageUrl: this.shareImg ? this.$util.img(this.shareImg) : this.$util.img(this.goodsDetail.sku_image, { + size: 'big' + }), + path: path, + success: res => {}, + fail: res => {}, + complete: res => {} + }; + } +} diff --git a/pages_promotion/blindbox/fill_address.vue b/pages_promotion/blindbox/fill_address.vue new file mode 100644 index 0000000..a98afae --- /dev/null +++ b/pages_promotion/blindbox/fill_address.vue @@ -0,0 +1,319 @@ + ++ + + + + + + + + + diff --git a/pages_promotion/blindbox/goods_list.vue b/pages_promotion/blindbox/goods_list.vue new file mode 100644 index 0000000..1a0bd41 --- /dev/null +++ b/pages_promotion/blindbox/goods_list.vue @@ -0,0 +1,174 @@ + ++ +填写收货信息 ++ + + + + + ++ + + + + + ++ ++ {{ item.title }} + + ++ + + ++ ++ +{{ memberAddress.name ? memberAddress.name : '' }} +{{ memberAddress.mobile ? memberAddress.mobile : '' }} ++ {{ memberAddress.full_address ? memberAddress.full_address : '' }} {{ memberAddress.address ? memberAddress.address : '' }} + ++ + +请设置收货地址 ++ + + + + ++ ++ ++ ++ 由 + +{{ storeInfo.currStore.store_name }} + 提供配送 ++ +点击切换 ++ + ++ 您的附近没有可配送的门店,请选择其他配送方式 + ++ +{{ localMemberAddress.name ? localMemberAddress.name : '' }} +{{ localMemberAddress.mobile ? localMemberAddress.mobile : '' }} ++ {{ localMemberAddress.full_address ? localMemberAddress.full_address : '' }} + {{ localMemberAddress.address ? localMemberAddress.address : '' }} + ++ + ++ +送达时间 ++ ++ {{ orderCreateData.buyer_ask_delivery_title ? orderCreateData.buyer_ask_delivery_title : '请选择送达时间' }} + ++ + + +请设置收货地址 ++ + + + + ++ ++ ++ ++ ++ +{{ storeInfo.currStore.store_name }} ++ +营业时间:{{ storeInfo.currStore.open_date }} +{{ storeInfo.currStore.full_address }} {{ storeInfo.currStore.address }} ++ + ++ +预留手机 + ++ +提货时间 ++ ++ {{ orderCreateData.buyer_ask_delivery_title ? orderCreateData.buyer_ask_delivery_title : '请选择提货时间' }} + ++ 当前无自提门店,请选择其它配送方式 ++ + + + + ++ + ++ ++ ++ ++ + ++ +{{ goodsItem.sku_name }} ++ ++ ++ +{{ x.spec_value_name }} ++ ++ ++ 该商品不支持{{ orderCreateData.delivery.delivery_type_name }} ++ ++ +{{ $lang('common.currencySymbol') }} + ++ {{ + parseFloat(goodsItem.price) + .toFixed(2) + .split('.')[0] + }} + ++ .{{ + parseFloat(goodsItem.price) + .toFixed(2) + .split('.')[1] + }} + ++ +x +{{ goodsItem.num }} ++ ++ + + + + + + + + ++ ++ +买家留言 ++ + ++ ++ ++ + ++ +确定 ++ + ++ ++ +已为您甄选出附近所有相关门店 ++ + ++ ++ ++ ++ +{{ item.store_name }} +({{ item.distance }}km) ++ ++ 营业时间:{{ item.open_date }} + ++ 地址:{{ item.full_address }}{{ item.address }} + ++ 所选择收货地址附近没有可以自提的门店 ++ + + + + + + + + diff --git a/pages_promotion/blindbox/index.vue b/pages_promotion/blindbox/index.vue new file mode 100644 index 0000000..78032f7 --- /dev/null +++ b/pages_promotion/blindbox/index.vue @@ -0,0 +1,1012 @@ + ++ ++ ++ ++ ++ ++ + ++ +{{ item.goods_name }} ++ ++ ¥ + +{{ item.price }} ++ + + + + + + + + + + diff --git a/pages_promotion/blindbox/list.vue b/pages_promotion/blindbox/list.vue new file mode 100644 index 0000000..9fd1cbe --- /dev/null +++ b/pages_promotion/blindbox/list.vue @@ -0,0 +1,371 @@ + ++ ++ 商品库存不足,请等待商家补货! ++ ++ + ++ ++ + + +{{ info.blindbox_name }} +¥{{ info.price }} ++ 新人价: + +¥ +{{ parseFloat(info.new_price).toFixed(2).split(".")[0] }} +.{{ parseFloat(info.new_price).toFixed(2).split(".")[1] }} +活动规则 ++ + + ++ ++ ++ ++ ++ ++ + + 换一组 +拆盲盒 ++ ++ ++ ++ ++ 查看全部 +我的奖品 ++ ++ ++ ++ 活动规则 ++ ++ ++ ++ 1. 活动时间 +开始时间:{{ $util.timeStampTurnTime(info.start_time) }} +结束时间:{{ $util.timeStampTurnTime(info.end_time) }} ++ ++ 2. 活动说明 +{{ info.remark }} ++ + + ++ ++ ++ ++ ++ ++ {{ boxDetail.sku_name }} ++ +¥ + {{ parseFloat(boxDetail.price).toFixed(2).split(".")[0] }} +.{{ parseFloat(boxDetail.price).toFixed(2).split(".")[1] }} ++ ++ 已为您存放至盒柜 + ++ 前往我的奖品> + ++ +填写收货信息 +再来一次 ++ + ++ + + + + + + + + + + diff --git a/pages_promotion/blindbox/my_box.vue b/pages_promotion/blindbox/my_box.vue new file mode 100644 index 0000000..87f879a --- /dev/null +++ b/pages_promotion/blindbox/my_box.vue @@ -0,0 +1,324 @@ + ++ ++ ++ + ++ ++ +全部 ++ ++ ++ ++ {{ item.category_name }} + ++ + ++ ++ ++ + + ++ +{{ items.blindbox_name }} ++ ++ ¥ + +{{ parseFloat(items.price).toFixed(2).split(".")[0] }} + .{{ parseFloat(items.price).toFixed(2).split(".")[1] }} +已经到底了 ++ + + + + + + + + diff --git a/pages_promotion/blindbox/my_prize.vue b/pages_promotion/blindbox/my_prize.vue new file mode 100644 index 0000000..512a5ce --- /dev/null +++ b/pages_promotion/blindbox/my_prize.vue @@ -0,0 +1,479 @@ + ++ ++ +{{ item.name }} ++ ++ ++ ++ ++ ++ ++ + + +{{ items.blindbox_name }} +进行中 + +已结束 ++ ++ + 盲盒次数: + ++ 可拆{{ items.blindbox_count }}次,剩余 + +{{ items.blindbox_inventory }} + 次 ++ ++ + 我的次数: + ++ 已拆 + +{{ items.buy_num }} + 次 ++ +结束时间:{{ $util.timeStampTurnTime(items.end_time) }} ++ 我的奖品 + ++ + + + + + + + + + + + diff --git a/pages_promotion/blindbox/public/js/payment.js b/pages_promotion/blindbox/public/js/payment.js new file mode 100644 index 0000000..23956e5 --- /dev/null +++ b/pages_promotion/blindbox/public/js/payment.js @@ -0,0 +1,558 @@ +export default { + data() { + return { + isIphoneX: false, + orderCreateData: { + is_balance: 0, + is_point: 1, + buyer_message: '', + + // 发票 + is_invoice: 0, // 是否需要发票 0 无发票 1 有发票 + invoice_type: 1, // 发票类型 1 纸质 2 电子 + invoice_title_type: 1, // 抬头类型 1 个人 2 企业 + is_tax_invoice: 0, // 是否需要增值税专用发票 0 不需要 1 需要 + invoice_title: '', // 发票抬头 + taxpayer_number: '', // 纳税人识别号 + invoice_content: '', // 发票内容 + invoice_full_address: '', // 发票邮寄地址 + invoice_email: '', //发票邮箱 + member_address: { + mobile: '' + }, + is_open_card: 0, + member_card_unit: '' + }, + orderPaymentData: { + shop_goods_list: { + site_name: '', + express_type: [], + coupon_list: [], + invoice: { + invoice_content_array: [] + } + }, + member_account: { + balance: 0, + is_pay_password: 0 + }, + delivery: { + delivery_type: '' + }, + member_address: { + mobile: '' + }, + local_config: { + info: { + start_time: 0, + end_time: 0, + time_week: [] + } + }, + delivery_store_info: { + + } + }, + isSub: false, + tempData: null, + manjian: [], + // 门店信息 + storeInfo: { + storeList: [], //门店列表 + currStore: {} //当前选择门店 + }, + // 自提地址 + member_address: { + mobile: '' + }, + // 当前时间 + timeInfo: { + week: 0, + start_time: 0, + end_time: 0, + showTime: false, + showTimeBar: false + }, + post_free : {}, + canLocalDelicery: true, + deliveryWeek: "", + out_trade_no: null, + menuButtonBounding: {} ,// 小程序胶囊属性 + memberAddress: null, // 会员收货地址 + localMemberAddress: null // 会员本地配送收货地址 + }; + }, + onLoad(){ + if (!this.location) this.$util.getLocation(); + // #ifdef MP + this.menuButtonBounding = uni.getMenuButtonBoundingClientRect(); + // #endif + this.isIphoneX = this.$util.uniappIsIPhoneX(); + + if (uni.getStorageSync('addressBack')) { + uni.removeStorageSync('addressBack'); + } + + // 判断登录 + if (!uni.getStorageSync('token')) { + this.$refs.login.open('/pages_promotion/blindbox/fill_address'); + } else { + this.getOrderPaymentData(); + } + }, + methods: { + // 获取订单初始化数据 + getOrderPaymentData() { + if (this.out_trade_no) return; + + this.orderCreateData = uni.getStorageSync('blindOrderCreateData'); + var pay_flag = uni.getStorageSync("pay_flag"); // 支付中标识,防止返回时,提示,跳转错误 + if (!this.orderCreateData) { + if (pay_flag == 1) { + uni.removeStorageSync("pay_flag"); + } else { + this.$util.showToast({ + title: '未获取到创建订单所需数据!' + }); + setTimeout(() => { + this.$util.redirectTo('/pages/index/index'); + }, 1500); + } + return; + } + + // 获取经纬度 + if (this.location) { + this.orderCreateData.latitude = this.location.latitude; + this.orderCreateData.longitude = this.location.longitude; + } + + this.$api.sendRequest({ + url: '/blindbox/api/order/payment', + data: this.orderCreateData, + success: res => { + if (res.code >= 0) { + this.orderPaymentData = res.data; + this.handlePaymentData(); + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + } else { + this.$util.showToast({ + title: '未获取到创建订单所需数据!' + }); + setTimeout(() => { + this.$util.redirectTo('/pages/index/index'); + }, 1500); + } + }, + fail: res => { + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + } + }) + }, + // 处理结算订单数据 + handlePaymentData() { + this.orderCreateData.delivery = {}; + this.orderCreateData.coupon = {}; + + this.orderCreateData.is_balance = 0; + this.orderCreateData.is_point = 0; + + this.orderCreateData.is_invoice = 0; // 是否需要发票 0 无发票 1 有发票 + this.orderCreateData.invoice_type = 1; // 发票类型 1 纸质 2 电子 + this.orderCreateData.invoice_title_type = 1; // 发票抬头类型 1 个人 2企业 + this.orderCreateData.is_tax_invoice = 0; // 是否需要增值税专用发票 0 不需要 1 需要 + this.orderCreateData.invoice_title = ''; + + var data = this.orderPaymentData; + + // 店铺配送方式 + if (data.shop_goods_list.express_type != undefined && data.shop_goods_list.express_type[0] != undefined) { + var express_type = data.shop_goods_list.express_type; + this.orderCreateData.delivery.store_id = 0; + // 获取选择配送方式缓存 + var delivery_storage = uni.getStorageSync('delivery'); + if (delivery_storage) { + var delivery_type = delivery_storage.name; + var delivery_type_name = delivery_storage.title; + express_type.forEach(item => { + if ((delivery_type == 'store' && item.name == delivery_type) || (delivery_type == 'local' && item.name == delivery_type)) { + this.storeSelected(item); + } + }) + // 如果配送方式缓存是门店配送模拟点击门店tab选项 + if (delivery_type == 'store') { + this.member_address = { + mobile: data.member_account.mobile != '' ? data.member_account.mobile : '' + }; + } + } else { + var delivery_type = express_type[0].name; + if(delivery_type == "store"){ + this.member_address = { + mobile: data.member_account.mobile != '' ? data.member_account.mobile : '' + }; + } + var delivery_type_name = express_type[0].title; + } + this.orderCreateData.delivery.delivery_type = delivery_type; + this.orderCreateData.delivery.delivery_type_name = delivery_type_name; + + // 如果默认配送方式是门店配送模拟点击门店tab选项 + if (express_type[0].name == 'store' || express_type[0].name == 'local') { + this.storeSelected(express_type[0]); + } + } + + if (data.is_virtual) this.member_address = { + mobile: data.member_account.mobile != '' ? data.member_account.mobile : '' + }; + + Object.assign(this.orderPaymentData, this.orderCreateData); + }, + // 显示弹出层 + openPopup(ref) { + this.$refs[ref].open(); + }, + // 关闭弹出层 + closePopup(ref) { + if (this.tempData) { + Object.assign(this.orderCreateData, this.tempData); + Object.assign(this.orderPaymentData, this.tempData); + this.tempData = null; + this.$forceUpdate(); + } + this.$refs[ref].close(); + }, + // 选择收货地址 + selectAddress() { + var params = { + back: encodeURIComponent('/pages_promotion/blindbox/fill_address?blindbox_goods_id='+this.blindbox_goods_id+'&out_trade_no='+this.outTradeNo), + local: 0, + type: 1 + } + // 外卖配送需要定位地址 + if (this.orderPaymentData.delivery.delivery_type == 'local') { + params.local = 1; + params.type = 2; + } + this.$util.redirectTo('/pages_tool/member/address', params); + }, + // 订单计算 + orderCalculate() { + var data = this.$util.deepClone(this.orderCreateData); + data.delivery = JSON.stringify(data.delivery); + + this.$api.sendRequest({ + url: '/blindbox/api/order/calculate', + data, + success: res => { + if (res.code >= 0) { + if (res.data.delivery) { + if (res.data.delivery.delivery_type == 'express') this.memberAddress = res.data.member_address; + if (res.data.delivery.delivery_type == 'local') this.localMemberAddress = res.data.member_address; + } + if (res.data.shop_goods_list.local_config) this.orderPaymentData.local_config = res.data.shop_goods_list.local_config; + if (res.data.shop_goods_list.delivery_store_info) this.orderPaymentData.delivery_store_info = res.data.shop_goods_list.delivery_store_info; + this.$forceUpdate(); + } else { + this.$util.showToast({ + title: res.message + }); + } + } + }) + }, + /** + * 订单创建 + * @param {String} pay_password 支付密码 + */ + orderCreate() { + if (this.verify()) { + if (this.isSub) return; + this.isSub = true; + + uni.showLoading({ title: '' }) + + var data = this.$util.deepClone(this.orderCreateData); + data.delivery = JSON.stringify(data.delivery); + if (this.orderCreateData.delivery.delivery_type == 'store') { + data.member_address = JSON.stringify(this.member_address); + } else { + data.member_address = JSON.stringify(data.member_address); + } + + this.$api.sendRequest({ + url: '/blindbox/api/order/create', + data, + success: res => { + uni.hideLoading(); + if (res.code == 0) { + this.$util.redirectTo('/pages/order/list', {}, 'redirectTo'); + } else { + if(res.data == ""){ + this.$util.showToast({ + title: res.message + }); + } + this.isSub = false; + } + }, + fail: res => { + uni.hideLoading(); + this.isSub = false; + } + }) + } + }, + // 订单验证 + verify() { + if (this.orderPaymentData.is_virtual == 0) { + if (!this.orderCreateData.delivery || !this.orderCreateData.delivery.delivery_type) { + this.$util.showToast({ + title: '商家未设置配送方式' + }); + return false; + } + + if (this.orderCreateData.delivery.delivery_type != 'store') { + if (!this.orderPaymentData.member_address) { + this.$util.showToast({ + title: '请先选择您的收货地址' + }); + return false; + } + } + if (this.orderCreateData.delivery.delivery_type != 'store') { + if (!this.orderPaymentData.member_address) { + this.$util.showToast({ + title: '请先选择您的收货地址' + }); + return false; + } + } + + if (this.orderCreateData.delivery.delivery_type == 'store') { + if (!this.orderCreateData.delivery.store_id) { + this.$util.showToast({ + title: '没有可提货的门店,请选择其他配送方式' + }); + return false; + } + if (!this.member_address.mobile) { + this.$util.showToast({ + title: '请输入预留手机' + }); + return false; + } + var reg = /^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$/; + if (!reg.test(this.member_address.mobile)) { + this.$util.showToast({ + title: '请输入正确的预留手机' + }); + return false; + } + + if(!this.orderCreateData.buyer_ask_delivery_time){ + this.$util.showToast({ + title: '请输入自提时间' + }); + return false; + } + } + + if (this.orderCreateData.delivery.delivery_type == 'local') { + if (!this.orderCreateData.delivery.store_id) { + this.$util.showToast({ + title: '没有可配送的门店,请选择其他配送方式' + }); + return false; + } + if (this.orderPaymentData.local_config && this.orderPaymentData.local_config.info && this.orderPaymentData.local_config.info.time_is_open == 1 && !this.orderCreateData.buyer_ask_delivery_time) { + this.$util.showToast({ + title: '请选择配送时间' + }); + return false; + } + } + + } + return true; + }, + // 选择配送方式 + selectDeliveryType(data) { + uni.setStorageSync('delivery', { + title: data.title, + name: data.name + }); + this.orderCreateData.delivery.delivery_type = data.name; + this.orderCreateData.delivery.delivery_type_name = data.title; + // 如果是门店配送 + if (data.name == 'store') { + this.storeSelected(data); + if (!this.member_address.mobile) this.member_address.mobile = this.orderPaymentData.member_account.mobile != '' ? this.orderPaymentData.member_account.mobile : ''; + } + if (data.name == 'local') { + this.storeSelected(data); + } + Object.assign(this.orderPaymentData, this.orderCreateData); + this.orderCalculate(); + this.$forceUpdate(); + }, + // 切换到门店 + storeSelected(data) { + // 门店列表 + this.storeInfo.storeList = data.store_list; + let store = data.store_list[0] ? data.store_list[0] : null; + this.selectPickupPoint(store); + }, + /** + * 选择自提点 + */ + selectPickupPoint(store_item) { + if (store_item) { + this.orderCreateData.delivery.store_id = store_item.store_id; + this.storeInfo.currStore = store_item; + // 存储所选门店 + let delivery = uni.getStorageSync('delivery'); + delivery.store_id = store_item.store_id; + uni.setStorageSync('delivery', delivery) + } else { + this.orderCreateData.delivery.store_id = 0; + this.storeInfo.currStore = {}; + } + this.orderCreateData.buyer_ask_delivery_time = ''; + this.orderCreateData.buyer_ask_delivery_title = ''; + Object.assign(this.orderPaymentData, this.orderCreateData); + this.orderCalculate(); + this.$forceUpdate(); + this.$refs['deliveryPopup'].close(); + }, + popupConfirm(ref) { + this.orderCalculate(); + this.$forceUpdate(); + this.tempData = null; + this.$refs[ref].close(); + }, + imageError(goodsIndex) { + this.orderPaymentData.shop_goods_list.goods_list[goodsIndex].sku_image = this.$util.getDefaultImage().goods; + this.$forceUpdate(); + }, + navigateTo(sku_id) { + this.$util.redirectTo('/pages/goods/detail', { + sku_id + }); + }, + /** + * 同城配送数据处理 + */ + localtime(type = ''){ + let data = this.$util.deepClone(this.orderPaymentData.local_config.info); + if (data.delivery_time) { + data.end_time = data.delivery_time[ (data.delivery_time.length - 1) ].end_time; + } + let obj = { + delivery: this.orderCreateData.delivery, + dataTime: data + } + this.$refs.timePopup.open(obj,type); + }, + /** + * 门店自提数据处理 + */ + storetime(type = ''){ + if(this.orderPaymentData.delivery_store_info){ + let data = this.$util.deepClone(this.storeInfo.currStore); + if (data.delivery_time) { + data.delivery_time = JSON.parse(data.delivery_time); + data.end_time = data.delivery_time[ (data.delivery_time.length - 1) ].end_time; + } else { + data.delivery_time = [ {start_time: data.start_time, end_time: data.end_time} ] + } + let obj = { + delivery:this.orderCreateData.delivery, + dataTime:data + } + this.$refs.timePopup.open(obj,type); + this.$forceUpdate(); + } + }, + /** + * 弹窗返回数据 + */ + selectPickupTime(data){ + if(data.data && data.data.month){ + let nowDate = new Date(); + let Year = nowDate.getFullYear(); + let timeData = data.data.month.split('月'); + let month = timeData[0]; + let date = timeData[1].split('日')[0] + + this.orderCreateData.buyer_ask_delivery_time = Year + '-' + month + '-' + date + ' ' + data.data.time + ':00' + if(data.data.title == '今天' || data.data.title == '明天'){ + this.orderCreateData.buyer_ask_delivery_title = data.data.title + '(' + data.data.time + ')' + }else{ + this.orderCreateData.buyer_ask_delivery_title = data.data.month + '(' + data.data.time + ')' + } + this.$forceUpdate(); + } + }, + /** + * 保存留言 + */ + saveBuyerMessage(){ + this.$refs.buyerMessagePopup.close(); + }, + /** + * 微信订阅消息 + */ + subscribeMessage() { + let keywords = 'ORDER_PAY,ORDER_DELIVERY,ORDER_TAKE_DELIVERY'; + if(this.orderCreateData.delivery && this.orderCreateData.delivery.delivery_type == 'store'){ + keywords = 'ORDER_PAY,ORDER_TAKE_DELIVERY'; + } + this.$api.sendRequest({ + url: '/weapp/api/weapp/messagetmplids', + data: { + keywords: keywords + }, + success: res => { + if (res.data.length) { + uni.requestSubscribeMessage({ + tmplIds: res.data, + success: (res) => {}, + fail: (res) => { + console.log('fail', res) + } + }) + } + } + }) + } + }, + computed: { + goodsData(){ + if (this.orderPaymentData.shop_goods_list.goods_list) { + this.orderPaymentData.shop_goods_list.goods_list.forEach(item => { + if (item.sku_spec_format) item.sku_spec_format = JSON.parse(item.sku_spec_format); + }) + return this.orderPaymentData.shop_goods_list; + } + }, + storeToken: function(nVal, oVal) { + this.getOrderPaymentData(); + } + }, + watch: { + location: function(nVal){ + if (nVal) { + this.getOrderPaymentData(); + } + } + }, + filters: { + // 金额格式化输出 + moneyFormat(money) { + return parseFloat(money).toFixed(2); + } + } +} diff --git a/pages_promotion/bundling/detail.vue b/pages_promotion/bundling/detail.vue new file mode 100644 index 0000000..bb3eeac --- /dev/null +++ b/pages_promotion/bundling/detail.vue @@ -0,0 +1,335 @@ + ++ ++ ++ ++ + + +{{ blindgoods.blindbox_name }} +进行中 +已关闭 +已结束 ++ ++ 盲盒次数: ++ 可拆{{ blindgoods.blindbox_count }}次,剩余 + +{{ blindgoods.blindbox_inventory }} + 次 ++ ++ 我的次数: ++ 已拆 + +{{ blindgoods.buy_num }} + 次 ++ ++ +我的奖品 +参与人 ++ ++ ++ ++ ++ ++ ++ ++ + + ++ + + +{{ items.sku_name }} ++ +{{ $util.timeStampTurnTime(items.create_time) }} + + ++ ++ +{{ items.nickname }} +{{ $util.timeStampTurnTime(items.create_time) }} +获得{{ items.sku_name }} ++ ++ 暂无奖品~ ++ 暂无参与人~ ++ ++ 加载中... + + + + + + + + diff --git a/pages_promotion/bundling/payment.vue b/pages_promotion/bundling/payment.vue new file mode 100644 index 0000000..15ff2f5 --- /dev/null +++ b/pages_promotion/bundling/payment.vue @@ -0,0 +1,49 @@ + ++ + ++ + +{{ combo.bl_name }} + ++ ++ ++ + +{{ item.sku_name }} ++ +{{ $lang('common.currencySymbol') }} +{{ parseFloat(item.price).toFixed(2).split(".")[0] }} +.{{ parseFloat(item.price).toFixed(2).split(".")[1] }} +x1 ++ 库存不足,剩余:{{ item.stock }} + +{{ item.unit }} +件 ++ ++ + + +套餐价: +{{ $lang('common.currencySymbol') }} +{{ parseFloat(packagePrice).toFixed(2).split(".")[0] }} +.{{ parseFloat(packagePrice).toFixed(2).split(".")[1] }} + + ++ + + + + + + + + diff --git a/pages_promotion/cardservice/card/card_record.vue b/pages_promotion/cardservice/card/card_record.vue new file mode 100644 index 0000000..5fed03b --- /dev/null +++ b/pages_promotion/cardservice/card/card_record.vue @@ -0,0 +1,160 @@ + ++ + + + + + + + \ No newline at end of file diff --git a/pages_promotion/cardservice/card/list.vue b/pages_promotion/cardservice/card/list.vue new file mode 100644 index 0000000..0f90605 --- /dev/null +++ b/pages_promotion/cardservice/card/list.vue @@ -0,0 +1,221 @@ + ++ ++ ++ +{{$util.timeStampTurnTime(item.create_time)}} +{{item.type =="verify" ? '核销成功' : '提货成功'}} ++ ++ ++ + ++ +{{item.sku_name}} + ++ +{{item.type =="verify" ? '本次核销' : '本次提货'}} +x{{item.num}} ++ + + + + + + + + + \ No newline at end of file diff --git a/pages_promotion/cardservice/card/my_card.vue b/pages_promotion/cardservice/card/my_card.vue new file mode 100644 index 0000000..ca32a3e --- /dev/null +++ b/pages_promotion/cardservice/card/my_card.vue @@ -0,0 +1,203 @@ + ++ ++ ++ ++ + ++ ++ {{typeitem.title}} ++ + ++ ++ + +{{item.goods_name}} ++ +¥ +{{item.price}} ++ +已售{{item.sale_num}} + ++ + + + + + + + + \ No newline at end of file diff --git a/pages_promotion/cardservice/card/my_detail.vue b/pages_promotion/cardservice/card/my_detail.vue new file mode 100644 index 0000000..b34cf23 --- /dev/null +++ b/pages_promotion/cardservice/card/my_detail.vue @@ -0,0 +1,386 @@ + ++ ++ ++ {{ statusItem.name }} + ++ + ++ ++ ++ +{{item.goods_name}} +{{item.introduction}} ++ +总次数:{{item.card_type == "timecard" ? "不限次" : item.total_num }} +已使用:{{ item.total_use_num }} +有效期:{{parseInt(item.end_time) == 0 ? "永久" : $util.timeStampTurnTime(item.end_time)}} ++ + + + + + + + + + diff --git a/pages_promotion/cardservice/card/pick_goods.vue b/pages_promotion/cardservice/card/pick_goods.vue new file mode 100644 index 0000000..7f250d4 --- /dev/null +++ b/pages_promotion/cardservice/card/pick_goods.vue @@ -0,0 +1,275 @@ + ++ ++ + ++ +{{cardDetail.goods_name}} +{{cardDetail.introduction}} ++ +有效期:{{parseInt(cardDetail.end_time) == 0 ? "永久" : $util.timeStampTurnTime(cardDetail.end_time,'y-m-d')}} ++ +- 套餐包含以下的服务及商品 - ++ 卡项内项目/商品总的可用次数为{{cardDetail.total_num}}次,剩余{{ cardDetail.total_num - cardDetail.total_use_num }}次可用 + ++ ++ ++ + + +{{item.sku_name}} +总次数:{{item.num}} +{{cardDetail.card_type == 'timecard' ? "使用次数:不限次数" : ('已使用次数:'+item.use_num)}} ++ +使用记录 ++ + + +- 商品详情 - ++ ++ + ++ ++ ++ + 向收银员展示此核销码 ++ ++ +名称 +{{virtualData.name}} ++ +剩余次数 +x {{virtualData.num}} ++ +核销码 +点击复制 ++ +有效期 +{{virtualData.time}} ++ + + + + + + + + diff --git a/pages_promotion/cardservice/card/pick_payment.vue b/pages_promotion/cardservice/card/pick_payment.vue new file mode 100644 index 0000000..3848d38 --- /dev/null +++ b/pages_promotion/cardservice/card/pick_payment.vue @@ -0,0 +1,50 @@ + ++ +- 选择提货数量 - ++ 卡项内项目/商品总的可用次数为{{ cardDetail.total_num - cardDetail.total_use_num }}次 + ++ ++ ++ + +{{item.sku_name}} +总次数:{{item.num}} +{{cardDetail.card_type == 'timecard' ? "使用次数:不限次数" : ('已使用次数:'+item.use_num)}} ++ ++ + + ++ + + + + + + + diff --git a/pages_promotion/cardservice/service_goods/my_reserve_detail.vue b/pages_promotion/cardservice/service_goods/my_reserve_detail.vue new file mode 100644 index 0000000..db948d0 --- /dev/null +++ b/pages_promotion/cardservice/service_goods/my_reserve_detail.vue @@ -0,0 +1,374 @@ + ++ + + ++ + ++ +店铺名称 +{{ reserveDetail.store_name }} ++ ++
+ ++ ++ ++ ++ + ++ +{{ goodsItem.goods_name }} ++ +预约时间:{{ $util.timeStampTurnTime(reserveDetail.reserve_time) }} ++ +预约人数: 1 ++ +服务人员:{{ goodsItem.username }} ++ + + + + + + diff --git a/pages_promotion/cardservice/service_goods/my_reserve_list.vue b/pages_promotion/cardservice/service_goods/my_reserve_list.vue new file mode 100644 index 0000000..5174f18 --- /dev/null +++ b/pages_promotion/cardservice/service_goods/my_reserve_list.vue @@ -0,0 +1,591 @@ + ++ ++ +姓名 +{{ reserveDetail.nickname }} ++ +备注 +{{ reserveDetail.remark }} +暂无备注 ++ + + ++ + ++ ++ ++ +门店位置 ++ + + ++ + + + + + + + + + + diff --git a/pages_promotion/cardservice/service_goods/reserve_apply.vue b/pages_promotion/cardservice/service_goods/reserve_apply.vue new file mode 100644 index 0000000..407f773 --- /dev/null +++ b/pages_promotion/cardservice/service_goods/reserve_apply.vue @@ -0,0 +1,701 @@ + ++ + + ++ ++ {{ statusItem.name }} + ++ + + + + + ++ ++ ++ ++ +{{ $util.timeStampTurnTime(reserveItem.create_time) }} +{{ reserveItem.reserve_state_name }} ++ ++ ++ ++ ++ + ++ +{{ goodsItem.goods_name }} ++ +预约时间:{{ $util.timeStampTurnTime(reserveItem.reserve_time) }} ++ +{{ reserveItem.remark }} ++ ++ 取消预约 + + + + + + + + + + + diff --git a/pages_promotion/cardservice/service_goods/reserve_detail.vue b/pages_promotion/cardservice/service_goods/reserve_detail.vue new file mode 100644 index 0000000..4ee17fa --- /dev/null +++ b/pages_promotion/cardservice/service_goods/reserve_detail.vue @@ -0,0 +1,236 @@ + ++ ++ + +{{ serviceDetail.goods_name }} ++ ++ +¥ +{{ serviceDetail.discount_price }} +{{ serviceDetail.price }} +¥{{ serviceDetail.price }} ++ +已预约{{ serviceDetail.sale_num }}人次 ++ +服务详情 ++ + + + ++ ++ 选择门店 ++ + +{{ storeInfo.store_name }} +营业时间:{{ storeInfo.open_date }} +地址:{{ storeInfo.full_address }} {{ storeInfo.address }} ++ + ++ 选择服务人员 ++ +{{ user.username }} ++ + ++ ++ 预约时间 ++ + + ++ + + ++ ++ + 收藏 ++ + + + + ++ ++ ++ +选择服务人员 ++ + ++ +{{ item.username }} ++ + ++ ++ ++ +选择门店列表 ++ + ++ ++ +{{ item.store_name }} +营业时间:{{ item.open_date }} +地址:{{ item.full_address }} {{ item.address }} ++ + + + + + + + + + diff --git a/pages_promotion/cardservice/service_goods/reserve_list.vue b/pages_promotion/cardservice/service_goods/reserve_list.vue new file mode 100644 index 0000000..04ff485 --- /dev/null +++ b/pages_promotion/cardservice/service_goods/reserve_list.vue @@ -0,0 +1,221 @@ + ++ + + + +预约信息 ++ +预约项目 +{{ serviceDetail.goods_name }} ++ +预约时间 ++ +{{ params.date }} +({{ params.time }}) ++ +预约人数 +1 ++ +服务人员 +{{ params.username }} ++ +备注 + ++ ++ + + + + + + + + + + + diff --git a/pages_promotion/cardservice/service_goods/service_list.vue b/pages_promotion/cardservice/service_goods/service_list.vue new file mode 100644 index 0000000..fedaed2 --- /dev/null +++ b/pages_promotion/cardservice/service_goods/service_list.vue @@ -0,0 +1,221 @@ + ++ + ++ {{ item.name }} + ++ + ++ ++ ++ ++ + +{{item.goods_name}} ++ +¥ +{{item.price}} ++ +已预约{{item.sale_num}}人次 + ++ + + + + + + + + + diff --git a/pages_promotion/divideticket/index.vue b/pages_promotion/divideticket/index.vue new file mode 100644 index 0000000..247aa7a --- /dev/null +++ b/pages_promotion/divideticket/index.vue @@ -0,0 +1,1222 @@ + ++ + ++ {{ item.name }} + ++ + ++ ++ ++ ++ + +{{item.goods_name}} ++ +¥ +{{item.price}} ++ +已售{{item.sale_num}} + ++ + + + + + + + + + \ No newline at end of file diff --git a/pages_promotion/divideticket/list.vue b/pages_promotion/divideticket/list.vue new file mode 100644 index 0000000..05b532b --- /dev/null +++ b/pages_promotion/divideticket/list.vue @@ -0,0 +1,333 @@ + ++ ++ ++ ++ ++ 活动说明 ++ +点击 [立即领取] 瓜分优惠券 +{{guafenInfo.money}} +元 立即领取 ++ ++ ++ ++ ++ ++ + + ++ +仅差 +{{groupInfoList.num - groupInfoList.member_list.length}} 人,即可瓜分{{guafenInfo.money}} 元优惠券+ ++ 距离结束 ++ + 邀请好友一起瓜分 ++ ++ +恭喜你,成功获得优惠券 ++ ++ ++ ++ ++ + {{money}} +元 店铺商品满{{guafenInfo.at_least|int}}元可用 +有效期:{{$util.timeStampTurnTime(start_time_coupon)|date}} 至 {{$util.timeStampTurnTime(end_time_coupon)|date}} +立即使用 +瓜分新礼包 ++ {{groupInfoList.status}} + ++ 哎呀,来晚了,活动已结束 + ++ + ++ 来晚了,优惠券已被瓜分完 + ++ + + ++ ++ ++ ++ 组队失败 ++ ++ ++ ++ ++ ++ + 集齐{{groupInfoList.num}}人可瓜分红包,还差 +{{groupInfoList.num - groupInfoList.member_list.length}} 人+ ++ +活动开始时间 {{ $util.timeStampTurnTime(guafenInfo.start_time) }} ++ +活动结束时间 {{ $util.timeStampTurnTime(guafenInfo.end_time) }} ++ +组队时间 {{ $util.timeStampTurnTime(groupInfoList.start_time) }} ++ + ++ ++ ++ + ++ +活动时间: +{{ $util.timeStampTurnTime(guafenInfo.start_time) }} - {{ $util.timeStampTurnTime(guafenInfo.end_time) }} +活动说明: +{{ guafenInfo.remark }} ++ + + ++ ++ +分享 ++ + ++ + + + ++ + + ++ + + ++ + + ++ 取消分享 + + ++ + ++ ++ + ++ 保存图片 + + +长按保存图片 + ++ + {{ posterMsg }} ++ + ++ ++ ++ ++ {{inviterInfo.nickname|guolv}} +邀请你加入团队 +加入队伍 ++ ++ + ++ ++ {{groupInfoList.header_nickname|guolv}} +邀请你加入团队 +加入队伍 ++ ++ + + ++ ++ +{{guafenInfo.money|int}} +元 立即领取 ++ ++ ++ ++ +你已加入 +{{groupInfoList.header_nickname|guolv}} 的瓜分团仅差 +{{groupInfoList.num - groupInfoList.member_list.length}} 人即可瓜分优惠礼包{{guafenInfo.money|int}} +元 喊好友一起瓜分 ++ ++ + + + + + + + + + + diff --git a/pages_promotion/divideticket/my_guafen.vue b/pages_promotion/divideticket/my_guafen.vue new file mode 100644 index 0000000..7e8c3ca --- /dev/null +++ b/pages_promotion/divideticket/my_guafen.vue @@ -0,0 +1,476 @@ + ++ ++ ++ ++ ++ ++ ++ ++ + + +{{item.name}} +{{item.divide_num}}名好友瓜分{{ item.money|int}}元优惠券 +有效期:领取之日起{{ item.fixed_term }}日内有效 +有效期:{{ $util.timeStampTurnTime(item.end_time) }} ++ ++ +¥ + {{ parseFloat(item.money).toFixed(2).split(".")[0] }} +.{{ parseFloat(item.money).toFixed(2).split(".")[1] }} +去瓜分 +去查看 +组队中 ++ + + + + + + + + + + \ No newline at end of file diff --git a/pages_promotion/divideticket/poster.vue b/pages_promotion/divideticket/poster.vue new file mode 100644 index 0000000..577f623 --- /dev/null +++ b/pages_promotion/divideticket/poster.vue @@ -0,0 +1,229 @@ + + ++ ++ ++ {{ statusItem.name }} + ++ ++ ++ ++ ++ +发起组队 {{ $util.timeStampTurnTime(item.start_time) }} +组队失败 +组队成功 +组队中 ++ ++ ++ ++ + + +{{item.name}} +{{item.divide_num}}名好友瓜分{{ item.money|int}}元优惠券 +有效期:领取之日起{{ item.fixed_term }}日内有效 +有效期:{{ $util.timeStampTurnTime(item.end_time) }} ++ ++ ++ ++ ++ + + + + + + ++ ++ + +重新组队 +去查看 +去查看 +组队中 ++ ++ + + + + + + + + + + diff --git a/pages_promotion/fenxiao/apply.vue b/pages_promotion/fenxiao/apply.vue new file mode 100644 index 0000000..f5d9f43 --- /dev/null +++ b/pages_promotion/fenxiao/apply.vue @@ -0,0 +1,815 @@ + ++ ++ ++ ++ + + + + + + + + + + + diff --git a/pages_promotion/fenxiao/bill.vue b/pages_promotion/fenxiao/bill.vue new file mode 100644 index 0000000..8e06b23 --- /dev/null +++ b/pages_promotion/fenxiao/bill.vue @@ -0,0 +1,149 @@ + ++ + + + + + + ++ ++ + ++ + ++ 请填写申请信息 + + ++ + + ++ ++ +邀请人 +{{ sourceMemberInfo.fenxiao_name }} ++ +{{ fenxiaoWords.fenxiao_name }}名称 + ++ +手机号 + ++ ++ 我已阅读并了解 + 【{{ fenxiaoWords.fenxiao_name }}申请协议】 ++ + ++ + ++ ++ ++ {{ goodsTag(item) }} ++ +{{ item.goods_name }} ++ ++ +{{ $lang('common.currencySymbol') }} + {{ item.market_price > 0 ? item.market_price : item.price }} ++ {{ isOpen ? '展开更多' : '收起' }} + ++ + + ++ ++ 申请成为{{ fenxiaoWords.fenxiao_name }},需要您的消费次数需要达到{{ fenxiaoConfig.consume_count }}次 +申请成为{{ fenxiaoWords.fenxiao_name }},需要您的消费金额需要达到{{ fenxiaoConfig.consume_money|moneyFormat }}元 ++ ++ + ++ ++ ++ {{ goodsTag(item) }} ++ +{{ item.goods_name }} ++ ++ +{{ $lang('common.currencySymbol') }} + {{ item.market_price > 0 ? item.market_price : item.price }} ++ {{ isOpen ? '展开更多' : '收起' }} + ++ + + ++ 您还不是分销商 ++ ++ 您已提交{{ fenxiaoWords.fenxiao_name }}申请,等待平台审核 ++ +您提交的{{ fenxiaoWords.fenxiao_name }}申请,已被拒绝,请再接再厉 +重新申请 +重新申请 ++ ++ ++ ++ {{ fenXiaoAgreement.document.title }} ++ ++ + + + + + + + + diff --git a/pages_promotion/fenxiao/child_fenxiao.vue b/pages_promotion/fenxiao/child_fenxiao.vue new file mode 100644 index 0000000..1f62094 --- /dev/null +++ b/pages_promotion/fenxiao/child_fenxiao.vue @@ -0,0 +1,300 @@ + ++ ++ ++ ++ + + +{{ item.type_name }} +账单编号: {{ item.account_no }} +{{ $util.timeStampTurnTime(item.create_time) }} ++ +{{ item.money > 0 ? '+' + item.money : item.money }} ++ + + + + + + + + diff --git a/pages_promotion/fenxiao/goods_list.vue b/pages_promotion/fenxiao/goods_list.vue new file mode 100644 index 0000000..06677e2 --- /dev/null +++ b/pages_promotion/fenxiao/goods_list.vue @@ -0,0 +1,392 @@ + ++ + ++ ++ ++ ++ + + ++ ++ ++ +{{ item.nickname }} +{{ item.level_name }} +加入时间:{{ $util.timeStampTurnTime(item.bind_fenxiao_time).substring(0, 10) }} ++ ++ {{ item.one_child_fenxiao_num + item.one_child_num }} 人+ {{ item.order_num }} 单+ {{ item.order_money|moneyFormat }} 元+ ++ + + + + + + + + + \ No newline at end of file diff --git a/pages_promotion/fenxiao/index.vue b/pages_promotion/fenxiao/index.vue new file mode 100644 index 0000000..74080f5 --- /dev/null +++ b/pages_promotion/fenxiao/index.vue @@ -0,0 +1,514 @@ + ++ ++ ++ ++ ++ + ++ +{{ item.sku_name }} ++ +{{item.label_name}} ++ ++ +¥ + {{ item.discount_price }} ++ ++ 分享 +赚{{ item.commission_money }}元 ++ + + + +| + +生成海报 ++ + + + + ++ ++ +分享 ++ + ++ + + + + ++ + + + ++ + + ++ + + ++ 取消分享 + ++ + ++ ++ + 保存图片 + + +长按保存图片 + ++ + {{ posterMsg }} ++ + + + + + + + + diff --git a/pages_promotion/fenxiao/level.vue b/pages_promotion/fenxiao/level.vue new file mode 100644 index 0000000..ad56ff8 --- /dev/null +++ b/pages_promotion/fenxiao/level.vue @@ -0,0 +1,316 @@ + ++ + ++ + ++ ++ ++ + + ++ +{{ info.fenxiao_name }} ++ {{ info.level_name }} + ++ ++ + +{{ info.level_num > 0 ? info.level_name : '等级未解锁' }} +下单、邀请好友均可提升等级 +做任务 ++ + ++ + ++ +可{{ fenxiaoWords.withdraw }}(元) +提现记录 +{{ info.account }} ++ ++ +总{{ fenxiaoWords.account }} +{{ info.total_commission | moneyFormat }} ++ +已提现{{ fenxiaoWords.account }} +{{ info.account_withdraw | moneyFormat }} ++ +提现中{{ fenxiaoWords.account }} +{{ info.account_withdraw_apply | moneyFormat }} +申请提现 ++ + + ++ ++ ++ ++ + +我的团队 +{{ teamNum.num }}人 ++ ++ ++ ++ + +{{ fenxiaoWords.fenxiao_name }} +{{ info.one_child_fenxiao_num }}人 ++ ++ ++ ++ + +{{ fenxiaoWords.withdraw }}明细 +累计{{ fenxiaoWords.account }}¥{{ info.total_commission | moneyFormat }} ++ ++ ++ + +{{ fenxiaoWords.concept + '订单' }} +{{ fenxiaoWords.concept + '订单' }}明细 ++ ++ ++ + +推广海报 +邀请好友 ++ ++ ++ + +账单报表 +{{ fenxiaoWords.account }}变更明细 ++ ++ ++ + +{{ fenxiaoWords.concept }}商品 +{{ fenxiaoWords.concept }}商品 ++ ++ ++ + +{{ fenxiaoWords.account }}排行 +您的排名为第{{profitRanking}}位 ++ ++ ++ + +推广人排行 +您的排名为{{ invitedNumRanking }}位 ++ ++ ++ + +等级说明 +{{ fenxiaoWords.concept }}等级说明 ++ + ++ 您还不是{{ fenxiaoWords.fenxiao_name }},请先提交申请 +立即加入 ++ + + + + ++ ++ +快速升级技巧 ++ + ++ {{ item.title }} + ++ {{ item.progress == 100 ? '已完成' : '未完成' }} ++ + +{{ item.value }} +/{{ item.condition }} ++ +{{ item.progress == 100 ? '已完成' : '去完成' }} ++ ++ ++ +提示 ++ + +{{ tips }} +{{ levelInfo.upgrade_type == 1 ? '满足任意一条件即可升级' : '满足全部条件才能进行升级' }} ++ + + + + + + + diff --git a/pages_promotion/fenxiao/order.vue b/pages_promotion/fenxiao/order.vue new file mode 100644 index 0000000..319354b --- /dev/null +++ b/pages_promotion/fenxiao/order.vue @@ -0,0 +1,217 @@ + ++ + ++ + + ++ ++ ++ ++ ++ ++ {{ fenxiaoInfo.nickname }} +{{ item.level_name }} ++ + ++ +一级分佣比率 +{{ item.one_rate }} +% + +二级分佣比率 +{{ item.two_rate }} +% + +三级分佣比率 +{{ item.three_rate }} +% + ++ + + ++ +快速升级技巧 ++ +{{ levelInfo.complete > levelInfo.task_num ? levelInfo.task_num : levelInfo.complete }} +/{{ levelInfo.task_num }} ++ ++ ++ ++ {{item.title}} + ++ {{ item.progress == 100 ? '已完成' : '未完成' }} ++ + ++ +{{item.desc}} ++ +{{ item.value }} +/{{ item.condition }} ++ + ++ ++ +提示 ++ + +{{ tips }} +{{ levelInfo.upgrade_type == 1 ? '满足任意一条件即可升级' : '满足全部条件才能进行升级' }} ++ + + + + + + + + diff --git a/pages_promotion/fenxiao/order_detail.vue b/pages_promotion/fenxiao/order_detail.vue new file mode 100644 index 0000000..d3442b0 --- /dev/null +++ b/pages_promotion/fenxiao/order_detail.vue @@ -0,0 +1,384 @@ + ++ ++ +{{ item.name }} ++ + ++ ++ ++ ++ + +{{ orderItem.order_no }} +已退款 +已结算 +待结算 ++ ++ ++ ++ + ++ +{{ orderItem.sku_name }} ++ +返{{ fenxiaoWords.account }} +{{ $lang('common.currencySymbol') }} +{{ parseFloat(orderItem.commission).toFixed(2).split(".")[0] }} +.{{ parseFloat(orderItem.commission).toFixed(2).split(".")[1] }} ++ ++ +{{ $lang('common.currencySymbol') }} + +{{ parseFloat(orderItem.price).toFixed(2).split(".")[0] }} +.{{ parseFloat(orderItem.price).toFixed(2).split(".")[1] }} + ++ ++ ++ {{ orderItem.num }} + + ++ ++ +{{ $util.timeStampTurnTime(orderItem.create_time) }} + ++ +合计: +{{ $lang('common.currencySymbol') }} + +{{ parseFloat(orderItem.real_goods_money).toFixed(2).split(".")[0] }} +.{{ parseFloat(orderItem.real_goods_money).toFixed(2).split(".")[1] }} ++ ++ + + + + + + + + + + + + diff --git a/pages_promotion/fenxiao/promote.vue b/pages_promotion/fenxiao/promote.vue new file mode 100644 index 0000000..8c1a50b --- /dev/null +++ b/pages_promotion/fenxiao/promote.vue @@ -0,0 +1,304 @@ + ++ ++ ++ ++ +共{{ orderData.num }}件商品 +已退款 +已结算 +待结算 ++ + ++ ++ + +{{ orderData.sku_name }} ++ ++ ++ +¥ +{{ parseFloat(orderData.price).toFixed(2).split(".")[0] }} +.{{ parseFloat(orderData.price).toFixed(2).split(".")[1] }} ++ ++ ++ {{ orderData.num }} + + ++ + +合计: +¥{{ orderData.real_goods_money }} ++ ++ ++ 返佣详情 + + ++ +订单编号: +{{ orderData.order_no }} ++ +分佣层级: +{{ orderData.commission_level }}级 ++ +返佣金额: ++ + +¥ + {{ parseFloat(orderData.commission).toFixed(2).split(".")[0] }} +.{{ parseFloat(orderData.commission).toFixed(2).split(".")[1] }} ++ + + + + + + + + diff --git a/pages_promotion/fenxiao/promote_code.vue b/pages_promotion/fenxiao/promote_code.vue new file mode 100644 index 0000000..fbaa1ce --- /dev/null +++ b/pages_promotion/fenxiao/promote_code.vue @@ -0,0 +1,284 @@ + ++ ++ ++ ++ + 累计收益 +{{detailData.total_commission}} 元+ ++ +已邀请好友 +已下单好友 ++ ++ ++ ++ + +{{item.nickname}} ++ 暂无已邀请好友,快去邀请吧 + ++ ++ + 暂无活动规则 ++ + ++ + + + + + + + + diff --git a/pages_promotion/fenxiao/public/css/follow.scss b/pages_promotion/fenxiao/public/css/follow.scss new file mode 100644 index 0000000..2a753fa --- /dev/null +++ b/pages_promotion/fenxiao/public/css/follow.scss @@ -0,0 +1,94 @@ +.ns-adv { + margin: $margin-updown $margin-both; + border-radius: $border-radius; + overflow: hidden; + line-height: 1; + + image { + width: 100%; + } +} + +.lineheight-clear { + line-height: 1 !important; +} + +// 商品列表双列样式 +.goods-list.double-column { + display: flex; + flex-wrap: wrap; + margin: $margin-updown $margin-both; + + .goods-item { + flex: 1; + position: relative; + background-color: #fff; + flex-basis: 48%; + max-width: calc((100% - 30rpx) / 2); + margin-right: $margin-both; + margin-bottom: $margin-updown; + border-radius: $border-radius; + + &:nth-child(2n) { + margin-right: 0; + } + + .goods-img { + position: relative; + overflow: hidden; + padding-top: 100%; + border-top-left-radius: $border-radius; + border-top-right-radius: $border-radius; + + image { + width: 100%; + position: absolute; + top: 50%; + left: 0; + transform: translateY(-50%); + } + } + + .info-wrap { + padding: 0 26rpx 26rpx 26rpx; + } + + .goods-name { + font-size: $font-size-base; + line-height: 1.3; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + margin-top: 20rpx; + height: 68rpx; + } + + .discount-price { + display: inline-block; + font-weight: bold; + line-height: 1; + margin-top: 16rpx; + + .unit { + margin-right: 6rpx; + } + } + + .pro-info { + display: flex; + margin-top: 16rpx; + + & > view { + padding: 2rpx 10rpx; + border: 2rpx solid; + border-radius: 6rpx; + } + + .iconfont { + margin-right: 4rpx; + } + } + } +} diff --git a/pages_promotion/fenxiao/public/css/index.scss b/pages_promotion/fenxiao/public/css/index.scss new file mode 100644 index 0000000..0cb51ef --- /dev/null +++ b/pages_promotion/fenxiao/public/css/index.scss @@ -0,0 +1,521 @@ +.fenxiao-index { + position: relative; + display: flex; + flex-direction: column; + align-items: center; +} +.head-wrap{ + font-size: 16px; + line-height: 51px; + height: 51px; + display: block; + text-align: center; + margin-top: 30rpx; +} +.equity-content{ + width: 400rpx; + height: 200rpx; + position: relative; + margin: 0 auto; + // padding: 20rpx 0 20rpx 0rpx; +} +.subordinate-consumption{ + // margin-left: 130rpx; + font-weight: 900; +} +.incomplete{ + font-weight: normal; + color: rgb(153,153,153); + margin-left: 120rpx; + font-size: 24rpx; +} +.icon-wenhao{ + margin-left: 10rpx; +} +.to-complete-box{ + width: 100rpx; + height: 40rpx; + border-radius: 60rpx; + background: rgb(233,51,35); + position: absolute; + position: absolute; + left: 100%; + top: 40px; + line-height: 40rpx; + text-align: center; +} +.to-complete-box{ + padding: 5rpx; + color: #fff; +} +.circle{ + width: 355rpx; + height: 12rpx; + margin: 10rpx 0rpx; +} +.zero{ + color:rgb(198,152,53); + // margin-left: 130rpx; +} +.icon-close { + position: absolute; + float: right; + right: 22px; + font-size: 16px; + } +.fenxiao-index-header { + width: 100%; + position: relative; + height: 320rpx; + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-between; + + &.not-level { + height: 200rpx; + } + + .member { + width: 100%; + height: 156rpx; + display: flex; + justify-content: space-between; + align-items: center; + padding: 44rpx 32rpx 0; + box-sizing: border-box; + display: flex; + + .member-pic { + width: 100rpx; + height: 100rpx; + border-radius: 50%; + border: 4rpx solid #fff; + position: relative; + + image { + width: 100%; + height: 100%; + border-radius: 50%; + } + .level-name { + height: 32rpx; + background: linear-gradient(180deg, #FCFCFD 0%, #C8D0DD 100%); + border-radius: 32rpx; + line-height: 32rpx; + padding: 0 10rpx; + font-size: 18rpx; + font-weight: 500; + color: #666666; + position: absolute; + bottom: -4rpx; + left: 50%; + z-index: 5; + white-space: nowrap; + transform: translateX(-50%); + } + } + + .member-info { + flex: 1; + width: 0; + margin-left: 32rpx; + display: flex; + flex-direction: column; + justify-content: center; + + view { + color: #fff; + } + + .member-info-box { + display: flex; + align-items: center; + line-height: 1; + } + .name { + font-size: 32rpx; + font-weight: 600; + color: #FFFFFF; + } + + .recommend { + font-size: $font-size-tag; + margin-top: 20rpx; + line-height: 1; + margin-bottom: 10rpx; + display: flex; + align-items: center; + } + + .copy { + width: 68rpx; + height: 30rpx; + line-height: 30rpx; + background: linear-gradient(172deg, rgba(255,255,255,0.6) 0%, rgba(255,255,255,0.8) 100%); + border-radius: 60rpx; + text-align: center; + display: inline-block; + font-size: 18rpx; + font-weight: 600; + color: #202230; + margin-left: 20rpx + } + } + + .member-tixian { + width: 120rpx; + height: 50rpx; + border: 2rpx solid #ffffff; + border-radius: $border-radius; + display: flex; + justify-content: center; + align-items: center; + font-size: $font-size-tag; + color: #ffffff; + } + .code { + width: 50rpx; + height: 50rpx; + } + } + + .fenxiao-level-wrap { + width: calc(100% - 48rpx); + height: 128rpx; + background: linear-gradient(90deg, #FDE5C2 0%, #FDC172 100%); + border-radius: 20rpx 20rpx 0px 0px; + padding: 36rpx; + box-sizing: border-box; + display: flex; + align-items: center; + + .level-icon { + height: 70rpx; + } + + .level-wrap { + flex: 1; + width: 0; + padding: 0 30rpx; + margin-left: 30rpx; + position: relative; + + view { + color: #945100; + line-height: 1; + } + + .title { + font-weight: 600; + font-size: 30rpx; + } + + .desc { + font-size: 24rpx; + margin-top: 10rpx; + } + + &::before { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 2rpx; + height: 100%; + background: linear-gradient(90deg, #FDE5C2 0%, #FDC172 100%); + } + } + + .btn { + width: 118rpx; + height: 54rpx; + line-height: 54rpx; + background: #945100; + border-radius: 54rpx; + font-size: 24rpx; + color: #fff; + font-weight: 500; + text-align: center; + } + } +} + +.fenxiao_index_money { + color: #fff; + display: flex; + justify-content: center; + align-items: center; + width: 100%; + + .xian { + height: 40rpx; + border: 2rpx solid rgba(255, 255, 255, 0.5); + } + + .index-money-item { + padding: 40rpx 0; + flex: 1; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + + .item_money { + color: #fff; + font-size: 36rpx; + line-height: 1; + } + .item_tit { + padding-top: 10rpx; + font-size: $font-size-tag; + color: #fff; + } + } +} + +.fenxiao-index-allmoney { + display: flex; + flex-direction: column; + justify-content: space-between; + margin: 20rpx 24rpx; + border-radius: 16rpx; + background-color: #ffffff; + width: calc(100% - 48rpx); + padding: 32rpx; + box-sizing: border-box; + + .allmoney-top { + display: flex; + justify-content: space-between; + align-items: center; + + view { + line-height: 1; + color: #888888; + font-size: 24rpx; + } + + .iconright { + line-height: 1; + font-size: 28rpx; + margin-left: 4rpx; + } + } + + .total-commission { + color: #E80200; + margin-top: 20rpx; + font-size: 38rpx; + font-weight: bold; + line-height: 1; + } + + .allmoney-bottom { + display: flex; + margin-top: 50rpx; + + .allmoney-all-wrap { + flex: 1; + + .title { + font-size: 24rpx; + color: #888888; + } + + .money { + font-size: 38rpx; + } + } + } + + .withdraw-btn { + height: 92rpx; + line-height: 92rpx; + border-radius: 92rpx; + background: linear-gradient(90deg, #FFE2AC 0%, #FDC174 100%); + text-align: center; + font-weight: 800; + color: #985400; + font-size: 30rpx; + margin: 50rpx 30rpx 0 30rpx; + } +} + + +.uni-popup__wrapper{ + width: 450rpx; + height: 400rpx; + background: rgba(0, 0, 0, 0.4); +} + +.fenxiao-team { + display: flex; + width: 100%; + + .fenxiao-index-other { + margin: 0 24rpx 20rpx 24rpx; + border-radius: 16rpx; + background-color: #ffffff; + padding: 30rpx 0; + flex: 1; + + &:last-child { + margin-left: 0; + } + + .all-money-item { + margin: 0 30rpx; + display: flex; + font-size: $font-size-tag; + align-items: center; + .img-wrap { + display: flex; + justify-content: center; + align-items: center; + width: 70rpx; + height: 70rpx; + image { + width: 100%; + height: 100%; + } + } + .all-money-tit-wrap { + flex: 1; + margin-left: 24rpx; + display: flex; + flex-direction: column; + height: 70rpx; + + .all-money-tit { + line-height: 1; + color: $color-title; + font-size: $font-size-base; + flex: 1; + } + .all-money-num { + color: $color-tip; + font-size: 24rpx; + line-height: 1; + } + } + } + } +} + +.fenxiao-menu-list { + margin: 0 24rpx 20rpx 24rpx; + border-radius: 16rpx; + background-color: #ffffff; + width: calc(100% - 48rpx); + padding: 10rpx 30rpx; + box-sizing: border-box; + display: flex; + flex-wrap: wrap; + + .menu-item { + width: 50%; + display: flex; + align-items: center; + padding: 20rpx 0; + + .icon-wrap { + width: 60rpx; + display: flex; + align-content: center; + justify-content: center; + margin-right: 20rpx; + + image { + width: 100%; + } + } + + .info { + flex: 1; + + .title { + font-size: 28rpx; + line-height: 1; + } + + .desc { + font-size: 24rpx; + margin-top: 12rpx; + color: #aaa; + line-height: 1; + } + } + } +} + +.empty { + width: 100%; + height: 400rpx; + margin-top: 200rpx; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + image { + width: 300rpx; + margin-bottom: 50rpx; + } + text { + font-size: $font-size-tag; + font-weight: 600; + } + view { + width: 300rpx; + height: 70rpx; + border-radius: $border-radius; + text-align: center; + line-height: 70rpx; + color: #ffffff; + margin-top: 30rpx; + } +} + +.popup { + width: 100vw; + background: #fff; + border-top-left-radius: 24rpx; + border-top-right-radius: 24rpx; + + .popup-header { + display: flex; + border-bottom: 2rpx solid $color-line; + position: relative; + padding: 40rpx; + + .tit { + flex: 1; + font-size: $font-size-toolbar; + line-height: 1; + text-align: center; + } + .iconfont { + line-height: 1; + position: absolute; + right: 30rpx; + top: 50%; + transform: translate(0, -50%); + color: $color-tip; + font-size: $font-size-toolbar; + } + } + + .popup-body { + height: calc(100% - 250rpx); + padding: 30rpx; + &.store-popup { + height: calc(100% - 120rpx); + } + &.safe-area { + height: calc(100% - 270rpx); + } + &.store-popup.safe-area { + height: calc(100% - 140rpx); + } + } +} \ No newline at end of file diff --git a/pages_promotion/fenxiao/public/css/level.scss b/pages_promotion/fenxiao/public/css/level.scss new file mode 100644 index 0000000..767050c --- /dev/null +++ b/pages_promotion/fenxiao/public/css/level.scss @@ -0,0 +1,295 @@ +.level-top { + width: 100%; + height: 40rpx; + position: relative; + + image { + width: 100%; + height: 260rpx; + position: absolute; + } +} + +.level-swiper { + width: 100vw; + height: 270rpx; + + .level-item { + width: calc(100% - 60rpx); + height: 100%; + display: flex; + align-items: center; + justify-content: center; + margin: 0 26rpx; + + .level-wrap { + width: 100%; + height: 90%; + background: #fff; + border-radius: 16rpx; + transition: all .5s; + display: flex; + flex-direction: column; + padding: 20rpx 30rpx; + box-sizing: border-box; + position: relative; + } + + .not-unlocked { + position: absolute; + width: 50rpx; + height: 50rpx; + background: #4B4B4B; + display: flex; + align-items: center; + justify-content: center; + right: -1rpx; + top: -1rpx; + border-top-right-radius: 16rpx; + border-bottom-left-radius: 16rpx; + + .iconfont { + color: #D3DEE6; + } + } + + &.curr { + margin: 0; + width: 100%; + + .level-wrap { + height: 100%; + } + } + + .member-info { + display: flex; + align-items: center; + .head-img { + width: 90rpx; + height: 90rpx; + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; + overflow: hidden; + + image { + width: 100%; + height: 100%; + } + } + + .nickname { + color: #fff; + margin: 0 20rpx; + font-size: 28rpx; + } + + .level-name { + font-size: 28rpx; + line-height: 1; + color: #fff; + border: 2rpx solid #fff; + padding: 4rpx 10rpx; + border-radius: 6rpx; + font-size: 26rpx; + color: #f5f5f5; + } + } + + .level-rate { + display: flex; + margin-top: 30rpx; + + .rate-item { + text-align: left; + flex: 1; + } + .title { + color: #f5f5f5; + font-size: 24rpx; + } + .rate { + margin-top: 10rpx; + color: #fff; + font-size: 38rpx; + line-height: 1; + + .percentage { + font-size: 28rpx; + margin-left: 4rpx; + } + } + } + } + + swiper-item { + &:nth-child(1) .level-wrap { + background: linear-gradient(to right, #9BA7B1, #D3DEE6); + } + &:nth-child(2) .level-wrap { + background: linear-gradient(to right, #F57E2A, #FAD494); + } + &:nth-child(3) .level-wrap { + background: linear-gradient(to right, #F85151, #FF9999); + } + &:nth-child(4) .level-wrap { + background: linear-gradient(to right, #78B8B4, #AFE6E2); + } + &:nth-child(5) .level-wrap { + background: linear-gradient(to right, #4DA1E1, #58CBF0); + } + &:nth-child(6) .level-wrap { + background: linear-gradient(to right, #81C636, #D1F677); + } + &:nth-child(7) .level-wrap { + background: linear-gradient(to right, #6D7279, #A5AAB0); + } + &:nth-child(8) .level-wrap { + background: linear-gradient(to right, #866DDB, #D49BFE); + } + &:nth-child(9) .level-wrap { + background: linear-gradient(to right, #f1c74e, #f7dc81); + } + &:nth-child(10) .level-wrap { + background: linear-gradient(to right, #418CCF, #9CC6F1); + } + } +} + +.level-condition { + margin: 30rpx 26rpx; + background: #fff; + padding: 30rpx; + border-radius: 10rpx; + + .condition-title { + display: flex; + align-items: center; + justify-content: space-between; + + .title { + font-size: 32rpx; + font-weight: bolder; + position: relative; + padding-left: 20rpx; + line-height: 1; + + &:before { + content: " "; + position: absolute; + left: 0; + top: 0; + width: 6rpx; + height: 100%; + background-color: $base-color; + border-radius: 4rpx; + } + } + } + + .rate { + .complete { + color: #E7B667; + font-size: 26rpx!important; + font-weight: normal!important; + } + .num { + color: #bbb; + font-size: 26rpx!important; + font-weight: normal!important; + } + } + + .task-item { + padding: 20rpx 30rpx; + background: #F8F8F8; + border-radius: 10rpx; + margin-top: 30rpx; + + .flex-box { + display: flex; + align-items: center; + justify-content: space-between; + } + + .status{ + color: #999; + + &.complete { + color: #000; + } + } + + .title { + font-weight: bold; + + .iconfont { + font-size: 28rpx; + color: #B7B7B7; + margin-left: 10rpx; + } + } + + .desc { + color: #999; + font-size: 24rpx; + } + + .progress { + margin: 16rpx 0; + } + + .complete { + font-size: 24rpx!important; + } + .num { + font-size: 24rpx!important; + } + } +} + +.popup { + width: 100vw; + background: #fff; + border-top-left-radius: 24rpx; + border-top-right-radius: 24rpx; + + .popup-header { + display: flex; + border-bottom: 2rpx solid $color-line; + position: relative; + padding: 40rpx; + + .tit { + flex: 1; + font-size: $font-size-toolbar; + line-height: 1; + text-align: center; + } + .iconfont { + line-height: 1; + position: absolute; + right: 30rpx; + top: 50%; + transform: translate(0, -50%); + color: $color-tip; + font-size: $font-size-toolbar; + } + } + + .popup-body { + height: calc(100% - 250rpx); + padding: 30rpx; + &.store-popup { + height: calc(100% - 120rpx); + } + &.safe-area { + height: calc(100% - 270rpx); + } + &.store-popup.safe-area { + height: calc(100% - 140rpx); + } + } +} \ No newline at end of file diff --git a/pages_promotion/fenxiao/public/css/order.scss b/pages_promotion/fenxiao/public/css/order.scss new file mode 100644 index 0000000..6a786d9 --- /dev/null +++ b/pages_promotion/fenxiao/public/css/order.scss @@ -0,0 +1,206 @@ +/deep/ .fixed { + position: relative; + top: 0; +} +/deep/ .empty { + margin-top: 0 !important; +} +.cart-empty { + padding-top: 208rpx !important; +} +.color-text-green { + color: #11bd64; +} +.color-text-orange { + color: #ffa044; +} +.withdraw-cate { + width: 100%; + height: 90rpx; + display: flex; + box-sizing: border-box; + background: #ffffff; + .cate-li { + flex: 1; + display: flex; + justify-content: center; + align-items: center; + height: 100%; + font-size: 30rpx; + + &.active { + box-sizing: border-box; + position: relative; + } + &.active::after { + position: absolute; + bottom: 0; + left: 0; + content: ''; + width: 100%; + height: 4rpx; + } + } +} +.goods_list { + width: 100%; + height: 100%; + padding: 0 24rpx; + box-sizing: border-box; + margin-top: 18rpx; + .order-item { + padding: 30rpx; + box-sizing: border-box; + border-radius: 10rpx; + background: #ffffff; + position: relative; + margin-bottom: 18rpx; + + .order-header { + display: flex; + align-items: center; + position: relative; + padding-bottom: 24rpx; + line-height: 1; + font-size: $font-size-goods-tag; + + .icon-dianpu { + display: inline-block; + line-height: 1; + margin-right: 12rpx; + } + + .status-name { + flex: 1; + text-align: right; + } + } + + .order-body { + margin-bottom: 24rpx; + .goods-wrap { + display: flex; + position: relative; + + &:last-of-type { + margin-bottom: 0; + } + + .goods-img { + width: 170rpx; + height: 170rpx; + padding: 20rpx 0 0 0; + margin-right: 5rpx; + + image { + width: 100%; + height: 100%; + border-radius: $border-radius; + } + } + + .goods-info { + flex: 1; + position: relative; + padding: 20rpx 0 0 0; + max-width: calc(100% - 200rpx); + margin-left: 18rpx; + display: flex; + flex-direction: column; + + .top-wrap { + flex: 1; + } + + .goods-name { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; + line-height: 1.5; + font-size: $font-size-goods-tag; + color: #000; + } + + .goods-sub-section { + width: 100%; + line-height: 1.5; + display: flex; + align-items: center; + font-size: $font-size-goods-tag; + margin-top: 20rpx; + + .unit { + font-size: $font-size-tag; + margin-right: 2rpx; + } + + view { + flex: 1; + line-height: 1; + &:last-of-type { + text-align: right; + + .iconfont { + line-height: 1; + font-size: $font-size-tag; + } + } + } + } + .order-time { + margin-top: 12rpx; + font-size: $font-size-goods-tag; + color: #838383; + + .goods-price { + font-size: $font-size-goods-tag; + float: right; + color: #000; + } + } + } + } + } + + .order-footer { + padding-top: 24rpx; + .order-base-info { + display: flex; + + .total { + text-align: right; + padding-top: 20rpx; + flex: 1; + font-size: $font-size-goods-tag; + + & > text { + line-height: 1; + } + } + + .order-type { + font-size: $font-size-goods-tag; + + & > text { + line-height: 1; + } + } + } + .order-base-info.active { + .total { + padding-top: 0; + } + .order-type { + padding-top: 0; + } + } + } + } + .order-item:last-child { + border: none; + } +} +.price-color{ + color: var(--price-color); +} \ No newline at end of file diff --git a/pages_promotion/fenxiao/public/js/goods_list.js b/pages_promotion/fenxiao/public/js/goods_list.js new file mode 100644 index 0000000..d315765 --- /dev/null +++ b/pages_promotion/fenxiao/public/js/goods_list.js @@ -0,0 +1,208 @@ +import { Weixin } from '@/common/js/wx-jssdk.js'; +export default { + data() { + return { + loadingType: 'loading', //加载更多状态 + goodsList: [], + isIphoneX: false, + is_fenxiao: false, + currIndex: 0, + poster: '-1', //海报 + posterMsg: '' ,//海报错误信息 + shareUrl: '/pages_promotion/fenxiao/goods_list', + shareType: 'goods' + } + }, + onLoad(options) { + this.isIphoneX = this.$util.uniappIsIPhoneX(); + }, + methods: { + //获取列表 + getGoodsList(mescroll) { + this.$api.sendRequest({ + url: '/fenxiao/api/goods/page', + data: { + page: mescroll.num, + page_size: mescroll.size + }, + success: res => { + let newArr = [] + let msg = res.message; + if (res.code == 0 && res.data) { + newArr = res.data.list; + } else { + this.$util.showToast({ + title: msg + }) + } + mescroll.endSuccess(newArr.length); + //设置列表数据 + if (mescroll.num == 1) this.goodsList = []; //如果是第一页需手动制空列表 + this.goodsList = this.goodsList.concat(newArr); //追加新数据 + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + }, + fail: res => { + //联网失败的回调 + mescroll.endErr(); + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + } + }); + }, + //商品详情 + navToDetailPage(item) { + this.$util.redirectTo('/pages/goods/detail', { + goods_id: item.goods_id + }); + }, + //查询会员信息 + getMemberInfo() { + this.$api.sendRequest({ + url: '/api/member/info', + data: {}, + success: res => { + if (res.code == 0) this.is_fenxiao = Boolean(res.data.is_fenxiao); + else this.is_fenxiao = false; + } + }); + }, + // 分享商品 + shareFn(type,keys){ + this.shareType = type; + if(this.shareType == "fenxiao") + this.openPosterPopup(); + else{ + this.currIndex = keys; + this.$refs.sharePopup.open(); + } + }, + // #ifdef MP-WEIXIN + /** + * 将商品推荐到微信圈子 + */ + openBusinessView() { + if (wx.openBusinessView) { + wx.openBusinessView({ + businessType: 'friendGoodsRecommend', + extraData: { + product: { + item_code: this.goodsList[this.currIndex].goods_id, + title: this.goodsList[this.currIndex].sku_name, + image_list: this.$util.img(this.goodsList[this.currIndex].goods_image) + } + }, + success: function(res) { + console.log('success', res); + }, + fail: function(res) { + console.log('fail', res); + } + }) + } + }, + // #endif + //-------------------------------------海报------------------------------------- + // 打开海报弹出层 + openPosterPopup() { + this.getGoodsPoster(); + this.$refs.sharePopup.close(); + }, + // 关闭海报弹出层 + closePosterPopup() { + this.$refs.posterPopup.close(); + }, + //生成海报 + getGoodsPoster() { + uni.showLoading({ + 'title' : '海报生成中...' + }); + let url = ""; + let data = {}; + if(this.shareType == "goods"){ + url = "/api/goods/poster"; + data.page = "/pages_promotion/fenxiao/goods_list"; + data.qrcode_param = JSON.stringify({goods_id: this.goodsList[this.currIndex].goods_id}); + }else{ + url = "/fenxiao/api/fenxiao/poster"; + // "/pages_promotion/fenxiao/goods_list"; + data.page = "/pages/index/index"; + data.qrcode_param = JSON.stringify({}); + data.template_id = this.templateId[0]; + } + + this.$api.sendRequest({ + url: url, + data: data, + success: res => { + if (res.code == 0) { + this.poster = res.data.path + "?time=" + new Date().getTime(); + this.$refs.posterPopup.open(); + } else { + this.posterMsg = res.message; + } + uni.hideLoading(); + }, + fail: err => { + uni.hideLoading(); + } + }); + }, + // #ifdef MP || APP-PLUS + //小程序中保存海报 + saveGoodsPoster() { + let url = this.$util.img(this.poster); + uni.downloadFile({ + url: url, + success: (res) => { + if (res.statusCode === 200) { + uni.saveImageToPhotosAlbum({ + filePath: res.tempFilePath, + success: () => { + this.$util.showToast({ + title: "保存成功" + }); + }, + fail: () => { + this.$util.showToast({ + title: "保存失败,请稍后重试" + }); + } + }); + } + } + }); + }, + // #endif + // 打开分享弹出层 + openSharePopup() { + this.$refs.sharePopup.open(); + }, + // 关闭分享弹出层 + closeSharePopup() { + this.$refs.sharePopup.close(); + }, + copyUrl() { + let text = this.$config.h5Domain + this.shareUrl; + this.$util.copy(text, () => { + this.closeSharePopup(); + }); + }, + imageError(index) { + this.goodsList[index].sku_image = this.$util.getDefaultImage().goods; + this.$forceUpdate(); + } + }, + /** + * 自定义分享内容 + * @param {Object} res + */ + onShareAppMessage(res) { + var path = this.shareUrl; + return { + title: this.goodsSkuDetail.sku_name, + imageUrl: this.$util.img(this.goodsList[this.currIndex].goods_image, {size: 'big'}), + path: path, + success: res => {}, + fail: res => {} + }; + } +} diff --git a/pages_promotion/fenxiao/ranking_list.vue b/pages_promotion/fenxiao/ranking_list.vue new file mode 100644 index 0000000..7c70976 --- /dev/null +++ b/pages_promotion/fenxiao/ranking_list.vue @@ -0,0 +1,427 @@ + ++ + + ++ ++ ++ 长按识别图中二维码 + + + +保存海报 + + ++ + ++ +提示 + ++ +取消 ++ + + + + + + + + + diff --git a/pages_promotion/fenxiao/relation.vue b/pages_promotion/fenxiao/relation.vue new file mode 100644 index 0000000..5966fe1 --- /dev/null +++ b/pages_promotion/fenxiao/relation.vue @@ -0,0 +1,159 @@ + ++ + ++ ++ ++ + + ++ ++ ++ + ++ +{{info.nickname}} +点击提现 +我的团队 + ++ ++ ++ ++ ++ + +分销佣金 +{{ info.today_commission}}元 ++ ++ ++ ++ + +佣金排行 +您排行第{{ ranking }}名 ++ + ++ ++ ++ ++ + +推广人数 +{{ info.one_child_num}}人 ++ ++ ++ ++ + +推广排行 +您排行第{{ ranking }}名 +佣金排行 +推广排行 + ++ ++ +{{ index + 1 }} ++ ++ ++ {{ item.nickname }} ++ ¥{{ item.total_commission|moneyFormat }} +{{ item.child_num }}人 + ++ ++ + + + + + + + + diff --git a/pages_promotion/fenxiao/team.vue b/pages_promotion/fenxiao/team.vue new file mode 100644 index 0000000..536e585 --- /dev/null +++ b/pages_promotion/fenxiao/team.vue @@ -0,0 +1,360 @@ + ++ + ++ ++ ++ ++ + +{{ orderItem.order_no }} +已退款 +已结算 +待结算 ++ ++ ++ ++ + ++ +{{ orderItem.sku_name }} ++ +返{{ fenxiaoWords.account }} +{{ $lang('common.currencySymbol') }} +{{ orderItem.commission }} ++ ++ +{{ $lang('common.currencySymbol') }} +{{ orderItem.price }} ++ ++ ++ {{ orderItem.num }} + + ++ ++ +{{ $util.timeStampTurnTime(orderItem.create_time) }} + ++ +合计: +{{ $lang('common.currencySymbol') }} +{{ orderItem.real_goods_money }} ++ + + + + + + + + + diff --git a/pages_promotion/fenxiao/withdraw_apply.vue b/pages_promotion/fenxiao/withdraw_apply.vue new file mode 100644 index 0000000..549a7da --- /dev/null +++ b/pages_promotion/fenxiao/withdraw_apply.vue @@ -0,0 +1,457 @@ + ++ ++ ++ {{ item.name }} + ++ + ++ ++ ++ ++ + + ++ ++ ++ ++ +{{ item.nickname }} +{{ fenxiaoWords.fenxiao_name }} +加入时间:{{ $util.timeStampTurnTime(item.bind_fenxiao_time).substring(0, 10) }} ++ ++ {{ item.one_child_fenxiao_num + item.one_child_num }} 人+ {{ item.order_num }} 单+ {{ item.order_money|moneyFormat }} 元+ ++ ++ ++ +{{ item.nickname }} +加入时间:{{ $util.timeStampTurnTime(item.bind_fenxiao_time).substring(0, 10) }} ++ ++ 0 人+ {{ item.order_num }} 单+ {{ item.order_money|moneyFormat }} 元+ ++ + + + + + + + + + diff --git a/pages_promotion/fenxiao/withdraw_list.vue b/pages_promotion/fenxiao/withdraw_list.vue new file mode 100644 index 0000000..b0938d4 --- /dev/null +++ b/pages_promotion/fenxiao/withdraw_list.vue @@ -0,0 +1,212 @@ + ++ ++ +提现到 +微信默认钱包 +{{ bankAccountInfo.bank_account }} ++ ++ + ++ + ++ 请添加提现账户 ++ +提现到 +余额 ++ ++ + + + + +提现金额: ++ +{{ $lang('common.currencySymbol') }} + ++ + ++ +可提现佣金:{{ $lang('common.currencySymbol') }}{{ withdrawInfo.account | moneyFormat }} +全部提现 ++ +最小提现金额为{{ $lang('common.currencySymbol') }}{{ withdrawConfigInfo.withdraw | moneyFormat }}, +最大提现金额为{{ $lang('common.currencySymbol') }}{{ (withdrawConfigInfo.max > withdrawInfo.account ? withdrawInfo.account : withdrawConfigInfo.max) | moneyFormat }}, +手续费为{{ withdrawConfigInfo.withdraw_rate + '%' }} ++ 提现 + + ++ 提现记录 + + + + + + + diff --git a/pages_promotion/fenxiao/withdrawal_detail.vue b/pages_promotion/fenxiao/withdrawal_detail.vue new file mode 100644 index 0000000..2fd4f08 --- /dev/null +++ b/pages_promotion/fenxiao/withdrawal_detail.vue @@ -0,0 +1,131 @@ + ++ ++ ++ ++ ++ ++ ++ +{{ item.transfer_type=='balance'&&'余额' || item.transfer_type=='alipay'&&'支付宝' || item.transfer_type=='bank'&&'银行卡' || item.transfer_type=='wechatpay'&&'微信' }} ++ +{{ $util.timeStampTurnTime(item.create_time) }} ++ +¥{{ item.money }} +{{ item.status_name }} ++ ++ + + + + + + + + diff --git a/pages_promotion/game/cards.vue b/pages_promotion/game/cards.vue new file mode 100644 index 0000000..dc020f8 --- /dev/null +++ b/pages_promotion/game/cards.vue @@ -0,0 +1,475 @@ + ++ + + +-{{ detail.money }} ++ + ++ +当前状态 +{{ detail.status_name }} ++ +交易号 +{{ detail.withdraw_no }} ++ +手续费 +¥{{ detail.withdraw_rate_money }} ++ +申请时间 +{{ $util.timeStampTurnTime(detail.create_time) }} ++ +审核时间 +{{ $util.timeStampTurnTime(detail.audit_time) }} ++ +银行名称 +{{ detail.bank_name }} ++ +收款账号 +{{ detail.account_number }} ++ +拒绝理由 +{{ detail.refuse_reason }} ++ +转账方式名称 +{{ detail.transfer_name }} ++ +转账时间 +{{ $util.timeStampTurnTime(detail.payment_time) }} ++ + + + + + + + + diff --git a/pages_promotion/game/public/css/cards.scss b/pages_promotion/game/public/css/cards.scss new file mode 100644 index 0000000..964ab2c --- /dev/null +++ b/pages_promotion/game/public/css/cards.scss @@ -0,0 +1,303 @@ +.container { + width: 100vw; + min-height: 100vh; + background-image: linear-gradient(#f3623f, #f74222); +} +.add-point { + pointer-events: none; +} + +.head-wrap { + position: relative; + + image { + width: 100%; + display: block; + } + + .rule-mark { + position: absolute; + right: 0; + top: 60rpx; + background-color: #ffe854; + color: #ff7908; + height: 60rpx; + line-height: 60rpx; + padding: 0 30rpx; + border-top-left-radius: 60rpx; + border-bottom-left-radius: 60rpx; + } +} + +.prize-area { + margin: 0 auto; + width: 85%; + position: relative; + line-height: 1; + transform: translateY(-420rpx); + + image { + width: 100%; + } + + .content-wrap { + position: absolute; + width: 500rpx; + height: 300rpx; + z-index: 4; + left: 70rpx; + top: 210rpx; + + & > view { + position: relative; + width: 100%; + height: 100%; + } + } + + .canvas-shade { + width: 100%; + height: 100%; + position: absolute; + z-index: 5; + background: #e5e5e5; + } + + .canvas { + width: 100%; + height: 100%; + position: absolute; + z-index: 6; + } + + .result-wrap { + width: 100%; + height: 100%; + position: absolute; + left: 0; + top: 0; + z-index: 3; + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; + background-color: #fff5e9; + + .title { + font-size: 28rpx; + line-height: 1; + } + + .text { + font-size: 52rpx; + font-weight: 800; + text-align: center; + line-height: 1; + margin-top: 20rpx; + } + + .tips { + font-size: 24rpx; + color: #999; + line-height: 1; + margin-top: 20rpx; + } + } + + .guide-wrap { + width: 100%; + height: 100%; + position: absolute; + left: 0; + top: 0; + z-index: 10; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + + .text { + letter-spacing: 12rpx; + color: #999; + } + + .btn { + line-height: 1; + padding: 22rpx 90rpx; + color: #fff; + display: inline-block; + border-radius: 50rpx; + margin-top: 10rpx; + } + + .btn.disabled { + background-color: #ccc !important; + } + } +} + +.action-text { + margin: 60rpx 50rpx 0 50rpx; + display: flex; + transform: translateY(-420rpx); + + & > view { + flex: 1; + line-height: 1; + } + + .point { + color: #fee331; + } + + .record { + color: #fff; + text-align: right; + } +} + +.record-wrap { + transform: translateY(-420rpx); + margin: 80rpx 50rpx 30rpx 50rpx; + border-radius: 10rpx; + background-color: #ff6e43; + padding: 12rpx; + box-shadow: 0 0.45em 0 rgba(217, 42, 0, 1); + position: relative; + height: 430rpx; + + .head { + border: 6rpx solid #ff6e43; + box-shadow: inset 0 0 10rpx 0 #d92a00, 0 0.45em 0 rgba(217, 42, 0, 1); + background-color: #da2b00; + position: absolute; + z-index: 5; + text-align: center; + width: 300rpx; + height: 70rpx; + line-height: 70rpx; + border-radius: 70rpx; + top: 0; + left: 50%; + transform: translate(-50%, -50%); + color: #fff; + font-weight: 600; + letter-spacing: 4rpx; + } + + .body-shade { + width: calc(100% - 24rpx); + height: 60rpx; + top: 12rpx; + left: 12rpx; + background-color: #da2b00; + z-index: 5; + position: absolute; + z-index: 2; + border-radius: 8rpx; + } + + .body { + background-color: #da2b00; + border-radius: 8rpx; + height: 340rpx; + box-shadow: inset 0 0 10rpx 0 #d92a00; + padding: 60rpx 30rpx 30rpx 30rpx; + overflow: hidden; + + .wrap { + & > view { + display: flex; + } + + &.animate { + transition: all 1s ease-in-out; + transform: translateY(-60rpx); + } + } + + .tit { + line-height: 60rpx; + width: 220rpx; + color: #fff; + } + + .txt { + line-height: 60rpx; + flex: 1; + color: #fee331; + } + } +} +.remain-box { + width: 100%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; +} +.remain { + min-width: 550rpx; + height: 54rpx; + background: rgba($color: #000000, $alpha: 0.1); + line-height: 54rpx; + border-radius: 10rpx; + margin: 0 auto; + text-align: center; + transform: translateY(-390rpx); + color: rgba($color: #ffffff, $alpha: 1); + padding: 0 25rpx; + font-size: 24rpx; +} +.rule-wrap { + border-radius: 10rpx; + background-color: #ffd697; + width: 80vw; + padding: 12rpx; + box-sizing: border-box; + + .content-wrap { + background-color: #fff2dd; + width: 100%; + border-radius: 8rpx; + position: relative; + + .rule-head { + width: 100%; + position: absolute; + transform: translateY(-50%); + left: 0; + top: 0; + } + + .rule { + height: 560rpx; + padding: 80rpx 30rpx 0 30rpx; + box-sizing: border-box; + + .tit { + font-weight: 600; + color: #da2b00; + margin-top: 10rpx; + } + .text { + font-size: $font-size-sub; + color: #da2b00; + } + } + + .icon-round-close { + color: #fff; + text-align: center; + position: absolute; + bottom: -150rpx; + left: 50%; + transform: translateX(-50%); + font-size: 70rpx; + } + } +} +.warn { + margin-top: 20rpx; + border-radius: 20rpx; +} diff --git a/pages_promotion/game/public/css/egg.scss b/pages_promotion/game/public/css/egg.scss new file mode 100644 index 0000000..0d861d0 --- /dev/null +++ b/pages_promotion/game/public/css/egg.scss @@ -0,0 +1,316 @@ +.container { + width: 100vw; + height: 100vh; + background-image: linear-gradient(#f3623f, #f74222); +} + +.head-wrap { + position: relative; + + image { + width: 100%; + margin: 0 auto; + display: block; + } + + .rule-mark { + position: absolute; + right: 0; + top: 60rpx; + background-color: #ffe854; + color: #ff7908; + height: 60rpx; + line-height: 60rpx; + padding: 0 30rpx; + border-top-left-radius: 60rpx; + border-bottom-left-radius: 60rpx; + } +} + +.status-wrap { + transform: translateY(-340rpx); + text-align: center; + + .mark { + display: inline-block; + line-height: 1; + padding: 16rpx 60rpx; + background-color: #d17e1f; + color: #fff; + border-radius: 60rpx; + } + + .num { + color: #ffe821; + font-size: 32rpx; + margin: 0 4rpx; + display: inline-block; + } +} + +.eggs-wrap { + display: flex; + width: 90%; + margin: 0 auto; + transform: translateY(-300rpx); + + .box { + flex: 1; + text-align: center; + + image { + width: 90%; + } + } +} + +.action-text { + margin: 0 50rpx; + display: flex; + transform: translateY(-300rpx); + margin: 60rpx 50rpx 0 50rpx; + + & > view { + flex: 1; + line-height: 1; + } + + .point { + color: #fee331; + } + + .record { + color: #fff; + text-align: right; + } +} + +.record-wrap { + transform: translateY(-300rpx); + margin: 80rpx 50rpx 30rpx 50rpx; + border-radius: 10rpx; + background-color: #ff6e43; + padding: 12rpx; + box-shadow: 0 0.45em 0 rgba(217, 42, 0, 1); + position: relative; + height: 430rpx; + + .body-shade { + width: calc(100% - 24rpx); + height: 60rpx; + top: 12rpx; + left: 12rpx; + background-color: #da2b00; + z-index: 5; + position: absolute; + z-index: 2; + border-radius: 8rpx; + } + + .head { + border: 6rpx solid #ff6e43; + box-shadow: inset 0 0 10rpx 0 #d92a00, 0 0.45em 0 rgba(217, 42, 0, 1); + background-color: #da2b00; + position: absolute; + z-index: 5; + text-align: center; + width: 300rpx; + height: 70rpx; + line-height: 70rpx; + border-radius: 70rpx; + top: 0; + left: 50%; + transform: translate(-50%, -50%); + color: #fff; + font-weight: 600; + letter-spacing: 4rpx; + } + + .body { + background-color: #da2b00; + border-radius: 8rpx; + height: 340rpx; + box-shadow: inset 0 0 10rpx 0 #d92a00; + padding: 60rpx 30rpx 30rpx 30rpx; + overflow: hidden; + + .wrap { + & > view { + display: flex; + } + + &.animate { + transition: all 1s ease-in-out; + transform: translateY(-60rpx); + } + } + + .tit { + line-height: 60rpx; + width: 220rpx; + color: #fff; + } + + .txt { + line-height: 60rpx; + flex: 1; + color: #fee331; + } + } +} + +.transition-popup { + .wrap { + position: relative; + padding: 0 100rpx; + + .eggs { + width: 380rpx; + } + + .hammer { + position: absolute; + width: 80rpx; + top: -60rpx; + right: 60rpx; + transform-origin: bottom right; + transform: rotate(-45deg); + animation: chuizi 1.1s ease 3; + } + } +} + +.result-wrap { + position: relative; + + .bg-img { + width: 80vw; + } + + .content-wrap { + position: absolute; + z-index: 5; + width: 100%; + height: 100%; + top: 0; + left: 0; + text-align: center; + + .look { + margin: 70rpx auto 0 auto; + display: block; + width: 120rpx; + } + + .msg { + margin: 10rpx auto 0 auto; + padding: 0 20rpx; + color: #da2b00; + width: 70%; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .btn { + width: 50%; + height: 70rpx; + line-height: 70rpx; + border-radius: 70rpx; + text-align: center; + color: #da2b00; + background: linear-gradient(#ffe1ac, #fec965); + margin: 146rpx auto 0 auto; + } + + .icon-round-close { + position: absolute; + color: #fff; + font-size: 70rpx; + top: -120rpx; + right: 0rpx; + } + } + + .yes { + .look { + width: 80rpx; + height: 80rpx; + margin-top: 60rpx; + } + + .btn { + margin-top: 160rpx; + } + } +} + +.rule-wrap { + border-radius: 10rpx; + background-color: #ffd697; + width: 80vw; + padding: 12rpx; + box-sizing: border-box; + + .content-wrap { + background-color: #fff2dd; + width: 100%; + border-radius: 8rpx; + position: relative; + + .rule-head { + width: 100%; + position: absolute; + transform: translateY(-50%); + left: 0; + top: 0; + } + + .rule { + height: 560rpx; + padding: 80rpx 30rpx 0 30rpx; + box-sizing: border-box; + + .tit { + font-weight: 600; + color: #da2b00; + margin-top: 10rpx; + } + .text { + font-size: $font-size-sub; + color: #da2b00; + } + } + + .icon-round-close { + color: #fff; + text-align: center; + position: absolute; + bottom: -150rpx; + left: 50%; + transform: translateX(-50%); + font-size: 70rpx; + } + } +} + +@keyframes chuizi { + 0% { + -moz-transform: rotate(-45); + -ms-transform: rotate(-45); + -webkit-transform: rotate(-45); + transform: rotate(-45deg); + } + 30% { + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -moz-transform: rotate(-45); + -ms-transform: rotate(-45); + -webkit-transform: rotate(-45); + transform: rotate(-45); + } +} diff --git a/pages_promotion/game/public/css/turntable.scss b/pages_promotion/game/public/css/turntable.scss new file mode 100644 index 0000000..e2c1952 --- /dev/null +++ b/pages_promotion/game/public/css/turntable.scss @@ -0,0 +1,403 @@ +.container { + width: 100vw; + height: 100vh; + background-image: linear-gradient(#f3623f, #f74222); +} + +.head-wrap { + position: relative; + + image { + width: 90%; + margin: 0 auto; + display: block; + } + + .rule-mark { + position: absolute; + right: 0; + top: 60rpx; + background-color: #ffe854; + color: #ff7908; + height: 60rpx; + line-height: 60rpx; + padding: 0 30rpx; + border-top-left-radius: 60rpx; + border-bottom-left-radius: 60rpx; + } +} + +.turntable-wrap { + margin: 30rpx; + padding: 70rpx 50rpx 70rpx 70rpx; + background-size: 100% 100%; + border-radius: 16rpx; + transform: translateY(-200rpx); + + .wrap { + width: 100%; + position: relative; + overflow: hidden; + height: 536rpx; + } + + .star-box { + position: absolute; + width: calc(33.33333333% - 20rpx); + height: 100rpx; + background: linear-gradient(#ffe1ac, #fec965); + top: 182rpx; + left: 33.33333333%; + height: 162rpx; + border-radius: 8rpx; + box-shadow: 0 0.25em 0 rgba(225, 157, 31, 1); + text-align: center; + + .text { + font-size: 34rpx; + margin: 30rpx 0 0 0; + line-height: 60rpx; + font-weight: 600; + color: #ff3301; + text-align: center; + + &.no-tips { + margin-top: 50rpx; + } + } + + .tips { + font-size: 24rpx; + display: inline-block; + margin: 0 auto; + background: #f0a71d; + line-height: 1; + color: #ff3301; + padding: 6rpx 12rpx; + border-radius: 24rpx; + } + + &.disabled { + box-shadow: 0 0.25em 0 #999; + background: linear-gradient(#ccc, #aaa); + + .text { + color: #888; + } + + .tips { + color: #777; + background: #aaa; + } + } + } + + .status-box { + position: absolute; + width: calc(33.33333333% - 20rpx); + height: 100rpx; + background: #ed9580; + top: 182rpx; + left: 33.33333333%; + height: 168rpx; + border-radius: 8rpx; + text-align: center; + padding: 0 20rpx; + box-sizing: border-box; + + view { + color: #fff; + font-size: 32rpx; + letter-spacing: 4rpx; + margin-top: 30rpx; + } + } + + .award-wrap { + width: 33.33333333%; + padding-right: 20rpx; + position: absolute; + box-sizing: border-box; + + .box { + width: 100%; + background: #fff; + border-radius: 8rpx; + padding: 20rpx 0; + box-shadow: inset 0 0 48rpx 0 #ffd6ab, 0 0.25em 0 rgba(248, 166, 131, 0.96); + + &.on { + background: linear-gradient(#ffe1ac, #fec965); + box-shadow: 0 0.25em 0 rgba(225, 157, 31, 1); + + .award-text { + color: #ff3301; + } + } + + .award-img { + width: 70rpx; + height: 70rpx; + margin: 0 auto; + display: flex; + align-items: center; + + image { + width: 70rpx; + height: auto; + } + } + + .award-text { + text-align: center; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin-top: 10rpx; + font-size: 24rpx; + padding: 0 20rpx; + color: #666; + } + } + + &:nth-child(1) { + top: 0; + } + &:nth-child(2) { + top: 0; + left: 33.33333333%; + } + &:nth-child(3) { + top: 0; + left: 66.66666666%; + } + &:nth-child(4) { + top: 182rpx; + left: 66.66666666%; + } + &:nth-child(5) { + top: 364rpx; + left: 66.66666666%; + } + &:nth-child(6) { + top: 364rpx; + left: 33.33333333%; + } + &:nth-child(7) { + top: 364rpx; + left: 0; + } + &:nth-child(8) { + top: 182rpx; + left: 0; + } + } +} + +.action-text { + margin: 0 50rpx; + display: flex; + transform: translateY(-200rpx); + + & > view { + flex: 1; + line-height: 1; + } + + .point { + color: #fee331; + } + + .record { + color: #fff; + text-align: right; + } +} + +.record-wrap { + transform: translateY(-200rpx); + margin: 80rpx 50rpx 30rpx 50rpx; + border-radius: 10rpx; + background-color: #ff6e43; + padding: 12rpx; + box-shadow: 0 0.45em 0 rgba(217, 42, 0, 1); + position: relative; + height: 430rpx; + + .body-shade { + width: calc(100% - 24rpx); + height: 60rpx; + top: 12rpx; + left: 12rpx; + background-color: #da2b00; + z-index: 5; + position: absolute; + z-index: 2; + border-radius: 8rpx; + } + + .head { + border: 6rpx solid #ff6e43; + box-shadow: inset 0 0 10rpx 0 #d92a00, 0 0.45em 0 rgba(217, 42, 0, 1); + background-color: #da2b00; + position: absolute; + z-index: 5; + text-align: center; + width: 300rpx; + height: 70rpx; + line-height: 70rpx; + border-radius: 70rpx; + top: 0; + left: 50%; + transform: translate(-50%, -50%); + color: #fff; + font-weight: 600; + letter-spacing: 4rpx; + } + + .body { + background-color: #da2b00; + border-radius: 8rpx; + height: 340rpx; + box-shadow: inset 0 0 10rpx 0 #d92a00; + padding: 60rpx 30rpx 30rpx 30rpx; + overflow: hidden; + + .wrap { + & > view { + display: flex; + } + + &.animate { + transition: all 1s ease-in-out; + transform: translateY(-60rpx); + } + } + + .tit { + line-height: 60rpx; + width: 220rpx; + color: #fff; + } + + .txt { + line-height: 60rpx; + flex: 1; + color: #fee331; + } + } +} + +.result-wrap { + position: relative; + + .bg-img { + width: 80vw; + } + + .content-wrap { + position: absolute; + z-index: 5; + width: 100%; + height: 100%; + top: 0; + left: 0; + text-align: center; + + .look { + margin: 70rpx auto 0 auto; + display: block; + width: 120rpx; + } + + .msg { + margin: 10rpx auto 0 auto; + padding: 0 20rpx; + color: #da2b00; + width: 70%; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .btn { + width: 50%; + height: 70rpx; + line-height: 70rpx; + border-radius: $border-radius; + text-align: center; + color: #da2b00; + background: linear-gradient(#ffe1ac, #fec965); + margin: 146rpx auto 0 auto; + } + + .icon-round-close { + position: absolute; + color: #fff; + font-size: 70rpx; + top: -120rpx; + right: 0rpx; + } + } + + .yes { + .look { + width: 80rpx; + height: 80rpx; + margin-top: 60rpx; + } + + .btn { + margin-top: 214rpx; + } + } +} + +.rule-wrap { + border-radius: 10rpx; + background-color: #ffd697; + width: 80vw; + padding: 12rpx; + box-sizing: border-box; + + .content-wrap { + background-color: #fff2dd; + width: 100%; + border-radius: 8rpx; + position: relative; + + .rule-head { + width: 100%; + position: absolute; + transform: translateY(-50%); + left: 0; + top: 0; + } + + .rule { + height: 560rpx; + padding: 80rpx 30rpx 0 30rpx; + box-sizing: border-box; + + .tit { + font-weight: 600; + color: #da2b00; + margin-top: 10rpx; + } + .text { + font-size: $font-size-sub; + color: #da2b00; + } + } + + .icon-round-close { + color: #fff; + text-align: center; + position: absolute; + bottom: -150rpx; + left: 50%; + transform: translateX(-50%); + font-size: 70rpx; + } + } +} diff --git a/pages_promotion/game/record.vue b/pages_promotion/game/record.vue new file mode 100644 index 0000000..f89517f --- /dev/null +++ b/pages_promotion/game/record.vue @@ -0,0 +1,136 @@ + ++ + + ++ + ++ 规则 ++ + ++ ++ ++ + ++ +刮开试试手气 ++ 点我刮奖{{ '(' + gameInfo.points + '积分)' }} + ++ 活动尚未开始 + 活动已经结束 + + + + + + + + ++ +恭喜您中奖了 +{{ result.award_name }} + +可到“我的中奖记录”中查看 ++ +{{ gameInfo.no_winning_desc }} + ++ + + +我的积分:{{ point }} +我的中奖记录 ++ ++ 中奖名单 ++ ++ ++ +{{ item.member_nick_name | cover }} ++ ++ 获得 {{ item.award_name }} + + + ++ ++ ++ + ++ +活动时间 +{{ $util.timeStampTurnTime(gameInfo.start_time) }} - {{ $util.timeStampTurnTime(gameInfo.end_time) }} +参与规则 +每个用户活动期间共有{{ gameInfo.join_frequency }}次抽奖机会。 +每个用户活动期间每天都有{{ gameInfo.join_frequency }}次抽奖机会,每天0点更新。 +每次抽奖需消耗 {{ gameInfo.points }} 积分 +该活动只有{{ gameInfo.level_name }}等级的会员可参与。 ++ +活动说明 +{{ gameInfo.remark }} ++ + + + + + + + + + diff --git a/pages_promotion/game/smash_eggs.vue b/pages_promotion/game/smash_eggs.vue new file mode 100644 index 0000000..6b11124 --- /dev/null +++ b/pages_promotion/game/smash_eggs.vue @@ -0,0 +1,407 @@ + ++ ++ ++ ++ ++ + + + +{{ item.award_name }} +奖励详情:{{ item.point }}个积分 +奖励详情:{{ item.balance }}元红包 +奖励详情:优惠券“{{ item.relate_name }}” +中奖时间:{{ $util.timeStampTurnTime(item.create_time) }} +查看 +查看 +查看 ++ + + + + + + + + + + diff --git a/pages_promotion/game/turntable.vue b/pages_promotion/game/turntable.vue new file mode 100644 index 0000000..420f58f --- /dev/null +++ b/pages_promotion/game/turntable.vue @@ -0,0 +1,436 @@ + ++ ++ + ++ 规则 ++ + ++ ++ 您还有 + +{{ gameInfo.surplus_num }} + 次机会 +请先进行登录 ++ 活动尚未开始 + 活动已经结束 + + + ++ + + + + + +我的积分:{{ point }} +我的中奖记录 ++ + ++ 中奖名单 ++ ++ ++ +{{ item.member_nick_name | cover }} ++ ++ 获得 {{ item.award_name }} + + + + ++ ++ ++ + + + + + + ++ ++ ++ ++ + + + + 恭喜您抽中{{ result.point }}个积分 +恭喜您抽中{{ result.balance }}元红包 +恭喜您抽中优惠券“{{ result.relate_name }}” + +继续抽奖 ++ + + ++ ++ {{ gameInfo.no_winning_desc }} +继续抽奖 ++ + + + ++ ++ ++ + ++ +活动时间 +{{ $util.timeStampTurnTime(gameInfo.start_time) }} - {{ $util.timeStampTurnTime(gameInfo.end_time) }} +参与规则 +每个用户活动期间共有{{ gameInfo.join_frequency }}次抽奖机会。 +每个用户活动期间每天都有{{ gameInfo.join_frequency }}次抽奖机会,每天0点更新。 +每次抽奖需消耗 {{ gameInfo.points }} 积分 +该活动只有{{ gameInfo.level_name }}等级的会员可参与。 ++ +活动说明 +{{ gameInfo.remark }} ++ + + + + + + + + + + diff --git a/pages_promotion/giftcard/card_info.vue b/pages_promotion/giftcard/card_info.vue new file mode 100644 index 0000000..03b805e --- /dev/null +++ b/pages_promotion/giftcard/card_info.vue @@ -0,0 +1,469 @@ + ++ + + ++ ++ 规则 ++ ++ ++ ++ ++ {{ item.award_name }} ++ ++ ++ +立即抽奖 +剩余{{ gameInfo.surplus_num }}次 ++ ++ +立即抽奖 +剩余{{ gameInfo.surplus_num }}次 ++ ++ 活动尚未开始 + ++ 活动已经结束 + + +我的积分:{{ point }} +我的中奖记录 ++ ++ 中奖名单 ++ ++ ++ +{{ item.member_nick_name | cover }} ++ ++ 获得 {{ item.award_name }} + + + + ++ ++ ++ ++ 恭喜您抽中{{ gameInfo.award[resultIndex].award_name }} +继续抽奖 ++ + + ++ ++ {{ gameInfo.no_winning_desc }} +继续抽奖 ++ + + + ++ ++ ++ + ++ +活动时间 +{{ $util.timeStampTurnTime(gameInfo.start_time) }} - {{ $util.timeStampTurnTime(gameInfo.end_time) }} +参与规则 +每个用户活动期间共有{{ gameInfo.join_frequency }}次抽奖机会。 +每个用户活动期间每天都有{{ gameInfo.join_frequency }}次抽奖机会,每天0点更新。 +每次抽奖需消耗 {{ gameInfo.points }} 积分 +该活动只有{{ gameInfo.level_name }}等级的会员可参与。 ++ +活动说明 +{{ gameInfo.remark }} ++ + + + + + ++ ++ + {{cardInfo.balance}}元储值卡 + ++ ++ + +本礼品卡包含以下商品 +以下商品在使用时任选{{cardInfo.card_right_goods_count}}件 ++ ++ ++ + +{{item.sku_name}} ++ ++ + +x {{item.total_num}} ++ ++ ++ +过期时间: +{{cardInfo.valid_time > 0 ? $util.timeStampTurnTime(cardInfo.valid_time) : '永久有效'}} ++ +赠送人: +{{cardInfo.from_member_nickname}} ++ +商户电话: +{{shopInfo.mobile}} ++ +使用须知: ++ ++ + + + + + ++ + + ++ + + + + + + + + + + \ No newline at end of file diff --git a/pages_promotion/giftcard/card_use.vue b/pages_promotion/giftcard/card_use.vue new file mode 100644 index 0000000..1d513d7 --- /dev/null +++ b/pages_promotion/giftcard/card_use.vue @@ -0,0 +1,1175 @@ + ++ ++ ++ ++ + +您的{{cardInfo.balance}}元储值卡 +已放入您的账户中 ++ + + + + + + + + + diff --git a/pages_promotion/giftcard/detail.vue b/pages_promotion/giftcard/detail.vue new file mode 100644 index 0000000..031d338 --- /dev/null +++ b/pages_promotion/giftcard/detail.vue @@ -0,0 +1,526 @@ + ++ + ++ +确认订单 ++ + + + + ++ + + + + + + + ++ ++ 购买虚拟类商品需填写手机号,方便商家与您联系 + + ++ 手机号码 + ++ + ++ ++ {{ item.title }} + + ++ + + ++ ++ +{{ memberAddress.name ? memberAddress.name : '' }} +{{ memberAddress.mobile ? memberAddress.mobile : '' }} ++ {{ memberAddress.full_address ? memberAddress.full_address : '' }} {{ memberAddress.address ? memberAddress.address : '' }} + ++ + +请设置收货地址 ++ + + + + ++ ++ ++ ++ 由 + +{{ storeInfo.store_name }} + 提供配送 ++ +点击切换 ++ + ++ 您的附近没有可配送的门店,请选择其他配送方式 + ++ +{{ localMemberAddress.name ? localMemberAddress.name : '' }} +{{ localMemberAddress.mobile ? localMemberAddress.mobile : '' }} ++ {{ localMemberAddress.full_address ? localMemberAddress.full_address : '' }} + {{ localMemberAddress.address ? localMemberAddress.address : '' }} + ++ + ++ +送达时间 ++ +{{ deliveryTime ? deliveryTime : '请选择送达时间' }} ++ + + +请设置收货地址 ++ + + + + + ++ ++ ++ ++ ++ +{{ storeInfo.store_name }} ++ +营业时间:{{ storeInfo.open_date }} +{{ storeInfo.full_address }} {{ storeInfo.address }} ++ + ++ +预留手机 + ++ +提货时间 ++ {{ deliveryTime }} + ++ 当前无自提门店,请选择其它配送方式 ++ + + + + ++ + ++ ++ ++ ++ + +{{ goodsItem.sku_name }} ++ ++ ++ +{{ x.spec_value_name }} ++ ++ ++ + + + + +x +{{ goodsItem.num }} ++ ++ + + + + + + + ++ + + + + + + + + + ++ ++ +已为您甄选出附近所有相关门店 ++ + ++ ++ ++ ++ +{{ item.store_name }} +({{ item.distance }}km) ++ ++ 营业时间:{{ item.open_date }} + ++ 地址:{{ item.full_address }}{{ item.address }} + ++ ++ 所选择收货地址附近没有可以自提的门店 ++ + + ++ ++ +买家留言 ++ + ++ ++ ++ + ++ +确定 ++ + + ++ ++ +买家信息 ++ + ++ + 确定 + + + + + + + + + + + + \ No newline at end of file diff --git a/pages_promotion/giftcard/exchange.vue b/pages_promotion/giftcard/exchange.vue new file mode 100644 index 0000000..2e5d6fa --- /dev/null +++ b/pages_promotion/giftcard/exchange.vue @@ -0,0 +1,179 @@ + ++ + ++ ++ + {{giftDetail.balance}}元储值卡 + ++ ++ 选择卡面 ++ + ++ ++ ++ + ++ +以下商品 在使用时任选{{giftDetail.card_right_goods_count}}件 +本礼品卡包含以下商品 ++ + ++ ++ + +{{item.sku_info.sku_name}} ++ ++ + +x{{item.goods_num}} ++ + +使用须知 ++ ++ ++ + + +卡片详情 ++ ++ ++ + ++ + + ++ +销售价 +¥ +{{giftDetail.card_price}} ++ + ++ + +使用须知 ++ ++ ++ + + +卡片详情 ++ ++ ++ + ++ + ++ +销售价 +¥ +{{giftDetail.card_price}} ++ + + + + + + + + + + diff --git a/pages_promotion/giftcard/give.vue b/pages_promotion/giftcard/give.vue new file mode 100644 index 0000000..40ef4f3 --- /dev/null +++ b/pages_promotion/giftcard/give.vue @@ -0,0 +1,456 @@ + ++ +卡密兑换 ++ ++ + + ++ + + + +我的兑换列表 ++ + + + + + + diff --git a/pages_promotion/giftcard/give_info.vue b/pages_promotion/giftcard/give_info.vue new file mode 100644 index 0000000..0de812f --- /dev/null +++ b/pages_promotion/giftcard/give_info.vue @@ -0,0 +1,435 @@ + ++ +文字祝福 +(自定义) + + + ++ + + ++ + + + + + ++ ++ +分享 ++ + ++ + + + ++ + + ++ + + ++ + ++ 取消分享 + ++ + + + ++ ++ + 保存图片 + + +长按保存图片 + ++ + {{ posterMsg }} ++ + + ++ + + + + + + + + \ No newline at end of file diff --git a/pages_promotion/giftcard/give_list.vue b/pages_promotion/giftcard/give_list.vue new file mode 100644 index 0000000..bb85782 --- /dev/null +++ b/pages_promotion/giftcard/give_list.vue @@ -0,0 +1,298 @@ + ++ ++ + ++ + ++ + ++ ++ + +{{cardInfo.member_nickname}} ++ ++ 送您「{{cardInfo.card_name}}」 + +{{cardInfo.blessing}} ++ + + + + ++ + ++ ++ ++ ++ + +恭喜您 +成功领取了1张礼品卡 ++ + + + + + + + + diff --git a/pages_promotion/giftcard/index.vue b/pages_promotion/giftcard/index.vue new file mode 100644 index 0000000..5237b34 --- /dev/null +++ b/pages_promotion/giftcard/index.vue @@ -0,0 +1,452 @@ + ++ + ++ + ++ + ++ ++ + ++ + + ++ ++ + {{item.balance}}元储值卡 + ++ ++ + ++ 暂无卡片记录 ++ + + + + + + + + + \ No newline at end of file diff --git a/pages_promotion/giftcard/list.vue b/pages_promotion/giftcard/list.vue new file mode 100644 index 0000000..07d8aeb --- /dev/null +++ b/pages_promotion/giftcard/list.vue @@ -0,0 +1,470 @@ + ++ ++ + + ++ ++ {{item.category_name}} ++ + ++ ++ ++ + {{card.balance}}元储值卡 + ++ ++ {{card.card_name}} ++ + + ++ + ++ ++ ++ + {{ item.text }} + ++ + + ++ ++ 首页 ++ + ++ 我的 ++ + +快捷 +导航 ++ + + + + + + + + + \ No newline at end of file diff --git a/pages_promotion/giftcard/member.vue b/pages_promotion/giftcard/member.vue new file mode 100644 index 0000000..852bffe --- /dev/null +++ b/pages_promotion/giftcard/member.vue @@ -0,0 +1,460 @@ + ++ + ++ ++ + ++ ++ 全部 + 待使用 + 已使用 + 已过期 + + ++ ++ + ++ + + ++ + ++ + {{item.balance}}元储值卡 + ++ ++ + ++ + + ++ ++ + + ++ ++ 暂无卡片记录 ++ + + ++ + ++ ++ ++ + {{ item.text }} + ++ + + + + + + + + diff --git a/pages_promotion/giftcard/member_give_info.vue b/pages_promotion/giftcard/member_give_info.vue new file mode 100644 index 0000000..d6377b4 --- /dev/null +++ b/pages_promotion/giftcard/member_give_info.vue @@ -0,0 +1,384 @@ + ++ + ++ + + ++ ++ ++ + + +{{ memberInfo.nickname}} +手机号码:{{ memberInfo.mobile}} ++ ++ ++ 登录/注册 ++ + ++ ++ +收到的卡片 +可赠送他人 ++ +送出的卡片 +查看送出的卡片 ++ + +常用功能 ++ ++ ++ ++ 购买历史 ++ ++ + ++ ++ 我的卡包 ++ ++ + ++ ++ 卡密激活 ++ ++ + ++ + ++ ++ ++ + {{ item.text }} + ++ + + + + + ++ ++ 首页 ++ + ++ 我的 ++ + +快捷 +导航 ++ + + + + + + + \ No newline at end of file diff --git a/pages_promotion/giftcard/not_exist.vue b/pages_promotion/giftcard/not_exist.vue new file mode 100644 index 0000000..f55f3f7 --- /dev/null +++ b/pages_promotion/giftcard/not_exist.vue @@ -0,0 +1,45 @@ + ++ ++ + ++ + ++ + ++ ++ + +{{cardInfo.to_member_nickname}} ++ ++ 领取了您的「{{cardInfo.card_name}}」 + +{{cardInfo.blessing}} ++ + + + ++ + + + + + + + diff --git a/pages_promotion/giftcard/order_detail.vue b/pages_promotion/giftcard/order_detail.vue new file mode 100644 index 0000000..2e9d306 --- /dev/null +++ b/pages_promotion/giftcard/order_detail.vue @@ -0,0 +1,440 @@ + ++ ++ 您查看的礼品卡不存在 ++ + + + + + + + + + diff --git a/pages_promotion/giftcard/order_list.vue b/pages_promotion/giftcard/order_list.vue new file mode 100644 index 0000000..bbd14da --- /dev/null +++ b/pages_promotion/giftcard/order_list.vue @@ -0,0 +1,408 @@ + ++ + ++ ++ ++ {{orderDetail.card_right_type == 'balance' ? '储值卡' : '礼品卡' }} +{{orderDetail.order_status_name}} ++ + ++ ++ + +{{orderDetail.order_name}} ++ ¥{{orderDetail.goods_money}} + ++ + ++ +订单号 +{{orderDetail.order_no}} ++ +下单时间 +{{$util.timeStampTurnTime(orderDetail.create_time)}} ++ +买家留言 +{{orderDetail.buyer_message ? orderDetail.buyer_message : '无'}} ++ +购买数量 +{{orderDetail.num}} ++ +订单金额 +¥{{orderDetail.order_money}} ++ ++ + + ++ ++ + ++ + + + + + + + + + + + diff --git a/pages_promotion/giftcard/payment.vue b/pages_promotion/giftcard/payment.vue new file mode 100644 index 0000000..21914dd --- /dev/null +++ b/pages_promotion/giftcard/payment.vue @@ -0,0 +1,128 @@ + ++ + ++ ++ + ++ ++ 全部 + 待支付 + 已完成 + 已关闭 + + ++ ++ ++ ++ ++ ++ + +{{item.card_right_type == 'balance' ? '储值卡' : '礼品卡' }} +{{$util.timeStampTurnTime(item.create_time)}} +{{item.order_status_name}} ++ + ++ ++ ++ {{item.order_name}} ++ +¥{{item.card_price}} +x{{item.num}} ++ +¥{{item.pay_money}} ++ ++ + + + ++ ++ + + ++ ++ 暂无订单记录 ++ + + + + + + + + + + + + + diff --git a/pages_promotion/giftcard/public/css/payment.scss b/pages_promotion/giftcard/public/css/payment.scss new file mode 100644 index 0000000..96b72ab --- /dev/null +++ b/pages_promotion/giftcard/public/css/payment.scss @@ -0,0 +1,185 @@ +.site-wrap{ + padding: 30rpx 0 1rpx; +} +.card-head{ + display: flex; + align-items: center; + margin-bottom: 20rpx; + image{ + width: 34rpx; + max-height: 28rpx; + margin-right: 10rpx; + } + text{ + font-size: 24rpx; + font-weight: bold; + } +} +.giftcard-wrap{ + display: flex; + padding-bottom: 30rpx; + + .card-img{ + width: 270rpx; + height: 164rpx; + max-height: 164rpx; + border-radius: 18rpx; + overflow: hidden; + image{ + width: 100%; + height: 100%; + } + } + .goods-info{ + display: flex; + flex-direction: column; + margin-left: 30rpx; + width: calc(100% - 300rpx); + height: 164rpx; + position: relative; + .goods-name{ + font-weight: bold; + font-size: 30rpx; + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + line-height: 1.5; + + } + .goods-price{ + position: absolute; + color: var(--price-color); + bottom: 0; + left: 0; + font-size: 32rpx; + } + } + + +} +.goods-list{ + border-top: 2rpx solid #F0F0F0; + padding: 30rpx 0; + display: flex; + // display: n; + .goods-left{ + display: flex; + width: calc(100% - 108rpx); + overflow: hidden; + white-space:nowrap; + position: relative; + align-items: center; + image{ + width: 108rpx; + max-height: 108rpx; + margin-right: 22rpx; + flex-shrink: 0; + border-radius: 16rpx; + } + &:after{ + content: ' '; + box-shadow: -4rpx 0px 24rpx rgba(0,0,0,.8); + width: 1rpx; + height: 80rpx; + right: -1rpx; + top: 14rpx; + position: absolute; + background: rgba(255,255,255,0); + } + } + .goods-more{ + width: 108rpx; + height: 108rpx; + display: flex; + align-items: center; + justify-content: center; + font-size: 26rpx; + position: relative; + text{ + font-size: 28rpx; + line-height: 1; + } + + } + &.goodsOpen{ + flex-direction: column; + position: relative; + .btn{ + position: absolute; + right: 20rpx; + top: 50rpx; + font-size: 26rpx; + display: flex; + align-items: baseline; + text{ + line-height: 1.1; + font-size: 24rpx; + margin-left: 8rpx; + } + } + } + .goods-item{ + display: flex; + margin-bottom: 20rpx; + .goods-image{ + width: 118rpx; + height: 118rpx; + overflow: hidden; + border-radius: 18rpx; + margin-right: 20rpx; + image{ + width: 118rpx; + height: 118rpx; + max-height: 118rpx; + } + } + .goods-info{ + width: calc(100% - 160rpx); + .goods-name{ + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 1; + line-height: 1.5; + font-size: 28rpx; + } + .goods-num{ + margin-top: 20rpx; + text{ + color: #666666; + font-size: 24rpx; + &:last-child{ + margin-left: 50rpx; + } + } + } + } + } +} +.buy-num-box{ + padding-top: 30rpx; + border-top: 2rpx solid #F0F0F0; + /deep/ .decrease { + width: 52rpx; + height: 52rpx; + line-height: 48rpx!important; + font-size: 40rpx!important; + border-radius: 10rpx 0px 0px 10rpx; + } + /deep/ input { + height: 52rpx; + line-height: 52rpx; + } + /deep/ .increase { + width: 52rpx; + height: 52rpx; + line-height: 48rpx!important; + font-size: 40rpx!important; + border-radius: 0px 10rpx 10rpx 0px; + } +} + .tab-bar-placeholder { + padding-bottom: calc(constant(safe-area-inset-bottom) + 124rpx); + padding-bottom: calc(env(safe-area-inset-bottom) + 124rpx); + } \ No newline at end of file diff --git a/pages_promotion/giftcard/public/js/payment.js b/pages_promotion/giftcard/public/js/payment.js new file mode 100644 index 0000000..ce752f6 --- /dev/null +++ b/pages_promotion/giftcard/public/js/payment.js @@ -0,0 +1,262 @@ +export default { + data() { + return { + isIphoneX: false, + orderCreateData: { + buyer_message: '', + }, + orderPaymentData: { + + }, + isSub: false, + tempData: null, + + canLocalDelicery: true, + // 选择自提、配送防重判断 + judge:true, + goodsOpen: true, + min:1, + modifyFlag: false, + }; + }, + methods: { + /** + * 支付弹窗关闭 + */ + payClose(){ + this.$util.redirectTo('/pages_promotion/giftcard/order_list', {}, 'redirectTo'); + }, + // 显示弹出层 + openPopup(ref) { + this.$refs[ref].open(); + }, + // 关闭弹出层 + closePopup(ref) { + if (this.tempData) { + Object.assign(this.orderCreateData, this.tempData); + Object.assign(this.orderPaymentData, this.tempData); + this.tempData = null; + this.$forceUpdate(); + } + this.$refs[ref].close(); + }, + + // 获取订单初始化数据 + getOrderPaymentData() { + this.orderCreateData = uni.getStorageSync('giftcardOrderCreateData'); + var pay_flag = uni.getStorageSync("pay_flag"); // 支付中标识,防止返回时,提示,跳转错误 + if (!this.orderCreateData) { + if (pay_flag == 1) { + uni.removeStorageSync("pay_flag"); + } else { + this.$util.showToast({ + title: '未获取到创建订单所需数据!' + }); + setTimeout(() => { + this.$util.redirectTo('/pages/index/index'); + }, 1500); + } + return; + } + + this.$api.sendRequest({ + url: '/giftcard/api/ordercreate/calculate', + data: this.orderCreateData, + success: res => { + if (res.code >= 0) { + this.orderPaymentData = res.data; + this.orderPaymentData.timestamp = res.timestamp; + this.handlePaymentData(); + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + } else { + this.$util.showToast({ + title: '未获取到创建订单所需数据!' + }); + setTimeout(() => { + this.$util.redirectTo('/pages/index/index'); + }, 1500); + } + }, + fail: res => { + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + } + }) + }, + cartNumChange(num){ + this.modifyFlag = true; + this.orderCreateData.num = num; + Object.assign(this.orderPaymentData, this.orderCreateData); + this.orderCalculate(); + }, + // 处理结算订单数据 + handlePaymentData() { + this.orderCreateData.buyer_message = ''; + + var data = this.orderPaymentData; + + Object.assign(this.orderPaymentData, this.orderCreateData); + this.orderCalculate(); + }, + // 转化时间字符串 + getTimeStr(val) { + var h = parseInt(val / 3600).toString(); + var m = parseInt((val % 3600) / 60).toString(); + if (m.length == 1) { + m = '0' + m; + } + if (h.length == 1) { + h = '0' + h; + } + return h + ':' + m; + }, + // 订单计算 + orderCalculate() { + var data = this.$util.deepClone(this.orderCreateData); + this.$api.sendRequest({ + url: '/giftcard/api/ordercreate/calculate', + data, + success: res => { + if (res.code >= 0) { + this.orderPaymentData = res.data; + + this.createBtn(); + this.modifyFlag = false; + this.$forceUpdate(); + } else { + this.$util.showToast({ + title: res.message + }); + } + }, + }) + }, + /** + * 订单创建验证 + */ + createBtn(){ + return true; + }, + // 订单创建 + orderCreate() { + if (this.verify()) { + if (this.isSub) return; + this.isSub = true; + + uni.setStorageSync('paySource', 'giftcard'); + + var data = this.$util.deepClone(this.orderCreateData); + + this.$api.sendRequest({ + url: '/giftcard/api/ordercreate/create', + data, + success: res => { + uni.hideLoading(); + if (res.code >= 0) { + if (parseFloat(this.orderPaymentData.pay_money) > 0) { + let orderCreateData = uni.getStorageSync('giftcardOrderCreateData'); + orderCreateData.out_trade_no = res.data; + uni.setStorageSync('giftcardOrderCreateData', orderCreateData); + + this.$refs.choosePaymentPopup.getPayInfo(res.data); + this.isSub = false; + } else { + this.$util.redirectTo('/pages_promotion/giftcard/order_list'); + } + } else { + this.isSub = false; + if (res.data.error_code == 10 || res.data.error_code == 12) { + uni.showModal({ + title: '订单未创建', + content: res.message, + confirmText: '去设置', + success: res => { + if (res.confirm) { + this.selectAddress(); + } + } + }) + } else { + this.$util.showToast({ + title: res.message + }); + } + } + }, + fail: res => { + uni.hideLoading(); + this.isSub = false; + } + }) + } + }, + // 订单验证 + verify() { + return true; + }, + imageError(index) { + this.orderPaymentData.order_goods_list[index].sku_image = this.$util.getDefaultImage().goods; + this.$forceUpdate(); + }, + + navigateTo(id) { + this.$util.redirectTo('/pages_promotion/giftcard/detail', { + id + }); + }, + // 显示选择支付方式弹框 + openChoosePayment() { + this.orderCreate(); + }, + + openPopup(ref) { + this.tempData = this.$util.deepClone(this.orderCreateData); + this.$refs[ref].open(); + }, + closePopup(ref) { + this.orderCreateData = this.$util.deepClone(this.tempData); + this.$refs[ref].close(); + this.tempData = null; + }, + /** + * 保存留言 + */ + saveBuyerMessage(){ + this.orderCalculate(); + this.$refs.buyerMessagePopup.close(); + }, + }, + onShow() { + + if (uni.getStorageSync('addressBack')) { + uni.removeStorageSync('addressBack'); + } + + // 判断登录 + if (!uni.getStorageSync('token')) { + this.$util.redirectTo('/pages_tool/login/login'); + } else { + this.getOrderPaymentData(); + } + this.judge = true; + + this.isIphoneX = this.$util.uniappIsIPhoneX() + }, + onHide() { + if (this.$refs.loadingCover) this.$refs.loadingCover.show(); + }, + onLoad(){ + + }, + computed: { + + }, + watch: { + + }, + filters: { + // 金额格式化输出 + moneyFormat(money) { + return parseFloat(money).toFixed(2); + } + } +} diff --git a/pages_promotion/giftcard/receive_list.vue b/pages_promotion/giftcard/receive_list.vue new file mode 100644 index 0000000..7958acd --- /dev/null +++ b/pages_promotion/giftcard/receive_list.vue @@ -0,0 +1,322 @@ + ++ + + ++ ++ ++ {{ orderPaymentData.card_right_type == 'balance' ? '储值卡' : '礼品卡' }} ++ + ++ ++ + +{{ orderPaymentData.order_name }} +¥{{ parseFloat(orderPaymentData.item_money).toFixed(2) }} ++ ++ +购买数量 ++ + ++ +买家留言 ++ +{{ orderPaymentData.buyer_message }} +无留言 ++ + + + + ++ +共{{ orderPaymentData.num }}份 +合计: +¥ +{{ parseFloat(orderPaymentData.pay_money).toFixed(2) }} ++ + + ++ ++ +买家留言 ++ + ++ ++ ++ + ++ 确定 + + + + + + + + + + diff --git a/pages_promotion/giftcard/use_select.vue b/pages_promotion/giftcard/use_select.vue new file mode 100644 index 0000000..9629f99 --- /dev/null +++ b/pages_promotion/giftcard/use_select.vue @@ -0,0 +1,304 @@ + ++ + ++ ++ + ++ ++ 全部 + 待使用 + 已使用 + 已过期 + + ++ ++ + ++ + ++ ++ + {{item.balance}}元储值卡 + ++ ++ + + ++ + + ++ ++ + + ++ ++ 暂无卡片记录 ++ + + + + + ++ + +本礼品卡包含以下商品 +请在以下商品中任选{{cardInfo.card_right_goods_count}}件 ++ ++ ++ + +{{item.sku_name}} ++ ++ + +x {{item.total_num}} ++ ++ + + + + ++ + + + + + + \ No newline at end of file diff --git a/pages_promotion/groupbuy/detail.vue b/pages_promotion/groupbuy/detail.vue new file mode 100644 index 0000000..1062e2e --- /dev/null +++ b/pages_promotion/groupbuy/detail.vue @@ -0,0 +1,270 @@ + + + + + + + + + + + diff --git a/pages_promotion/groupbuy/list.vue b/pages_promotion/groupbuy/list.vue new file mode 100644 index 0000000..6e46de4 --- /dev/null +++ b/pages_promotion/groupbuy/list.vue @@ -0,0 +1,213 @@ + ++ + + ++ + + + + ++ + ++ + ++ + + +团购 +已售{{ goodsSkuDetail.sale_num }} {{ goodsSkuDetail.unit }} ++ +距结束仅剩 ++ ++ + + + + + + ++ +团购价 +{{ $lang('common.currencySymbol') }} + ++ {{ + parseFloat(goodsSkuDetail.show_price) + .toFixed(2) + .split('.')[0] + }} + ++ .{{ + parseFloat(goodsSkuDetail.show_price) + .toFixed(2) + .split('.')[1] + }} + + ++ +{{ $lang('common.currencySymbol') }} +{{ goodsSkuDetail.price }} ++ ++ + + +{{ goodsSkuDetail.goods_name }} ++ {{ goodsSkuDetail.introduction }} + ++ +库存 {{ goodsSkuDetail.stock }} {{ goodsSkuDetail.unit }} +销量 {{ goodsSkuDetail.sale_num }} {{ goodsSkuDetail.unit }} ++ + + + + + +选择 ++ +{{ item.spec_name }}/{{ item.spec_value_name }} ++ + + + + + + + + + + ++ + + + ++ + + + + + + + + + + + + + + + + + diff --git a/pages_promotion/groupbuy/payment.vue b/pages_promotion/groupbuy/payment.vue new file mode 100644 index 0000000..9884e4c --- /dev/null +++ b/pages_promotion/groupbuy/payment.vue @@ -0,0 +1,49 @@ + ++ ++ ++ + ++ ++ ++ {{ goodsTag(item) }} ++ ++ +{{ item.goods_name }} +库存{{ item.goods_stock }}件 ++ 原价: + ++ +{{ $lang('common.currencySymbol') }} + {{ item.price }} ++ ++ +{{ $lang('common.currencySymbol') }} + ++ {{ + parseFloat(item.groupbuy_price) + .toFixed(2) + .split('.')[0] + }} + ++ .{{ + parseFloat(item.groupbuy_price) + .toFixed(2) + .split('.')[1] + }} + ++ + + + + + + + + + diff --git a/pages_promotion/groupbuy/public/css/detail.scss b/pages_promotion/groupbuy/public/css/detail.scss new file mode 100644 index 0000000..6f27168 --- /dev/null +++ b/pages_promotion/groupbuy/public/css/detail.scss @@ -0,0 +1,65 @@ +// 营销活动 +.goods-promotion { + background: var(--promotion-color); + height: 75px; + .price-info { + display: flex; + flex-direction: row; + align-items: center; + justify-content: flex-start; + .icon-box { + margin-right: 20rpx; + .iconfont{ + font-size: 60rpx; + color: #ffffff; + } + } + .price-box{ + display: flex; + align-items: flex-start; + flex-direction: column; + height: 100%; + justify-content: center; + .promotion-text{ + font-size: 36rpx; + color: #fff; + line-height: 1; + } + .sale-num{ + display: flex; + align-items: center; + margin-top: 18rpx; + view{ + color: #ffffff; + line-height: 1; + } + + } + } + + + } +} +.countdown { + width: 220rpx; + background: var(--promotion-aux-color); + .txt{ + color: #ffffff!important; + font-size: 28rpx!important; + } + .clockrun{ + margin-top: 16rpx!important; + } + &:after{ + position: absolute; + content: ''; + top: calc(50% - 15rpx); + z-index: 5; + left: -15rpx; + width: 0; + height: 0; + border-style: solid; + border-width: 15rpx 15rpx 15rpx 0; + border-color: transparent var(--promotion-aux-color) transparent transparent; + } + } \ No newline at end of file diff --git a/pages_promotion/groupbuy/public/css/list.scss b/pages_promotion/groupbuy/public/css/list.scss new file mode 100644 index 0000000..f8de296 --- /dev/null +++ b/pages_promotion/groupbuy/public/css/list.scss @@ -0,0 +1,161 @@ +.ns-adv { + margin: 0; + border-radius: $border-radius; + overflow: hidden; + line-height: 1; + + image { + width: 100%; + } +} +.page{ + width: 100%; + min-height: 100vh; + background: var(--groupby-promotion-color); +} + +.lineheight-clear { + line-height: 1!important; + color: #888888; + margin-top: 10rpx; + font-size: 24rpx; +} +// 商品列表单列样式 +.goods-list.single-column { + + .goods-item { + padding: 26rpx; + background: #fff; + margin: $margin-updown $margin-both; + border-radius: 26rpx; + display: flex; + position: relative; + + .goods-img { + width: 200rpx; + height: 200rpx; + overflow: hidden; + border-radius: $border-radius; + margin-right: 20rpx; + + image { + width: 100%; + height: 100%; + } + } + + .goods-tag{ + color: #fff; + line-height: 1; + padding: 8rpx 12rpx; + position: absolute; + border-top-left-radius: $border-radius; + border-bottom-right-radius: $border-radius; + top: 26rpx; + left: 26rpx; + font-size: $font-size-goods-tag; + } + + .info-wrap { + flex: 1; + display: flex; + flex-direction: column; + width: calc(100% - 220rpx); + } + + .name-wrap { + flex: 1; + + .name-label{ + border: 0; + border-radius: 8rpx; + margin-right: 8rpx; + padding: 0px 8px; + background: linear-gradient(to left, var(--groupby-promotion-color), var(--groupby-promotion-aux-color)); + color: #fff; + font-size: 24rpx; + } + } + + .goods-name { + font-size: $font-size-base; + line-height: 1.3; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + height: 80rpx; + width: 100%; + word-wrap: break-word; + font-size: 30rpx; + font-weight: bold; + } + + .pintuan-info { + text { + line-height: 1; + margin-right: 20rpx; + border: 1px solid #fff; + font-size: 24rpx; + color: var(--groupby-color); + } + } + + .discount-price { + + display: inline-block; + font-weight: bold; + line-height: 1; + margin-top: 10rpx; + color: var(--price-color); + .unit { + margin-right: 6rpx; + } + + .txt { + font-weight: normal; + } + } + .delete-price { + text-decoration: line-through; + .unit { + margin-right: 6rpx; + } + + .txt { + text-decoration:none; + } + } + .pro-info { + position: relative; + line-height: 1; + & > view { + line-height: 1; + button{ + color: #fff; + background-color: var(--groupby-promotion-color); + border-radius: 60rpx; + } + &:nth-child(2) { + position: absolute; + right: 0; + bottom: 0; + font-weight: bold; + } + } + } + + .member-price-tag { + display: inline-block; + width: 60rpx; + line-height: 1; + margin-left: 6rpx; + + image { + width: 100%; + } + } + } + +} \ No newline at end of file diff --git a/pages_promotion/groupbuy/public/js/detail.js b/pages_promotion/groupbuy/public/js/detail.js new file mode 100644 index 0000000..5799d8c --- /dev/null +++ b/pages_promotion/groupbuy/public/js/detail.js @@ -0,0 +1,104 @@ +export default { + data() { + return { + goodsRoute: '/pages_promotion/groupbuy/detail', + posterApi: '/groupbuy/api/goods/poster', + groupbuy_id: 0, + } + }, + onLoad(data) { + this.skuId = data.sku_id || 0; + this.groupbuy_id = data.groupbuy_id || 0; + if (data.id) { + this.groupbuy_id = data.id; + } + // 小程序扫码进入 + if (data.scene) { + var sceneParams = decodeURIComponent(data.scene); + sceneParams = sceneParams.split('&'); + if (sceneParams.length) { + sceneParams.forEach(item => { + if (item.indexOf('id') != -1) this.groupbuy_id = item.split('-')[1]; + if (item.indexOf('sku_id') != -1) this.skuId = item.split('-')[1]; + }); + } + } + }, + async onShow() { + await this.getGoodsSkuDetail(); + }, + methods: { + // 获取团购商品详情 + async getGoodsSkuDetail() { + let res = await this.$api.sendRequest({ + url: '/groupbuy/api/goods/detail', + async: false, + data: { + groupbuy_id: this.groupbuy_id + } + }); + let data = res.data; + if (data.goods_sku_detail != null) { + this.goodsSkuDetail = data.goods_sku_detail; + if (this.skuId == 0) this.skuId = this.goodsSkuDetail.sku_id; + + //团购倒计时 + if ((this.goodsSkuDetail.end_time - res.timestamp) > 0) { + this.goodsSkuDetail.timeMachine = this.$util.countDown(this.goodsSkuDetail.end_time - res + .timestamp); + } else { + this.$util.showToast({ + title: "活动已结束", + }); + setTimeout(() => { + this.$util.redirectTo('/pages/goods/detail', { + goods_id: this.goodsSkuDetail.goods_id + }, 'redirectTo'); + }, 1000); + } + + // 分享参数、链接 + this.shareQuery = 'groupbuy_id=' + this.groupbuy_id + '&sku_id=' + this.skuId; + this.shareUrl = this.goodsRoute + '?' + this.shareQuery; + + // 在线客服聊天参数 + this.chatRoomParams = { + sku_id: this.goodsSkuDetail.sku_id, + type: 'groupbuy', + type_id: this.goodsSkuDetail.groupbuy_id + }; + + // 海报参数 + this.posterParams = { + groupbuy_id: this.groupbuy_id + }; + + // 处理商品数据 + this.handleGoodsSkuData(); + + this.goodsSkuDetail.show_price = this.goodsSkuDetail.groupbuy_price; + this.goodsSkuDetail.save_price = (this.goodsSkuDetail.price - this.goodsSkuDetail.show_price) > 0 ? + (this.goodsSkuDetail + .price - this.goodsSkuDetail.show_price).toFixed(2) : 0; + + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + } else { + this.$util.redirectTo('/pages_tool/goods/not_exist', {}, 'redirectTo'); + } + }, + // 团购 + groupbuy() { + if (!this.token) { + if (this.source_member) { + this.$refs.login.open(this.shareUrl + '&source_member=' + this.source_member); + } else { + this.$refs.login.open(this.shareUrl); + } + return; + } + this.$refs.goodsSku.show("groupbuy", () => { + this.getCartCount(); + }); + }, + } +} diff --git a/pages_promotion/jielong/jielong.vue b/pages_promotion/jielong/jielong.vue new file mode 100644 index 0000000..a626d34 --- /dev/null +++ b/pages_promotion/jielong/jielong.vue @@ -0,0 +1,1717 @@ + ++ + + + + + + + + + diff --git a/pages_promotion/pinfan/detail.vue b/pages_promotion/pinfan/detail.vue new file mode 100644 index 0000000..9d87070 --- /dev/null +++ b/pages_promotion/pinfan/detail.vue @@ -0,0 +1,438 @@ + ++ + + + ++ + + ++ 距活动开始仅剩: + ++ + 距活动结束仅剩: + ++ + 活动已结束 + ++ 活动已关闭 + ++ ++ {{jielong_info.jielong_name}} + ++ {{jielong_info.desc}} + ++ + ++ ++ ++ ++ + +{{item.goods_name}} +{{item.introduction}} +精品好物,购物多多,等你来抢 ++ ++ ++ {{item.member_num}}人已买 +...等{{item.member_num}}人已买 ++ +¥{{item.discount_price}} +¥{{item.market_price}} ++ ++ 选规格 + ++ {{item.cart_num}} + +选规格 ++ ++ ++ + {{data.num}} + ++ + + + ++ ++ 他们都在买 ++ + ++ + 暂无购买记录 + ++ + ++ ++ 他们都在买 ++ + ++ ++ ++ ++ + ++ ++ {{item.nickname}} + ++ {{ $util.timeStampTurnTime(item.pay_time)}} + ++ 购买了{{item.order_name}} + ++ 查看更多 + ++ 收起更多 + ++ + ++ ++ ++ +{{num}} ++ + 暂未选购商品 + ++ +¥ {{money}} ++ 活动未开始 + ++ 接龙购买 + ++ 活动已结束 + ++ 活动已关闭 + ++ ++ ++ + 分享 + ++ ++ + 订单 + ++ + ++ ++ ++ 已选商品 +(共{{num}}件) ++ ++ 清空 ++ ++ + ++ ++ ++ + +{{item.goods_name}} +规格:{{item.sku_name}} ++ +{{item.discount_price}} +¥{{item.market_price}} ++ ++ ++ ++ + {{data.num}} + ++ + + ++ ++ ++ ++ ++ + ++ {{specifications.sku_name}} + ++ 库存{{specifications.stock}}件 + ++ ++ ++ {{items.spec_name}} + ++ ++ {{item.spec_value_name}} + ++ 已选择: +{{specifications.title}} ++ ++ +¥ {{specifications.discount_price}} ++ ++ + {{item.num}} + ++ + + + + ++ ++ + + + ++ ++ + + + ++ ++ + {{lantern.content}}刚刚下单成功 + ++ + + + + + + + + + + diff --git a/pages_promotion/pinfan/list.vue b/pages_promotion/pinfan/list.vue new file mode 100644 index 0000000..14a1b8d --- /dev/null +++ b/pages_promotion/pinfan/list.vue @@ -0,0 +1,216 @@ + ++ + + ++ + + + + ++ + ++ ++ + +拼团返利 ++ ++ {{ goodsSkuDetail.pintuan_num }}人拼 + +已成团{{ goodsSkuDetail.order_num }}{{ goodsSkuDetail.unit }} ++ +距结束仅剩 ++ ++ + + ++ +拼团价 +¥ +{{ parseFloat(goodsSkuDetail.pintuan_price).toFixed(2).split(".")[0] }} +.{{ parseFloat(goodsSkuDetail.pintuan_price).toFixed(2).split(".")[1] }} + ++ +¥ +{{ goodsSkuDetail.price }} ++ ++ + + + 拼中得商品,未拼中 + +返{{ goodsSkuDetail.reward_type_num }}积分 +返¥{{ goodsSkuDetail.reward_type_num }} +返优惠券 ++ +{{ goodsSkuDetail.goods_name }} +{{ goodsSkuDetail.introduction }} ++ +库存 {{ goodsSkuDetail.stock }} {{ goodsSkuDetail.unit }} +销量 {{ goodsSkuDetail.sale_num }} {{ goodsSkuDetail.unit }} ++ +拼团返利玩法 ++ ++ ++ + 参与拼团 + ++ +{{ goodsSkuDetail.pintuan_num }} + 人拼团 ++ + ++ + +{{ goodsSkuDetail.chengtuan_num }} + 人拼中发货 ++ +{{ goodsSkuDetail.pintuan_num - goodsSkuDetail.chengtuan_num }} + 人未中退款 ++ + ++ + 未拼中获得奖励 + ++ +返{{ goodsSkuDetail.reward_type_num }}积分 ++ 返¥{{ goodsSkuDetail.reward_type_num }} + +返优惠券 ++ + + + + + + ++ ++ ++ ++ ++ {{ item.nickname }} ++ + + + + + + + + ++ 还差 + +{{ item.pintuan_num - item.pintuan_count }}人 + 拼成 +剩余 ++ + + ++ ++ +参与的拼单 ++ 仅剩 + +{{ currentPintuan.pintuan_num }} + 个名额, ++ 后结束 ++ + + ++ ++ +拼主 ++ + + + + + + + +选择 ++ +{{ item.spec_name }}/{{ item.spec_value_name }} ++ + + + + + + + + + + ++ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pages_promotion/pinfan/my_rebate.vue b/pages_promotion/pinfan/my_rebate.vue new file mode 100644 index 0000000..ff3bd8a --- /dev/null +++ b/pages_promotion/pinfan/my_rebate.vue @@ -0,0 +1,440 @@ + ++ ++ ++ ++ + ++ ++ 拼团返利玩法 ++ + ++ ++ 支付开团或参团 ++ + ++ 拼中发货未中退款 ++ + ++ 未拼中获得奖励 ++ ++ ++ ++ ++ {{ goodsTag(item) }} ++ ++ +{{ item.goods_name }} + ++ +已拼{{ item.order_num }}件 +{{ item.pintuan_num }}人团 ++ ++ +¥ +{{ parseFloat(item.pintuan_price).toFixed(2).split(".")[0] }} +.{{ parseFloat(item.pintuan_price).toFixed(2).split(".")[1] }} + ++ ++ +单购价: +¥ +{{ item.price }} ++ + +{{ item.pintuan_num }} + 人拼团, +{{ item.chengtuan_num }} + 人拼中,未拼中返 +{{ item.reward_type_num }}积分 +¥{{ item.reward_type_num }} +优惠券 ++ + + + + + + + + + diff --git a/pages_promotion/pinfan/order.vue b/pages_promotion/pinfan/order.vue new file mode 100644 index 0000000..30f1086 --- /dev/null +++ b/pages_promotion/pinfan/order.vue @@ -0,0 +1,644 @@ + ++ ++ +{{ item.name }} ++ ++ ++ ++ +发起拼单 {{ $util.timeStampTurnTime(item.pay_time) }} +{{ pintuanState[item.pintuan_status].text }} +未抽中发货 +{{ pintuanState[item.pintuan_status].text }} ++ ++ ++ + + +{{ item.sku_name }} +{{ item.pintuan_num }}人拼单 ++ ++ + + + +¥ + {{ parseFloat(item.order_money ).toFixed(2).split(".")[0] }} +.{{ parseFloat(item.order_money ).toFixed(2).split(".")[1] }} ++ + ++ + + +还剩 +{{ item.pintuan_num - item.pintuan_count }} +人,剩余时间 ++ ++ 拼团失败 ++ ++ + ++ ++ + + ++ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages_promotion/pinfan/payment.vue b/pages_promotion/pinfan/payment.vue new file mode 100644 index 0000000..d37d483 --- /dev/null +++ b/pages_promotion/pinfan/payment.vue @@ -0,0 +1,50 @@ + ++ + ++ ++ + +{{groupDetail.sku_name}} +{{groupDetail.pintuan_num}}人团,已团{{goodsSkuDetail.group_num}}次 ++ ++ ¥{{groupDetail.pintuan_price}} + ++ 距结束: ++ + + + +等待参团,仅剩{{kill}}个名额 +活动已结束 ++ ++ ++ + + ++ 去参团 ++ + ++ ++ +参与的拼单 ++ 仅剩 +{{kill}} 个名额, +后结束 + + ++ ++ + ++ + 参与拼单 ++ + + + + + + + + + diff --git a/pages_promotion/pinfan/public/css/detail.scss b/pages_promotion/pinfan/public/css/detail.scss new file mode 100644 index 0000000..288f267 --- /dev/null +++ b/pages_promotion/pinfan/public/css/detail.scss @@ -0,0 +1,238 @@ +// 营销活动 +.goods-promotion { + background: var(--promotion-color); + height: 75px; + .price-info { + display: flex; + flex-direction: row; + align-items: center; + justify-content: flex-start; + .icon-box { + margin-right: 20rpx; + .iconfont{ + font-size: 60rpx; + color: #ffffff; + } + } + .price-box{ + display: flex; + align-items: flex-start; + flex-direction: column; + height: 100%; + justify-content: center; + .promotion-text{ + font-size: 36rpx; + color: #fff; + line-height: 1; + } + .sale-num{ + display: flex; + align-items: center; + margin-top: 18rpx; + view{ + color: #ffffff; + line-height: 1; + } + .pintuan-num { + color: var(--pintuan-label-color); + line-height: 1; + border-radius: 4rpx; + margin-right: 10rpx; + font-size: 24rpx; + padding: 8rpx 14rpx 9.5rpx; + background-color: var(--pintuan-label-bg); + font-weight: bold; + } + } + } + } +} + +.group-wrap { + .goods-module-wrap { + &.promotion-price-wrap { + display: inline-block; + font-size: $font-size-tag; + border-radius: 30rpx; + padding: 8rpx 18rpx; + margin-right: 10rpx; + vertical-align: middle; + // border: 1px solid; + margin-top: 10rpx; + line-height: 1; + color: #fff; + background-color: var(--promotion-tag); + .label { + font-size: $font-size-activity-tag; + margin-right: 10rpx; + vertical-align: middle; + } + + .price-symbol { + font-size: $font-size-tag; + top: 0; + vertical-align: middle; + } + + .price { + font-size: $font-size-base; + } + } + } +} +.step { + margin-bottom: 10px; + padding: 15px; + background: #ffffff; + .pin-step { + display: flex; + align-items: center; + justify-content: space-around; + margin-top: 30rpx; + view { + // width:120rpx; + text-align: center; + image { + width: 48rpx; + height: 48rpx; + } + view { + font-size: $font-size-tag; + } + } + image { + width: 40rpx; + height: 10rpx; + } + } +} + +.spelling-block { + font-size: $font-size-base; + width: 100%; + height: 130rpx; + background: #fff; + + .item { + padding: 20rpx 0; + display: flex; + align-items: center; + .user-logo { + display: inline-block; + margin: 0 20rpx 0 0; + vertical-align: top; + image { + width: 80rpx; + vertical-align: middle; + border-radius: 50%; + height: 80rpx; + } + } + .user-name { + width: 170rpx; + display: inline-block; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + vertical-align: top; + font-size: $font-size-base; + } + .info { + font-size: $font-size-tag; + margin-right: 20rpx; + display: inline-block; + text-align: right; + flex: 1; + .tip { + text-align: right; + } + } + } +} + +// 参与拼团 +.pintuan-popup-layer { + .layer { + padding: 30rpx; + width: 422rpx; + } + .title { + text-align: center; + padding: 20rpx; + font-size: $font-size-toolbar; + font-weight: bold; + } + .info { + font-size: $font-size-tag; + text-align: center; + } + .mask-layer-spelling-close { + position: absolute; + right: -20rpx; + top: -20rpx; + width: 60rpx; + height: 60rpx; + } + .user-list { + padding: 40rpx 0; + text-align: center; + .item { + position: relative; + margin-right: 20rpx; + display: inline-block; + .boss { + position: absolute; + left: -24rpx; + top: 0rpx; + color: #fff; + border-radius: 20rpx; + font-size: $font-size-tag; + padding: 4rpx 10rpx; + z-index: 1; + line-height: 1; + } + image { + width: 80rpx; + height: 80rpx; + vertical-align: middle; + border-radius: 50%; + } + } + .imgX { + width: 100%; + white-space: nowrap; + box-sizing: border-box; + } + } + button { + color: #fff; + border: 0; + margin: 16rpx auto; + display: block; + width: 90%; + } +} + +.countdown { + width: 220rpx; + background: var(--promotion-aux-color); + .txt{ + color: #ffffff!important; + font-size: 28rpx!important; + } + .clockrun{ + margin-top: 16rpx!important; + } + &:after{ + position: absolute; + content: ''; + top: calc(50% - 15rpx); + z-index: 5; + left: -15rpx; + width: 0; + height: 0; + border-style: solid; + border-width: 15rpx 15rpx 15rpx 0; + border-color: transparent var(--promotion-aux-color) transparent transparent; + } + } \ No newline at end of file diff --git a/pages_promotion/pinfan/public/css/list.scss b/pages_promotion/pinfan/public/css/list.scss new file mode 100644 index 0000000..b0df12e --- /dev/null +++ b/pages_promotion/pinfan/public/css/list.scss @@ -0,0 +1,224 @@ +.ns-adv { + margin: $margin-updown $margin-both; + border-radius: $border-radius; + overflow: hidden; + line-height: 1; + + image { + width: 100%; + } +} + +.pinfan-step{ + font-size: 30rpx; + padding: 15px; + background: #fff; + margin: 10px 15px; + .pinfan-title{ + display: flex; + justify-content: center; + align-items: center; + image{ + width: 106rpx; + height: 8rpx !important; + } + view{ + margin: 0 14rpx; + } + } + .step{ + display: flex; + align-items: center; + justify-content: space-around; + margin-top: 40rpx; + view{ + width:100rpx; + text-align: center; + image{ + width: 48rpx; + height: 48rpx; + } + view{ + font-size: $font-size-tag; + } + } + image{ + width: 40rpx; + height: 10rpx; + } + } +} + + + + + + +.lineheight-clear { + line-height: 1!important; +} +// 商品列表单列样式 +.goods-list.single-column { + + .goods-item { + padding: 26rpx; + background: #fff; + margin: $margin-updown $margin-both; + border-radius: $border-radius; + position: relative; + .step-status{ + background-color: #FFF5ED; + padding: 18rpx 26rpx; + border-radius: $border-radius; + line-height: 1; + margin-top: 30rpx; + + } + .list-item{ + display: flex; + } + .goods-img { + width: 200rpx; + height: 200rpx; + overflow: hidden; + border-radius: $border-radius; + margin-right: 20rpx; + + image { + width: 100%; + height: 100%; + } + } + + .goods-tag{ + color: #fff; + line-height: 1; + padding: 8rpx 12rpx; + position: absolute; + border-top-left-radius: $border-radius; + border-bottom-right-radius: $border-radius; + top: 26rpx; + left: 26rpx; + font-size: $font-size-goods-tag; + } + + .info-wrap { + flex: 1; + display: flex; + flex-direction: column; + } + + .name-wrap { + flex: 1; + /* .box { + margin: 20rpx 0; + width: 240rpx; + height: 20rpx; + border-radius: 10rpx; + background-color: #FCECD7; + .con { + height: 20rpx; + border-radius: 10rpx; + background-color: #FDBE6C; + } + } */ + } + + .goods-name { + line-height: 1.3; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + height: 68rpx; + text{ + border-radius: 2px; + margin-right: 10rpx; + padding: 4rpx 12rpx; + } + } + + /* .introduction { + margin-top: 10rpx; + display: flex; + .pin-intro{ + // background-color: #FFF0F0; + border-radius: 4rpx; + line-height: 1; + margin-right: 10rpx; + padding: 4rpx 12rpx; + } + .tuan-intro{ + border: 1px solid; + border-radius: 4rpx; + line-height: 1; + padding: 4rpx 12rpx; + } + } */ + .pintuan-info { + .pinfan-num{ + padding:2rpx 12rpx; + border-radius: 4rpx; + font-size:: $font-size-activity-tag; + } + .pinfan-box{ + border-radius: 4rpx; + font-size:: $font-size-activity-tag; + padding:0 12rpx; + border: 2rpx solid; + margin-left: 14rpx; + } + } + .discount-price { + display: inline-block; + font-weight: bold; + line-height: 1; + margin-top: 16rpx; + color: var(--price-color); + .unit { + margin-right: 6rpx; + } + + .txt { + font-weight: normal; + } + } + .pro-info { + position: relative; + margin-top: 16rpx; + + .delete-price { + line-height: 1; + flex: 1; + display: flex; + align-items: flex-end; + + .unit { + margin-right: 6rpx; + } + + .txt { + text-decoration:none; + } + } + .detail-btn { + line-height: 1; + position: absolute; + right: 0; + bottom: 0; + } + } + .member-price-tag { + display: inline-block; + width: 60rpx; + line-height: 1; + margin-left: 6rpx; + + image { + width: 100%; + } + } + } + +} \ No newline at end of file diff --git a/pages_promotion/pinfan/public/js/detail.js b/pages_promotion/pinfan/public/js/detail.js new file mode 100644 index 0000000..dec1d09 --- /dev/null +++ b/pages_promotion/pinfan/public/js/detail.js @@ -0,0 +1,215 @@ +export default { + data() { + return { + goodsRoute: '/pages_promotion/pinfan/detail', + posterApi: '/pinfan/api/goods/poster', + groupId: 0, + pinfan_id: 0, + pintuanList: [], + currentPintuan: { + headimg: '', + timeMachine: {} + }, + openPopup: false, + timestamp: '', + newList: [], + } + }, + onLoad(data) { + this.pinfan_id = data.pinfan_id || 0; + if (data.id) { + this.pinfan_id = data.id; + } + this.groupId = data.group_id || 0; + + // 小程序扫码进入 + if (data.scene) { + var sceneParams = decodeURIComponent(data.scene); + sceneParams = sceneParams.split('&'); + if (sceneParams.length) { + sceneParams.forEach(item => { + if (item.indexOf('id') != -1) this.pinfan_id = item.split('-')[1]; + if (item.indexOf('group_id') != -1) this.group_id = item.split('-')[1]; + }); + } + } + }, + async onShow() { + await this.getGoodsSkuDetail(); + this.getPintuanGroupList(); + }, + methods: { + // 获取拼团商品详情 + async getGoodsSkuDetail() { + let res = await this.$api.sendRequest({ + url: '/pinfan/api/goods/detail', + async: false, + data: { + pintuan_id: this.pinfan_id + } + }); + let data = res.data; + if (data.goods_sku_detail != null) { + this.goodsSkuDetail = data.goods_sku_detail; + this.skuId = this.goodsSkuDetail.sku_id; + this.goodsSkuDetail.group_id = this.groupId; + + //拼团倒计时 + if ((this.goodsSkuDetail.end_time - res.timestamp) > 0) { + this.goodsSkuDetail.timeMachine = this.$util.countDown(this.goodsSkuDetail.end_time - res + .timestamp); + } else { + this.$util.showToast({ + title: "活动已结束", + }); + setTimeout(() => { + this.$util.redirectTo('/pages/goods/detail', { + goods_id: this.goodsSkuDetail.goods_id + }, 'redirectTo'); + }, 1000); + } + + // 分享参数、链接 + this.shareQuery = 'pinfan_id=' + this.pinfan_id + '&group_id=' + this.groupId; + this.shareUrl = this.goodsRoute + '?' + this.shareQuery; + + // 在线客服聊天参数 + this.chatRoomParams = { + sku_id: this.goodsSkuDetail.sku_id, + type: 'pintuan', + type_id: this.goodsSkuDetail.pintuan_id + }; + + // 海报参数 + this.posterParams = { + id: this.goodsSkuDetail.id + }; + + // 处理商品数据 + this.handleGoodsSkuData(); + + this.goodsSkuDetail.show_price = (this.goodsSkuDetail.group_id == 0 ? this.goodsSkuDetail + .promotion_price : this.goodsSkuDetail + .pintuan_price); + this.goodsSkuDetail.save_price = (this.goodsSkuDetail.price - this.goodsSkuDetail.show_price) > 0 ? + (this.goodsSkuDetail + .price - this.goodsSkuDetail.show_price).toFixed(2) : 0; + + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + } else { + this.$util.redirectTo('/pages_tool/goods/not_exist', {}, 'redirectTo'); + } + }, + // 发起拼团 + pintuan(isPromotion = true) { + if (!uni.getStorageSync('token')) { + + if (!this.source_member) { + this.$refs.login.open(this.shareUrl); + } else { + this.$refs.login.open(this.shareUrl + '&source_member=' + this.source_member); + } + return; + } + if (isPromotion) { + this.resetPrice(); + } + this.$refs.goodsSku.show("pinfan", () => { + this.resetPrice(); + this.getCartCount(); + }); + }, + // 立即购买 + buyNow() { + if (!uni.getStorageSync('token')) { + if (!this.source_member) { + this.$refs.login.open(this.shareUrl); + } else { + this.$refs.login.open(this.shareUrl + '&source_member=' + this.source_member); + } + return; + } + this.$refs.goodsSku.show("buy_now", () => { + this.getCartCount(); + }); + }, + //-------------------------------------海报------------------------------------- + // 获取拼团组列表 + getPintuanGroupList() { + this.$api.sendRequest({ + url: "/pinfan/api/pinfangroup/lists", + data: { + goods_id: this.goodsSkuDetail.goods_id + }, + success: res => { + let data = res.data; + this.timestamp = res.timestamp + if (data != null && data.length) { + this.pintuanList = data; + for (let i = 0; i < this.pintuanList.length; i++) { + if (this.pintuanList[i]['end_time'] > res.timestamp) { + this.pintuanList[i].timeMachine = this.$util.countDown(this.pintuanList[i][ + 'end_time' + ] - res.timestamp); + this.pintuanList[i].currentTime = res.timestamp; + } else { + this.pintuanList[i].timeMachine = null; + } + } + this.newList = this.pintuanList.filter(item => { + return item.end_time > res.timestamp; + }); + this.$forceUpdate(); + } + } + }); + }, + //打开拼团弹出框 + openPinTuan(groupId, pintuan_num, time, headimg, head_id) { + if (this.memberId == head_id) { + this.$util.showToast({ + title: "您不能参与自己的团" + }); + return; + } + this.openPopup = true; + this.currentPintuan = { + groupId: groupId, + pintuan_num: pintuan_num, + timeMachine: this.$util.countDown(time), + headimg: headimg + }; + this.$refs.pintuanPopup.open(() => { + this.goodsSkuDetail.group_id = 0; + this.openPopup = false; + }); + }, + closePinTuanPopup() { + this.$refs.pintuanPopup.close(); + }, + //参与拼团 + joinPintuan() { + this.closePinTuanPopup(); + this.goodsSkuDetail.group_id = this.currentPintuan.groupId; + this.goodsSkuDetail.show_price = this.goodsSkuDetail.pintuan_price; + this.goodsSkuDetail.save_price = (this.goodsSkuDetail.price - this.goodsSkuDetail.show_price) > 0 ? (this + .goodsSkuDetail + .price - this.goodsSkuDetail.show_price).toFixed(2) : 0; + this.$forceUpdate(); + this.pintuan(false); + }, + pintuanImageError(index) { + this.pintuanList[index].headimg = this.$util.getDefaultImage().head; + this.$forceUpdate(); + }, + // 重置价格 + resetPrice() { + this.goodsSkuDetail.group_id = 0; + this.goodsSkuDetail.show_price = this.goodsSkuDetail.promotion_price; + this.goodsSkuDetail.save_price = (this.goodsSkuDetail.price - this.goodsSkuDetail.show_price) > 0 ? (this + .goodsSkuDetail + .price - this.goodsSkuDetail.show_price).toFixed(2) : 0; + this.$forceUpdate(); + } + } +} diff --git a/pages_promotion/pinfan/share.vue b/pages_promotion/pinfan/share.vue new file mode 100644 index 0000000..1dec0cc --- /dev/null +++ b/pages_promotion/pinfan/share.vue @@ -0,0 +1,668 @@ + ++ + + + + + + + + diff --git a/pages_promotion/pintuan/detail.vue b/pages_promotion/pintuan/detail.vue new file mode 100644 index 0000000..6260bf5 --- /dev/null +++ b/pages_promotion/pintuan/detail.vue @@ -0,0 +1,541 @@ + ++ ++ ++ + ++ + +{{ groupDetail.sku_name }} ++ +已团{{ groupDetail.group_num }}次 +{{ groupDetail.pintuan_num }}人团 ++ ++ +¥ + {{ groupDetail.pintuan_price }} +¥{{ groupDetail.discount_price }} ++ + ++ + ++ 还差 + +{{ kill }} + 人成团 +拼团已成功 + 距结束还剩 ++ 活动已结束 ++ ++ +团长 ++ ++ + ++ + + + + + + + + ++ + + + + + + ++ ++ +分享 ++ + ++ + + + ++ + + ++ + ++ 取消分享 + ++ + ++ ++ + 保存图片 + + +长按保存图片 + ++ + {{ posterMsg }} ++ + + + + + + + + + diff --git a/pages_promotion/pintuan/list.vue b/pages_promotion/pintuan/list.vue new file mode 100644 index 0000000..e57b2e1 --- /dev/null +++ b/pages_promotion/pintuan/list.vue @@ -0,0 +1,205 @@ + ++ + + ++ + + + + + ++ + ++ ++ + + + +拼团优惠 ++ ++ {{ goodsSkuDetail[goodsSkuDetail.pintuan_num_field] }}人团 + +已成团{{ goodsSkuDetail.order_num }}{{ goodsSkuDetail.unit }} ++ +距结束仅剩 ++ ++ + ++ +拼团价 +{{ $lang('common.currencySymbol') }} +{{ parseFloat(pintuanPirce(goodsSkuDetail)).toFixed(2).split(".")[0] }} +.{{ parseFloat(pintuanPirce(goodsSkuDetail)).toFixed(2).split(".")[1] }} + ++ +{{ $lang('common.currencySymbol') }} +{{ goodsSkuDetail.price }} ++ ++ + + +团长价 +{{ $lang('common.currencySymbol') }} +{{ goodsSkuDetail.promotion_price }} ++ +{{ goodsSkuDetail.goods_name }} +{{ goodsSkuDetail.introduction }} ++ +库存 {{ goodsSkuDetail.stock }} {{ goodsSkuDetail.unit }} +销量 {{ goodsSkuDetail.sale_num }} {{ goodsSkuDetail.unit }} ++ + + + + + + ++ ++ ++ ++ ++ {{ item.nickname }} ++ + + + + + + + + ++ 还差 + +{{ item.pintuan_num - item.pintuan_count }}人 + 拼成 +剩余 ++ + + ++ ++ +参与的拼单 ++ 仅剩 + +{{ currentPintuan.pintuan_num }} + 个名额, ++ 后结束 ++ + + ++ ++ +拼主 ++ + + + + + + + +选择 ++ +{{ item.spec_name }}/{{ item.spec_value_name }} ++ + + + + + + + + + + + + + +参与流程 ++ ++ ++ + +1、购买开团 +点击右下角拼团购买,成功即开团 ++ + + ++ + +2、邀请好友拼团 +邀请好友一起来参加你的拼团 ++ + ++ + +3、拼团成功 +有效期内达到拼团人数即拼团成功 ++ + + + + + + + ++ + + + + ++ ++ ++ + +{{ cutStrByte(groupDetail.nickname, 8) || '好友' }} + 邀请你加入TA的团 ++ 仅剩 + + +{{ parseInt(groupDetail.pintuan_num - groupDetail.pintuan_count) }} + 个名额,距结束 ++ + ++ ++ + ++ + + ++ ++ ++ + ++ + + + ++ + ++ + +{{ cutStrByte(groupDetail.nickname, 8) || '好友' }} + 的团 {{ groupDetail.status == '1' ? '已关闭' : '已完成' }} +非常抱歉,您来晚了一步~ + ++ +点击下方开团 ++ + + + + + + + + + + + + + + + + + + + + + + + + ++ +{{ parseFloat(goodsSkuDetail.promotion_price).toFixed(2) }}元 +去开团 ++ +{{ parseFloat(pintuanPirce(goodsSkuDetail)).toFixed(2) }}元 +去开团 ++ + + + + + + + + + + diff --git a/pages_promotion/pintuan/my_spell.vue b/pages_promotion/pintuan/my_spell.vue new file mode 100644 index 0000000..3583429 --- /dev/null +++ b/pages_promotion/pintuan/my_spell.vue @@ -0,0 +1,430 @@ + ++ ++ ++ + ++ ++ ++ {{ goodsTag(item) }} ++ ++ ++ +{{ item.pintuan_num }}人团 + {{ item.goods_name }} ++ +已团{{ item.sale_num }}件 ++ ++ +{{ $lang('common.currencySymbol') }} + ++ {{ + parseFloat(item.pintuan_price) + .toFixed(2) + .split('.')[0] + }} + ++ .{{ + parseFloat(item.pintuan_price) + .toFixed(2) + .split('.')[1] + }} + ++ ++ ++ {{ $lang('common.currencySymbol') }} + {{ item.price }} ++ + + + + + + + + + + diff --git a/pages_promotion/pintuan/order.vue b/pages_promotion/pintuan/order.vue new file mode 100644 index 0000000..d4edbff --- /dev/null +++ b/pages_promotion/pintuan/order.vue @@ -0,0 +1,635 @@ + ++ ++ + +全部 ++ +{{ item.name }} ++ ++ ++ ++ + +发起拼单 {{ $util.timeStampTurnTime(item.pay_time) }} +{{ pintuanState[item.pintuan_status].text }} ++ ++ ++ + +{{ item.sku_name }} +{{ item.pintuan_num }}人拼单 ++ +¥ + {{ parseFloat(item.order_money).toFixed(2).split(".")[0] }} +.{{ parseFloat(item.order_money).toFixed(2).split(".")[1] }} ++ + ++ + + + +还剩 +{{ item.pintuan_num - item.pintuan_count }} +人,剩余时间 ++ ++ 拼团失败 + ++ ++ + ++ ++ + + ++ + + + + + + + + + + + diff --git a/pages_promotion/pintuan/payment.vue b/pages_promotion/pintuan/payment.vue new file mode 100644 index 0000000..450dfe1 --- /dev/null +++ b/pages_promotion/pintuan/payment.vue @@ -0,0 +1,49 @@ + ++ + + ++ 拼单详情 ++ + + + ++ + +{{ groupDetail.sku_name }} +{{ groupDetail.pintuan_num }}人团,已团{{ goodsSkuDetail.group_num }}次 ++ +¥{{ groupDetail.pintuan_price }} ++ +距结束: ++ + + + +等待参团,仅剩{{ kill }}个名额 ++ ++ + 去参团 ++ + ++ ++ +参与的拼单 ++ 仅剩 + +1 + 个名额, ++ 后结束 + + ++ ++ + 参与拼单 + ++ + + + + + + + + + diff --git a/pages_promotion/pintuan/public/css/detail.scss b/pages_promotion/pintuan/public/css/detail.scss new file mode 100644 index 0000000..307fa5b --- /dev/null +++ b/pages_promotion/pintuan/public/css/detail.scss @@ -0,0 +1,391 @@ +// 营销活动 +.goods-promotion { + background: var(--promotion-color); + height: 75px; + .price-info { + display: flex; + flex-direction: row; + align-items: center; + justify-content: flex-start; + .icon-box { + margin-right: 20rpx; + .iconfont{ + font-size: 60rpx; + color: #ffffff; + } + } + .price-box{ + display: flex; + align-items: flex-start; + flex-direction: column; + height: 100%; + justify-content: center; + .promotion-text{ + font-size: 36rpx; + color: #fff; + line-height: 1; + } + .sale-num{ + display: flex; + align-items: center; + margin-top: 18rpx; + view{ + color: #ffffff; + line-height: 1; + } + .pintuan-num { + color: var(--pintuan-label-color); + line-height: 1; + border-radius: 4rpx; + margin-right: 10rpx; + // font-size: 24rpx; + // padding: 8rpx 14rpx 9.5rpx; + // background-color: var(--pintuan-label-bg); + font-weight: bold; + } + } + } + + + } +} + +.group-wrap { + .goods-module-wrap { + &.promotion-price-wrap { + display: flex; + font-size: $font-size-activity-tag; + border-radius: 30rpx; + padding: 4rpx 10rpx; + margin-right: 10rpx; + vertical-align: middle; + border: 1px solid; + margin-top: 10rpx; + line-height: 1; + border-color: var(--goods-price); + width: fit-content; + align-items: center; + .label { + font-size: $font-size-activity-tag; + margin-right: 10rpx; + vertical-align: middle; + color: var(--goods-price); + } + + .price-symbol { + font-size: $font-size-tag; + top: 0; + vertical-align: middle; + } + + .price { + font-size: $font-size-base; + } + } + } +} + +.spelling-block { + font-size: $font-size-base; + width: 100%; + height: 130rpx; + background: #fff; + + .item { + padding: 20rpx 0; + display: flex; + align-items: center; + .user-logo { + display: inline-block; + margin: 0 20rpx 0 0; + vertical-align: top; + image { + width: 80rpx; + vertical-align: middle; + border-radius: 50%; + height: 80rpx; + } + } + .user-name { + width: 170rpx; + display: inline-block; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + vertical-align: top; + font-size: $font-size-base; + } + .info { + font-size: $font-size-tag; + margin-right: 20rpx; + display: inline-block; + text-align: right; + flex: 1; + .tip { + text-align: right; + } + } + } +} + +// 参与拼团 +.pintuan-popup-layer { + .layer { + padding: 30rpx; + width: 422rpx; + } + .title { + text-align: center; + padding: 20rpx; + font-size: $font-size-toolbar; + font-weight: bold; + } + .info { + font-size: $font-size-tag; + text-align: center; + } + .mask-layer-spelling-close { + position: absolute; + right: -20rpx; + top: -20rpx; + width: 60rpx; + height: 60rpx; + } + .user-list { + padding: 40rpx 0; + text-align: center; + .item { + position: relative; + margin-right: 20rpx; + display: inline-block; + .boss { + position: absolute; + left: -24rpx; + top: 0rpx; + color: #fff; + border-radius: 20rpx; + font-size: $font-size-tag; + padding: 4rpx 10rpx; + z-index: 1; + line-height: 1; + } + image { + width: 80rpx; + height: 80rpx; + vertical-align: middle; + border-radius: 50%; + } + } + .imgX { + width: 100%; + white-space: nowrap; + box-sizing: border-box; + } + } + button { + color: #fff; + border: 0; + margin: 16rpx auto; + display: block; + width: 90%; + } +} +.goods-promotion .price-info{ +} +.countdown { + width: 220rpx; + background: var(--promotion-aux-color); + .txt{ + color: #ffffff!important; + font-size: 28rpx!important; + } + .clockrun{ + margin-top: 16rpx!important; + } + &:after{ + position: absolute; + content: ''; + top: calc(50% - 15rpx); + z-index: 5; + left: -15rpx; + width: 0; + height: 0; + border-style: solid; + border-width: 15rpx 15rpx 15rpx 0; + border-color: transparent var(--promotion-aux-color) transparent transparent; + } + } + + +.ns-goods-action{ +} +.mask { + width: 100%; + height: calc(100% - 200rpx); + background-color: rgba(255, 255, 255, 0); + position: fixed; + top: 0; + left: 0; + z-index: 20; +} +.pintuan-pop { + position: fixed; + background: rgba(255, 255, 255, 0.9); + bottom:140rpx; + bottom: calc(140rpx + env(safe-area-inset-bottom)); + bottom: calc(140rpx + constant(safe-area-inset-bottom)); + right: 20rpx; + width: 560rpx; + height: 270rpx; + padding: 20rpx; + box-shadow: 2rpx 2rpx 20rpx rgba(0, 0, 0, 0.1); + border-radius: 10rpx; + z-index: 100; + transition: 0.5s; +.pintuan-pop-head { + display: flex; + align-items: center; + justify-content: center; + margin-top: 20rpx; + .pintuan-headimg { + display: flex; + align-items: center; + margin-right: 20rpx; + image { + width: 50rpx; + height: 50rpx; + border-radius: 50%; + } + } + .pintuan-txt { + font-size: 30rpx; + text { + color: $base-color; + margin-right: 0.02rem; + } + } +} +.pintuan-pop-time { + display: flex; + align-items: center; + justify-content: center; + margin-top: 20rpx; + text { + color: $base-color; + } +} +.pintuan-pop-member { + display: flex; + justify-content: center; + margin-top: 30rpx; + &.more{ + padding-left: 15px; + } + .member-item { + align-items: center; + display: flex; + position: relative; + width: 80rpx; + height: 80rpx; + box-sizing: border-box; + border: 2rpx solid $base-help-color; + border-radius: 50%; + margin: 0 15rpx; + overflow: hidden; + > image { + width: 80rpx; + height: 80rpx; + } + view { + position: absolute; + bottom: 0; + background-color: $base-help-color; + color: #fff; + border-radius: 20rpx; + width: 70rpx; + text-align: center; + left: 3rpx; + height: 24rpx; + display: flex; + align-items: center; + justify-content: center; + box-sizing: border-box; + .pintuan-text { + width: 34rpx; + } + } + &.icon { + border: 0; + width: 80rpx; + height: 80rpx; + border-radius: 50%; + border: 2rpx dashed #d3d3d3; + text-align: center; + display: flex; + align-items: center; + text { + margin: 0 auto; + font-size: 36rpx; + color: #999; + } + } + } + .member-item-box{ + display: flex; + margin-right: 30rpx; + .member-item{ + margin-right: 0; + margin-left: -30rpx; + } + .icon{ + background-color: #fff; + border-color: var(--main-color); + .iconfont{ + color: var(--main-color); + } + } + } + .pintuan-member-left { + margin-left: 20rpx; + image { + width: 60rpx; + } + } + .pintuan-member-right { + display: flex; + } + &.txt { + align-items: center; + margin-top: 40rpx; + padding-left: 80px; + } +} +} +.fiexd-icon { + position: fixed; + right: 40rpx; + top: 15%; + z-index: 100; + + image { + width: 110rpx; + max-height: 160rpx; + } + view { + position: absolute; + z-index: 10; + width: 110rpx; + bottom: 28rpx; + text-align: center; + font-weight: bold; + font-size: 28rpx; + color: #fff; + display: flex; + flex-direction: column; + line-height: 1.6; + text { + font-weight: 500; + font-size: 24rpx; + } + } +} diff --git a/pages_promotion/pintuan/public/css/list.scss b/pages_promotion/pintuan/public/css/list.scss new file mode 100644 index 0000000..21d11a4 --- /dev/null +++ b/pages_promotion/pintuan/public/css/list.scss @@ -0,0 +1,160 @@ +.ns-adv { + margin: 0; + border-radius: $border-radius; + overflow: hidden; + line-height: 1; + + image { + width: 100%; + } +} +.page{ + width: 100%; + min-height: 100vh; + background: var(--pintuan-promotion-color); +} + +.lineheight-clear { + line-height: 1!important; +} +// 商品列表单列样式 +.goods-list.single-column { + + .goods-item { + padding: 26rpx; + background: #fff; + margin: $margin-updown $margin-both; + border-radius: 26rpx; + display: flex; + position: relative; + + .goods-img { + width: 200rpx; + height: 200rpx; + overflow: hidden; + border-radius: $border-radius; + margin-right: 20rpx; + + image { + width: 100%; + height: 100%; + } + } + + .goods-tag{ + color: #fff; + line-height: 1; + padding: 8rpx 12rpx; + position: absolute; + border-top-left-radius: $border-radius; + border-bottom-right-radius: $border-radius; + top: 26rpx; + left: 26rpx; + font-size: $font-size-goods-tag; + } + + .info-wrap { + flex: 1; + display: flex; + flex-direction: column; + width: calc(100% - 220rpx); + } + + .name-wrap { + flex: 1; + + .name-label{ + border: 0; + border-radius: 8rpx; + margin-right: 8rpx; + padding: 0px 8px; + background: linear-gradient(to left, var(--pintuan-promotion-color), var(--pintuan-promotion-aux-color)); + color: #fff; + font-size: 24rpx; + } + } + + .goods-name { + font-size: $font-size-base; + line-height: 1.3; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + height: 68rpx; + width: 100%; + word-wrap: break-word; + } + + .pintuan-info { + text { + line-height: 1; + margin-right: 20rpx; + border: 1px solid #fff; + font-size: 24rpx; + color: var(--pintuan-color); + } + } + + .discount-price { + display: inline-block; + font-weight: bold; + line-height: 1; + margin-top: 16rpx; + color: var(--price-color); + .unit { + margin-right: 6rpx; + } + + .txt { + font-weight: normal; + } + } + + .pro-info { + position: relative; + margin-top: 16rpx; + + .delete-price { + flex: 1; + display: flex; + align-items: flex-end; + text-decoration: line-through; + .unit { + margin-right: 6rpx; + } + + .txt { + text-decoration:none; + } + } + + & > view { + line-height: 1; + button{ + color: #fff; + background-color: var(--pintuan-promotion-color); + } + &:nth-child(2) { + position: absolute; + right: 0; + bottom: 0; + font-weight: bold; + } + } + } + + .member-price-tag { + display: inline-block; + width: 60rpx; + line-height: 1; + margin-left: 6rpx; + + image { + width: 100%; + } + } + } + +} \ No newline at end of file diff --git a/pages_promotion/pintuan/public/js/detail.js b/pages_promotion/pintuan/public/js/detail.js new file mode 100644 index 0000000..c331c7f --- /dev/null +++ b/pages_promotion/pintuan/public/js/detail.js @@ -0,0 +1,390 @@ +export default { + data() { + return { + posterApi: '/pintuan/api/goods/poster', + goodsRoute: '/pages_promotion/pintuan/detail', + groupId: 0, + pintuan_id: 0, + + pintuanList: [], + currentPintuan: { + headimg: '', + timeMachine: {} + }, + openPopup: false, + timestamp: '', + newList: [], + pintuanPopShow:false, + groupId:0, + groupDetail:null, + pintuan_num_field:'pintuan_num' + } + }, + onLoad(data) { + this.pintuan_id = data.pintuan_id || 0; + if (data.id) { + this.pintuan_id = data.id; + } + this.groupId = data.group_id || 0; + + // 小程序扫码进入 + if (data.scene) { + var sceneParams = decodeURIComponent(data.scene); + sceneParams = sceneParams.split('&'); + if (sceneParams.length) { + sceneParams.forEach(item => { + if (item.indexOf('id') != -1) this.pintuan_id = item.split('-')[1]; + if (item.indexOf('group_id') != -1) this.group_id = item.split('-')[1]; + }); + } + } + // #ifdef MP-WEIXIN + this.getShareImg(); + // #endif + }, + async onShow() { + await this.getGoodsSkuDetail(); + this.getPintuanGroupList(); + if(this.groupId > 0) this.getGroupDetail(); + }, + methods: { + // 获取拼团商品详情 + async getGoodsSkuDetail() { + let res = await this.$api.sendRequest({ + url: '/pintuan/api/goods/detail', + async: false, + data: { + pintuan_id: this.pintuan_id + } + }); + let data = res.data; + if (data.goods_sku_detail != null) { + this.goodsSkuDetail = data.goods_sku_detail; + + this.skuId = this.goodsSkuDetail.sku_id; + this.goodsSkuDetail.group_id = this.groupId; + this.goodsSkuDetail.pintuan_num_field = this.pintuan_num_field; + //拼团倒计时 + if ((this.goodsSkuDetail.end_time - res.timestamp) > 0) { + this.goodsSkuDetail.timeMachine = this.$util.countDown(this.goodsSkuDetail.end_time - res + .timestamp); + } else { + this.$util.showToast({ + title: "活动已结束", + }); + setTimeout(() => { + this.$util.redirectTo('/pages/goods/detail', { + goods_id: this.goodsSkuDetail.goods_id + }, 'redirectTo'); + }, 1000); + } + + // 分享参数、链接 + this.shareQuery = 'pintuan_id=' + this.pintuan_id + '&group_id=' + this.groupId; + this.shareUrl = this.goodsRoute + '?' + this.shareQuery; + + // 在线客服聊天参数 + this.chatRoomParams = { + sku_id: this.goodsSkuDetail.sku_id, + type: 'pintuan', + type_id: this.goodsSkuDetail.pintuan_id + }; + + // 海报参数 + this.posterParams = { + id: this.pintuan_id + }; + + // 处理商品数据 + this.handleGoodsSkuData(); + + this.goodsSkuDetail.show_price = (this.goodsSkuDetail.group_id == 0 ? this.goodsSkuDetail + .promotion_price : this.goodsSkuDetail.pintuan_price); + + this.goodsSkuDetail.save_price = (this.goodsSkuDetail.price - this.goodsSkuDetail.show_price) > 0 ? + (this.goodsSkuDetail + .price - this.goodsSkuDetail.show_price).toFixed(2) : 0; + + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + } else { + this.$util.redirectTo('/pages_tool/goods/not_exist', {}, 'redirectTo'); + } + }, + refreshPintuan(){ + //阶梯参团关闭开团选择后重置价格 + if(this.goodsSkuDetail.pintuan_type == 'ladder' && this.groupDetail){ + if(this.groupDetail.pintuan_num == this.goodsSkuDetail.pintuan_num){ + this.goodsSkuDetail.pintuan_num_field = 'pintuan_num'; + }else if(this.groupDetail.pintuan_num == this.goodsSkuDetail.pintuan_num_2){ + this.goodsSkuDetail.pintuan_num_field = 'pintuan_num_2'; + }else if(this.groupDetail.pintuan_num == this.goodsSkuDetail.pintuan_num_3){ + this.goodsSkuDetail.pintuan_num_field = 'pintuan_num_3'; + } + setTimeout(() => { + this.$refs.goodsSku.getPintuanGoodsSkuInfo(); + }, 500) + // 处理商品数据 + this.goodsDetailViewInit(); + this.$forceUpdate(); + } + + }, + pintuanPirce(data){ + if(data.pintuan_type == 'ordinary'){ + return data.pintuan_price; + }else{ + if(data.pintuan_num_field == 'pintuan_num') return data.pintuan_price; + if(data.pintuan_num_field == 'pintuan_num_2') return data.pintuan_price_2; + if(data.pintuan_num_field == 'pintuan_num_3') return data.pintuan_price_3; + } + }, + // 发起拼团 + pintuan(isPromotion = true, group_id = 0) { + if (!uni.getStorageSync('token')) { + if (!this.source_member) { + this.$refs.login.open(this.shareUrl); + } else { + this.$refs.login.open(this.shareUrl + '&source_member=' + this.source_member); + } + return; + } + + // #ifdef MP-WEIXIN + this.$util.subscribeMessage('PINTUAN_COMPLETE,PINTUAN_FAIL'); + // #endif + + if(this.groupDetail && this.groupDetail.status == 2 && this.groupDetail.order_id){ + let that = this; + uni.showModal({ + title: '提示', + content: '您有一个拼团订单待付款,是否现在跳转支付?', + success: function (res) { + if (res.confirm) { + that.$util.redirectTo('/pages/order/detail', {'order_id':that.groupDetail.order_id}); + } else if (res.cancel) { + + } + } + }); + + return; + } + + if (isPromotion) { + this.resetPrice(); + this.goodsSkuDetail.group_id = 0; + }else if(group_id){ + this.goodsSkuDetail.group_id = group_id; + }else{ + this.goodsSkuDetail.group_id = this.groupId; + } + this.$forceUpdate(); + this.$refs.goodsSku.show("pintuan", () => { + this.resetPrice(); + this.getCartCount(); + }); + }, + // 立即购买 + buyNow() { + if (!uni.getStorageSync('token')) { + if (!this.source_member) { + this.$refs.login.open(this.shareUrl); + } else { + this.$refs.login.open(this.shareUrl + '&source_member=' + this.source_member); + } + return; + } + this.$refs.goodsSku.show("buy_now", () => { + this.getCartCount(); + }); + }, + // 获取拼团组列表 + getPintuanGroupList() { + this.$api.sendRequest({ + url: "/pintuan/api/pintuangroup/lists", + data: { + goods_id: this.goodsSkuDetail.goods_id + }, + success: res => { + let data = res.data; + this.timestamp = res.timestamp + if (data != null && data.length) { + this.pintuanList = data; + for (let i = 0; i < this.pintuanList.length; i++) { + if (this.pintuanList[i]['end_time'] > res.timestamp) { + this.pintuanList[i].timeMachine = this.$util.countDown(this.pintuanList[i][ + 'end_time' + ] - res.timestamp); + this.pintuanList[i].currentTime = res.timestamp; + } else { + this.pintuanList[i].timeMachine = null; + } + } + this.newList = this.pintuanList.filter(item => { + return item.end_time > res.timestamp; + }); + this.$forceUpdate(); + } + } + }); + }, + // 初始化渲染数据 + getGroupDetail() { + this.$api.sendRequest({ + url: '/pintuan/api/pintuangroup/info', + data: { + group_id: this.groupId + }, + success: res => { + this.kill = res.data.pintuan_num - res.data.pintuan_count; + if (res.code == 0) { + if (res.data.end_time > res.timestamp) { + res.data.timeMachine = this.$util.countDown(res.data.end_time - res.timestamp); + } else { + res.data.timeMachine = null; + } + this.groupDetail = res.data; + this.pintuanPopShow = true; + if(this.groupDetail && this.groupDetail.status != 2){ + this.groupId = 0; + this.goodsSkuDetail.group_id = 0; + this.resetPrice(); + } + if(this.goodsSkuDetail.pintuan_type == 'ladder'){ + if(this.groupDetail.pintuan_num == this.goodsSkuDetail.pintuan_num){ + this.goodsSkuDetail.pintuan_num_field = 'pintuan_num'; + }else if(this.groupDetail.pintuan_num == this.goodsSkuDetail.pintuan_num_2){ + this.goodsSkuDetail.pintuan_num_field = 'pintuan_num_2'; + }else if(this.groupDetail.pintuan_num == this.goodsSkuDetail.pintuan_num_3){ + this.goodsSkuDetail.pintuan_num_field = 'pintuan_num_3'; + } + + } + } + this.$forceUpdate(); + } + }); + }, + //打开拼团弹出框 + openPinTuan(groupId, pintuan_num, time, headimg, head_id) { + if (this.memberId == head_id) { + this.$util.showToast({ + title: "您不能参与自己的团" + }); + return; + } + this.openPopup = true; + this.currentPintuan = { + groupId: groupId, + pintuan_num: pintuan_num, + timeMachine: this.$util.countDown(time), + headimg: headimg + }; + this.$refs.pintuanPopup.open(() => { + this.goodsSkuDetail.group_id = 0; + this.openPopup = false; + }); + }, + closePinTuanPopup() { + this.$refs.pintuanPopup.close(); + }, + //参与拼团 + joinPintuan() { + this.closePinTuanPopup(); + this.goodsSkuDetail.group_id = this.currentPintuan.groupId; + this.goodsSkuDetail.show_price = this.goodsSkuDetail.pintuan_price; + this.goodsSkuDetail.save_price = (this.goodsSkuDetail.price - this.goodsSkuDetail.show_price) > 0 ? (this + .goodsSkuDetail + .price - this.goodsSkuDetail.show_price).toFixed(2) : 0; + this.$forceUpdate(); + this.pintuan(false,this.currentPintuan.groupId); + }, + pintuanImageError(index) { + this.pintuanList[index].headimg = this.$util.getDefaultImage().head; + this.$forceUpdate(); + }, + // 重置价格 + resetPrice() { + // this.goodsSkuDetail.group_id = 0; + // this.goodsSkuDetail.show_price = this.goodsSkuDetail.promotion_price; + this.goodsSkuDetail.show_price = (this.goodsSkuDetail.group_id == 0 ? this.goodsSkuDetail + .promotion_price : this.goodsSkuDetail.pintuan_price); + + this.goodsSkuDetail.save_price = (this.goodsSkuDetail.price - this.goodsSkuDetail.show_price) > 0 ? (this + .goodsSkuDetail + .price - this.goodsSkuDetail.show_price).toFixed(2) : 0; + this.$forceUpdate(); + }, + cutStrByte(str, len) { + if (!str || !len) { + //校验参数 + return ''; + } + let code = '1', // 默认返回code值,已截断 + strLen = str.length, // 原字符串长度 + cutStr; + if (strLen <= len / 2) { + //如果字符串长度小于截取长度的一半,则返回全部字符串 + cutStr = str; + code = '0'; + } else { + let strByteCount = 0; //遍历字符串 + for (let i = 0; i < strLen; i++) { + strByteCount += this.getByteLen(str.charAt(i)); //中文字符字节加2 否则加1 + if (strByteCount > len) { + //i从0开始 截断时大于len 只截断到第i个 + cutStr = str.substring(0, i); + break; + } else if (strByteCount == len) { + cutStr = str.substring(0, i + 1); + break; + } + } + } + if (!cutStr) { + //cutstr为空,没有截断字符串 + cutStr = str; + code = '0'; + } + return cutStr; + }, + getByteLen(val) { + //获取字节长度,全角字符两个单位长度,半角字符1个单位长度 + let len = 0; + if (!val) { + return len; + } + for (let i = 0; i < val.length; i++) { + if (!val[i]) { + continue; + } + // 全角 + if (val[i].match(/[^\x00-\xff]/gi) != null) { + len += 2; + } else { + len += 1; + } + } + return len; + }, + /** + * 获取分享图 + */ + getShareImg(){ + let posterParams = { + id: this.pintuan_id + }; + + this.$api.sendRequest({ + url: '/pintuan/api/goods/shareimg', + data: { + page: '/pages_promotion/pintuan/detail', + qrcode_param: JSON.stringify(posterParams) + }, + success: res => { + if (res.code == 0) this.shareImg = res.data.path; + } + }) + } + } +} diff --git a/pages_promotion/pintuan/share.vue b/pages_promotion/pintuan/share.vue new file mode 100644 index 0000000..d4be423 --- /dev/null +++ b/pages_promotion/pintuan/share.vue @@ -0,0 +1,943 @@ + ++ + + + + + + + + + \ No newline at end of file diff --git a/pages_promotion/point/detail.vue b/pages_promotion/point/detail.vue new file mode 100644 index 0000000..6ee2a4e --- /dev/null +++ b/pages_promotion/point/detail.vue @@ -0,0 +1,516 @@ + ++ ++ ++ + ++ + +{{ groupDetail.sku_name }} ++ +{{ groupDetail.pintuan_num }}人团 +已成团{{ groupDetail.group_num }}件 ++ ++ +¥ + {{ groupDetail.order_money }} +¥{{ groupDetail.discount_price }} ++ + ++ + ++ 还差 + + 距结束还剩 +{{ kill }} + 人成团 ++ + 恭喜您,拼团成功 + 很遗憾,拼团失败 + 活动已结束,很遗憾拼团失败 + ++ + +团长 ++ ++ + ++ ++ + + + ++ + + + + + + + ++ + + + ++ ++ 拼团玩法 + ++ ++ ++ ++ + +支付开团 +或参团 ++ ++ + + + ++ ++ + +邀请好友 +参团 ++ ++ + + + ++ ++ + +达到拼团 +人数 ++ ++ + + + ++ ++ + +组团成功 +等待发货 ++ + + + + + + ++ ++ 首页 ++ + ++ 我的 ++ + +快捷 +导航 ++ ++ + + ++ +分享 ++ + ++ + + + ++ + + ++ + ++ 取消分享 + ++ + ++ ++ + 保存图片 + + +长按保存图片 + ++ + {{ posterMsg }} ++ + + + + + + diff --git a/pages_promotion/point/goods_list.vue b/pages_promotion/point/goods_list.vue new file mode 100644 index 0000000..91c0674 --- /dev/null +++ b/pages_promotion/point/goods_list.vue @@ -0,0 +1,902 @@ + ++ + ++ ++ + ++ + + ++ + ++ ++ ++ ++ + ++ + + + ++ +{{ pointInfo.point }}积分 + ++{{ $lang('common.currencySymbol') }}{{ pointInfo.exchange_price }} + + ++ + +{{ $lang('common.currencySymbol') }} +{{ pointInfo.price }} ++ +库存:{{ pointInfo.stock }}{{ pointInfo.stock >= 0 ? pointInfo.unit : '' }} +库存:无限{{ pointInfo.stock >= 0 ? pointInfo.unit : '' }} ++ +{{ pointInfo.goods_name }} +{{ pointInfo.name }} ++ +内含{{ pointInfo.balance }}元 +无门槛优惠券 +{{ '满' + pointInfo.at_least + '减' + pointInfo.money }} ++ 满{{ pointInfo.at_least }}元 + +{{ pointInfo.discount }}折 +最多优惠{{ pointInfo.discount_limit }}元 ++ {{ pointInfo.validity_type == 1 ? '领取之日起' + pointInfo.fixed_term + '天内有效' : $util.timeStampTurnTime(pointInfo.end_time) + '到期' }} + ++ + + ++ ++ + +{{ pointInfo.qr_data.qr_name }} +{{ pointInfo.qr_data.community_describe }} +添加 ++ + ++ ++ 添加社群 + ++ 长按识别二维码,添加社群 ++ + + + ++ + + + ++ + +选择 ++ +{{ item.spec_name }}/{{ item.spec_value_name }} ++ + +属性 ++ +{{ item.attr_name }}: {{ item.attr_value_name }} ++ + + ++ ++ ++ +商品属性 ++ + ++ +{{ item.attr_name }} +{{ item.attr_value_name }} ++ + ++ ++ ++ +商品服务 ++ + ++ ++ + +{{ item.service_name }} +{{ item.desc }} ++ + + + ++ + 兑换详情 + ++ ++ 暂无兑换详情! ++ + + + ++ + + + + + + + + + + + + + diff --git a/pages_promotion/point/list.vue b/pages_promotion/point/list.vue new file mode 100644 index 0000000..d0abda0 --- /dev/null +++ b/pages_promotion/point/list.vue @@ -0,0 +1,527 @@ + ++ + + ++ + + ++ + ++ + ++ +综合 ++ +积分 ++ ++ + + +上新时间 ++ ++ + + +筛选 ++ ++ + + + ++ ++ ++ ++ ++ ++ + ++ +{{ item.name }} ++ ++ +{{ item.point }} +积分 ++ ++ +{{ $lang('common.currencySymbol') }} +{{ parseFloat(item.price).toFixed(2).split(".")[0] }} +.{{ parseFloat(item.price).toFixed(2).split(".")[1] }} ++ +库存{{ item.stock }} ++ + ++ ++ + +筛选 ++ + ++ + ++ 积分区间 + + ++ + + +全部分类 ++ ++ 全部 + +{{ item.category_name }} ++ + + ++ + + + + + + \ No newline at end of file diff --git a/pages_promotion/point/order_list.vue b/pages_promotion/point/order_list.vue new file mode 100644 index 0000000..f9d9cd9 --- /dev/null +++ b/pages_promotion/point/order_list.vue @@ -0,0 +1,584 @@ + ++ + + ++ ++ + + + + ++ + + ++ ++ ++ 我的积分 ++ +{{point}} +积分 ++ + +提醒 +积分兑好礼,每日上新换不停! ++ ++ + ++ + +积分换券 ++ 更多好券,帮你省钱 ++ ++ ++ ++ ++ + + ++ ++ ++ ++ +¥ + {{ parseFloat(couponItem.money) }} ++ +{{ parseFloat(couponItem.discount) }}折 ++ {{ couponItem.at_least == 0 ? '无门槛优惠券' : '满' + parseFloat(couponItem.at_least).toFixed(0) + '可用' }} + +{{ couponItem.goods_type == 2 ? '指定券' : '全场券' }} ++ +{{ couponItem.point }}积分 +兑换 ++ + ++ + +积分换红包 ++ 红包在手,省钱有道 ++ ++ ++ + ++ ++ ++ +¥ + {{ parseFloat(hongbaoItem.balance).toFixed(0) }} +{{ hongbaoItem.name }} ++ +{{ hongbaoItem.point }}积分 +兑换 ++ ++ + ++ 超值兑换 ++ + ++ ++ ++ + ++ +{{ item.name }} ++ ++ +{{ item.point }} +积分 ++ ++ +{{ parseFloat(item.price).toFixed(2).split(".")[0] }} +.{{ parseFloat(item.price).toFixed(2).split(".")[1] }}元 + ++ +库存:{{ item.stock }} +已兑:{{ item.sale_num }} ++ ++ ++ ++ +积分说明 ++ + ++ +积分的获取 +1、积分可在注册、签到、分享、消费、充值时获得。 +2、在购买部分商品时可获得积分。 +积分的使用 +1、积分可用于兑换积分中心的商品。 +2、积分可在参与某些活动时使用。 +3、积分不得转让,出售,不设有效期。 +积分的查询 +1、积分可在会员中心中查询具体数额以及明细。 ++ + + + + + + + + diff --git a/pages_promotion/point/payment.vue b/pages_promotion/point/payment.vue new file mode 100644 index 0000000..9f51f51 --- /dev/null +++ b/pages_promotion/point/payment.vue @@ -0,0 +1,305 @@ + ++ + ++ ++ {{ statusItem.name }} + ++ + + ++ ++ ++ ++ +订单号:{{ orderItem.order_no }} ++ {{ orderItem.order_status == 0 ? '待支付' : orderItem.order_status == 1 ? '已完成' : orderItem.order_status == -1 ? '已关闭' : '' }} + ++ ++ ++ ++ ++ + ++ + ++ + ++ +{{ orderItem.exchange_name }} ++ ++ +{{ orderItem.point }} +积分 ++ + + +{{ $lang('common.currencySymbol') }} +{{ parseFloat(orderItem.price).toFixed(2).split(".")[0] }} +.{{ parseFloat(orderItem.price).toFixed(2).split(".")[1] }} ++ ++ {{ orderItem.num }} + + ++ +关闭 +支付 ++ +查看详情 ++ ++ ++ + + + + + + + + + + + + diff --git a/pages_promotion/point/public/css/detail.scss b/pages_promotion/point/public/css/detail.scss new file mode 100644 index 0000000..e69de29 diff --git a/pages_promotion/point/public/css/list.scss b/pages_promotion/point/public/css/list.scss new file mode 100644 index 0000000..d7fb8f0 --- /dev/null +++ b/pages_promotion/point/public/css/list.scss @@ -0,0 +1,707 @@ +/* 说明弹框 */ +.tips-layer { + background: #fff; + z-index: 999; + height: 40%; + width: 100%; + + .head { + position: relative; + } + + .title { + height: 80rpx; + line-height: 80rpx; + text-align: center; + font-size: $font-size-toolbar; + font-weight: 700; + } + + text { + position: absolute; + top: 8rpx; + right: 22px; + font-size: $font-size-toolbar; + font-weight: 500; + } + + .body { + width: 100%; + height: calc(100% - 80rpx); + overflow-y: scroll; + + .detail { + padding: 20rpx; + + .font-size-base { + margin-bottom: 10rpx; + } + } + + } +} + +.lineheight-clear { + line-height: 1!important; +} + +// 商品列表双列样式 +.goods-list.double-column { + display: flex; + flex-wrap: wrap; + margin-top: 20rpx; + + .goods-item { + flex: 1; + position: relative; + background-color: #fff; + flex-basis: 48%; + max-width: calc((100% - 24rpx) / 2); + margin-right: 24rpx; + margin-bottom: 24rpx; + border-radius: 18rpx; + + &:nth-child(2n) { + margin-right: 0; + } + + .goods-img { + position: relative; + overflow: hidden; + padding-top: 100%; + border-top-left-radius: 18rpx; + border-top-right-radius: 18rpx; + + image { + width: 100%; + position: absolute; + top: 50%; + left: 0; + transform: translateY(-50%); + } + } + + .goods-tag{ + color: #fff; + line-height: 1; + padding: 8rpx 16rpx; + position: absolute; + border-bottom-right-radius: $border-radius; + top: 0; + left: 0; + font-size: $font-size-goods-tag; + } + + .goods-tag-img { + position: absolute; + border-top-left-radius: $border-radius; + width: 80rpx; + height: 80rpx; + top: 0; + left: 0; + z-index: 5; + overflow: hidden; + + image { + width: 100%; + height: 100%; + } + } + + .info-wrap { + padding: 0 26rpx 26rpx 26rpx; + } + + .goods-name { + font-size: $font-size-base; + line-height: 1.3; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 1; + -webkit-box-orient: vertical; + margin-top: 20rpx; + height: 36rpx; + } + + .discount-price { + display: inline-block; + font-weight: bold; + line-height: 1; + margin-top: 16rpx; + color: var(--price-color); + .unit { + margin-right: 6rpx; + } + .point{ + font-size: 32rpx; + } + } + + .pro-info { + display: flex; + margin-top: 16rpx; + justify-content: flex-start; + & > view { + line-height: 1; + display: flex; + align-items: center; + + button { + padding: 0 16rpx; + line-height: 2; + } + &:nth-child(2) { + &:before{ + content: ' '; + width: 2rpx; + background-color: #D8D8D8; + height: 20rpx; + margin: 0 16rpx; + } + } + } + } + + .member-price-tag { + display: inline-block; + width: 60rpx; + line-height: 1; + margin-left: 6rpx; + + image { + width: 100%; + } + } + } +} + +.head-wrap { + width: 100vw; + line-height: 1; + position: relative; + height: 270rpx; + + & > image { + width: 100%; + } + + .wrap { + width: 100%; + height: 100%; + position: absolute; + z-index: 5; + top: 0; + left: 0; + } + + .member-wrap { + height: 190rpx; + padding: 50rpx 30rpx 30rpx 30rpx; + display: flex; + align-items: center; + box-sizing: border-box; + + .headimg { + width: 100rpx; + height: 100rpx; + background: #fff; + border: 2px solid #fff; + border-radius: 50%; + overflow: hidden; + + image { + width: 100%; + height: 100%; + } + } + + .point { + margin-left: 30rpx; + color: var(--btn-text-color); + font-size: 36rpx; + } + + .point-name { + font-size: $font-size-tag; + color: var(--btn-text-color); + margin-left: 4rpx; + margin-top: 5rpx; + + } + + .rule { + flex: 1; + text-align: right; + color: var(--btn-text-color); + } + + .icon-wenhao { + font-size: 24rpx; + color: var(--btn-text-color); + margin-right: 6rpx; + } + + } + + .action-wrap { + // margin: 0 30rpx; + display: flex; + justify-content: space-between; + align-items: center; + height: 80rpx; + background-color: rgba(255, 255, 255, .1); + + view { + line-height: 1; + text-align: center; + width: calc((100vw - 1rpx) / 2); + color: var(--btn-text-color); + + text { + font-size: $font-size-tag; + margin-left: 8rpx; + } + + // &:first-child { + // margin-right: 30rpx; + // } + + &.split { + width: 1rpx; + height: 50rpx; + background-color: rgba(238, 238, 238, .3); + flex-shrink: 0; + } + + image { + width: 100%; + } + } + } + + .no-login { + display: flex; + align-items: center; + justify-content: center; + text-align: center; + + text { + color: #fff; + } + + .login-btn { + display: inline-block; + height: 70rpx; + line-height: 70rpx; + width: 200rpx; + border: 1px solid #fff; + border-radius: $border-radius; + margin-bottom: 20rpx; + } + } +} + +.ns-adv { + margin: 0; + border-radius: 0; + overflow: hidden; + line-height: 1; + + image { + width: 100%; + border-radius: 0!important; + } +} +.body-wrap { + margin-top: 50rpx; + + &.no-login{ + margin-top: 20rpx; + } + + .point-exchange-wrap { + padding: 0 24rpx; + margin-top: 30rpx; + } + + .type-wrap { + display: flex; + align-items: center; + + .type-name { + font-size: 30rpx; + color: $color-title; + line-height: 1; + } + + >view { + width: 2rpx; + height: 23rpx; + background-color: $color-tip; + margin: 0 20rpx; + } + + .type-sub { + font-size: $font-size-tag; + color: $color-tip; + line-height: 1; + } + } + + .list-wrap { + width: 100%; + + .list-wrap-scroll { + width: 100%; + flex-direction: row; + // white-space: nowrap; + line-height: 1; + } + + .list-wrap-item { + display: inline-block; + width: 330rpx; + overflow: hidden; + margin-right: 30rpx; + margin-top: 20rpx; + position: relative; + + &.coupon-list-wrap-item { + // height: 170rpx; + } + + &.hongbao-list-wrap-item { + height: 141rpx; + } + + &:nth-child(2n+2){ + margin-right: 0; + } + + .img-box { + width: 100%; + height: 100%; + position: absolute; + top: 0; + left: 0; + + image { + width: 100%; + height: 100%; + } + } + + .content { + position: relative; + z-index: 9; + + //优惠券样式 + .coupon{ + // background-color: #FFEAEA; + background-size: 100% 100%; + background-repeat: no-repeat; + border-radius: $border-radius; + display: flex; + padding:$margin-updown 0; + .coupon_right{ + position:relative; + width:120rpx; + min-width:120rpx; + .coupon_btn{ + margin: 10rpx auto 0; + width:80rpx; + height:40rpx; + line-height: 40rpx; + font-size: $font-size-tag; + text-align: center; + border-radius: 10rpx; + border-width: 1px; + border-style: solid; + } + .coupon_num { + margin-top:10rpx; + text-align: center; + } + // border-left: 1px dashed #FF4544; + + &::after{ + position :absolute; + top:0; + margin-left: 0; + content:""; + width:0; + height:100%; + border-left:1px dashed ; + opacity: 0.2; + } + // &::before{ + // position :absolute; + // top:-$margin-both; + // margin-left: -15rpx; + // content:""; + // width:30rpx; + // height:15rpx; + // background-color: #fff; + // border-radius: 0 0 15rpx 15rpx; + // } + } + .coupon_left{ + flex:1; + text-align: left; + padding:0 $padding; + .price{ + font-size: 48rpx; + font-weight: 500; + margin-top: 0 !important; + padding:0; + font-weight: 600; + width: 170rpx; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + text{ + font-size: $font-size-tag; + + } + } + .coupon_condition{ + width: 170rpx; + margin-top:$margin-updown; + line-height: 1; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .coupon_type { + } + } + } + + .hongbao { + .coupon_left { + .price, .coupon_condition { + color: #FFFFFF; + } + } + + .coupon_right { + .coupon_num { + color: #FFFFFF; + } + + .coupon_btn { + color: #fff; + border-color: #fff; + } + &::after{ + position :absolute; + top:0; + margin-left: 0; + content:""; + width:0; + height:100%; + border-left:0 ; + opacity: 0.2; + } + } + } + + .coupon-price-wrap { + width: 100%; + height: 105rpx; + display: flex; + justify-content: space-between; + + .coupon-price { + font-size: 48rpx; + margin-top: 10rpx; + margin-left: 20rpx; + + text { + font-size: $font-size-tag; + } + } + } + + .coupon-point { + .coupon-point-num { + width: 160rpx; + height: 44rpx; + position: relative; + + image { + width: 100%; + height: 100%; + position: absolute; + } + + text { + position: relative; + z-index: 9; + color: #FFFFFF; + font-size: 24rpx; + display: inline-block; + width: 100%; + line-height: 44rpx; + text-align: center; + vertical-align: top; + } + } + + .coupon-conditions { + font-size: $font-size-activity-tag; + color: $color-tip; + line-height: 1; + margin-top: $font-size-tag; + } + } + + .coupon-name { + font-size: $font-size-tag; + color: $color-title; + margin-top: 23rpx; + line-height: 1; + padding: 0 22rpx; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + // 红包 + &.hongbao-content { + background-color: #FFFFFF; + border-radius: 20rpx; + padding-bottom: 30rpx; + } + + .hongbao-img { + height: 330rpx; + + image { + width: 100%; + height: 100%; + } + } + + .price { + font-size: $font-size-base; + color: $color-title; + line-height: 1; + padding-left: 26rpx; + margin-top: 20rpx; + } + + .point { + font-size: $font-size-toolbar; + padding-left: 26rpx; + margin-top: 17rpx; + line-height: 1; + text { + font-size: $font-size-tag; + } + } + + .stock { + font-size: $font-size-activity-tag; + color: $color-tip; + line-height: 1; + padding-left: 26rpx; + margin-top: 20rpx; + } + } + } + } +} + +.type-wrap-box { + display: flex; + justify-content: space-between; + + .more { + color: #ff5251; + cursor: pointer; + } +} +.card-category-title{ + display: flex; + align-items: center; + justify-content: center; + font-size: 30rpx; + color: var(--main-color); + padding: 0; + font-weight: bold; + + .before-line,.after-line{ + width: 30rpx; + height: 4rpx; + margin: 0 10rpx; + background-color: var(--main-color); + } + +} +.head-box{ + display: flex; + flex-direction: column; + background-color: #FFFFFF; + border-radius: 16rpx; + padding: 30rpx 24rpx; + box-sizing: border-box; + width: calc(100% - 48rpx); + margin: -50rpx 24rpx 30rpx; + position: relative; + z-index: 100; + .account-content{ + display: flex; + justify-content: space-between; + align-items: center; + .left{ + display: flex; + align-items: center; + image{ + width: 88rpx; + height: 88rpx; + } + view{ + font-size: 32rpx; + font-weight: bold; + margin-left: 25rpx; + } + } + .right{ + display: flex; + align-items: baseline; + .point{ + font-weight: bold; + font-size: 38rpx; + } + .text{ + font-size: 28rpx; + font-weight: bold; + margin: 0 10rpx; + } + } + } + .remark{ + display: flex; + align-items: center; + margin-top: 30rpx; + padding: 30rpx 0 0; + border-top: 2rpx solid #F2F2F2; + .label{ + border-radius: 4rpx; + border: 2rpx solid var(--main-color); + color: var(--main-color); + padding: 2rpx 8rpx; + font-size: 22rpx; + line-height: 1; + font-weight: bold; + } + .text{ + font-size: 24rpx; + font-weight: bold; + margin-left: 30rpx; + line-height: 1; + } + } +} \ No newline at end of file diff --git a/pages_promotion/point/public/js/payment.js b/pages_promotion/point/public/js/payment.js new file mode 100644 index 0000000..9affe80 --- /dev/null +++ b/pages_promotion/point/public/js/payment.js @@ -0,0 +1,605 @@ +export default { + data() { + return { + isIphoneX: false, + orderCreateData: { + member_address: { + mobile: '' + } + }, + orderPaymentData: { + exchange_info: { + type: 0 + }, + delivery: { + delivery_type: '' + }, + member_address: { + mobile: '' + }, + local_config: { + info: { + start_time: 0, + end_time: 0, + time_week: [] + } + }, + express_type: [], + }, + isSub: false, + tempData: null, + // 门店信息 + storeInfo: { + storeList: [], //门店列表 + currStore: {} //当前选择门店 + }, + // 自提地址 + member_address: { + mobile: '' + }, + // 当前时间 + timeInfo: { + week: 0, + start_time: 0, + end_time: 0, + showTime: false, + showTimeBar: false + }, + canLocalDelicery: true, + deliveryWeek: "", + // 选择自提、配送防重判断 + judge:true, + menuButtonBounding: {} + }; + }, + methods: { + // 显示弹出层 + openPopup(ref) { + this.$refs[ref].open(); + }, + // 关闭弹出层 + closePopup(ref) { + if (this.tempData) { + Object.assign(this.orderCreateData, this.tempData); + Object.assign(this.orderPaymentData, this.tempData); + this.tempData = null; + this.$forceUpdate(); + } + this.$refs[ref].close(); + }, + // 选择收货地址 + selectAddress() { + var params = { + back: '/pages_promotion/point/payment', + local: 0, + type: 1 + } + // 外卖配送需要定位地址 + if (this.orderPaymentData.delivery.delivery_type == 'local') { + params.local = 1; + params.type = 2; + } + this.$util.redirectTo('/pages_tool/member/address', params); + }, + // 获取订单初始化数据 + getOrderPaymentData() { + this.orderCreateData = uni.getStorageSync('exchangeOrderCreateData'); + var pay_flag = uni.getStorageSync("pay_flag"); // 支付中标识,防止返回时,提示,跳转错误 + if (!this.orderCreateData) { + if (pay_flag == 1) { + uni.removeStorageSync("pay_flag"); + } else { + this.$util.showToast({ + title: '未获取到创建订单所需数据!' + }); + setTimeout(() => { + this.$util.redirectTo('/pages/index/index'); + }, 1500); + } + return; + } + + // 获取经纬度 + if (this.location) { + this.orderCreateData.latitude = this.location.latitude; + this.orderCreateData.longitude = this.location.longitude; + } + //获取门店缓存 + var store_info_storage = uni.getStorageSync('store'); + if (store_info_storage) { + this.orderCreateData.default_store_id = store_info_storage.store_id; + } + + this.$api.sendRequest({ + url: '/pointexchange/api/ordercreate/payment', + data: this.orderCreateData, + success: res => { + if (res.code >= 0) { + this.orderPaymentData = res.data; + this.orderPaymentData.timestamp = res.timestamp; + this.handlePaymentData(); + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + } else { + this.$util.showToast({ + title: '未获取到创建订单所需数据!' + }); + setTimeout(() => { + this.$util.redirectTo('/pages/index/index'); + }, 1500); + } + }, + fail: res => { + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + } + }) + }, + // 处理结算订单数据 + handlePaymentData() { + this.orderCreateData.delivery = {}; + this.orderCreateData.buyer_message = ''; + + var data = this.orderPaymentData; + + // 店铺配送方式 + if (data.express_type != undefined && data.express_type[0] != undefined) { + var express_type = data.express_type; + this.orderCreateData.delivery.store_id = 0; + // 获取选择配送方式缓存 + var delivery_storage = uni.getStorageSync('delivery'); + if (delivery_storage) { + var delivery_type = delivery_storage.name; + var delivery_type_name = delivery_storage.title; + // 如果配送方式缓存是门店配送模拟点击门店tab选项 + data.express_type.forEach(item => { + if ((delivery_type == 'store' && item.name == delivery_type) || (delivery_type == 'local' && item.name == delivery_type)) { + this.storeSelected(item); + } + }) + if (delivery_type == 'store') { + this.member_address = { + mobile: data.member_account.mobile != '' ? data.member_account.mobile : '' + }; + } + } else { + var delivery_type = express_type[0].name; + if(delivery_type == "store"){ + this.member_address = { + mobile: data.member_account.mobile != '' ? data.member_account.mobile : '' + }; + } + var delivery_type_name = express_type[0].title; + } + this.orderCreateData.delivery.delivery_type = delivery_type; + this.orderCreateData.delivery.delivery_type_name = delivery_type_name; + + // 如果默认配送方式是门店配送模拟点击门店tab选项 + if (express_type[0].name == 'store' || express_type[0].name == 'local') { + this.storeSelected(express_type[0]); + } + } + + if (this.orderPaymentData.is_virtual) this.orderCreateData.member_address = { + mobile: data.member_account.mobile != '' ? data.member_account.mobile : '' + }; + + Object.assign(this.orderPaymentData, this.orderCreateData); + this.orderCalculate(); + }, + // 转化时间字符串 + getTimeStr(val) { + var h = parseInt(val / 3600).toString(); + var m = parseInt((val % 3600) / 60).toString(); + if (m.length == 1) { + m = '0' + m; + } + if (h.length == 1) { + h = '0' + h; + } + return h + ':' + m; + }, + // 订单计算 + orderCalculate() { + var data = this.$util.deepClone(this.orderCreateData); + data.delivery = JSON.stringify(data.delivery); + if (this.orderCreateData.delivery.delivery_type == 'store') { + data.member_address = JSON.stringify(this.member_address); + } else { + data.member_address = JSON.stringify(data.member_address); + } + + this.$api.sendRequest({ + url: '/pointexchange/api/ordercreate/calculate', + data, + success: res => { + if (res.code >= 0) { + this.orderPaymentData.member_address = res.data.member_address; + this.orderPaymentData.delivery_money = res.data.delivery_money; + this.orderPaymentData.order_money = res.data.order_money; + + this.orderPaymentData.delivery = res.data.delivery; + + if (res.data.local_config) this.orderPaymentData.local_config = res.data.local_config; + + //时间选择判断 + if(res.data.delivery_store_info){ + this.orderPaymentData.delivery_store_info = JSON.parse(res.data.delivery_store_info); + if(this.judge){ + if(this.orderPaymentData.delivery.delivery_type == "store"){ + this.storetime('no'); + }else if(this.orderPaymentData.delivery.delivery_type == 'local'){ + this.localtime('no'); + } + this.judge = false; + } + } + + this.createBtn(); + this.$forceUpdate(); + } else { + this.$util.showToast({ + title: res.message + }); + } + }, + }) + }, + /** + * 订单创建验证 + */ + createBtn(){ + if(this.orderPaymentData.delivery + && this.orderPaymentData.delivery.delivery_type == 'local' + && this.orderPaymentData.delivery + && this.orderPaymentData.delivery.error + && this.orderPaymentData.delivery.start_money > this.orderPaymentData.price){ + return false; + } + if(this.orderPaymentData.delivery + && this.orderPaymentData.delivery.delivery_type == 'local' + && this.orderPaymentData.delivery + && this.orderPaymentData.delivery.error + && this.orderPaymentData.delivery.error !== ''){ + return false; + } + return true; + }, + // 订单创建 + orderCreate() { + if (this.verify()) { + if (this.isSub) return; + this.isSub = true; + + uni.setStorageSync('paySource', 'pointexchange'); + + var data = this.$util.deepClone(this.orderCreateData); + data.delivery = JSON.stringify(data.delivery); + if (this.orderCreateData.delivery.delivery_type == 'store') { + data.member_address = JSON.stringify(this.member_address); + } else { + data.member_address = JSON.stringify(data.member_address); + } + + this.$api.sendRequest({ + url: '/pointexchange/api/ordercreate/create', + data, + success: res => { + uni.hideLoading(); + if (res.code >= 0) { + if (this.orderPaymentData.exchange_info.type == 1 && this.orderPaymentData.order_money != + '0.00') { + + let orderCreateData = uni.getStorageSync('exchangeOrderCreateData'); + orderCreateData.out_trade_no = res.data; + uni.setStorageSync('exchangeOrderCreateData', orderCreateData); + + this.$refs.choosePaymentPopup.getPayInfo(res.data); + this.isSub = false; + } else { + this.$util.redirectTo('/pages_promotion/point/result', {}, 'redirectTo'); + } + } else { + this.isSub = false; + if (res.data.error_code == 10 || res.data.error_code == 12) { + uni.showModal({ + title: '订单未创建', + content: res.message, + confirmText: '去设置', + success: res => { + if (res.confirm) { + this.selectAddress(); + } + } + }) + } else { + this.$util.showToast({ + title: res.message + }); + } + } + }, + fail: res => { + uni.hideLoading(); + this.isSub = false; + } + }) + } + }, + // 订单验证 + verify() { + if (this.orderPaymentData.exchange_info.type == 1) { + if (this.orderPaymentData.is_virtual == 1) { + if (!this.orderCreateData.member_address.mobile.length) { + this.$util.showToast({ + title: '请输入您的手机号码' + }); + return false; + } + var reg = /^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$/; + if (!reg.test(this.orderCreateData.member_address.mobile)) { + this.$util.showToast({ + title: '请输入正确的手机号码' + }); + return false; + } + } + + if (this.orderPaymentData.is_virtual == 0) { + if (!this.orderCreateData.delivery || !this.orderCreateData.delivery.delivery_type) { + this.$util.showToast({ + title: '商家未设置配送方式' + }); + return false; + } + + if (this.orderCreateData.delivery.delivery_type != 'store') { + if (!this.orderPaymentData.member_address) { + this.$util.showToast({ + title: '请先选择您的收货地址' + }); + return false; + } + } + + if (this.orderCreateData.delivery.delivery_type == 'store') { + if (!this.orderCreateData.delivery.store_id) { + this.$util.showToast({ + title: '没有可提货的门店,请选择其他配送方式' + }); + return false; + } + if (!this.member_address.mobile) { + this.$util.showToast({ + title: '请输入预留手机' + }); + return false; + } + var reg = /^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$/; + if (!reg.test(this.member_address.mobile)) { + this.$util.showToast({ + title: '请输入正确的预留手机' + }); + return false; + } + + if(!this.orderCreateData.buyer_ask_delivery_time){ + this.$util.showToast({ + title: '请选择自提时间' + }); + return false; + } + } + + if (this.orderCreateData.delivery.delivery_type == 'local') { + if (!this.orderCreateData.delivery.store_id) { + this.$util.showToast({ + title: '没有可配送的门店,请选择其他配送方式' + }); + return false; + } + if (this.orderPaymentData.local_config && this.orderPaymentData.local_config.info && this.orderPaymentData.local_config.info.time_is_open == 1 && !this.orderCreateData.buyer_ask_delivery_time) { + this.$util.showToast({ + title: '请选择配送时间' + }); + return false; + } + } + } + + } + return true; + }, + // 显示店铺配送信息 + openSiteDelivery() { + this.tempData = { + delivery: this.$util.deepClone(this.orderPaymentData.delivery) + }; + this.$refs.deliveryPopup.open(); + }, + // 选择配送方式 + selectDeliveryType(data) { + uni.setStorageSync('delivery', { + title: data.title, + name: data.name + }); + this.orderCreateData.delivery.delivery_type = data.name; + this.orderCreateData.delivery.delivery_type_name = data.title; + + // 如果是门店配送 + if (data.name == 'store') { + this.storeSelected(data); + if (!this.member_address.mobile) this.member_address.mobile = this.orderPaymentData.member_account.mobile != '' ? this.orderPaymentData.member_account.mobile : ''; + } + if (data.name == 'local') { + this.storeSelected(data); + } + Object.assign(this.orderPaymentData, this.orderCreateData); + + this.judge = true; + + this.orderCalculate(); + this.$forceUpdate(); + }, + // 切换到门店 + storeSelected(data) { + // 门店列表 + this.storeInfo.storeList = data.store_list; + let store = data.store_list[0] ? data.store_list[0] : null; + this.selectPickupPoint(store); + }, + // 选择自提点 + selectPickupPoint(store_item) { + if (store_item) { + this.orderCreateData.delivery.store_id = store_item.store_id; + this.storeInfo.currStore = store_item; + // 存储所选门店 + let delivery = uni.getStorageSync('delivery'); + delivery.store_id = store_item.store_id; + uni.setStorageSync('delivery', delivery) + } else { + this.orderCreateData.delivery.store_id = 0; + this.storeInfo.currStore = {}; + } + this.orderCreateData.buyer_ask_delivery_time = ''; + this.orderCreateData.buyer_ask_delivery_title = ''; + Object.assign(this.orderPaymentData, this.orderCreateData); + this.orderCalculate(); + this.$forceUpdate(); + this.$refs['deliveryPopup'].close(); + }, + imageError() { + let imageUrl = '' + if (this.orderPaymentData.exchange_info.type == 1) { + imageUrl = this.$util.img('public/uniapp/point/gift.png'); + } else if (this.orderPaymentData.exchange_info.type == 2) { + imageUrl = this.$util.img('public/uniapp/point/coupon.png'); + } else if (this.orderPaymentData.exchange_info.type == 3) { + imageUrl = this.$util.img('public/uniapp/point/hongbao.png'); + } else { + imageUrl = this.$util.getDefaultImage().goods; + } + this.orderPaymentData.exchange_info.image = imageUrl; + this.$forceUpdate(); + }, + // 选择自提时间 + bindTimeChange(data) { + let time = data.detail.value; + this.orderCreateData.buyer_ask_delivery_time = time; + this.orderCalculate(); + this.$forceUpdate(); + }, + // 获取时间 + getTime() { + // 必须是字符串,跟后端一致 + let weeks = ['0', '1', '2', '3', '4', '5', '6']; + let week = new Date().getDay(); + this.timeInfo.week = weeks[week]; + }, + navigateTo(sku_id) { + this.$util.redirectTo('/pages/goods/detail', { + sku_id + }); + }, + // 显示选择支付方式弹框 + openChoosePayment() { + if (this.verify() && this.orderPaymentData.exchange_info.type == 1 && this.orderPaymentData.order_money != + '0.00') this.$refs.choosePaymentPopup.open(); + else this.orderCreate(); + }, + /** + * 同城配送数据处理 + */ + localtime(type = ''){ + let data = this.$util.deepClone(this.orderPaymentData.local_config.info); + if (data.delivery_time) { + data.end_time = data.delivery_time[ (data.delivery_time.length - 1) ].end_time; + } + let obj = { + delivery: this.orderCreateData.delivery, + dataTime: data + } + this.$refs.TimePopup.open(obj,type); + }, + /** + * 门店自提数据处理 + */ + storetime(type = ''){ + if(this.orderPaymentData.delivery_store_info){ + let data = this.$util.deepClone(this.storeInfo.currStore); + if (data.delivery_time) { + data.delivery_time = JSON.parse(data.delivery_time); + data.end_time = data.delivery_time[ (data.delivery_time.length - 1) ].end_time; + } else { + data.delivery_time = [ {start_time: data.start_time, end_time: data.end_time} ] + } + let obj = { + delivery:this.orderCreateData.delivery, + dataTime:data + } + this.$refs.TimePopup.open(obj,type); + this.$forceUpdate(); + } + }, + /** + * 弹窗返回数据 + */ + selectTime(data){ + if(data.data && data.data.month){ + let nowDate = new Date(); + let Year = nowDate.getFullYear(); + let timeData = data.data.month.split('月'); + let month = timeData[0]; + let date = timeData[1].split('日')[0] + + this.orderCreateData.buyer_ask_delivery_time = Year + '-' + month + '-' + date + ' ' + data.data.time + if(data.data.title == '今天' || data.data.title == '明天'){ + this.orderCreateData.buyer_ask_delivery_title = data.data.title + '(' + data.data.time + ')' + }else{ + this.orderCreateData.buyer_ask_delivery_title = data.data.month + '(' + data.data.time + ')' + } + this.$forceUpdate(); + } + } + }, + onShow() { + if (uni.getStorageSync('addressBack')) { + uni.removeStorageSync('addressBack'); + } + // 判断登录 + if (!uni.getStorageSync('token')) { + this.$util.redirectTo('/pages_tool/login/login'); + } else { + this.getOrderPaymentData(); + } + this.judge = true; + + this.getTime(); + this.isIphoneX = this.$util.uniappIsIPhoneX() + }, + onHide() { + if (this.$refs.loadingCover) this.$refs.loadingCover.show(); + }, + onLoad(){ + if (!this.location) this.$util.getLocation(); + // #ifdef MP + this.menuButtonBounding = uni.getMenuButtonBoundingClientRect(); + // #endif + }, + computed: { + location(){ + return this.$store.state.location; + } + }, + watch: { + location: function(nVal){ + if (nVal) { + this.getOrderPaymentData(); + } + } + }, + filters: { + // 金额格式化输出 + moneyFormat(money) { + return parseFloat(money).toFixed(2); + } + } +} diff --git a/pages_promotion/point/result.vue b/pages_promotion/point/result.vue new file mode 100644 index 0000000..3c31719 --- /dev/null +++ b/pages_promotion/point/result.vue @@ -0,0 +1,95 @@ + ++ ++ 确认订单 + ++ + + + + + ++ + + + + + ++ ++ {{ deliveryItem.title }} + + ++ + + ++ ++ ++ 由 +{{ storeInfo.currStore.store_name }} 提供配送 ++ +点击切换 ++ + ++ +您的附近没有可配送的门店,请选择其他配送方式 ++ ++ +{{ orderPaymentData.member_address.name ? orderPaymentData.member_address.name : '' }} +{{ orderPaymentData.member_address.mobile ? orderPaymentData.member_address.mobile : '' }} ++ + {{ orderPaymentData.member_address.full_address ? orderPaymentData.member_address.full_address : '' }} + {{ orderPaymentData.member_address.address ? orderPaymentData.member_address.address : '' }} + ++ + + +请设置收货地址 ++ + ++ ++ +送达时间 ++ +{{ orderCreateData.buyer_ask_delivery_title ? orderCreateData.buyer_ask_delivery_title : '请选择送达时间' }} ++ + + + + + ++ ++ ++ ++ ++ +{{ storeInfo.currStore.store_name }} ++ + +营业时间:{{ storeInfo.currStore.open_date }} +地址:{{ storeInfo.currStore.full_address }} {{ storeInfo.currStore.address }} ++ ++ +预留手机 + ++ +自提时间 ++ {{orderCreateData.buyer_ask_delivery_title}} + ++ 当前无自提门店,请选择其它配送方式 + ++ + + + ++ ++ 购买虚拟类商品需填写手机号,方便商家与您联系 + ++ 手机号码 + ++ + + ++ ++ ++ ++ ++ + ++ ++ + ++ + +{{ orderPaymentData.exchange_info.name }} ++ ++ +{{ orderPaymentData.exchange_info.point }} +积分 + ++{{ $lang('common.currencySymbol') }} +{{ orderPaymentData.exchange_info.price }} + ++ +x +{{ orderPaymentData.num }} ++ ++ +买家留言 ++ + + + ++ +所需积分 ++ +{{ orderPaymentData.point }} +积分 ++ + +运费 ++ +{{ $lang('common.currencySymbol') }} +{{ orderPaymentData.delivery_money | moneyFormat }} ++ + + + ++ +共{{ orderPaymentData.goods_num }}件 +合计: +{{ orderPaymentData.point }} +积分 + ++{{ $lang('common.currencySymbol') }} +{{ orderPaymentData.order_money | moneyFormat }} + ++ + + ++ + ++ ++ +已为您甄选出附近所有相关门店 ++ + ++ ++ ++ ++ +{{ item.store_name }} +({{ item.distance }}km) ++ ++ 营业时间:{{ item.open_date }} + ++ 地址:{{ item.full_address }}{{ item.address }} + ++ 所选择收货地址附近没有可以自提的门店 ++ + + + + + + + + + + + + diff --git a/pages_promotion/presale/detail.vue b/pages_promotion/presale/detail.vue new file mode 100644 index 0000000..06fb73b --- /dev/null +++ b/pages_promotion/presale/detail.vue @@ -0,0 +1,345 @@ + ++ ++ {{ $lang('exchangeSuccess') }} ++ +{{ $lang('see') }} +{{ $lang('goHome') }} ++ + + + + + + + + diff --git a/pages_promotion/presale/list.vue b/pages_promotion/presale/list.vue new file mode 100644 index 0000000..b319e96 --- /dev/null +++ b/pages_promotion/presale/list.vue @@ -0,0 +1,169 @@ + ++ + + ++ + + + ++ ++ ++ + +预售 +已有{{ goodsSkuDetail.sale_num }}人预约 ++ +距结束仅剩 ++ ++ + + + ++ ++ +{{ $lang('common.currencySymbol') }} ++ {{ + parseFloat(goodsSkuDetail.price) + .toFixed(2) + .split('.')[0] + }} + ++ .{{ + parseFloat(goodsSkuDetail.price) + .toFixed(2) + .split('.')[1] + }} + ++ ++ 定金 + +{{ $lang('common.currencySymbol') }}{{ goodsSkuDetail.presale_deposit }} ++ 可抵 + +{{ $lang('common.currencySymbol') }}{{ goodsSkuDetail.presale_price }} ++ ++ + + +{{ goodsSkuDetail.goods_name }} ++ {{ goodsSkuDetail.introduction }} + ++ +库存 {{ goodsSkuDetail.stock }} {{ goodsSkuDetail.unit }} +销量 {{ goodsSkuDetail.sale_num }} {{ goodsSkuDetail.unit }} ++ + + + + + ++ +预售玩法 ++ +尾款支付时间: + {{ $util.timeStampTurnTime(goodsSkuDetail.pay_start_time) }} - {{ $util.timeStampTurnTime(goodsSkuDetail.pay_end_time) }} ++ +预售发货时间: +{{ $util.timeStampTurnTime(goodsSkuDetail.deliver_time) }} +尾款支付{{ goodsSkuDetail.deliver_time }}天后发货 +预售流程 ++ ++ +1 +付定金 +······ ++ +2 +付尾款 +······ ++ +3 +发货 ++ + + + + + +选择 ++ +{{ item.spec_name }}/{{ item.spec_value_name }} ++ + + + + + + + + + + ++ + + + + ++ + + + + ++ + + + + + + + + + + + + diff --git a/pages_promotion/presale/order_detail.vue b/pages_promotion/presale/order_detail.vue new file mode 100644 index 0000000..51f28a4 --- /dev/null +++ b/pages_promotion/presale/order_detail.vue @@ -0,0 +1,450 @@ + ++ ++ ++ + ++ + ++ ++ ++ {{ goodsTag(item) }} ++ ++ +{{ item.goods_name }} ++ +定金{{ $lang('common.currencySymbol') }}{{ item.presale_deposit }}可抵{{ $lang('common.currencySymbol') }}{{ item.presale_price }} ++ ++ +{{ $lang('common.currencySymbol') }} +{{ parseFloat(showPrice(item)).toFixed(2).split(".")[0] }} +.{{ parseFloat(showPrice(item)).toFixed(2).split(".")[1] }} ++ + ++ + + + + + + + + + diff --git a/pages_promotion/presale/order_list.vue b/pages_promotion/presale/order_list.vue new file mode 100644 index 0000000..138a56f --- /dev/null +++ b/pages_promotion/presale/order_list.vue @@ -0,0 +1,324 @@ + ++ + + ++ + ++ ++ +退款中 ++ +{{ orderData.order_status_name }} ++ +尾款开始支付时间:{{ $util.timeStampTurnTime(orderData.pay_start_time) }} +尾款支付结束时间:{{ $util.timeStampTurnTime(orderData.pay_end_time) }} ++ + + ++ ++ ++ ++ + +{{ orderData.sku_name }} ++ ++ ++ +{{ $lang('common.currencySymbol') }} +{{ parseFloat(orderData.price).toFixed(2).split(".")[0] }} +.{{ parseFloat(orderData.price).toFixed(2).split(".")[1] }} ++ ++ ++ {{ orderData.num }} + + + ++ +订单编号: ++ +{{ orderData.order_no }} +复制 ++ +创建时间: ++ +{{ $util.timeStampTurnTime(orderData.create_time) }} ++ +关闭时间: ++ +{{ $util.timeStampTurnTime(orderData.close_time) }} ++ ++ + +定金支付方式: ++ +{{ orderData.deposit_pay_type_name }} ++ +定金支付时间: ++ +{{ $util.timeStampTurnTime(orderData.pay_deposit_time) }} ++ ++ + +尾款支付方式: ++ +{{ orderData.final_pay_type_name }} ++ +尾款支付时间: ++ +{{ $util.timeStampTurnTime(orderData.pay_final_time) }} ++ +配送方式: ++ +{{ orderData.delivery_type_name }} ++ + +买家留言: ++ +{{ orderData.buyer_message }} ++ ++ ++ ++ 联系客服 ++ + + ++ ++ +阶段一:付定金 +(已付) ++ ++ +{{ $lang('common.currencySymbol') }} +{{ orderData.presale_deposit_money }} ++ ++ +阶段二:付尾款 +(已付) ++ ++ +{{ $lang('common.currencySymbol') }} +{{ orderData.final_money }} ++ + ++ +商品金额 ++ ++ +{{ $lang('common.currencySymbol') }} + {{ orderData.goods_money }} ++ +定金膨胀 ++ ++ +- +{{ $lang('common.currencySymbol') }} +{{ presaleDiscount }} ++ +运费 ++ ++ + +{{ $lang('common.currencySymbol') }} +{{ orderData.delivery_money }} ++ ++ 税费 + +({{ orderData.invoice_rate }}%) ++ ++ ++ +{{ $lang('common.currencySymbol') }} +{{ orderData.invoice_money }} ++ +发票邮寄费 ++ ++ ++ +{{ $lang('common.currencySymbol') }} +{{ orderData.invoice_delivery_money }} ++ +优惠 ++ ++ +- +{{ $lang('common.currencySymbol') }} +{{ orderData.promotion_money }} ++ +优惠券 ++ ++ +- +{{ $lang('common.currencySymbol') }} +{{ orderData.coupon_money }} ++ +使用余额 ++ ++ +- +{{ $lang('common.currencySymbol') }} +{{ balanceMoney }} ++ +积分抵扣 ++ ++ +- +{{ $lang('common.currencySymbol') }} +{{ orderData.point_money }} ++ + ++ +合计: ++ +{{ $lang('common.currencySymbol') }} +{{ orderData.order_money }} ++ ++ ++ ++ +{{ operationItem.title }} +{{ operationItem.title }} +{{ operationItem.title }} ++ +{{ operationItem.title }} +{{ operationItem.title }} ++ + + + + + + + + + + + diff --git a/pages_promotion/presale/payment.vue b/pages_promotion/presale/payment.vue new file mode 100644 index 0000000..e4b0187 --- /dev/null +++ b/pages_promotion/presale/payment.vue @@ -0,0 +1,743 @@ + ++ + ++ ++ {{ statusItem.name }} + ++ + + ++ ++ ++ ++ +订单号:{{ orderItem.order_no }} +{{ orderItem.order_status_name }} ++ ++ ++ ++ + ++ +{{ orderItem.sku_name }} ++ ++ +{{ $lang('common.currencySymbol') }} +{{ parseFloat(orderItem.price).toFixed(2).split(".")[0] }} +.{{ parseFloat(orderItem.price).toFixed(2).split(".")[1] }} ++ ++ {{ orderItem.num }} + + + ++ ++ +共{{ orderItem.num }}件商品 ++ 待付定金: + +{{ $lang('common.currencySymbol') }}{{ orderItem.pay_deposit_money }} ++ 待付尾款: + +{{ $lang('common.currencySymbol') }}{{ orderItem.final_money }} ++ 合计: + +{{ $lang('common.currencySymbol') }}0.00 ++ 合计: + +{{ $lang('common.currencySymbol') }}{{ orderItem.order_money }} ++ ++ ++ ++ +{{ operationItem.title }} +{{ operationItem.title }} +{{ operationItem.title }} ++ +{{ operationItem.title }} +{{ operationItem.title }} ++ 查看详情 + ++ + + + + + + + + + + + + + diff --git a/pages_promotion/presale/public/css/activist.scss b/pages_promotion/presale/public/css/activist.scss new file mode 100644 index 0000000..f99e347 --- /dev/null +++ b/pages_promotion/presale/public/css/activist.scss @@ -0,0 +1,112 @@ +.activist-container{ + width: 100vw; + height: 100vh; +} + +.order-item{ + margin: $ns-margin; + padding: 26rpx 24rpx; + border-radius: 10rpx; + background: #fff; + display: flex; + flex-direction: column; + + .order-header{ + display: flex; + align-items:center; + padding-bottom: 26rpx; + border-bottom: 1px solid #f1f1f1; + + .status-num { + font-size: $ns-font-size-sm; + color: #383838; + } + + .status-name{ + flex: 1; + text-align: right; + font-size: $ns-font-size-sm; + } + } + + .goods-wrap { + display: flex; + justify-content: space-between; + align-items: center; + padding: 27rpx 0; + box-sizing: border-box; + border-bottom: 1px solid #f7f7f7; + image { + width: 170rpx; + height: 170rpx; + display: flex; + align-items: center; + justify-content: center; + } + .goods-info { + flex: 1; + display: flex; + flex-direction: column; + justify-content: flex-end; + margin-left: 15rpx; + .goods-name { + width: 480rpx; + line-height: 38rpx; + font-size: $ns-font-size-sm; + color: #000; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + } + .goods-num { + display: flex; + justify-content: space-between; + align-items: flex-start; + margin-top: 21rpx; + .num-text { + font-size: $ns-font-size-sm; + line-height: 1; + } + .num-price { + display: flex; + flex-direction: column; + align-items: flex-end; + line-height: 1; + font-size: $ns-font-size-sm; + .num { + color: #838383; + margin-top: 16rpx; + display: flex; + align-items: center; + } + } + } + } + } + .goods-btn { + display: flex; + flex-direction: column; + align-items: flex-end; + margin-top: 27rpx; + .btn-text { + font-size: $ns-font-size-sm; + text { + &:nth-child(2) { + margin-left: 17rpx; + text { + font-size: $ns-font-size-lg; + } + } + } + } + .order-operation { + display: flex; + margin-top: 24rpx; + .order-box-btn { + font-size: $ns-font-size-sm; + } + } + } +} diff --git a/pages_promotion/presale/public/css/detail.scss b/pages_promotion/presale/public/css/detail.scss new file mode 100644 index 0000000..bd721d6 --- /dev/null +++ b/pages_promotion/presale/public/css/detail.scss @@ -0,0 +1,133 @@ +.goods-promotion { + .price-info { + .img-wrap { + width: 120rpx; + } + + .sale-num { + color: #fff; + font-size: $font-size-tag; + } + } +} + +.goods-presale-info { + .deposit, + .presale-price { + vertical-align: bottom; + } + + .presale-price { + border: 1px solid var(--goods-price); + padding: 0 4rpx; + border-radius: 6rpx; + margin-left: 10rpx; + color: var(--goods-price); + } +} + +.presale-rule { + padding: 20rpx 0; + + .tit { + font-weight: 600; + } + + .process { + display: flex; + align-items: center; + justify-content: center; + // padding-top: 20rpx; + .process-item { + display: flex; + flex-direction: column; + align-items: center; + .number { + display: flex; + align-items: center; + justify-content: center; + width: 40rpx; + height: 40rpx; + border-radius: 50%; + font-size: $font-size-tag; + } + .text { + margin-top: 20rpx; + } + } + + .space { + margin: 0 20rpx; + font-size: 40rpx; + } + } +} + +.follow-and-share { + top: 20rpx; +} +// 营销活动 +.goods-promotion { + background: var(--promotion-color); + height: 75px; + .price-info { + display: flex; + flex-direction: row; + align-items: center; + justify-content: flex-start; + .icon-box { + margin-right: 20rpx; + .iconfont{ + font-size: 60rpx; + color: #ffffff; + } + } + .price-box{ + display: flex; + align-items: flex-start; + flex-direction: column; + height: 100%; + justify-content: center; + .promotion-text{ + font-size: 36rpx; + color: #fff; + line-height: 1; + } + .sale-num{ + display: flex; + align-items: center; + margin-top: 18rpx; + view{ + color: #ffffff; + line-height: 1; + } + + } + } + + + } +} +.countdown { + width: 220rpx; + background: var(--promotion-aux-color); + .txt{ + color: #ffffff!important; + font-size: 28rpx!important; + } + .clockrun{ + margin-top: 16rpx!important; + } + &:after{ + position: absolute; + content: ''; + top: calc(50% - 15rpx); + z-index: 5; + left: -15rpx; + width: 0; + height: 0; + border-style: solid; + border-width: 15rpx 15rpx 15rpx 0; + border-color: transparent var(--promotion-aux-color) transparent transparent; + } + } \ No newline at end of file diff --git a/pages_promotion/presale/public/css/list.scss b/pages_promotion/presale/public/css/list.scss new file mode 100644 index 0000000..2dae1d1 --- /dev/null +++ b/pages_promotion/presale/public/css/list.scss @@ -0,0 +1,135 @@ +.ns-adv { + margin: $margin-updown $margin-both; + border-radius: $border-radius; + overflow: hidden; + line-height: 1; + + image { + width: 100%; + } +} + +.lineheight-clear { + line-height: 1!important; +} +// 商品列表单列样式 +.goods-list.single-column { + + .goods-item { + padding: 26rpx; + background: #fff; + margin: $margin-updown $margin-both; + border-radius: $border-radius; + display: flex; + position: relative; + + .goods-img { + width: 200rpx; + height: 200rpx; + overflow: hidden; + border-radius: $border-radius; + margin-right: 20rpx; + + image { + width: 100%; + height: 100%; + } + } + + .goods-tag{ + color: #fff; + line-height: 1; + padding: 8rpx 12rpx; + position: absolute; + border-top-left-radius: $border-radius; + border-bottom-right-radius: $border-radius; + top: 26rpx; + left: 26rpx; + font-size: $font-size-goods-tag; + } + + .info-wrap { + flex: 1; + display: flex; + flex-direction: column; + } + + .name-wrap { + flex: 1; + } + + .goods-name { + font-size: $font-size-base; + line-height: 1.3; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + height: 68rpx; + } + + .presale-info { + text { + line-height: 1; + font-size: $font-size-tag; + } + } + + .discount-price { + display: inline-block; + font-weight: bold; + line-height: 1; + margin-top: 16rpx; + color: var(--price-color); + .unit { + margin-right: 6rpx; + } + + .txt { + font-weight: normal; + } + } + + .pro-info { + position: relative; + margin-top: 16rpx; + + .delete-price { + flex: 1; + display: flex; + align-items: flex-end; + + .unit { + margin-right: 6rpx; + } + + .txt { + text-decoration:none; + } + } + + & > view { + line-height: 1; + + &:nth-child(2) { + position: absolute; + right: 0; + bottom: 0; + } + } + } + + .member-price-tag { + display: inline-block; + width: 60rpx; + line-height: 1; + margin-left: 6rpx; + + image { + width: 100%; + } + } + } + +} \ No newline at end of file diff --git a/pages_promotion/presale/public/css/order_detail.scss b/pages_promotion/presale/public/css/order_detail.scss new file mode 100644 index 0000000..11be8f6 --- /dev/null +++ b/pages_promotion/presale/public/css/order_detail.scss @@ -0,0 +1,498 @@ +@mixin flex-row-center { + display: flex; + justify-content: center; + align-items: center; +} + +@mixin wrap { + margin: $margin-updown $margin-both; + padding: 20rpx 30rpx; + border-radius: $border-radius; + background: #fff; + position: relative; +} +text, +view { + font-size: $font-size-tag; +} +.align-right { + text-align: right; +} + +.color-text-white { + color: #fff; +} + +.detail-container { + height: 100vh; + + .height-box { + display: block; + padding-bottom: 100rpx; + } + + &.safe-area { + .height-box { + display: block; + padding-bottom: 168rpx; + } + } +} + +.status-wrap { + background-size: 100% 100%; + padding: 40rpx 0; + height: 180rpx; + + image { + width: 104rpx; + height: 86rpx; + margin-right: 20rpx; + margin-top: 20rpx; + } + + .order-status-left { + display: flex; + margin: 0 40rpx; + } + + & > view { + text-align: center; + color: #fff; + } + + .desc { + margin-left: 20rpx; + } + + .price { + font-weight: 600; + } + + .action-group { + text-align: center; + padding-top: 20rpx; + + .action-btn { + line-height: 1; + padding: 16rpx 50rpx; + display: inline-block; + border-radius: 32rpx; + background: #fff; + box-shadow: 0 0 14rpx rgba(158, 158, 158, 0.6); + } + } +} + +.site-wrap { + @include wrap; + margin-top: -69rpx; + + .site-header { + display: flex; + align-items: center; + + .icon-dianpu { + display: inline-block; + line-height: 1; + margin-right: 12rpx; + font-size: $font-size-base; + } + } + + .site-body { + .goods-wrap { + margin-bottom: 20rpx; + display: flex; + position: relative; + + &:last-of-type { + margin-bottom: 0; + } + + .goods-img { + width: 160rpx; + height: 160rpx; + margin-right: 20rpx; + + image { + width: 100%; + height: 100%; + border-radius: $border-radius; + } + } + + .goods-info { + flex: 1; + position: relative; + display: flex; + flex-direction: column; + justify-content: space-between; + + .goods-name { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; + line-height: 1.5; + font-size: $font-size-base; + } + + .goods-sub-section { + width: 100%; + line-height: 1.3; + display: flex; + margin-top: 20rpx; + + .goods-price { + font-weight: 700; + font-size: $font-size-activity-tag; + color: var(--price-color); + } + + .unit { + font-size: $font-size-tag; + margin-right: 2rpx; + font-weight: 700; + } + + view { + flex: 1; + line-height: 1.3; + &:last-of-type { + text-align: right; + + .iconfont { + line-height: 1; + font-size: $font-size-tag; + } + } + } + } + + .goods-action { + text-align: right; + padding-top: 20rpx; + + navigator { + display: inline-block; + } + + .order-box-btn { + height: 48rpx !important; + line-height: 48rpx !important; + font-size: $font-size-tag !important; + display: inline-block; + background: #fff; + border: 0.5px solid #999; + margin-left: 10rpx; + box-sizing: content-box; + } + } + } + } + } +} + +.order-cell { + display: flex; + margin: 20rpx 0; + align-items: center; + background: #fff; + line-height: 40rpx; + + .tit { + text-align: left; + } + + .box { + flex: 1; + padding: 0 20rpx; + line-height: inherit; + + .textarea { + height: 40rpx; + } + } + + .iconfont { + color: #bbb; + font-size: $font-size-base; + } + + .order-pay { + padding: 0; + + text { + display: inline-block; + margin-left: 6rpx; + } + } +} + +.order-summary { + @include wrap; + + .order-cell { + &:first-child { + margin-top: 0; + } + + .tit { + font-size: $font-size-base; + width: 196rpx; + } + + .box { + display: flex; + align-items: center; + + text { + font-size: $font-size-base; + } + } + + .copy { + font-size: $font-size-activity-tag; + display: inline-block; + background: #f7f7f7; + line-height: 1; + padding: 6rpx 10rpx; + margin-left: 10rpx; + border-radius: 18rpx; + border: 2rpx solid #d2d2d2; + } + } + + .hr { + // width: calc(100% - 190rpx); + width: 100%; + height: 2rpx; + background: #f7f7f7; + margin-bottom: 20rpx; + } +} + +.order-money { + @include wrap; + + .order-cell { + .tit { + font-size: $font-size-base; + } + + .box { + font-weight: 600; + padding: 0; + + text { + font-size: $font-size-base; + font-weight: bold; + } + + .operator { + font-size: $font-size-tag; + margin-right: 6rpx; + } + } + } +} + +.kefu { + @include wrap; + margin: 30rpx 0 10rpx; + border-top: 2rpx solid #f7f7f7; + padding-bottom: 0; + padding-top: 30rpx; + & > view { + @include flex-row-center; + + .iconfont { + font-weight: bold; + margin-right: 10rpx; + font-size: $font-size-base; + line-height: 1; + } + } + + button { + width: 100%; + height: 100%; + // position: absolute; + border: none; + z-index: 1; + padding: 0; + margin: 0; + background: none; + height: 50rpx; + line-height: 50rpx; + display: flex; + justify-content: center; + &::after { + border: none !important; + } + .iconfont { + margin-right: 10rpx; + } + } +} + +.order-action { + text-align: right; + + .order-box-btn { + margin-right: $margin-both; + margin-left: 0; + font-size: $font-size-tag; + height: 60rpx; + line-height: 60rpx; + box-sizing: content-box; + min-width: 60rpx; + text-align: center; + + &.color-base-bg { + color: #fff; + } + + &:last-child { + margin-right: 0; + } + + &.disabled{ + background: #eee; + border-color: #e5e5e5; + color: #999; + } + } +} +.status-name { + view { + font-size: $font-size-toolbar; + color: #fff; + line-height: 1; + text-align: left; + } + + .name { + margin-top: 40rpx; + } + + .desc { + font-size: $font-size-tag; + margin: 20rpx 0 0 0; + } +} + +.head-nav { + width: 100%; + height: var(--status-bar-height); +} + +.head-nav.active { + padding-top: 40rpx; +} + +.head-return { + height: 90rpx; + line-height: 90rpx; + color: #fff; + font-weight: 600; + font-size: $font-size-toolbar; + position: relative; + text-align: center; + text { + position: absolute; + top: 50%; + transform: translateY(-50%); + left: 20rpx; + display: inline-block; + margin-right: 10rpx; + font-size: $font-size-toolbar; + } +} + +.store-detail view { + font-size: $font-size-activity-tag; +} + +.store-wrap { + @include wrap; + margin-top: -76rpx; + + .store-info { + display: flex; + align-items: center; + padding-left: 50rpx; + position: relative; + + .icon { + left: 0; + position: absolute; + top: 4rpx; + + .iconfont { + line-height: 50rpx; + font-size: $font-size-base; + } + .icon-mendian { + font-size: $font-size-toolbar; + } + } + + .store-name { + display: flex; + + .name { + flex: 1; + } + } + + .store-info-detail { + flex: 1; + .store-detail view { + font-size: $font-size-goods-tag + 2rpx; + } + & > view:first-of-type { + font-size: $font-size-tag + 2rpx; + } + } + .cell-more { + margin-left: 50rpx; + } + } +} +.pick-block { + &.first-pick-block { + border-top: 2rpx solid #f1f1f1; + } + display: flex; + align-items: center; + margin-top: 20rpx; + padding-top: 20rpx; + input, + .last-child { + flex: 1; + text-align: right; + font-size: $font-size-tag; + } +} +.sku { + display: flex; + line-height: 1; + margin-top: 10rpx; + margin-bottom: 10rpx; +} +.goods-spec { + color: #838383; + font-size: $font-size-goods-tag; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + flex: 1; +} + +.presale-process { + .order-cell { + margin: 10rpx 0; + } +} \ No newline at end of file diff --git a/pages_promotion/presale/public/css/order_list.scss b/pages_promotion/presale/public/css/order_list.scss new file mode 100644 index 0000000..b8146ec --- /dev/null +++ b/pages_promotion/presale/public/css/order_list.scss @@ -0,0 +1,315 @@ +.order-container { + width: 100vw; + height: 100vh; +} + +.align-right { + text-align: right; +} + +.order-nav { + width: 100vw; + height: 90rpx; + flex-direction: row; + /* #ifdef H5 */ + // padding-top: 14rpx; + /* #endif */ + /* #ifndef APP-PLUS */ + white-space: nowrap; + /* #endif */ + background: #fff; + display: flex; + // border-bottom-left-radius: 24rpx; + // border-bottom-right-radius: 24rpx; + // padding-bottom: 30rpx; + /* #ifdef H5 */ + // padding-bottom: 20rpx; + /* #endif */ + position: fixed; + left: 0; + z-index: 998; + justify-content: space-around; + + .uni-tab-item { + width: 130rpx; + text-align: center; + } + + .uni-tab-item-title { + font-size: $font-size-base; + display: inline-block; + height: 86rpx; + line-height: 90rpx; + border-bottom: 1px solid #fff; + flex-wrap: nowrap; + /* #ifndef APP-PLUS */ + white-space: nowrap; + /* #endif */ + text-align: center; + font-size: 30rpx; + } + + .uni-tab-item-title-active { + height: 86rpx; + border-bottom: 2px solid #ffffff; + } + + ::-webkit-scrollbar { + width: 0; + height: 0; + color: transparent; + } +} + +.order-item { + margin: $margin-updown $margin-both; + border-radius: $border-radius; + background: #fff; + position: relative; + + .order-header { + display: flex; + align-items: center; + position: relative; + padding: $padding 30rpx 26rpx 30rpx; + + &.waitpay { + padding-left: 70rpx; + + .icon-yuan_checked, + .icon-yuan_checkbox { + font-size: $font-size-toolbar; + position: absolute; + top: 48%; + left: 20rpx; + transform: translateY(-50%); + } + .icon-yuan_checkbox { + color: $color-tip; + } + } + + .icon-dianpu { + display: inline-block; + line-height: 1; + margin-right: 12rpx; + font-size: $font-size-base; + } + + .status-name { + flex: 1; + text-align: right; + font-size: $font-size-tag; + } + } + + .order-body { + .goods-wrap { + display: flex; + position: relative; + padding: 0 30rpx 30rpx 30rpx; + + &:last-of-type { + margin-bottom: 0; + } + + .goods-img { + width: 160rpx; + height: 160rpx; + margin-right: 20rpx; + + image { + width: 100%; + height: 100%; + border-radius: $border-radius; + } + } + + .goods-info { + flex: 1; + position: relative; + max-width: calc(100% - 180rpx); + display: flex; + flex-direction: column; + + .pro-info { + flex: 1; + } + + .goods-name { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; + line-height: 1.5; + font-size: $font-size-base; + color: $color-title; + } + + .goods-sub-section { + width: 100%; + line-height: 1.3; + display: flex; + margin-top: 14rpx; + + .goods-price { + font-size: $font-size-tag; + color: $color-title; + flex: 1; + font-weight: bold; + color: var(--price-color); + } + .goods-num { + font-size: $font-size-tag; + color: $color-tip; + flex: 1; + text-align: right; + line-height: 1; + + .iconfont { + font-size: $font-size-tag; + } + } + .goods-type { + font-size: $font-size-tag; + } + + .unit { + font-size: $font-size-tag; + margin-right: 2rpx; + } + + view { + flex: 1; + line-height: 1.3; + display: flex; + flex-direction: column; + + &:last-of-type { + text-align: right; + + .iconfont { + line-height: 1; + font-size: $font-size-tag; + } + } + } + } + + .goods-action { + text-align: right; + + .action-btn { + line-height: 1; + padding: 14rpx 20rpx; + color: $color-title; + display: inline-block; + border-radius: 28rpx; + background: #fff; + border: 0.5px solid #999; + font-size: $font-size-tag; + margin-left: 10rpx; + } + } + } + } + } + + .order-footer { + .order-base-info { + .total { + padding: $padding; + font-size: $font-size-tag; + background: rgba(248, 248, 248, 0.5); + display: flex; + + & > text { + flex: 1; + line-height: 1; + margin-left: 10rpx; + } + } + + .order-type { + padding-top: 20rpx; + flex: 0.5; + + & > text { + line-height: 1; + } + } + } + + .order-action { + text-align: right; + padding: 30rpx; + + .order-box-btn { + line-height: 1; + padding: 20rpx 26rpx; + color: #333; + display: inline-block; + background: #fff; + border: 0.5px solid #999; + font-size: $font-size-tag; + margin-left: 20rpx; + + &.disabled{ + background: #eee; + border-color: #e5e5e5; + color: #999; + } + } + } + } +} + +.order-batch-action { + position: fixed; + z-index: 5; + left: 0; + bottom: 0; + width: 100vw; + height: 100rpx; + background: #fff; + box-shadow: 0 0px 10px rgba(0, 0, 0, 0.1); + text-align: right; + + &.bottom-safe-area { + padding-bottom: constant(safe-area-inset-bottom); + padding-bottom: env(safe-area-inset-bottom); + } + + .action-btn { + height: 68rpx; + line-height: 68rpx; + background: #fff; + padding: 0 40rpx; + display: inline-block; + text-align: center; + margin: 16rpx 20rpx 16rpx 0; + border-radius: $border-radius; + border: 1px solid #ffffff; + + &.white { + height: 68rpx; + line-height: 68rpx; + color: #333; + border: 1px solid #999; + background: #fff; + } + } +} +.sku { + display: flex; + line-height: 1; + margin-top: 10rpx; +} +.goods-spec { + color: $color-tip; + font-size: $font-size-goods-tag; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + flex: 1; +} diff --git a/pages_promotion/presale/public/css/payment.scss b/pages_promotion/presale/public/css/payment.scss new file mode 100644 index 0000000..28c7f7c --- /dev/null +++ b/pages_promotion/presale/public/css/payment.scss @@ -0,0 +1,1072 @@ +@mixin wrap { + margin: $margin-updown $margin-both; + padding: $padding; + border-radius: $border-radius; + background: #fff; + position: relative; +} +view, +input, +text, +textarea { + font-size: $font-size-base + 2rpx; +} +.popup-header { + .icon-close { + font-size: $font-size-base; + } +} + +.inline { + display: inline !important; +} + +.order-container { + padding-bottom: 160rpx; + + &.safe-area { + padding-bottom: 188rpx; + } +} + +.address-wrap { + @include wrap; + min-height: 100rpx; + display: flex; + align-items: center; + margin-top: -76rpx; + padding: 24rpx; + + .icon { + width: 60rpx; + height: 60rpx; + display: flex; + justify-content: center; + align-items: center; + border-radius: 50%; + position: absolute; + top: 40rpx; + margin-right: 20rpx; + image { + width: 60rpx; + height: 60rpx; + } + .iconfont { + line-height: 1; + color: #fff; + font-size: $font-size-base; + } + .icon-mendian { + font-size: $font-size-base; + } + } + + .address-info { + padding-left: 100rpx; + padding-right: 40rpx; + flex: 1; + + .info { + display: flex; + + text { + flex: 1; + + &:last-of-type { + text-align: right; + color: #999; + } + } + } + + .detail { + margin-top: 8rpx; + line-height: 1.3; + } + } + + .cell-more { + position: absolute; + top: 50%; + transform: translateY(-50%); + right: 10rpx; + + .iconfont { + color: #999; + font-size: $font-size-base; + } + } +} + +.mobile-wrap { + @include wrap; + min-height: 100rpx; + display: flex; + align-items: center; + margin-top: -76rpx; + padding: 24rpx; + .icon { + width: 60rpx; + height: 60rpx; + display: flex; + justify-content: center; + align-items: center; + border-radius: 50%; + position: absolute; + top: 50%; + transform: translateY(-50%); + margin-right: 20rpx; + image { + width: 60rpx; + height: 60rpx; + } + .iconfont { + line-height: 1; + color: #fff; + } + .icon-mendian { + font-size: $font-size-base; + } + } + .mobile-info { + padding-left: 100rpx; + } + .form-group { + .form-item { + display: flex; + line-height: 50rpx; + + .text { + display: inline-block; + line-height: 50rpx; + padding-right: 10rpx; + } + + .placeholder { + line-height: 50rpx; + } + + .input { + flex: 1; + height: 50rpx; + line-height: 50rpx; + color: #838383; + } + } + } +} + +.order-cell { + display: flex; + margin: 20rpx 0; + align-items: center; + background: #fff; + line-height: 40rpx; + position: relative; + + .tit { + text-align: left; + } + + .box { + flex: 1; + padding: 0 10rpx; + line-height: inherit; + text-align: right; + + .textarea { + height: 40rpx; + font-size: $font-size-base !important; + } + + input { + font-size: $font-size-base !important; + } + } + + .iconfont { + color: #bbb; + font-size: $font-size-toolbar; + } + + .order-pay { + padding: 0; + + text { + display: inline-block; + margin-left: 6rpx; + } + } +} +.site-wrap { + @include wrap; + + .site-header { + display: flex; + align-items: center; + + .icon-dianpu { + display: inline-block; + line-height: 1; + margin-right: 12rpx; + font-size: $font-size-toolbar; + } + } + + .site-body { + .goods-wrap { + margin-bottom: 20rpx; + display: flex; + position: relative; + &:last-of-type { + margin-bottom: 0; + padding-bottom: $padding; + border-bottom: 2rpx solid #f1f1f1; + } + + .goods-img { + width: 124rpx; + height: 124rpx; + padding: 20rpx 0 0 0; + margin-right: 20rpx; + border-radius: $border-radius; + overflow: hidden; + image { + width: 100%; + height: 100%; + border-radius: $border-radius; + } + } + + .goods-info { + flex: 1; + position: relative; + padding: 20rpx 0 0 0; + display: flex; + flex-direction: column; + justify-content: space-between; + .goods-name { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; + line-height: 1.5; + } + + .goods-sub-section { + width: 100%; + line-height: 1.3; + display: flex; + align-items: center; + padding: 0 10rpx; + box-sizing: border-box; + + .icon-close { + font-size: $font-size-base; + } + + .goods-price { + font-weight: 700; + font-size: $font-size-base; + color: var(--price-color); + + } + + .unit { + font-weight: normal; + font-size: $font-size-base; + margin-right: 2rpx; + color: var(--price-color); + } + + view { + flex: 1; + line-height: 1.3; + font-weight: 500; + &:last-of-type { + text-align: right; + + .iconfont { + line-height: 1; + } + } + } + } + } + } + } + + .site-footer { + .order-cell { + .tit { + width: 180rpx; + text-align: left; + } + + .box { + input { + font-size: $font-size-base !important; + } + &.text-overflow { + text { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + display: block; + width: 100%; + } + } + } + + &:last-of-type { + margin-bottom: 0; + } + } + } +} + +.order-checkout { + @include wrap; + .order-cell { + .icon-yuan_checkbox, + .icon-yuan_checked { + font-size: $font-size-base; + position: absolute; + top: 50%; + right: 0; + transform: translateY(-50%); + color: #aaa; + } + } +} + +.order-money { + @include wrap; + + .order-cell { + .box { + font-weight: 600; + padding: 0; + + .operator { + font-size: $font-size-base; + margin-right: 6rpx; + } + input { + font-size: $font-size-base !important; + } + } + } +} + +.order-submit { + position: fixed; + z-index: 5; + left: 0; + bottom: 0; + width: 100vw; + height: 100rpx; + background: #fff; + // box-shadow: 0 0px 10px rgba(0, 0, 0, 0.1); + text-align: right; + display: flex; + align-items: center; + + &.bottom-safe-area { + // padding-bottom: 68rpx !important; + padding-bottom: 0; + padding-bottom: constant(safe-area-inset-bottom); + padding-bottom: env(safe-area-inset-bottom); + } + + .order-settlement-info { + flex: 1; + height: 100rpx; + line-height: 100rpx; + } + + .submit-btn { + height: 80rpx; + margin: 0 20rpx 0 34rpx; + display: flex; + justify-content: center; + align-items: center; + button { + line-height: 54rpx; + width: 156rpx; + height: 54rpx; + text-align: center; + padding: 0; + } + } +} + +.popup { + width: 100vw; + background: #fff; + border-top-left-radius: 24rpx; + border-top-right-radius: 24rpx; + + .popup-header { + display: flex; + align-items: center; + justify-content: space-between; + border-bottom: 2rpx solid rgba(241, 241, 241, 1); + padding: 40rpx; + & > view { + line-height: 1; + } + + .tit { + flex: 1; + font-size: $font-size-toolbar; + } + .align-right { + display: flex; + align-items: center; + } + + .vice-tit { + margin-right: 20rpx; + } + } + + .popup-body { + height: calc(100% - 250rpx); + &.store-popup { + height: calc(100% - 120rpx); + } + &.safe-area { + height: calc(100% - 270rpx); + } + &.store-popup.safe-area { + height: calc(100% - 140rpx); + } + } + + .popup-footer { + height: 120rpx; + + .confirm-btn { + height: 72rpx; + line-height: 72rpx; + color: #fff; + text-align: center; + margin: 20rpx 40rpx; + border-radius: $border-radius; + } + + &.bottom-safe-area { + padding-bottom: 68rpx !important; + } + } +} + +.invoice-popup { + height: 83vh; + padding: 18rpx 0; + box-sizing: border-box; + position: relative; + + .invoice-close { + position: absolute; + line-height: 1; + top: 48rpx; + right: 48rpx; + font-size: $font-size-base; + z-index: 9; + } + .popup-body { + .invoice-cell { + padding: 30rpx 0; + border-top: 1px solid #f5f5f5; + margin: 0 48rpx; + + &:first-of-type { + border-top: none; + } + + .tit { + font-size: $font-size-toolbar; + } + + .option-grpup { + padding-top: 20rpx; + + .option-item { + height: 54rpx; + line-height: 54rpx; + display: inline-block; + font-size: $font-size-tag; + padding: 0 36rpx; + background: #eee; + border: 1px solid #eee; + border-radius: 50px; + margin: 0 20rpx 20rpx 0; + + &:nth-of-type(1), + &:nth-of-type(2), + &:nth-of-type(3) { + margin-bottom: 0; + } + + &.active { + color: #fff; + } + + &.disabled { + color: #aaa; + } + } + } + + .invoice-form-group { + input { + background: rgba(241, 241, 241, 1); + border-radius: 10rpx; + height: 66rpx; + margin-top: 22rpx; + padding: 0 32rpx; + } + } + } + .invoice-tops { + font-size: $font-size-tag; + margin: 0 48rpx; + } + } +} + +.coupon-popup { + height: 65vh; + + .popup-body { + background: #f5f5f5; + } + + .coupon-item { + @include wrap; + + & > .iconfont { + font-size: $font-size-base; + position: absolute; + top: 50%; + right: 20rpx; + transform: translateY(-50%); + } + & > .icon-yuan_checkbox { + color: $color-tip; + } + + .circular { + position: absolute; + top: 50%; + left: 0; + transform: translate(-50%, -50%); + background: #f5f5f5; + width: 30rpx; + height: 30rpx; + border-radius: 50%; + z-index: 5; + } + + .coupon-info { + padding-right: 60rpx; + height: 140rpx; + display: flex; + width: 100%; + + .coupon-money { + width: 160rpx; + height: 140rpx; + display: flex; + justify-content: center; + align-items: center; + margin-right: 20rpx; + + text { + font-size: 50rpx; + } + } + + .info { + flex: 1; + max-width: calc(100% - 240rpx); + + view { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .ns-text-color-gray { + line-height: 1.5; + } + } + } + } +} + +.promotion-popup { + height: 65vh; + + .order-cell { + margin: 20rpx 30rpx; + + .promotion-mark { + padding: 4rpx 10rpx; + line-height: 1; + border-radius: 32rpx; + color: #fff; + font-size: $font-size-base; + margin-right: 10rpx; + } + } +} + +.delivery-popup { + height: 80vh; + // padding: 48rpx; + box-sizing: border-box; + + .delivery-cell { + padding: 30rpx 0; + box-sizing: border-box; + .tit { + font-size: $font-size-toolbar; + } + + .option-grpup { + .option-item { + display: inline-block; + line-height: 1; + font-size: $font-size-toolbar; + padding: 16rpx 40rpx; + border: 1px solid #eee; + border-radius: 32rpx; + margin: 0 20rpx 20rpx 0; + + &:nth-of-type(1), + &:nth-of-type(2), + &:nth-of-type(3) { + margin-bottom: 0; + } + + &.active { + // background: opacify($base-color-rgba, 0.01); + } + + &.disabled { + color: #aaa; + } + } + } + } + + .delivery-cont { + height: 100%; + overflow-y: scroll; + + .pickup-point { + padding: 20rpx 0; + box-sizing: border-box; + border-top: 1px solid #f5f5f5; + display: flex; + justify-content: space-between; + align-items: center; + margin: 0 48rpx; + + .color-active { + view, + text { + } + } + .delivery-detail { + width: 90%; + } + .name { + display: flex; + text { + font-size: $font-size-toolbar; + } + } + + .icon { + flex: 1; + text-align: right; + + .iconfont { + line-height: 1; + font-size: $font-size-base; + } + } + + &:first-of-type { + padding-top: 0; + border-top: none; + } + + .info { + line-height: 1.2; + view { + font-size: $font-size-tag; + } + } + } + } +} + +.pay-password { + width: 80vw; + background: #fff; + box-sizing: border-box; + border-radius: 10rpx; + overflow: hidden; + padding: 60rpx 40rpx; + transform: translateY(-200rpx); + + .title { + font-size: $font-size-toolbar; + text-align: center; + } + + .tips { + font-size: $font-size-base; + color: #999; + text-align: center; + } + + .btn { + width: 60%; + margin: 0 auto; + margin-top: 30rpx; + height: 70rpx; + line-height: 70rpx; + border-radius: $border-radius; + color: #fff; + text-align: center; + border: 1px solid #ffffff; + + &.white { + margin-top: 20rpx; + background-color: #fff !important; + } + } + + .password-wrap { + padding-top: 20rpx; + width: 90%; + margin: 0 auto; + + .forget-password { + margin-top: 20rpx; + display: inline-block; + } + } +} + +.head-nav { + width: 100%; + height: var(--status-bar-height); +} + +.head-nav.active { + padding-top: 40rpx; +} + +.head-return { + height: 90rpx; + line-height: 90rpx; + color: #fff; + font-weight: 600; + font-size: $font-size-base; + width: 100%; + text-align: center; + position: relative; + text { + position: absolute; + top: 50%; + transform: translateY(-50%); + left: $margin-both; + display: inline-block; + margin-right: 10rpx; + font-size: $font-size-base; + } +} +.payment-top { + width: 100%; + height: 180rpx; + overflow: hidden; +} + +/* 2020/6/1 新增样式 */ +.big-tit { + font-size: $font-size-base; +} +.balance-switch { + transform: scale(0.8); +} +.margin-top { + margin-top: -76rpx; +} +.store-wrap { + background-color: #fff; + margin: -140rpx 20rpx 20rpx; + border-radius: $border-radius; + &.margin_top{ + margin-top: -80rpx; + } + .delivery-box { + padding: 20rpx; + border-radius: $border-radius; + } + .store-info { + display: flex; + align-items: center; + .icon { + width: 60rpx; + height: 60rpx; + border-radius: 50%; + position: relative; + margin-right: 26rpx; + align-self: flex-start; + margin-top: 12rpx; + &.image-icon { + background-color: unset; + image { + width: 100%; + height: 100%; + } + } + .iconfont { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + font-size: 32rpx; + color: #fff; + } + } + .store-info-detail { + flex: 1; + .store-detail view { + font-size: $font-size-tag + 2rpx; + } + } + .cell-more { + margin-left: 50rpx; + } + } + .pick-block { + display: flex; + align-items: center; + margin-top: 20rpx; + padding-top: 20rpx; + border-top: 2rpx solid #f1f1f1; + >view{ + flex: 1; + } + .time-picker{ + display: flex; + align-items: center; + justify-content: flex-end; + view{ + text-align: center; + color: $color-tip; + } + } + } +} +// tabs +@mixin triangle { + content: ''; + position: absolute; + top: 1rpx; + width: 0; + height: 0; + border-bottom: 70rpx solid #fff; + z-index: 2; +} +@mixin triangle-left { + @include triangle; + left: calc(100% - 1rpx); + border-right: 16px solid transparent; +} +@mixin triangle-right { + @include triangle; + right: calc(100% - 1rpx); + border-left: 16px solid transparent; +} +.tabs { + border-radius: 23rpx; + background: rgba(255, 255, 255, 0.3); + display: flex; + align-items: center; + height: 70rpx; + position: relative; + margin-bottom: $margin-updown; + & > view { + color: #fff; + text-align: center; + font-size: $font-size-tag; + flex: 1; + height: 100%; + line-height: 70rpx; + opacity: 0.7; + position: relative; + &.active { + background-color: #fff !important; + opacity: 1; + transform: scaleY(1.2); + z-index: 2; + transform-origin: 0 100%; + -webkit-transform-origin: 0 100%; + border-top-left-radius: $border-radius; + border-top-right-radius: $border-radius; + // 字体放大后缩小 + .content { + color: #333; + transform: scaleY(0.83) translate3d(-50%, -50%, 0); + } + } + .content { + position: absolute; + top: 50%; + left: 50%; + transform: translate3d(-50%, -50%, 0); + color: #fff; + } + + &:not(:first-of-type):not(:last-of-type).active { + &:before { + @include triangle-left; + } + &:after { + @include triangle-right; + } + } + + &:first-of-type.active { + &:before { + @include triangle-left; + } + } + + &:last-of-type.active { + &:after { + @include triangle-right; + } + } + } +} +.text-right{ + text-align: right; +} +.sku { + display: flex; + line-height: 1; + margin-top: 10rpx; + margin-bottom: 10rpx; +} +.goods-spec{ + color: #838383; + font-size: $font-size-tag; + overflow:hidden; + text-overflow:ellipsis; + white-space:nowrap; + flex:1 +} +.address-empty { + line-height: 100rpx; + text-align: center; +} +.order-summary { + @include wrap; + + .order-cell { + margin:8rpx 0; + .tit { + color: #999; + width: 170rpx; + } + + .box { + display: flex; + align-items: center; + } + + .copy { + font-size: $font-size-tag; + display: inline-block; + background: #f7f7f7; + line-height: 1; + padding: 6rpx 10rpx; + margin-left: 10rpx; + border-radius: 18rpx; + border: 2rpx solid #d2d2d2; + } + } + + .hr { + // width: calc(100% - 190rpx); + width: 100%; + height: 2rpx; + background: #f7f7f7; + margin-bottom: 30rpx; + } +} +.kefu { + @include wrap; + margin: 30rpx 0 10rpx; + border-top: 2rpx solid #f1f1f1; + padding-bottom: 0; + padding-top: 30rpx; + & > view { + justify-content: center; + text-align: center; + .iconfont { + font-weight: bold; + margin-right: 10rpx; + font-size: $font-size-toolbar; + line-height: 1; + } + } + + button { + width: 100%; + height: 100%; + position: absolute; + border: none; + z-index: 1; + padding: 0; + margin: 0; + background: none; + + &::after { + border: none !important; + } + } +} +.payment-top { + width: 100%; + height: 214rpx; + overflow: hidden; + padding: 0 40rpx 40rpx; + padding-top: 40rpx; + .status-name{ + font-size: $font-size-base; + color: #fff; + >view:last-of-type{ + font-size: 24rpx; + } + } + image { + width: 124rpx; + height: 106rpx; + margin-right: $margin-both; + } + .order-status-left{ + display: flex; + } +} + diff --git a/pages_promotion/presale/public/css/refund_detail.scss b/pages_promotion/presale/public/css/refund_detail.scss new file mode 100644 index 0000000..f919eb1 --- /dev/null +++ b/pages_promotion/presale/public/css/refund_detail.scss @@ -0,0 +1,334 @@ +.detail-container { + width: 100vw; + height: 100vh; +} +.container { + transition: all 0.3s; + + .hide { + transform: translateX(-100%); + } +} + +.status-wrap { + padding: 20rpx; + background: #fff; + border-top: 1px solid #f5f5f5; + margin: 20rpx; + border-radius: $ns-border-radius; + + .status-name { + display: block; + font-size: $ns-font-size-x-lg; + line-height: 70rpx; + height: 70rpx; + } + + .refund-explain { + border-top: 1px dashed #eee; + padding-top: 20rpx; + } +} + +.refund-address-wrap { + margin: 20rpx; + background: #fff; + padding: 20rpx; + border-radius: $ns-border-radius; + + .copy { + font-size: $ns-font-size-x-sm; + display: inline-block; + color: #666; + background: #fff; + line-height: 1; + padding: 6rpx 10rpx; + margin-left: 10rpx; + border-radius: 4rpx; + border: 1px solid #ddd; + } +} + +.history-wrap { + margin: 20rpx; + background: #fff; + padding: 20rpx; + display: flex; + position: relative; + border-radius: $ns-border-radius; + + view { + flex: 1; + } + + .icon-right { + position: absolute; + top: 50%; + transform: translateY(-50%); + color: #ddd; + right: 20rpx; + } +} + +.refund-info { + margin: 20rpx; + background: #fff; + border-radius: $ns-border-radius; + + .header { + height: 90rpx; + line-height: 90rpx; + padding: 0 20rpx; + } + + .body { + padding-bottom: 20rpx; + + .goods-wrap { + display: flex; + position: relative; + padding: 20rpx; + background: #f5f5f5; + + &:last-of-type { + margin-bottom: 0; + } + + .goods-img { + width: 180rpx; + height: 180rpx; + margin-right: 20rpx; + + image { + width: 100%; + height: 100%; + } + } + + .goods-info { + flex: 1; + position: relative; + max-width: calc(100% - 200rpx); + + .goods-name { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; + line-height: 1.5; + font-size: $ns-font-size-lg; + } + + .goods-sub-section { + padding-top: 20rpx; + width: 100%; + line-height: 1.3; + display: flex; + + .refund-price { + font-size: $ns-font-size-lg; + } + + .unit { + font-weight: normal; + font-size: $ns-font-size-base; + margin-right: 2rpx; + } + } + } + } + + .info { + margin-top: 20rpx; + + .cell { + height: 50rpx; + line-height: 50rpx; + padding: 0 20rpx; + font-size: $ns-font-size-base; + color: $ns-text-color-gray; + } + } + } +} + +.operation { + position: fixed; + z-index: 5; + left: 0; + bottom: 0; + width: 100vw; + height: 100rpx; + background: #fff; + box-shadow: 0 0px 10px rgba(0, 0, 0, 0.1); + text-align: right; + line-height: 100rpx; + + &.bottom-safe-area { + padding-bottom: constant(safe-area-inset-bottom); + padding-bottom: env(safe-area-inset-bottom); + } + .order-box-btn{ + margin-right: $ns-margin; + margin-left: 0; + } + + .operation-btn { + height: 70rpx; + line-height: 70rpx; + color: #fff; + padding: 0 40rpx; + display: inline-block; + text-align: center; + margin: 16rpx 20rpx 16rpx 0; + border-radius: $border-radius; + + &.white { + height: 68rpx; + line-height: 68rpx; + color: #333; + border: 0.5px solid #999; + background: #fff; + } + } +} + +.form-wrap { + background: #fff; + + .item { + margin: 0 20rpx; + display: flex; + border-bottom: 1px solid #eee; + + &:last-child { + border-bottom: none; + } + + .label { + width: 140rpx; + line-height: 90rpx; + } + + .cont { + flex: 1; + line-height: 90rpx; + + .input, + .input-placeholder { + height: 90rpx; + line-height: 90rpx; + font-size: $ns-font-size-lg; + } + + .textarea { + width: 100%; + padding: 26rpx 0; + line-height: 1.3; + font-size: $ns-font-size-lg; + } + } + } +} + +.sub-btn { + margin-top: 20rpx; +} + +.record-wrap { + padding: 0 20rpx; + + .record-item { + display: flex; + + .cont { + flex: 1; + margin-top: 40rpx; + box-shadow: 0 1.5px 3px 0 rgba(0, 0, 0, 0.06), 0 1.5px 3px 0 rgba(0, 0, 0, 0.08); + border-radius: 20rpx; + padding: 20rpx; + + .head { + line-height: 1; + + .time { + margin-left: 40rpx; + color: #999; + font-size: $ns-font-size-base; + float: right; + } + } + + .body { + padding-top: 20rpx; + color: #999; + } + } + + &.buyer { + .cont { + margin-left: 10%; + background: #fff; + } + } + + &.seller { + .cont { + margin-right: 10%; + background: #ffe48c; + } + } + } + + .empty-box{ + height: 168rpx; + } +} + +.history-bottom { + position: fixed; + z-index: 5; + left: 0; + bottom: 0; + width: 100vw; + height: 100rpx; + background: #fff; + box-shadow: 0 0px 10px rgba(0, 0, 0, 0.1); + text-align: right; + display: flex; + + &.bottom-safe-area { + padding-bottom: constant(safe-area-inset-bottom); + padding-bottom: env(safe-area-inset-bottom); + } + + view { + flex: 1; + text-align: center; + line-height: 100rpx; + + &:first-child { + border-right: 1px solid #eee; + } + .iconfont { + font-weight: bold; + margin-right: 10rpx; + font-size: $ns-font-size-lg; + line-height: 1; + } + } + button { + width: 50%; + height: 100%; + position: absolute; + border: none; + z-index: 1; + padding: 0; + margin: 0; + background: none; + + &::after { + border: none !important; + } + } +} diff --git a/pages_promotion/presale/public/js/detail.js b/pages_promotion/presale/public/js/detail.js new file mode 100644 index 0000000..8716158 --- /dev/null +++ b/pages_promotion/presale/public/js/detail.js @@ -0,0 +1,109 @@ +export default { + data() { + return { + goodsRoute: '/pages_promotion/presale/detail', + posterApi: '/presale/api/goods/poster', + id: 0, + groupId: 0, + } + }, + onLoad(data) { + this.id = data.id || 0; + this.skuId = data.sku_id || 0; + // 小程序扫码进入 + if (data.scene) { + var sceneParams = decodeURIComponent(data.scene); + sceneParams = sceneParams.split('&'); + if (sceneParams.length) { + sceneParams.forEach(item => { + if (item.indexOf('id') != -1) this.id = item.split('-')[1]; + }); + } + } + }, + async onShow() { + //同步获取商品详情 + await this.getGoodsSkuDetail(); + }, + methods: { + // 获取预售商品详情 + async getGoodsSkuDetail() { + let res = await this.$api.sendRequest({ + url: '/presale/api/goods/detail', + async: false, + data: { + id: this.id, + sku_id: this.skuId + } + }); + let data = res.data; + if (data.goods_sku_detail != null) { + this.goodsSkuDetail = data.goods_sku_detail; + this.goodsSkuDetail.purchased_num = this.goodsSkuDetail.purchased_num ? this.goodsSkuDetail + .purchased_num : 0; + + this.skuId = this.goodsSkuDetail.sku_id; + this.goodsSkuDetail.group_id = this.groupId; + + //预售结束倒计时 + if ((this.goodsSkuDetail.end_time - res.timestamp) > 0) { + this.goodsSkuDetail.timeMachine = this.$util.countDown(this.goodsSkuDetail.end_time - res + .timestamp); + } else { + this.$util.showToast({ + title: "活动已结束", + }); + setTimeout(() => { + this.$util.redirectTo('/pages/goods/detail', { + goods_id: this.goodsSkuDetail.goods_id + }, 'redirectTo'); + }, 1000); + } + + // 分享参数、链接 + this.shareQuery = 'id=' + this.id; + this.shareUrl = this.goodsRoute + '?' + this.shareQuery; + + // 在线客服聊天参数 + this.chatRoomParams = { + sku_id: this.goodsSkuDetail.sku_id, + type: 'presale', + type_id: this.id + }; + + // 海报参数 + this.posterParams = { + id: this.id + }; + + // 处理商品数据 + this.handleGoodsSkuData(); + + this.goodsSkuDetail.show_price = this.goodsSkuDetail.goods_price; + + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + + } else { + this.$util.redirectTo('/pages_tool/goods/not_exist', {}, 'redirectTo'); + } + }, + // 预售下单 + presale() { + if (!this.token) { + if (this.source_member) { + this.$refs.login.open(this.shareUrl + '&source_member=' + this.source_member); + } else { + this.$refs.login.open(this.shareUrl); + } + return; + } + this.$refs.goodsSku.show("presale", () => { + this.getCartCount(); + }); + }, + // 去订单列表付尾款 + toOrderDetail() { + this.$util.redirectTo('/pages_promotion/presale/order_list'); + }, + } +} diff --git a/pages_promotion/presale/public/js/orderMethod.js b/pages_promotion/presale/public/js/orderMethod.js new file mode 100644 index 0000000..a11cbc1 --- /dev/null +++ b/pages_promotion/presale/public/js/orderMethod.js @@ -0,0 +1,161 @@ +export default { + methods: { + /** + * 关闭订单 + * @param {Object} order_id + */ + orderClose(order_id, callback){ + uni.showModal({ + title: '提示', + content: '您确定要关闭该订单吗?', + success: res => { + if (res.confirm) { + this.$api.sendRequest({ + url: '/presale/api/order/close', + data: {order_id}, + success: res => { + if(res.code==0){ + typeof callback == 'function' && callback(); + }else{ + this.$util.showToast({ + title: res.message, + duration:2000 + }) + } + } + }) + } + } + }) + }, + /** + * 删除订单 + * @param {Object} order_id + */ + deleteOrder(order_id, callback){ + uni.showModal({ + title: '提示', + content: '您确定要删除该订单吗?', + success: res => { + if (res.confirm) { + this.$api.sendRequest({ + url: '/presale/api/order/delete', + data: {order_id}, + success: res => { + if(res.code==0){ + typeof callback == 'function' && callback(); + }else{ + this.$util.showToast({ + title: res.message, + duration:2000 + }) + } + } + }) + } + } + }) + }, + /** + * 退定金 + * @param {Object} order_id + */ + refundDeposit(order_id, callback){ + uni.showModal({ + title: '提示', + content: '您确定要退定金吗?', + success: res => { + if (res.confirm) { + this.$api.sendRequest({ + url: '/presale/api/refund/applyRefund', + data: {order_id}, + success: res => { + if(res.code==0){ + typeof callback == 'function' && callback(); + }else{ + this.$util.showToast({ + title:res.message, + duration:2000 + }) + } + } + }) + } + } + }) + }, + /** + * 支付尾款 + * @param {Object} order_id + */ + orderPayFinal(order, callback){ + let url = '/presale/api/order/pay', + data = { id: order.id }; + if (order.final_out_trade_no == '') { + url = '/presale/api/ordercreate/finalCreate'; + data.is_balance = this.isBalance; + } + this.$api.sendRequest({ + url, + data, + success: res => { + this.isSub = false; + if (res.code >= 0) { + if (this.payMoney == 0) { + this.$util.redirectTo('/pages_tool/pay/result', { + code: res.data + }, 'redirectTo'); + } else { + this.$refs.choosePaymentPopup.getPayInfo(res.data); + } + } else { + this.$util.showToast({ + title: res.message + }); + } + this.isBalance = 0; + }, + fail: res => { + this.isSub = false; + } + }) + }, + /** + * 定金支付 + * @param {Object} order_id + */ + orderPayDeposit(order, callback){ + this.$api.sendRequest({ + url: '/presale/api/order/pay', + data: { + 'id' : order.id + }, + success: res => { + this.isSub = false; + if (res.code >= 0) { + this.$refs.choosePaymentPopup.getPayInfo(res.data); + } else { + this.$util.showToast({ + title: res.message + }); + } + }, + fail: res => { + this.isSub = false; + } + }) + }, + openPaymentPopup(order, type){ + this.payType = type; + if (type == 'final_money') { + if (order.final_out_trade_no == '') { + this.payMoney = order.order_money - order.presale_deposit_money; + } + } else if (type == 'presale_deposit_money') { + this.payMoney = order.pay_deposit_money; + } + uni.setStorageSync('paySource', 'presale'); + this.$refs.choosePaymentPopup.open(); + } + } +} \ No newline at end of file diff --git a/pages_promotion/presale/public/js/payment.js b/pages_promotion/presale/public/js/payment.js new file mode 100644 index 0000000..80f69e0 --- /dev/null +++ b/pages_promotion/presale/public/js/payment.js @@ -0,0 +1,956 @@ +export default { + data() { + return { + currTime: '', + isIphoneX: false, + orderCreateData: { + is_balance: 0, + pay_password: '', + + // 发票 + is_invoice: 0, // 是否需要发票 0 无发票 1 有发票 + invoice_type: 0, // 发票类型 1 纸质 2 电子 + invoice_title_type: 1, // 抬头类型 1 个人 2 企业 + is_tax_invoice: 0, // 是否需要增值税专用发票 0 不需要 1 需要 + invoice_title: '', // 发票抬头 + taxpayer_number: '', // 纳税人识别号 + invoice_content: '', // 发票内容 + invoice_full_address: '', // 发票邮寄地址 + invoice_email: '', //发票邮箱 + default_store_id: '', + buyer_message: '', + buyer_ask_delivery_title: '' + }, + orderPaymentData: { + shop_goods_list: { + site_name: '', + express_type: [], + coupon_list: [], + coupon_list: [], + invoice: { + invoice_content_array: [] + } + }, + member_account: { + balance: 0, + is_pay_password: 0 + }, + local_config: { + info: { + start_time: 0, + end_time: 0, + time_week: [] + } + } + }, + isSub: false, + tempData: null, + is_deposit_back: 0, // 是否退定金 0 是 1 否 + switch_state: true, + // 门店信息 + storeInfo: { + storeList: [], //门店列表 + currStore: {} //当前选择门店 + }, + // 自提地址 + member_address: { + mobile: '' + }, + // 当前时间 + timeInfo: { + week: 0, + start_time: 0, + end_time: 0, + showTimeBar: false + }, + canLocalDelicery: true, + // 密码是否聚焦 + isFocus: false, + member_id: 0, //会员id + presale_id: 0, + pay_password: "", + action: { + icon: '' + }, + deliveryWeek: "", + menuButtonBounding: {}, + memberAddress: null, + localMemberAddress: null, + }; + }, + methods: { + /** + * 显示弹出层 + * @param {Object} ref + */ + openPopup(ref) { + this.$refs[ref].open(); + }, + /** + * 关闭弹出层 + * @param {Object} ref + */ + closePopup(ref) { + if (this.tempData) { + Object.assign(this.orderCreateData, this.tempData); + Object.assign(this.orderPaymentData, this.tempData); + this.tempData = null; + this.$forceUpdate(); + } + this.$refs[ref].close(); + }, + /** + * 选择收货地址 + */ + selectAddress() { + var params = { + back: this.$util.getCurrentRoute().path, + local: 0, + type: 1 + } + // 外卖配送需要定位地址 + if (this.orderCreateData.delivery.delivery_type == 'local') { + params.local = 1; + params.type = 2; + } + this.$util.redirectTo('/pages_tool/member/address', params); + }, + /** + * 获取订单初始化数据 + */ + getOrderPaymentData() { + Object.assign(this.orderCreateData, uni.getStorageSync('presaleOrderCreateData')) + // 获取经纬度 + if (this.location) { + this.orderCreateData.latitude = this.location.latitude; + this.orderCreateData.longitude = this.location.longitude; + } + //获取门店缓存 + var store_info_storage = uni.getStorageSync('store'); + + + if (store_info_storage) { + this.orderCreateData.default_store_id = store_info_storage.store_id; + } + if (!this.orderCreateData) { + this.$util.showToast({ + title: '未获取到创建订单所需数据!!', + success: () => { + setTimeout(() => { + this.$util.redirectTo('/pages/index/index'); + }, 1500) + } + }); + return; + } + this.$api.sendRequest({ + url: '/presale/api/ordercreate/depositPayment', + data: this.orderCreateData, + success: res => { + if (res.code >= 0) { + this.orderPaymentData = res.data; + this.is_deposit_back = res.data.promotion_presale_info.is_deposit_back; + this.handlePaymentData(); + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + } else { + this.$util.showToast({ + title: '未获取到创建订单所需数据!!', + success: () => { + // setTimeout(() => { + // this.$util.redirectTo('/pages/index/index'); + // }, 1500) + } + }); + } + }, + fail: res => { + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + } + }) + }, + /** + * 处理结算订单数据 + */ + handlePaymentData() { + this.orderCreateData.delivery = {}; + this.orderCreateData.coupon = {}; + this.orderCreateData.buyer_message = ''; + + this.orderCreateData.is_balance = 0; + this.orderCreateData.pay_password = ''; + + this.orderCreateData.is_invoice = 0; // 是否需要发票 0 无发票 1 有发票 + this.orderCreateData.invoice_type = 1; // 发票类型 1 纸质 2 电子 + this.orderCreateData.invoice_title_type = 1; // 发票抬头类型 1 个人 2企业 + this.orderCreateData.is_tax_invoice = 0; // 是否需要增值税专用发票 0 不需要 1 需要 + this.orderCreateData.invoice_title = ''; + if (this.orderPaymentData.shop_goods_list.invoice) { + this.orderPaymentData.shop_goods_list.invoice.invoice_type = this.orderPaymentData.shop_goods_list + .invoice.invoice_type.split(','); + this.orderCreateData.invoice_type = this.orderPaymentData.shop_goods_list.invoice.invoice_type[ + 0]; // 发票类型 1 纸质 2 电子 + } + + var data = this.orderPaymentData; + + if (data.shop_goods_list.express_type != undefined && data.shop_goods_list.express_type[0] != undefined) { + var express_type = data.shop_goods_list.express_type; + this.orderCreateData.delivery.store_id = 0; + // 获取选择配送方式缓存 + var delivery_storage = uni.getStorageSync('delivery'); + if (delivery_storage) { + var delivery_type = delivery_storage.name; + var delivery_type_name = delivery_storage.title; + express_type.forEach(item => { + if ((delivery_type == 'store' && item.name == delivery_type) || (delivery_type == 'local' && item.name == delivery_type)) { + this.storeSelected(item); + } + }) + // 如果配送方式缓存是门店配送模拟点击门店tab选项 + if (delivery_type == 'store') { + this.member_address = { + mobile: data.member_account.mobile != '' ? data.member_account.mobile : '' + }; + } + } else { + var delivery_type = express_type[0].name; + if (delivery_type == "store") { + this.member_address = { + mobile: data.member_account.mobile != '' ? data.member_account.mobile : '' + }; + } + var delivery_type_name = express_type[0].title; + } + this.orderCreateData.delivery.delivery_type = delivery_type; + this.orderCreateData.delivery.delivery_type_name = delivery_type_name; + + // 如果默认配送方式是门店配送模拟点击门店tab选项 + if (express_type[0].name == 'store' || express_type[0].name == 'local') { + this.storeSelected(express_type[0]); + } + } + + if (data.shop_goods_list.coupon_list != undefined && data.shop_goods_list.coupon_list[0] != undefined) { + var coupon_list = data.shop_goods_list.coupon_list; + this.orderCreateData.coupon.coupon_id = coupon_list[0].coupon_id; + this.orderCreateData.coupon.coupon_money = coupon_list[0].money; + } + + if (this.orderPaymentData.is_virtual) this.orderCreateData.member_address = { + mobile: data.member_account.mobile != '' ? data.member_account.mobile : '' + }; + + if (this.orderPaymentData.shop_goods_list.invoice) { + var invoice_content_array = this.orderPaymentData.shop_goods_list.invoice.invoice_content_array; + if (invoice_content_array.length) this.orderCreateData.invoice_content = invoice_content_array[0]; + } + + Object.assign(this.orderPaymentData, this.orderCreateData); + this.orderPaymentData.shop_goods_list.goods_list.forEach((v) => { + if (v.sku_spec_format) { + v.sku_spec_format = JSON.parse(v.sku_spec_format); + } else { + v.sku_spec_format = [] + } + }); + this.orderCalculate(); + }, + // 转化时间字符串 + getTimeStr(val) { + var h = parseInt(val / 3600).toString(); + var m = parseInt((val % 3600) / 60).toString(); + if (m.length == 1) { + m = '0' + m; + } + if (h.length == 1) { + h = '0' + h; + } + return h + ':' + m; + }, + /** + * 订单计算 + */ + orderCalculate() { + var data = this.$util.deepClone(this.orderCreateData); + data.delivery = JSON.stringify(data.delivery); + data.coupon = JSON.stringify(data.coupon); + if (this.orderCreateData.delivery.delivery_type == 'store') { + data.member_address = JSON.stringify(this.member_address); + } else { + data.member_address = JSON.stringify(data.member_address); + } + + this.$api.sendRequest({ + url: '/presale/api/ordercreate/depositCalculate', + data, + success: res => { + if (res.code >= 0) { + if (!res.data.is_virtual && res.data.delivery) { + if (res.data.delivery.delivery_type == 'express') this.memberAddress = res.data.member_address; + if (res.data.delivery.delivery_type == 'local') this.localMemberAddress = res.data.member_address; + } + this.orderPaymentData.delivery_money = res.data.delivery_money; + this.orderPaymentData.coupon_money = res.data.coupon_money; + this.orderPaymentData.invoice_money = res.data.invoice_money; + this.orderPaymentData.invoice_delivery_money = res.data.shop_goods_list + .invoice_delivery_money; + this.orderPaymentData.promotion_money = res.data.promotion_money; + this.orderPaymentData.order_money = res.data.order_money; + this.orderPaymentData.balance_money = res.data.balance_money; + this.orderPaymentData.pay_money = res.data.pay_money; + this.orderPaymentData.goods_money = res.data.goods_money; + this.orderPaymentData.final_money = res.data.final_money; + + if (res.data.shop_goods_list.local_config) this.orderPaymentData.local_config = res.data.shop_goods_list.local_config; + + this.createBtn(); + this.$forceUpdate(); + } else { + this.$util.showToast({ + title: res.message + }); + } + }, + }) + }, + + /** + * 订单创建验证 + */ + createBtn(){ + if(this.orderPaymentData.delivery + && this.orderPaymentData.delivery.delivery_type == 'local' + && this.orderPaymentData.shop_goods_list.delivery + && this.orderPaymentData.shop_goods_list.delivery.error + && this.orderPaymentData.shop_goods_list.delivery.start_money > this.orderPaymentData.presale_deposit_money){ + return false; + } + if(this.orderPaymentData.delivery + && this.orderPaymentData.delivery.delivery_type == 'local' + && this.orderPaymentData.shop_goods_list.delivery + && this.orderPaymentData.shop_goods_list.delivery.error + && this.orderPaymentData.shop_goods_list.delivery.error !== ''){ + return false; + } + return true; + }, + + /** + * 订单创建 + */ + orderCreate() { + if (this.verify()) { + if (this.isSub) return; + this.isSub = true; + + var data = this.$util.deepClone(this.orderCreateData); + data.delivery = JSON.stringify(data.delivery); + data.coupon = JSON.stringify(data.coupon); + if (this.orderCreateData.delivery.delivery_type == 'store') { + data.member_address = JSON.stringify(this.member_address); + } else { + data.member_address = JSON.stringify(data.member_address); + } + + this.$api.sendRequest({ + url: '/presale/api/ordercreate/depositCreate', + data, + success: res => { + if (res.code >= 0) { + if (this.orderPaymentData.pay_money == 0) { + // #ifdef MP-WEIXIN + switch(this.orderCreateData.delivery.delivery_type){ + // ORDER_URGE_PAYMENT,订单催付 + // ORDER_PAY,订单支付 + // ORDER_DELIVERY //订单发货 + // ORDER_TAKE_DELIVERY 订单收货 + + case 'express'://物流配送 + // this.$util.subscribeMessage('ORDER_TAKE_DELIVERY'); + break; + case 'store'://门店自提 + this.$util.subscribeMessage('ORDER_VERIFY_OUT_TIME,VERIFY_CODE_EXPIRE,VERIFY'); + break; + case 'local'://同城配送 + // this.$util.subscribeMessage('ORDER_TAKE_DELIVERY'); + break; + default: + this.$util.subscribeMessage('ORDER_VERIFY_OUT_TIME,VERIFY_CODE_EXPIRE,VERIFY'); + + } + // #endif + + this.$util.redirectTo('/pages_tool/pay/result', { + code: res.data + }, 'redirectTo'); + } else { + let orderCreateData = uni.getStorageSync('presaleOrderCreateData'); + orderCreateData.out_trade_no = res.data; + uni.setStorageSync('presaleOrderCreateData', orderCreateData); + + this.$refs.choosePaymentPopup.getPayInfo(res.data); + this.isSub = false; + } + } else { + this.isSub = false; + uni.hideLoading(); + if (this.$refs.payPassword) { + this.$refs.payPassword.close(); + } + if (res.data.error_code == 10 || res.data.error_code == 12) { + uni.showModal({ + title: '订单未创建', + content: res.message, + confirmText: '去设置', + success: res => { + if (res.confirm) { + this.selectAddress(); + } + } + }) + } else { + this.$util.showToast({ + title: res.message + }); + } + } + } + }) + } + }, + /** + * 订单验证 + */ + verify() { + if (this.orderPaymentData.is_virtual == 1) { + if (!this.orderCreateData.member_address.mobile.length) { + this.$util.showToast({ + title: '请输入您的手机号码' + }); + return false; + } + var reg = + /^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$/; + if (!reg.test(this.orderCreateData.member_address.mobile)) { + this.$util.showToast({ + title: '请输入正确的手机号码' + }); + return false; + } + } + + if (this.orderPaymentData.is_virtual == 0) { + if (this.orderCreateData.delivery.delivery_type != 'store') { + if (!this.orderPaymentData.member_address) { + this.$util.showToast({ + title: '请先选择您的收货地址' + }); + return false; + } + } + + if (JSON.stringify(this.orderCreateData.delivery) == "{}") { + this.$util.showToast({ + title: '店铺未设置配送方式' + }); + return false; + } + + if (this.orderCreateData.delivery.delivery_type == 'store') { + if (!this.orderCreateData.delivery.store_id) { + this.$util.showToast({ + title: '没有可提货的门店,请选择其他配送方式' + }); + return false; + } + if (!this.member_address.mobile) { + this.$util.showToast({ + title: '请输入预留手机' + }); + return false; + } + var reg = + /^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$/; + if (!reg.test(this.member_address.mobile)) { + this.$util.showToast({ + title: '请输入正确的预留手机' + }); + return false; + } + } + + if (this.orderCreateData.delivery.delivery_type == 'local') { + if (!this.orderCreateData.delivery.store_id) { + this.$util.showToast({ + title: '没有可配送的门店,请选择其他配送方式' + }); + return false; + } + } + } + + // 如果使用发票进行验证 + if (this.orderCreateData.is_invoice == 1) { + if (!this.invoiceVerify()) return false; + } + + return true; + }, + /** + * 显示店铺优惠信息 + * @param {Object} data + */ + openSitePromotion() { + this.$refs.sitePromotionPopup.open(); + }, + /** + * 显示店铺配送信息 + * @param {Object} index + */ + openSiteDelivery() { + this.tempData = { + delivery: this.$util.deepClone(this.orderPaymentData.delivery) + }; + this.$refs.deliveryPopup.open(); + }, + /** + * 选择配送方式 + */ + selectDeliveryType(data) { + uni.setStorageSync('delivery', { + title: data.title, + name: data.name + }); + this.orderCreateData.delivery.delivery_type = data.name; + this.orderCreateData.delivery.delivery_type_name = data.title; + // 如果是门店配送 + if (data.name == 'store') { + this.storeSelected(data); + if (!this.member_address.mobile) this.member_address.mobile = this.orderPaymentData.member_account + .mobile != '' ? this.orderPaymentData.member_account.mobile : ''; + } + if (data.name == 'local') { + this.storeSelected(data); + } + + Object.assign(this.orderPaymentData, this.orderCreateData); + this.orderCalculate(); + this.$forceUpdate(); + + }, + // 切换到门店 + storeSelected(data) { + // 门店列表 + this.storeInfo.storeList = data.store_list; + let store = data.store_list[0] ? data.store_list[0] : null; + this.selectPickupPoint(store); + }, + /** + * 选择自提点 + */ + selectPickupPoint(store_item) { + if (store_item) { + this.orderCreateData.delivery.store_id = store_item.store_id; + this.storeInfo.currStore = store_item; + // 存储所选门店 + let delivery = uni.getStorageSync('delivery'); + delivery.store_id = store_item.store_id; + uni.setStorageSync('delivery', delivery) + } else { + this.orderCreateData.delivery.store_id = 0; + this.storeInfo.currStore = {}; + } + Object.assign(this.orderPaymentData, this.orderCreateData); + this.orderCalculate(); + this.$forceUpdate(); + this.$refs['deliveryPopup'].close(); + }, + /** + * 显示店铺优惠券信息 + */ + openSiteCoupon() { + this.tempData = { + coupon: this.$util.deepClone(this.orderPaymentData.coupon) + }; + this.$refs.couponPopup.open(); + }, + /** + * 选择优惠券 + * @param {Object} item + */ + selectCoupon(item) { + if (this.orderCreateData.coupon.coupon_id != item.coupon_id) { + this.orderCreateData.coupon.coupon_id = item.coupon_id; + this.orderCreateData.coupon.coupon_money = item.money; + } else { + this.orderCreateData.coupon.coupon_id = 0; + this.orderCreateData.coupon.coupon_money = '0.00'; + } + Object.assign(this.orderPaymentData, this.orderCreateData); + this.$forceUpdate(); + }, + popupConfirm(ref) { + this.$refs[ref].close(); + this.orderCalculate(); + this.$forceUpdate(); + this.tempData = null; + }, + /** + * 使用余额 + */ + useBalance() { + if (this.orderCreateData.is_balance) this.orderCreateData.is_balance = 0; + else this.orderCreateData.is_balance = 1; + this.orderCalculate(); + this.$forceUpdate(); + }, + /** + * 设置支付密码 + */ + setPayPassword() { + this.$util.redirectTo('/pages_tool/member/pay_password', { + back: '/pages_promotion/presale/payment' + }); + }, + /** + * 暂不设置支付密码 + */ + noSet() { + this.orderCreateData.is_balance = 0; + this.$refs.payPassword.close(); + this.orderCalculate(); + this.$forceUpdate(); + }, + /** + * 支付密码输入 + */ + input(pay_password) { + if (pay_password.length == 6) { + uni.showLoading({ + title: '支付中...', + mask: true + }) + this.$api.sendRequest({ + url: '/api/member/checkpaypassword', + data: { + pay_password + }, + success: res => { + if (res.code >= 0) { + if (this.finalPay) { + this.finalPay.pay_password = pay_password; + this.finalPay.member_id = this.member_id; + this.finalPay.is_balance = this.finalPay.is_use_balance; + } else { + this.orderCreateData.pay_password = pay_password; + this.orderCreate(); + } + + } else { + uni.hideLoading(); + this.$util.showToast({ + title: res.message + }); + } + }, + fail: res => { + uni.hideLoading(); + } + }) + } + }, + imageError(goodsIndex) { + this.orderPaymentData.shop_goods_list.goods_list[goodsIndex].sku_image = this.$util.getDefaultImage() + .goods_img; + this.$forceUpdate(); + }, + navigateBack() { + this.$util.goBack(); + }, + // 切换发票开关 + changeIsInvoice() { + if (this.orderCreateData.is_invoice == 0) { + this.orderCreateData.is_invoice = 1; + if (!this.orderCreateData.invoice_type) this.orderCreateData.invoice_type = this.orderPaymentData.shop_goods_list.invoice.invoice_type.split(',')[0]; + } else { + this.orderCreateData.is_invoice = 0; + } + this.orderCalculate(); + this.$forceUpdate(); + }, + // 切换发票类型 + changeInvoiceType(invoice_type) { + this.orderCreateData.invoice_type = invoice_type; + this.orderCalculate(); + this.$forceUpdate(); + }, + // 切换发票个人还是企业 + changeInvoiceTitleType(invoice_title_type) { + this.orderCreateData.invoice_title_type = invoice_title_type; + this.orderCalculate(); + this.$forceUpdate(); + }, + // 切换增值税专用发票开关 + changeIsTaxInvoice() { + if (this.orderCreateData.is_tax_invoice == 0) this.orderCreateData.is_tax_invoice = 1; + else this.orderCreateData.is_tax_invoice = 0; + this.$forceUpdate(); + }, + // 选择发票内容 + changeInvoiceContent(invoice_content) { + this.orderCreateData.invoice_content = invoice_content; + this.$forceUpdate(); + }, + // 发票验证 + invoiceVerify() { + if (!this.orderCreateData.invoice_title) { + this.$refs.invoicePopup.open(); + this.$util.showToast({ + title: '请填写发票抬头' + }); + return false; + } + if (!this.orderCreateData.taxpayer_number && this.orderCreateData.invoice_title_type == 2) { + this.$refs.invoicePopup.open(); + this.$util.showToast({ + title: '请填写纳税人识别号' + }); + return false; + } + if (this.orderCreateData.invoice_type == 1 && !this.orderCreateData.invoice_full_address && this.orderPaymentData.is_virtual ==1) { + this.$refs.invoicePopup.open(); + this.$util.showToast({ + title: '请填写发票邮寄地址' + }); + return false; + } + if (this.orderCreateData.invoice_type == 2 && !this.orderCreateData.invoice_email) { + this.$refs.invoicePopup.open(); + this.$util.showToast({ + title: '请填写邮箱' + }); + return false; + } + if (this.orderCreateData.invoice_type == 2) { + var reg = /^([a-zA-Z]|[0-9])(\w|\-)+@[a-zA-Z0-9]+\.([a-zA-Z]{2,4})$/; + if (!reg.test(this.orderCreateData.invoice_email)) { + this.$refs.invoicePopup.open(); + this.$util.showToast({ + title: '请填写正确的邮箱' + }); + return false; + } + } + if (!this.orderCreateData.invoice_content) { + this.$refs.invoicePopup.open(); + this.$util.showToast({ + title: '请选择发票内容' + }); + return false; + } + return true; + }, + // 保存发票信息 + saveInvoice() { + if (this.orderCreateData.is_invoice == 1) { + if (this.invoiceVerify()) { + this.closePopup('invoicePopup'); + } + } else { + this.closePopup('invoicePopup'); + } + }, + // 选择自提时间 + bindTimeChange(data) { + let time = data.detail.value; + this.orderCreateData.buyer_ask_delivery_time = time; + this.orderCalculate(); + this.$forceUpdate(); + }, + // 获取时间 + getTime() { + // 必须是字符串,跟后端一致 + let weeks = ['0', '1', '2', '3', '4', '5', '6']; + let week = new Date().getDay(); + this.timeInfo.week = weeks[week]; + }, + closeInvoicePopup() { + // 发票 + // this.orderCreateData.is_invoice = 0; + // this.orderCreateData.invoice_type = this.orderPaymentData.shop_goods_list.invoice.invoice_type[ + // 0]; // 发票类型 1 纸质 2 电子 + // this.orderCreateData.invoice_title_type = 1; // 抬头类型 1 个人 2 企业 + // this.orderCreateData.is_tax_invoice = 0; // 是否需要增值税专用发票 0 不需要 1 需要 + // this.orderCreateData.invoice_title = ''; // 发票抬头 + // this.orderCreateData.taxpayer_number = ''; // 纳税人识别号 + // this.orderCreateData.invoice_content = ''; // 发票内容 + // this.orderCreateData.invoice_full_address = ''; // 发票邮寄地址 + // this.orderCreateData.invoice_email = ''; //发票邮箱 + // this.orderCalculate(); + // this.$forceUpdate(); + this.$refs.invoicePopup.close(); + }, + switchChange(e) { + this.switch_state = e.detail.value; + }, + navigateTo(e) { + this.$util.redirectTo('/pages/goods/detail', { + goods_id: e + }) + }, + // 显示选择支付方式弹框 + openChoosePayment() { + if (this.is_deposit_back == 1) { + if (!this.switch_state) { + this.$util.showToast({ + title: '预售商品定金不支持退款,请确定同意定金不退款协议。' + }) + return false; + } else { + this.$refs.depositRefund.open(); + } + } else { + uni.setStorageSync('paySource', 'presale'); + if (this.verify()) { + this.$refs.choosePaymentPopup.open(); + // #ifdef MP-WEIXIN + switch(this.orderCreateData.delivery.delivery_type){ + // ORDER_URGE_PAYMENT,订单催付 + // ORDER_PAY,订单支付 + // ORDER_DELIVERY //订单发货 + + case 'express'://物流配送 + this.$util.subscribeMessage('ORDER_URGE_PAYMENT,ORDER_PAY,ORDER_DELIVERY'); + break; + case 'store'://门店自提 + this.$util.subscribeMessage('ORDER_URGE_PAYMENT,ORDER_PAY'); + break; + case 'local'://同城配送 + this.$util.subscribeMessage('ORDER_URGE_PAYMENT,ORDER_PAY,ORDER_DELIVERY'); + break; + default: + this.$util.subscribeMessage('ORDER_URGE_PAYMENT,ORDER_PAY'); + } + // #endif + } + } + }, + /** + * 微信订阅消息 + */ + subscribeMessage() { + this.$api.sendRequest({ + url: '/weapp/api/weapp/messagetmplids', + data: { + keywords: 'ORDER_PAY,ORDER_DELIVERY,ORDER_TAKE_DELIVERY' + }, + success: res => { + if (res.data.length) { + uni.requestSubscribeMessage({ + tmplIds: res.data, + success: (res) => {}, + fail: (res) => { + console.log('fail', res) + } + }) + } + } + }) + }, + toPayOrder() { + uni.setStorageSync('paySource', 'presale'); + if (this.verify()) { + this.$refs.depositRefund.close(); + this.$refs.choosePaymentPopup.open(); + } + }, + closeDepositRefund() { + this.$refs.depositRefund.close(); + }, + // 定金不退弹框打开 + presaleAgreement() { + this.$refs.presaleAgreement.open(); + }, + closePresaleAgreement() { + this.$refs.presaleAgreement.close(); + }, + saveBuyerMessage(){ + this.$refs.buyerMessagePopup.close(); + } + }, + onShow() { + // 判断登录 + if (!uni.getStorageSync('token')) { + this.$util.redirectTo('/pages_tool/login/login'); + } else { + this.getOrderPaymentData(); + } + + //用户通过返回上一页返回时 如果订单已经创建则强制跳转到订单列表 + var orderCreateData = uni.getStorageSync('presaleOrderCreateData'); + if(orderCreateData && orderCreateData.out_trade_no){ + this.$util.redirectTo('/pages_promotion/presale/order_list', {}, "redirectTo"); + } + this.getTime(); + this.isIphoneX = this.$util.uniappIsIPhoneX() + }, + onLoad(option) { + if (option.id) { + this.presale_id = option.id + } + if (uni.getStorageSync('userInfo')) { + this.member_id = uni.getStorageSync('userInfo').member_id + } + if (!this.location) this.$util.getLocation(); + // #ifdef MP + this.menuButtonBounding = uni.getMenuButtonBoundingClientRect(); + // #endif + }, + onHide() { + if (this.$refs.loadingCover) this.$refs.loadingCover.show(); + }, + computed: { + // 余额抵扣 + balanceDeduct() { + let balance = parseFloat(this.orderPaymentData.member_account.balance_total) < parseFloat(this + .orderPaymentData.presale_deposit_money) ? parseFloat(this.orderPaymentData.member_account + .balance_total) : parseFloat(this.orderPaymentData.presale_deposit_money); + return balance.toFixed(2); + }, + presaleDiscount() { + return (parseFloat(this.orderPaymentData.presale_money) - parseFloat(this.orderPaymentData + .presale_deposit_money)).toFixed(2); + }, + location(){ + return this.$store.state.location; + } + }, + watch: { + location: function(nVal){ + if (nVal) { + this.getOrderPaymentData(); + } + } + }, + filters: { + /** + * 金额格式化输出 + * @param {Object} money + */ + moneyFormat(money) { + return parseFloat(money).toFixed(2); + }, + /** + * 店铺优惠摘取 + */ + promotion(data) { + let promotion = ''; + if (data) { + Object.keys(data).forEach((key) => { + promotion += data[key].content + ' '; + }) + } + return promotion; + } + } +} diff --git a/pages_promotion/presale/public/js/refundMethod.js b/pages_promotion/presale/public/js/refundMethod.js new file mode 100644 index 0000000..ede8082 --- /dev/null +++ b/pages_promotion/presale/public/js/refundMethod.js @@ -0,0 +1,28 @@ +export default { + methods: { + /** + * 撤销退款申请 + * @param {Object} order_goods_id + * @param {Object} callback + */ + cancleRefund(order_goods_id, callback){ + uni.showModal({ + content: '撤销之后本次申请将会关闭,如后续仍有问题可再次发起申请。', + cancelText: '暂不撤销', + cancelColor: '#898989', + success: res => { + if (res.confirm) { + this.$api.sendRequest({ + url: '/api/orderrefund/cancel', + data: {order_goods_id}, + success: res => { + typeof callback == 'function' && callback(res); + } + }) + } + } + }) + }, + + } +} \ No newline at end of file diff --git a/pages_promotion/seckill/detail.vue b/pages_promotion/seckill/detail.vue new file mode 100644 index 0000000..9d9a9c5 --- /dev/null +++ b/pages_promotion/seckill/detail.vue @@ -0,0 +1,219 @@ + ++ +确认订单 ++ + + + + + ++ + + + + + ++ ++ {{ deliveryItem.title }} + + ++ + + + ++ + ++ ++ ++ 由 + +{{ storeInfo.currStore.store_name }} + 提供配送 ++ +点击切换 ++ + ++ 您的附近没有可配送的门店,请选择其他配送方式 + ++ +{{ localMemberAddress.name ? localMemberAddress.name : '' }} +{{ localMemberAddress.mobile ? localMemberAddress.mobile : '' }} ++ + {{ localMemberAddress.full_address ? localMemberAddress.full_address : '' }} {{ localMemberAddress.address ? localMemberAddress.address : '' }} + ++ +请设置收货地址 ++ + + ++ ++ +{{ memberAddress.name ? memberAddress.name : '' }} +{{ memberAddress.mobile ? memberAddress.mobile : '' }} ++ + {{ memberAddress.full_address ? memberAddress.full_address : '' }} {{ memberAddress.address ? memberAddress.address : '' }} + ++ +请设置收货地址 ++ + + + + + ++ ++ ++ ++ ++ +{{ storeInfo.currStore.store_name }} ++ +营业时间:{{ storeInfo.currStore.open_date }} +{{ storeInfo.currStore.full_address }} {{ storeInfo.currStore.address }} ++ + ++ +预留手机 + +当前无自提门店,请选择其它配送方式 ++ + + + ++ ++ 购买虚拟类商品需填写手机号,方便商家与您联系 + + ++ 手机号码 + ++ + + + ++ + ++ ++ ++ ++ + ++ +{{ goodsItem.sku_name }} ++ ++ ++ {{ x.spec_value_name }} {{ i < goodsItem.sku_spec_format.length - 1 ? '; ' : '' }} + ++ ++ 该商品不支持{{ orderCreateData.delivery.delivery_type_name }} ++ ++ +{{ $lang('common.currencySymbol') }} ++ {{ + parseFloat(goodsItem.price) + .toFixed(2) + .split('.')[0] + }} + ++ .{{ + parseFloat(goodsItem.price) + .toFixed(2) + .split('.')[1] + }} + ++ +x +{{ goodsItem.num }} ++ + + ++ ++ +发票 ++ +{{ orderCreateData.invoice_type == 1 ? '纸质' : '电子' }}发票({{ orderCreateData.invoice_content }}) +无需发票 ++ + + ++ +商品金额 ++ +{{ $lang('common.currencySymbol') }} +{{ orderPaymentData.goods_money | moneyFormat }} ++ +定金膨胀 ++ +- +{{ $lang('common.currencySymbol') }} +{{ presaleDiscount }} ++ +运费 ++ ++ +{{ $lang('common.currencySymbol') }} +{{ orderPaymentData.delivery_money | moneyFormat }} ++ ++ +税费 +({{ orderPaymentData.shop_goods_list.invoice.invoice_rate }}%) ++ ++ +{{ $lang('common.currencySymbol') }} +{{ orderPaymentData.invoice_money | moneyFormat }} ++ +发票邮寄费 ++ ++ +{{ $lang('common.currencySymbol') }} +{{ orderPaymentData.invoice_delivery_money | moneyFormat }} ++ +优惠 ++ +- +{{ $lang('common.currencySymbol') }} +{{ orderPaymentData.promotion_money | moneyFormat }} ++ + +优惠券 ++ +- +{{ $lang('common.currencySymbol') }} +{{ orderPaymentData.coupon_money | moneyFormat }} ++ + + ++ +阶段一:付定金 ++ ++ +{{ $lang('common.currencySymbol') }} +{{ orderPaymentData.presale_deposit_money | moneyFormat }} ++ +阶段二:付尾款 ++ ++ +{{ $lang('common.currencySymbol') }} +{{ orderPaymentData.final_money | moneyFormat }} ++ + + ++ 我已同意定金不退等预售协议 + ++ + + + ++ + +共{{ orderPaymentData.num }}件 +定金: +{{ $lang('common.currencySymbol') }} +{{ orderPaymentData.pay_money | moneyFormat }} ++ + + ++ + + ++ +预售商品定金不支持退款,同意后可继续下单。 ++ +我再想想 +同意并下单 ++ + + ++ +定金不退协议 ++ + {{ orderPaymentData.presale_info.deposit_agreement }} + + + +暂无退定金协议 + ++ 确定 + + + ++ ++ +买家留言 ++ + ++ ++ ++ + ++ 确定 + + + ++ ++ +发票 ++ + ++ ++ +需要发票 ++ +不需要 +需要 ++ ++ +发票类型 ++ ++ {{ item == 1 ? '纸质' : '电子' }} + ++ + +抬头类型 ++ ++ 个人 + ++ 企业 + ++ +发票信息 ++ + + + + ++ +发票内容 ++ ++ {{ item }} + +发票内容将以根据税法调整,具体请以展示为准,发票内容显示详细商品名 称及价格信息 ++ 确定 + + + ++ ++ +优惠券 ++ + ++ ++ ++ ++ + +{{ $lang('common.currencySymbol') }} +{{ parseFloat(couponItem.money) }} + + +{{ parseFloat(couponItem.discount) }} +折 + ++ + 满{{ couponItem.at_least }}可用 + + + 无门槛 + + ++ +{{ couponItem.coupon_name }} +最多可抵¥{{ couponItem.discount_limit }} +有效期:{{ couponItem.end_time ? $util.timeStampTurnTime(couponItem.end_time) : '长期有效' }} ++ + +确定 ++ + + ++ ++ +已为您甄选出附近所有相关门店 ++ + ++ ++ ++ ++ +{{ item.store_name }} +({{ item.distance }}km) ++ ++ 营业时间:{{ item.open_date }} + ++ 地址:{{ item.full_address }}{{ item.address }} + ++ 所选择收货地址附近没有可以自提的门店 ++ + + + + + + + + + + + + diff --git a/pages_promotion/seckill/list.vue b/pages_promotion/seckill/list.vue new file mode 100644 index 0000000..07183fd --- /dev/null +++ b/pages_promotion/seckill/list.vue @@ -0,0 +1,128 @@ + ++ + + ++ + + + ++ + + ++ + ++ ++ + +限时秒杀 +已抢{{ goodsSkuDetail.sale_num }}{{ goodsSkuDetail.unit }} ++ +距结束仅剩 ++ ++ + + + + + + ++ +秒杀价 +{{ $lang('common.currencySymbol') }} + +{{ parseFloat(goodsSkuDetail.show_price).toFixed(2).split(".")[0] }} +.{{ parseFloat(goodsSkuDetail.show_price).toFixed(2).split(".")[1] }} + ++ +{{ $lang('common.currencySymbol') }} +{{ goodsSkuDetail.price }} ++ ++ + + +{{ goodsSkuDetail.goods_name }} +{{ goodsSkuDetail.introduction }} ++ +库存 {{ goodsSkuDetail.stock }} {{ goodsSkuDetail.unit }} +销量 {{ goodsSkuDetail.sale_num }} {{ goodsSkuDetail.unit }} ++ + + + + + +选择 ++ +{{ item.spec_name }}/{{ item.spec_value_name }} ++ + + + + + + + + + + + ++ + + + + + + + + + + + + + + + + + diff --git a/pages_promotion/seckill/payment.vue b/pages_promotion/seckill/payment.vue new file mode 100644 index 0000000..0516b3b --- /dev/null +++ b/pages_promotion/seckill/payment.vue @@ -0,0 +1,49 @@ + ++ ++ ++ ++ + + ++ ++ +{{ transformSeckillTime(item.seckill_start_time) }} ++ +即将开始 +抢购中 ++ 明日预告 + + ++ 本场还剩 + ++ 结束 + + 本场还剩 + ++ 开始 + + + ++ ++ + +{{ item.goods_name }} ++ ++ ++ ++ 仅剩{{ item.goods_stock }}件 ++ ++ + ++ + +¥ +{{ item.seckill_price.split('.')[0] }} +{{ '.' + item.seckill_price.split('.')[1] }} ++ +原价: +¥{{ item.price }} ++ ++ + + + + + + + + + + diff --git a/pages_promotion/seckill/public/css/detail.scss b/pages_promotion/seckill/public/css/detail.scss new file mode 100644 index 0000000..e0bfbcb --- /dev/null +++ b/pages_promotion/seckill/public/css/detail.scss @@ -0,0 +1,59 @@ +// 营销活动 +.goods-promotion { + background: var(--promotion-color); + height: 150rpx; + .price-info{ + display: flex; + flex-direction: row; + align-items: center; + justify-content: flex-start; + .icon-box{ + margin-right: 20rpx; + .iconfont{ + font-size: 60rpx; + color: #ffffff; + } + } + .price-box{ + display: flex; + align-items: flex-start; + flex-direction: column; + height: 100%; + justify-content: center; + .seckill-text{ + font-size: 36rpx; + color: #fff; + line-height: 1; + } + .sale-num{ + margin-top: 15rpx; + font-size: 28rpx; + } + } + } + + .countdown { + width: 220rpx; + background: var(--promotion-aux-color); + .txt{ + color: #ffffff!important; + font-size: 28rpx; + } + .clockrun{ + margin-top: 16rpx!important; + } + &:after{ + position: absolute; + content: ''; + top: calc(50% - 15rpx); + z-index: 5; + left: -15rpx; + width: 0; + height: 0; + border-style: solid; + border-width: 15rpx 15rpx 15rpx 0; + border-color: transparent var(--promotion-aux-color) transparent transparent; + } + } + +} \ No newline at end of file diff --git a/pages_promotion/seckill/public/css/list.scss b/pages_promotion/seckill/public/css/list.scss new file mode 100644 index 0000000..9d28cbf --- /dev/null +++ b/pages_promotion/seckill/public/css/list.scss @@ -0,0 +1,395 @@ +.page { + width: 100%; + min-height: 100vh; + background: var(--seckill-promotion-color); +} +.ns-adv { + margin: 0; + border-radius: $border-radius; + overflow: hidden; + line-height: 1; + image { + width: 100%; + } +} +.time-box { + color: #fff; + text-align: center; + font-size: $font-size-tag; + margin-bottom: 20rpx; +} +.time-wrap { + display: flex; + padding: 10rpx 0; + line-height: 1; + border-radius: $border-radius; + margin: 10rpx 30rpx 20rpx; + + &.fixed { + position: fixed; + z-index: 10; + top: 0; + width: 100vw; + box-sizing: border-box; + } + + & > image { + width: 66rpx; + margin-right: 20rpx; + } + + .scroll-wrap { + flex: 1; + max-width: 100%; + white-space: nowrap; + + .time-item { + padding: 14rpx 0; + text-align: center; + display: inline-block; + color: #ffffff; + background: rgba(0, 0, 0, 0.25); + margin-right: 20rpx; + width: calc((100% - 60rpx) / 4); + border-radius: $border-radius; + + .start-time { + font-weight: bold; + line-height: 1; + } + + .em { + line-height: 1; + padding: 6rpx 30rpx; + border-radius: 24rpx; + margin-top: 6rpx; + font-weight: bold; + } + + .em.active { + color: $color-title !important; + } + + > view { + color: #ffffff; + } + &.active { + color: $color-title; + border-radius: $border-radius; + background-color: #fff; + > view { + color: $color-title; + } + } + } + } +} + +.lineheight-clear { + line-height: 1 !important; +} +// 商品列表单列样式 +.goods-list.single-column { + .goods-item { + padding: 26rpx; + background: #fff; + margin: $margin-updown $margin-both; + border-radius: $border-radius; + display: flex; + position: relative; + + .goods-img { + width: 200rpx; + height: 200rpx; + overflow: hidden; + border-radius: $border-radius; + margin-right: 20rpx; + + image { + width: 100%; + height: 100%; + } + } + + .goods-tag { + color: #fff; + line-height: 1; + padding: 8rpx 12rpx; + position: absolute; + border-top-left-radius: $border-radius; + border-bottom-right-radius: $border-radius; + top: 26rpx; + left: 26rpx; + font-size: $font-size-goods-tag; + } + + .info-wrap { + flex: 1; + width: 0; + display: flex; + flex-direction: column; + } + + .name-wrap { + flex: 1; + } + + .goods-name { + font-size: $font-size-base; + line-height: 1.3; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + height: 68rpx; + } + + .progress-wrap { + display: flex; + margin-top: 10rpx; + + progress { + flex: 1; + } + + .txt { + margin: 0 100rpx 0 20rpx; + } + } + + .discount-price { + display: inline-block; + font-weight: bold; + line-height: 1; + margin-top: 16rpx; + color: var(--price-color); + .unit { + margin-right: 6rpx; + } + + .txt { + font-weight: normal; + } + } + + .pro-info { + position: relative; + margin-top: 16rpx; + + .delete-price { + text-decoration: line-through; + flex: 1; + display: flex; + align-items: flex-end; + + .unit { + margin-right: 6rpx; + } + + .txt { + text-decoration: none; + } + } + + & > view { + line-height: 1; + + &:nth-child(2) { + position: absolute; + right: 0; + bottom: 0; + } + } + + .buy-btn { + width: 160rpx; + height: 90rpx; + border-radius: 10rpx; + + .text { + color: #fff; + text-align: center; + line-height: 1; + padding-top: 20rpx; + } + + .progress { + margin-top: 6rpx; + padding: 0 20rpx; + display: flex; + + progress { + flex: 1; + } + + .num { + margin-left: 10rpx; + color: #fff; + line-height: 1; + } + } + } + } + + .member-price-tag { + display: inline-block; + width: 60rpx; + line-height: 1; + margin-left: 6rpx; + + image { + width: 100%; + } + } + } + + .item { + display: flex; + margin: 0 30rpx 20rpx; + padding: 0 20rpx; + background-color: #ffffff; + border-radius: $border-radius; + + &:last-child { + margin-bottom: 0; + } + + .img-wrap { + width: 200rpx; + height: 200rpx; + + image { + width: 200rpx; + border-radius: $border-radius; + } + } + + .content { + display: flex; + justify-content: space-between; + flex-direction: column; + flex: 1; + margin: 10rpx 0 10rpx 20rpx; + + .goods-name { + font-weight: bold; + &.multi-hidden { + line-height: 1.3; + } + } + + .progress { + display: flex; + align-items: center; + + .bg { + width: 240rpx; + height: 20rpx; + border-radius: 20rpx; + margin-right: 20rpx; + background-color: #fcecd7; + + .curr { + height: 20rpx; + border-radius: 20rpx; + background-color: #fdbe6c; + } + } + + .num { + font-size: $font-size-tag; + color: $color-tip; + } + } + + .bottom-wrap { + display: flex; + justify-content: space-between; + align-items: center; + + .price-wrap { + overflow: hidden; + display: flex; + align-items: baseline; + flex-wrap: wrap; + width: 260rpx; + font-size: $font-size-tag; + + .discount-price { + font-weight: bold; + margin-right: 10rpx; + line-height: 1; + } + + .unit { + font-size: $font-size-tag; + color: var(--price-color); + } + + .price { + font-size: $font-size-toolbar; + color: var(--price-color); + } + } + + .original-price { + margin-top: 4rpx; + font-size: $font-size-tag; + text-decoration: line-through; + line-height: 1; + color: $color-tip; + } + + button { + height: 50rpx; + line-height: 50rpx; + color: var(--btn-text-color); + background-color: $base-color; + color: #fff; + margin: 0; + padding: 0 16rpx; + font-size: $font-size-tag; + font-weight: bold; + } + } + } + } + .item { + overflow: hidden; + position: relative; + padding: 16rpx; + .img-wrap { + position: relative; + overflow: hidden; + } + .bottom-wrap .price-font { + color: #999; + font-size: $font-size-tag; + } + .content .progress { + .num { + color: #ff3d3d; + margin-left: 10rpx; + } + .bg { + background-color: #ffd5d5; + .curr { + position: relative; + background-color: #ff0400 !important; + } + } + } + .progress-bar { + position: absolute; + right: -24rpx; + width: 30rpx; + height: 30rpx; + top: 50%; + transform: translateY(-50%); + } + .price-wrap { + flex-direction: column-reverse; + } + } +} diff --git a/pages_promotion/seckill/public/js/detail.js b/pages_promotion/seckill/public/js/detail.js new file mode 100644 index 0000000..335692a --- /dev/null +++ b/pages_promotion/seckill/public/js/detail.js @@ -0,0 +1,139 @@ +export default { + data() { + return { + goodsRoute: '/pages_promotion/seckill/detail', + posterApi: '/seckill/api/seckillgoods/poster', + seckill_id: 0, + } + }, + onLoad(data) { + this.seckill_id = data.seckill_id || 0; + if (data.id) { + this.seckill_id = data.id; + } + // 小程序扫码进入 + if (data.scene) { + var sceneParams = decodeURIComponent(data.scene); + sceneParams = sceneParams.split('&'); + if (sceneParams.length) { + sceneParams.forEach(item => { + if (item.indexOf('id') != -1) this.seckill_id = item.split('-')[1]; + }); + } + } + }, + onShow() { + //同步获取商品详情 + this.getGoodsSkuDetail(); + }, + methods: { + // 获取秒杀商品详情 + async getGoodsSkuDetail() { + let res = await this.$api.sendRequest({ + url: '/seckill/api/seckillgoods/detail', + async: false, + data: { + seckill_id: this.seckill_id + }, + }); + + let data = res.data; + if (data.goods_sku_detail != null) { + this.goodsSkuDetail = data.goods_sku_detail; + this.shopInfo = data.shop_info; + this.skuId = this.goodsSkuDetail.sku_id; + + let time = new Date(res.timestamp * 1000); + let currentTime = time.getHours() * 60 * 60 + time.getMinutes() * 60 + time.getSeconds(); + if (this.goodsSkuDetail.seckill_start_time <= currentTime && currentTime < this.goodsSkuDetail + .seckill_end_time) { + this.goodsSkuDetail.discountTimeMachine = this.$util.countDown(this.goodsSkuDetail + .seckill_end_time - currentTime); + } else if (this.goodsSkuDetail.seckill_start_time > currentTime && currentTime < this.goodsSkuDetail + .seckill_end_time) { + this.$util.showToast({ + title: "限时秒杀活动还未开始", + }); + setTimeout(() => { + this.$util.redirectTo('/pages/goods/detail', { + goods_id: this.goodsSkuDetail.goods_id + }, 'redirectTo'); + }, 1000); + } else if (currentTime < this.goodsSkuDetail.seckill_start_time && currentTime > this.goodsSkuDetail + .seckill_end_time) { + this.$util.showToast({ + title: "限时秒杀活动已结束", + }); + setTimeout(() => { + this.$util.redirectTo('/pages/goods/detail', { + goods_id: this.goodsSkuDetail.goods_id + }, 'redirectTo'); + }, 1000); + } + + // 分享参数、链接 + this.shareQuery = 'seckill_id=' + this.seckill_id + this.shareUrl = this.goodsRoute + '?' + this.shareQuery; + + // 在线客服聊天参数 + this.chatRoomParams = { + sku_id: this.goodsSkuDetail.sku_id, + type: 'seckill', + type_id: this.goodsSkuDetail.seckill_id + }; + + // 海报参数 + this.posterParams = { + id: this.goodsSkuDetail.goods_id + }; + + // #ifdef MP-WEIXIN + this.getShareImg(); + // #endif + + // 处理商品数据 + this.handleGoodsSkuData(); + + this.goodsSkuDetail.show_price = this.goodsSkuDetail.seckill_price; + this.goodsSkuDetail.save_price = (this.goodsSkuDetail.price - this.goodsSkuDetail.seckill_price) > + 0 ? (this.goodsSkuDetail + .price - this.goodsSkuDetail.seckill_price).toFixed(2) : 0; + + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + } else { + this.$util.redirectTo('/pages_tool/goods/not_exist', {}, 'redirectTo'); + } + }, + // 秒杀 + seckill() { + if (!uni.getStorageSync('token')) { + if (!this.source_member) { + this.$refs.login.open(this.shareUrl); + } else { + this.$refs.login.open(this.shareUrl + '&source_member=' + this.source_member); + } + return; + } + this.$refs.goodsSku.show("seckill", () => { + this.getCartCount(); + }); + }, + /** + * 获取分享图 + */ + getShareImg(){ + let posterParams = { + id: this.goodsSkuDetail.goods_id + }; + this.$api.sendRequest({ + url: '/seckill/api/seckillgoods/shareimg', + data: { + qrcode_param: JSON.stringify(posterParams) + }, + success: res => { + if (res.code == 0) this.shareImg = res.data.path; + } + }) + } + } +} diff --git a/pages_promotion/seckill/public/js/list.js b/pages_promotion/seckill/public/js/list.js new file mode 100644 index 0000000..c5af049 --- /dev/null +++ b/pages_promotion/seckill/public/js/list.js @@ -0,0 +1,307 @@ +export default { + data() { + return { + hour: '00', + minute: '00', + second: '00', + ident: false, + showEmpty: false, + //分享建立上下级所需id + memberId: 0, + mpShareData: null, //小程序分享数据 + mescroll: null, + timeList: [], //时间列表 + seckillId: null, //选中的时间块 + seckillIndex: null, //选中时间块的index + dataList: [], //选中时间块的商品列表 + index: null, //当前正在抢购的index, + timer: null, + noStartList: [], + show: false, + bgColor: '' + }; + }, + onLoad(option) { + this.$util.getMemberId().then(resolve => { + this.memberId = resolve; + }); + //小程序分享接收source_member + if (option.source_member) { + uni.setStorageSync('source_member', option.source_member); + } + // 小程序扫码进入,接收source_member + if (option.scene) { + var sceneParams = decodeURIComponent(option.scene); + sceneParams = sceneParams.split('&'); + if (sceneParams.length) { + sceneParams.forEach(item => { + if (item.indexOf('sku_id') != -1) this.skuId = item.split('-')[1]; + if (item.indexOf('m') != -1) uni.setStorageSync('source_member', item.split('-')[1]); + if (item.indexOf('is_test') != -1) uni.setStorageSync('is_test', 1); + }); + } + } + }, + async onShow() { + setTimeout(() => { + if (this.addonIsExist && !this.addonIsExist.seckill) { + this.$util.showToast({ + title: '商家未开启秒杀', + mask: true, + duration: 2000 + }); + setTimeout(() => { + this.$util.redirectTo('/pages/index/index'); + }, 2000); + return; + } + }, 1000); + + //记录分享关系 + if (uni.getStorageSync('token') && uni.getStorageSync('source_member')) { + this.$util.onSourceMember(uni.getStorageSync('source_member')); + } + + //小程序分享 + // #ifdef MP-WEIXIN + this.$util.getMpShare().then(res => { + this.mpShareData = res; + }); + // #endif + + await this.getZoneConfig(); + this.getTimeList(); + }, + watch: { + seckillId(newName, oldName) { + if (newName && oldName && newName != oldName) { + this.mescroll.resetUpScroll(false); + } + } + }, + methods: { + // 活动页面配置 + async getZoneConfig() { + let res = await this.$api.sendRequest({ + url: '/api/config/promotionZoneConfig', + data: { + name: 'seckill' + }, + async: false + }); + let data = res.data; + if (data) { + this.bgColor = data.bg_color; + } + }, + goodsImg(imgStr) { + let imgs = imgStr.split(','); + return imgs[0] ? this.$util.img(imgs[0], { + size: 'mid' + }) : this.$util.getDefaultImage().goods; + }, + //时间转换 + transformSeckillTime(time) { + time = parseFloat(time); + var hour = parseInt(time / 3600); + var minute = parseInt((time % 3600) / 60); + var second = parseInt(time % 60); + + if (hour < 10) hour = '0' + hour; + if (minute < 10) minute = '0' + minute; + if (second < 10) second = '0' + second; + + return hour + ':' + minute; + }, + isEnd(isShow) { + if (!isShow) return; + this.$util.showToast({ + title: "限时秒杀活动已结束", + }); + }, + getTimeList() { + this.$api.sendRequest({ + url: '/seckill/api/seckill/lists', + success: res => { + let data = res.data; + if (!data) return; + let time = new Date(res.timestamp * 1000); + let newTimes = time.getHours() * 60 * 60 + time.getMinutes() * 60 + time.getSeconds(); + var tempList = Object.values(data.list); + tempList.forEach((v, k) => { + if (v.seckill_start_time <= newTimes && newTimes < v.seckill_end_time) { + v.isNow = true; + } else { + v.isNow = false; + } + + tempList[k]['startTimeMachine'] = this.$util.countDown(v + .seckill_start_time - newTimes); + tempList[k]['endTimeMachine'] = this.$util.countDown(v.seckill_end_time - + newTimes); + if (v.type == 'tomorrow') tempList[k]['startTimeMachine'] = this.$util + .countDown(86400 - newTimes + v.seckill_start_time); + + }); + this.timeList = tempList; + if (tempList.length) { + this.seckillId = this.timeList[0]['id']; + this.seckillIndex = 0; + this.show = true; + } + var self = this; + setInterval(function() { + self.getExpirationTime(); + }, 1000); + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + } + }); + }, + getData(mescroll) { + + this.mescroll = mescroll; + this.$api.sendRequest({ + url: '/seckill/api/seckillgoods/page', + data: { + page_size: mescroll.size, + page: mescroll.num, + seckill_time_id: this.seckillId + }, + success: res => { + + let newArr = [] + let msg = res.message; + if (res.code == 0 && res.data) { + newArr = res.data.list; + } else { + this.$util.showToast({ + title: msg + }) + } + mescroll.endSuccess(newArr.length); + //设置列表数据 + if (mescroll.num == 1) this.dataList = []; //如果是第一页需手动制空列表 + this.dataList = this.dataList.concat(newArr); //追加新数据 + + if (this.dataList.length == 0) this.showEmpty = true; + + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + }, + fail() { + //联网失败的回调 + mescroll.endErr(); + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + } + }); + }, + getExpirationTime() { + var timeListData = this.timeList, + currDate = new Date(), + dateStr = currDate.toLocaleDateString(), + expirationTime, + nowTime, + obj; + + for (let i in timeListData) { + if (timeListData[i].isNow) { + this.ident = true; + nowTime = Date.parse(currDate); + expirationTime = Date.parse(dateStr) + parseInt(timeListData[i].seckill_end_time) * 1000; + let endSeconds = (expirationTime - nowTime) / 1000; + obj = this.$util.countDown(endSeconds); + this.hour = obj.h; + this.minute = obj.i; + this.second = obj.s; + if (endSeconds == 0) { + let next = parseInt(i) + 1; + if (next < timeListData.length) this.seckillIndex = next; + this.timeList[i].isNow = false; + + } + return false; + } + } + this.ident = false; + }, + ontabtap(e, f) { + if (f != this.seckillIndex) this.dataList = []; + this.seckillId = e; + this.seckillIndex = f; + }, + //跳转到详情页 + toGoodsDetail(item) { + if (this.timeList[this.seckillIndex].type == 'tomorrow') { + this.$util.showToast({ + title: "秒杀活动还未开启,敬请期待!", + }); + + return false; + } + + this.$api.sendRequest({ + url: '/api/config/time', + data: {}, + success: res => { + let time = new Date(res.timestamp * 1000); + let newTimes = time.getHours() * 60 * 60 + time.getMinutes() * 60 + time.getSeconds(); + if (this.timeList[this.seckillIndex].seckill_start_time <= newTimes && newTimes < this + .timeList[this.seckillIndex].seckill_end_time) { + this.timeList[this.seckillIndex].isNow = true; + } else { + this.timeList[this.seckillIndex].isNow = false; + } + + this.$forceUpdate(); + + if (!this.timeList[this.seckillIndex].isNow) { + this.$util.showToast({ + title: "秒杀活动即将开启,敬请期待!", + }); + return; + } + this.$util.redirectTo('/pages_promotion/seckill/detail', { + seckill_id: item.id + }); + + } + }); + }, + imageError(index) { + this.dataList[index].goods_image = this.$util.getDefaultImage().goods; + this.$forceUpdate(); + }, + goodsTag(data) { + return data.label_name || ''; + } + }, + //分享给好友 + onShareAppMessage(res) { + return this.mpShareData.appMessage; + // var title = '一大波的秒杀福利就要开始了,真的不来看看嘛'; + // var path = '/pages_promotion/seckill/list'; + // return { + // title: title, + // path: path, + // success: res => {}, + // fail: res => {} + // }; + }, + //分享到朋友圈 + onShareTimeline() { + return this.mpShareData.timeLine; + }, + onReady() { + setTimeout(() => { + const query = uni.createSelectorQuery().in(this); + query + .select('.time-wrap') + .boundingClientRect(data => { + if (data) this.timeTop = data.top; + }) + .exec(); + }, 500); + }, + onHide() { + clearInterval(this.timer); + } +}; diff --git a/pages_promotion/topics/detail.vue b/pages_promotion/topics/detail.vue new file mode 100644 index 0000000..6e6c0b1 --- /dev/null +++ b/pages_promotion/topics/detail.vue @@ -0,0 +1,288 @@ + ++ + + + + + + + diff --git a/pages_promotion/topics/goods_detail.vue b/pages_promotion/topics/goods_detail.vue new file mode 100644 index 0000000..ff5d451 --- /dev/null +++ b/pages_promotion/topics/goods_detail.vue @@ -0,0 +1,218 @@ + ++ ++ ++ + ++ ++ + ++ +{{ item.sku_name }} ++ ++ + +{{ $lang('common.currencySymbol') }} +{{ parseFloat(item.topic_price).toFixed(2).split(".")[0] }} +.{{ parseFloat(item.topic_price).toFixed(2).split(".")[1] }} ++ + ++ ++ +{{ $lang('common.currencySymbol') }} + {{ item.market_price }} + ++ +{{ $lang('common.currencySymbol') }} + {{ item.price }} +已售{{ item.sale_num }}{{ item.unit ? item.unit : "件" }} ++ + + + + + + + + + + + + diff --git a/pages_promotion/topics/list.vue b/pages_promotion/topics/list.vue new file mode 100644 index 0000000..f4a0147 --- /dev/null +++ b/pages_promotion/topics/list.vue @@ -0,0 +1,241 @@ + ++ + + ++ + + + + ++ + ++ ++ + +专题活动 ++ 已售{{ goodsSkuDetail.sale_num }} {{ goodsSkuDetail.unit }} + ++ +距结束仅剩 ++ ++ + + + + + + ++ +专题价 +{{ $lang('common.currencySymbol') }} + +{{ parseFloat(goodsSkuDetail.topic_price).toFixed(2).split(".")[0] }} +.{{ parseFloat(goodsSkuDetail.topic_price).toFixed(2).split(".")[1] }} + ++ +{{ $lang('common.currencySymbol') }} +{{ goodsSkuDetail.market_price }} +{{ goodsSkuDetail.price }} ++ ++ + + +{{ goodsSkuDetail.goods_name }} +{{ goodsSkuDetail.introduction }} ++ +库存 {{ goodsSkuDetail.stock }} {{ goodsSkuDetail.unit }} +销量 {{ goodsSkuDetail.sale_num }} {{ goodsSkuDetail.unit }} ++ + + + + +选择 ++ +{{ item.spec_name }}/{{ item.spec_value_name }} ++ + + + + + + + + + + ++ + + + + + ++ + + + + + + + + + + + + + + + + diff --git a/pages_promotion/topics/payment.vue b/pages_promotion/topics/payment.vue new file mode 100644 index 0000000..1a52001 --- /dev/null +++ b/pages_promotion/topics/payment.vue @@ -0,0 +1,49 @@ + ++ ++ ++ + ++ + ++ +{{ item.topic_name }} +活动时间:{{ item.start_time }}~{{ item.end_time }} ++ ++ {{ nowTime < item.end_time ? '进行中' : '已结束' }} + + + + + + + + + + diff --git a/pages_promotion/topics/public/css/detail.scss b/pages_promotion/topics/public/css/detail.scss new file mode 100644 index 0000000..6f27168 --- /dev/null +++ b/pages_promotion/topics/public/css/detail.scss @@ -0,0 +1,65 @@ +// 营销活动 +.goods-promotion { + background: var(--promotion-color); + height: 75px; + .price-info { + display: flex; + flex-direction: row; + align-items: center; + justify-content: flex-start; + .icon-box { + margin-right: 20rpx; + .iconfont{ + font-size: 60rpx; + color: #ffffff; + } + } + .price-box{ + display: flex; + align-items: flex-start; + flex-direction: column; + height: 100%; + justify-content: center; + .promotion-text{ + font-size: 36rpx; + color: #fff; + line-height: 1; + } + .sale-num{ + display: flex; + align-items: center; + margin-top: 18rpx; + view{ + color: #ffffff; + line-height: 1; + } + + } + } + + + } +} +.countdown { + width: 220rpx; + background: var(--promotion-aux-color); + .txt{ + color: #ffffff!important; + font-size: 28rpx!important; + } + .clockrun{ + margin-top: 16rpx!important; + } + &:after{ + position: absolute; + content: ''; + top: calc(50% - 15rpx); + z-index: 5; + left: -15rpx; + width: 0; + height: 0; + border-style: solid; + border-width: 15rpx 15rpx 15rpx 0; + border-color: transparent var(--promotion-aux-color) transparent transparent; + } + } \ No newline at end of file diff --git a/pages_promotion/topics/public/js/detail.js b/pages_promotion/topics/public/js/detail.js new file mode 100644 index 0000000..0daeb55 --- /dev/null +++ b/pages_promotion/topics/public/js/detail.js @@ -0,0 +1,94 @@ +export default { + data() { + return { + goodsRoute: '/pages_promotion/topics/goods_detail', + posterApi: '/topic/api/topicgoods/poster', + topics_id: 0, + } + }, + onLoad(data) { + this.topics_id = data.id || 0; + // 小程序扫码进入 + if (data.scene) { + var sceneParams = decodeURIComponent(data.scene); + sceneParams = sceneParams.split('&'); + if (sceneParams.length) { + sceneParams.forEach(item => { + if (item.indexOf('id') != -1) this.topics_id = item.split('-')[1]; + }); + } + } + }, + onShow() { + //同步获取商品详情 + this.getGoodsSkuDetail(); + }, + methods: { + // 获取专题活动商品详情 + async getGoodsSkuDetail() { + let res = await this.$api.sendRequest({ + url: '/topic/api/topicgoods/detail', + async: false, + data: { + topic_id: this.topics_id + } + }); + let data = res.data; + if (data.goods_sku_detail != null) { + this.goodsSkuDetail = data.goods_sku_detail; + this.skuId = this.goodsSkuDetail.sku_id; + if (res.timestamp > this.goodsSkuDetail.end_time) { + this.$util.showToast({ + title: "专题活动已结束", + }); + setTimeout(() => { + this.$util.redirectTo('/pages/goods/detail', { + goods_id: this.goodsSkuDetail.goods_id + }, 'redirectTo'); + }, 1000); + } else { + this.goodsSkuDetail.discountTimeMachine = this.$util.countDown(this.goodsSkuDetail.end_time - + res.timestamp); + } + + // 分享参数、链接 + this.shareQuery = 'id=' + this.topics_id; + this.shareUrl = this.goodsRoute + '?' + this.shareQuery; + + // 在线客服聊天参数 + this.chatRoomParams = { + sku_id: this.goodsSkuDetail.sku_id, + type: 'topic', + type_id: this.topics_id + }; + + // 海报参数 + this.posterParams = { + id: this.topics_id + }; + + // 处理商品数据 + this.handleGoodsSkuData(); + + this.goodsSkuDetail.show_price = this.goodsSkuDetail.topic_price; + this.goodsSkuDetail.save_price = (this.goodsSkuDetail.price - this.goodsSkuDetail.show_price) > 0 ? + (this.goodsSkuDetail + .price - this.goodsSkuDetail.show_price).toFixed(2) : 0; + + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + } else { + this.$util.redirectTo('/pages_tool/goods/not_exist', {}, 'redirectTo'); + } + }, + // 立即购买 + topic() { + if (!uni.getStorageSync('token')) { + this.$refs.login.open(this.shareUrl); + return; + } + this.$refs.goodsSku.show("topic", () => { + this.getCartCount(); + }); + } + } +} diff --git a/pages_tool/article/detail.vue b/pages_tool/article/detail.vue new file mode 100644 index 0000000..a54de77 --- /dev/null +++ b/pages_tool/article/detail.vue @@ -0,0 +1,137 @@ + ++ + + + + + + + diff --git a/pages_tool/article/list.vue b/pages_tool/article/list.vue new file mode 100644 index 0000000..907638b --- /dev/null +++ b/pages_tool/article/list.vue @@ -0,0 +1,202 @@ + +{{ detail.article_title }} ++ +发表时间: {{ $util.timeStampTurnTime(detail.create_time) }} ++ + ++ 阅读: + +{{ detail.read_num + detail.initial_read_num }} ++ +{{ detail.dianzan_num + detail.initial_dianzan_num }} + 人已赞 ++ + + + + + + + diff --git a/pages_tool/chat/room.vue b/pages_tool/chat/room.vue new file mode 100644 index 0000000..83aab17 --- /dev/null +++ b/pages_tool/chat/room.vue @@ -0,0 +1,938 @@ + ++ ++ ++ ++ + + ++ + +{{ item.article_title }} ++ ++ ++ {{ item.category_name }} +{{ $util.timeStampTurnTime(item.create_time, 'date') }} ++ + + + + + + + + diff --git a/pages_tool/form/form.vue b/pages_tool/form/form.vue new file mode 100644 index 0000000..c7a98f6 --- /dev/null +++ b/pages_tool/form/form.vue @@ -0,0 +1,143 @@ + ++ +正在获取消息 ++ ++ ++ + + + + ++ ++ {{ item.keyword }} + ++ ++ + + 发送 ++ + ++ ++ ++ + ++ ++ 图片 ++ + + + + + + + diff --git a/pages_tool/goods/brand.vue b/pages_tool/goods/brand.vue new file mode 100644 index 0000000..7a6ecaf --- /dev/null +++ b/pages_tool/goods/brand.vue @@ -0,0 +1,125 @@ + ++ ++ ++ + +请填写表单所需信息 ++ + + + + + + + + + + + diff --git a/pages_tool/goods/coupon.vue b/pages_tool/goods/coupon.vue new file mode 100644 index 0000000..0522178 --- /dev/null +++ b/pages_tool/goods/coupon.vue @@ -0,0 +1,458 @@ + ++ ++ ++ + ++ ++ ++ {{ item.brand_name }} ++ + + + + + + + + diff --git a/pages_tool/goods/coupon_receive.vue b/pages_tool/goods/coupon_receive.vue new file mode 100644 index 0000000..6669796 --- /dev/null +++ b/pages_tool/goods/coupon_receive.vue @@ -0,0 +1,316 @@ + ++ + ++ ++ 全部 + 满减券 + 折扣券 + 无门槛券 + ++ ++ ++ ++ ++ + ++ +¥ + {{ parseInt(item.money) }} ++ {{ parseFloat(item.discount) }} + +折 +满{{ item.at_least }}元可用 +无门槛优惠券 ++ ++ +{{ item.coupon_name }} +全场商品 +指定商品 +(最大优惠{{ item.discount_limit }}元) +有效期:{{ $util.timeStampTurnTime(item.end_time) }} +有效期:领取之日起{{ item.fixed_term }}日内有效 +有效期:长期有效 ++ +领取 +去使用 +已抢光 ++ + + + + + + + + + + diff --git a/pages_tool/goods/evaluate.vue b/pages_tool/goods/evaluate.vue new file mode 100644 index 0000000..fb84a67 --- /dev/null +++ b/pages_tool/goods/evaluate.vue @@ -0,0 +1,345 @@ + ++ ++ + +{{ info.coupon_name }} +¥{{ info.money }} +{{ info.discount }}折 +满{{ info.at_least }}元使用 +无门槛优惠券 +有效期至 {{ $util.timeStampTurnTime(info.end_time) }} +领取之日起{{ info.fixed_term }}天内有效 +长期有效 + ++ + + + +注:扫描二维码或点击右上角进行分享 ++ + + + + + + + + diff --git a/pages_tool/goods/not_exist.vue b/pages_tool/goods/not_exist.vue new file mode 100644 index 0000000..4d1d268 --- /dev/null +++ b/pages_tool/goods/not_exist.vue @@ -0,0 +1,44 @@ + ++ ++ {{ item.name }}({{ item.count }}) + ++ ++ ++ ++ ++ ++ + ++ + + ++ ++ {{ item.member_name[0] }}***{{ item.member_name[item.member_name.length - 1] }} + +{{ item.member_name }} +{{ $util.timeStampTurnTime(item.create_time) }} ++ {{ item.content }} ++ + + + + ++ ++ ++ 追加评价 +{{ item.again_content }} ++ + + + ++ ++ ++ + + + + + + + + + diff --git a/pages_tool/goods/search.vue b/pages_tool/goods/search.vue new file mode 100644 index 0000000..f466348 --- /dev/null +++ b/pages_tool/goods/search.vue @@ -0,0 +1,358 @@ + ++ ++ 您查看的商品不存在,可能已下架或被删除 ++ + + + + + + diff --git a/pages_tool/help/detail.vue b/pages_tool/help/detail.vue new file mode 100644 index 0000000..ffac630 --- /dev/null +++ b/pages_tool/help/detail.vue @@ -0,0 +1,111 @@ + ++ ++ ++ + ++ + + ++ + + ++ ++ +{{ $lang('history') }} ++ + ++ + ++ + ++ ++ ++ +{{ $lang('hot') }} ++ ++ + ++ + + + + + + diff --git a/pages_tool/help/list.vue b/pages_tool/help/list.vue new file mode 100644 index 0000000..a1a18d0 --- /dev/null +++ b/pages_tool/help/list.vue @@ -0,0 +1,123 @@ + +{{ detail.title }} ++ ++ + +发表时间: {{ $util.timeStampTurnTime(detail.create_time) }} ++ + + + + + + + + diff --git a/pages_tool/hongbao/index.vue b/pages_tool/hongbao/index.vue new file mode 100644 index 0000000..86cd238 --- /dev/null +++ b/pages_tool/hongbao/index.vue @@ -0,0 +1,1251 @@ + ++ ++ +{{ item.class_name }} +{{ s_item.title }} ++ + + + + + + + + + + diff --git a/pages_tool/hongbao/list.vue b/pages_tool/hongbao/list.vue new file mode 100644 index 0000000..fa17f26 --- /dev/null +++ b/pages_tool/hongbao/list.vue @@ -0,0 +1,302 @@ + ++ ++ ++ ++ 活动说明 ++ +点击 [立即领取] 邀请好友瓜分红包 ++ {{ hongbaoInfo.money | int }} + +元 +立即领取 ++ ++ ++ ++ ++ ++ + + ++ ++ 仅差 + +{{ groupInfoList.num - groupInfoList.member_list.length }} + 人,即可瓜分 +{{ hongbaoInfo.money | int }} + 元现金红包 ++ ++ 距结束 ++ + 邀请好友 ++ +恭喜你,成功瓜分现金红包 ++ ++ ++ ++ ++ + + {{ money }} + +元 +红包已存入您的账户余额中 +立即查看 +瓜分新红包 ++ +哎呀,来晚了,活动已结束 ++ 来晚了,红包已被瓜分完 + +如何瓜分红包 ++ ++ ++ + + + + + +参与红包活动 +邀请好友组队 +集齐好友瓜分 ++ +活动说明 +{{ hongbaoInfo.remark }} ++ + ++ ++ ++ ++ 组队失败 ++ ++ ++ ++ ++ ++ + + 集齐{{ groupInfoList.num }}人可瓜分红包,还差 + +{{ groupInfoList.num - groupInfoList.member_list.length }} + 人 ++ ++ +活动开始时间 +{{ $util.timeStampTurnTime(hongbaoInfo.start_time) }} ++ +活动结束时间 +{{ $util.timeStampTurnTime(hongbaoInfo.end_time) }} ++ +组队时间 +{{ $util.timeStampTurnTime(groupInfoList.start_time) }} ++ + ++ ++ ++ + ++ +活动时间: +{{ $util.timeStampTurnTime(hongbaoInfo.start_time) }} - {{ $util.timeStampTurnTime(hongbaoInfo.end_time) }} +活动说明: +{{ hongbaoInfo.remark }} ++ + + ++ ++ +分享 ++ + ++ + + + ++ + + ++ + + ++ + + ++ 取消分享 + + ++ ++ ++ ++ {{ inviterInfo.nickname | guolv }} +邀请你加入团队 +瓜分现金红包 +加入队伍 ++ + ++ ++ {{ groupInfoList.header_nickname | guolv }} +邀请你加入团队 +瓜分现金红包 +加入队伍 ++ + + ++ ++ ++ ++ 你已加入 + +{{ groupInfoList.header_nickname | guolv }} + 的瓜分团 ++ 仅差 + +{{ groupInfoList.num - groupInfoList.member_list.length }} + 人即可瓜分现金红包 +{{ hongbaoInfo.money | int }}元 ++ 喊好友一起瓜分 + ++ + ++ ++ ++ +瓜分红包 +- 好友已集齐 - +{{ hongbaoInfo.money | int }}元 ++ 立即瓜分红包 + ++ + + + + + + + + diff --git a/pages_tool/hongbao/my_hongbao.vue b/pages_tool/hongbao/my_hongbao.vue new file mode 100644 index 0000000..1a18830 --- /dev/null +++ b/pages_tool/hongbao/my_hongbao.vue @@ -0,0 +1,459 @@ + ++ ++ ++ ++ ++ ++ ++ ++ + + +{{ item.name }} +{{ item.divide_num }}名好友瓜分{{ item.money | int }}元红包 +有效期:{{ $util.timeStampTurnTime(item.end_time) }} ++ ++ +¥ + {{ item.money }} +去瓜分 +去查看 +组队中 ++ + + + + + + + + + diff --git a/pages_tool/hongbao/poster.vue b/pages_tool/hongbao/poster.vue new file mode 100644 index 0000000..33dd3b1 --- /dev/null +++ b/pages_tool/hongbao/poster.vue @@ -0,0 +1,215 @@ + ++ ++ ++ {{ statusItem.name }} + ++ ++ ++ ++ ++ +发起组队 {{ $util.timeStampTurnTime(item.start_time) }} +组队失败 +组队成功 +组队中 ++ ++ ++ ++ + + +{{ item.name }} +{{ item.divide_num }}名好友瓜分{{ item.money | int }}元红包 +有效期:领取之日起{{ item.fixed_term }}日内有效 +有效期:{{ $util.timeStampTurnTime(item.end_time) }} ++ ++ ++ ++ ++ + + + + + ++ + ++ ++ + +重新组队 +去查看 +去查看 +组队中 ++ + + + + + + + + + + diff --git a/pages_tool/index/diy.vue b/pages_tool/index/diy.vue new file mode 100644 index 0000000..0adae85 --- /dev/null +++ b/pages_tool/index/diy.vue @@ -0,0 +1,84 @@ + ++ ++ ++ ++ + + + + + + + + + + diff --git a/pages_tool/index/public/js/diy.js b/pages_tool/index/public/js/diy.js new file mode 100644 index 0000000..7767922 --- /dev/null +++ b/pages_tool/index/public/js/diy.js @@ -0,0 +1,9 @@ +export default { + data() { + return {}; + }, + onLoad(data) {}, + onShow() {}, + computed: {}, + methods: {}, +} diff --git a/pages_tool/index/storelist.vue b/pages_tool/index/storelist.vue new file mode 100644 index 0000000..8f3984a --- /dev/null +++ b/pages_tool/index/storelist.vue @@ -0,0 +1,224 @@ + ++ + + ++ + + ++ + + + + ++ ++ + + + + + ++ ++ ++ + + + + + + ++ ++ 我知道了 ++ + + + + + + + diff --git a/pages_tool/live/list.vue b/pages_tool/live/list.vue new file mode 100644 index 0000000..a0ef5ff --- /dev/null +++ b/pages_tool/live/list.vue @@ -0,0 +1,229 @@ + ++ + ++ ++ ++ ++ ++ ++ + + +{{ item.store_name }} +营业时间:{{ item.open_date }} +地址: {{ item.full_address + item.address }} ++ ++ ++ 距您当前位置{{ item.distance > 1 ? item.distance + 'km' : item.distance * 1000 + 'm' }} ++ +详情 ++ + + + + + + + + + + diff --git a/pages_tool/login/find.vue b/pages_tool/login/find.vue new file mode 100644 index 0000000..6942238 --- /dev/null +++ b/pages_tool/login/find.vue @@ -0,0 +1,441 @@ + ++ ++ ++ ++ ++ ++ + + ++ ++ + {{ item.name }} ++ + {{ item.status_name }} + + ++ 主播:{{ item.anchor_name }} +| +直播商品:{{ item.goods.length }} ++ ++ {{ $util.timeStampTurnTime(item.start_time) }} + +- + {{ $util.timeStampTurnTime(item.end_time) }} ++ + + + + + + + + + + + + + diff --git a/pages_tool/login/login.vue b/pages_tool/login/login.vue new file mode 100644 index 0000000..fc258df --- /dev/null +++ b/pages_tool/login/login.vue @@ -0,0 +1,409 @@ + ++ + ++ + +请输入手机号 ++ 请确认您的账号已绑定此手机号 + + +请输入验证码 ++ +已将验证码发送至手机号:{{ formData.mobile }} ++ +请设置新的密码 ++ 建议您的新密码以简单好记为标准 + + ++ + + ++ + + ++ + + + ++ + + ++ + + ++ + + ++ + + + ++ + + + + + + + + + diff --git a/pages_tool/login/public/css/common.scss b/pages_tool/login/public/css/common.scss new file mode 100644 index 0000000..b7c0b3a --- /dev/null +++ b/pages_tool/login/public/css/common.scss @@ -0,0 +1,202 @@ +/deep/.uni-scroll-view { + background-color: #fff; +} + +/deep/.uni-scroll-view::-webkit-scrollbar { + /* 隐藏滚动条,但依旧具备可以滚动的功能 */ + display: none; +} +page { + width: 100%; + background: #fff !important; +} +.align-right { + color: #838383; +} + +.container { + width: 100vw; + height: 100vh; +} + +.header-wrap { + width: 80%; + margin: calc(120rpx + 44px) auto 0; + background-repeat: no-repeat; + background-size: contain; + background-position: bottom; + position: relative; + + .title { + font-size: 60rpx; + font-weight: bold; + } +} + +.body-wrap { + margin-top: 100rpx; + padding-bottom: 100rpx; + + .form-wrap { + width: 80%; + margin: 0 auto; + + .input-wrap { + position: relative; + width: 100%; + box-sizing: border-box; + height: 60rpx; + margin-top: 60rpx; + + .iconfont { + width: 60rpx; + height: 60rpx; + position: absolute; + left: 0; + right: 0; + line-height: 60rpx; + font-size: $font-size-toolbar; + color: $color-title; + font-weight: 600; + } + + .content { + display: flex; + height: 60rpx; + border-bottom: 2rpx solid $color-line; + align-items: center; + + .input { + flex: 1; + height: 60rpx; + line-height: 60rpx; + font-size: $font-size-base; + } + + .input-placeholder { + font-size: $font-size-base; + color: #bfbfbf; + line-height: 60rpx; + } + + .captcha { + margin: 4rpx; + height: 52rpx; + width: 140rpx; + } + + .dynacode { + line-height: 60rpx; + font-size: $font-size-tag; + } + + .area-code { + line-height: 60rpx; + margin-right: 20rpx; + font-size: $font-size-base; + } + } + } + } + + .forget-section { + display: flex; + width: 80%; + margin: 40rpx auto; + + view { + flex: 1; + font-size: $font-size-tag; + line-height: 1; + } + } + .btn_view { + width: 100%; + margin: 94rpx auto auto; + padding: 0 $margin-both; + box-sizing: border-box; + } + .login-btn { + height: 90rpx; + line-height: 90rpx; + border-radius: $border-radius; + text-align: center; + border: 2rpx solid; + width: 100%; + margin: 0; + } + .auth-login { + margin-top: 20rpx; + width: calc(100% - 4rpx); + height: 90rpx; + line-height: 90rpx; + border-radius: $border-radius; + border: 2rpx solid; + color: #fff; + text-align: center; + margin-left: 0; + background-color: #fff; + text { + color: #d0d0d0; + } + .iconfont { + font-size: 70rpx; + } + .icon-weixin { + color: #1aad19; + } + } + + // .auth-login{ + + // background-color: #fff; + // display: flex; + // justify-content: center; + // align-items: center; + // text-align: center; + // padding: 0; + // text{ + // color: #D0D0D0; + // } + // .iconfont{ + // font-size: 70rpx; + // } + // } + + .regisiter-agreement { + text-align: center; + margin-top: 30rpx; + line-height: 1; + color: #838383; + line-height: 60rpx; + } + + .regisiter-agreement { + font-size: $font-size-tag; + } +} + +.login-btn-box { + margin-top: 50rpx; +} +.login-btn-box.active { + margin: 30rpx 0 50rpx; +} + +.back-btn { + font-size: 52rpx; + position: fixed; + left: 24rpx; + top: 72rpx; + z-index: 9; + color: #000; +} +.login-mode-box { + display: flex; + justify-content: flex-end; + color: $color-tip; + margin: auto; + margin-top: 44rpx; + font-size: 26rpx; + width: 80%; +} diff --git a/pages_tool/login/register.vue b/pages_tool/login/register.vue new file mode 100644 index 0000000..d5abb28 --- /dev/null +++ b/pages_tool/login/register.vue @@ -0,0 +1,442 @@ + ++ +登录 ++ +还没有账号, +立即注册 ++ ++ ++ ++ ++86 + ++ ++ + ++ + ++ 忘记密码? + ++ + ++ + ++ + +{{ dynacodeData.codeText }} ++ +使用账号登录 +使用手机号登录 ++ + + + + ++ + + + + + + + + + + diff --git a/pages_tool/member/account.vue b/pages_tool/member/account.vue new file mode 100644 index 0000000..f9a90ad --- /dev/null +++ b/pages_tool/member/account.vue @@ -0,0 +1,440 @@ + ++ +注册 ++ +已有账号, +立即登录 ++ + ++ ++ ++ ++86 + ++ ++ + ++ + ++ + ++ ++ + ++ + ++ + +{{ dynacodeData.codeText }} ++ +使用用户名注册 +使用手机号注册 ++ + 点击注册即代表您已同意 + +《注册协议》 ++ + ++ ++ ++ {{ regisiterAgreement.title }} ++ ++ + + + + + + + + + + + \ No newline at end of file diff --git a/pages_tool/member/account_edit.vue b/pages_tool/member/account_edit.vue new file mode 100644 index 0000000..8d0ec17 --- /dev/null +++ b/pages_tool/member/account_edit.vue @@ -0,0 +1,325 @@ + ++ ++ ++ ++ ++ ++ +提现到余额 ++ ++ ++ + ++ +{{ item.withdraw_type_name }} ++ +{{ item.realname }} +{{ item.mobile }} ++ ++ 提现账号:{{ item.bank_account }} + ++ 银行名称 :{{ item.branch_bank_name }} + +修改 ++ ++ +设为默认账户 ++ + + ++ ++ + ++ 暂无账户信息,请添加 + ++ + ++ + + + + + + + + diff --git a/pages_tool/member/address.vue b/pages_tool/member/address.vue new file mode 100644 index 0000000..ce75f27 --- /dev/null +++ b/pages_tool/member/address.vue @@ -0,0 +1,590 @@ + ++ +{{ $lang('name') }} + ++ +{{ $lang('mobilePhone') }} + ++ +{{ $lang('accountType') }} ++ +{{ payList[index] }} ++ + +银行名称 + ++ +提现账号 + ++ + ++ + + + + + + + + \ No newline at end of file diff --git a/pages_tool/member/address_edit.vue b/pages_tool/member/address_edit.vue new file mode 100644 index 0000000..9636f99 --- /dev/null +++ b/pages_tool/member/address_edit.vue @@ -0,0 +1,504 @@ + ++ + ++ ++ + ++ + + + ++ + ++ ++ +{{ item.name }} +{{ item.mobile }} +{{ item.local_data }} +{{ item.full_address }}{{ item.address }} ++ {{ $lang('modify') }} + ++ + ++ ++ +{{ item.name }} +{{ item.mobile }} +{{ item.full_address }}{{ item.address }} ++ {{ $lang('modify') }} + ++ ++ +设为默认地址 +设为默认地址 ++ + + + ++ ++ + ++ 暂无收货地址,请添加 + + + + + + + + + ++ + + ++ + + + + + +{{ $lang('getAddress') }} ++ + + + + + + + + diff --git a/pages_tool/member/apply_withdrawal.vue b/pages_tool/member/apply_withdrawal.vue new file mode 100644 index 0000000..655b3ea --- /dev/null +++ b/pages_tool/member/apply_withdrawal.vue @@ -0,0 +1,420 @@ + ++ +地址信息 ++ ++ {{ $lang('consignee') }} + + +* ++ ++ {{ $lang('mobile') }} + + +* ++ + +{{ $lang('telephone') }} + ++ ++ ++ {{ $lang('receivingCity') }} + +* ++ {{ formData.full_address ? formData.full_address : '请选择省市区县' }} + + ++ + + ++ ++ {{ $lang('receivingCity') }} + +* ++ ++ {{ formData.full_address ? formData.full_address : '请选择省市区县' }} + ++ ++ {{ $lang('address') }} + + + +* ++ + + ++ + + + + + + + diff --git a/pages_tool/member/assets.vue b/pages_tool/member/assets.vue new file mode 100644 index 0000000..2084920 --- /dev/null +++ b/pages_tool/member/assets.vue @@ -0,0 +1,252 @@ + ++ ++ +提现到 +微信默认钱包 +{{ bankAccountInfo.bank_account }} ++ ++ + ++ + ++ 请添加提现方式 ++ + + + +提现金额: ++ +{{ $lang('common.currencySymbol') }} + ++ + ++ +可提现余额:{{ $lang('common.currencySymbol') }}{{ withdrawInfo.member_info.balance_money | moneyFormat }} +全部提现 ++ +最小提现金额为{{ $lang('common.currencySymbol') }}{{ withdrawInfo.config.min | moneyFormat }} +,手续费为{{ withdrawInfo.config.rate + '%' }} ++ 提现 + + ++ 提现记录 + + + + + + + + diff --git a/pages_tool/member/balance.vue b/pages_tool/member/balance.vue new file mode 100644 index 0000000..ac2a8b7 --- /dev/null +++ b/pages_tool/member/balance.vue @@ -0,0 +1,179 @@ + ++ ++ ++ 风险提示:确认申请后您的资产将被清空且不可找回! + ++ ++ 账户资产 ++ ++ +{{ member_info.point }} +积分 ++ +¥{{ member_info.balance_money }} +现金余额 ++ +¥{{ member_info.balance }} +储值余额 ++ +{{ accountInfo.member_coupon_count }} +优惠券 ++ + ++ ++ 订单资产 ++ ++ +{{ accountInfo.order_pay_count }} +待发货 ++ +{{ accountInfo.order_delivery_count }} +待收货 ++ +{{ accountInfo.order_refund_count }} +退款中 ++ ++ ++ 分销资产 ++ ++ +¥{{ fenxiao_info.account }} +可提现佣金 ++ +¥{{ fenxiao_info.account_withdraw_apply }} +提现中佣金 ++ +{{ accountInfo.fenxiao_order_count }} +待结算订单 ++ + + ++ + + + + + + + diff --git a/pages_tool/member/balance_detail.vue b/pages_tool/member/balance_detail.vue new file mode 100644 index 0000000..d59fcd5 --- /dev/null +++ b/pages_tool/member/balance_detail.vue @@ -0,0 +1,320 @@ + ++ + + ++ ++ + 我的余额 + ++ + +{{ (parseFloat(balanceInfo.balance) + parseFloat(balanceInfo.balance_money)).toFixed(2) }} +账户余额(元) ++ ++ +{{ balanceInfo.balance_money|moneyFormat }} +现金余额(元) ++ +{{ balanceInfo.balance|moneyFormat }} +储值余额(元) ++ + ++ ++ ++ 余额明细 ++ + ++ ++ 充值记录 ++ + ++ {{ $lang('recharge') }} + ++ {{ $lang('withdrawal') }} + ++ + + + + + + + + diff --git a/pages_tool/member/cancellation.vue b/pages_tool/member/cancellation.vue new file mode 100644 index 0000000..eb62c4f --- /dev/null +++ b/pages_tool/member/cancellation.vue @@ -0,0 +1,129 @@ + ++ ++ ++ ++ {{ date }} + ++ + ++ +{{ balanceType[balanceIndex].label }} ++ + ++ + ++ ++ ++ + ++ +{{ item.type_name }} +{{ item.remark }} +{{ $util.timeStampTurnTime(item.create_time) }} ++ +{{ item.account_data > 0 ? '+' + item.account_data : item.account_data }} ++ + + + + + + + + + + diff --git a/pages_tool/member/cancelrefuse.vue b/pages_tool/member/cancelrefuse.vue new file mode 100644 index 0000000..6dfe9f8 --- /dev/null +++ b/pages_tool/member/cancelrefuse.vue @@ -0,0 +1,114 @@ + ++ ++ + +{{ agreement.title }} ++ + ++ + ++ + 勾选即表示您已阅读并同意本协议 ++ + + + + + + diff --git a/pages_tool/member/cancelstatus.vue b/pages_tool/member/cancelstatus.vue new file mode 100644 index 0000000..4b3daa2 --- /dev/null +++ b/pages_tool/member/cancelstatus.vue @@ -0,0 +1,192 @@ + ++ ++ 您的申请已拒绝 +拒绝理由:{{ reason }} ++ + + ++ + + + + + + diff --git a/pages_tool/member/cancelsuccess.vue b/pages_tool/member/cancelsuccess.vue new file mode 100644 index 0000000..2467748 --- /dev/null +++ b/pages_tool/member/cancelsuccess.vue @@ -0,0 +1,96 @@ + ++ ++ ++ +1 ++ +提交申请 +您已提交申请,请耐心等待~ ++ + +2 ++ +等待审核 +等待审核中,审核通过后您的账号将直接被删除 ++ + +3 ++ +审核通过,注销完成 +您已成功注销账号,期待下一次与您相遇 ++ + + ++ + + + + + + diff --git a/pages_tool/member/card.vue b/pages_tool/member/card.vue new file mode 100644 index 0000000..359e04d --- /dev/null +++ b/pages_tool/member/card.vue @@ -0,0 +1,240 @@ + ++ ++ 您已成功注销账号 +待下次与您更好的相遇,如需再次使用,请重新注册 ++ + + + + + + + diff --git a/pages_tool/member/card_agreement.vue b/pages_tool/member/card_agreement.vue new file mode 100644 index 0000000..8be6915 --- /dev/null +++ b/pages_tool/member/card_agreement.vue @@ -0,0 +1,69 @@ + ++ + + + ++ + ++ + + +{{ userInfo.nickname }} +有效期至:{{ $util.timeStampTurnTime(userInfo.level_expire_time, true) }} ++ + ++ ++ + + +{{ levelInfo.level_name }} +{{ levelInfo.level_name }}可享受消费折扣和 +会员大礼包等权益 ++ + ++ + ++ ++ 会员权益 ++ + + + ++ ++ 全场包邮 +享受商品包邮服务 ++ ++ 消费折扣 +部分商品下单可享{{ levelInfo.consume_discount / 10 }}折优惠 ++ ++ 积分回馈 +下单享{{ parseFloat(levelInfo.point_feedback) }}倍积分回馈 ++ ++ ++ 开卡礼包 ++ + + ++ ++ 积分礼包 +赠送{{ levelInfo.send_point }}积分 ++ ++ 红包礼包 +赠送{{ parseFloat(levelInfo.send_balance) }}元红包 ++ ++ 优惠券礼包 +赠送{{ levelInfo.send_coupon.split(',').length }}张优惠券 ++ + ++ ++ ++ +会员卡说明 ++ + ++ ++ +会员卡说明 +{{ levelInfo.remark }} ++ + + + + + + + + + diff --git a/pages_tool/member/card_buy.vue b/pages_tool/member/card_buy.vue new file mode 100644 index 0000000..78ba372 --- /dev/null +++ b/pages_tool/member/card_buy.vue @@ -0,0 +1,439 @@ + +{{ title }} ++ + + + + + + + diff --git a/pages_tool/member/collection.vue b/pages_tool/member/collection.vue new file mode 100644 index 0000000..542ac11 --- /dev/null +++ b/pages_tool/member/collection.vue @@ -0,0 +1,96 @@ + ++ ++ + + + ++ ++ + + +{{ userInfo.nickname }} ++ 有效期至:{{ $util.timeStampTurnTime(userInfo.level_expire_time, true) }} + ++ + ++ ++ ++ ++ + + + + + +{{ levelList[curIndex].level_name }} +{{ levelList[curIndex].level_name }}可享受消费折扣和 +会员大礼包等权益 ++ ++ + + ++ ++ 卡种选择 ++ + + ++ ++ ++ {{ cardType[item.key].name }} ++ {{ $lang('common.currencySymbol') }} + +{{ item.value }} + /{{ cardType[item.key].unit }} ++ + ++ ++ 会员权益 ++ + + + ++ ++ 全场包邮 +享受商品包邮服务 ++ ++ 消费折扣 +部分商品下单可享{{ currCard.consume_discount / 10 }}折优惠 ++ ++ 积分回馈 +下单享{{ parseFloat(currCard.point_feedback) }}倍积分回馈 ++ ++ ++ 开卡礼包 ++ + + ++ ++ 积分礼包 +赠送{{ currCard.send_point }}积分 ++ ++ 红包礼包 +赠送{{ parseFloat(currCard.send_balance) }}元红包 ++ ++ 优惠券礼包 +赠送{{ currCard.send_coupon.split(',').length }}张优惠券 ++ ++ + ++ ++ 立即续费 + +充值开通 +立即开通 +{{ $lang('common.currencySymbol') }} +{{ currCard.charge_rule_arr[choiceIndex].value }} +/{{ cardType[currCard.charge_rule_arr[choiceIndex].key].unit }} ++ 购买既视为同意 + +《{{ agreement.title }}》 ++ + ++ ++ ++ +会员卡说明 ++ + ++ ++ +会员卡说明 +{{ currCard.remark }} ++ + + + + + + + + + + + + diff --git a/pages_tool/member/coupon.vue b/pages_tool/member/coupon.vue new file mode 100644 index 0000000..733f108 --- /dev/null +++ b/pages_tool/member/coupon.vue @@ -0,0 +1,394 @@ + ++ ++ ++ + ++ ++ + +{{ item.sku_name }} ++ ++ +¥ ++ {{ + parseFloat(item.discount_price) + .toFixed(2) + .split('.')[0] + }} + ++ .{{ + parseFloat(item.discount_price) + .toFixed(2) + .split('.')[1] + }} + ++ ++ + + + + + + + + + + + diff --git a/pages_tool/member/footprint.vue b/pages_tool/member/footprint.vue new file mode 100644 index 0000000..9aa24e0 --- /dev/null +++ b/pages_tool/member/footprint.vue @@ -0,0 +1,250 @@ + ++ + ++ + ++ 未使用 + 已使用 + 已过期 + ++ ++ ++ ++ ++ + ++ +¥ + {{ parseInt(item.money) }} ++ +¥ + {{ parseInt(item.money) }} ++ {{ parseFloat(item.discount) }} + +折 +满{{ item.at_least }}元可用 +无门槛优惠券 ++ ++ +{{ item.coupon_name }} +指定商品 +(最大优惠{{ item.discount_limit }}元) +有效期:{{ $util.timeStampTurnTime(item.end_time) }} +有效期:长期有效 ++ +去使用 +已使用 +已过期 ++ ++ + + + + + + + + + diff --git a/pages_tool/member/info.vue b/pages_tool/member/info.vue new file mode 100644 index 0000000..944480e --- /dev/null +++ b/pages_tool/member/info.vue @@ -0,0 +1,328 @@ + ++ +{{ manage ? '完成' : '管理' }} ++ + ++ ++ ++ +{{ datetime(item) }} ++ ++ ++ + ++ {{ goodsTag(item) }} ++ ++ + +{{ item.goods_name }} ++ ++ +{{ $lang('common.currencySymbol') }} +{{ parseFloat(showPrice(item)).toFixed(2).split(".")[0] }} +.{{ parseFloat(showPrice(item)).toFixed(2).split(".")[1] }} ++ ++ + ++ + ++ +{{ $lang('common.currencySymbol') }} + {{ item.market_price > 0 ? item.market_price : item.price }} + +已售{{ item.sale_num }}{{ item.unit ? item.unit : '件' }} ++ + + ++ ++ 全选 ++ + + + + + + + + + + diff --git a/pages_tool/member/info_edit.vue b/pages_tool/member/info_edit.vue new file mode 100644 index 0000000..3ed0e51 --- /dev/null +++ b/pages_tool/member/info_edit.vue @@ -0,0 +1,366 @@ + ++ + + ++ + +{{ $lang('headImg') }} ++ ++ + + + +{{ $lang('account') }} +{{ memberInfoformData.number }} ++ + + +{{ $lang('account') }} +{{ memberInfoformData.number }} ++ + +{{ $lang('nickname') }} +{{ memberInfoformData.nickName }} ++ + + +{{ $lang('realName') }} +{{ memberInfoformData.realName }} ++ + + +{{ $lang('sex') }} +{{ memberInfoformData.sex }} ++ + + +{{ $lang('birthday') }} +{{ memberInfoformData.birthday }} ++ + + +{{ $lang('mobilePhone') }} +{{ $lang('bindMobile') }} +{{ memberInfoformData.mobile }} ++ + + + + +{{ $lang('password') }} + ++ + + + +所在地址 +{{ memberInfo.full_address }} {{ memberInfo.address }} +去设置 ++ + + + + + + + + + +{{ $lang('cancellation') }} + ++ + + ++ + + + + + + + + + diff --git a/pages_tool/member/invite_friends.vue b/pages_tool/member/invite_friends.vue new file mode 100644 index 0000000..8268d2f --- /dev/null +++ b/pages_tool/member/invite_friends.vue @@ -0,0 +1,305 @@ + ++ + ++ +{{ $lang('username') }} + +用户名仅可修改一次,请谨慎设置 ++ + ++ + ++ +{{ $lang('nickname') }} + ++ + ++ + ++ +{{ $lang('realName') }} + ++ + ++ + ++ +{{ $lang('sex') }} ++ + ++ + ++ + ++ +{{ $lang('birthday') }} ++ +{{ formData.birthday ? formData.birthday : '请选择生日' }} ++ + ++ + ++ ++ ++ 请先绑定手机再执行该操作 + ++ ++ +{{ $lang('nowPassword') }} + ++ ++ +{{ $lang('confirmCode') }} + ++ + +{{ $lang('animateCode') }} + + +点击“获取动态码”,将会向您已绑定的手机号{{ memberInfoformData.mobile | mobile }}发送验证码 ++ +{{ $lang('newPassword') }} + ++ + +{{ $lang('confirmPassword') }} + ++ + ++ ++ +{{ $lang('phoneNumber') }} + ++ +{{ $lang('confirmCode') }} + ++ + +{{ $lang('animateCode') }} + + ++ + ++ ++ +所在地区 ++ ++ {{ formData.fullAddress ? formData.fullAddress : '请选择省市区县' }} + ++ +详细地址 + ++ + ++ + + + + + + + + + diff --git a/pages_tool/member/level.vue b/pages_tool/member/level.vue new file mode 100644 index 0000000..d393e0c --- /dev/null +++ b/pages_tool/member/level.vue @@ -0,0 +1,414 @@ + ++ + ++ ++ + + ++ 活动说明 + + 活动时间:{{ $util.timeStampTurnTime(info.start_time, 1) }}至{{ $util.timeStampTurnTime(info.end_time, 1) }} + +立即邀请 ++ +我的好友 ++ ++ ++ ++ ++ ++ + ++ +{{ item.source_member_nickname }} +{{ $util.timeStampTurnTime(item.create_time) }} ++ +{{ item.balance }}元现金红包 ++ +{{ parseInt(item.point) }}积分 ++ +{{ item.coupon_num }}张优惠券 ++ 查看更多 + ++ 没有更多数据了 ++ ++ +您还没有邀请到新朋友哦 +邀请好友,赚取好礼。赶紧去试试吧~ ++ +邀请好友奖励 ++ ++ ++ + ++ + ++ +{{ $lang('common.currencySymbol') }} +{{ info.balance }} +现金红包 ++ + ++ + ++ +{{ parseInt(info.point) }} +积分 ++ ++ + ++ +{{ info.coupon.split(',').length }} + 张 +优惠券 ++ +分享给好友,让好友通过你的分享链接进入并注册登录,可获得以下奖励: ++ ++ +● + 可得{{ info.balance }}元红包奖励 ++ +● + 可得{{ info.point }}积分 ++ + +● + 可得{{ info.coupon.split(',').length }}张优惠券 ++ +● + 可得奖励不受限制 ++ +● + 奖励上限为{{ info.max_fetch }}人 ++ + + +如何邀请好友 ++ ++ ++ ++ 分享链接给好友 ++ + ++ 好友进入 ++ + ++ 好友注册成功获得奖励 ++ + + ++ + ++ ++ + 保存图片 + + +长按保存图片 + ++ + {{ posterMsg }} ++ + + ++ ++ +分享 ++ + ++ + + ++ + + ++ + + ++ 取消分享 + ++ ++ ++ +活动说明 ++ + +{{ info.remark }} ++ + + + + + + + + + diff --git a/pages_tool/member/level_growth_rules.vue b/pages_tool/member/level_growth_rules.vue new file mode 100644 index 0000000..7ae72b8 --- /dev/null +++ b/pages_tool/member/level_growth_rules.vue @@ -0,0 +1,282 @@ + ++ + + + ++ ++ + + +{{ userInfo.nickname }} +当前等级:{{ userInfo.member_level_name }} ++ ++ 成长规则 + + ++ ++ ++ ++ + + + ++ {{ levelList[curIndex].level_name }} + +当前等级 +当前成长值 +{{ growth }} ++ ++ ++ + 再获得{{ levelList[curIndex + 1].needGrowth > 0 ? levelList[curIndex + 1].needGrowth : 0 }}成长值成为{{ + levelList[curIndex + 1].level_name + }} + ++ 您现在已经是最高等级 + ++ + 再获得{{ levelList[curIndex].needGrowth }}成长值成为{{ levelList[curIndex].level_name }} + ++ + +会员权益 ++ ++ + +包邮服务 +提供商品包邮服务 ++ ++ + +享受消费折扣服务 +不享受任何消费折扣和其他权益 +提供{{ levelList[curIndex].consume_discount }}折消费折扣 ++ ++ + +享受积分回馈服务 +提供{{ levelList[curIndex].point_feedback }}倍积分回馈倍率 ++ +会员礼包 ++ ++ + +积分礼包 +赠送{{ levelList[curIndex].send_point }}积分 ++ ++ + +红包礼包 +赠送{{ levelList[curIndex].send_balance }}元红包 ++ ++ + +优惠券礼包 +赠送{{ levelList[curIndex].coupon_length }}张优惠券 ++ + ++ ++ 优惠券 + ++ + ++ ++ +{{ item.coupon_name }} ++ + +{{ item.money }} + 元 ++ +{{ $util.numberFixed(item.discount, 1) }} + 折 ++ + + + + + + + + + diff --git a/pages_tool/member/modify_face.vue b/pages_tool/member/modify_face.vue new file mode 100644 index 0000000..f5b6b94 --- /dev/null +++ b/pages_tool/member/modify_face.vue @@ -0,0 +1,184 @@ + ++ ++ ++ 成长值说明 + + + ++ +等级 +成长值 ++ +{{ item.level_name }} +{{ item.growth }} ++ ++ ++ 什么是成长值 +成长值是消费者在店铺成为会员后,通过消费计算出来的值。成长值决定会员等级,会员等级越高,所享受的会员权益和会员礼包就越多。 ++ + ++ ++ 如何获得成长值 ++ +1、注册会员送x成长值。 +2、会员充值到余额送x成长值。 +3、会员签到送x成长值。 +4、会员消费x元,交易完成即可获得x个成长值。 ++ + + + + + + + + diff --git a/pages_tool/member/pay_password.vue b/pages_tool/member/pay_password.vue new file mode 100644 index 0000000..cb83063 --- /dev/null +++ b/pages_tool/member/pay_password.vue @@ -0,0 +1,279 @@ + ++ ++ ++ + + + ++ + ++ + + ++ + + + + + + + + + diff --git a/pages_tool/member/point.vue b/pages_tool/member/point.vue new file mode 100644 index 0000000..96d34d0 --- /dev/null +++ b/pages_tool/member/point.vue @@ -0,0 +1,214 @@ + +请输入6位支付密码,建议不要使用重复或连续数字 +验证码已发送至{{ memberInfo.mobile | mobile }}请在下方输入4位数字验证码 ++ ++ + {{ dynacodeData.codeText }} + +输入短信验证码 +请设置支付密码 +请再次输入 +确认 ++ + + + + + + + diff --git a/pages_tool/member/point_detail.vue b/pages_tool/member/point_detail.vue new file mode 100644 index 0000000..4651a41 --- /dev/null +++ b/pages_tool/member/point_detail.vue @@ -0,0 +1,381 @@ + ++ + + ++ ++ + 我的积分 + ++ + +{{ pointInfo.point }} +当前积分 ++ ++ +{{ pointInfo.totalPoint }} +累计积分 ++ +{{ pointInfo.totalConsumePoint }} +累计消费 ++ +{{ pointInfo.todayPoint }} +今日获得 ++ + ++ ++ ++ 积分明细 ++ ++ ++ 积分商城 ++ + +做任务赚积分 ++ ++ + +每日签到 +连续签到可获得更多积分 +去签到 ++ ++ + +购买商品 +购买商品可获得积分 +去下单 ++ + + + + + + + + diff --git a/pages_tool/member/public/css/balance.scss b/pages_tool/member/public/css/balance.scss new file mode 100644 index 0000000..1a22de4 --- /dev/null +++ b/pages_tool/member/public/css/balance.scss @@ -0,0 +1,160 @@ +.custom-navbar { + width: 100vw; + padding-bottom: 20rpx; + position: fixed; + left: 0; + top: 0; + z-index: 100; + background: unset; + + // #ifdef MP-WEIXIN + background-size: 100% 380rpx; + // #endif + + .navbar-wrap { + position: relative; + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 100%; + } + + .navbar-title { + color: #fff; + font-size: 36rpx; + font-weight: 600; + } + + .back { + position: absolute; + color: #fff; + left: 30rpx; + font-size: 40rpx; + } +} + +.custom-navbar-block { + padding-bottom: 20rpx; +} + +.head-wrap { + width: 100vw; + background-size: 100%; + padding: 60rpx 68rpx 140rpx 68rpx; + box-sizing: border-box; + border-radius: 0 0 100% 100%/0 0 70rpx 70rpx; + overflow: hidden; + + // #ifdef MP + padding-top: 160rpx; + // #endif + + .title { + text-align: left; + line-height: 1; + color: #F6F6F6; + } + + .balance { + font-size: 48rpx; + color: var(--btn-text-color); + text-align: left; + line-height: 1; + margin-bottom: 20rpx; + font-size: 64rpx; + } + + .flex-box { + display: flex; + margin-top: 56rpx; + + .flex-item { + flex: 1; + + .num { + font-size: 34rpx; + margin-bottom: 20rpx; + color: #fff; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + } + + view { + text-align: left; + color: #F6F6F6; + line-height: 1; + } + } + } +} + +.menu-wrap { + border-radius: 20rpx; + margin: 0 24rpx; + padding: 0 30rpx; + background: #fff; + transform: translateY(-90rpx); + + .menu-item { + display: flex; + align-items: center; + padding: 12rpx 0; + + .icon { + height: 80rpx; + border-radius: 20rpx; + display: flex; + align-items: center; + color: #fff; + margin-right: 20rpx; + + .iconfont { + font-size: 46rpx; + -webkit-background-clip: text !important; + -webkit-text-fill-color: transparent; + background: linear-gradient(135deg, #FE7849 0%, #FF1959 100%); + } + } + + .title { + font-size: 28rpx; + color: #333333; + flex: 1; + } + + .iconright { + font-size: 28rpx; + } + } +} + +.action { + position: fixed; + width: 100vw; + left: 0; + bottom: 0; + padding-bottom: 100rpx; + + view { + width: calc(100vw - 64rpx); + height: 80rpx; + line-height: 80rpx; + border-radius: 80rpx; + margin: 0 auto 30rpx auto; + text-align: center; + color: #fff; + font-size: 32rpx; + } + .recharge-withdraw { + background: #FF4646; + } + + .withdraw { + border: 4rpx solid #FF4646; + box-sizing: border-box; + line-height: 72rpx; + color: #FF4646; + } +} \ No newline at end of file diff --git a/pages_tool/member/public/css/card.scss b/pages_tool/member/public/css/card.scss new file mode 100644 index 0000000..606e219 --- /dev/null +++ b/pages_tool/member/public/css/card.scss @@ -0,0 +1,673 @@ +.member-level { + width: 100%; + min-height: 100vh; + position: relative; +} +.level-top { + width: 100%; + position: relative; + image { + width: 100%; + height: 460rpx; + position: absolute; + } +} +.banner-container { + width: 100vw; + position: relative; + left: 0; + top: 0; + + .memberInfo { + width: 100%; + height: 140rpx; + padding: 40rpx 40rpx 0; + display: flex; + align-items: center; + justify-content: space-between; + box-sizing: border-box; + image { + width: 100rpx; + height: 100rpx; + border-radius: 50%; + border: 4rpx solid #ffffff; + box-sizing: border-box; + } + .growth-rules { + position: absolute; + display: flex; + align-items: center; + color: #fff; + right: 40rpx; + font-size: 24rpx; + z-index: 10; + .iconfont{ + margin-right: 10rpx; + } + } + .member-desc { + width: calc(100% - 20rpx - 100rpx); + height: 100%; + padding: 16rpx 0; + box-sizing: border-box; + display: flex; + flex-direction: column; + align-items: flex-start; + justify-content: center; + + view { + font-weight: bold; + line-height: 1; + color: #ffffff; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + .expire-time { + color: #ccc; + font-weight: normal; + margin-top: 10rpx; + } + } + } + + .demand { + width: 100%; + padding: 0 $padding; + box-sizing: border-box; + .demand-title { + font-size: $font-size-toolbar; + font-weight: bold; + line-height: 1; + display: flex; + align-items: center; + image { + width: 39rpx; + height: 35rpx; + margin-right: 10rpx; + } + } + .demand-info { + padding: 10rpx 24rpx; + box-sizing: border-box; + display: flex; + flex-direction: column; + margin-top: 27rpx; + border-radius: 10rpx; + justify-content: space-between; + height: 150rpx; + background: #ffffff; + .info-title { + display: flex; + justify-content: space-between; + align-items: center; + text { + &:nth-child(1) { + color: #000; + font-size: $font-size-tag; + } + &:nth-child(2) { + color: #959595; + } + } + } + progress { + margin-top: 39rpx; + } + .info-size { + display: flex; + justify-content: space-between; + align-items: center; + font-size: $font-size-tag; + color: #959595; + } + } + } + + .uni-swiper-dots { + bottom: 30rpx !important; + } + + .image-container { + box-sizing: border-box; + width: 100%; + height: 100%; + display: flex; + image { + width: 100%; + height: 100%; + } + .slide-image { + width: 535rpx; + height: 300rpx; + z-index: 200; + display: flex; + justify-content: space-between; + align-items: center; + border-radius: 20rpx; + overflow: hidden; + position: relative; + .bg-border{ + width: calc(100% - 40rpx); + height: calc(100% - 40rpx); + position: absolute; + top: 18rpx; + left: 20rpx; + border: 2rpx solid rgba(255, 255, 255, .2); + z-index: 10; + border-radius: 10rpx; + opacity: .5; + + } + .growth-rules{ + position: absolute; + right: 40rpx; + top: 40rpx; + z-index: 10; + } + .info { + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + padding: 10rpx 0; + box-sizing: border-box; + position: absolute; + left: 0; + bottom: 0; + padding: 30rpx 40rpx; + box-sizing: border-box; + .level-detail { + font-size: 52rpx; + display: flex; + align-items: center; + margin-top: 26rpx; + } + .growr-name { + font-size: 24rpx; + margin-top: 50rpx; + opacity: 0.8; + } + .growr-value { + font-size: 24rpx; + margin-top: 10rpx; + opacity: 0.8; + } + .progress { + margin-top: 30rpx; + } + .residue-growr-value { + text-align: right; + font-size: 24rpx; + margin-top: 10rpx; + } + view { + color: #ffffff; + line-height: 1.3; + } + } + .now_growth { + margin-top: 20rpx; + } + .pic { + display: flex; + justify-content: center; + align-items: center; + + image { + width: 160rpx; + } + } + .isnow { + font-size: 20rpx; + color: #fff; + padding: 2rpx; + line-height: 1; + margin-left: 10rpx; + } + } + } + + .item-left { + justify-content: flex-end; + padding: 56rpx 26rpx 0 0; + } + + .image-container-box .item-left { + justify-content: center; + padding: 56rpx 0 0 0; + } + + .item-right { + justify-content: flex-start; + padding: 56rpx 0 0 26rpx; + } + + .item-center { + justify-content: center; + padding: 56rpx 0 0 0; + } + + .card-content { + background-color: #fff; + border-radius: 10rpx; + padding: 20rpx 30rpx 20rpx; + // padding: 20rpx 30rpx; + margin:$margin-updown $margin-both; + .gift-title { + font-size: 30rpx; + } + .equity-itme { + display: flex; + align-items: center; + image { + width: 60rpx; + height: 60rpx; + margin-right: 30rpx; + } + .equity-content { + padding: 20rpx 0; + line-height: 1; + &.active { + border-bottom: 2rpx solid #e5e5e5; + } + flex: 1; + display: flex; + flex-direction: column; + .equity-desc { + font-size: $font-size-activity-tag; + margin-top: 16rpx; + color: $color-tip; + } + } + } + } + + .card-privilege-list{ + width: 100%; + flex-wrap: wrap; + display: flex; + justify-content: center; + + .card-privilege-item{ + width: 33%; + display: inline-block; + margin-top: 0; + text-align: center; + .card-privilege-icon{ + width: 60rpx; + height: 60rpx; + text-align: center; + margin: 0 auto; + line-height: 1; + } + .card-privilege-name{ + color: $color-title; + font-size: $font-size-sub; + padding-top: 20rpx; + } + .card-privilege-text{ + color: $color-tip; + font-size: $font-size-goods-tag; + padding: 0 20rpx; + } + .iconfont { + font-size: 60rpx; + background-image:-webkit-linear-gradient(top,#E3B66B,#F7DAA5); + -webkit-background-clip:text; + -webkit-text-fill-color:transparent; + } + .icon-zhekou,.icon-hongbao{ + font-size: 54rpx; + } + + } + } + + .member-gift { + background-color: #fff; + margin: $margin-updown $margin-both; + padding: 20rpx 30rpx; + border-radius: 10rpx; + .gift-title { + font-size: 30rpx; + } + .gift-itme { + display: flex; + align-items: center; + image { + width: 60rpx; + height: 60rpx; + margin-right: 30rpx; + } + .gift-content { + &.active { + border-bottom: 2rpx solid #e5e5e5; + } + padding: 20rpx 0; + line-height: 1; + flex: 1; + display: flex; + flex-direction: column; + .gift-desc { + font-size: 24rpx; + margin-top: 16rpx; + color: #999; + } + } + } + } + + .desc-wrap { + box-sizing: border-box; + width: 100%; + height: 98rpx; + padding: 24rpx 66rpx 0; + + .title { + width: 100%; + height: 42rpx; + line-height: 42rpx; + color: #222222; + font-size: $font-size-base; + font-family: 'PingFangTC-Regular'; + font-weight: 600; + text-align: left; + } + + .desc { + margin-top: 4rpx; + width: 100%; + height: 34rpx; + line-height: 34rpx; + color: #999999; + font-size: $font-size-tag; + font-family: 'PingFangTC-Regular'; + text-align: left; + } + } + + @keyframes descAnimation { + 0% { + opacity: 1; + } + + 25% { + opacity: 0.5; + } + + 50% { + opacity: 0; + } + + 75% { + opacity: 0.5; + } + + 100% { + opacity: 1; + } + } + + @-webkit-keyframes descAnimation { + 0% { + opacity: 1; + } + + 25% { + opacity: 0.5; + } + + 50% { + opacity: 0; + } + + 75% { + opacity: 0.5; + } + + 100% { + opacity: 1; + } + } +} +.coupon-popup-box { + background-color: #f7f7f7; + .coupon-popup-title { + text-align: center; + font-size: 32rpx; + line-height: 90rpx; + height: 90rpx; + display: block; + font-weight: bold; + position: relative; + border-bottom: 1rpx solid #eeeeee; + } + .iconfont { + position: absolute; + float: right; + right: 44rpx; + font-size: 40rpx; + font-weight: 500; + } + .coupon-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: 20rpx 30rpx; + margin-bottom: 20rpx; + background-color: #fff; + border-radius: 4rpx; + .coupon-name { + flex: 1; + display: flex; + flex-direction: column; + .desc { + margin-top: 20rpx; + font-size: $font-size-tag; + color: #ababab; + } + } + .coupon-price { + color: red; + text { + font-size: 70rpx; + } + } + } + .coupon-popup-content { + max-height: 390rpx; + padding: 20rpx; + box-sizing: border-box; + } +} +.card-content-head{ + text-align: center; + color: $color-title; + margin: 20rpx 0; + .line-box{ + float: left; + text-align: center; + width: 35%; + margin-top: 26rpx; + .line{ + background-color: $color-title; + width: 60rpx; + height: 2rpx; + } + } + .card-content-title{ + float: left; + text-align: center; + width: 30%; + font-size: $font-size-base; + color: $color-title; + } +} + +.right{ + float: right; +} +.clear{ + clear: both; +} +.card-time-list{ + margin: -7.5rpx; + white-space: nowrap; + overflow-x: scroll; + height: 256rpx; + + .card-item-box{ + padding: 15rpx; + display: inline-block; + width: 33.3333%; + box-sizing: border-box; + + &.small { + width: 32.3%; + } + + .card-time-item{ + border: 2rpx solid #cccccc; + border-radius: $border-radius; + text-align: center; + padding: 25rpx 0 20rpx; + + image{ + width: 60rpx; + } + + .time-name { + line-height: 1.3; + } + } + .card-time-item.active{ + border-color: #E3B66B; + background: rgba(227, 182, 107, .3); + } + .time-price{ + font-size: $font-size-tag; + text{ + font-size: $font-size-toolbar; + } + + .price { + font-weight: bolder; + } + } + } +} +.action-wrap{ + height: 140rpx; + + &.have-agreement{ + height: 190rpx; + } + + &.bottom-safe-area { + padding-bottom: constant(safe-area-inset-bottom); + padding-bottom: env(safe-area-inset-bottom); + } +} +.action { + position: fixed; + z-index: 5; + left: 0; + bottom: 0; + width: 100vw; + height: 140rpx; + background: #fff; + box-shadow: 0 0 20rpx rgba(0, 0, 0, 0.1); + text-align: right; + line-height: 100rpx; + background: #fff; + padding: 0 40rpx; + box-sizing: border-box; + + &.have-agreement{ + height: 190rpx; + } + + .agreement { + text-align: center; + font-size: $font-size-tag; + line-height: 1; + margin-top: 20rpx; + + text { + color: #E3B66B; + } + } + + &.bottom-safe-area { + padding-bottom: constant(safe-area-inset-bottom); + padding-bottom: env(safe-area-inset-bottom); + } + + .action-btn { + width: 100%; + height: 80rpx; + line-height: 80rpx; + color: #7C5711; + padding: 0 40rpx; + display: inline-block; + text-align: center; + margin: 30rpx 0 0 0; + border-radius: 10rpx; + border: none; + background-image:linear-gradient(to top,#F7DAA5,#E3B66B); + box-sizing: border-box; + } + + .title{ + margin-right: 6rpx; + } + + .bold{ + font-weight: bold; + } +} + +/* 说明弹框 */ +.tips-layer { + background: #fff; + z-index: 999; + height: 40%; + width: 100%; + + .head { + position: relative; + } + + .title { + height: 80rpx; + line-height: 80rpx; + text-align: center; + font-size: $font-size-toolbar; + font-weight: 700; + } + + text { + position: absolute; + top: 8rpx; + right: 44rpx; + font-size: $font-size-toolbar; + font-weight: 500; + } + + .body { + width: 100%; + height: calc(100% - 80rpx); + overflow-y: scroll; + + .detail { + padding: 20rpx; + + .font-size-base { + margin-bottom: 10rpx; + } + } + + } +} \ No newline at end of file diff --git a/pages_tool/member/public/css/collection.scss b/pages_tool/member/public/css/collection.scss new file mode 100644 index 0000000..a02c1e1 --- /dev/null +++ b/pages_tool/member/public/css/collection.scss @@ -0,0 +1,101 @@ +.lineheight-clear { + line-height: 1; +} +.goods_list { + width: 100%; + padding: $padding 0; + padding-top: 0; + box-sizing: border-box; + + .goods_li { + height: 200rpx; + background: #ffffff; + overflow: hidden; + border-radius: $border-radius; + display: flex; + justify-content: space-between; + margin: $margin-updown $margin-both; + padding: 30rpx; + + .pic { + width: 200rpx; + height: 200rpx; + box-sizing: border-box; + border-radius: $border-radius; + overflow: hidden; + image { + width: 100%; + height: 100%; + } + } + + .goods_info { + flex: 1; + height: 100%; + padding-left: 20rpx; + box-sizing: border-box; + display: flex; + justify-content: space-between; + flex-direction: column; + } + + .goods_name { + width: 100%; + height: 80rpx; + line-height: 1.5; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; + } + + .goods_opection { + width: 100%; + height: 80rpx; + display: flex; + justify-content: space-between; + align-items: flex-end; + + .right { + display: flex; + align-items: flex-end; + } + + .symbol { + font-size: $font-size-tag; + color: var(--price-color); + } + + .price { + font-size: $font-size-toolbar; + color: var(--price-color); + } + + .cars { + padding: 0rpx 15rpx; + border: 1rpx solid $color-line; + border-radius: 32rpx; + } + + icon { + font-size: $font-size-tag; + } + + .alike { + padding: 0rpx 15rpx; + border: 1rpx solid $color-line; + border-radius: 24rpx; + margin-left: 20rpx; + } + } + } +} +.empty { + width: 100%; + display: flex; + flex-direction: column; + align-items: center; + padding: $padding; + box-sizing: border-box; + margin-top: 50rpx; +} diff --git a/pages_tool/member/public/css/footprint.scss b/pages_tool/member/public/css/footprint.scss new file mode 100644 index 0000000..2735ff0 --- /dev/null +++ b/pages_tool/member/public/css/footprint.scss @@ -0,0 +1,224 @@ +.empty { + margin-top: 100rpx; +} + +.lineheight-clear { +} + +.head-wrap { + width: 100vw; + height: 90rpx; + line-height: 90rpx; + background: #fff; + box-sizing: border-box; + padding: 0 30rpx; + text-align: right; +} + +.goods-list.single-column { + margin: 0 $margin-both; + + .checkbox-wrap { + margin-right: 20rpx; + display: flex; + align-items: center; + + .iconfont { + font-size: 40rpx; + color: #ccc; + } + } + + .datetime { + line-height: 1.5; + font-size: $font-size-base; + } + + .goods-item { + padding: 26rpx; + background: #fff; + border-radius: $border-radius; + display: flex; + position: relative; + margin: $margin-updown 0; + + &.first-child { + margin-top: 0; + } + + + .goods-img { + width: 200rpx; + height: 200rpx; + overflow: hidden; + border-radius: $border-radius; + margin-right: 20rpx; + + image { + width: 100%; + height: 100%; + } + } + + .goods-tag{ + color: #fff; + line-height: 1; + padding: 8rpx 12rpx; + position: absolute; + border-top-left-radius: $border-radius; + border-bottom-right-radius: $border-radius; + top: 26rpx; + left: 26rpx; + font-size: $font-size-goods-tag; + } + + .goods-tag-img { + position: absolute; + border-top-left-radius: $border-radius; + width: 80rpx; + height: 80rpx; + top: 26rpx; + left: 26rpx; + z-index: 5; + overflow: hidden; + + image { + width: 100%; + height: 100%; + } + } + + .info-wrap { + flex: 1; + display: flex; + flex-direction: column; + width: calc(100% - 220rpx); + } + &.manage{ + .info-wrap { + width: calc(100% - 280rpx); + } + } + + .name-wrap { + flex: 1; + } + + .goods-name { + font-size: $font-size-base; + line-height: 1.3; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + height: 68rpx; + } + + .introduction { + line-height: 1; + margin-top: 10rpx; + } + + .discount-price { + display: inline-block; + font-weight: bold; + line-height: 1; + margin-top: 16rpx; + color: var(--price-color); + .unit { + margin-right: 6rpx; + } + } + + .pro-info { + display: flex; + margin-top: auto; + + .delete-price { + text-decoration:line-through; + flex: 1; + + .unit { + margin-right: 6rpx; + } + } + + & > view { + line-height: 1; + + &:nth-child(2) { + text-align: right; + } + } + } + + .member-price-tag { + display: inline-block; + width: 60rpx; + line-height: 1; + margin-left: 6rpx; + + image { + width: 100%; + max-height: 30rpx; + } + } + } + +} + +.bottom-wrap { + position: fixed; + z-index: 5; + width: 100vw; + height: 100rpx; + background: #fff; + bottom: var(--window-bottom); + overflow: hidden; + display: flex; + bottom: 0; + z-index: 9; + + .all-election { + flex: 1; + height: 100rpx; + position: relative; + display: inline-block; + + & > .iconfont { + font-size: 40rpx; + position: absolute; + top: 50%; + left: 30rpx; + transform: translateY(-50%); + } + & > .icon-yuan_checkbox { + color: $color-disabled; + } + + & > text { + margin-left: 56rpx; + line-height: 100rpx; + padding-left: 30rpx; + } + } + + .action-btn { + flex: 1; + width: 180rpx; + height: 100rpx; + line-height: 100rpx; + border-radius: 0; + margin: 0; + display: flex; + align-items: center; + justify-content: flex-end; + + button { + width: 180rpx; + height: 70rpx; + line-height: 70rpx; + } + } +} \ No newline at end of file diff --git a/pages_tool/member/public/css/invite_friends.scss b/pages_tool/member/public/css/invite_friends.scss new file mode 100644 index 0000000..7d215e8 --- /dev/null +++ b/pages_tool/member/public/css/invite_friends.scss @@ -0,0 +1,365 @@ +.invite_adv { + position: relative; + image { + height: 100%; + width: 100%; + } + .desc { + position: absolute; + top: 0; + right: 10rpx; + text-align: right; + color: #fff; + padding: 20rpx; + font-size: $font-size-tag; + .title_desc { + font-size: $font-size-tag; + } + .iconfont { + display: inline-block; + color: #fff; + font-size: $font-size-tag; + margin-right: 10rpx; + } + } + .time { + position: absolute; + bottom: 120rpx; + text-align: center; + width: 100%; + color: #fff; + } + .font { + position: absolute; + bottom: 220rpx; + text-align: center; + width: 333rpx; + height: 186rpx; + z-index: 5; + left: calc((100% - 333rpx) / 2); + } + .btn { + position: absolute; + background-size: cover; + background-repeat: no-repeat; + text-align: center; + width: 610rpx; + line-height: 112rpx; + height: 126rpx; + left: calc((100% - 610rpx) / 2); + color: #ff0029; + bottom: -24rpx; + font-size: 36rpx; + font-weight: bold; + } +} +.more_invite { + text-align: center; + padding: 30rpx; + display: flex; + align-items: center; + justify-content: center; +} +.content { + padding: 30rpx 30rpx 0 30rpx; + + .title { + font-size: $font-size-toolbar; + color: #000; + font-weight: 500; + } + .empty { + padding: 50rpx; + .tip { + font-size: $font-size-base; + color: #999999; + text-align: center; + } + } + .invitelist_block { + border: 2rpx solid $color-line; + border-radius: $border-radius; + margin-top: $margin-both; + background-color: #fff; + } + .invitelist { + .list-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: 30rpx 24rpx; + + .img { + width: 70rpx; + height: 70rpx; + border-radius: 70rpx; + border: 2rpx solid; + margin-right: $margin-updown; + overflow: hidden; + image { + width: 100%; + height: 70rpx; + overflow: hidden; + } + } + + .list-left { + flex: 1; + + .info { + display: flex; + + & > view { + flex: 1; + } + + .time { + text-align: right; + } + } + } + .prize { + } + } + } + .invite_active { + .list { + display: flex; + margin-top: 37rpx; + .item { + position: relative; + width: 232rpx; + height: 214rpx; + &.margin_right_none { + margin: 0; + } + image { + width: 100%; + height: 100%; + } + .desc { + position: absolute; + top: 0; + text-align: center; + width: 100%; + .price { + text-align: center; + background-image: -webkit-linear-gradient(bottom, #ff2440, #ff7b7b); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + font-size: 30rpx; + font-weight: 500; + line-height: 1; + text { + font-size: 50rpx; + } + } + .type { + font-size: $font-size-tag; + color: #666666; + } + } + } + .item:last-child { + margin-right: 0rpx !important; + } + } + .desc { + color: #999999; + padding: 30rpx 0; + + .title { + color: #999999; + font-weight: 400; + } + .desc_list { + view { + color: #999999; + display: flex; + text { + font-size: $font-size-activity-tag; + margin-right: 10rpx; + align-self: center; + } + } + } + } + } + .step { + display: flex; + align-items: center; + margin-top: 80rpx; + padding-bottom: 80rpx; + > view { + text-align: center; + width: 20%; + display: flex; + flex-direction: column; + + .img { + width: 56rpx; + height: 56rpx; + margin: auto; + image { + width: 100%; + height: 100%; + } + } + .text { + margin-top: 20rpx; + font-size: $font-size-tag; + color: $color-tip; + } + .jiantou { + width: 40rpx; + height: 24rpx; + margin: auto; + } + } + } +} +.invite-list{ + margin-top: 40rpx; +} +.share-popup, +.uni-popup__wrapper-box { + .share-title { + line-height: 60rpx; + font-size: $font-size-toolbar; + padding: 15rpx 0; + text-align: center; + } + + .share-content { + display: flex; + display: -webkit-flex; + -webkit-flex-wrap: wrap; + -moz-flex-wrap: wrap; + -ms-flex-wrap: wrap; + -o-flex-wrap: wrap; + flex-wrap: wrap; + padding: 15rpx; + + .share-box { + flex: 1; + text-align: center; + + .share-btn { + margin: 0; + padding: 0; + border: none; + line-height: 1; + height: auto; + text { + margin-top: 20rpx; + font-size: $font-size-tag; + display: block; + color: $color-title; + } + } + + .iconfont { + font-size: 80rpx; + line-height: initial; + } + .icon-pengyouquan,.icon-fuzhilianjie,.icon-share-friend { + color: #07c160; + } + } + } + + .share-footer { + height: 90rpx; + line-height: 90rpx; + border-top: 2rpx #f5f5f5 solid; + text-align: center; + color: #666; + } +} +.poster-layer { + .generate-poster { + padding: 40rpx 0; + .iconfont { + font-size: 80rpx; + color: #07c160; + line-height: initial; + } + > view { + text-align: center; + &:last-child { + margin-top: 20rpx; + } + } + } + .image-wrap { + width: 70%; + margin: 60rpx auto 40rpx auto; + box-shadow: 0 0 32rpx rgba(100, 100, 100, 0.3); + line-height: 1; + border-radius: 16rpx; + overflow: hidden; + + image { + width: 100%; + height: 100%; + height: 750rpx; + } + } + .msg { + padding: 40rpx; + } + .save { + text-align: center; + height: 80rpx; + line-height: 80rpx; + } + .close { + position: absolute; + top: 0; + right: 20rpx; + width: 40rpx; + height: 80rpx; + font-size: 50rpx; + } +} +/* 说明弹框 */ +.tips-layer { + background: #fff; + z-index: 999; + height: 40%; + width: 100%; + + .head { + position: relative; + } + + .title { + height: 80rpx; + line-height: 80rpx; + text-align: center; + font-size: $font-size-toolbar; + font-weight: 700; + } + + text { + position: absolute; + top: 8rpx; + right: 44rpx; + font-size: $font-size-toolbar; + font-weight: 500; + } + + .body { + width: 100%; + height: calc(100% - 80rpx); + overflow-y: scroll; + + .detail { + padding: 20rpx 30rpx; + + .font-size-base { + margin-bottom: 10rpx; + } + } + } +} \ No newline at end of file diff --git a/pages_tool/member/public/css/level.scss b/pages_tool/member/public/css/level.scss new file mode 100644 index 0000000..608ce3c --- /dev/null +++ b/pages_tool/member/public/css/level.scss @@ -0,0 +1,415 @@ +.member-level { + width: 100%; + min-height: 100vh; + position: relative; +} +.level-top { + width: 100%; + position: relative; + image { + width: 100%; + height: 400rpx; + position: absolute; + } +} +.banner-container { + width: 100vw; + position: relative; + left: 0; + top: 0; + + .memberInfo { + width: 100%; + height: 140rpx; + padding: 40rpx 30rpx 0; + display: flex; + align-items: center; + justify-content: space-between; + box-sizing: border-box; + image { + width: 100rpx; + height: 100rpx; + border-radius: 50%; + border: 4rpx solid #ffffff; + box-sizing: border-box; + } + .growth-rules { + position: absolute; + display: flex; + align-items: center; + color: #fff; + right: 40rpx; + font-size: 24rpx; + .iconfont{ + margin-right: 10rpx; + } + } + .member-desc { + width: calc(100% - 20rpx - 100rpx); + height: 100%; + padding: 13rpx 0; + box-sizing: border-box; + display: flex; + flex-direction: column; + align-items: flex-start; + justify-content: space-between; + view { + line-height: 1.4; + color: #ffffff; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + } + } + + .demand { + width: 100%; + padding: 0 $padding; + box-sizing: border-box; + .demand-title { + font-size: $font-size-toolbar; + font-weight: bold; + line-height: 1; + display: flex; + align-items: center; + image { + width: 39rpx; + height: 35rpx; + margin-right: 10rpx; + } + } + .demand-info { + padding: 10rpx 24rpx; + box-sizing: border-box; + display: flex; + flex-direction: column; + margin-top: 27rpx; + border-radius: 10rpx; + justify-content: space-between; + height: 150rpx; + background: #ffffff; + .info-title { + display: flex; + justify-content: space-between; + align-items: center; + text { + &:nth-child(1) { + color: #000; + font-size: $font-size-tag; + } + &:nth-child(2) { + color: #959595; + } + } + } + progress { + margin-top: 39rpx; + } + .info-size { + display: flex; + justify-content: space-between; + align-items: center; + font-size: $font-size-tag; + color: #959595; + } + } + } + + .uni-swiper-dots { + bottom: 30rpx !important; + } + + .image-container { + box-sizing: border-box; + width: 100%; + height: 100%; + display: flex; + image { + width: 100%; + height: 100%; + } + .slide-image { + width: 535rpx; + height: 300rpx; + z-index: 200; + display: flex; + justify-content: space-between; + align-items: center; + border-radius: 20rpx; + overflow: hidden; + position: relative; + + .info { + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + padding: 10rpx 0; + box-sizing: border-box; + position: absolute; + left: 0; + bottom: 0; + padding: 30rpx 40rpx; + box-sizing: border-box; + .level-detail { + font-size: $font-size-toolbar; + display: flex; + align-items: center; + } + .growr-name { + font-size: 24rpx; + margin-top: 30rpx; + } + .growr-value { + font-size: 40rpx; + } + .progress { + margin-top: 30rpx; + } + .residue-growr-value { + text-align: right; + font-size: 24rpx; + margin-top: 10rpx; + } + view { + color: #ffffff; + line-height: 1.3; + } + } + .now_growth { + margin-top: 20rpx; + } + .pic { + display: flex; + justify-content: center; + align-items: center; + + image { + width: 160rpx; + } + } + .isnow { + font-size: 20rpx; + color: #fff; + padding: 2rpx 4rpx; + line-height: 1; + margin-left: 10rpx; + border: 2rpx solid #fff; + border-radius: 4rpx; + } + } + } + + .item-left { + justify-content: flex-end; + padding: 56rpx 26rpx 0 0; + } + + .image-container-box .item-left { + justify-content: center; + padding: 56rpx 0 0 0; + } + + .item-right { + justify-content: flex-start; + padding: 56rpx 0 0 26rpx; + } + + .item-center { + justify-content: center; + padding: 56rpx 0 0 0; + } + + .member-equity { + background-color: #fff; + border-radius: 10rpx; + padding: 20rpx 30rpx 20rpx; + // padding: 20rpx 30rpx; + margin:$margin-updown $margin-both; + .gift-title { + font-size: 30rpx; + } + .equity-itme { + display: flex; + align-items: center; + image { + width: 60rpx; + height: 60rpx; + margin-right: 30rpx; + } + .equity-content { + padding: 20rpx 0; + line-height: 1; + &.active { + border-bottom: 2rpx solid #e5e5e5; + } + flex: 1; + display: flex; + flex-direction: column; + .equity-desc { + font-size: $font-size-activity-tag; + margin-top: 16rpx; + color: $color-tip; + } + } + } + } + + .member-gift { + background-color: #fff; + margin: $margin-updown $margin-both; + padding: 20rpx 30rpx; + border-radius: 10rpx; + .gift-title { + font-size: 30rpx; + } + .gift-itme { + display: flex; + align-items: center; + image { + width: 60rpx; + height: 60rpx; + margin-right: 30rpx; + } + .gift-content { + &.active { + border-bottom: 2rpx solid #e5e5e5; + } + padding: 20rpx 0; + line-height: 1; + flex: 1; + display: flex; + flex-direction: column; + .gift-desc { + font-size: 24rpx; + margin-top: 16rpx; + color: #999; + } + } + } + } + + .desc-wrap { + box-sizing: border-box; + width: 100%; + height: 98rpx; + padding: 24rpx 66rpx 0; + + .title { + width: 100%; + height: 42rpx; + line-height: 42rpx; + color: #222222; + font-size: $font-size-base; + font-family: 'PingFangTC-Regular'; + font-weight: 600; + text-align: left; + } + + .desc { + margin-top: 4rpx; + width: 100%; + height: 34rpx; + line-height: 34rpx; + color: #999999; + font-size: $font-size-tag; + font-family: 'PingFangTC-Regular'; + text-align: left; + } + } + + @keyframes descAnimation { + 0% { + opacity: 1; + } + + 25% { + opacity: 0.5; + } + + 50% { + opacity: 0; + } + + 75% { + opacity: 0.5; + } + + 100% { + opacity: 1; + } + } + + @-webkit-keyframes descAnimation { + 0% { + opacity: 1; + } + + 25% { + opacity: 0.5; + } + + 50% { + opacity: 0; + } + + 75% { + opacity: 0.5; + } + + 100% { + opacity: 1; + } + } +} +.coupon-popup-box { + background-color: #f7f7f7; + .coupon-popup-title { + text-align: center; + font-size: 32rpx; + line-height: 90rpx; + height: 90rpx; + display: block; + font-weight: bold; + position: relative; + border-bottom: 1rpx solid #eeeeee; + } + .iconfont { + position: absolute; + float: right; + right: 44rpx; + font-size: 40rpx; + font-weight: 500; + } + .coupon-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: 20rpx 30rpx; + margin-bottom: 20rpx; + background-color: #fff; + border-radius: 4rpx; + .coupon-name { + flex: 1; + display: flex; + flex-direction: column; + .desc { + margin-top: 20rpx; + font-size: $font-size-tag; + color: #ababab; + } + } + .coupon-price { + color: red; + text { + font-size: 70rpx; + } + } + } + .coupon-popup-content { + max-height: 390rpx; + padding: 20rpx; + box-sizing: border-box; + } +} diff --git a/pages_tool/member/public/css/point.scss b/pages_tool/member/public/css/point.scss new file mode 100644 index 0000000..c35d24f --- /dev/null +++ b/pages_tool/member/public/css/point.scss @@ -0,0 +1,208 @@ +.custom-navbar { + width: 100vw; + padding-bottom: 20rpx; + position: fixed; + left: 0; + top: 0; + z-index: 100; + background: unset; + + // #ifdef MP-WEIXIN + background-size: 100% 380rpx; + // #endif + + .navbar-wrap { + position: relative; + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 100%; + } + + .navbar-title { + color: #fff; + font-size: 36rpx; + font-weight: 600; + } + + .back { + position: absolute; + color: #fff; + left: 30rpx; + font-size: 40rpx; + } +} + +.custom-navbar-block { + padding-bottom: 20rpx; +} + + +.head-wrap { + width: 100vw; + background-size: 100%; + padding: 60rpx 68rpx 140rpx 68rpx; + box-sizing: border-box; + border-radius: 0 0 100% 100%/0 0 70rpx 70rpx; + overflow: hidden; + + // #ifdef MP + padding-top: 160rpx; + // #endif + + .title { + text-align: left; + line-height: 1; + color: #F6F6F6; + } + + .point { + font-size: 48rpx; + color: var(--btn-text-color); + text-align: left; + line-height: 1; + margin-bottom: 20rpx; + font-size: 64rpx; + } + + .flex-box { + display: flex; + margin-top: 56rpx; + + .flex-item { + flex: 1; + + .num { + font-size: 34rpx; + margin-bottom: 20rpx; + color: #fff; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + } + + view { + text-align: left; + color: #F6F6F6; + line-height: 1; + } + } + } +} + +.menu-wrap { + border-radius: 20rpx; + margin: 0 24rpx; + padding: 30rpx; + background: #fff; + display: flex; + transform: translateY(-90rpx); + + .menu-item { + flex: 1; + text-align: left; + display: flex; + align-items: center; + + .icon { + width: 88rpx; + height: 88rpx; + background: #F3F3F3; + border-radius: 20rpx; + display: flex; + align-items: center; + justify-content: center; + color: #fff; + margin-right: 24rpx; + + image { + width: 70%; + } + } + + .title { + font-size: 32rpx; + font-weight: bold; + color: #333333; + } + } +} + +.task-wrap { + background-color: #fff; + margin: 30rpx 24rpx; + border-radius: 18rpx; + padding: 32rpx; + transform: translateY(-90rpx); + + .title { + font-size: 32rpx; + text-align: left; + margin-bottom: 40rpx; + font-weight: bold; + } + + .task-item { + border-radius: $border-radius; + background: #fff; + display: flex; + align-items: center; + margin-bottom: 80rpx; + + &:last-child { + margin-bottom: 30rpx; + } + + .icon { + width: 62rpx; + height: 62rpx; + background: #F3F3F3; + border-radius: 20rpx; + display: flex; + align-items: center; + justify-content: center; + color: #fff; + } + + .iconfont { + font-size: 52rpx; + -webkit-background-clip: text !important; + -webkit-text-fill-color: transparent; + background: linear-gradient(135deg, #FE7849 0%, #FF1959 100%); + } + + .iconshangpin { + font-size: 48rpx; + } + + .wrap { + flex: 1; + padding-left: 26rpx; + + .title { + line-height: 1; + font-size: 28rpx; + font-weight: bold; + margin-bottom: 0; + } + + .desc { + line-height: 1; + margin-top: 10rpx; + } + } + + .btn { + height: 60rpx; + line-height: 60rpx; + border-radius: 60rpx; + text-align: center; + width: 140rpx; + color: #fff; + font-size: 26rpx; + font-weight: 600; + background: linear-gradient(135deg, #FE7849 0%, #FF1959 100%); + } + } +} \ No newline at end of file diff --git a/pages_tool/member/public/js/collection.js b/pages_tool/member/public/js/collection.js new file mode 100644 index 0000000..d2f50d4 --- /dev/null +++ b/pages_tool/member/public/js/collection.js @@ -0,0 +1,83 @@ +export default { + data() { + return { + collectionList: [], + isShowEmpty: false + }; + }, + methods: { + //跳转至详情页 + toDetail(e) { + this.$util.redirectTo("/pages/goods/detail", { + goods_id: e.goods_id + }); + }, + //请求数据 + getData(mescroll) { + this.isShowEmpty = false; + let url = "/api/goodscollect/page" + let that = this; + let array = [] + this.$api.sendRequest({ + url: url, + data: { + page_size: mescroll.size, + page: mescroll.num, + }, + async: false, + }).then((res) => { + let newArr = res.data.list; + for (var i = 0; i < newArr.length; i++) { + newArr[i].composite_score = Math.floor((parseFloat(newArr[i].shop_desccredit) + parseFloat( + newArr[i].shop_servicecredit) + + parseFloat(newArr[i].shop_deliverycredit)) / 3).toFixed(1); + } + array = array.concat(newArr); + //设置列表数据 + if (mescroll.num == 1) this.collectionList = []; //如果是第一页需手动制空列表 + this.collectionList = this.collectionList.concat(newArr); //追加新数据 + mescroll.endSuccess(array.length); + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + this.isShowEmpty = true; + }) + + }, + //监听下拉刷新,初始化页面数据 + listenRefresh(e) { + this.$refs.goodsRecommend.init(); + }, + //删除某一项 + deleteItem(e) { + this.$api.sendRequest({ + url: "/api/goodscollect/delete", + data: { + goods_id: e + }, + success: res => { + if (res.code == 0) { + this.$util.showToast({ + title: "删除成功" + }) + let array = this.collectionList; + let newArray = array.filter((v) => { + return v.goods_id != e; + }) + this.collectionList = newArray; + } else { + this.$util.showToast({ + title: res.message + }) + } + } + }) + }, + imageError(index) { + this.collectionList[index].logo = this.$util.getDefaultImage().goods; + this.$forceUpdate(); + }, + goodsImageError(index) { + this.collectionList[index].sku_image = this.$util.getDefaultImage().goods; + this.$forceUpdate(); + } + } +}; diff --git a/pages_tool/member/public/js/info.js b/pages_tool/member/public/js/info.js new file mode 100644 index 0000000..a03cb1b --- /dev/null +++ b/pages_tool/member/public/js/info.js @@ -0,0 +1,965 @@ +import validate from '@/common/js/validate.js'; +export default { + data() { + return { + registerConfig: {}, + indent: 'all', + customNavTitle: "", + memberInfo: { + headimg: '' + }, + formData: { + userHeadImg: '', + number: '', //账号 + nickName: '', //昵称 + sex: '', //性别 + realName: '', //真实姓名 + birthday: '', //生日 + currentPassword: '', //当前密码 + newPassword: '', //新密码 + confirmPassword: '', //确认密码 + mobile: '', //手机号 + mobileVercode: '', //手机验证码 + mobileDynacode: '', //手机动态验证吗 + mobileCodeText: "", + username: '', + provinceId: 0, + cityId: 0, + districtId: 0, + fullAddress: '', + address: '' + }, + memberInfoformData: { + userHeadImg: '', + number: '', //账号 + nickName: '', //昵称 + sex: '', //性别 + realName: '', //真实姓名 + birthday: '', //生日 + currentPassword: '', //当前密码 + newPassword: '', //新密码 + confirmPassword: '', //确认密码 + mobile: '', //手机号 + mobileVercode: '', //手机验证码 + mobileDynacode: '', //手机动态验证吗 + mobileCodeText: "", + }, + langList: [], + langIndex: 0, + seconds: 120, + timer: null, + isSend: false, + captcha: { + id: '', + img: '' + }, + isIphoneX: false, + items: [{ + value: '0', + name: '未知' + }, + { + value: '1', + name: '男', + checked: 'true' + }, + { + value: '2', + name: '女' + } + ], + current: 0, + memberConfig: { + is_audit: 0, + is_enable: 0 + }, + defaultRegions: [] + }; + }, + onLoad(option) { + + this.formData.mobileCodeText = this.$lang('findanimateCode'); + if (option.back) { + this.back = option.back; + } + this.getCaptcha(); + + if (option.action) { + this.indent = option.action; + this.setNavbarTitle() + } + + this.getRegisterConfig(); + this.isIphoneX = this.$util.uniappIsIPhoneX() + this.initLang(); + this.getMemberConfig(); + }, + onShow() { + if (!uni.getStorageSync('token')) { + setTimeout(() => { + this.$refs.login.open('/pages_tool/member/info'); + }); + } else { + this.getInfo(); + } + }, + onHide() { + this.seconds = 120; + this.formData.mobileCodeText = '获取动态码'; + this.isSend = false; + clearInterval(this.timer); + }, + watch: { + seconds(value) { + if (value == 0) { + this.seconds = 120; + this.formData.mobileCodeText = '获取动态码'; + this.isSend = false; + clearInterval(this.timer); + } + }, + storeToken: function(nVal, oVal) { + if (nVal) { + this.getInfo(); + } + } + }, + computed: { + startDate() { + return this.getDate('start'); + }, + endDate() { + return this.getDate('end'); + }, + storeToken() { + return this.$store.state.token; + } + }, + methods: { + // 初始化语言 + initLang() { + //获取语言列表 + this.langList = this.$langConfig.list(); + if (!uni.getStorageSync("lang")) { + this.langIndex = 0; + } else { + for (let i = 0; i < this.langList.length; i++) { + if (this.langList[i].value == uni.getStorageSync("lang")) { + this.langIndex = i; + break; + } + } + } + }, + setNavbarTitle() { + let title = '个人资料'; + switch (this.indent) { + case 'name': + title = this.$lang('modifyNickname'); + break; + case 'realName': + title = this.$lang('realName'); + break; + case 'sex': + title = this.$lang('sex'); + break; + case 'birthday': + title = this.$lang('birthday'); + break; + case 'password': + title = this.$lang('password'); + break; + case 'mobile': + title = this.$lang('mobile'); + break; + } + uni.setNavigationBarTitle({ + title: title + }); + }, + // 初始化用户信息 + getInfo() { + this.$api.sendRequest({ + url: '/api/member/info', + success: res => { + if (res.code == 0) { + this.memberInfo = res.data; + this.memberInfoformData.userHeadImg = this.memberInfo.headimg; + this.memberInfoformData.number = this.memberInfo.username; //账号 + this.memberInfoformData.nickName = this.memberInfo.nickname; //昵称 + this.memberInfoformData.realName = this.memberInfo.realname ? this.memberInfo + .realname : '请输入真实姓名'; //真实姓名 + this.memberInfoformData.sex = this.memberInfo.sex == 0 ? '未知' : this.memberInfo + .sex == 1 ? '男' : '女'; //性别 + this.memberInfoformData.birthday = this.memberInfo.birthday ? this.$util + .timeStampTurnTime(this.memberInfo.birthday, + 'YYYY-MM-DD') : '请选择生日'; //生日 + this.memberInfoformData.mobile = this.memberInfo.mobile; //手机号 + this.formData.username = this.memberInfo.username; //用户名 + this.formData.nickName = this.memberInfo.nickname; //昵称 + this.formData.realName = this.memberInfo.realname; //真实姓名 + this.formData.sex = this.memberInfo.sex; //性别 + this.formData.birthday = this.memberInfo.birthday ? this.$util.timeStampTurnTime( + this.memberInfo.birthday, + 'YYYY-MM-DD') : ''; //生日 + this.formData.provinceId = this.memberInfo.province_id; + this.formData.cityId = this.memberInfo.city_id; + this.formData.districtId = this.memberInfo.district_id; + this.formData.fullAddress = this.memberInfo.full_address; + this.formData.address = this.memberInfo.address; + if (this.memberInfo.full_address) this.defaultRegions = [this.memberInfo + .province_id, this.memberInfo.city_id, this.memberInfo.district_id + ]; + } + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + }, + fail: res => { + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + } + }); + }, + // 切换编辑项 + modifyInfo(action) { + switch (action) { + case 'cancellation': + this.getCancelStatus(); + break; + case 'language': + let newArray = []; + for (let i = 0; i < this.langList.length; i++) { + newArray.push(this.langList[i].name) + } + uni.showActionSheet({ + itemList: newArray, + success: function(res) { + if (vm.langIndex != res.tapIndex) { + vm.$langConfig.change(vm.langList[res.tapIndex].value) + } + } + }); + break; + default: + this.$util.redirectTo('/pages_tool/member/info_edit', { + action + }); + } + }, + getCancelStatus() { + this.$api.sendRequest({ + url: '/membercancel/api/membercancel/info', + success: res => { + if (res.code >= 0) { + if (res.data) { + if (res.data.status == 0) { + this.$util.redirectTo('/pages_tool/member/cancelstatus', { + back: '/pages_tool/member/info' + }); + } else if (res.data.status == 1) { + this.$util.redirectTo('/pages_tool/member/cancelsuccess', { + back: '/pages_tool/member/info' + }); + } else { + this.$util.redirectTo('/pages_tool/member/cancelrefuse', { + back: '/pages_tool/member/info' + }); + } + } else { + this.$util.redirectTo('/pages_tool/member/cancellation', { + back: '/pages_tool/member/info' + }); + } + } + } + }); + }, + // 导航返回 + NavReturn() { + uni.navigateBack({ + delta: 1 + }) + }, + // 获取验证码 + getCaptcha() { + this.$api.sendRequest({ + url: '/api/captcha/captcha', + data: { + captcha_id: this.captcha.id + }, + success: res => { + if (res.code >= 0) { + this.captcha = res.data; + this.captcha.img = this.captcha.img.replace(/\r\n/g, ''); + } + } + }); + }, + // 退出登录 + logout() { + uni.showModal({ + title: '提示', + content: '确定要退出登录吗', + success: (res) => { + if (res.confirm) { + uni.removeStorage({ + key: 'token', + success: res => { + uni.removeStorageSync('userInfo'); + uni.removeStorageSync('token'); + uni.removeStorageSync('authInfo'); + //购物车数量 + this.$store.dispatch('getCartNumber').then((e) => {}) + this.$util.redirectTo('/pages/member/index'); + } + }); + } + } + }); + }, + headImage() { + this.$util.redirectTo("/pages_tool/member/modify_face"); + }, + // 检测手机是否已绑定 + async testBinding(type) { + var res = await this.checkMobile(); + return res; + }, + //获取注销的配置信息 + getMemberConfig() { + this.$api.sendRequest({ + url: '/membercancel/api/membercancel/config', + success: res => { + if (res.code >= 0) { + this.memberConfig = res.data + } + } + }); + + }, + save(type) { + switch (type) { + case 'username': + this.modifyUserName(); + break; + case 'name': + this.modifyNickName(); + break; + case 'realName': + this.modifyRealName(); + break; + case 'sex': + this.modifySex(); + break; + case 'birthday': + this.modifyBirthday(); + break; + case 'password': + this.modifyPassword(); + break; + case 'mobile': + this.modifyMobile(); + break; + case 'address': + this.modifyAddress(); + break; + } + }, + + // ------------------------修改用户名------------------------------ + modifyUserName() { + if (this.formData.username == this.memberInfo.username) { + this.$util.showToast({ + title: this.$lang('alikeusername') + }); + return; + } + var rule = [{ + name: 'username', + checkType: 'required', + errorMsg: this.$lang('noEmityUsername') + }]; + if (!rule.length) return; + var checkRes = validate.check(this.formData, rule); + if (checkRes) { + this.$api.sendRequest({ + url: '/api/member/modifyusername', + data: { + username: this.formData.username + }, + success: res => { + if (res.code == 0) { + this.$util.showToast({ + title: this.$lang("updateSuccess") + }); + this.NavReturn(); + } else { + this.$util.showToast({ + title: res.message + }); + } + } + }); + } else { + this.$util.showToast({ + title: validate.error + }); + } + }, + // ------------------------修改昵称------------------------------ + + modifyNickName() { + if (this.formData.nickName == this.memberInfo.nickname) { + this.$util.showToast({ + title: this.$lang('alikeNickname') + }); + return; + } + var rule = [{ + name: 'nickName', + checkType: 'required', + errorMsg: this.$lang('noEmityNickname') + }]; + if (!rule.length) return; + var checkRes = validate.check(this.formData, rule); + if (checkRes) { + this.$api.sendRequest({ + url: '/api/member/modifynickname', + data: { + nickname: this.formData.nickName + }, + success: res => { + if (res.code == 0) { + this.$util.showToast({ + title: this.$lang("updateSuccess") + }); + this.NavReturn(); + } else { + this.$util.showToast({ + title: res.message + }); + } + } + }); + } else { + this.$util.showToast({ + title: validate.error + }); + } + }, + + // ------------------------修改真实姓名------------------------------ + modifyRealName() { + if (this.formData.realName == this.memberInfo.realname && this.memberInfo.realname) { + this.$util.showToast({ + title: '与原真实姓名一致,无需修改' + }); + return; + } + var rule = [{ + name: 'realName', + checkType: 'required', + errorMsg: '真实姓名不能为空' + }]; + if (!rule.length) return; + var checkRes = validate.check(this.formData, rule); + if (checkRes) { + this.$api.sendRequest({ + url: '/api/member/modifyrealname', + data: { + realname: this.formData.realName + }, + success: res => { + if (res.code == 0) { + this.$util.showToast({ + title: this.$lang("updateSuccess") + }); + this.NavReturn(); + } else { + this.$util.showToast({ + title: res.message + }); + } + } + }); + } else { + this.$util.showToast({ + title: validate.error + }); + } + }, + + // ------------------------修改性别------------------------------ + radioChange: function(evt) { + for (let i = 0; i < this.items.length; i++) { + if (this.items[i].value === evt.target.value) { + this.formData.sex = i; + break; + } + } + }, + + modifySex() { + this.$api.sendRequest({ + url: '/api/member/modifysex', + data: { + sex: this.formData.sex + }, + success: res => { + if (res.code == 0) { + this.$util.showToast({ + title: this.$lang("updateSuccess") + }); + this.NavReturn(); + } else { + this.$util.showToast({ + title: res.message + }); + } + } + }); + }, + + // ------------------------修改生日------------------------------ + + bindDateChange: function(e) { + this.formData.birthday = e.target.value + }, + + getDate(type) { + const date = new Date(); + let year = date.getFullYear(); + let month = date.getMonth() + 1; + let day = date.getDate(); + + if (type === 'start') { + year = year - 60; + } else if (type === 'end') { + year = year + 2; + } + month = month > 9 ? month : '0' + month;; + day = day > 9 ? day : '0' + day; + return `${year}-${month}-${day}`; + }, + + modifyBirthday() { + if (this.formData.birthday.length == 0) { + this.$util.showToast({ + title: '请选择生日' + }); + return; + } + this.$api.sendRequest({ + url: '/api/member/modifybirthday', + data: { + birthday: this.$util.timeTurnTimeStamp(this.formData.birthday) + }, + success: res => { + if (res.code == 0) { + this.$util.showToast({ + title: this.$lang("updateSuccess") + }); + this.NavReturn(); + } else { + this.$util.showToast({ + title: res.message + }); + } + } + }); + }, + + // ------------------------修改密码------------------------------ + /** + * 获取注册配置 + */ + getRegisterConfig() { + this.$api.sendRequest({ + url: '/api/register/config', + success: res => { + if (res.code >= 0) { + this.registerConfig = res.data.value; + } + } + }); + }, + modifyPassword() { + if (this.memberInfo.password) { + var rule = [{ + name: 'currentPassword', + checkType: 'required', + errorMsg: this.$lang("pleaseInputOldPassword") + }, + { + name: 'newPassword', + checkType: 'required', + errorMsg: this.$lang("pleaseInputNewPassword") + } + ]; + } else { + var rule = [{ + name: 'mobileVercode', + checkType: 'required', + errorMsg: this.$lang("confirmCodeInput") + }, + { + name: 'mobileDynacode', + checkType: 'required', + errorMsg: this.$lang("animateCodeInput") + }, + { + name: 'newPassword', + checkType: 'required', + errorMsg: this.$lang("pleaseInputNewPassword") + } + ]; + } + + let regConfig = this.registerConfig; + if (regConfig.pwd_len > 0) { + rule.push({ + name: 'newPassword', + checkType: 'lengthMin', + checkRule: regConfig.pwd_len, + errorMsg: '新密码长度不能小于' + regConfig.pwd_len + '位' + }); + } + if (regConfig.pwd_complexity) { + let passwordErrorMsg = '密码需包含', + reg = ''; + if (regConfig.pwd_complexity.indexOf('number') != -1) { + reg += '(?=.*?[0-9])'; + passwordErrorMsg += '数字'; + } + if (regConfig.pwd_complexity.indexOf('letter') != -1) { + reg += '(?=.*?[a-z])'; + passwordErrorMsg += '、小写字母'; + } + if (regConfig.pwd_complexity.indexOf('upper_case') != -1) { + reg += '(?=.*?[A-Z])'; + passwordErrorMsg += '、大写字母'; + } + if (regConfig.pwd_complexity.indexOf('symbol') != -1) { + reg += '(?=.*?[#?!@$%^&*-])'; + passwordErrorMsg += '、特殊字符'; + } + rule.push({ + name: 'newPassword', + checkType: 'reg', + checkRule: reg, + errorMsg: passwordErrorMsg + }); + } + var checkRes = validate.check(this.formData, rule); + if (checkRes) { + if (this.formData.currentPassword == this.formData.newPassword) { + this.$util.showToast({ + title: '新密码不能与原密码相同' + }); + return; + } + if (this.formData.newPassword != this.formData.confirmPassword) { + this.$util.showToast({ + title: '两次密码不一致' + }); + return; + } + this.$api.sendRequest({ + url: '/api/member/modifypassword', + data: { + new_password: this.formData.newPassword, + old_password: this.formData.currentPassword, + code: this.formData.mobileDynacode, + key: uni.getStorageSync("password_mobile_key"), + }, + success: res => { + if (res.code == 0) { + this.$util.showToast({ + title: this.$lang('updateSuccess') + }); + this.NavReturn(); + uni.removeStorageSync('password_mobile_key'); + } else { + this.$util.showToast({ + title: res.message + }); + this.getCaptcha(); + } + } + }); + } else { + this.$util.showToast({ + title: validate.error + }); + } + }, + + // ------------------------修改手机号------------------------------ + // 验证手机号 + vertifyMobile() { + var rule = [{ + name: 'mobile', + checkType: 'required', + errorMsg: '请输入手机号' + }, { + name: 'mobile', + checkType: 'phoneno', + errorMsg: '请输入正确的手机号' + }]; + var checkRes = validate.check(this.formData, rule); + if (!checkRes) { + this.$util.showToast({ + title: validate.error + }); + return false; + } + return true; + }, + // 检测手机号是否存在 + async checkMobile() { + if (!this.vertifyMobile()) return; + let res = await this.$api.sendRequest({ + url: '/api/member/checkmobile', + data: { + mobile: this.formData.mobile + }, + async: false + }); + if (res.code != 0) { + this.$util.showToast({ + title: res.message + }); + return false; + } + return true; + }, + + // 发送短信动态码 + async bindMoblieCode() { + if (this.seconds != 120) return; + var rule = [{ + name: 'mobile', + checkType: 'phoneno', + errorMsg: this.$lang("surePhoneNumber") + }, + { + name: 'mobileVercode', + checkType: 'required', + errorMsg: this.$lang("confirmCodeInput") + }, + ]; + + var checkRes = validate.check(this.formData, rule); + + if (checkRes && !this.isSend) { + this.isSend = true; + this.$api.sendRequest({ + url: '/api/member/bindmobliecode', + data: { + mobile: this.formData.mobile, + captcha_id: this.captcha.id, + captcha_code: this.formData.mobileVercode + }, + success: res => { + let data = res.data; + if (data.key) { + if (this.seconds == 120 && this.timer == null) { + this.timer = setInterval(() => { + this.seconds--; + this.formData.mobileCodeText = '已发送(' + this.seconds + 's)'; + }, 1000); + } + uni.setStorageSync('mobile_key', data.key); + } else { + this.$util.showToast({ + title: res.message + }); + this.isSend = false; + } + }, + fail: res => { + this.isSend = false; + this.getCaptcha(); + } + }); + } else { + this.$util.showToast({ + title: validate.error ? validate.error : '请勿重复点击' + }); + } + }, + async modifyMobile() { + + var mobileRule = [{ + name: 'mobile', + checkType: 'phoneno', + errorMsg: this.$lang("surePhoneNumber") + }, + { + name: 'mobileVercode', + checkType: 'required', + errorMsg: this.$lang("confirmCodeInput") + }, + { + name: 'mobileDynacode', + checkType: 'required', + errorMsg: this.$lang("animateCodeInput") + }, + ]; + var checkRes = validate.check(this.formData, mobileRule); + + if (checkRes) { + if (this.formData.mobile == this.memberInfo.mobile) { + this.$util.showToast({ + title: this.$lang("alikePhone") + }); + return; + } + this.$api.sendRequest({ + url: '/api/member/modifymobile', + data: { + mobile: this.formData.mobile, + captcha_id: this.captcha.id, + captcha_code: this.formData.mobileVercode, + code: this.formData.mobileDynacode, + key: uni.getStorageSync("mobile_key"), + }, + success: res => { + if (res.code == 0) { + this.$util.showToast({ + title: this.$lang("updateSuccess") + }); + if (this.back) { + this.$util.redirectTo('/pages_tool/member/pay_password', { + 'back': this.back + }, 'redirectTo') + } else { + this.NavReturn(); + } + } else { + this.$util.showToast({ + title: res.message + }); + this.getCaptcha(); + } + }, + fail: res => { + this.isSend = false; + this.getCaptcha(); + } + }); + } else { + this.$util.showToast({ + title: validate.error + }); + } + }, + /** + * 修改密码发送动态码 + */ + passwordMoblieCode() { + if (this.seconds != 120) return; + + if (this.formData.mobileVercode == '') { + this.$util.showToast({ + title: this.$lang("confirmCodeInput") + }); + return; + } + + if (!this.isSend) { + this.isSend = true; + this.$api.sendRequest({ + url: '/api/member/pwdmobliecode', + data: { + captcha_id: this.captcha.id, + captcha_code: this.formData.mobileVercode + }, + success: res => { + let data = res.data; + if (data.key) { + if (this.seconds == 120 && this.timer == null) { + this.timer = setInterval(() => { + this.seconds--; + this.formData.mobileCodeText = '已发送(' + this.seconds + 's)'; + }, 1000); + } + uni.setStorageSync('password_mobile_key', data.key); + } else { + this.$util.showToast({ + title: res.message + }); + this.isSend = false; + } + }, + fail: res => { + this.isSend = false; + this.getCaptcha(); + } + }); + } else { + this.$util.showToast({ + title: '请勿重复点击' + }); + } + }, + modifyAddress() { + var rule = [{ + name: 'fullAddress', + checkType: 'required', + errorMsg: '请选择所在地区' + }, + { + name: 'address', + checkType: 'required', + errorMsg: '请输入详细地址' + } + ]; + if (!rule.length) return; + var checkRes = validate.check(this.formData, rule); + if (checkRes) { + this.$api.sendRequest({ + url: '/api/member/modifyaddress', + data: { + province_id: this.formData.provinceId, + city_id: this.formData.cityId, + district_id: this.formData.districtId, + address: this.formData.address, + full_address: this.formData.fullAddress + }, + success: res => { + if (res.code == 0) { + this.$util.showToast({ + title: this.$lang("updateSuccess") + }); + this.NavReturn(); + } else { + this.$util.showToast({ + title: res.message + }); + } + } + }); + } else { + this.$util.showToast({ + title: validate.error + }); + } + }, + initFormData() { + this.formData.currentPassword = ''; + this.formData.newPassword = ''; + this.formData.confirmPassword = ''; + this.formData.mobileVercode = ''; + this.formData.mobileDynacode = ''; + this.formData.mobile = ''; + }, + handleGetRegions(regions) { + this.formData.fullAddress = ''; + this.formData.fullAddress += regions[0] != undefined ? regions[0].label : ''; + this.formData.fullAddress += regions[1] != undefined ? '-' + regions[1].label : ''; + this.formData.fullAddress += regions[2] != undefined ? '-' + regions[2].label : ''; + this.formData.provinceId = regions[0] ? regions[0].value : 0; + this.formData.cityId = regions[1] ? regions[1].value : 0; + this.formData.districtId = regions[2] ? regions[2].value : 0; + } + } +}; diff --git a/pages_tool/member/public/js/invite_friends.js b/pages_tool/member/public/js/invite_friends.js new file mode 100644 index 0000000..71d4cd6 --- /dev/null +++ b/pages_tool/member/public/js/invite_friends.js @@ -0,0 +1,117 @@ +export default { + methods: { + //获取邀请列表 + getList() { + this.$api.sendRequest({ + url: '/memberrecommend/api/memberrecommend/lists', + data: { + page: this.page, + page_size: this.page_size + }, + success: res => { + this.inviteList = this.inviteList.concat(res.data.list); + this.total_num = res.data.page_count; + } + }); + }, + moreList() { + this.page++; + this.isClick = false; + if (this.page < this.total_num) { + this.getList(); + this.isClick = true; + } else if (this.page == this.total_num) { + this.getList(); + } + }, + getBaseInfo() { + this.$api.sendRequest({ + url: '/memberrecommend/api/memberrecommend/info', + success: res => { + if (res.code == 0) { + this.info = res.data; + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + } + } + }); + }, + openSharePopup() { + this.$refs.sharePopup.open(); + }, + // 关闭分享弹出层 + closeSharePopup() { + this.$refs.sharePopup.close(); + }, + // 打开规则说明弹出层 + openRulePopup() { + this.$refs.rulePopup.open(); + }, + // 打开规则说明弹出层 + closeRulePopup() { + this.$refs.rulePopup.close(); + }, + copyUrl() { + let text = this.$config.h5Domain + '/pages/index/index'; + if (this.memberId) text += '?source_member=' + this.memberId; + this.$util.copy(text, () => { + this.closeSharePopup(); + }); + }, + // 打开海报弹出层 + openPosterPopup() { + this.getPoster(); + this.$refs.sharePopup.close(); + this.$refs.posterPopup.open(); + }, + // 关闭海报弹出层 + closePosterPopup() { + this.$refs.posterPopup.close(); + }, + //生成海报 + getPoster() { + //活动海报信息 + let qrcode_param = { + source_member: this.memberId + }; + this.$api.sendRequest({ + url: "/memberrecommend/api/memberrecommend/poster", + data: { + page: '/pages/index/index', + qrcode_param: JSON.stringify(qrcode_param) + }, + success: res => { + if (res.code == 0) { + this.poster = res.data.path + "?time=" + new Date().getTime(); + } else { + this.posterMsg = res.message; + } + } + }); + }, + savePoster() { + let url = this.$util.img(this.poster); + uni.downloadFile({ + url: url, + success: (res) => { + if (res.statusCode === 200) { + uni.saveImageToPhotosAlbum({ + filePath: res.tempFilePath, + success: () => { + this.$util.showToast({ + title: "保存成功" + }); + }, + fail: () => { + this.$util.showToast({ + title: "保存失败,请稍后重试" + }); + } + }); + } + }, + fail: (e) => { + } + }); + } + } +} \ No newline at end of file diff --git a/pages_tool/member/public/js/signin.js b/pages_tool/member/public/js/signin.js new file mode 100644 index 0000000..7c62267 --- /dev/null +++ b/pages_tool/member/public/js/signin.js @@ -0,0 +1,234 @@ +import Calendar from '@/components/uni-calendar/util.js'; +export default { + data() { + return { + rule: [ + {} + ], + hasSign: 0, //今天是否签到 + signDaysSeries: 0, //连续签到次数 + timestamp: "", //当前的时间戳 + time: "", //当前日期 + MonthData: [], //本月日期信息 + signList: [], + back: '', //返回页 + redirect: '', //返回方式 + successTip: {}, + startDate: null, + endDate: null, + isActive: "", //判断点击 + signState: 1, + headimg: '', + point: 0, + growth: 0, + signPoint: 0, + signGrowth: 0, + rewardRuleDay: [], + cycle: 0, + reward:{}, + fixBtnShow: false, + }; + }, + methods: { + // 获取签到累积积分 + getSignPointData() { + this.$api.sendRequest({ + url: '/api/memberaccount/sum', + data: { + account_type: 'point', + from_type: 'signin' + }, + success: res => { + if (res.code == 0) { + this.signPoint = res.data; + } + } + }); + }, + // 获取签到累积成长值 + getSignGrowthData() { + this.$api.sendRequest({ + url: '/api/memberaccount/sum', + data: { + account_type: 'growth', + from_type: 'signin' + }, + success: res => { + if (res.code == 0) { + this.signGrowth = res.data; + } + } + }); + }, + // 签到是否开启 + getSignState() { + this.$api.sendRequest({ + url: '/api/membersignin/getSignStatus', + success: res => { + if (res.code == 0) { + this.signState = res.data.is_use; + } + } + }); + }, + navigateBack() { + if (this.back != '') { + this.$util.redirectTo(this.back, {}, this.redirect); + } else { + this.$util.redirectTo('/pages/member/index'); + } + }, + //获取rule + getRule() { + this.rewardRuleDay = []; + this.$api.sendRequest({ + url: '/api/membersignin/award', + success: res => { + if (res.code == 0) { + this.cycle = res.data.cycle || 0; + this.rule = res.data.reward || []; + let default_point = 0; + if (this.rule.length > 1) { + this.rule.forEach((item, index)=>{ + if (index) this.rewardRuleDay.push(parseInt(item.day)); + if(item.day == 1) default_point = item.point; + + this.reward[item.day] = item.point; + }) + } + + //展示7天 + var showSignDays = []; + var start_day = 1; + var end_day = 7; + var total_day = res.data.cycle; + if(this.signDaysSeries > 5){ + start_day = this.signDaysSeries - 5; + } + if(total_day >= (this.signDaysSeries + 1)){ + end_day = this.signDaysSeries + 1; + } + if(this.signDaysSeries <= 5){ + end_day = 8-start_day; + } + + if((end_day - start_day) < 7 && total_day >= start_day+6){ + end_day = start_day+6; + } + if(total_day == this.signDaysSeries){ + start_day = this.signDaysSeries-6; + end_day = this.signDaysSeries; + } + + for (let i = 1; i <= res.data.cycle; i++) { + if(i >= start_day && i <= end_day){ + showSignDays.push({ + day: i, + is_last:0, + point:default_point + }) + } + } + + // for (let i = 1; i <= res.data.cycle; i++) { + // if((i >= this.signDaysSeries || (res.data.cycle - i) < 7) && showSignDays.length < 7){ + // showSignDays.push({ + // day: i, + // is_last:0, + // point:default_point + // }) + // } + // } + + if(showSignDays&&showSignDays.length)showSignDays[showSignDays.length - 1]['is_last'] = 1; + + for(let i in showSignDays){ + let item = showSignDays[i]; + if(this.$util.inArray(item.day, this.rewardRuleDay) != -1){ + showSignDays[i]['point'] = parseInt(this.reward[item.day]) + parseInt(default_point); + } + } + + this.showSignDays = showSignDays; + } + } + }); + }, + //获取连续签到次数 + getSignInfo() { + this.$api.sendRequest({ + url: '/api/member/info', + success: res => { + if (res.code == 0) { + this.timestamp = res.timestamp; + this.time = this.$util.timeStampTurnTime(this.timestamp).slice(0, 10) + this.headimg = res.data.headimg; + this.signDaysSeries = res.data.sign_days_series; + this.getRule(); + this.$refs.loadingCover.hide(); + } + } + }); + }, + //判断当前是否签到 + getIsSign() { + this.$api.sendRequest({ + url: '/api/membersignin/issign', + success: res => { + if (res.code == 0) { + this.hasSign = res.data; + this.getSignInfo(); + this.getSignPointData(); + this.getSignGrowthData(); + } + } + }); + }, + //签到 + sign() { + if (this.signState == 0) { + this.$util.showToast({ + title: '签到未开启' + }) + } + + if (!this.hasSign && this.signState == 1) { + this.$api.sendRequest({ + url: '/api/membersignin/signin', + success: res => { + if (res.code == 0) { + this.successTip = res.data; + this.$refs.uniPopup.open() + this.getSignInfo(); + this.getSignPointData(); + this.getSignGrowthData(); + this.hasSign = 1; + this.signDaysSeries = this.signDaysSeries + 1; + } else { + this.$util.showToast({ + title: res.message + }) + } + } + }); + } + }, + close() { + this.$refs.uniPopup.close() + } + }, + computed:{ + pointTomorrow: function(){ + var signDaysSeries = this.signDaysSeries + 1; + var point = this.rule[0].point ? parseInt(this.rule[0].point) : 0; + for (let i = 1; i < this.rule.length; i++) { + let reward = this.rule[i]; + if (reward.day == signDaysSeries && reward.point) point += parseInt(reward.point); + } + return point; + }, + showDay: function(){ + return parseInt(this.signDaysSeries / 7) * 7 + 1; + } + } +}; diff --git a/pages_tool/member/signin.vue b/pages_tool/member/signin.vue new file mode 100644 index 0000000..49a9a70 --- /dev/null +++ b/pages_tool/member/signin.vue @@ -0,0 +1,676 @@ + ++ + ++ ++ ++ {{ date }} + ++ + ++ +{{ pointType[pointIndex].label }} ++ + ++ ++ ++ ++ ++ ++ +{{ item.type_name }} ++ +{{ $util.timeStampTurnTime(item.create_time) }} ++{{ parseInt(item.account_data) }} +{{ parseInt(item.account_data) }} ++ ++ + + + + + + + + diff --git a/pages_tool/member/withdrawal.vue b/pages_tool/member/withdrawal.vue new file mode 100644 index 0000000..ad9603e --- /dev/null +++ b/pages_tool/member/withdrawal.vue @@ -0,0 +1,172 @@ + ++ + ++ + + + ++ + + ++ + ++ + ++ + ++ + ++ 已连续签到 + +{{ signDaysSeries }} + 天 +{{ hasSign ? '明日' : '今日' }}签到可获得{{ pointTomorrow }}积分 ++ ++ + + +连续签到领好礼 ++ ++ ++ ++ ++ +第{{ item.day }}天 ++ {{ item.point }}积分 ++ ++ +第{{ item.day }}天 +{{ item.point }}积分 ++ + + +我的签到 + ++ ++ ++ 积分:{{ signPoint }} +累计获得积分 ++ ++ 成长值:{{ signGrowth }} +累计获得成长值 ++ +签到规则 + ++ ++ + +1. 每日签到奖励: +{{ index + 1 + '. 连续签到' + item.day + '天额外奖励:' }} +{{ item.point + '积分 ' }} +{{ item.growth + '成长值' }} +{{ rule.length + 1 }}.连续签到{{ cycle }}天为一个周期,连续签到天数签满一个周期或者签到中断,将清空连签天数重新计算签到天数 ++ {{ rule.length + 2 }}. 用户可在签到页每日签到一次,签到后可获得每日签到奖励;连续签到天数达到连签奖励的当天,可额外获得连签奖励 + ++ + + ++ ++ ++ + + ++ ++ +恭喜您获得 ++ +{{ successTip.point }} + 积分 ++ +{{ successTip.growth }} + 成长值 +连续签到可获得更多奖励! +知道了 ++ + ++ ++ 首页 ++ + ++ 我的 ++ + +快捷 +导航 ++ + ++ + + + + + + + + + + diff --git a/pages_tool/member/withdrawal_detail.vue b/pages_tool/member/withdrawal_detail.vue new file mode 100644 index 0000000..7c3d0fa --- /dev/null +++ b/pages_tool/member/withdrawal_detail.vue @@ -0,0 +1,132 @@ + ++ ++ ++ ++ ++ ++ ++ +{{ item.transfer_type_name }} ++ +{{ $util.timeStampTurnTime(item.apply_time) }} ++ +¥{{ item.apply_money }} +{{ item.status_name }} ++ ++ + + + + + + + + diff --git a/pages_tool/notice/detail.vue b/pages_tool/notice/detail.vue new file mode 100644 index 0000000..2c9cb94 --- /dev/null +++ b/pages_tool/notice/detail.vue @@ -0,0 +1,104 @@ + ++ + + +-{{ detail.apply_money }} ++ + ++ +当前状态 +{{ detail.status_name }} ++ +交易号 +{{ detail.withdraw_no }} ++ +手续费 +¥{{ detail.service_money }} ++ +申请时间 +{{ $util.timeStampTurnTime(detail.apply_time) }} ++ +审核时间 +{{ $util.timeStampTurnTime(detail.audit_time) }} ++ +银行名称 +{{ detail.bank_name }} ++ +收款账号 +{{ detail.account_number }} ++ +拒绝理由 +{{ detail.refuse_reason }} ++ +转账方式名称 +{{ detail.transfer_type_name }} ++ +转账时间 +{{ $util.timeStampTurnTime(detail.payment_time) }} ++ + + + + + + + diff --git a/pages_tool/notice/list.vue b/pages_tool/notice/list.vue new file mode 100644 index 0000000..3db4c7e --- /dev/null +++ b/pages_tool/notice/list.vue @@ -0,0 +1,168 @@ + +{{ detail.title }} ++ +发表时间: {{ $util.timeStampTurnTime(detail.create_time) }} ++ ++ + + + + + + + + + diff --git a/pages_tool/order/activist.vue b/pages_tool/order/activist.vue new file mode 100644 index 0000000..41dc0a7 --- /dev/null +++ b/pages_tool/order/activist.vue @@ -0,0 +1,153 @@ + ++ + ++ ++ ++ ++ ++ +置顶 +{{ item.title }} +{{ $util.timeStampTurnTime(item.create_time, 1) }} ++ + ++ + + + + + + + + diff --git a/pages_tool/order/detail_virtual.vue b/pages_tool/order/detail_virtual.vue new file mode 100644 index 0000000..a07c408 --- /dev/null +++ b/pages_tool/order/detail_virtual.vue @@ -0,0 +1,23 @@ + ++ ++ ++ ++ ++ ++ +{{ item.order_no }} +退款成功 +退款中 +退款失败 ++ ++ + +{{ item.sku_name }} ++ +{{ item.refund_status_name }} ++ +¥{{ item.price }} +×{{ item.num }} ++ ++ +共{{ item.num }}件商品 +退款:¥{{ item.refund_status == 3 ? item.refund_real_money : item.refund_apply_money }} ++ +{{ $lang('checkDetail') }} ++ ++ {{ actionItem.title }} + ++ ++ + + + + + + + diff --git a/pages_tool/order/evaluate.vue b/pages_tool/order/evaluate.vue new file mode 100644 index 0000000..55568bc --- /dev/null +++ b/pages_tool/order/evaluate.vue @@ -0,0 +1,112 @@ + ++ + + + + + + + diff --git a/pages_tool/order/logistics.vue b/pages_tool/order/logistics.vue new file mode 100644 index 0000000..ca0a687 --- /dev/null +++ b/pages_tool/order/logistics.vue @@ -0,0 +1,173 @@ + ++ ++ ++ ++ + ++ ++ ++ {{ item.sku_name }} ++ ++ +描述相符 ++ + ++ 好评 +中评 +差评 ++ ++ ++ + +{{ goodsEvalList[index].content.length }}/200 ++ + + +{{ goodsEvalList[index].again_content.length }}/200 ++ ++ ++ + + ++ {{ imgList[index].length ? 6 - imgList[index].length : 0 }}/6 ++ ++ ++ 匿名 ++ + + + + + + + + + diff --git a/pages_tool/order/public/css/activist.scss b/pages_tool/order/public/css/activist.scss new file mode 100644 index 0000000..69d2a64 --- /dev/null +++ b/pages_tool/order/public/css/activist.scss @@ -0,0 +1,110 @@ +.activist-container { + width: 100vw; + height: 100vh; +} + +.order-item { + margin: $margin-updown $margin-both; + padding: 26rpx 24rpx; + border-radius: 10rpx; + background: #fff; + display: flex; + flex-direction: column; + + .order-header { + display: flex; + align-items: center; + padding-bottom: 26rpx; + border-bottom: 2rpx solid #f1f1f1; + + .status-num { + font-size: $font-size-goods-tag; + color: $color-title; + } + + .status-name { + flex: 1; + text-align: right; + font-size: $font-size-tag; + } + } + + .goods-wrap { + display: flex; + padding: 27rpx 0; + box-sizing: border-box; + border-bottom: 2rpx solid #f7f7f7; + image { + width: 170rpx; + height: 170rpx; + display: flex; + align-items: center; + justify-content: center; + } + .goods-info { + flex: 1; + display: flex; + flex-direction: column; + justify-content: space-between; + margin-left: 15rpx; + + .goods-name { + line-height: 38rpx; + font-size: $font-size-base; + color: $color-title; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + } + .goods-num { + display: flex; + justify-content: space-between; + align-items: flex-start; + margin-top: 21rpx; + .num-text { + font-size: $font-size-tag; + line-height: 1; + } + .num-price { + display: flex; + flex-direction: column; + align-items: flex-end; + line-height: 1; + font-size: $font-size-tag; + .num { + color: $color-tip; + margin-top: 16rpx; + display: flex; + align-items: center; + } + } + } + } + } + .goods-btn { + display: flex; + flex-direction: column; + align-items: flex-end; + margin-top: 27rpx; + .btn-text { + font-size: $font-size-tag; + text { + &:nth-child(2) { + margin-left: 17rpx; + text { + font-size: $font-size-base; + } + } + } + } + .order-action { + display: flex; + margin-top: 24rpx; + .order-box-btn { + font-size: $font-size-goods-tag; + } + } + } +} diff --git a/pages_tool/order/public/css/evaluate.scss b/pages_tool/order/public/css/evaluate.scss new file mode 100644 index 0000000..36f4b22 --- /dev/null +++ b/pages_tool/order/public/css/evaluate.scss @@ -0,0 +1,231 @@ +.page { + padding-bottom: 100rpx; +} + +.eval-good { + width: 100%; + padding: 0 30rpx; + box-sizing: border-box; + background: #ffffff; + + .good-box { + width: 100%; + height: 100%; + padding: 30rpx 0; + border-bottom: 2rpx solid #f5f5f5; + box-sizing: border-box; + display: flex; + justify-content: space-between; + + .good_pic { + width: 180rpx; + height: 180rpx; + margin-right: 20rpx; + box-sizing: border-box; + } + + .good_info { + width: calc(100% - 200rpx); + height: 100%; + line-height: 1.3; + box-sizing: border-box; + } + } +} + +.eval-text { + width: 100%; + padding: 0 $margin-both; + box-sizing: border-box; + padding-bottom: $padding; + margin-top: $margin-updown; + + .text-box { + width: 100%; + height: 100%; + border-radius: $border-radius; + background: #ffffff; + padding-bottom: $padding; + box-sizing: border-box; + position: relative; + + textarea { + width: 100%; + height: 190rpx; + padding: $padding; + box-sizing: border-box; + font-size: $font-size-tag; + } + } + + .maxSize { + position: absolute; + right: 20rpx; + top: 160rpx; + color: #999; + font-size: $font-size-tag; + } + + .other-info { + width: 100%; + padding: 0 $padding; + box-sizing: border-box; + display: flex; + flex-wrap: wrap; + margin-top: $margin-updown; + } + + .other-info-box { + width: 145rpx; + height: 145rpx; + margin-right: $margin-both; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + margin-right: 30rpx; + margin-bottom: 30rpx; + position: relative; + + image { + width: 100%; + border-radius: $border-radius; + } + .iconfont { + font-size: 60rpx; + color: #898989; + line-height: 1; + } + text { + line-height: 1; + } + .imgDel { + width: 40rpx; + height: 40rpx; + position: absolute; + right: -20rpx; + top: -20rpx; + display: flex; + justify-content: center; + align-items: center; + .iconfont { + font-size: $font-size-toolbar; + } + } + } + .other-info-box.active { + border: 1rpx dashed #898989; + } + .other-info-box.active:active { + background: rgba($color: #cccccc, $alpha: 0.6); + } + // .other-info-box:nth-child(4n) { + // margin-right: 0; + // } +} + +.eval-star { + width: 100%; + background: #ffffff; + padding: 10rpx 30rpx; + box-sizing: border-box; + + .star-box { + width: 100%; + height: 100%; + display: flex; + align-items: center; + + .star-title { + height: 60rpx; + position: relative; + padding-right: $padding; + box-sizing: border-box; + line-height: 60rpx; + font-size: $font-size-base; + font-weight: bold; + } + + .grade-li { + width: 30%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; + } + + .icon-haoping1 { + font-size: $font-size-base; + margin-right: 10rpx; + } + + .icon-haoping { + font-size: $font-size-base; + color: #999; + margin-right: 10rpx; + } + + .icon-zhongchaping { + font-size: $font-size-base; + margin-right: 10rpx; + color: #ccc; + } + } +} + +.eval-bottom { + position: fixed; + z-index: 5; + width: 100vw; + height: 100rpx; + background: #fff; + bottom: var(--window-bottom); + overflow: hidden; + display: flex; + justify-content: space-between; + &.safe-area { + padding-bottom: 68rpx !important; + } + + .all-election { + height: 100rpx; + position: relative; + padding-left: 20rpx; + display: inline-block; + width: 30%; + + & > .iconfont { + font-size: 45rpx; + position: absolute; + top: 50%; + left: 24rpx; + transform: translateY(-50%); + } + + & > text { + margin-left: 56rpx; + line-height: 100rpx; + } + } + + .action-btn { + flex: 1; + height: 100rpx; + line-height: 100rpx; + border-radius: 0; + margin: 0; + display: flex; + justify-content: center; + align-items: center; + + button { + width: 100%; + height: 80rpx; + line-height: 80rpx; + } + } + .action-btn.disabled:after { + content: ''; + border: none; + } +} \ No newline at end of file diff --git a/pages_tool/order/public/css/logistics.scss b/pages_tool/order/public/css/logistics.scss new file mode 100644 index 0000000..44a7de9 --- /dev/null +++ b/pages_tool/order/public/css/logistics.scss @@ -0,0 +1,244 @@ +@mixin flex-row-center { + display: flex; + justify-content: center; + align-items: center; +} + +@mixin wrap { + padding: 30rpx; + border-radius: $border-radius; + background: #fff; + position: relative; + width: calc(100% - 60rpx); + box-sizing: border-box; +} +.swiper-item { + padding-top: 94rpx; + height: 100%; + .container { + height: calc(100vh - 124rpx); + overflow-y: scroll; + box-sizing: border-box; + display: flex; + flex-direction: column; + align-items: center; + padding-bottom: 30rpx; + &.safearea { + padding: 68rpx; + } + } + padding-bottom: 30rpx; + padding-bottom: constant(safe-area-inset-bottom); /*兼容 IOS<11.2*/ + padding-bottom: env(safe-area-inset-bottom); /*兼容 IOS>11.2*/ +} +.order-nav { + width: 100vw; + // height: 60rpx; + flex-direction: row; + /* #ifndef APP-PLUS */ + white-space: nowrap; + /* #endif */ + background: #fff; + display: flex; + position: fixed; + left: 0; + z-index: 998; + + .uni-tab-item { + display: inline-block; + padding: 30rpx 24rpx 0; + // height: 60rpx; + // line-height: 60rpx; + } + + .uni-tab-item-title { + color: #555; + font-size: $font-size-toolbar; + display: block; + line-height: 1; + padding: 0 10rpx 30rpx; + flex-wrap: nowrap; + /* #ifndef APP-PLUS */ + white-space: nowrap; + /* #endif */ + text-align: center; + } + + .uni-tab-item-title-active { + display: block; + border-bottom: 2rpx solid #ffffff; + padding: 0 10rpx 30rpx; + } + + ::-webkit-scrollbar { + width: 0; + height: 0; + color: transparent; + } +} + +.goods-wrap { + @include wrap; + margin-top: 20rpx; + padding: 30rpx; + .goods { + display: flex; + position: relative; + margin-bottom: 20rpx; + + &:last-of-type { + margin-bottom: 0; + } + + .goods-img { + width: 180rpx; + height: 180rpx; + margin-right: 20rpx; + + image { + width: 100%; + height: 100%; + } + } + + .goods-info { + flex: 1; + display: flex; + flex-direction: column; + justify-content: space-between; + position: relative; + max-width: calc(100% - 140rpx); + + .goods-name { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; + line-height: 1.5; + font-size: $font-size-base; + font-weight: 500; + } + + .goods-sub-section { + width: 100%; + line-height: 1.3; + display: flex; + + .goods-price { + font-weight: 700; + font-size: $font-size-activity-tag; + } + + .unit { + font-weight: normal; + font-size: $font-size-tag; + margin-right: 2rpx; + } + + view { + flex: 1; + line-height: 1.3; + &:last-of-type { + text-align: left; + + .iconfont { + line-height: 1; + font-size: $font-size-tag; + } + } + } + } + } + } +} + +.express-company-wrap { + @include wrap; + margin-top: 20rpx; + .company-logo { + width: 120rpx; + height: 120rpx; + margin-right: 20rpx; + float: left; + image { + width: 100%; + height: 100%; + } + } + + .info { + flex: 1; + + .company { + line-height: 1.5; + margin-top: 16rpx; + } + + .no { + margin-top: 10rpx; + line-height: 1.5; + } + + .icon-fuzhi { + font-size: $font-size-base; + line-height: 1; + margin-left: 6rpx; + } + } +} + +.track-wrap { + @include wrap; + margin-top: 20rpx; + + .track-item { + position: relative; + flex-wrap: wrap; + overflow: visible; + display: flex; + &:after { + content: ''; + position: absolute; + z-index: 1; + pointer-events: none; + background-color: #e5e5e5; + width: 2rpx; + height: 150%; + bottom: 0; + left: 0; + top: 56rpx; + left: 20rpx; + bottom: -40rpx; + } + + .dot { + margin: 34rpx 20rpx 0 10rpx; + width: 20rpx; + height: 20rpx; + border-radius: 10rpx; + background-color: #ccc; + z-index: 9; + } + + .msg { + padding: 20rpx 0; + flex: 1; + + .text { + line-height: 1.5; + font-size: $font-size-base; + } + + .time { + color: $color-tip; + font-size: $font-size-activity-tag; + line-height: 1.3; + margin-top: 10rpx; + } + } + + &:last-of-type:after { + content: unset; + } + } +} diff --git a/pages_tool/order/public/css/refund.scss b/pages_tool/order/public/css/refund.scss new file mode 100644 index 0000000..c18b3c9 --- /dev/null +++ b/pages_tool/order/public/css/refund.scss @@ -0,0 +1,246 @@ +.refund-container { + width: 100vw; + height: 100vh; +} + +.align-right { + text-align: right; +} + +.goods-wrap { + margin: $margin-updown $margin-both; + padding: 30rpx; + border-radius: $border-radius; + background: #fff; + display: flex; + position: relative; + + .goods-img { + width: 180rpx; + height: 180rpx; + margin-right: 20rpx; + border-radius: $border-radius; + overflow: hidden; + + image { + width: 100%; + height: 100%; + } + } + + .goods-info { + flex: 1; + position: relative; + max-width: calc(100% - 200rpx); + + .goods-name { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; + line-height: 1.5; + font-size: $font-size-base; + } + } +} + +.refund-option { + margin: $margin-updown $margin-both; + border-radius: $border-radius; + background: #fff; + + .option-item { + padding: $padding; + display: flex; + position: relative; + + view { + flex: 1; + + text { + display: block; + } + } + + .icon-right { + position: absolute; + top: 50%; + transform: translateY(-50%); + color: #ddd; + right: 20rpx; + } + + &:last-of-type { + border-top: 2rpx solid #f2f2f2; + } + } +} + +.refund-form { + margin: $margin-updown $margin-both; + padding: $padding; + border-radius: $border-radius; + background: #fff; + + .item-wrap { + display: flex; + position: relative; + line-height: 80rpx; + + .label { + width: 142rpx; + padding-right: 5rpx; + line-height: 80rpx; + } + + .cont { + flex: 1; + line-height: 80rpx; + text-align: right; + .refund-desc { + font-size: $font-size-base; + width: 100%; + line-height: 1; + min-height: 80rpx; + } + + &.reason { + padding-right: 40rpx; + } + } + .label.active{ + width: 100%; + } + + .icon-right { + position: absolute; + top: 50%; + transform: translateY(-50%); + color: #ddd; + right: 0; + } + } +} +.textarea-box{ + position: relative; + .mark{ + width: 100%; + height: 100%; + position: absolute; + left: 0; + bottom: 0; + background: red; + } +} +.newText{ + width: 100%; + min-height: 200rpx; + border-radius: $border-radius; + box-sizing: border-box; + margin-top: 10rpx; +} + +.sub-btn { + position: fixed; + width: 100%; + height: 100rpx; + line-height: 100rpx; + text-align: center; + color: #fff; + bottom: 0; + &.safe-area { + margin-bottom: 48rpx !important; + } +} + +.popup { + width: 100vw; + background: #fff; + border-top-left-radius: 24rpx; + border-top-right-radius: 24rpx; + + .popup-header { + height: 90rpx; + display: flex; + align-items: center; + padding: 0 30rpx; + + & > view { + flex: 1; + line-height: 1; + } + + .tit { + font-size: $font-size-toolbar; + font-weight: 600; + } + + .vice-tit { + margin-right: 20rpx; + } + } + + .popup-footer { + height: 140rpx; + + .confirm-btn { + height: 80rpx; + line-height: 80rpx; + color: #fff; + text-align: center; + margin: 20rpx; + border-radius: $border-radius; + &.color-base-bg{ + color: var(--btn-text-color); + } + } + + &.bottom-safe-area { + padding-bottom: 48rpx; + } + } +} + +.refund-reason-popup { + height: 50vh; + display: flex; + flex-direction: column; + + .icon-close { + font-size: 40rpx; + } + + .popup-body { + flex: 1; + + .scroll-view { + height: 100%; + } + + .item { + display: flex; + padding: 0 30rpx; + position: relative; + height: 70rpx; + line-height: 70rpx; + + .reason { + flex: 1; + height: 70rpx; + line-height: 70rpx; + } + + & > .iconfont { + font-size: 40rpx; + position: absolute; + top: 50%; + right: 30rpx; + transform: translateY(-50%); + } + + & > .icon-yuan_checkbox { + color: $color-tip; + } + } + } +} diff --git a/pages_tool/order/public/css/refund_detail.scss b/pages_tool/order/public/css/refund_detail.scss new file mode 100644 index 0000000..e14863b --- /dev/null +++ b/pages_tool/order/public/css/refund_detail.scss @@ -0,0 +1,328 @@ +.detail-container { + width: 100vw; + height: 100vh; +} +.container { + transition: all 0.3s; + + .hide { + transform: translateX(-100%); + } +} + +.status-wrap { + padding: 20rpx; + background: #fff; + border-top: 1px solid #f5f5f5; + margin: 20rpx; + border-radius: $border-radius; + + .status-name { + display: block; + font-size: $font-size-toolbar; + line-height: 70rpx; + height: 70rpx; + } + + .refund-explain { + border-top: 1px dashed #eee; + padding-top: 20rpx; + } +} + +.refund-address-wrap { + margin: 20rpx; + background: #fff; + padding: 20rpx; + border-radius: $border-radius; + + .copy { + font-size: $font-size-activity-tag; + display: inline-block; + color: #666; + background: #fff; + line-height: 1; + padding: 6rpx 10rpx; + margin-left: 10rpx; + border-radius: 4rpx; + border: 1px solid #ddd; + } +} + +.history-wrap { + margin: 20rpx; + background: #fff; + padding: 20rpx; + display: flex; + position: relative; + border-radius: $border-radius; + + view { + flex: 1; + } + + .icon-right { + position: absolute; + top: 50%; + transform: translateY(-50%); + color: #ddd; + right: 20rpx; + } +} + +.refund-info { + margin: 20rpx; + background: #fff; + border-radius: $border-radius; + + .header { + height: 90rpx; + line-height: 90rpx; + padding: 0 20rpx; + } + + .body { + padding-bottom: 20rpx; + + .goods-wrap { + display: flex; + position: relative; + padding: 20rpx; + background: #f5f5f5; + + &:last-of-type { + margin-bottom: 0; + } + + .goods-img { + width: 180rpx; + height: 180rpx; + margin-right: 20rpx; + + image { + width: 100%; + height: 100%; + } + } + + .goods-info { + flex: 1; + position: relative; + max-width: calc(100% - 200rpx); + + .goods-name { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; + line-height: 1.5; + font-size: $font-size-base; + } + + .goods-sub-section { + padding-top: 20rpx; + width: 100%; + line-height: 1.3; + display: flex; + + .refund-price { + font-size: $font-size-base; + } + + .unit { + font-weight: normal; + font-size: $font-size-tag; + margin-right: 2rpx; + } + } + } + } + + .info { + margin-top: 20rpx; + + .cell { + height: 50rpx; + line-height: 50rpx; + padding: 0 30rpx; + font-size: $font-size-tag; + color: $color-tip; + } + } + } +} + +.action { + position: fixed; + z-index: 5; + left: 0; + bottom: 0; + width: 100vw; + height: 100rpx; + background: #fff; + box-shadow: 0 0px 10px rgba(0, 0, 0, 0.1); + text-align: right; + line-height: 100rpx; + + &.bottom-safe-area { + padding-bottom: constant(safe-area-inset-bottom); + padding-bottom: env(safe-area-inset-bottom); + } + .order-box-btn{ + margin-right: $margin-both; + margin-left: 0; + } + + .action-btn { + height: 70rpx; + line-height: 70rpx; + color: #fff; + padding: 0 40rpx; + display: inline-block; + text-align: center; + margin: 16rpx 20rpx 16rpx 0; + border-radius: $border-radius; + + &.white { + height: 68rpx; + line-height: 68rpx; + color: #333; + border: 0.5px solid #999; + background: #fff; + } + } +} + +.form-wrap { + background: #fff; + + .item { + margin: 0 20rpx; + display: flex; + border-bottom: 1px solid #eee; + + &:last-child { + border-bottom: none; + } + + .label { + width: 140rpx; + line-height: 90rpx; + } + + .cont { + flex: 1; + line-height: 90rpx; + + .input, + .input-placeholder { + height: 90rpx; + line-height: 90rpx; + font-size: $font-size-base; + } + + .textarea { + width: 100%; + padding: 26rpx 0; + line-height: 1.3; + font-size: $font-size-base; + } + } + } +} + +.sub-btn { + margin-top: 20rpx; +} + +.record-wrap { + .cont { + width: 100%; + background-color: #fff; + padding: 30rpx; + box-sizing: border-box; + margin-top: 20rpx; + + .head { + display: flex; + flex-direction: column; + color: $color-title; + color: $font-size-base; + .time { + color: $color-tip; + font-size: $font-size-tag; + float: right; + } + } + .body { + padding-top: 20rpx; + .refund-action{ + line-height: 1; + color: $color-title; + } + .desc { + margin-top: 10rpx; + color: $color-tip; + font-size: $font-size-tag; + } + } + } + + .empty-box{ + height: 168rpx; + } +} + +.history-bottom { + position: fixed; + z-index: 5; + left: 0; + bottom: 0; + width: 100vw; + height: 100rpx; + background: #fff; + box-shadow: 0 0px 10px rgba(0, 0, 0, 0.1); + text-align: right; + display: flex; + + &.bottom-safe-area { + padding-bottom: constant(safe-area-inset-bottom); + padding-bottom: env(safe-area-inset-bottom); + } + + view { + flex: 1; + text-align: center; + line-height: 100rpx; + + &:first-child { + border-right: 1px solid #eee; + } + .iconfont { + font-weight: bold; + margin-right: 10rpx; + font-size: $font-size-base; + line-height: 1; + } + } + button { + width: 50%; + height: 100%; + // position: absolute; + border: none; + z-index: 1; + padding: 0; + margin: 0; + background: none; + display: flex; + justify-content: center; + align-items: center; + &::after { + border: none !important; + } + .iconfont{ + margin-right: 10rpx; + } + + } +} diff --git a/pages_tool/order/public/js/evaluate.js b/pages_tool/order/public/js/evaluate.js new file mode 100644 index 0000000..3a4411a --- /dev/null +++ b/pages_tool/order/public/js/evaluate.js @@ -0,0 +1,232 @@ +export default { + data() { + return { + orderId: null, + orderNo: "", + memberName: "", + memberNeadimg: "", + isAnonymous: 1, //是否匿名发布 1.匿名,0.公开 + + goodsList: [], //订单列表 + goodsEvalList: [], //评价列表 + + imgList: [], + isEvaluate: 0, //判断是否为追评 + + flag: false, //防止重复点击 , + evaluateConfig: { + evaluate_audit: 1, + evaluate_show: 0, + evaluate_status: 1 + } + }; + }, + methods: { + //获取用户信息 + getUserInfo() { + this.$api.sendRequest({ + url: '/api/member/info', + success: res => { + if (res.code == 0) { + this.memberName = res.data.nickname; + this.memberNeadimg = res.data.headimg; + } else { + this.$util.showToast({ + title: res.message + }) + } + } + }); + }, + //获取订单信息 + getOrderInfo() { + //获取订单信息 + let data = { + order_id: this.orderId + }; + this.$api.sendRequest({ + url: '/api/order/evluateinfo', + data: data, + success: res => { + if (res.code == 0) { + this.isEvaluate = res.data.evaluate_status + this.goodsList = res.data.list; + if (this.goodsList.length) { + this.orderNo = res.data.list[0].order_no; + } + if (this.isEvaluate) { + for (let i = 0; i < res.data.list.length; i++) { + let array = []; + this.imgList.push(array) + this.goodsEvalList.push({ + order_goods_id: res.data.list[i].order_goods_id, + goods_id: res.data.list[i].goods_id, + sku_id: res.data.list[i].sku_id, + again_content: "", + again_images: "" + }); + } + } else { + for (let i = 0; i < res.data.list.length; i++) { + let array = []; + this.imgList.push(array) + this.goodsEvalList.push({ + content: '', // 评价内容 + images: "", //图片数组 + scores: 5, // 评分 + explain_type: 1, // 评价类型 + order_goods_id: res.data.list[i].order_goods_id, + goods_id: res.data.list[i].goods_id, + sku_id: res.data.list[i].sku_id, + sku_name: res.data.list[i].sku_name, + sku_price: res.data.list[i].price, + sku_image: res.data.list[i].sku_image + }); + } + } + } else { + this.$util.showToast({ + title: "未获取到订单数据" + }) + setTimeout(() => { + this.$util.redirectTo('/pages/order/list', {}, "redirectTo"); + }, 1000) + } + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + }, + fail() { + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + } + }); + }, + //监听评分变化 + setStar(e) { + this.goodsEvalList[e.index].scores = e.value; + if (e.value >= 4) { + this.goodsEvalList[e.index].explain_type = 1; + } else if (1 < e.value && e.value < 4) { + this.goodsEvalList[e.index].explain_type = 2 + } else { + this.goodsEvalList[e.index].explain_type = 3 + } + }, + //切换,是否匿名 + isAll() { + this.isAnonymous ? this.isAnonymous = 0 : this.isAnonymous = 1 + }, + //添加图片 + addImg(e) { + let size = this.imgList[e].length ? this.imgList[e].length : 0 + this.$util.upload(6 - size, { + path: 'evaluateimg' + }, res => { + let arr = this.imgList[e] + arr = arr.concat(res); + this.imgList[e] = []; + this.$set(this.imgList, e, arr) + if (this.isEvaluate) { + this.goodsEvalList[e].again_images = this.imgList[e].toString() + } else { + this.goodsEvalList[e].images = this.imgList[e].toString() + } + }); + }, + //删除图片 + deleteImg(i, index, j) { + this.imgList[index].splice(j, 1); + if (this.isEvaluate) { + this.goodsEvalList[index].again_images = this.imgList[index].toString() + } else { + this.goodsEvalList[index].images = this.imgList[index].toString() + } + }, + // 图片预览 + preview(i, j) { + let urls = this.imgList[j]; + for (let k = 0; k < urls.length; k++) { + urls[k] = this.$util.img(urls[k]) + } + uni.previewImage({ + urls: urls, + current: i + }); + }, + + //提交评价 + save() { + if (this.evaluateConfig.evaluate_status == 0) { + this.$util.showToast({ + title: "商家未开启商品评价功能" + }); + return; + } + for (let i = 0; i < this.goodsEvalList.length; i++) { + if (this.isEvaluate) { + if (!this.goodsEvalList[i].again_content.trim().length) { + this.$util.showToast({ + title: "商品的评价不能为空哦" + }); + return; + } + } else { + if (!this.goodsEvalList[i].content.trim().length) { + this.$util.showToast({ + title: "商品的评价不能为空哦" + }); + return; + } + } + } + let goodsEvaluate = JSON.stringify(this.goodsEvalList) + let data = { + order_id: this.orderId, + goods_evaluate: goodsEvaluate, + }; + if (!this.isEvaluate) { + data.order_no = this.orderNo; + data.member_name = this.memberName; + data.member_headimg = this.memberNeadimg; + data.is_anonymous = this.isAnonymous; + } + if (this.flag) return; + this.flag = true; + this.$api.sendRequest({ + url: this.isEvaluate ? '/api/goodsevaluate/again' : '/api/goodsevaluate/add', + data: data, + success: res => { + if (res.code == 0) { + this.$util.showToast({ + title: "评价成功" + }); + setTimeout(() => { + this.$util.redirectTo('/pages/order/list', {}, "redirectTo"); + }, 1000); + } else { + this.$util.showToast({ + title: res.message + }); + this.flag = false; + } + }, + fail: res => { + this.flag = false; + } + }); + }, + imageError(index) { + this.goodsList[index].sku_image = this.$util.getDefaultImage().goods; + this.$forceUpdate(); + }, + getEvaluateConfig() { + this.$api.sendRequest({ + url: '/api/goodsevaluate/config', + success: res => { + if (res.code == 0) { + var data = res.data; + this.evaluateConfig = data; + } + } + }); + } + } +}; diff --git a/pages_tool/order/public/js/refundMethod.js b/pages_tool/order/public/js/refundMethod.js new file mode 100644 index 0000000..2feb464 --- /dev/null +++ b/pages_tool/order/public/js/refundMethod.js @@ -0,0 +1,30 @@ +export default { + methods: { + /** + * 撤销退款申请 + * @param {Object} order_goods_id + * @param {Object} callback + */ + cancleRefund(order_goods_id, callback) { + uni.showModal({ + content: '撤销之后本次申请将会关闭,如后续仍有问题可再次发起申请。', + cancelText: '暂不撤销', + cancelColor: '#898989', + success: res => { + if (res.confirm) { + this.$api.sendRequest({ + url: '/api/orderrefund/cancel', + data: { + order_goods_id + }, + success: res => { + typeof callback == 'function' && callback(res); + } + }) + } + } + }) + }, + + } +} diff --git a/pages_tool/order/refund.vue b/pages_tool/order/refund.vue new file mode 100644 index 0000000..787d388 --- /dev/null +++ b/pages_tool/order/refund.vue @@ -0,0 +1,312 @@ + ++ ++ ++ {{ packageItem.package_name }} + ++ ++ ++ + ++ ++ ++ ++ + +{{ goodsItem.sku_name }} ++ ++ ++ ++ {{ goodsItem.num }} + + + ++ + ++ +承运公司: {{ packageItem.express_company_name }} ++ ++ 运单号: + +{{ packageItem.delivery_no }} ++ + ++ ++ ++ + +{{ traceItem.remark }} +{{ traceItem.datetime }} ++ +{{ packageItem.trace.reason }} ++ +{{ packageItem.trace.reason }} ++ + + + + + + + + diff --git a/pages_tool/order/refund_batch.vue b/pages_tool/order/refund_batch.vue new file mode 100644 index 0000000..a5feeb4 --- /dev/null +++ b/pages_tool/order/refund_batch.vue @@ -0,0 +1,319 @@ + ++ ++ ++ + ++ ++ + +{{ refund_data.order_goods_info.sku_name }} ++ + ++ ++ +退款无需退货 +没收到货,或与卖家协商同意无需退货只退款 ++ + ++ +退货退款 +已收到货,需退还收到的货物 ++ + + ++ + ++ +退款原因: ++ +请选择 +{{ refund_reason }} ++ + +退款金额: +{{ $lang('common.currencySymbol') }}{{ refund_data.refund_money }} ++ + + ++ + + + + + + + 退款说明 + + ++ ++ ++ ++ 退款原因 + + ++ ++ ++ +{{ item }} ++ + +确定 ++ + + + + + + + + + diff --git a/pages_tool/order/refund_detail.vue b/pages_tool/order/refund_detail.vue new file mode 100644 index 0000000..e5b049f --- /dev/null +++ b/pages_tool/order/refund_detail.vue @@ -0,0 +1,275 @@ + ++ ++ ++ + ++ ++ + +{{ item.sku_name }} ++ + + ++ + ++ +退款原因: ++ +请选择 +{{ refund_reason }} ++ + +退款方式: +退款无需退货 +退货退款 ++ +退款金额: +{{ $lang('common.currencySymbol') }}{{ refund_data.refund_money }} ++ + + ++ + + + + + + + 退款说明 + + + ++ ++ ++ ++ 退款原因 + + ++ ++ ++ +{{ item }} ++ + +确定 ++ + + + + + + + + diff --git a/pages_tool/order/refund_goods_select.vue b/pages_tool/order/refund_goods_select.vue new file mode 100644 index 0000000..89e6f50 --- /dev/null +++ b/pages_tool/order/refund_goods_select.vue @@ -0,0 +1,222 @@ + ++ ++ + ++ + +{{ detail.refund_status_name }} ++ +如果商家拒绝,你可重新发起申请 +如果商家同意,将通过申请并退款给你 + ++ +如果商家确认收货将会退款给你 +如果商家拒绝收货,该次退款将会关闭,你可以重新发起退款 ++ + +协商记录 ++ + + +退货地址 ++ +收货人:{{ detail.shop_contacts }} ++ +联系方式:{{ detail.shop_mobile }} ++ +退货地址:{{ detail.shop_address }} +复制 ++ + +退款信息 ++ + ++ + ++ ++ + +{{ detail.sku_name }} ++ +退款方式:{{ detail.refund_type == 1 ? '仅退款' : '退款退货' }} +退款途径:{{ detail.refund_money_type == 1 ? '原路退款' : detail.refund_money_type == 2 ? '线下退款' : '退款到余额' }} +退款原因:{{ detail.refund_reason }} +退款金额:{{ $lang('common.currencySymbol') }}{{ detail.refund_real_money }} +退款金额:{{ $lang('common.currencySymbol') }}{{ detail.refund_apply_money }} +退款编号:{{ detail.refund_no }} +申请时间:{{ $util.timeStampTurnTime(detail.refund_action_time) }} +退款时间:{{ $util.timeStampTurnTime(detail.refund_time) }} +退款说明:{{ detail.refund_remark }} +退款积分:{{ detail.use_point }} ++ ++ {{ actionItem.title }} + ++ + ++ ++ + ++ +物流公司 ++ + ++ +物流单号 ++ + ++ +物流说明 ++ + ++ ++ ++ ++ ++ +{{ logItem.action_way == 1 ? '买家' : '卖家' }} +{{ $util.timeStampTurnTime(logItem.action_time) }} ++ +{{ logItem.action }} +{{ logItem.desc }} ++ + ++ ++ ++ 联系客服 +返回详情 ++ + + + + + + + + diff --git a/pages_tool/order/refund_type_select.vue b/pages_tool/order/refund_type_select.vue new file mode 100644 index 0000000..fc1d367 --- /dev/null +++ b/pages_tool/order/refund_type_select.vue @@ -0,0 +1,115 @@ + ++ 共 + +{{refund_data.length}} 件商品 ++ + ++ ++ ++ + + + +{{item.sku_name}} ++ + + ++ + ++ + 下一步 +请选择商品 ++ + + + + + + + diff --git a/pages_tool/pay/cashier.vue b/pages_tool/pay/cashier.vue new file mode 100644 index 0000000..bfc3e61 --- /dev/null +++ b/pages_tool/pay/cashier.vue @@ -0,0 +1,384 @@ + ++ ++ + ++ ++ +退款无需退货 +没收到货,或与卖家协商同意无需退货只退款 ++ + ++ +退货退款 +已收到货,需退还收到的货物 ++ + + + + + + + + + diff --git a/pages_tool/pay/index.vue b/pages_tool/pay/index.vue new file mode 100644 index 0000000..d957edf --- /dev/null +++ b/pages_tool/pay/index.vue @@ -0,0 +1,137 @@ + ++ ++ +{{ payInfo.pay_body }} ++ + +¥ +{{ payInfo.pay_money | moneyFormat }} ++ ++ + ++ ++ ++ {{ item.name }} ++ 店铺尚未配置支付方式! ++ + + + + + + + + + diff --git a/pages_tool/pay/result.vue b/pages_tool/pay/result.vue new file mode 100644 index 0000000..edf87c6 --- /dev/null +++ b/pages_tool/pay/result.vue @@ -0,0 +1,318 @@ + ++ + +{{ $lang('paymentAmount') }} ++ {{ $lang('common.currencySymbol') }} + +{{ payInfo.pay_money }} +{{ payInfo.pay_body }} ++ + + + + + + + + + diff --git a/pages_tool/pay/wx_pay.vue b/pages_tool/pay/wx_pay.vue new file mode 100644 index 0000000..33846c3 --- /dev/null +++ b/pages_tool/pay/wx_pay.vue @@ -0,0 +1,99 @@ + ++ + + ++ {{ $lang('paymentSuccess') }} ++ + + +{{ $lang('common.currencySymbol') }} +{{ parseFloat(payInfo.pay_money).toFixed(2).split(".")[0] }} +.{{ parseFloat(payInfo.pay_money).toFixed(2).split(".")[1] }} ++ {{ $lang('paymentFail') }} + + ++ + ++ +恭喜您获得 ++ ++ ++ {{ consumeInfo.point_num }} +积分 ++ ++ {{ consumeInfo.growth_num }} +成长值 ++ ++ {{ consumeInfo.coupon_list.length }} +张优惠券 ++ + +充值记录 +会员卡 +查看订单 +查看订单 +查看订单 +查看订单 + +{{ $lang('goHome') }} ++ + + + + + + + + diff --git a/pages_tool/recharge/list.vue b/pages_tool/recharge/list.vue new file mode 100644 index 0000000..3139e80 --- /dev/null +++ b/pages_tool/recharge/list.vue @@ -0,0 +1,588 @@ + ++ ++ + 点击右上角跳转到浏览器打开 + ++ + + + + + + diff --git a/pages_tool/recharge/order_list.vue b/pages_tool/recharge/order_list.vue new file mode 100644 index 0000000..a0f0f13 --- /dev/null +++ b/pages_tool/recharge/order_list.vue @@ -0,0 +1,175 @@ + ++ +充值 ++ + +账户余额 ++ {{balanceInfo.balance}} 元 + + +选择充值金额 + ++ 充值记录 + + + ++ + + ++ +{{ parseFloat(item.face_value).toFixed(0) }} +元 +售价 {{ item.buy_price }} 元 ++ + ++ +其他金额 ++ 注:充值 {{ list[isIndex].face_value }} 元赠送: + +{{ list[isIndex].point }} 积分, +{{ list[isIndex].growth }} 成长值 +,优惠券X{{ list[isIndex].coupon_id.split(',').length }} ++ +充值说明 ++ ++ 充值 {{ item.face_value }} 元赠送: + +{{ item.point }} 积分, +{{ item.growth }} 成长值 +,优惠券X{{ item.coupon_id.split(',').length }} ++ 充值任意金额后,会存到您的账户资金中 + ++ + ++ +请输入充值金额 ++ {{keywordsInfo.price?keywordsInfo.price:'金额'}} +元 ++ +售价{{payMoney}}元 ++ ++ +1 +2 +3 +4 +5 +6 +7 +8 +9 ++ 0 ++ + ++ 确认充值 ++ + + + + + + + + + diff --git a/pages_tool/store_notes/note_detail.vue b/pages_tool/store_notes/note_detail.vue new file mode 100644 index 0000000..0220437 --- /dev/null +++ b/pages_tool/store_notes/note_detail.vue @@ -0,0 +1,494 @@ + ++ ++ ++ ++ ++ ++ +{{ orderItem.order_no }} ++ +{{ $util.timeStampTurnTime(orderItem.create_time) }} ++ ++ + 充值成功 + ¥ + + +{{ orderItem.buy_price }} ++ +赠送: +{{ orderItem.point }}积分 +、 +{{ orderItem.growth }}成长值 +、 +优惠券x{{ orderItem.coupon_id.split(',').length }} ++ + + + + + + + + + diff --git a/pages_tool/store_notes/note_list.vue b/pages_tool/store_notes/note_list.vue new file mode 100644 index 0000000..200e66a --- /dev/null +++ b/pages_tool/store_notes/note_list.vue @@ -0,0 +1,456 @@ + ++ + ++ {{ goodsItemInfo.note_title }} ++ +{{ item }} +{{ $util.timeStampTurnTime(goodsItemInfo.create_time, 'time') }} ++ + ++ 阅读 + +{{ goodsItemInfo.initial_read_num + goodsItemInfo.read_num }} ++ ++ + {{ goodsItemInfo.initial_dianzan_num + goodsItemInfo.dianzan_num }} ++ ++ + ++ + + + + + +{{ shopSaidInfo.note_title }} +{{ $util.timeStampTurnTime(shopSaidInfo.create_time, 'time') }} ++ + ++ ++ + +{{ goodsItme.goods_name }} +{{ goodsItme.price }} ++ ++ 阅读 + +{{ shopSaidInfo.initial_read_num + shopSaidInfo.read_num }} ++ ++ + {{ shopSaidInfo.initial_dianzan_num + shopSaidInfo.dianzan_num }} ++ ++ + + + + + + + + + + + + + + diff --git a/pages_tool/storeclose/storeclose.vue b/pages_tool/storeclose/storeclose.vue new file mode 100644 index 0000000..27835c9 --- /dev/null +++ b/pages_tool/storeclose/storeclose.vue @@ -0,0 +1,99 @@ + ++ + ++ ++ {{ gruopItem.group_name }} + ++ + ++ ++ ++ +{{ listItem.note_title }} ++ +{{ labelItem }} ++ +#{{ listItem.note_type == 'goods_item' ? '单品介绍' : '掌柜说' }}# + {{ listItem.note_abstract }} ++ + ++ + + +{{ $util.timeStampTurnTime(listItem.create_time, 'time') }} ++ ++ 阅读 + +{{ listItem.initial_read_num + listItem.read_num }} ++ ++ + {{ listItem.initial_dianzan_num + listItem.dianzan_num }} ++ + + + ++ + + + + + + + + + + diff --git a/pages_tool/webview/webview.vue b/pages_tool/webview/webview.vue new file mode 100644 index 0000000..673a0d7 --- /dev/null +++ b/pages_tool/webview/webview.vue @@ -0,0 +1,37 @@ + ++ ++ {{ textVal }} ++ + + + + + + diff --git a/project.config.json b/project.config.json new file mode 100644 index 0000000..30988dd --- /dev/null +++ b/project.config.json @@ -0,0 +1,75 @@ +{ + "description": "项目配置文件", + "packOptions": { + "ignore": [] + }, + "setting": { + "urlCheck": true, + "es6": true, + "enhance": false, + "postcss": true, + "preloadBackgroundData": false, + "minified": true, + "newFeature": false, + "coverView": true, + "nodeModules": false, + "autoAudits": false, + "showShadowRootInWxmlPanel": true, + "scopeDataCheck": false, + "uglifyFileName": false, + "checkInvalidKey": true, + "checkSiteMap": true, + "uploadWithSourceMap": true, + "compileHotReLoad": false, + "useMultiFrameRuntime": true, + "useApiHook": true, + "useApiHostProcess": true, + "babelSetting": { + "ignore": [], + "disablePlugins": [], + "outputPath": "" + }, + "enableEngineNative": false, + "bundle": false, + "useIsolateContext": true, + "useCompilerModule": true, + "userConfirmedUseCompilerModuleSwitch": false, + "userConfirmedBundleSwitch": false, + "packNpmManually": false, + "packNpmRelationList": [], + "minifyWXSS": true + }, + "compileType": "miniprogram", + "libVersion": "2.16.1", + "appid": "wx59e6ba6050bbe7bc", + "projectname": "niushop_b2c_v4_uniapp", + "debugOptions": { + "hidedInDevtools": [] + }, + "scripts": {}, + "staticServerOptions": { + "baseURL": "", + "servePath": "" + }, + "isGameTourist": false, + "condition": { + "search": { + "list": [] + }, + "conversation": { + "list": [] + }, + "game": { + "list": [] + }, + "plugin": { + "list": [] + }, + "gamePlugin": { + "list": [] + }, + "miniprogram": { + "list": [] + } + } +} \ No newline at end of file diff --git a/store/index.js b/store/index.js new file mode 100644 index 0000000..09cc91f --- /dev/null +++ b/store/index.js @@ -0,0 +1,175 @@ +import Vue from 'vue' +import Vuex from 'vuex' +Vue.use(Vuex) + +import Http from '../common/js/http.js' +import colorList from '../common/js/style_color.js' + +const store = new Vuex.Store({ + state: { + tabBarList: '', + siteState: 1, + themeStyle: '', + addonIsExist: { + bundling: 0, + coupon: 0, + discount: 0, + fenxiao: 0, + gift: 0, + groupbuy: 0, + manjian: 0, + memberconsume: 0, + memberrecharge: 0, + memberregister: 0, + membersignin: 0, + memberwithdraw: 0, + memberrecommend: 0, + pintuan: 0, + pointexchange: 0, + seckill: 0, + store: 0, + topic: 0, + bargain: 0, + membercancel: 0, + servicer: 0, + supermember: 0, + giftcard: 0, + divideticket: 0, + scenefestival: 0, + birthdaygift: 0, + pinfan: 0 + }, + sourceMember: 0, // 来源会员 + authInfo: {}, // 授权信息 + token: null, + flRefresh: 0, + location: null, // 定位信息 + defaultImg: { + goods: '', + head: '', + store: '', + article: '' + }, + cartNumber: 0, + cartList: {}, + cartMoney: 0, + siteInfo: null, + cartChange: 0, + bottomNavHidden: false // 底部导航是否隐藏,true:隐藏,false:显示 + }, + mutations: { + setSiteState(state, siteStateVal) { + state.siteState = siteStateVal; + }, + setCartNumber(state, cartNumber) { + state.cartNumber = cartNumber + }, + setThemeStyle(state, value) { + state.themeStyle = value + uni.setStorageSync('theme_style', value); + }, + setTabBarList(state, value) { + state.tabBarList = value; + uni.setStorageSync('bottomNav', value); + }, + setAddonIsExist(state, value) { + state.addonIsExist = value; + uni.setStorageSync('addon_is_exist', value); + }, + setToken(state, value) { + state.token = value; + }, + setAuthinfo(state, value) { + state.authInfo = value; + }, + setSourceMember(state, value) { + state.sourceMember = value; + }, + setflRefresh(state, flRefreshVal) { + state.flRefresh = flRefreshVal; + }, + setLocation(state, value) { + state.location = value; + }, + setDefaultImg(state, value) { + uni.setStorageSync('default_img', value) + state.defaultImg = value; + }, + setCartList(state, value) { + state.cartList = value; + }, + setCartMoney(state, value) { + state.cartMoney = value; + }, + setSiteInfo(state, value) { + state.siteInfo = value; + uni.setStorageSync('siteInfo', value) + }, + setCartChange(state) { + state.cartChange += 1; + }, + setBottomNavHidden(state, value) { + state.bottomNavHidden = value; + uni.setStorageSync('bottomNavHidden', value) + }, + }, + actions: { + init() { + return new Promise((resolve, reject) => { + Http.sendRequest({ + url: '/api/config/init', + success: res => { + var data = res.data; + if (data) { + + this.commit('setCartNumber', data.cart_count); + + this.commit('setThemeStyle', colorList[data.style_theme.name]); + + // 底部导航 + this.commit('setTabBarList', data.diy_bottom_nav); + + this.commit('setAddonIsExist', data.addon_is_exist); + + this.commit('setDefaultImg', data.default_img); + + this.commit('setSiteInfo', data.site_info); + + uni.setStorageSync('copyright', data.copyright); + + resolve(data); + } + } + }); + }) + }, + //查询购物车数量 + getCartNumber() { + if (uni.getStorageSync("token")) { + Http.sendRequest({ + url: '/api/cart/lists', + success: res => { + if (res.code == 0) { + let cartList = {}, + count = 0, + money = 0; + res.data.forEach(item => { + cartList['sku_' + item.sku_id] = item; + count += item.num; + money += item.total_money; + }) + this.commit('setCartList', cartList); + this.commit('setCartNumber', count); + this.commit('setCartMoney', money); + } + } + }); + } else { + this.commit('setCartNumber', 0); + this.commit('setCartList', {}); + this.commit('setCartMoney', 0); + } + }, + } +}) +export default store diff --git a/uni.scss b/uni.scss new file mode 100644 index 0000000..66238a9 --- /dev/null +++ b/uni.scss @@ -0,0 +1,32 @@ +/** + * 你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能 + * 建议使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App + */ + +//主色调,红色:#FF0036,绿色 #4CAF50,蓝色:#03A9F4,黄色:#FF9800,粉色:#FF547B,棕色:#C3A769,浅绿色:#65C4AA,黑色:#333333,紫色:#B323B4,淡粉色:#FF8B8B + +// 颜色 +$color-title: #303133; // 主标题 +$color-sub: #606266; // 副标题 +$color-tip: #909399; // 辅助提示色 +$color-bg: #f8f8f8; // 背景色 +$color-line: #eeeeee; //分割线 +$color-disabled: #cccccc; // 禁用色 + +// 文字 +$font-size-base: 28rpx; // 14px,正文文字 +$font-size-toolbar: 32rpx; // 16px,用于导航栏、标题 +$font-size-sub: 26rpx; // 13px,副标题 +$font-size-tag: 24rpx; // 12px,辅助性文字/大标签 +$font-size-goods-tag: 22rpx; // 11px,商品列表角标 +$font-size-activity-tag: 20rpx; // 10px,活动角标(拼团等角标)/小标签文字 + +$margin-both: 30rpx; //外边距 左右 +$margin-updown: 20rpx; // 外边距 上下 +$border-radius: 10rpx; //圆角 +$padding: 20rpx; //内边距 + +$base-color: var(--base-color); // 主色调 +$base-help-color: var(--base-help-color); //辅助颜色 + +$goods-price-color: var(--goods-price-color) diff --git a/uni_modules/uni-datetime-picker/changelog.md b/uni_modules/uni-datetime-picker/changelog.md new file mode 100644 index 0000000..381c9a8 --- /dev/null +++ b/uni_modules/uni-datetime-picker/changelog.md @@ -0,0 +1,85 @@ +## 2.2.2(2021-12-10) +- 修复 clear-icon 属性在小程序平台不生效的 bug +## 2.2.1(2021-12-10) +- 修复 日期范围选在小程序平台,必须多点击一次才能取消选中状态的 bug +## 2.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-datetime-picker](https://uniapp.dcloud.io/component/uniui/uni-datetime-picker) +## 2.1.5(2021-11-09) +- 新增 提供组件设计资源,组件样式调整 +## 2.1.4(2021-09-10) +- 修复 hide-second 在移动端的 bug +- 修复 单选赋默认值时,赋值日期未高亮的 bug +- 修复 赋默认值时,移动端未正确显示时间的 bug +## 2.1.3(2021-09-09) +- 新增 hide-second 属性,支持只使用时分,隐藏秒 +## 2.1.2(2021-09-03) +- 优化 取消选中时(范围选)直接开始下一次选择, 避免多点一次 +- 优化 移动端支持清除按钮,同时支持通过 ref 调用组件的 clear 方法 +- 优化 调整字号大小,美化日历界面 +- 修复 因国际化导致的 placeholder 失效的 bug +## 2.1.1(2021-08-24) +- 新增 支持国际化 +- 优化 范围选择器在 pc 端过宽的问题 +## 2.1.0(2021-08-09) +- 新增 适配 vue3 +## 2.0.19(2021-08-09) +- 新增 支持作为 uni-forms 子组件相关功能 +- 修复 在 uni-forms 中使用时,选择时间报 NAN 错误的 bug +## 2.0.18(2021-08-05) +- 修复 type 属性动态赋值无效的 bug +- 修复 ‘确认’按钮被 tabbar 遮盖 bug +- 修复 组件未赋值时范围选左、右日历相同的 bug +## 2.0.17(2021-08-04) +- 修复 范围选未正确显示当前值的 bug +- 修复 h5 平台(移动端)报错 'cale' of undefined 的 bug +## 2.0.16(2021-07-21) +- 新增 return-type 属性支持返回 date 日期对象 +## 2.0.15(2021-07-14) +- 修复 单选日期类型,初始赋值后不在当前日历的 bug +- 新增 clearIcon 属性,显示框的清空按钮可配置显示隐藏(仅 pc 有效) +- 优化 移动端移除显示框的清空按钮,无实际用途 +## 2.0.14(2021-07-14) +- 修复 组件赋值为空,界面未更新的 bug +- 修复 start 和 end 不能动态赋值的 bug +- 修复 范围选类型,用户选择后再次选择右侧日历(结束日期)显示不正确的 bug +## 2.0.13(2021-07-08) +- 修复 范围选择不能动态赋值的 bug +## 2.0.12(2021-07-08) +- 修复 范围选择的初始时间在一个月内时,造成无法选择的bug +## 2.0.11(2021-07-08) +- 优化 弹出层在超出视窗边缘定位不准确的问题 +## 2.0.10(2021-07-08) +- 修复 范围起始点样式的背景色与今日样式的字体前景色融合,导致日期字体看不清的 bug +- 优化 弹出层在超出视窗边缘被遮盖的问题 +## 2.0.9(2021-07-07) +- 新增 maskClick 事件 +- 修复 特殊情况日历 rpx 布局错误的 bug,rpx -> px +- 修复 范围选择时清空返回值不合理的bug,['', ''] -> [] +## 2.0.8(2021-07-07) +- 新增 日期时间显示框支持插槽 +## 2.0.7(2021-07-01) +- 优化 添加 uni-icons 依赖 +## 2.0.6(2021-05-22) +- 修复 图标在小程序上不显示的 bug +- 优化 重命名引用组件,避免潜在组件命名冲突 +## 2.0.5(2021-05-20) +- 优化 代码目录扁平化 +## 2.0.4(2021-05-12) +- 新增 组件示例地址 +## 2.0.3(2021-05-10) +- 修复 ios 下不识别 '-' 日期格式的 bug +- 优化 pc 下弹出层添加边框和阴影 +## 2.0.2(2021-05-08) +- 修复 在 admin 中获取弹出层定位错误的bug +## 2.0.1(2021-05-08) +- 修复 type 属性向下兼容,默认值从 date 变更为 datetime +## 2.0.0(2021-04-30) +- 支持日历形式的日期+时间的范围选择 + > 注意:此版本不向后兼容,不再支持单独时间选择(type=time)及相关的 hide-second 属性(时间选可使用内置组件 picker) +## 1.0.6(2021-03-18) +- 新增 hide-second 属性,时间支持仅选择时、分 +- 修复 选择跟显示的日期不一样的 bug +- 修复 chang事件触发2次的 bug +- 修复 分、秒 end 范围错误的 bug +- 优化 更好的 nvue 适配 diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue new file mode 100644 index 0000000..b57610f --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue @@ -0,0 +1,185 @@ + ++ + + + + + + + diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue new file mode 100644 index 0000000..c48a096 --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue @@ -0,0 +1,898 @@ + ++ ++ {{weeks.date}} ++ + + + + + + diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json new file mode 100644 index 0000000..cc76311 --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json @@ -0,0 +1,19 @@ +{ + "uni-datetime-picker.selectDate": "select date", + "uni-datetime-picker.selectTime": "select time", + "uni-datetime-picker.selectDateTime": "select datetime", + "uni-datetime-picker.startDate": "start date", + "uni-datetime-picker.endDate": "end date", + "uni-datetime-picker.startTime": "start time", + "uni-datetime-picker.endTime": "end time", + "uni-datetime-picker.ok": "ok", + "uni-datetime-picker.clear": "clear", + "uni-datetime-picker.cancel": "cancel", + "uni-calender.MON": "MON", + "uni-calender.TUE": "TUE", + "uni-calender.WED": "WED", + "uni-calender.THU": "THU", + "uni-calender.FRI": "FRI", + "uni-calender.SAT": "SAT", + "uni-calender.SUN": "SUN" +} diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js new file mode 100644 index 0000000..de7509c --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js @@ -0,0 +1,8 @@ +import en from './en.json' +import zhHans from './zh-Hans.json' +import zhHant from './zh-Hant.json' +export default { + en, + 'zh-Hans': zhHans, + 'zh-Hant': zhHant +} diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json new file mode 100644 index 0000000..7bc7405 --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json @@ -0,0 +1,19 @@ +{ + "uni-datetime-picker.selectDate": "选择日期", + "uni-datetime-picker.selectTime": "选择时间", + "uni-datetime-picker.selectDateTime": "选择日期时间", + "uni-datetime-picker.startDate": "开始日期", + "uni-datetime-picker.endDate": "结束日期", + "uni-datetime-picker.startTime": "开始时间", + "uni-datetime-picker.endTime": "结束时间", + "uni-datetime-picker.ok": "确定", + "uni-datetime-picker.clear": "清除", + "uni-datetime-picker.cancel": "取消", + "uni-calender.SUN": "日", + "uni-calender.MON": "一", + "uni-calender.TUE": "二", + "uni-calender.WED": "三", + "uni-calender.THU": "四", + "uni-calender.FRI": "五", + "uni-calender.SAT": "六" +} diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json new file mode 100644 index 0000000..7d37043 --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json @@ -0,0 +1,19 @@ +{ + "uni-datetime-picker.selectDate": "選擇日期", + "uni-datetime-picker.selectTime": "選擇時間", + "uni-datetime-picker.selectDateTime": "選擇日期時間", + "uni-datetime-picker.startDate": "開始日期", + "uni-datetime-picker.endDate": "結束日期", + "uni-datetime-picker.startTime": "開始时间", + "uni-datetime-picker.endTime": "結束时间", + "uni-datetime-picker.ok": "確定", + "uni-datetime-picker.clear": "清除", + "uni-datetime-picker.cancel": "取消", + "uni-calender.SUN": "日", + "uni-calender.MON": "一", + "uni-calender.TUE": "二", + "uni-calender.WED": "三", + "uni-calender.THU": "四", + "uni-calender.FRI": "五", + "uni-calender.SAT": "六" +} diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/keypress.js b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/keypress.js new file mode 100644 index 0000000..9601aba --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/keypress.js @@ -0,0 +1,45 @@ +// #ifdef H5 +export default { + name: 'Keypress', + props: { + disable: { + type: Boolean, + default: false + } + }, + mounted () { + const keyNames = { + esc: ['Esc', 'Escape'], + tab: 'Tab', + enter: 'Enter', + space: [' ', 'Spacebar'], + up: ['Up', 'ArrowUp'], + left: ['Left', 'ArrowLeft'], + right: ['Right', 'ArrowRight'], + down: ['Down', 'ArrowDown'], + delete: ['Backspace', 'Delete', 'Del'] + } + const listener = ($event) => { + if (this.disable) { + return + } + const keyName = Object.keys(keyNames).find(key => { + const keyName = $event.key + const value = keyNames[key] + return value === keyName || (Array.isArray(value) && value.includes(keyName)) + }) + if (keyName) { + // 避免和其他按键事件冲突 + setTimeout(() => { + this.$emit(keyName, {}) + }, 0) + } + } + document.addEventListener('keyup', listener) + this.$once('hook:beforeDestroy', () => { + document.removeEventListener('keyup', listener) + }) + }, + render: () => {} +} +// #endif \ No newline at end of file diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue new file mode 100644 index 0000000..699aa63 --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue @@ -0,0 +1,927 @@ + ++ + ++ ++ ++ + +{{ (nowDate.year||'') + ' 年 ' + ( nowDate.month||'') +' 月'}} ++ ++ + + + ++ + + ++ +{{nowDate.month}} ++ ++ +{{SUNText}} ++ +{{monText}} ++ +{{TUEText}} ++ +{{WEDText}} ++ +{{THUText}} ++ +{{FRIText}} ++ +{{SATText}} ++ ++ ++ ++ + +{{tempSingleDate ? tempSingleDate : selectDateText}} ++ ++ ++ +{{tempRange.before ? tempRange.before : startDateText}} + ++ ++ + +{{tempRange.after ? tempRange.after : endDateText}} ++ ++ + +确认 ++ + + + + + diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue new file mode 100644 index 0000000..e844331 --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue @@ -0,0 +1,981 @@ + ++ ++ ++ +{{time}} ++ +{{selectTimeText}} ++ + + + + ++ +{{selectTimeText}} ++ ++ + ++ ++ +{{lessThanTen(item)}} ++ ++ +{{lessThanTen(item)}} ++ ++ +{{lessThanTen(item)}} +- +- ++ ++ + ++ ++ +{{lessThanTen(item)}} ++ ++ +{{lessThanTen(item)}} ++ ++ +{{lessThanTen(item)}} +: +: ++ ++ +{{clearText}} ++ ++ +{{cancelText}} ++ +{{okText}} ++ + + + + diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js new file mode 100644 index 0000000..efa5773 --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js @@ -0,0 +1,410 @@ +class Calendar { + constructor({ + date, + selected, + startDate, + endDate, + range, + // multipleStatus + } = {}) { + // 当前日期 + this.date = this.getDate(new Date()) // 当前初入日期 + // 打点信息 + this.selected = selected || []; + // 范围开始 + this.startDate = startDate + // 范围结束 + this.endDate = endDate + this.range = range + // 多选状态 + this.cleanMultipleStatus() + // 每周日期 + this.weeks = {} + // this._getWeek(this.date.fullDate) + // this.multipleStatus = multipleStatus + this.lastHover = false + } + /** + * 设置日期 + * @param {Object} date + */ + setDate(date) { + this.selectDate = this.getDate(date) + this._getWeek(this.selectDate.fullDate) + } + + /** + * 清理多选状态 + */ + cleanMultipleStatus() { + this.multipleStatus = { + before: '', + after: '', + data: [] + } + } + + /** + * 重置开始日期 + */ + resetSatrtDate(startDate) { + // 范围开始 + this.startDate = startDate + + } + + /** + * 重置结束日期 + */ + resetEndDate(endDate) { + // 范围结束 + this.endDate = endDate + } + + /** + * 获取任意时间 + */ + getDate(date, AddDayCount = 0, str = 'day') { + if (!date) { + date = new Date() + } + if (typeof date !== 'object') { + date = date.replace(/-/g, '/') + } + const dd = new Date(date) + switch (str) { + case 'day': + dd.setDate(dd.getDate() + AddDayCount) // 获取AddDayCount天后的日期 + break + case 'month': + if (dd.getDate() === 31) { + dd.setDate(dd.getDate() + AddDayCount) + } else { + dd.setMonth(dd.getMonth() + AddDayCount) // 获取AddDayCount天后的日期 + } + break + case 'year': + dd.setFullYear(dd.getFullYear() + AddDayCount) // 获取AddDayCount天后的日期 + break + } + const y = dd.getFullYear() + const m = dd.getMonth() + 1 < 10 ? '0' + (dd.getMonth() + 1) : dd.getMonth() + 1 // 获取当前月份的日期,不足10补0 + const d = dd.getDate() < 10 ? '0' + dd.getDate() : dd.getDate() // 获取当前几号,不足10补0 + return { + fullDate: y + '-' + m + '-' + d, + year: y, + month: m, + date: d, + day: dd.getDay() + } + } + + + /** + * 获取上月剩余天数 + */ + _getLastMonthDays(firstDay, full) { + let dateArr = [] + for (let i = firstDay; i > 0; i--) { + const beforeDate = new Date(full.year, full.month - 1, -i + 1).getDate() + dateArr.push({ + date: beforeDate, + month: full.month - 1, + disable: true + }) + } + return dateArr + } + /** + * 获取本月天数 + */ + _currentMonthDys(dateData, full) { + let dateArr = [] + let fullDate = this.date.fullDate + for (let i = 1; i <= dateData; i++) { + let isinfo = false + let nowDate = full.year + '-' + (full.month < 10 ? + full.month : full.month) + '-' + (i < 10 ? + '0' + i : i) + // 是否今天 + let isDay = fullDate === nowDate + // 获取打点信息 + let info = this.selected && this.selected.find((item) => { + if (this.dateEqual(nowDate, item.date)) { + return item + } + }) + + // 日期禁用 + let disableBefore = true + let disableAfter = true + if (this.startDate) { + // let dateCompBefore = this.dateCompare(this.startDate, fullDate) + // disableBefore = this.dateCompare(dateCompBefore ? this.startDate : fullDate, nowDate) + disableBefore = this.dateCompare(this.startDate, nowDate) + } + + if (this.endDate) { + // let dateCompAfter = this.dateCompare(fullDate, this.endDate) + // disableAfter = this.dateCompare(nowDate, dateCompAfter ? this.endDate : fullDate) + disableAfter = this.dateCompare(nowDate, this.endDate) + } + let multiples = this.multipleStatus.data + let checked = false + let multiplesStatus = -1 + if (this.range) { + if (multiples) { + multiplesStatus = multiples.findIndex((item) => { + return this.dateEqual(item, nowDate) + }) + } + if (multiplesStatus !== -1) { + checked = true + } + } + let data = { + fullDate: nowDate, + year: full.year, + date: i, + multiple: this.range ? checked : false, + beforeMultiple: this.isLogicBefore(nowDate, this.multipleStatus.before, this.multipleStatus.after), + afterMultiple: this.isLogicAfter(nowDate, this.multipleStatus.before, this.multipleStatus.after), + month: full.month, + disable: !(disableBefore && disableAfter), + isDay, + userChecked: false + } + if (info) { + data.extraInfo = info + } + + dateArr.push(data) + } + return dateArr + } + /** + * 获取下月天数 + */ + _getNextMonthDays(surplus, full) { + let dateArr = [] + for (let i = 1; i < surplus + 1; i++) { + dateArr.push({ + date: i, + month: Number(full.month) + 1, + disable: true + }) + } + return dateArr + } + + /** + * 获取当前日期详情 + * @param {Object} date + */ + getInfo(date) { + if (!date) { + date = new Date() + } + const dateInfo = this.canlender.find(item => item.fullDate === this.getDate(date).fullDate) + return dateInfo + } + + /** + * 比较时间大小 + */ + dateCompare(startDate, endDate) { + // 计算截止时间 + startDate = new Date(startDate.replace('-', '/').replace('-', '/')) + // 计算详细项的截止时间 + endDate = new Date(endDate.replace('-', '/').replace('-', '/')) + if (startDate <= endDate) { + return true + } else { + return false + } + } + + /** + * 比较时间是否相等 + */ + dateEqual(before, after) { + // 计算截止时间 + before = new Date(before.replace('-', '/').replace('-', '/')) + // 计算详细项的截止时间 + after = new Date(after.replace('-', '/').replace('-', '/')) + if (before.getTime() - after.getTime() === 0) { + return true + } else { + return false + } + } + + /** + * 比较真实起始日期 + */ + + isLogicBefore(currentDay, before, after) { + let logicBefore = before + if (before && after) { + logicBefore = this.dateCompare(before, after) ? before : after + } + return this.dateEqual(logicBefore, currentDay) + } + + isLogicAfter(currentDay, before, after) { + let logicAfter = after + if (before && after) { + logicAfter = this.dateCompare(before, after) ? after : before + } + return this.dateEqual(logicAfter, currentDay) + } + + /** + * 获取日期范围内所有日期 + * @param {Object} begin + * @param {Object} end + */ + geDateAll(begin, end) { + var arr = [] + var ab = begin.split('-') + var ae = end.split('-') + var db = new Date() + db.setFullYear(ab[0], ab[1] - 1, ab[2]) + var de = new Date() + de.setFullYear(ae[0], ae[1] - 1, ae[2]) + var unixDb = db.getTime() - 24 * 60 * 60 * 1000 + var unixDe = de.getTime() - 24 * 60 * 60 * 1000 + for (var k = unixDb; k <= unixDe;) { + k = k + 24 * 60 * 60 * 1000 + arr.push(this.getDate(new Date(parseInt(k))).fullDate) + } + return arr + } + + /** + * 获取多选状态 + */ + setMultiple(fullDate) { + let { + before, + after + } = this.multipleStatus + if (!this.range) return + if (before && after) { + if (!this.lastHover) { + this.lastHover = true + return + } + this.multipleStatus.before = fullDate + this.multipleStatus.after = '' + this.multipleStatus.data = [] + this.multipleStatus.fulldate = '' + this.lastHover = false + } else { + if (!before) { + this.multipleStatus.before = fullDate + this.lastHover = false + } else { + this.multipleStatus.after = fullDate + if (this.dateCompare(this.multipleStatus.before, this.multipleStatus.after)) { + this.multipleStatus.data = this.geDateAll(this.multipleStatus.before, this.multipleStatus + .after); + } else { + this.multipleStatus.data = this.geDateAll(this.multipleStatus.after, this.multipleStatus + .before); + } + this.lastHover = true + } + } + this._getWeek(fullDate) + } + + /** + * 鼠标 hover 更新多选状态 + */ + setHoverMultiple(fullDate) { + let { + before, + after + } = this.multipleStatus + + if (!this.range) return + if (this.lastHover) return + + if (!before) { + this.multipleStatus.before = fullDate + } else { + this.multipleStatus.after = fullDate + if (this.dateCompare(this.multipleStatus.before, this.multipleStatus.after)) { + this.multipleStatus.data = this.geDateAll(this.multipleStatus.before, this.multipleStatus.after); + } else { + this.multipleStatus.data = this.geDateAll(this.multipleStatus.after, this.multipleStatus.before); + } + } + this._getWeek(fullDate) + } + + /** + * 更新默认值多选状态 + */ + setDefaultMultiple(before, after) { + this.multipleStatus.before = before + this.multipleStatus.after = after + if (before && after) { + if (this.dateCompare(before, after)) { + this.multipleStatus.data = this.geDateAll(before, after); + this._getWeek(after) + } else { + this.multipleStatus.data = this.geDateAll(after, before); + this._getWeek(before) + } + } + } + + /** + * 获取每周数据 + * @param {Object} dateData + */ + _getWeek(dateData) { + const { + fullDate, + year, + month, + date, + day + } = this.getDate(dateData) + let firstDay = new Date(year, month - 1, 1).getDay() + let currentDay = new Date(year, month, 0).getDate() + let dates = { + lastMonthDays: this._getLastMonthDays(firstDay, this.getDate(dateData)), // 上个月末尾几天 + currentMonthDys: this._currentMonthDys(currentDay, this.getDate(dateData)), // 本月天数 + nextMonthDays: [], // 下个月开始几天 + weeks: [] + } + let canlender = [] + const surplus = 42 - (dates.lastMonthDays.length + dates.currentMonthDys.length) + dates.nextMonthDays = this._getNextMonthDays(surplus, this.getDate(dateData)) + canlender = canlender.concat(dates.lastMonthDays, dates.currentMonthDys, dates.nextMonthDays) + let weeks = {} + // 拼接数组 上个月开始几天 + 本月天数+ 下个月开始几天 + for (let i = 0; i < canlender.length; i++) { + if (i % 7 === 0) { + weeks[parseInt(i / 7)] = new Array(7) + } + weeks[parseInt(i / 7)][i % 7] = canlender[i] + } + this.canlender = canlender + this.weeks = weeks + } + + //静态方法 + // static init(date) { + // if (!this.instance) { + // this.instance = new Calendar(date); + // } + // return this.instance; + // } +} + + +export default Calendar diff --git a/uni_modules/uni-datetime-picker/package.json b/uni_modules/uni-datetime-picker/package.json new file mode 100644 index 0000000..5e0ff11 --- /dev/null +++ b/uni_modules/uni-datetime-picker/package.json @@ -0,0 +1,90 @@ +{ + "id": "uni-datetime-picker", + "displayName": "uni-datetime-picker 日期选择器", + "version": "2.2.2", + "description": "uni-datetime-picker 日期时间选择器,支持日历,支持范围选择", + "keywords": [ + "uni-datetime-picker", + "uni-ui", + "uniui", + "日期时间选择器", + "日期时间" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [ + "uni-scss", + "uni-icons" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "n" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-datetime-picker/readme.md b/uni_modules/uni-datetime-picker/readme.md new file mode 100644 index 0000000..162fbef --- /dev/null +++ b/uni_modules/uni-datetime-picker/readme.md @@ -0,0 +1,21 @@ + + +> `重要通知:组件升级更新 2.0.0 后,支持日期+时间范围选择,组件 ui 将使用日历选择日期,ui 变化较大,同时支持 PC 和 移动端。此版本不向后兼容,不再支持单独的时间选择(type=time)及相关的 hide-second 属性(时间选可使用内置组件 picker)。若仍需使用旧版本,可在插件市场下载*非uni_modules版本*,旧版本将不再维护` + +## DatetimePicker 时间选择器 + +> **组件名:uni-datetime-picker** +> 代码块: `uDatetimePicker` + + +该组件的优势是,支持**时间戳**输入和输出(起始时间、终止时间也支持时间戳),可**同时选择**日期和时间。 + +若只是需要单独选择日期和时间,不需要时间戳输入和输出,可使用原生的 picker 组件。 + +**_点击 picker 默认值规则:_** + +- 若设置初始值 value, 会显示在 picker 显示框中 +- 若无初始值 value,则初始值 value 为当前本地时间 Date.now(), 但不会显示在 picker 显示框中 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-datetime-picker) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-scss/changelog.md b/uni_modules/uni-scss/changelog.md new file mode 100644 index 0000000..b863bb0 --- /dev/null +++ b/uni_modules/uni-scss/changelog.md @@ -0,0 +1,8 @@ +## 1.0.3(2022-01-21) +- 优化 组件示例 +## 1.0.2(2021-11-22) +- 修复 / 符号在 vue 不同版本兼容问题引起的报错问题 +## 1.0.1(2021-11-22) +- 修复 vue3中scss语法兼容问题 +## 1.0.0(2021-11-18) +- init diff --git a/uni_modules/uni-scss/index.scss b/uni_modules/uni-scss/index.scss new file mode 100644 index 0000000..1744a5f --- /dev/null +++ b/uni_modules/uni-scss/index.scss @@ -0,0 +1 @@ +@import './styles/index.scss'; diff --git a/uni_modules/uni-scss/package.json b/uni_modules/uni-scss/package.json new file mode 100644 index 0000000..7cc0ccb --- /dev/null +++ b/uni_modules/uni-scss/package.json @@ -0,0 +1,82 @@ +{ + "id": "uni-scss", + "displayName": "uni-scss 辅助样式", + "version": "1.0.3", + "description": "uni-sass是uni-ui提供的一套全局样式 ,通过一些简单的类名和sass变量,实现简单的页面布局操作,比如颜色、边距、圆角等。", + "keywords": [ + "uni-scss", + "uni-ui", + "辅助样式" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "category": [ + "JS SDK", + "通用 SDK" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "u" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "n", + "联盟": "n" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-scss/readme.md b/uni_modules/uni-scss/readme.md new file mode 100644 index 0000000..b7d1c25 --- /dev/null +++ b/uni_modules/uni-scss/readme.md @@ -0,0 +1,4 @@ +`uni-sass` 是 `uni-ui`提供的一套全局样式 ,通过一些简单的类名和`sass`变量,实现简单的页面布局操作,比如颜色、边距、圆角等。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-sass) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-scss/styles/index.scss b/uni_modules/uni-scss/styles/index.scss new file mode 100644 index 0000000..ffac4fe --- /dev/null +++ b/uni_modules/uni-scss/styles/index.scss @@ -0,0 +1,7 @@ +@import './setting/_variables.scss'; +@import './setting/_border.scss'; +@import './setting/_color.scss'; +@import './setting/_space.scss'; +@import './setting/_radius.scss'; +@import './setting/_text.scss'; +@import './setting/_styles.scss'; diff --git a/uni_modules/uni-scss/styles/setting/_border.scss b/uni_modules/uni-scss/styles/setting/_border.scss new file mode 100644 index 0000000..12a11c3 --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_border.scss @@ -0,0 +1,3 @@ +.uni-border { + border: 1px $uni-border-1 solid; +} \ No newline at end of file diff --git a/uni_modules/uni-scss/styles/setting/_color.scss b/uni_modules/uni-scss/styles/setting/_color.scss new file mode 100644 index 0000000..1ededd9 --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_color.scss @@ -0,0 +1,66 @@ + +// TODO 暂时不需要 class ,需要用户使用变量实现 ,如果使用类名其实并不推荐 +// @mixin get-styles($k,$c) { +// @if $k == size or $k == weight{ +// font-#{$k}:#{$c} +// }@else{ +// #{$k}:#{$c} +// } +// } +$uni-ui-color:( + // 主色 + primary: $uni-primary, + primary-disable: $uni-primary-disable, + primary-light: $uni-primary-light, + // 辅助色 + success: $uni-success, + success-disable: $uni-success-disable, + success-light: $uni-success-light, + warning: $uni-warning, + warning-disable: $uni-warning-disable, + warning-light: $uni-warning-light, + error: $uni-error, + error-disable: $uni-error-disable, + error-light: $uni-error-light, + info: $uni-info, + info-disable: $uni-info-disable, + info-light: $uni-info-light, + // 中性色 + main-color: $uni-main-color, + base-color: $uni-base-color, + secondary-color: $uni-secondary-color, + extra-color: $uni-extra-color, + // 背景色 + bg-color: $uni-bg-color, + // 边框颜色 + border-1: $uni-border-1, + border-2: $uni-border-2, + border-3: $uni-border-3, + border-4: $uni-border-4, + // 黑色 + black:$uni-black, + // 白色 + white:$uni-white, + // 透明 + transparent:$uni-transparent +) !default; +@each $key, $child in $uni-ui-color { + .uni-#{"" + $key} { + color: $child; + } + .uni-#{"" + $key}-bg { + background-color: $child; + } +} +.uni-shadow-sm { + box-shadow: $uni-shadow-sm; +} +.uni-shadow-base { + box-shadow: $uni-shadow-base; +} +.uni-shadow-lg { + box-shadow: $uni-shadow-lg; +} +.uni-mask { + background-color:$uni-mask; +} diff --git a/uni_modules/uni-scss/styles/setting/_radius.scss b/uni_modules/uni-scss/styles/setting/_radius.scss new file mode 100644 index 0000000..9a0428b --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_radius.scss @@ -0,0 +1,55 @@ +@mixin radius($r,$d:null ,$important: false){ + $radius-value:map-get($uni-radius, $r) if($important, !important, null); + // Key exists within the $uni-radius variable + @if (map-has-key($uni-radius, $r) and $d){ + @if $d == t { + border-top-left-radius:$radius-value; + border-top-right-radius:$radius-value; + }@else if $d == r { + border-top-right-radius:$radius-value; + border-bottom-right-radius:$radius-value; + }@else if $d == b { + border-bottom-left-radius:$radius-value; + border-bottom-right-radius:$radius-value; + }@else if $d == l { + border-top-left-radius:$radius-value; + border-bottom-left-radius:$radius-value; + }@else if $d == tl { + border-top-left-radius:$radius-value; + }@else if $d == tr { + border-top-right-radius:$radius-value; + }@else if $d == br { + border-bottom-right-radius:$radius-value; + }@else if $d == bl { + border-bottom-left-radius:$radius-value; + } + }@else{ + border-radius:$radius-value; + } +} + +@each $key, $child in $uni-radius { + @if($key){ + .uni-radius-#{"" + $key} { + @include radius($key) + } + }@else{ + .uni-radius { + @include radius($key) + } + } +} + +@each $direction in t, r, b, l,tl, tr, br, bl { + @each $key, $child in $uni-radius { + @if($key){ + .uni-radius-#{"" + $direction}-#{"" + $key} { + @include radius($key,$direction,false) + } + }@else{ + .uni-radius-#{$direction} { + @include radius($key,$direction,false) + } + } + } +} diff --git a/uni_modules/uni-scss/styles/setting/_space.scss b/uni_modules/uni-scss/styles/setting/_space.scss new file mode 100644 index 0000000..3c89528 --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_space.scss @@ -0,0 +1,56 @@ + +@mixin fn($space,$direction,$size,$n) { + @if $n { + #{$space}-#{$direction}: #{$size*$uni-space-root}px + } @else { + #{$space}-#{$direction}: #{-$size*$uni-space-root}px + } +} +@mixin get-styles($direction,$i,$space,$n){ + @if $direction == t { + @include fn($space, top,$i,$n); + } + @if $direction == r { + @include fn($space, right,$i,$n); + } + @if $direction == b { + @include fn($space, bottom,$i,$n); + } + @if $direction == l { + @include fn($space, left,$i,$n); + } + @if $direction == x { + @include fn($space, left,$i,$n); + @include fn($space, right,$i,$n); + } + @if $direction == y { + @include fn($space, top,$i,$n); + @include fn($space, bottom,$i,$n); + } + @if $direction == a { + @if $n { + #{$space}:#{$i*$uni-space-root}px; + } @else { + #{$space}:#{-$i*$uni-space-root}px; + } + } +} + +@each $orientation in m,p { + $space: margin; + @if $orientation == m { + $space: margin; + } @else { + $space: padding; + } + @for $i from 0 through 16 { + @each $direction in t, r, b, l, x, y, a { + .uni-#{$orientation}#{$direction}-#{$i} { + @include get-styles($direction,$i,$space,true); + } + .uni-#{$orientation}#{$direction}-n#{$i} { + @include get-styles($direction,$i,$space,false); + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-scss/styles/setting/_styles.scss b/uni_modules/uni-scss/styles/setting/_styles.scss new file mode 100644 index 0000000..689afec --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_styles.scss @@ -0,0 +1,167 @@ +/* #ifndef APP-NVUE */ + +$-color-white:#fff; +$-color-black:#000; +@mixin base-style($color) { + color: #fff; + background-color: $color; + border-color: mix($-color-black, $color, 8%); + &:not([hover-class]):active { + background: mix($-color-black, $color, 10%); + border-color: mix($-color-black, $color, 20%); + color: $-color-white; + outline: none; + } +} +@mixin is-color($color) { + @include base-style($color); + &[loading] { + @include base-style($color); + &::before { + margin-right:5px; + } + } + &[disabled] { + &, + &[loading], + &:not([hover-class]):active { + color: $-color-white; + border-color: mix(darken($color,10%), $-color-white); + background-color: mix($color, $-color-white); + } + } + +} +@mixin base-plain-style($color) { + color:$color; + background-color: mix($-color-white, $color, 90%); + border-color: mix($-color-white, $color, 70%); + &:not([hover-class]):active { + background: mix($-color-white, $color, 80%); + color: $color; + outline: none; + border-color: mix($-color-white, $color, 50%); + } +} +@mixin is-plain($color){ + &[plain] { + @include base-plain-style($color); + &[loading] { + @include base-plain-style($color); + &::before { + margin-right:5px; + } + } + &[disabled] { + &, + &:active { + color: mix($-color-white, $color, 40%); + background-color: mix($-color-white, $color, 90%); + border-color: mix($-color-white, $color, 80%); + } + } + } +} + + +.uni-btn { + margin: 5px; + color: #393939; + border:1px solid #ccc; + font-size: 16px; + font-weight: 200; + background-color: #F9F9F9; + // TODO 暂时处理边框隐藏一边的问题 + overflow: visible; + &::after{ + border: none; + } + + &:not([type]),&[type=default] { + color: #999; + &[loading] { + background: none; + &::before { + margin-right:5px; + } + } + + + + &[disabled]{ + color: mix($-color-white, #999, 60%); + &, + &[loading], + &:active { + color: mix($-color-white, #999, 60%); + background-color: mix($-color-white,$-color-black , 98%); + border-color: mix($-color-white, #999, 85%); + } + } + + &[plain] { + color: #999; + background: none; + border-color: $uni-border-1; + &:not([hover-class]):active { + background: none; + color: mix($-color-white, $-color-black, 80%); + border-color: mix($-color-white, $-color-black, 90%); + outline: none; + } + &[disabled]{ + &, + &[loading], + &:active { + background: none; + color: mix($-color-white, #999, 60%); + border-color: mix($-color-white, #999, 85%); + } + } + } + } + + &:not([hover-class]):active { + color: mix($-color-white, $-color-black, 50%); + } + + &[size=mini] { + font-size: 16px; + font-weight: 200; + border-radius: 8px; + } + + + + &.uni-btn-small { + font-size: 14px; + } + &.uni-btn-mini { + font-size: 12px; + } + + &.uni-btn-radius { + border-radius: 999px; + } + &[type=primary] { + @include is-color($uni-primary); + @include is-plain($uni-primary) + } + &[type=success] { + @include is-color($uni-success); + @include is-plain($uni-success) + } + &[type=error] { + @include is-color($uni-error); + @include is-plain($uni-error) + } + &[type=warning] { + @include is-color($uni-warning); + @include is-plain($uni-warning) + } + &[type=info] { + @include is-color($uni-info); + @include is-plain($uni-info) + } +} +/* #endif */ diff --git a/uni_modules/uni-scss/styles/setting/_text.scss b/uni_modules/uni-scss/styles/setting/_text.scss new file mode 100644 index 0000000..a34d08f --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_text.scss @@ -0,0 +1,24 @@ +@mixin get-styles($k,$c) { + @if $k == size or $k == weight{ + font-#{$k}:#{$c} + }@else{ + #{$k}:#{$c} + } +} + +@each $key, $child in $uni-headings { + /* #ifndef APP-NVUE */ + .uni-#{$key} { + @each $k, $c in $child { + @include get-styles($k,$c) + } + } + /* #endif */ + /* #ifdef APP-NVUE */ + .container .uni-#{$key} { + @each $k, $c in $child { + @include get-styles($k,$c) + } + } + /* #endif */ +} diff --git a/uni_modules/uni-scss/styles/setting/_variables.scss b/uni_modules/uni-scss/styles/setting/_variables.scss new file mode 100644 index 0000000..557d3d7 --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_variables.scss @@ -0,0 +1,146 @@ +// @use "sass:math"; +@import '../tools/functions.scss'; +// 间距基础倍数 +$uni-space-root: 2 !default; +// 边框半径默认值 +$uni-radius-root:5px !default; +$uni-radius: () !default; +// 边框半径断点 +$uni-radius: map-deep-merge( + ( + 0: 0, + // TODO 当前版本暂时不支持 sm 属性 + // 'sm': math.div($uni-radius-root, 2), + null: $uni-radius-root, + 'lg': $uni-radius-root * 2, + 'xl': $uni-radius-root * 6, + 'pill': 9999px, + 'circle': 50% + ), + $uni-radius +); +// 字体家族 +$body-font-family: 'Roboto', sans-serif !default; +// 文本 +$heading-font-family: $body-font-family !default; +$uni-headings: () !default; +$letterSpacing: -0.01562em; +$uni-headings: map-deep-merge( + ( + 'h1': ( + size: 32px, + weight: 300, + line-height: 50px, + // letter-spacing:-0.01562em + ), + 'h2': ( + size: 28px, + weight: 300, + line-height: 40px, + // letter-spacing: -0.00833em + ), + 'h3': ( + size: 24px, + weight: 400, + line-height: 32px, + // letter-spacing: normal + ), + 'h4': ( + size: 20px, + weight: 400, + line-height: 30px, + // letter-spacing: 0.00735em + ), + 'h5': ( + size: 16px, + weight: 400, + line-height: 24px, + // letter-spacing: normal + ), + 'h6': ( + size: 14px, + weight: 500, + line-height: 18px, + // letter-spacing: 0.0125em + ), + 'subtitle': ( + size: 12px, + weight: 400, + line-height: 20px, + // letter-spacing: 0.00937em + ), + 'body': ( + font-size: 14px, + font-weight: 400, + line-height: 22px, + // letter-spacing: 0.03125em + ), + 'caption': ( + 'size': 12px, + 'weight': 400, + 'line-height': 20px, + // 'letter-spacing': 0.03333em, + // 'text-transform': false + ) + ), + $uni-headings +); + + + +// 主色 +$uni-primary: #2979ff !default; +$uni-primary-disable:lighten($uni-primary,20%) !default; +$uni-primary-light: lighten($uni-primary,25%) !default; + +// 辅助色 +// 除了主色外的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。 +$uni-success: #18bc37 !default; +$uni-success-disable:lighten($uni-success,20%) !default; +$uni-success-light: lighten($uni-success,25%) !default; + +$uni-warning: #f3a73f !default; +$uni-warning-disable:lighten($uni-warning,20%) !default; +$uni-warning-light: lighten($uni-warning,25%) !default; + +$uni-error: #e43d33 !default; +$uni-error-disable:lighten($uni-error,20%) !default; +$uni-error-light: lighten($uni-error,25%) !default; + +$uni-info: #8f939c !default; +$uni-info-disable:lighten($uni-info,20%) !default; +$uni-info-light: lighten($uni-info,25%) !default; + +// 中性色 +// 中性色用于文本、背景和边框颜色。通过运用不同的中性色,来表现层次结构。 +$uni-main-color: #3a3a3a !default; // 主要文字 +$uni-base-color: #6a6a6a !default; // 常规文字 +$uni-secondary-color: #909399 !default; // 次要文字 +$uni-extra-color: #c7c7c7 !default; // 辅助说明 + +// 边框颜色 +$uni-border-1: #F0F0F0 !default; +$uni-border-2: #EDEDED !default; +$uni-border-3: #DCDCDC !default; +$uni-border-4: #B9B9B9 !default; + +// 常规色 +$uni-black: #000000 !default; +$uni-white: #ffffff !default; +$uni-transparent: rgba($color: #000000, $alpha: 0) !default; + +// 背景色 +$uni-bg-color: #f7f7f7 !default; + +/* 水平间距 */ +$uni-spacing-sm: 8px !default; +$uni-spacing-base: 15px !default; +$uni-spacing-lg: 30px !default; + +// 阴影 +$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5) !default; +$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2) !default; +$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5) !default; + +// 蒙版 +$uni-mask: rgba($color: #000000, $alpha: 0.4) !default; diff --git a/uni_modules/uni-scss/styles/tools/functions.scss b/uni_modules/uni-scss/styles/tools/functions.scss new file mode 100644 index 0000000..ac6f63e --- /dev/null +++ b/uni_modules/uni-scss/styles/tools/functions.scss @@ -0,0 +1,19 @@ +// 合并 map +@function map-deep-merge($parent-map, $child-map){ + $result: $parent-map; + @each $key, $child in $child-map { + $parent-has-key: map-has-key($result, $key); + $parent-value: map-get($result, $key); + $parent-type: type-of($parent-value); + $child-type: type-of($child); + $parent-is-map: $parent-type == map; + $child-is-map: $child-type == map; + + @if (not $parent-has-key) or ($parent-type != $child-type) or (not ($parent-is-map and $child-is-map)){ + $result: map-merge($result, ( $key: $child )); + }@else { + $result: map-merge($result, ( $key: map-deep-merge($parent-value, $child) )); + } + } + @return $result; +}; diff --git a/uni_modules/uni-scss/theme.scss b/uni_modules/uni-scss/theme.scss new file mode 100644 index 0000000..80ee62f --- /dev/null +++ b/uni_modules/uni-scss/theme.scss @@ -0,0 +1,31 @@ +// 间距基础倍数 +$uni-space-root: 2; +// 边框半径默认值 +$uni-radius-root:5px; +// 主色 +$uni-primary: #2979ff; +// 辅助色 +$uni-success: #4cd964; +// 警告色 +$uni-warning: #f0ad4e; +// 错误色 +$uni-error: #dd524d; +// 描述色 +$uni-info: #909399; +// 中性色 +$uni-main-color: #303133; +$uni-base-color: #606266; +$uni-secondary-color: #909399; +$uni-extra-color: #C0C4CC; +// 背景色 +$uni-bg-color: #f5f5f5; +// 边框颜色 +$uni-border-1: #DCDFE6; +$uni-border-2: #E4E7ED; +$uni-border-3: #EBEEF5; +$uni-border-4: #F2F6FC; + +// 常规色 +$uni-black: #000000; +$uni-white: #ffffff; +$uni-transparent: rgba($color: #000000, $alpha: 0); diff --git a/uni_modules/uni-scss/variables.scss b/uni_modules/uni-scss/variables.scss new file mode 100644 index 0000000..1c062d4 --- /dev/null +++ b/uni_modules/uni-scss/variables.scss @@ -0,0 +1,62 @@ +@import './styles/setting/_variables.scss'; +// 间距基础倍数 +$uni-space-root: 2; +// 边框半径默认值 +$uni-radius-root:5px; + +// 主色 +$uni-primary: #2979ff; +$uni-primary-disable:mix(#fff,$uni-primary,50%); +$uni-primary-light: mix(#fff,$uni-primary,80%); + +// 辅助色 +// 除了主色外的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。 +$uni-success: #18bc37; +$uni-success-disable:mix(#fff,$uni-success,50%); +$uni-success-light: mix(#fff,$uni-success,80%); + +$uni-warning: #f3a73f; +$uni-warning-disable:mix(#fff,$uni-warning,50%); +$uni-warning-light: mix(#fff,$uni-warning,80%); + +$uni-error: #e43d33; +$uni-error-disable:mix(#fff,$uni-error,50%); +$uni-error-light: mix(#fff,$uni-error,80%); + +$uni-info: #8f939c; +$uni-info-disable:mix(#fff,$uni-info,50%); +$uni-info-light: mix(#fff,$uni-info,80%); + +// 中性色 +// 中性色用于文本、背景和边框颜色。通过运用不同的中性色,来表现层次结构。 +$uni-main-color: #3a3a3a; // 主要文字 +$uni-base-color: #6a6a6a; // 常规文字 +$uni-secondary-color: #909399; // 次要文字 +$uni-extra-color: #c7c7c7; // 辅助说明 + +// 边框颜色 +$uni-border-1: #F0F0F0; +$uni-border-2: #EDEDED; +$uni-border-3: #DCDCDC; +$uni-border-4: #B9B9B9; + +// 常规色 +$uni-black: #000000; +$uni-white: #ffffff; +$uni-transparent: rgba($color: #000000, $alpha: 0); + +// 背景色 +$uni-bg-color: #f7f7f7; + +/* 水平间距 */ +$uni-spacing-sm: 8px; +$uni-spacing-base: 15px; +$uni-spacing-lg: 30px; + +// 阴影 +$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5); +$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2); +$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5); + +// 蒙版 +$uni-mask: rgba($color: #000000, $alpha: 0.4);+ + ++ ++ ++ ++ + + ++ + + + +{{rangeSeparator}} ++ ++ + + ++ + ++ + + ++ + ++ + + +{{okText}} ++ + ++ + ++ + ++ + ++ + + ++ + ++ ++ + + +{{clearText}} +{{okText}} ++