Эх сурвалжийг харах

很多人找不到剩下两个前端的项目在哪里,只能把前端的项目放在一起了

LGH 5 жил өмнө
parent
commit
6f3be736cd
100 өөрчлөгдсөн 4840 нэмэгдсэн , 0 устгасан
  1. 661 0
      mall4m/LICENSE
  2. 69 0
      mall4m/README.md
  3. 24 0
      mall4m/app.js
  4. 62 0
      mall4m/app.json
  5. 31 0
      mall4m/app.wxss
  6. 67 0
      mall4m/components/coupon/coupon.js
  7. 4 0
      mall4m/components/coupon/coupon.json
  8. 30 0
      mall4m/components/coupon/coupon.wxml
  9. 118 0
      mall4m/components/coupon/coupon.wxss
  10. 30 0
      mall4m/components/production/production.js
  11. 4 0
      mall4m/components/production/production.json
  12. 19 0
      mall4m/components/production/production.wxml
  13. 66 0
      mall4m/components/production/production.wxss
  14. BIN
      mall4m/images/icon/addr.png
  15. BIN
      mall4m/images/icon/bg1.png
  16. BIN
      mall4m/images/icon/car-new.png
  17. BIN
      mall4m/images/icon/car.png
  18. BIN
      mall4m/images/icon/clear-his.png
  19. BIN
      mall4m/images/icon/coupon-ot.png
  20. BIN
      mall4m/images/icon/coupon-used.png
  21. BIN
      mall4m/images/icon/delive-dot.png
  22. BIN
      mall4m/images/icon/delivery-car.png
  23. BIN
      mall4m/images/icon/dot.png
  24. BIN
      mall4m/images/icon/empty-cash.png
  25. BIN
      mall4m/images/icon/everydaySale.png
  26. BIN
      mall4m/images/icon/getCoupon.png
  27. BIN
      mall4m/images/icon/horn.png
  28. BIN
      mall4m/images/icon/menu-01.png
  29. BIN
      mall4m/images/icon/menu-02.png
  30. BIN
      mall4m/images/icon/menu-03.png
  31. BIN
      mall4m/images/icon/menu-04.png
  32. BIN
      mall4m/images/icon/more.png
  33. BIN
      mall4m/images/icon/myAddr.png
  34. BIN
      mall4m/images/icon/myCoupon.png
  35. BIN
      mall4m/images/icon/newProd.png
  36. BIN
      mall4m/images/icon/neweveryday.png
  37. BIN
      mall4m/images/icon/newprods.png
  38. BIN
      mall4m/images/icon/plus-sign.png
  39. BIN
      mall4m/images/icon/prod-col-red.png
  40. BIN
      mall4m/images/icon/prod-col.png
  41. BIN
      mall4m/images/icon/promotion.png
  42. BIN
      mall4m/images/icon/revise.png
  43. BIN
      mall4m/images/icon/search-01.png
  44. BIN
      mall4m/images/icon/search-col.png
  45. BIN
      mall4m/images/icon/search-col2.png
  46. BIN
      mall4m/images/icon/search.png
  47. BIN
      mall4m/images/icon/star-empty.png
  48. BIN
      mall4m/images/icon/star-red.png
  49. BIN
      mall4m/images/icon/timePrice.png
  50. BIN
      mall4m/images/icon/toComment.png
  51. BIN
      mall4m/images/icon/toDelivery.png
  52. BIN
      mall4m/images/icon/toPay.png
  53. BIN
      mall4m/images/icon/toTake.png
  54. BIN
      mall4m/images/icon/tuiguang01.png
  55. BIN
      mall4m/images/icon/tuiguang02.png
  56. BIN
      mall4m/images/icon/tuiguang03.png
  57. BIN
      mall4m/images/tabbar/basket-sel.png
  58. BIN
      mall4m/images/tabbar/basket.png
  59. BIN
      mall4m/images/tabbar/category-sel.png
  60. BIN
      mall4m/images/tabbar/category.png
  61. BIN
      mall4m/images/tabbar/homepage-sel.png
  62. BIN
      mall4m/images/tabbar/homepage.png
  63. BIN
      mall4m/images/tabbar/user-sel.png
  64. BIN
      mall4m/images/tabbar/user.png
  65. 306 0
      mall4m/pages/basket/basket.js
  66. 6 0
      mall4m/pages/basket/basket.json
  67. 114 0
      mall4m/pages/basket/basket.wxml
  68. 387 0
      mall4m/pages/basket/basket.wxss
  69. 106 0
      mall4m/pages/binding-phone/binding-phone.js
  70. 6 0
      mall4m/pages/binding-phone/binding-phone.json
  71. 21 0
      mall4m/pages/binding-phone/binding-phone.wxml
  72. 69 0
      mall4m/pages/binding-phone/binding-phone.wxss
  73. 140 0
      mall4m/pages/category/category.js
  74. 6 0
      mall4m/pages/category/category.json
  75. 58 0
      mall4m/pages/category/category.wxml
  76. 223 0
      mall4m/pages/category/category.wxss
  77. 98 0
      mall4m/pages/delivery-address/delivery-address.js
  78. 6 0
      mall4m/pages/delivery-address/delivery-address.json
  79. 37 0
      mall4m/pages/delivery-address/delivery-address.wxml
  80. 101 0
      mall4m/pages/delivery-address/delivery-address.wxss
  81. 411 0
      mall4m/pages/editAddress/editAddress.js
  82. 6 0
      mall4m/pages/editAddress/editAddress.json
  83. 66 0
      mall4m/pages/editAddress/editAddress.wxml
  84. 181 0
      mall4m/pages/editAddress/editAddress.wxss
  85. 88 0
      mall4m/pages/express-delivery/express-delivery.js
  86. 6 0
      mall4m/pages/express-delivery/express-delivery.json
  87. 35 0
      mall4m/pages/express-delivery/express-delivery.wxml
  88. 184 0
      mall4m/pages/express-delivery/express-delivery.wxss
  89. 216 0
      mall4m/pages/index/index.js
  90. 6 0
      mall4m/pages/index/index.json
  91. 151 0
      mall4m/pages/index/index.wxml
  92. 462 0
      mall4m/pages/index/index.wxss
  93. 73 0
      mall4m/pages/login/login.js
  94. 3 0
      mall4m/pages/login/login.json
  95. 5 0
      mall4m/pages/login/login.wxml
  96. 44 0
      mall4m/pages/login/login.wxss
  97. 15 0
      mall4m/pages/logs/logs.js
  98. 4 0
      mall4m/pages/logs/logs.json
  99. 6 0
      mall4m/pages/logs/logs.wxml
  100. 9 0
      mall4m/pages/logs/logs.wxss

+ 661 - 0
mall4m/LICENSE

@@ -0,0 +1,661 @@
+                    GNU AFFERO GENERAL PUBLIC LICENSE
+                       Version 3, 19 November 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU Affero General Public License is a free, copyleft license for
+software and other kinds of works, specifically designed to ensure
+cooperation with the community in the case of network server software.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+our General Public Licenses are intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  Developers that use our General Public Licenses protect your rights
+with two steps: (1) assert copyright on the software, and (2) offer
+you this License which gives you legal permission to copy, distribute
+and/or modify the software.
+
+  A secondary benefit of defending all users' freedom is that
+improvements made in alternate versions of the program, if they
+receive widespread use, become available for other developers to
+incorporate.  Many developers of free software are heartened and
+encouraged by the resulting cooperation.  However, in the case of
+software used on network servers, this result may fail to come about.
+The GNU General Public License permits making a modified version and
+letting the public access it on a server without ever releasing its
+source code to the public.
+
+  The GNU Affero General Public License is designed specifically to
+ensure that, in such cases, the modified source code becomes available
+to the community.  It requires the operator of a network server to
+provide the source code of the modified version running there to the
+users of that server.  Therefore, public use of a modified version, on
+a publicly accessible server, gives the public access to the source
+code of the modified version.
+
+  An older license, called the Affero General Public License and
+published by Affero, was designed to accomplish similar goals.  This is
+a different license, not a version of the Affero GPL, but Affero has
+released a new version of the Affero GPL which permits relicensing under
+this license.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU Affero General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Remote Network Interaction; Use with the GNU General Public License.
+
+  Notwithstanding any other provision of this License, if you modify the
+Program, your modified version must prominently offer all users
+interacting with it remotely through a computer network (if your version
+supports such interaction) an opportunity to receive the Corresponding
+Source of your version by providing access to the Corresponding Source
+from a network server at no charge, through some standard or customary
+means of facilitating copying of software.  This Corresponding Source
+shall include the Corresponding Source for any work covered by version 3
+of the GNU General Public License that is incorporated pursuant to the
+following paragraph.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the work with which it is combined will remain governed by version
+3 of the GNU General Public License.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU Affero General Public License from time to time.  Such new versions
+will be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU Affero General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU Affero General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU Affero General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU Affero General Public License as published
+    by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+
+    You should have received a copy of the GNU Affero General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If your software can interact with users remotely through a computer
+network, you should also make sure that it provides a way for users to
+get its source.  For example, if your program is a web application, its
+interface could display a "Source" link that leads users to an archive
+of the code.  There are many ways you could offer source, and different
+solutions will be better for different programs; see section 13 for the
+specific requirements.
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU AGPL, see
+<http://www.gnu.org/licenses/>.

+ 69 - 0
mall4m/README.md

@@ -0,0 +1,69 @@
+一个基于vue、element ui 的轻量级、前后端分离、拥有完整sku和下单流程的完全开源商城 小程序端
+
+
+
+## 前言
+
+`亚米商城`项目致力于为中小企业打造一个完整、易于维护的开源的电商系统,采用现阶段流行技术实现。后台管理系统包含商品管理、订单管理、运费模板、规格管理、会员管理、运营管理、内容管理、统计报表、权限管理、设置等模块。
+
+
+## 授权
+
+Mall4j官网 https://www.mall4j.com
+
+Mall4j 使用 AGPLv3 开源,请遵守 AGPLv3 的相关条款,或者联系作者获取商业授权(https://www.mall4j.com)
+
+
+## 项目链接
+
+java后台:https://gitee.com/gz-yami/mall4j
+
+vue中后台:https://gitee.com/gz-yami/mall4v
+
+小程序:https://gitee.com/gz-yami/mall4m
+
+
+
+## 演示地址
+
+ **由于我们并不希望小程序的数据被弄混乱,我们弄了两个数据库。因此,您修改了后台的商品信息,小程序并不能看到!** 
+
+后台:<http://mall4j-admin.gz-yami.com>  账号:admin/123456
+
+小程序:1. 扫描二维码
+
+![小程序](https://gitee.com/gz-yami/mall4j/raw/master/screenshot/miniQrcode.jpg)
+
+​		2. 搜索小程序 **亚米商城** 
+
+
+
+## 相关截图
+
+![首页](https://gitee.com/gz-yami/mall4m/raw/master/screenshot/index.jpg)
+
+![商品详情](https://gitee.com/gz-yami/mall4m/raw/master/screenshot/prodInfo.jpg)
+
+![购物车](https://gitee.com/gz-yami/mall4m/raw/master/screenshot/shopCart.jpg)
+
+![sku](https://gitee.com/gz-yami/mall4m/raw/master/screenshot/sku.jpg)
+
+![我的](https://gitee.com/gz-yami/mall4m/raw/master/screenshot/my.jpg)
+
+
+
+
+
+
+
+## 提交反馈
+
+提问之前,请先阅读[提问的智慧](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/master/README-zh_CN.md):
+
+- QQ群:722835385
+
+  ![QQ群](https://gitee.com/gz-yami/mall4j/raw/master/screenshot/qqGroup.png)
+
+- 论坛:<http://bbs.gz-yami.com>
+
+- 商务邮箱:yamitech@163.com

+ 24 - 0
mall4m/app.js

@@ -0,0 +1,24 @@
+//app.js
+var http = require("utils/http.js");
+App({
+  onLaunch: function () {
+    http.getToken();
+    wx.getSetting({
+      success(res) {
+        if (!res.authSetting['scope.userInfo']) {
+          wx.navigateTo({
+            url: '/pages/login/login',
+          })
+        }
+      }
+    })
+  },
+  globalData: {
+    // 定义全局请求队列
+    requestQueue: [],
+    // 是否正在进行登陆
+    isLanding: true,
+    // 购物车商品数量
+    totalCartCount: 0
+  }
+})

+ 62 - 0
mall4m/app.json

@@ -0,0 +1,62 @@
+{
+  "pages": [
+    
+    "pages/index/index",
+    "pages/logs/logs",
+    "pages/user/user",
+    "pages/basket/basket",
+    "pages/category/category",
+    "pages/search-page/search-page",
+    "pages/delivery-address/delivery-address",
+    "pages/editAddress/editAddress",
+    "pages/orderList/orderList",
+    "pages/order-detail/order-detail",
+    "pages/submit-order/submit-order",
+    "pages/binding-phone/binding-phone",
+    "pages/express-delivery/express-delivery",
+    "pages/pay-result/pay-result",
+    "pages/search-prod-show/search-prod-show",
+    "pages/prod/prod",
+    "pages/login/login",
+    "pages/prod-classify/prod-classify",
+    "pages/recent-news/recent-news",
+    "pages/news-detail/news-detail"
+  ],
+  "window": {
+    "backgroundTextStyle": "light",
+    "navigationBarBackgroundColor": "#fff",
+    "navigationBarTitleText": "WeChat",
+    "navigationBarTextStyle": "black"
+  },
+  "tabBar": {
+    "selectedColor": "#3a86b9",
+    "color": "#b8b8b8",
+    "list": [
+      {
+        "pagePath": "pages/index/index",
+        "text": "首页",
+        "iconPath": "images/tabbar/homepage.png",
+        "selectedIconPath": "images/tabbar/homepage-sel.png"
+      },
+      {
+        "pagePath": "pages/category/category",
+        "text": "分类",
+        "iconPath": "images/tabbar/category.png",
+        "selectedIconPath": "images/tabbar/category-sel.png"
+      },
+      {
+        "pagePath": "pages/basket/basket",
+        "text": "购物车",
+        "iconPath": "images/tabbar/basket.png",
+        "selectedIconPath": "images/tabbar/basket-sel.png"
+      },
+      {
+        "pagePath": "pages/user/user",
+        "text": "我的",
+        "iconPath": "images/tabbar/user.png",
+        "selectedIconPath": "images/tabbar/user-sel.png"
+      }
+    ]
+  },
+  "sitemapLocation": "sitemap.json"
+}

+ 31 - 0
mall4m/app.wxss

@@ -0,0 +1,31 @@
+/**app.wxss**/
+.container {
+  height: 100%;
+  box-sizing: border-box;
+  color: #333;
+  font-family: helvetica,'Heiti SC',PingFangSC-Light;
+} 
+.price{
+  font-family: Arial;
+  display: inline-block;
+  color: #eb2444;
+  padding-bottom:10rpx;
+padding-left:10rpx;
+
+}
+
+
+
+/* 价格数字显示不同大小 */
+
+.symbol {
+  font-size: 24rpx;
+}
+
+.big-num {
+  font-size: 32rpx;
+}
+
+.small-num {
+  font-size: 24rpx;
+}

+ 67 - 0
mall4m/components/coupon/coupon.js

@@ -0,0 +1,67 @@
+var http = require('../../utils/http.js');
+Component({
+  /**
+   * 组件的属性列表
+   */
+  properties: {
+    item: Object,
+    type: Number,
+    order: Boolean,
+    canUse: Boolean,
+    index: Number,
+    showTimeType: Number
+  },
+
+  /**
+   * 组件的初始数据
+   */
+  data: {
+    stsType: 4
+
+  },
+  // 生命周期函数,可以为函数,或一个在methods段中定义的方法名
+  attached: function() {
+    //console.log(this.data.item);
+  },
+  /**
+   * 组件的方法列表
+   */
+  methods: {
+    receiveCoupon() {
+      var couponId = this.data.item.couponId;
+      http.request({
+        url: "/p/myCoupon/receive",
+        method: "POST",
+        data: couponId,
+        callBack: () => {
+          var coupon = this.data.item;
+          coupon.canReceive = false;
+          this.setData({
+            item: coupon
+          })
+        }
+      })
+    },
+    checkCoupon(e) {
+      // this.triggerEvent('checkCoupon', this.data.index);
+      this.triggerEvent('checkCoupon', {
+        couponId: e.currentTarget.dataset.couponid
+      });
+    },
+    /**
+     * 立即使用
+     */
+    useCoupon() {
+      var url = '/pages/prod-classify/prod-classify?sts=' + this.data.stsType;
+      var id = this.data.item.couponId;
+      var title = "优惠券活动商品";
+      if (id) {
+        url += "&tagid=" + id + "&title=" + title;
+      }
+      wx.navigateTo({
+        url: url
+      })
+
+    }
+  }
+})

+ 4 - 0
mall4m/components/coupon/coupon.json

@@ -0,0 +1,4 @@
+{
+  "component": true,
+  "usingComponents": {}
+}

+ 30 - 0
mall4m/components/coupon/coupon.wxml

@@ -0,0 +1,30 @@
+<view class="coupon-item {{canUse?'':'gray'}}">
+  <view class='left'>
+    <view class="num" wx:if="{{item.couponType == 1}}">
+      ¥
+      <text class="coupon-price">{{item.reduceAmount}}</text>
+    </view>
+    <view class="num" wx:if="{{item.couponType == 2}}">
+      <text class="coupon-price">{{item.couponDiscount}}</text>折
+    </view>
+    <view class='condition'>
+      满{{item.cashCondition}}元可用
+    </view>
+  </view>
+  <view class='right'>
+    <view class="c-des">
+      <text class="c-type">{{item.suitableProdType==0?'通用':'商品'}}</text> {{item.suitableProdType==0?'全场通用':'指定商品可用'}}
+    </view>
+    <view class="c-date">
+      <text wx:if="{{showTimeType==1 && item.couponType==2}}" class="c-data-info">领券{{item.validDays}}天后失效</text>
+      <text wx:else class="c-data-info">{{item.startTime}}~{{item.endTime}}</text>
+      <text class="c-btn" wx:if="{{item.canReceive && !order}}" bindtap='receiveCoupon'>立即领取</text>
+      <text class="c-btn get-btn" wx:if="{{!item.canReceive && !order}}" bindtap='useCoupon'>立即使用</text>
+    </view>
+    <view wx:if="{{order && canUse}}" class="sel-btn">
+      <checkbox color="#eb2444" data-couponid="{{item.couponId}}" checked="{{item.choose}}" bindtap="checkCoupon"></checkbox>
+    </view>
+  </view>
+  <image class="tag-img" src="../../images/icon/coupon-used.png" wx:if="{{type==1}}"></image>
+  <image class="tag-img" src="../../images/icon/coupon-ot.png" wx:if="{{type==2}}"></image>
+</view>

+ 118 - 0
mall4m/components/coupon/coupon.wxss

@@ -0,0 +1,118 @@
+.coupon-item{
+    margin: 15px 0;
+    position: relative;
+    box-shadow: 1px 1px 3px rgba(0,0,0,0.15);
+    height: 95px;
+    background: #fff;
+}
+.coupon-item .left{
+      float: left;
+    color: #fff;
+    text-align: center;
+    border-left: 1px dashed #fff;
+    padding: 20px 0;
+    background: -webkit-gradient(linear,left top,right top,from(#F45C43),to(#eb2444));
+    background: -o-linear-gradient(left,#F45C43,#eb2444);
+    background: linear-gradient(left,#F45C43,#eb2444);
+    background: -webkit-linear-gradient(left,#F45C43,#eb2444);
+    width: 260rpx;
+    height: 55px;
+}
+.coupon-item .left .num{
+  font-weight:600;
+  font-size:36rpx;
+  height:70rpx;
+  line-height:70rpx;
+  font-family:arial;
+}
+.coupon-item .left .num .coupon-price{
+      font-size: 72rpx;
+    line-height: 72rpx;
+        display: inline-block;
+    font-family: arial;
+}
+.coupon-item .left .condition{
+    font-size: 28rpx;
+    line-height: 28rpx;
+    display: block;
+    white-space: nowrap;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    padding: 0 2px;
+    font-family: arial;
+}
+.coupon-item .right{
+  margin-left: 280rpx;
+    padding: 5px;
+    position: relative;
+}
+.coupon-item .right .c-des{
+  height: 30px;
+    font-size: 26rpx;
+    line-height: 30px;
+    overflow: hidden;
+    font-weight: 600;
+}
+.coupon-item .right .c-des .c-type{
+  font-size: 24rpx;
+    background: #fdf0f0;
+    color: #eb2444;
+    border-radius: 8px;
+    padding:3px 10px;
+}
+.coupon-item .right .c-date{
+  font-size: 24rpx;
+  margin-top:25px;
+}
+.coupon-item .right .c-date .c-data-info{
+  font-family: arial;
+}
+.coupon-item .right .c-date .c-btn{
+    position: absolute;
+    bottom:0;
+    right:10px;
+    color: #fff;
+    font-size: 24rpx;
+    font-family: arial;
+    border-radius: 14px;
+    padding:3px 7px;
+    /* background: -webkit-gradient(linear,left top,right top,from(#6c96da),to(#6b83d7));
+    background: -o-linear-gradient(left,#6c96da,#6b83d7);
+    background: linear-gradient(left,#6c96da,#6b83d7);
+    background: -webkit-linear-gradient(left,#6c96da,#6b83d7); */
+    background: #eb2444;
+    border: 1px solid #eb2444;
+}
+
+.coupon-item .right .c-date .c-btn.get-btn{
+  background: #fff;
+  border: 1px solid #eb2444;
+  color:#eb2444;
+}
+
+.coupon-item.gray .left{
+  background: #bbb;
+}
+
+.coupon-item.gray .right .c-des .c-type{
+  background: #bbb;
+    color: #fff;
+}
+
+.coupon-item.gray .right .c-date .c-btn{
+  display: none;
+}
+
+.coupon-item .tag-img{
+  position: absolute;
+  top:0;
+  right:0;
+  width:120rpx;
+  height:120rpx;
+}
+
+.coupon-item .sel-btn{
+  position:absolute;
+  right:10px;
+  top:35px;
+}

+ 30 - 0
mall4m/components/production/production.js

@@ -0,0 +1,30 @@
+// components/production/production.js
+Component({
+  /**
+   * 组件的属性列表
+   */
+  properties: {
+    item:Object,
+    sts:Number,
+  },
+
+
+  /**
+   * 组件的初始数据
+   */
+  data: {
+
+  },
+
+  /**
+   * 组件的方法列表
+   */
+  methods: {
+    toProdPage: function (e) {
+      var prodid = e.currentTarget.dataset.prodid;
+      wx.navigateTo({
+        url: '/pages/prod/prod?prodid=' + prodid,
+      })
+    },
+  }
+})

+ 4 - 0
mall4m/components/production/production.json

@@ -0,0 +1,4 @@
+{
+  "component": true,
+  "usingComponents": {}
+}

+ 19 - 0
mall4m/components/production/production.wxml

@@ -0,0 +1,19 @@
+    <view class='prod-items' bindtap='toProdPage' data-prodid="{{item.prodId}}">
+      <view class='hot-imagecont'>
+        <image src='{{item.pic}}' class='hotsaleimg' ></image>
+      </view>
+      <view class='hot-text'>
+        <view class='hotprod-text'>{{item.prodName}}</view>
+        <view class='prod-info' wx:if='{{sts==6}}'>{{item.prodCommNumber}}评价 {{item.positiveRating}}%好评</view>
+        <view class='prod-text-info'>
+          <view class='price'>
+            <text wx:if='{{sts==2}}' class='deadline-price'>限时价</text>
+            <text class='symbol'>¥</text>
+            <text class='big-num'>{{wxs.parsePrice(item.price)[0]}}</text>
+            <text class='small-num'>.{{wxs.parsePrice(item.price)[1]}}</text>
+          </view>
+        </view>
+      </view>
+    </view>
+
+<wxs module="wxs" src="../../wxs/number.wxs" />

+ 66 - 0
mall4m/components/production/production.wxss

@@ -0,0 +1,66 @@
+@import "../../app.wxss";
+.prod-items {
+  width: 375rpx;
+  float: left;
+  background: #fff;
+  padding-bottom: 20rpx;
+  box-sizing: border-box;
+}
+
+prod:nth-child(2n-1) .prod-items {
+  padding: 20rpx 10rpx 10rpx 20rpx;
+}
+
+prod:nth-child(2n) .prod-items {
+  padding: 20rpx 20rpx 10rpx 10rpx;
+}
+
+.hot-imagecont .hotsaleimg {
+ width:345rpx;
+height:345rpx;
+
+}
+
+.hot-text .hotprod-text {
+  height: 76rpx;
+  font-size: 28rpx;
+  display: -webkit-box;
+  word-break: break-all;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  display: -webkit-box;
+  -webkit-line-clamp: 2;
+  -webkit-box-orient: vertical;
+  color: #000;
+}
+
+.prod-items .hot-imagecont {
+  border-radius: 8rpx;
+  text-align: center;
+  font-size: 0;
+}
+
+.prod-items .hot-text {
+  margin-top: 20rpx;
+}
+
+.prod-items .hot-text .prod-info {
+  font-size: 20rpx;
+  color: #777;
+  margin-top: 8rpx;
+}
+
+.prod-items .hot-text .prod-text-info {
+  position: relative;
+  height: 50rpx;
+  line-height: 70rpx;
+  font-family: Arial;
+}
+
+.prod-items .hot-text .prod-text-info .price {
+  color: #eb2444;
+}
+.deadline-price{
+  font-size: 22rpx;
+  margin-right: 5rpx;
+}

BIN
mall4m/images/icon/addr.png


BIN
mall4m/images/icon/bg1.png


BIN
mall4m/images/icon/car-new.png


BIN
mall4m/images/icon/car.png


BIN
mall4m/images/icon/clear-his.png


BIN
mall4m/images/icon/coupon-ot.png


BIN
mall4m/images/icon/coupon-used.png


BIN
mall4m/images/icon/delive-dot.png


BIN
mall4m/images/icon/delivery-car.png


BIN
mall4m/images/icon/dot.png


BIN
mall4m/images/icon/empty-cash.png


BIN
mall4m/images/icon/everydaySale.png


BIN
mall4m/images/icon/getCoupon.png


BIN
mall4m/images/icon/horn.png


BIN
mall4m/images/icon/menu-01.png


BIN
mall4m/images/icon/menu-02.png


BIN
mall4m/images/icon/menu-03.png


BIN
mall4m/images/icon/menu-04.png


BIN
mall4m/images/icon/more.png


BIN
mall4m/images/icon/myAddr.png


BIN
mall4m/images/icon/myCoupon.png


BIN
mall4m/images/icon/newProd.png


BIN
mall4m/images/icon/neweveryday.png


BIN
mall4m/images/icon/newprods.png


BIN
mall4m/images/icon/plus-sign.png


BIN
mall4m/images/icon/prod-col-red.png


BIN
mall4m/images/icon/prod-col.png


BIN
mall4m/images/icon/promotion.png


BIN
mall4m/images/icon/revise.png


BIN
mall4m/images/icon/search-01.png


BIN
mall4m/images/icon/search-col.png


BIN
mall4m/images/icon/search-col2.png


BIN
mall4m/images/icon/search.png


BIN
mall4m/images/icon/star-empty.png


BIN
mall4m/images/icon/star-red.png


BIN
mall4m/images/icon/timePrice.png


BIN
mall4m/images/icon/toComment.png


BIN
mall4m/images/icon/toDelivery.png


BIN
mall4m/images/icon/toPay.png


BIN
mall4m/images/icon/toTake.png


BIN
mall4m/images/icon/tuiguang01.png


BIN
mall4m/images/icon/tuiguang02.png


BIN
mall4m/images/icon/tuiguang03.png


BIN
mall4m/images/tabbar/basket-sel.png


BIN
mall4m/images/tabbar/basket.png


BIN
mall4m/images/tabbar/category-sel.png


BIN
mall4m/images/tabbar/category.png


BIN
mall4m/images/tabbar/homepage-sel.png


BIN
mall4m/images/tabbar/homepage.png


BIN
mall4m/images/tabbar/user-sel.png


BIN
mall4m/images/tabbar/user.png


+ 306 - 0
mall4m/pages/basket/basket.js

@@ -0,0 +1,306 @@
+// pages/basket/basket.js
+var http = require("../../utils/http.js");
+// var config = require("../../utils/config.js");
+const Big = require("../../utils/big.min.js");
+
+Page({
+
+  /**
+   * 页面的初始数据
+   */
+  data: {
+    // picDomain: config.picDomain,
+    shopCartItemDiscounts: [],
+    finalMoney: 0,
+    totalMoney: 0,
+    subtractMoney: 0,
+    allChecked: true
+  },
+
+  /**
+   * 生命周期函数--监听页面加载
+   */
+  onLoad: function (options) {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面初次渲染完成
+   */
+  onReady: function () {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面显示
+   */
+  onShow: function () {
+    wx.showLoading();
+    //加载购物车
+    var params = {
+      url: "/p/shopCart/info",
+      method: "POST",
+      data: {},
+      callBack: res => {
+        if (res.length > 0) {
+          // 默认全选
+          var shopCartItemDiscounts = res[0].shopCartItemDiscounts;
+          shopCartItemDiscounts.forEach(shopCartItemDiscount => {
+            shopCartItemDiscount.shopCartItems.forEach(shopCartItem => {
+              shopCartItem.checked = true;
+            })
+          })
+
+          this.setData({
+            shopCartItemDiscounts: shopCartItemDiscounts,
+            allChecked: true
+          });
+          
+        } else {
+          this.setData({
+            shopCartItemDiscounts: [],
+          });
+        }
+        this.calTotalPrice();//计算总价
+        wx.hideLoading();
+      }
+    };
+    http.request(params);
+
+    http.getCartCount();//重新计算购物车总数量
+    
+  },
+
+  /**
+   * 去结算
+   */
+  toFirmOrder: function () {
+    var shopCartItemDiscounts = this.data.shopCartItemDiscounts;
+    var basketIds = [];
+    shopCartItemDiscounts.forEach(shopCartItemDiscount => {
+      shopCartItemDiscount.shopCartItems.forEach(shopCartItem => {
+        if (shopCartItem.checked) {
+          basketIds.push(shopCartItem.basketId)
+        }
+      })
+    })
+    if (!basketIds.length) {
+      wx.showToast({
+        title: '请选择商品',
+        icon: "none"
+      })
+      return
+    }
+    wx.setStorageSync("basketIds", JSON.stringify(basketIds));
+    wx.navigateTo({
+      url: '/pages/submit-order/submit-order?orderEntry=0',
+    })
+  },
+
+  /**
+   * 全选
+   */
+  onSelAll: function () {
+    var allChecked = this.data.allChecked;
+    allChecked = !allChecked; //改变状态
+    var shopCartItemDiscounts = this.data.shopCartItemDiscounts;
+
+    for (var i = 0; i < shopCartItemDiscounts.length; i++) {
+      var cItems = shopCartItemDiscounts[i].shopCartItems;
+      for (var j = 0; j < cItems.length; j++) {
+        cItems[j].checked = allChecked;
+      }
+    }
+    
+    this.setData({
+      allChecked: allChecked,
+      shopCartItemDiscounts: shopCartItemDiscounts
+    });
+    this.calTotalPrice();//计算总价
+  },
+
+  /**
+   * 每一项的选择事件
+   */
+  onSelectedItem: function (e) {
+    var index = e.currentTarget.dataset.index;// 获取data- 传进来的index
+    var scindex = e.currentTarget.dataset.scindex;
+
+    var shopCartItemDiscounts = this.data.shopCartItemDiscounts;// 获取购物车列表
+    var checked = shopCartItemDiscounts[scindex].shopCartItems[index].checked; // 获取当前商品的选中状态
+    shopCartItemDiscounts[scindex].shopCartItems[index].checked = !checked; // 改变状态
+    this.setData({
+      shopCartItemDiscounts: shopCartItemDiscounts
+    });
+    this.checkAllSelected();//检查全选状态
+    this.calTotalPrice();//计算总价
+  },
+
+  /**
+   * 检查全选状态
+   */
+  checkAllSelected: function () {
+    var allChecked = true;
+    var shopCartItemDiscounts = this.data.shopCartItemDiscounts;
+
+    var flag = false;
+    for (var i = 0; i < shopCartItemDiscounts.length; i++) {
+      var cItems = shopCartItemDiscounts[i].shopCartItems;
+      for (var j = 0; j < cItems.length; j++) {
+        if (!cItems[j].checked) {
+          allChecked = !allChecked;
+          flag = true;
+          break;
+        }
+      }
+      if(flag){
+        break;
+      }
+    }
+    this.setData({
+      allChecked: allChecked
+    });
+  },
+
+  /**
+   * 计算购物车总额
+   */
+  calTotalPrice: function () {
+    var shopCartItemDiscounts = this.data.shopCartItemDiscounts;
+    var shopCartIds = [];
+    for (var i = 0; i < shopCartItemDiscounts.length; i++) {
+      var cItems = shopCartItemDiscounts[i].shopCartItems;
+      for (var j = 0; j < cItems.length; j++) {
+        if (cItems[j].checked) {
+          shopCartIds.push(cItems[j].basketId);
+        }
+      }
+    }
+
+    var ths = this;
+    wx.showLoading();
+    var params = {
+      url: "/p/shopCart/totalPay",
+      method: "POST",
+      data: shopCartIds,
+      callBack: function (res) {
+        ths.setData({
+          finalMoney: res.finalMoney,
+          totalMoney: res.totalMoney,
+          subtractMoney: res.subtractMoney
+        });
+        wx.hideLoading();
+      }
+    };
+    http.request(params);
+
+  },
+
+  /**
+   * 减少数量
+   */
+  onCountMinus: function (e) {
+    var index = e.currentTarget.dataset.index;
+    var scindex = e.currentTarget.dataset.scindex;
+    var shopCartItemDiscounts = this.data.shopCartItemDiscounts;
+    var prodCount = shopCartItemDiscounts[scindex].shopCartItems[index].prodCount;
+    if (prodCount > 1) {
+      this.updateCount(shopCartItemDiscounts, scindex, index, -1);
+    }
+  },
+
+  /**
+   * 增加数量
+   */
+  onCountPlus: function (e) {
+    var index = e.currentTarget.dataset.index;
+    var scindex = e.currentTarget.dataset.scindex;
+    var shopCartItemDiscounts = this.data.shopCartItemDiscounts;
+    this.updateCount(shopCartItemDiscounts, scindex, index, 1);
+  },
+
+
+  /**
+   * 改变购物车数量接口
+   */
+  updateCount: function (shopCartItemDiscounts, scindex, index, prodCount) {
+    var ths = this;
+    wx.showLoading({
+      mask: true
+    });
+    var params = {
+      url: "/p/shopCart/changeItem",
+      method: "POST",
+      data: {
+        count: prodCount,
+        prodId: shopCartItemDiscounts[scindex].shopCartItems[index].prodId,
+        skuId: shopCartItemDiscounts[scindex].shopCartItems[index].skuId,
+        shopId: 1
+      },
+      callBack: function (res) {
+        shopCartItemDiscounts[scindex].shopCartItems[index].prodCount += prodCount;
+        ths.setData({
+          shopCartItemDiscounts: shopCartItemDiscounts
+        });
+        ths.calTotalPrice();//计算总价
+        wx.hideLoading();
+
+        http.getCartCount();//重新计算购物车总数量
+      }
+    };
+    http.request(params);
+  },
+
+  /**
+   * 删除购物车商品
+   */
+  onDelBasket: function () {
+    var ths = this;
+
+    var shopCartItemDiscounts = this.data.shopCartItemDiscounts;
+    var basketIds = [];
+    for (var i = 0; i < shopCartItemDiscounts.length; i++) {
+      var cItems = shopCartItemDiscounts[i].shopCartItems;
+      for (var j = 0; j < cItems.length; j++) {
+        if (cItems[j].checked) {
+          basketIds.push(cItems[j].basketId);
+        }
+      }
+    }
+
+    if (basketIds.length == 0) {
+      wx.showToast({
+        title: '请选择商品',
+        icon: "none"
+      })
+    } else {
+      wx.showModal({
+        title: '',
+        content: '确认要删除选中的商品吗?',
+        confirmColor: "#eb2444",
+        success(res) {
+          if (res.confirm) {
+
+            wx.showLoading({
+              mask: true
+            });
+            var params = {
+              url: "/p/shopCart/deleteItem",
+              method: "DELETE",
+              data: basketIds,
+              callBack: function (res) {
+                wx.hideLoading();
+                ths.onShow();
+              }
+            };
+            http.request(params);
+          }
+        }
+      })
+    }
+
+
+  }
+
+
+})

+ 6 - 0
mall4m/pages/basket/basket.json

@@ -0,0 +1,6 @@
+{
+  "backgroundTextStyle": "light",
+  "navigationBarBackgroundColor": "#fff",
+  "navigationBarTitleText": "购物车",
+  "navigationBarTextStyle": "black"
+}

+ 114 - 0
mall4m/pages/basket/basket.wxml

@@ -0,0 +1,114 @@
+<!--pages/basket/basket.wxml-->
+<view class='container'>
+  <view class="prod-list">
+    <block wx:for="{{shopCartItemDiscounts}}" wx:key='' wx:for-index="scIndex">
+      <view class='prod-block'>
+        <view class='discount-tips' hidden='{{!item.chooseDiscountItemDto}}'>
+          <text class='text-block'>{{wxs.parseDiscount(item.chooseDiscountItemDto.discountRule)}}</text>
+          <text class='text-list'>{{wxs.parseDiscountMsg(item.chooseDiscountItemDto.discountRule,item.chooseDiscountItemDto.needAmount,item.chooseDiscountItemDto.discount)}}</text>
+        </view>
+        <block wx:for="{{item.shopCartItems}}" wx:key='' wx:for-item="prod">
+          <view class='item'>
+            <view class="btn">
+              <label>
+                <checkbox bindtap='onSelectedItem' data-scindex="{{scIndex}}" data-index="{{index}}" value="{{prod.prodId}}" checked="{{prod.checked}}" color="#105c3e" />
+              </label>
+            </view>
+            <view class='prodinfo'>
+              <view class="pic">
+                <image src='{{prod.pic}}' />
+              </view>
+              <view class="opt">
+                <view class='prod-name'>{{prod.prodName}}</view>
+                <text class='prod-info-text {{prod.skuName?"":"empty-n"}}'>{{prod.skuName}}</text>
+                <view class='price-count'>
+                  <view class='price'>
+                    <text class='symbol'>¥</text>
+                    <text class='big-num'>{{wxs.parsePrice(prod.price)[0]}}</text>
+                    <text class='small-num'>.{{wxs.parsePrice(prod.price)[1]}}</text>
+                  </view>
+                  <view class="m-numSelector">
+                    <view bindtap='onCountMinus' class="minus" data-scindex="{{scIndex}}" data-index="{{index}}"></view>
+                    <input type='number' value='{{prod.prodCount}}' disabled></input>
+                    <view bindtap='onCountPlus' class="plus" data-scindex="{{scIndex}}" data-index="{{index}}"></view>
+                  </view>
+                </view>
+              </view>
+            </view>
+          </view>
+        </block>
+
+      </view>
+    </block>
+
+    <!-- <view class='lose-efficacy'>
+      <view class='discount-tips'>
+        
+        <text class='text-list'>失效商品</text>
+        <text class='empty-prod'>清空失效商品</text>
+      </view>
+      <view class='item'>
+        <view class="staus">
+          <text>失效</text>
+        </view>
+        <view class='prodinfo'>
+          <view class="pic">
+            <image src='../../images/prod/pic11.jpg' />
+          </view>
+          <view class="opt">
+            <view class='prod-name'>宠物用品洗澡香波沐浴除臭留</view>
+            <view class='prod-info-text'>60克</view>
+            <view class='price-count'>
+              <view class='price'>
+                <text class='symbol'>¥</text>
+                <text class='big-num'>{{wxs.parsePrice(10.00)[0]}}</text>
+                <text class='small-num'>.{{wxs.parsePrice(10.00)[1]}}</text>
+              </view>
+            </view>
+          </view>
+        </view>
+      </view>
+    </view> -->
+
+  </view>
+
+  <view class="empty" wx:if="{{shopCartItemDiscounts.length==0}}">
+    <view class="img">
+      <image src='../../images/tabbar/basket.png'></image>
+    </view>
+    <view class="txt">
+      您还没有添加任何商品哦~
+    </view>
+  </view>
+
+  <!-- 底部按钮 -->
+  <view class="cart-footer" wx:if="{{shopCartItemDiscounts.length>0}}">
+    <view class="btn all">
+      <label bindtap='onSelAll'>
+        <checkbox checked='{{allChecked}}' color='#f7d731;' />全选</label>
+    </view>
+    <view class="btn del" bindtap='onDelBasket'>
+      <text>删除</text>
+    </view>
+    <view class="btn total">
+      <view class="finally">
+        <text>合计:</text>
+        <view class='price'>
+          <text class='symbol'>¥</text>
+          <text class='big-num'>{{wxs.parsePrice(finalMoney)[0]}}</text>
+          <text class='small-num'>.{{wxs.parsePrice(finalMoney)[1]}}</text>
+        </view>
+      </view>
+      <view class="total-msg" wx:if="{{subtractMoney>0}}">
+        总额:¥{{wxs.toPrice(totalMoney)}} 立减:¥{{wxs.toPrice(subtractMoney)}}
+      </view>
+    </view>
+    <view class="btn settle" bindtap='toFirmOrder'>
+      <text>结算</text>
+    </view>
+  </view>
+  <!-- end 底部按钮 -->
+
+</view>
+
+<wxs module="wxs" src="../../wxs/number.wxs" />

+ 387 - 0
mall4m/pages/basket/basket.wxss

@@ -0,0 +1,387 @@
+/* pages/basket/basket.wxss */
+
+page {
+  width: 100%;
+  background: #f4f4f4;
+}
+.container{
+    padding-bottom:118rpx;
+}
+container .prod-list {
+  width: 100%;
+  background: #f8f8f8;
+}
+
+.prod-list .prod-block {
+  background: #fff;
+  margin-top: 15rpx;
+}
+
+.prod-list .prod-block .discount-tips {
+  padding: 20rpx 0 20rpx 20rpx;
+  border-bottom: 2rpx solid #f4f4f4;
+  height: 40rpx;
+  line-height: 40rpx;
+}
+
+.prod-list .prod-block .discount-tips .text-block {
+  padding:3rpx 5rpx;
+  /* padding: 0 5rpx; */
+  border-radius: 8rpx;
+  font-size: 22rpx;
+  color: #eb2444;
+  border: 2rpx solid #eb2444;
+}
+
+.prod-list .prod-block .discount-tips .text-list {
+  font-size: 24rpx;
+  margin-left: 10rpx;
+}
+
+.prod-list .item {
+  background: #fff;
+  display: flex;
+  align-items: center;
+  padding: 20rpx;
+}
+
+.prod-list .item .prodinfo {
+  position: relative;
+  color: #999;
+  width:100%;
+}
+
+.prod-list .item .prodinfo::after {
+  content: '';
+  background-color: #f4f4f4;
+  left: 0;
+  height: 1px;
+  transform-origin: 50% 100% 0;
+  bottom: -20rpx;
+  position: absolute;
+  display: block;
+  width: 642rpx;
+  padding-left: 20rpx;
+}
+
+.prod-list .item:last-child .prodinfo::after {
+  height: 0;
+}
+
+.prod-list .item .staus {
+  text-align: center;
+  background: rgb(196, 192, 192);
+  font-size: 20rpx;
+  width: 50rpx;
+  color: #fff;
+}
+
+.prodinfo {
+  display: flex;
+  margin-left: 20rpx;
+}
+
+.prod-list .item .opt {
+  font-size: 28rpx;
+  margin-left: 20rpx;
+  width:100%;
+
+}
+
+.prodinfo .opt .prod-name {
+  color:#333;
+  max-height: 72rpx;
+  line-height: 36rpx;
+  display: -webkit-box;
+  word-break: break-all;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  -webkit-line-clamp: 2;
+  -webkit-box-orient: vertical;
+}
+
+.prodinfo .opt .prod-info-text {
+  color: #999;
+  display: inline-block;
+  -webkit-line-clamp: 1;
+  height: 48rpx;
+  line-height: 48rpx;
+  background: #f9f9f9;
+  padding: 0 10rpx 0 10rpx;
+  border-radius: 4rpx;
+  margin: 10rpx 0 0rpx 0;
+  overflow: hidden;
+  font-size: 24rpx;
+  position: relative;
+  font-family: arial;
+}
+.prodinfo .opt .prod-info-text.empty-n{
+  padding:0;
+}
+
+/* .prod-info-text:before, .prod-info-text:after {
+  content: "";
+  display: block;
+  width: 0;
+  height: 0;
+  position: absolute;
+  border: 5px solid transparent;
+  right: 5px;
+  top: 10px;
+} */
+
+.prod-info-text:before {
+  border-top: 5px solid #aaa;
+}
+
+.prod-info-text:after {
+  border-top: 5px solid #f9f9f9;
+  top: 9px;
+}
+
+.prod-list .item .prodinfo .pic {
+  text-align: center;
+  width: 180rpx;
+  height: 180rpx;
+  line-height: 180rpx;
+  font-size: 0;
+}
+
+.prod-list .item .pic image {
+  max-width: 100%;
+  max-height: 100%;
+  /* border-radius: 8rpx; */
+  vertical-align: middle;
+}
+
+.prodinfo .opt .price-count {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+
+.prodinfo .opt .price-count .price {
+  color: #eb2444;
+}
+
+.lose-efficacy .prodinfo .opt .price-count .price {
+  color: #999;
+}
+
+/* 加减框 */
+
+.m-numSelector .minus, .m-numSelector input, .m-numSelector .plus {
+  float: left;
+  box-sizing: border-box;
+  height: 56rpx;
+  border: 2rpx solid #d9d9d9;
+}
+
+.m-numSelector {
+  float: right;
+}
+
+.m-numSelector .minus, .m-numSelector .plus {
+  position: relative;
+  width: 56rpx;
+}
+
+.m-numSelector .minus {
+  border-right: 0;
+  border-top-left-radius: 4rpx;
+  border-bottom-left-radius: 4rpx;
+}
+
+.m-numSelector input {
+  width: 56rpx;
+  text-align: center;
+  color:#333;
+}
+
+.m-numSelector .plus {
+  border-left: 0;
+  border-top-right-radius: 4rpx;
+  border-bottom-right-radius: 4rpx;
+}
+
+.m-numSelector .minus::before, .m-numSelector .plus::before,
+.m-numSelector .plus::after {
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  margin: auto;
+  content: ' ';
+  width: 22rpx;
+  height: 3rpx;
+  background-color: #7f7f7f;
+}
+
+.m-numSelector .plus::after {
+  transform: rotate(90deg);
+}
+
+.m-numSelector:not(.disabled) .minus:not(.disabled):active,
+.m-numSelector:not(.disabled) .plus:not(.disabled):active {
+  background-color: #f4f4f4;
+}
+
+/*checkbox 选项框大小  */
+
+checkbox .wx-checkbox-input {
+  border-radius: 50%;
+  width: 35rpx;
+  height: 35rpx;
+}
+
+/*checkbox选中后样式  */
+
+checkbox .wx-checkbox-input.wx-checkbox-input-checked {
+  background: #eb2444;
+  border-color: #eb2444;
+}
+
+/*checkbox选中后图标样式  */
+
+checkbox .wx-checkbox-input.wx-checkbox-input-checked::before {
+  text-align: center;
+  font-size: 22rpx;
+  color: #fff;
+  background: transparent;
+  transform: translate(-50%, -50%) scale(1);
+  -webkit-transform: translate(-50%, -50%) scale(1);
+}
+
+/* 购物车为空 */
+
+.empty {
+  font-size: 28rpx;
+  color: #666;
+}
+
+.empty .txt {
+  text-align: center;
+  margin-top: 30rpx;
+}
+
+.empty .img {
+  margin-top: 80rpx;
+  text-align: center;
+}
+
+.empty .img image {
+  width: 80rpx;
+  height: 80rpx;
+}
+
+/* 失效商品 */
+
+.lose-efficacy {
+  margin-top: 20rpx;
+  background: #fff;
+}
+
+.lose-efficacy .item {
+  background: #f8f8f9;
+}
+
+.prod-list .lose-efficacy .discount-tips {
+  padding: 20rpx 0;
+  border-bottom: 2rpx solid #ddd;
+  height: 50rpx;
+  line-height: 50rpx;
+  margin-left: 20rpx;
+}
+
+.lose-efficacy .discount-tips .empty-prod {
+  color: #777;
+  font-size: 26rpx;
+  border: 2rpx solid #999;
+  padding: 0 10rpx;
+  border-radius: 8rpx;
+  float: right;
+  margin-right: 20rpx;
+}
+
+.price-count .disable-price {
+  color: #999;
+}
+
+.prod-list .lose-efficacy .discount-tips .text-list {
+  font-size: 30rpx;
+  margin-left: 10rpx;
+}
+
+/** 底部按钮 */
+
+.cart-footer {
+  position: fixed;
+  bottom: 0;
+  left: 0;
+  width: 100%;
+  display: flex;
+  flex-direction: row nowrap;
+  height: 98rpx;
+  border-top: 2rpx solid #f4f4f4;
+  z-index:999;
+}
+
+.cart-footer .btn {
+  position: relative;
+  display: flex;
+  flex-grow: 1;
+  justify-content: center;
+  align-items: center;
+  width: 0;
+  background-color: #fafafa;
+  background:rgba(255,255,255,0.95);
+  font-size: 28rpx;
+}
+.cart-footer .btn .total-msg{
+  font-size: 20rpx;
+}
+.cart-footer .btn.total{
+  display:flex;
+flex-flow:column;
+align-items:flex-start;
+
+}
+.cart-footer .btn.del {
+  color:#eb2444;
+width:70rpx;
+font-size:22rpx;
+text-align:left;
+display:block;
+line-height:102rpx;
+
+}
+
+.cart-footer .btn.all {
+  width: 150rpx;
+  font-size: 26rpx;
+}
+
+.cart-footer .btn.all label {
+  display: flex;
+  flex-grow: 1;
+  justify-content: center;
+  align-items: center;
+}
+
+.cart-footer .btn.total {
+  width: 300rpx;
+}
+
+.cart-footer .btn.total .price {
+  color: #eb2444;
+  font-size: 30rpx;
+}
+
+.cart-footer .btn.settle {
+  width: 200rpx;
+  background: #eb2444;
+  color: #fff;
+}
+
+/** end 底部按钮 */

+ 106 - 0
mall4m/pages/binding-phone/binding-phone.js

@@ -0,0 +1,106 @@
+// pages/binding-phone/binding-phone.js
+
+var http = require("../../utils/http.js");
+var config = require("../../utils/config.js");
+
+Page({
+
+  /**
+   * 页面的初始数据
+   */
+  data: {
+    phonenum:'',
+    code:'',
+  },
+
+  /**
+   * 生命周期函数--监听页面加载
+   */
+  onLoad: function (options) {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面初次渲染完成
+   */
+  onReady: function () {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面显示
+   */
+  onShow: function () {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面隐藏
+   */
+  onHide: function () {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面卸载
+   */
+  onUnload: function () {
+
+  },
+
+  /**
+   * 页面相关事件处理函数--监听用户下拉动作
+   */
+  onPullDownRefresh: function () {
+
+  },
+
+  /**
+   * 页面上拉触底事件的处理函数
+   */
+  onReachBottom: function () {
+
+  },
+
+  /**
+   * 用户点击右上角分享
+   */
+  onShareAppMessage: function () {
+
+  },
+
+  getCodeNumber:function(){
+    if (this.data.phoneNumber == "" ) {
+      wx.showToast({
+        title: '请输入手机号',
+        icon: "none"
+      })
+      return;
+    }
+    var params = {
+      url: "/p/sms/send",
+      method: "POST",
+      data: {
+        // phonenum: this.data.phonenum,
+        // code: this.data.code
+      },
+      callBack: (res) => {
+        this.setData({
+          phonenum: this.data.phonenum,
+          code: this.data.code
+        });
+      }
+    };
+    http.request(params);
+  },
+  onPhoneInput:function(e){
+    this.setData({
+      phonenum: e.detail.value
+    });
+  },
+  onCodeInput: function (e) {
+    this.setData({
+      code: e.detail.value
+    });
+  }
+})

+ 6 - 0
mall4m/pages/binding-phone/binding-phone.json

@@ -0,0 +1,6 @@
+{
+  "backgroundTextStyle": "light",
+  "navigationBarBackgroundColor": "#fff",
+  "navigationBarTitleText": "绑定手机号码",
+  "navigationBarTextStyle": "black"
+}

+ 21 - 0
mall4m/pages/binding-phone/binding-phone.wxml

@@ -0,0 +1,21 @@
+<!--pages/binding-phone/binding-phone.wxml-->
+<view class='container'>
+  <view class='binding-phone'>
+    <!-- <block wx:for='{{couponList}}' wx:key=''> -->
+      <view class='item'>
+        <text class='item-tip'>手机号码:</text>
+        <input placeholder='输入手机号码'  type='number' maxlength='11' value="{{phonenum}}" bindinput="onPhoneInput" ></input>
+      </view>
+      <view class='item '>
+        <text class='item-tip'>验证码:</text>
+        <input placeholder='输入验证码' type='number' value="{{code}}" bindinput="onCodeInput" ></input>
+        <text class='get-code gray' bindtap='getCodeNumber'>获取验证码</text>
+      </view>
+    <!-- </block> -->
+  </view>
+
+  <view class='btn-box'>
+    <text class='sure-btn gray'>确定</text>
+    <text class='sure-btn '>确定</text>
+  </view>
+</view>

+ 69 - 0
mall4m/pages/binding-phone/binding-phone.wxss

@@ -0,0 +1,69 @@
+/* pages/binding-phone/binding-phone.wxss */
+
+page {
+  background: #f4f4f4;
+}
+
+.binding-phone {
+  height: 100%;
+  margin-top: 20rpx;
+  background: #fff;
+}
+
+.binding-phone .item {
+  display: flex;
+  padding: 20rpx 0;
+  height: 60rpx;
+  line-height: 60rpx;
+  border-bottom: 2rpx solid #e1e1e1;
+}
+
+.binding-phone .item:last-child {
+  border: none;
+}
+
+.binding-phone .item input {
+  flex: 1;
+  height: auto;
+  padding: 0 20rpx;
+  font-size: 28rpx;
+}
+
+.binding-phone .item .item-tip {
+  width: 140rpx;
+  font-size: 28rpx;
+  padding-left: 20rpx;
+}
+
+.binding-phone .item .get-code {
+  font-size: 30rpx;
+  color: #999;
+  margin-right: 20rpx;
+  text-align: center;
+}
+
+.binding-phone .item .get-code.gray {
+  color: #3eb370;
+}
+
+.btn-box {
+  padding: 0 20rpx;
+  margin-top: 60rpx;
+}
+
+.btn-box .sure-btn {
+  display: block;
+  font-size: 32rpx;
+  color: #fff;
+  background: #3eb370;
+  width: 100%;
+  margin: auto;
+  text-align: center;
+  padding: 20rpx 0;
+  border-radius: 50rpx;
+}
+
+.btn-box .sure-btn.gray {
+  background: #e1e1e1;
+  margin-bottom: 30rpx;
+}

+ 140 - 0
mall4m/pages/category/category.js

@@ -0,0 +1,140 @@
+// pages/category/category.js
+
+var http = require("../../utils/http.js");
+var config = require("../../utils/config.js");
+
+Page({
+
+  /**
+   * 页面的初始数据
+   */
+  data: {
+    selIndex: 0,
+    categoryList:[],
+    productList: [],
+    categoryImg: '',
+    prodid:''
+  },
+
+  /**
+   * 生命周期函数--监听页面加载
+   */
+  onLoad: function (options) {
+    var ths = this;
+    //加载分类列表
+    var params = {
+      url: "/category/categoryInfo",
+      method: "GET",
+      data: {
+        parentId: ''
+      },
+      callBack: function (res) {
+        // console.log(res);
+        ths.setData({
+          categoryImg: res[0].pic,
+          categoryList: res,
+        });
+        ths.getProdList(res[0].categoryId)
+      }
+    };
+    http.request(params);
+  },
+
+  /**
+   * 生命周期函数--监听页面初次渲染完成
+   */
+  onReady: function () {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面显示
+   */
+  onShow: function () {
+   
+
+
+  },
+
+  /**
+   * 生命周期函数--监听页面隐藏
+   */
+  onHide: function () {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面卸载
+   */
+  onUnload: function () {
+
+  },
+
+  /**
+   * 页面相关事件处理函数--监听用户下拉动作
+   */
+  onPullDownRefresh: function () {
+
+  },
+
+  /**
+   * 页面上拉触底事件的处理函数
+   */
+  onReachBottom: function () {
+
+  },
+
+  /**
+   * 用户点击右上角分享
+   */
+  onShareAppMessage: function () {
+
+  },
+
+  /**
+   * 分类点击事件
+   */
+  onMenuTab: function (e) {
+    console.log(e);
+        var id = e.currentTarget.dataset.id;
+    var index = e.currentTarget.dataset.index;
+    // this.getProdList(id);
+    this.getProdList(this.data.categoryList[index].categoryId);
+    this.setData({
+      categoryImg: this.data.categoryList[index].pic,
+      selIndex: index
+    });
+  },
+
+  // 跳转搜索页
+  toSearchPage: function () {
+    wx.navigateTo({
+      url: '/pages/search-page/search-page',
+    })
+  },
+  getProdList(categoryId) {
+    //加载分类列表
+    var params = {
+      url: "/prod/pageProd",
+      method: "GET",
+      data: {
+        categoryId: categoryId
+      },
+      callBack: (res) => {
+        // console.log(res);
+        this.setData({
+          productList: res.records,
+        });
+      }
+    };
+    http.request(params);
+  },
+
+//跳转商品详情页
+  toProdPage: function (e) {
+    var prodid = e.currentTarget.dataset.prodid;
+    wx.navigateTo({
+      url: '/pages/prod/prod?prodid=' + prodid,
+    })
+  },
+})

+ 6 - 0
mall4m/pages/category/category.json

@@ -0,0 +1,6 @@
+{
+  "backgroundTextStyle": "light",
+  "navigationBarBackgroundColor": "#fff",
+  "navigationBarTitleText": "分类商品",
+  "navigationBarTextStyle": "black"
+}

+ 58 - 0
mall4m/pages/category/category.wxml

@@ -0,0 +1,58 @@
+<!--pages/category/category.wxml-->
+
+<view class="container">
+
+
+<!-- 头部搜索区 -->
+
+  <view class='search-bar'>
+    <view class='search-box' bindtap='toSearchPage'>
+      <image src='../../images/icon/search.png' class='search-img'></image>
+      <text class='sear-input'>搜索您想要的商品</text>
+    </view>
+  </view>
+<!-- 滚动内容区 -->
+  <view class="main">
+    <!-- 左侧菜单start -->
+    <scroll-view scroll-y="true" class='leftmenu'>
+      <block wx:for='{{ categoryList}}' wx:key=''>
+        <view class='menu-item {{selIndex==index?"active":""}} ' data-index="{{index}}" data-id="{{item.categoryId}}" bindtap='onMenuTab'>
+          {{item.categoryName}}
+        </view>
+      </block>
+    </scroll-view>
+    <!-- 左侧菜单end -->
+
+    <!-- 右侧内容start -->
+    <scroll-view scroll-y="true" class='rightcontent' scroll-into-view="{{toViewId}}">
+    <!-- <block wx:for='{{ productList}}' wx:key=''> -->
+      <view class='adver-map'>
+        <view class='item-a'>
+            <image src='{{categoryImg}}' mode='widthFix'></image>
+        </view>
+      </view>
+      <view class='cont-item'>
+        <block wx:for='{{productList}}' wx:key=''>
+          <view class='show-item'  bindtap='toProdPage' data-prodid="{{item.prodId}}">
+            <view class='more-prod-pic'>
+              <image src='{{item.pic}}' class='more-pic'mode='widthFix'></image>
+            </view>
+            <view class='prod-text-right'>
+              <view class='prod-text more'>{{item.prodName}}</view>
+              <view class='cate-prod-info'>{{item.brief}}</view>
+              <view class='prod-price more'>
+                <text class='symbol'>¥</text> <text class='big-num'>{{wxs.parsePrice(item.price)[0]}}</text><text class='small-num'>.{{wxs.parsePrice(item.price)[1]}}</text> 
+              </view>
+            </view>
+          </view>
+         
+        </block>
+      </view>
+     <!-- </block> -->
+    </scroll-view>
+    <!-- 右侧内容end -->
+    <!-- </block> -->
+  </view>
+
+</view>
+<wxs module="wxs" src="../../wxs/number.wxs" />

+ 223 - 0
mall4m/pages/category/category.wxss

@@ -0,0 +1,223 @@
+/* pages/category/category.wxss */
+
+page {
+  height: 100%;
+}
+
+.container {
+  display: flex;
+  flex-direction: row;
+  height: 100%;
+}
+
+.main {
+  position: fixed;
+  display: flex;
+  overflow: hidden;
+  margin-top: 100rpx;
+  height: calc(100% - 100rpx);
+}
+
+/* 搜索栏 */
+
+.search-bar {
+  width: 100%;
+  position: fixed;
+  top: 0;
+  left: 0;
+  color: #777;
+  background: #fff;
+  box-shadow: 0 2rpx 6rpx rgba(0, 0, 0, 0.07);
+  z-index: 3;
+  padding: 20rpx 0;
+}
+
+.search-bar .arrow {
+  width: 20rpx;
+  height: 20rpx;
+  border-bottom: 2rpx solid #777;
+  border-left: 2rpx solid #777;
+  transform: rotate(45deg);
+  position: absolute;
+  left: 30rpx;
+  top: 41rpx;
+}
+
+.search-bar .search-box {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  height: 60rpx;
+  background: #f7f7f7;
+  z-index: 999;
+  width: 92%;
+  border-radius: 50rpx;
+  text-align: center;
+  margin: auto;
+}
+
+.sear-input {
+  font-size: 28rpx;
+}
+
+.search-bar .search-hint {
+  font-size: 28rpx;
+  position: absolute;
+  right: 30rpx;
+  top: 32rpx;
+}
+
+.search-bar .search-box .search-img {
+  width: 32rpx;
+  height: 32rpx;
+  margin-right: 10rpx;
+}
+
+/* 左侧菜单栏 */
+
+.leftmenu {
+  width: 200rpx;
+  height: 100%;
+  box-sizing: border-box;
+  background-color: #f5f6f7;
+  overflow: scroll;
+  z-index: 2;
+}
+
+.menu-item {
+  line-height: 90rpx;
+  height: 90rpx;
+  text-align: center;
+  border-bottom: 2rpx silid #e3e3e3;
+  position: relative;
+  color: #777;
+  font-size: 28rpx;
+}
+
+.menu-item.active {
+  color: #eb2444;
+  font-size: 28rpx;
+  font-weight: bold;
+  position: relative;
+  background: #fff;
+}
+
+.menu-item.active:before {
+  position: absolute;
+  left: 0;
+  content: "";
+  width: 8rpx;
+  height: 32rpx;
+  top: 29rpx;
+  background: #eb2444;
+}
+
+.menu-item text.tips-num {
+  position: absolute;
+  top: 20rpx;
+  right: 15rpx;
+  border-radius: 15rpx;
+  width: 30rpx;
+  height: 30rpx;
+  background: red;
+  color: #fff;
+  font-size: 25rpx;
+  line-height: 30rpx;
+}
+
+/* 右侧商品栏 */
+
+.rightcontent {
+  width: 550rpx;
+  height: 100%;
+  box-sizing: border-box;
+  background-color: #fff;
+  z-index: 1;
+}
+
+.rightcontent .adver-map {
+  width: auto;
+  box-sizing: border-box;
+  overflow: hidden;
+  position: relative;
+  margin: 30rpx 20rpx 0;
+}
+
+.rightcontent .adver-map .item-a {
+  display: block;
+  font-size: 0;
+  width: 100%;
+}
+
+.rightcontent .adver-map .item-a image {
+  max-width: 100%;
+}
+
+.rightcontent .cont-item {
+  padding: 0 20rpx 20rpx 20rpx;
+}
+
+.rightcontent .cont-item .show-item .more-prod-pic {
+  text-align: center;
+  width: 150rpx;
+  height: 150rpx;
+  line-height: 150rpx;
+  font-size: 0;
+}
+
+.rightcontent .cont-item .show-item .more-prod-pic .more-pic {
+  max-width: 100%;
+  max-height: 100%;
+  border-radius: 8rpx;
+  vertical-align: middle;
+}
+
+.rightcontent .cont-item .show-item {
+  position: relative;
+  display: flex;
+  justify-content: start;
+  padding: 20rpx 0;
+}
+
+.rightcontent .cont-item .show-item::after {
+  content: '';
+  background-color: #f4f4f4;
+  left: 0;
+  height: 1px;
+  transform-origin: 50% 100% 0;
+  bottom: 0;
+  position: absolute;
+  display: block;
+  width: 510rpx;
+  padding-left: 20rpx;
+}
+
+.rightcontent .cont-item .show-item .prod-text-right {
+  margin-left: 20rpx;
+  width: 75%;
+}
+
+.rightcontent .cont-item .show-item .prod-text-right .cate-prod-info {
+  font-size: 22rpx;
+  color: #999;
+  margin: 10rpx 0 20rpx 0;
+}
+
+.rightcontent .cont-item .show-item .prod-text-right .prod-text.more {
+  margin: 0;
+  font-size: 28rpx;
+  display: -webkit-box;
+  word-break: break-all;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  display: -webkit-box;
+  -webkit-line-clamp: 1;
+  -webkit-box-orient: vertical;
+  color: #000;
+}
+
+.rightcontent .cont-item .show-item .prod-text-right .prod-price.more {
+  font-size: 28rpx;
+  color: #eb2444;
+  font-family: arial;
+}

+ 98 - 0
mall4m/pages/delivery-address/delivery-address.js

@@ -0,0 +1,98 @@
+// pages/delivery-address/delivery-address.js
+
+var http = require("../../utils/http.js");
+// var config = require("../../utils/config.js");
+
+Page({
+  data: {
+    defaultSize: 'mini',
+    disabled: false,
+    plain: true,
+    loading: false,
+    addressList: [],
+    addAddress: '',
+    order: -1
+  },
+
+  onLoad: function (option) {
+    if (option.order) {
+      this.setData({
+        order: option.order
+      });
+    }
+  },
+
+  //新增收货地址
+  onAddAddr: function (e) {
+    wx.navigateTo({
+      url: '/pages/editAddress/editAddress',
+    })
+  },
+
+  //设置为默认地址
+  onDefaultAddr: function (e) {
+    var addrId = e.currentTarget.dataset.addrid;
+    console.log(addrId)
+    var ths = this;
+    wx.showLoading();
+    var params = {
+      url: "/p/address/defaultAddr/" + addrId,
+      method: "PUT",
+      data: {
+        addrId:addrId
+         },
+      callBack: function (res) {
+        wx.hideLoading();
+
+      }
+    }
+    http.request(params);
+  },
+
+  //加载地址列表
+  onShow: function () {
+    var ths = this;
+    wx.showLoading();
+
+
+      var params = {
+        url: "/p/address/list",
+        method: "GET",
+        data: {},
+        callBack: function (res) {
+          //console.log(res)
+          ths.setData({
+            addressList: res
+          });
+          wx.hideLoading();
+        }
+      }
+    
+    http.request(params);
+  },
+
+// 修改地址 
+  toEditAddress: function (e) {
+    var addrId = e.currentTarget.dataset.addrid;
+    wx.navigateTo({
+      url: '/pages/editAddress/editAddress?addrId=' + addrId,
+    })
+  },
+
+  /**
+   * 选择地址 跳转回提交订单页
+   */
+  selAddrToOrder: function (e) {
+    if (this.data.order == 0) {
+      var pages = getCurrentPages();//当前页面
+      var prevPage = pages[pages.length - 2];//上一页面
+      prevPage.setData({//直接给上移页面赋值
+        item: e.currentTarget.dataset.item,
+        selAddress: 'yes'
+      });
+      wx.navigateBack({//返回
+        delta: 1
+      })
+    }
+  }
+})

+ 6 - 0
mall4m/pages/delivery-address/delivery-address.json

@@ -0,0 +1,6 @@
+{
+    "backgroundTextStyle": "light",
+    "navigationBarBackgroundColor": "#fff",
+    "navigationBarTitleText": "收货地址",
+    "navigationBarTextStyle": "black"
+}

+ 37 - 0
mall4m/pages/delivery-address/delivery-address.wxml

@@ -0,0 +1,37 @@
+<!--pages/delivery-address/delivery-address.wxml-->
+<view class='container'>
+  <view class='main'>
+    <view class="empty" wx:if="{{addressList.length==0}}">
+      <view class="img">
+        <image src='http://jiales.gz-yami.com/addr.png'></image>
+      </view>
+      <view class='txt'>您还没有收货地址</view>
+    </view>
+    <radio-group class="radio-group" bindchange="radioChange">
+      <block wx:for="{{addressList}}">
+        <view class='address'>
+          <view class='personal' bindtap='selAddrToOrder' data-item="{{item}}">
+            <view class='info-tit'>
+              <text class='name'>{{item.receiver}}</text>
+              <text class='tel'>{{item.mobile}}</text>
+              <image src='../../images/icon/revise.png' catchtap='toEditAddress' data-addrid="{{item.addrId}}"></image>
+            </view>
+            <view class='addr'>
+
+              <text class='addr-get'> {{item.province}}{{item.city}}{{item.area}}{{item.addr}}</text>
+            </view>
+          </view>
+          <view class='select-btn'>
+            <view class="box">
+              <label  bindtap='onDefaultAddr' data-addrid="{{item.addrId}}">
+                <radio value="{{item.prodId}}" checked="{{item.commonAddr==1}}" color="#eb2444" />设为默认地址</label>
+            </view>
+          </view>
+        </view>
+      </block>
+    </radio-group>
+  </view>
+  <view class='footer' bindtap='onAddAddr'>
+    <text>新增收货地址</text>
+  </view>
+</view>

+ 101 - 0
mall4m/pages/delivery-address/delivery-address.wxss

@@ -0,0 +1,101 @@
+/* pages/delivery-address/delivery-address.wxss */
+
+page {
+  background-color: #f4f4f4;
+  border-top: 2rpx solid #e9eaec;
+  padding-bottom: 150rpx;
+}
+
+.main {
+  margin-top: 20rpx;
+}
+
+.address {
+  margin-bottom: 15rpx;
+  width: 100%;
+  background-color: #fff;
+  border-bottom: 2rpx solid #e9eaec;
+}
+
+.address .personal {
+  position: relative;
+  padding: 20rpx 30rpx;
+  border-bottom: 3rpx dashed #e9eaec;
+}
+
+.address .personal .info-tit .name {
+  margin-right: 30rpx;
+  font-size: 32rpx;
+  display: inline-block;
+}
+
+.address .personal .info-tit .tel {
+  font-size: 30rpx;
+}
+
+.address .personal .info-tit image {
+  position: absolute;
+  right: 30rpx;
+  top: 46rpx;
+  width: 40rpx;
+  height: 40rpx;
+  margin-left: 50rpx;
+  vertical-align: middle;
+}
+
+.personal .addr {
+  font-size: 26rpx;
+  margin: 10rpx 0;
+}
+
+.personal .addr .addr-get {
+  display: inline-block;
+  color: #999;
+  width: 85%;
+}
+
+.address .select-btn {
+  padding: 15rpx 30rpx;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+
+.address .select-btn .box {
+  font-size: 26rpx;
+}
+
+.footer {
+  position: fixed;
+  bottom: 0;
+  width: 100%;
+  height: 100rpx;
+  line-height: 100rpx;
+  text-align: center;
+  background-color: #fff;
+  box-shadow: 0 -1rpx 8rpx rgba(0, 0, 0, 0.05);
+}
+
+.footer text {
+  font-size: 32rpx;
+  color: #eb2444;
+}
+
+.empty .img {
+  text-align: center;
+  margin-top: 130rpx;
+}
+
+.empty .img image {
+  width: 100rpx;
+  height: 100rpx;
+  display: block;
+  margin: auto;
+}
+
+.empty .txt {
+  margin-top: 30rpx;
+  font-size: 24rpx;
+  text-align: center;
+  color: #999;
+}

+ 411 - 0
mall4m/pages/editAddress/editAddress.js

@@ -0,0 +1,411 @@
+// pages/editAddress/editAddress.js
+var http = require("../../utils/http.js");
+var config = require("../../utils/config.js");
+var index = [18, 0, 0];
+
+var t = 0;
+var show = false;
+var moveY = 200;
+Page({
+
+  /**
+   * 页面的初始数据
+   */
+  data: {
+    value: [0, 0, 0],
+    provArray: [],
+    cityArray: [],
+    areaArray: [],
+    province: "",
+    city: "",
+    area: "",
+    provinceId: 0,
+    cityId: 0,
+    areaId: 0,
+    receiver: "",
+    mobile: "",
+    addr: "",
+    addrId: 0
+  },
+
+  onLoad: function (options) {
+    if (options.addrId) {
+      wx.showLoading();
+      var params = {
+        url: "/p/address/addrInfo/" + options.addrId,
+        method: "GET",
+        data: {},
+        callBack: res => {
+          //console.log(res)
+          this.setData({
+            province: res.province,
+            city: res.city,
+            area: res.area,
+            provinceId: res.provinceId,
+            cityId: res.cityId,
+            areaId: res.areaId,
+            receiver: res.receiver,
+            mobile: res.mobile,
+            addr: res.addr,
+            addrId: options.addrId
+          });
+          this.initCityData(res.provinceId, res.cityId, res.areaId);
+          wx.hideLoading();
+        }
+      }
+      http.request(params);
+    } else {
+      this.initCityData(this.data.provinceId, this.data.cityId, this.data.areaId);
+    }
+  },
+
+  initCityData: function (provinceId, cityId, areaId) {
+    var ths = this;
+    wx.showLoading();
+    var params = {
+      url: "/p/area/listByPid",
+      method: "GET",
+      data: {
+        pid: 0
+      },
+      callBack: function (res) {
+        //console.log(res)
+        ths.setData({
+          provArray: res
+        });
+        if (provinceId) {
+          for (var index in res) {
+            if (res[index].areaId == provinceId) {
+              ths.setData({
+                value: [index, ths.data.value[1], ths.data.value[2]]
+              });
+            }
+          }
+        }
+        ths.getCityArray(provinceId ? provinceId : res[0].areaId, cityId, areaId);
+        wx.hideLoading();
+      }
+    }
+    http.request(params);
+  },
+
+  /**
+* 生命周期函数--监听页面显示
+*/
+  onShow: function () {
+
+  },
+
+  //滑动事件
+  bindChange: function (e) {
+    var ths = this;
+    var val = e.detail.value
+
+    //判断滑动的是第几个column
+    //若省份column做了滑动则定位到地级市和区县第一位
+    if (index[0] != val[0]) {
+      val[1] = 0;
+      val[2] = 0;
+      //更新数据
+      ths.getCityArray(this.data.provArray[val[0]].areaId);//获取地级市数据
+    } else {    //若省份column未做滑动,地级市做了滑动则定位区县第一位
+      if (index[1] != val[1]) {
+        val[2] = 0;
+        //更新数据
+        ths.getAreaArray(this.data.cityArray[val[1]].areaId);//获取区县数据
+      } else {
+
+      }
+    }
+    index = val;
+    this.setData({
+      value: [val[0], val[1], val[2]],
+    })
+    ths.setData({
+      province: ths.data.provArray[ths.data.value[0]].areaName,
+      city: ths.data.cityArray[ths.data.value[1]].areaName,
+      area: ths.data.areaArray[ths.data.value[2]].areaName,
+      provinceId: ths.data.provArray[ths.data.value[0]].areaId,
+      cityId: ths.data.cityArray[ths.data.value[1]].areaId,
+      areaId: ths.data.areaArray[ths.data.value[2]].areaId
+    })
+  },
+
+  onReady: function () {
+    this.animation = wx.createAnimation({
+      transformOrigin: "50% 50%",
+      duration: 0,
+      timingFunction: "ease",
+      delay: 0
+    }
+    )
+    this.animation.translateY(200 + 'vh').step();
+    this.setData({
+      animation: this.animation.export(),
+      show: show
+    })
+  },
+  //移动按钮点击事件
+  translate: function (e) {
+    if (t == 0) {
+      moveY = 0;
+      show = false;
+      t = 1;
+    } else {
+      moveY = 200;
+      show = true;
+      t = 0;
+    }
+    this.setData({
+      show: true
+    });
+    // this.animation.translate(arr[0], arr[1]).step();
+    this.animationEvents(this, moveY, show);
+
+  },
+  //隐藏弹窗浮层
+  hiddenFloatView(e) {
+    //console.log(e);
+    moveY = 200;
+    show = true;
+    t = 0;
+    this.animationEvents(this, moveY, show);
+
+  },
+
+  //动画事件
+  animationEvents: function (that, moveY, show) {
+    //console.log("moveY:" + moveY + "\nshow:" + show);
+    that.animation = wx.createAnimation({
+      transformOrigin: "50% 50%",
+      duration: 400,
+      timingFunction: "ease",
+      delay: 0
+    }
+    )
+    that.animation.translateY(moveY + 'vh').step()
+
+    that.setData({
+      animation: that.animation.export()
+    })
+
+  },
+
+  /**
+   * 根据省份ID获取 城市数据
+   */
+  getCityArray: function (provinceId, cityId, areaId) {
+    var ths = this;
+    var params = {
+      url: "/p/area/listByPid",
+      method: "GET",
+      data: {
+        pid: provinceId
+      },
+      callBack: function (res) {
+        //console.log(res)
+        ths.setData({
+          cityArray: res
+        });
+        if (cityId) {
+          for (var index in res) {
+            if (res[index].areaId == cityId) {
+              ths.setData({
+                value: [ths.data.value[0], index, ths.data.value[2]]
+              });
+            }
+          }
+        }
+        ths.getAreaArray(cityId ? cityId : res[0].areaId, areaId);
+        wx.hideLoading();
+      }
+    }
+    http.request(params);
+  },
+
+  /**
+    * 根据城市ID获取 区数据
+    */
+  getAreaArray: function (cityId, areaId) {
+    var ths = this;
+    var params = {
+      url: "/p/area/listByPid",
+      method: "GET",
+      data: {
+        pid: cityId
+      },
+      callBack: function (res) {
+        //console.log(res)
+        ths.setData({
+          areaArray: res
+        });
+        if (areaId) {
+
+          for (var _index in res) {
+            if (res[_index].areaId == areaId) {
+              ths.setData({
+                value: [ths.data.value[0], ths.data.value[1], _index]
+              });
+            }
+          }
+
+          index = ths.data.value;
+
+          ths.setData({
+            province: ths.data.province,
+            city: ths.data.city,
+            area: ths.data.area,
+            provinceId: ths.data.provinceId,
+            cityId: ths.data.cityId,
+            areaId: ths.data.areaId
+          })
+
+        } else {
+          ths.setData({
+            province: ths.data.provArray[ths.data.value[0]].areaName,
+            city: ths.data.cityArray[ths.data.value[1]].areaName,
+            area: ths.data.areaArray[ths.data.value[2]].areaName,
+            provinceId: ths.data.provArray[ths.data.value[0]].areaId,
+            cityId: ths.data.cityArray[ths.data.value[1]].areaId,
+            areaId: ths.data.areaArray[ths.data.value[2]].areaId
+          })
+        }
+
+        wx.hideLoading();
+      }
+    }
+    http.request(params);
+  },
+
+  bindRegionChange: function (e) {
+    //console.log('picker发送选择改变,携带值为', e.detail.value)
+    this.setData({
+      region: e.detail.value
+    })
+  },
+
+
+  /**
+   * 保存地址
+   */
+  onSaveAddr: function () {
+    var ths = this;
+    var receiver = ths.data.receiver;
+    var mobile = ths.data.mobile;
+    var addr = ths.data.addr;
+
+    if (!receiver) {
+      wx.showToast({
+        title: '请输入收货人姓名',
+        icon: "none"
+      })
+      return;
+    }
+    if (!mobile) {
+      wx.showToast({
+        title: '请输入手机号码',
+        icon: "none"
+      })
+      return;
+    }
+    if (mobile.length != 11) {
+      wx.showToast({
+        title: '请输入正确的手机号码',
+        icon: "none"
+      })
+      return;
+    }
+    if (!addr) {
+      wx.showToast({
+        title: '请输入详细地址',
+        icon: "none"
+      })
+      return;
+    }
+
+    wx.showLoading();
+    var url = "/p/address/addAddr";
+    var method = "POST";
+    if (ths.data.addrId != 0) {
+      url = "/p/address/updateAddr";
+      method = "PUT";
+    }
+    //添加或修改地址
+    var params = {
+      url: url,
+      method: method,
+      data: {
+        receiver: ths.data.receiver,
+        mobile: ths.data.mobile,
+        addr: ths.data.addr,
+        province: ths.data.province,
+        provinceId: ths.data.provinceId,
+        city: ths.data.city,
+        cityId: ths.data.cityId,
+        areaId: ths.data.areaId,
+        area: ths.data.area,
+        userType: 0,
+        addrId: ths.data.addrId
+      },
+      callBack: function (res) {
+        wx.hideLoading();
+        wx.navigateBack({
+          delta: 1
+        })
+      }
+    }
+    http.request(params);
+  },
+
+  onReceiverInput: function (e) {
+    this.setData({
+      receiver: e.detail.value
+    });
+  },
+
+  onMobileInput: function (e) {
+    this.setData({
+      mobile: e.detail.value
+    });
+  },
+
+  onAddrInput: function (e) {
+    this.setData({
+      addr: e.detail.value
+    });
+  },
+
+
+  //删除配送地址
+  onDeleteAddr: function (e) {
+    var ths = this;
+    wx.showModal({
+      title: '',
+      content: '确定要删除此收货地址吗?',
+      confirmColor: "#eb2444",
+      success(res) {
+        if (res.confirm) {
+          var addrId = ths.data.addrId;
+        
+          wx.showLoading();
+          var params = {
+            url: "/p/address/deleteAddr/" + addrId,
+            method: "DELETE",
+            data: {},
+            callBack: function (res) {
+              wx.hideLoading();
+              wx.navigateBack({
+                delta: 1
+              })
+            }
+          }
+          http.request(params);
+        } else if (res.cancel) {
+          console.log('用户点击取消')
+        }
+      }
+    })
+
+  },
+
+})

+ 6 - 0
mall4m/pages/editAddress/editAddress.json

@@ -0,0 +1,6 @@
+{
+  "backgroundTextStyle": "light",
+  "navigationBarBackgroundColor": "#fff",
+  "navigationBarTitleText": "编辑收货地址",
+  "navigationBarTextStyle": "black"
+}

+ 66 - 0
mall4m/pages/editAddress/editAddress.wxml

@@ -0,0 +1,66 @@
+<!--pages/editAddress/editAddress.wxml-->
+
+<view class='container'>
+  <!--input列表 -->
+  <view class='input-box'>
+    <view class="section">
+      <text>收 货 人</text>
+      <input placeholder='姓名' type='text' maxlength='15' value="{{receiver}}" bindinput="onReceiverInput" ></input>
+    </view>
+    <view class="section">
+      <text>手机号码</text>
+      <input placeholder='11位手机号码' type='number' maxlength='11' value="{{mobile}}" bindinput="onMobileInput"></input>
+    </view>
+    <view class="section" bindtap="translate">
+      <text>所在地区</text>
+      <view class="pca">{{province}} {{city}} {{area}}</view>
+      <view class="animation-element-wrapper" animation="{{animation}}" style="visibility:{{show ? 'visible':'hidden'}}" catchtap="hiddenFloatView">
+        <view class="animation-element" catchtap="nono">
+          <text class="right-bt" catchtap="hiddenFloatView">确定</text>
+          <view class="line"></view>
+          <picker-view indicator-style="height: 50rpx;" value="{{value}}" bindchange="bindChange" catchtap="nono">
+            <!--省-->
+            <picker-view-column>
+              <view wx:for="{{provArray}}" wx:key="">
+                {{item.areaName}}
+              </view>
+            </picker-view-column>
+            <!--地级市-->
+            <picker-view-column>
+              <view wx:for="{{cityArray}}" wx:key="">
+                {{item.areaName}}
+              </view>
+            </picker-view-column>
+            <!--区县-->
+            <picker-view-column>
+              <view wx:for="{{areaArray}}" wx:key="">
+                {{item.areaName}}
+              </view>
+            </picker-view-column>
+          </picker-view>
+        </view>
+      </view>
+
+      <view class='arrow'>
+        <image src='../../images/icon/more.png'></image>
+      </view>
+    </view>
+    <view class="section">
+      <text>详细地址</text>
+      <input placeholder='如楼号/单元/门牌号' type='text' value="{{addr}}" bindinput="onAddrInput"></input>
+    </view>
+  </view>
+  <!-- end input列表 -->
+  <!-- 功能按钮 -->
+  <view class='btn-box'>
+    <view class='keep btn' bindtap='onSaveAddr'>
+      <text>保存收货地址</text>
+    </view>
+
+    <view class='clear btn' bindtap="onDeleteAddr"  wx:if="{{addrId!=0}}">
+      <text>删除收货地址</text>
+    </view>
+  </view>
+  <!-- end 功能按钮 -->
+</view>
+

+ 181 - 0
mall4m/pages/editAddress/editAddress.wxss

@@ -0,0 +1,181 @@
+/* pages/editAddress/editAddress.wxss */
+
+page {
+  background: #fff;
+}
+
+/* input列表 */
+
+.input-box {
+  margin-bottom: 50rpx;
+  background: #fff;
+  padding: 0 20rpx;
+}
+
+.input-box .section {
+  display: flex;
+  align-items: center;
+  width: 100%;
+  font-size: 28rpx;
+  padding: 30rpx 0;
+  line-height: 48rpx;
+  height: 100%;
+  box-sizing: border-box;
+  border-bottom: 2rpx solid #e5e5e5;
+}
+
+.input-box .section text {
+  width: 20%;
+  color: #333;
+}
+
+.input-box .section input {
+  width: 70%;
+  padding: 0 20rpx;
+  color: #333;
+}
+
+.input-box .section picker {
+  width: 70%;
+  padding: 0 30rpx;
+}
+
+.input-box .section .pca {
+  width: 70%;
+  padding: 0 20rpx;
+}
+
+.input-box .section .arrow {
+  width: 28rpx;
+  height: 28rpx;
+}
+
+.input-box .section .arrow image {
+  width: 100%;
+  height: 100%;
+  vertical-align: top;
+}
+
+/* end input列表 */
+
+/* 功能按钮 */
+
+.btn-box {
+  padding: 5px 10px;
+  width: 100%;
+  text-align: center;
+  margin: auto;
+}
+
+.btn-box text {
+  font-size: 30rpx;
+}
+
+.btn-box .clear.btn, .keep.btn {
+  width: 60%;
+  height: 80rpx;
+  line-height: 80rpx;
+  margin: auto;
+  text-align: center;
+  border: 1rpx solid #eb2444;
+  border-radius: 50rpx;
+  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.05), 0 1px 0 rgba(255, 255, 255, 0.3);
+}
+
+.btn-box .keep {
+  color: #fff;
+  background-color: #eb2444;
+}
+
+.btn-box .clear.btn {
+  margin-top: 40rpx;
+  color: #eb2444;
+  background-color: #f8f0f1b6;
+}
+
+/* end 功能按钮 */
+
+.infoText {
+  margin-top: 20rpx;
+  text-align: center;
+  width: 100%;
+  justify-content: center;
+}
+
+picker-view {
+  background-color: white;
+  padding: 0;
+  width: 100%;
+  height: 380rpx;
+  bottom: 0;
+  position: fixed;
+}
+
+picker-view-column view {
+  vertical-align: middle;
+  font-size: 28rpx;
+  line-height: 28rpx;
+  height: 100%;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.animation-element-wrapper {
+  display: flex;
+  position: fixed;
+  left: 0;
+  top: 0;
+  height: 100%;
+  width: 100%;
+  background-color: rgba(0, 0, 0, 0.6);
+  z-index: 999;
+}
+
+.animation-element {
+  display: flex;
+  position: fixed;
+  width: 100%;
+  height: 470rpx;
+  bottom: 0;
+  background-color: rgba(255, 255, 255, 1);
+}
+
+.animation-button {
+  top: 20rpx;
+  width: 290rpx;
+  height: 100rpx;
+  align-items: center;
+}
+
+picker-view text {
+  color: #999;
+  display: inline-flex;
+  position: fixed;
+  margin-top: 20rpx;
+  height: 50rpx;
+  text-align: center;
+  line-height: 50rpx;
+  font-size: 34rpx;
+  font-family: Arial, Helvetica, sans-serif;
+}
+
+.left-bt {
+  left: 30rpx;
+}
+
+.right-bt {
+  right: 20rpx;
+  top: 20rpx;
+  position: absolute;
+  width: 80rpx !important;
+}
+
+.line {
+  display: block;
+  position: fixed;
+  height: 2rpx;
+  width: 100%;
+  margin-top: 89rpx;
+  background-color: #eee;
+}

+ 88 - 0
mall4m/pages/express-delivery/express-delivery.js

@@ -0,0 +1,88 @@
+// pages/express-delivery/express-delivery.js
+
+var http = require('../../utils/http.js');
+Page({
+
+  /**
+   * 页面的初始数据
+   */
+  data: {
+    companyName: "",
+    dvyFlowId: "",
+    dvyData: []
+  },
+
+  /**
+   * 生命周期函数--监听页面加载
+   */
+  onLoad: function (options) {
+    var ths = this;
+    wx.showLoading();
+    var params = {
+      url: "/delivery/check",
+      method: "GET",
+      data: {
+        orderNumber: options.orderNum
+      },
+      callBack: function (res) {
+        //console.log(res);
+        ths.setData({
+          companyName: res.companyName,
+          dvyFlowId: res.dvyFlowId,
+          dvyData: res.data
+        });
+        wx.hideLoading();
+      }
+    };
+    http.request(params);
+  },
+
+  /**
+   * 生命周期函数--监听页面初次渲染完成
+   */
+  onReady: function () {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面显示
+   */
+  onShow: function () {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面隐藏
+   */
+  onHide: function () {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面卸载
+   */
+  onUnload: function () {
+
+  },
+
+  /**
+   * 页面相关事件处理函数--监听用户下拉动作
+   */
+  onPullDownRefresh: function () {
+
+  },
+
+  /**
+   * 页面上拉触底事件的处理函数
+   */
+  onReachBottom: function () {
+
+  },
+
+  /**
+   * 用户点击右上角分享
+   */
+  onShareAppMessage: function () {
+
+  }
+})

+ 6 - 0
mall4m/pages/express-delivery/express-delivery.json

@@ -0,0 +1,6 @@
+{
+  "backgroundTextStyle": "light",
+  "navigationBarBackgroundColor": "#fff",
+  "navigationBarTitleText": "物流查询",
+  "navigationBarTextStyle": "black"
+}

+ 35 - 0
mall4m/pages/express-delivery/express-delivery.wxml

@@ -0,0 +1,35 @@
+<!--pages/express-delivery/express-delivery.wxml-->
+<!-- 物流信息 -->
+<view class='container'>
+  <view class="wrapper">
+    <view class="deliveryInfo" style="background:url(http://jiales.gz-yami.com/delivery-bg.png) center center no-repeat #fff;">
+      <view class="icon-express"  style="background:url(http://jiales.gz-yami.com/delivery-car.png) no-repeat;background-size:100% 100%;">
+      </view>
+      <view class="infoWarp">
+        <view class="companyname">
+          <text class="key">物流公司:</text>
+          <text class="value">{{companyName}}</text>
+        </view>
+        <view class="expno">
+          <text class="key">运单编号:</text>
+          <text class="value">{{dvyFlowId}}</text>
+        </view>
+      </view>
+    </view>
+    <view class="deliveryDetail">
+      <block wx:for="{{dvyData}}" wx:key=''>
+        
+        <view class="detailItem {{index==0?'lastest':''}}" >
+          <view class="dot">
+            <image src='../../images/icon/delive-dot.png' ></image>
+             <image src='../../images/icon/dot.png' ></image>
+          </view>
+          <view class="detail">
+            <view class="desc">{{item.context}}</view>
+            <view class="time">{{item.time}}</view>
+          </view>
+        </view>
+      </block>
+    </view>
+  </view>
+</view>

+ 184 - 0
mall4m/pages/express-delivery/express-delivery.wxss

@@ -0,0 +1,184 @@
+/* pages/express-delivery/express-delivery.wxss */
+
+.container {
+  height: 100%;
+}
+
+.padding20 {
+  padding-top: 88rpx;
+}
+
+.f-fl {
+  float: left;
+}
+
+.f-fr {
+  float: right;
+}
+
+.navWrap {
+  position: fixed;
+  top: 0;
+  left: 0;
+  z-index: 1;
+  overflow: hidden;
+  background-color: #fafafa;
+  border-bottom: 2rpx solid #f4f4f4;
+  height: 92rpx;
+}
+
+.nav {
+  display: flex;
+  flex-flow: row nowrap;
+}
+
+.nav-slider {
+  left: 0;
+  bottom: 0;
+  height: 4rpx;
+  background-color: #b4282d;
+  transition: transform 0.3s;
+  transition: transform 0.3s, -webkit-transform 0.3s;
+  box-sizing: border-box;
+}
+
+.nav-item {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  flex: 1;
+  float: left;
+  height: 88rpx;
+  padding: 0 16rpx;
+  font-size: 28rpx;
+}
+
+.nav-item text {
+  box-sizing: border-box;
+  color: #333;
+  padding: 27rpx 16rpx 23rpx;
+  line-height: 34rpx;
+}
+
+.nav-item.active text {
+  color: #b4282d;
+}
+
+.u-icon {
+  vertical-align: middle;
+}
+
+.deliveryInfo {
+  height: 198rpx;
+  width: 100%;
+  vertical-align: middle;
+  padding-left: 30rpx;
+  background-size: cover;
+  display: table;
+  position: relative;
+  box-sizing: border-box;
+}
+
+.icon-express {
+  width: 104rpx;
+  height: 104rpx;
+  background-size: 100% 100%;
+  position: absolute;
+  top: 48rpx;
+  left: 30rpx;
+}
+
+.infoWarp {
+  display: table-cell;
+  vertical-align: middle;
+}
+
+.deliveryInfo .companyname, .deliveryInfo .expno {
+  line-height: 1;
+  margin-left: 136rpx;
+  font-size: 28rpx;
+}
+
+.deliveryInfo .companyname .key, .deliveryInfo .expno .key {
+  color: #666;
+}
+
+.deliveryInfo .expno {
+  margin-top: 16rpx;
+}
+
+.deliveryDetail {
+  margin-top: 20rpx;
+  padding-top: 40rpx;
+  background-color: #fff;
+  min-height: 670rpx;
+}
+
+.detailItem {
+  border-left: 1px dashed #f4f4f4;
+  margin-left: 42rpx;
+  position: relative;
+  margin-bottom: 2rpx;
+}
+
+.dot image {
+  width: 35rpx;
+  height: 35rpx;
+  background-size: 100%;
+  position: absolute;
+  top: 40rpx;
+  left: -18rpx;
+}
+
+.lastest .dot image {
+  top: -2rpx;
+}
+
+.detail .desc {
+  font-size: 24rpx;
+  line-height: 30rpx;
+}
+
+.detail .time {
+  font-size: 24rpx;
+  line-height: 30rpx;
+  color: #999;
+  margin-top: 15rpx;
+}
+
+.detail {
+  border-top: 1px solid #f4f4f4;
+  margin-left: 28rpx;
+  overflow: hidden;
+  padding-right: 30rpx;
+}
+
+.detail .desc {
+  margin-top: 40rpx;
+}
+
+.detail .time {
+  margin-bottom: 39rpx;
+}
+
+.lastest .detail .desc, .lastest .detail .time {
+  color: #105c3e;
+}
+
+.lastest .detail {
+  border-top: 0;
+}
+
+.lastest .detail .desc {
+  margin-top: 0;
+}
+
+.deliveryTip {
+  height: 80rpx;
+  background-color: #fff8d8;
+  padding-left: 30rpx;
+  color: #f48f18;
+  font-size: 28rpx;
+  line-height: 80rpx;
+  margin-bottom: 20rpx;
+}

+ 216 - 0
mall4m/pages/index/index.js

@@ -0,0 +1,216 @@
+//index.js
+//获取应用实例
+var http = require("../../utils/http.js");
+var config = require("../../utils/config.js");
+const app = getApp()
+
+Page({
+  data: {
+    indicatorDots: true,
+    indicatorColor: '#d1e5fb',
+    indicatorActiveColor: '#1b7dec',
+    autoplay: true,
+    interval: 2000,
+    duration: 1000,
+    indexImgs: [],
+    seq: 0,
+    news: [],
+    taglist: [],
+    sts: 0,
+  },
+  //事件处理函数
+  bindViewTap: function() {
+    wx.navigateTo({
+      url: '../logs/logs'
+    })
+  },
+  onLoad: function() {
+    this.getAllData();
+
+  },
+
+  // 页面滚动到指定位置指定元素固定在顶部
+  onPageScroll: function(e) { //监听页面滚动
+    this.setData({
+      scrollTop: e.scrollTop
+    })
+  },
+
+  toProdPage: function(e) {
+    var prodid = e.currentTarget.dataset.prodid;
+    if (prodid) {
+      wx.navigateTo({
+        url: '/pages/prod/prod?prodid=' + prodid,
+      })
+    }
+  },
+
+  toCouponCenter: function() {
+    wx.showToast({
+      icon:"none",
+      title: '该功能未开源'
+    })
+  },
+
+  // 跳转搜索页
+  toSearchPage: function() {
+    wx.navigateTo({
+      url: '/pages/search-page/search-page',
+    })
+  },
+
+  //跳转商品活动页面
+  toClassifyPage: function(e) {
+    var url = '/pages/prod-classify/prod-classify?sts=' + e.currentTarget.dataset.sts;
+    var id = e.currentTarget.dataset.id;
+    var title = e.currentTarget.dataset.title;
+    if (id) {
+      url += "&tagid=" + id + "&title=" + title;
+    }
+    wx.navigateTo({
+      url: url
+    })
+  },
+
+  //跳转公告列表页面
+  onNewsPage: function() {
+    wx.navigateTo({
+      url: '/pages/recent-news/recent-news',
+    })
+  },
+
+  onShow: function() {
+    wx.getSetting({
+      success(res) {
+        if (!res.authSetting['scope.userInfo']) {
+          wx.navigateTo({
+            url: '/pages/login/login',
+          })
+        }
+      }
+    })
+
+
+  },
+  getAllData() {
+    http.getCartCount(); //重新计算购物车总数量
+    this.getIndexImgs();
+    this.getNoticeList();
+    this.getTag();
+  },
+  //加载轮播图
+  getIndexImgs() {
+    //加载轮播图
+    var params = {
+      url: "/indexImgs",
+      method: "GET",
+      data: {},
+      callBack: (res) => {
+        this.setData({
+          indexImgs: res,
+          seq: res
+        });
+      }
+    };
+    http.request(params);
+  },
+  getNoticeList() {
+    // 加载公告
+    var params = {
+      url: "/shop/notice/topNoticeList",
+      method: "GET",
+      data: {},
+      callBack: (res) => {
+        this.setData({
+          news: res,
+        });
+      }
+    };
+    http.request(params);
+  },
+
+
+  // 加载商品标题分组列表
+  getTag() {
+    var params = {
+      url: "/prod/tag/prodTagList",
+      method: "GET",
+      data: {},
+      callBack: (res) => {
+        this.setData({
+          taglist: res,
+        });
+        for (var i = 0; i < res.length; i++) {
+          this.getTagProd(res[i].id, i);
+        }
+      }
+    };
+    http.request(params);
+  },
+
+  getTagProd(id, index) {
+    var param = {
+      url: "/prod/prodListByTagId",
+      method: "GET",
+      data: {
+        tagId: id,
+        size: 6
+      },
+      callBack: (res) => {
+        var taglist = this.data.taglist;
+        taglist[index].prods = res.records
+
+        this.setData({
+          taglist: taglist,
+        });
+      }
+    };
+    http.request(param);
+  },
+
+  /**
+   * 页面相关事件处理函数--监听用户下拉动作
+   */
+  // onPullDownRefresh: function () {
+  //     wx.request({
+  //       url: '',
+  //       data: {},
+  //       method: 'GET',
+  //       success: function (res) { },
+  //       fail: function (res) { },
+  //       complete: function (res) {
+  //         wx.stopPullDownRefresh();
+  //       }
+  //     })
+  // },
+
+  onPullDownRefresh: function() {
+
+    // wx.showNavigationBarLoading() //在标题栏中显示加载
+
+    //模拟加载
+    var ths = this;
+    setTimeout(function() {
+
+      ths.getAllData();
+
+      // wx.hideNavigationBarLoading() //完成停止加载
+
+      wx.stopPullDownRefresh() //停止下拉刷新
+
+    }, 100);
+
+  },
+
+  /**
+   * 跳转至商品详情
+   */
+  showProdInfo: function(e) {
+    let relation = e.currentTarget.dataset.relation;
+    if (relation) {
+      wx.navigateTo({
+        url: 'pages/prod/prod',
+      })
+    }
+  }
+})

+ 6 - 0
mall4m/pages/index/index.json

@@ -0,0 +1,6 @@
+{
+  "backgroundTextStyle": "dark",
+  "navigationBarTextStyle": "black",
+  "enablePullDownRefresh": true,
+  "navigationBarTitleText": "亚米科技mall4j"
+}

+ 151 - 0
mall4m/pages/index/index.wxml

@@ -0,0 +1,151 @@
+<!--index.wxml-->
+<view class="container">
+  <view class='bg-sear'>
+    <view class="scrolltop">
+      <view class='section' bindtap='toSearchPage'>
+        <image src='../../images/icon/search.png' class='search-img'></image>
+        <text class='placeholder'>搜索</text>
+      </view>
+    </view>
+  </view>
+
+  <view class='content'>
+    <!-- swiper -->
+    <swiper autoplay="{{autoplay}}" indicator-color="{{indicatorColor}}" interval="{{interval}}" duration="{{duration}}" indicator-active-color="{{indicatorActiveColor}} " circular='true' class='pic-swiper' indicator-dots previous-margin='20rpx' next-margin='20rpx'>
+      <block wx:for='{{indexImgs}}' wx:key=''>
+        <swiper-item class="banner-item">
+          <view class='img-box'>
+            <image src='{{item.imgUrl}}' data-prodid='{{item.relation}}' bindtap='toProdPage' class='banner'></image>
+          </view>
+        </swiper-item>
+      </block>
+    </swiper>
+    <!-- end swiper -->
+
+    <view class='cat-item'>
+      <view class='item' bindtap='toClassifyPage' data-sts="1">
+        <image src='../../images/icon/newProd.png'></image>
+        <text>新品推荐</text>
+      </view>
+      <view class='item' bindtap='toClassifyPage' data-sts="2">
+        <image src='../../images/icon/timePrice.png'></image>
+        <text>限时特惠</text>
+      </view>
+      <view class='item' bindtap='toClassifyPage' data-sts="3">
+        <image src='../../images/icon/neweveryday.png'></image>
+        <text>每日疯抢</text>
+      </view>
+      <view class='item' bindtap='toCouponCenter'>
+        <image src='../../images/icon/newprods.png'></image>
+        <text>领优惠券</text>
+      </view>
+    </view>
+
+    <!-- 消息播放 -->
+    <view class='message-play' bindtap='onNewsPage'>
+      <image src='../../images/icon/horn.png' class='hornpng'></image>
+      <swiper vertical='true' autoplay='true' duration='1000' class='swiper-cont'>
+        <block wx:for='{{news}}' wx:key=''>
+          <swiper-item class="items">{{item.title}}</swiper-item>
+        </block>
+      </swiper>
+      <text class='arrow'></text>
+    </view>
+
+  </view>
+
+  <block wx:for="{{taglist}}" wx:key="id">
+    <!-- 每日上新 -->
+    <view class='up-to-date' wx:if="{{item.style==2}}">
+      <view class='title'>
+        <text>{{item.title}}</text>
+        <view class='more-prod-cont' bindtap='toClassifyPage' data-sts="0" data-id="{{item.id}}" data-title="{{item.title}}">
+          <text class='more'>查看更多</text>
+          <!-- <text class='arrow'></text> -->
+        </view>
+      </view>
+      <view class='item-cont'>
+        <block wx:for="{{item.prods}}" wx:for-item="prod" wx:key="prodId">
+          <view class='prod-item' bindtap='toProdPage' data-prodid="{{prod.prodId}}">
+            <view>
+              <view class='imagecont'>
+                <image src='{{prod.pic}}' class='prodimg'></image>
+              </view>
+              <view class='prod-text'>{{prod.prodName}}</view>
+              <view class='price'>
+                <text class='symbol'>¥</text>
+                <text class='big-num'>{{wxs.parsePrice(prod.price)[0]}}</text>
+                <text class='small-num'>.{{wxs.parsePrice(prod.price)[1]}}</text>
+              </view>
+            </view>
+          </view>
+        </block>
+
+      </view>
+    </view>
+
+    <!-- 商城热卖 -->
+    <view class='hot-sale' wx:if="{{item.style==1}}">
+      <view class='title'>
+        <text>{{item.title}}</text>
+        <view class='more-prod-cont' bindtap='toClassifyPage' data-sts="0" data-id="{{item.id}}" data-title="{{item.title}}">
+          <text class='more'>更多</text>
+          <text class='arrow'></text>
+        </view>
+      </view>
+      <view class='hotsale-item-cont'>
+        <block wx:for="{{item.prods}}" wx:for-item="prod" wx:key="prodId">
+          <view class='prod-items' bindtap='toProdPage' data-prodid="{{prod.prodId}}">
+            <view class='hot-imagecont'>
+              <image src='{{prod.pic}}' class='hotsaleimg'></image>
+            </view>
+            <view class='hot-text'>
+              <view class='hotprod-text'>{{prod.prodName}}</view>
+              <view class='prod-info'>{{prod.brief}}</view>
+              <view class='prod-text-info'>
+                <view class='price'>
+                  <text class='symbol'>¥</text>
+                  <text class='big-num'>{{wxs.parsePrice(prod.price)[0]}}</text>
+                  <text class='small-num'>.{{wxs.parsePrice(prod.price)[1]}}</text>
+                </view>
+                <!-- <view class='singal-price'>
+                  <text>¥</text>
+                  <text>{{prod.oriPrice}}</text>
+                </view> -->
+                <image src='../../images/tabbar/basket-sel.png' class='basket-img'></image>
+              </view>
+            </view>
+          </view>
+        </block>
+      </view>
+    </view>
+
+    <!-- 更多宝贝 -->
+    <view class='more-prod' wx:if="{{item.style==0}}">
+      <view class='title'>{{item.title}}</view>
+      <view class='prod-show'>
+        <block wx:for="{{item.prods}}" wx:for-item="prod" wx:key="prodId">
+          <view class='show-item' bindtap='toProdPage' data-prodid="{{prod.prodId}}">
+            <view class='more-prod-pic'>
+              <image src='{{prod.pic}}' class='more-pic'></image>
+            </view>
+            <view class='prod-text-right'>
+              <view class='prod-text more'>{{prod.prodName}}</view>
+              <view class='prod-info'>{{prod.brief}}</view>
+              <view class='b-cart'>
+                <view class='price'>
+                  <text class='symbol'>¥</text>
+                  <text class='big-num'>{{wxs.parsePrice(prod.price)[0]}}</text>
+                  <text class='small-num'>.{{wxs.parsePrice(prod.price)[1]}}</text>
+                </view>
+                <!-- <view class='go-to-buy'>立即购买</view> -->
+                <image src='../../images/tabbar/basket-sel.png' class='basket-img'></image>
+              </view>
+            </view>
+          </view>
+        </block>
+      </view>
+    </view>
+  </block>
+</view>
+<wxs module="wxs" src="../../wxs/number.wxs" />

+ 462 - 0
mall4m/pages/index/index.wxss

@@ -0,0 +1,462 @@
+/**index.wxss**/
+
+page {
+  background: #f7f7f7;
+  height: auto;
+}
+
+/* 轮播图及搜索框 */
+
+swiper {
+  width: 100%;
+  height: 350rpx;
+  overflow: hidden;
+}
+
+swiper.pic-swiper {
+  margin-top: 75rpx;
+  padding: 10rpx 0;
+  background: #fff;
+  height: 422rpx;
+}
+
+swiper-item {
+  font-size: 26rpx;
+  font-weight: bold;
+}
+
+swiper.pic-swiper .img-box {
+  font-size: 0;
+}
+
+.wx-swiper-dots {
+  margin-bottom: 15rpx;
+}
+
+.banner-item {
+  box-sizing: border-box;
+}
+
+swiper.pic-swiper .banner {
+  position: absolute;
+  width: 690rpx;
+  margin: 0 10rpx;
+  height: 402rpx;
+  border-radius: 8rpx;
+  display: inline-block;
+  box-shadow: 0 4px 10px 0 rgba(83, 83, 83, 0.288);
+}
+
+.container .bg-sear {
+  position: fixed;
+  z-index: 999;
+  width: 100%;
+  line-height: 56rpx;
+  background: #fff;
+  padding-bottom: 20rpx;
+  text-align: center;
+  top: 0;
+}
+
+.bg-sear .section {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  height: 60rpx;
+  background: #fff;
+  z-index: 1;
+  border-radius: 50rpx;
+  width: 92%;
+  margin: auto;
+  left: 4%;
+  background: #f7f7f7;
+}
+
+.bg-sear .section .placeholder {
+  display: block;
+  font-size: 24rpx;
+  color: #999;
+}
+
+.bg-sear .section .search-img {
+  width: 32rpx;
+  height: 32rpx;
+  margin-right: 10rpx;
+}
+
+/* 分类栏目 */
+
+.content {
+  background: #fff;
+}
+
+.cat-item {
+  display: flex;
+  justify-content: space-between;
+  background: #fff;
+  padding-top: 20rpx;
+  padding-bottom: 30rpx;
+}
+
+.cat-item .item {
+  text-align: center;
+  width: 25%;
+  display: flex;
+  flex-direction: column;
+  margin: auto;
+  align-items: center;
+}
+
+.cat-item .item image {
+  width: 75rpx;
+  height: 75rpx;
+}
+
+.cat-item .item text {
+  font-size: 26rpx;
+  margin-top: 20rpx;
+}
+
+/* 消息播放 */
+
+.message-play {
+  position: relative;
+  height: 90rpx;
+  background: #fff;
+  margin: auto;
+  padding: 0 60rpx 0 100rpx;
+  box-sizing: border-box;
+  box-shadow: 0 16rpx 32rpx 0 rgba(7, 17, 27, 0.05);
+  border: 2rpx solid #fafafa;
+}
+
+.message-play .hornpng {
+  width: 77rpx;
+  height: 36rpx;
+  position: absolute;
+  left: 20rpx;
+  top: 27rpx;
+  margin-right: 8rpx;
+}
+
+.message-play .swiper-cont {
+  height: 90rpx;
+  line-height: 90rpx;
+}
+
+.message-play .swiper-cont .items {
+  text-overflow: ellipsis;
+  display: -webkit-box;
+  -webkit-line-clamp: 1;
+  -webkit-box-orient: vertical;
+  text-align: left;
+}
+
+.arrow {
+  width: 15rpx;
+  height: 15rpx;
+  border-top: 3rpx solid #686868;
+  border-right: 3rpx solid #686868;
+  transform: rotate(45deg);
+  position: absolute;
+  right: 30rpx;
+  top: 34rpx;
+}
+
+/* 每日上新 */
+
+.title {
+  position: relative;
+  height: 64rpx;
+  line-height: 64rpx;
+  font-size: 32rpx;
+  padding:40rpx 0 10rpx 30rpx;
+  color:#333;
+  background: #fff;
+}
+
+.up-to-date .title{
+  color: #fff;
+  background: none;
+}
+
+.title .more-prod-cont {
+  color: #999;
+  display: inline-block;
+  text-align: right;
+}
+
+.up-to-date .title .more-prod-cont .more {
+  position:absolute;
+right:30rpx;
+top:48rpx;
+color:#fff;
+font-size:24rpx;
+background:#65addf;
+border-radius:30rpx;
+padding:0 30rpx;
+height:44rpx;
+line-height:44rpx;
+
+}
+
+.title .more-prod-cont .more{
+   position:absolute;
+  right:30rpx;
+  top:48rpx;
+  color:#666;
+  font-size:24rpx;
+  padding:0 20rpx;
+  height:44rpx;
+  line-height:44rpx;
+}
+
+.title .more-prod-cont .arrow {
+  top:58rpx;
+  right: 30rpx;
+  border-top: 2rpx solid #666;
+  border-right: 2rpx solid #666;
+}
+
+.up-to-date {
+  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUAAAABxCAYAAACkwXoWAAABS2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxMzggNzkuMTU5ODI0LCAyMDE2LzA5LzE0LTAxOjA5OjAxICAgICAgICAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIi8+CiA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgo8P3hwYWNrZXQgZW5kPSJyIj8+IEmuOgAAAZBJREFUeJzt1DEBwCAAwLAxYfhEGXJABkcTBb065trnAwj6XwcAvGKAQJYBAlkGCGQZIJBlgECWAQJZBghkGSCQZYBAlgECWQYIZBkgkGWAQJYBAlkGCGQZIJBlgECWAQJZBghkGSCQZYBAlgECWQYIZBkgkGWAQJYBAlkGCGQZIJBlgECWAQJZBghkGSCQZYBAlgECWQYIZBkgkGWAQJYBAlkGCGQZIJBlgECWAQJZBghkGSCQZYBAlgECWQYIZBkgkGWAQJYBAlkGCGQZIJBlgECWAQJZBghkGSCQZYBAlgECWQYIZBkgkGWAQJYBAlkGCGQZIJBlgECWAQJZBghkGSCQZYBAlgECWQYIZBkgkGWAQJYBAlkGCGQZIJBlgECWAQJZBghkGSCQZYBAlgECWQYIZBkgkGWAQJYBAlkGCGQZIJBlgECWAQJZBghkGSCQZYBAlgECWQYIZBkgkGWAQJYBAlkGCGQZIJBlgECWAQJZBghkGSCQZYBAlgECWQYIZBkgkGWAQJYBAlkGCGRdKykDj9OUNYkAAAAASUVORK5CYII=");
+  background-position: top;
+  background-size: 100% 332rpx;
+  background-repeat: no-repeat;
+  background-color: #fff;
+}
+
+.up-to-date .item-cont {
+  margin: auto;
+  height: auto;
+  width: calc(100% - 40rpx);
+  padding:0 20rpx;
+  display: flex;
+  flex-wrap:wrap;
+  justify-content: space-around;
+  /* padding: 10rpx 0 0 0; */
+}
+
+.hotsale-item-cont {
+  padding-bottom: 20rpx;
+  background: #fff;
+}
+
+.up-to-date .item-cont::before {
+  clear: both;
+  height: 0;
+  overflow: hidden;
+}
+
+.up-to-date .item-cont .prod-item {
+  border-radius: 10rpx;
+  width: 220rpx;
+  background: #fff;
+  display: inline-block;
+  margin-bottom:20rpx;
+  box-shadow: 0rpx 6rpx 8rpx rgba(58,134,185,0.2);
+}
+
+.up-to-date .item-cont .prod-item .imagecont {
+  width: 100%;
+  font-size: 0;
+}
+
+.up-to-date .item-cont .prod-item .imagecont .prodimg {
+  width: 220rpx;
+  height: 220rpx;
+  vertical-align: middle;
+  border-top-left-radius: 10rpx;
+  border-top-right-radius: 10rpx;
+  font-size:0;
+
+}
+
+.up-to-date .item-cont .prod-item .prod-text {
+  font-size: 28rpx;
+  overflow: hidden;
+  margin: 10rpx 0;
+  height: 75rpx;
+  display: -webkit-box;
+  word-break: break-all;
+  display: -webkit-box;
+  -webkit-line-clamp: 2;
+  -webkit-box-orient: vertical;
+  color: #000;
+  padding: 0 10rpx;
+}
+
+.up-to-date .item-cont .prod-item .prod-price {
+  font-size: 25rpx;
+  color: #eb2444;
+  font-family: Arial;
+  padding: 0 10rpx;
+}
+
+.more.prod-price {
+  position: absolute;
+  bottom: 20rpx;
+}
+
+/* 商城热卖 */
+
+.hot-sale {
+  /* margin: 15rpx 0; */
+}
+
+.hot-sale .prod-items {
+  width: 345rpx;
+  display: inline-block;
+  background: #fff;
+  padding-bottom: 20rpx;
+  box-sizing: border-box;
+  /* border: 2rpx solid #e1e1e1; */
+  box-shadow: 0rpx 6rpx 8rpx rgba(58,134,185,0.2);
+}
+
+.hot-sale .prod-items:nth-child(2n-1) {
+  margin: 20rpx 10rpx 10rpx 20rpx;
+}
+
+.hot-sale .prod-items:nth-child(2n) {
+  margin: 20rpx 20rpx 10rpx 10rpx;
+}
+
+.prod-items .hot-imagecont .hotsaleimg {
+  width: 341rpx;
+  height: 341rpx;
+}
+
+.prod-items .hot-text .hotprod-text {
+  font-size: 28rpx;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+
+.prod-items .hot-imagecont {
+  font-size: 0;
+  text-align: center;
+}
+
+.prod-items .hot-text {
+  margin-top: 20rpx;
+  padding: 0 10rpx;
+}
+
+.prod-items .hot-text .prod-info, .more-prod .prod-text-right .prod-info {
+  font-size: 22rpx;
+  color: #999;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+
+.prod-items .hot-text .prod-text-info {
+  position: relative;
+  height: 70rpx;
+  line-height: 70rpx;
+  font-family: Arial;
+}
+
+.prod-items .hot-text .prod-text-info .hotprod-price {
+  display: inline;
+  font-size: 26rpx;
+  color: #eb2444;
+}
+
+.prod-items .hot-text .prod-text-info .basket-img {
+  width: 50rpx;
+  height: 50rpx;
+  position: absolute;
+  right: 0;
+  bottom: 7rpx;
+  /* border: 2rpx solid #eb2444;
+  border-radius: 50%; */
+  padding: 8rpx;
+}
+
+.singal-price {
+  display: inline;
+  font-size: 20rpx;
+  text-decoration: line-through;
+  color: #777;
+  margin-left: 15rpx;
+}
+
+/* 更多宝贝 */
+
+.more-prod {
+  background: #fff;
+}
+
+
+.more-prod .prod-show .show-item .more-prod-pic {
+  width: 250rpx;
+  height: 250rpx;
+}
+
+.more-prod .prod-show .show-item {
+  position: relative;
+  display: flex;
+  padding: 20rpx;
+  justify-content: start;
+  border-top: 2rpx solid #f4f4f4;
+}
+
+.more-prod .prod-show .show-item .more-prod-pic .more-pic {
+  max-width: 100%;
+  max-height: 100%;
+}
+
+.more-prod .prod-show .show-item .prod-text-right {
+  margin-left: 30rpx;
+  width: 72%;
+  padding-bottom: 10rpx;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+}
+
+.more-prod .prod-show .show-item .prod-text-right .go-to-buy {
+  font-size: 26rpx;
+  background: #fff2f5;
+  color: #eb2444;
+  border-radius: 50rpx;
+  text-align: center;
+  padding: 12rpx 20rpx;
+  position: absolute;
+  right: 20rpx;
+  bottom: 20rpx;
+}
+
+.more-prod .prod-show .show-item .prod-text-right .prod-text.more {
+  margin: 0;
+  font-size: 28rpx;
+  overflow: hidden;
+  margin-bottom: 20rpx;
+  display: -webkit-box;
+  word-break: break-all;
+  display: -webkit-box;
+  -webkit-line-clamp: 2;
+  -webkit-box-orient: vertical;
+}
+
+.more-prod .prod-show .show-item .prod-text-right .more.prod-price {
+  font-size: 28rpx;
+  font-family: arial;
+}
+
+.b-cart {
+  margin-top: 30rpx;
+}
+
+.b-cart .basket-img {
+  width: 50rpx;
+  height: 50rpx;
+  position: absolute;
+  right: 46rpx;
+  /* border: 2rpx solid #eb2444;
+  border-radius: 50%; */
+  padding: 8rpx;
+}

+ 73 - 0
mall4m/pages/login/login.js

@@ -0,0 +1,73 @@
+var http = require("../../utils/http.js");
+Page({
+
+  /**
+   * 页面的初始数据
+   */
+  data: {
+
+  },
+
+  onGotUserInfo: function (res) {
+    
+    http.updateUserInfo();
+    wx.navigateBack({
+      delta: 1
+    })
+  },
+  /**
+   * 生命周期函数--监听页面加载
+   */
+  onLoad: function (options) {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面初次渲染完成
+   */
+  onReady: function () {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面显示
+   */
+  onShow: function () {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面隐藏
+   */
+  onHide: function () {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面卸载
+   */
+  onUnload: function () {
+
+  },
+
+  /**
+   * 页面相关事件处理函数--监听用户下拉动作
+   */
+  onPullDownRefresh: function () {
+
+  },
+
+  /**
+   * 页面上拉触底事件的处理函数
+   */
+  onReachBottom: function () {
+
+  },
+
+  /**
+   * 用户点击右上角分享
+   */
+  onShareAppMessage: function () {
+
+  }
+})

+ 3 - 0
mall4m/pages/login/login.json

@@ -0,0 +1,3 @@
+{
+  "usingComponents": {}
+}

+ 5 - 0
mall4m/pages/login/login.wxml

@@ -0,0 +1,5 @@
+<!--pages/login/login.wxml-->
+<image src='http://img-test.gz-yami.com/mini/logo.jpg' class='c-logo'></image>
+<view class="title">亚米科技mall4j</view>
+<view class="msg">申请获得你的公开信息(昵称、头像等)</view>
+<button color="#eb2444"  open-type="getUserInfo" lang = "zh_CN" bindgetuserinfo = "onGotUserInfo" class=''>微信授权</button>

+ 44 - 0
mall4m/pages/login/login.wxss

@@ -0,0 +1,44 @@
+/* pages/login/login.wxss */
+
+
+image {
+  display: block;
+  width: 150rpx;
+  height: 150rpx;
+  margin: auto;
+  margin-top: 100rpx;
+  border-radius: 50%;
+}
+
+view.msg {
+  font-size: 24rpx;
+  color: #666;
+  width: 100%;
+  text-align: center;
+  margin-top: 10rpx;
+}
+
+view.title {
+  font-size: 28rpx;
+  color: #333;
+  width: 100%;
+  text-align: center;
+  margin-top: 20rpx;
+}
+
+button {
+  margin-top: 30rpx;
+  width: 450rpx;
+  height: 70rpx;
+  line-height: 70rpx;
+  font-size: 30rpx;
+  color: #fff;
+  background: #eb2444;
+  border: 2rpx solid #eb2444;
+}
+
+
+.button-hover{
+  background-color: #fff;
+  color: #eb2444;
+}

+ 15 - 0
mall4m/pages/logs/logs.js

@@ -0,0 +1,15 @@
+//logs.js
+const util = require('../../utils/util.js')
+
+Page({
+  data: {
+    logs: []
+  },
+  onLoad: function () {
+    this.setData({
+      logs: (wx.getStorageSync('logs') || []).map(log => {
+        return util.formatTime(new Date(log))
+      })
+    })
+  }
+})

+ 4 - 0
mall4m/pages/logs/logs.json

@@ -0,0 +1,4 @@
+{
+  "navigationBarTitleText": "查看启动日志",
+  "usingComponents": {}
+}

+ 6 - 0
mall4m/pages/logs/logs.wxml

@@ -0,0 +1,6 @@
+<!--logs.wxml-->
+<view class="container log-list">
+  <block wx:for="{{logs}}" wx:for-item="log">
+    <text class="log-item">{{index + 1}}. {{log}}</text>
+  </block>
+</view>

+ 9 - 0
mall4m/pages/logs/logs.wxss

@@ -0,0 +1,9 @@
+.log-list {
+  display: flex;
+  flex-direction: column;
+  padding: 40rpx;
+}
+
+.log-item {
+  margin: 10rpx;
+}

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно