- 
					5library-activity/.gitattributes
- 
					34library-activity/.gitignore
- 
					674library-activity/LICENSE
- 
					41library-activity/README.md
- 
					23library-activity/app.config.js
- 
					26library-activity/index.html
- 
					5834library-activity/package-lock.json
- 
					41library-activity/package.json
- 
					1library-activity/public/js/aes.min.js
- 
					2library-activity/public/js/axios.js
- 
					1library-activity/public/js/cipher-core.min.js
- 
					1library-activity/public/js/core.min.js
- 
					1library-activity/public/js/enc-base64.min.js
- 
					1library-activity/public/js/enc-hex.min.js
- 
					1library-activity/public/js/enc-utf8.min.js
- 
					1library-activity/public/js/evpkdf.min.js
- 
					1library-activity/public/js/md5.min.js
- 
					1library-activity/public/js/mode-ecb.min.js
- 
					1library-activity/public/js/pad-pkcs7.min.js
- 
					40library-activity/public/js/rem.js
- 
					14library-activity/public/js/swiper6.min.js
- 
					39library-activity/src/App.vue
- 
					191library-activity/src/assets/css/reset.css
- 
					13library-activity/src/assets/css/swiper6.min.css
- 
					BINlibrary-activity/src/assets/images/active.png
- 
					BINlibrary-activity/src/assets/images/activeA.png
- 
					BINlibrary-activity/src/assets/images/arrow.png
- 
					BINlibrary-activity/src/assets/images/back.png
- 
					BINlibrary-activity/src/assets/images/bookimg.png
- 
					BINlibrary-activity/src/assets/images/btn1.png
- 
					BINlibrary-activity/src/assets/images/btn2.png
- 
					BINlibrary-activity/src/assets/images/btn3.png
- 
					BINlibrary-activity/src/assets/images/cart.png
- 
					BINlibrary-activity/src/assets/images/cartA.png
- 
					BINlibrary-activity/src/assets/images/d-fh.png
- 
					BINlibrary-activity/src/assets/images/d-she.png
- 
					BINlibrary-activity/src/assets/images/d-shuo.png
- 
					BINlibrary-activity/src/assets/images/dealer.png
- 
					BINlibrary-activity/src/assets/images/gift.png
- 
					BINlibrary-activity/src/assets/images/hi.png
- 
					BINlibrary-activity/src/assets/images/lending.png
- 
					BINlibrary-activity/src/assets/images/mine.png
- 
					BINlibrary-activity/src/assets/images/mineA.png
- 
					BINlibrary-activity/src/assets/images/minebg.png
- 
					BINlibrary-activity/src/assets/images/nodata.png
- 
					BINlibrary-activity/src/assets/images/return.png
- 
					BINlibrary-activity/src/assets/images/selected.png
- 
					BINlibrary-activity/src/assets/images/time.png
- 
					BINlibrary-activity/src/assets/images/xd-status.png
- 
					BINlibrary-activity/src/assets/images/y-qx.png
- 
					BINlibrary-activity/src/assets/images/y-wc.png
- 
					BINlibrary-activity/src/assets/images/yh1.png
- 
					BINlibrary-activity/src/assets/images/yh2.png
- 
					2library-activity/src/assets/js/axios.js
- 
					40library-activity/src/assets/js/rem.js
- 
					14library-activity/src/assets/js/swiper6.min.js
- 
					BINlibrary-activity/src/assets/logo-48.png
- 
					155library-activity/src/common/qiniu-uploader.js
- 
					47library-activity/src/common/selectLbrary.js
- 
					13library-activity/src/common/util.js
- 
					62library-activity/src/components/aitoast/aitoast.vue
- 
					116library-activity/src/components/tabBar/index.vue
- 
					477library-activity/src/components/verify/slide-verify.vue
- 
					249library-activity/src/components/wuc-tab/wuc-tab.vue
- 
					133library-activity/src/main.js
- 
					143library-activity/src/router/index.js
- 
					419library-activity/src/utils/api.js
- 
					43library-activity/src/utils/http.js
- 
					113library-activity/src/utils/tool.js
- 
					152library-activity/src/utils/util.js
- 
					388library-activity/src/views/cart/cart.vue
- 
					107library-activity/src/views/cart/result.vue
- 
					436library-activity/src/views/index.vue
- 
					316library-activity/src/views/mine/mine.vue
- 
					13library-activity/src/vuex/index.js
- 
					187library-activity/src/vuex/modules/home.js
- 
					41library-activity/src/vuex/modules/login.js
- 
					157library-activity/src/vuex/modules/reading.js
- 
					58library-activity/vite.config.js
- 
					3064library-activity/yarn.lock
| @ -0,0 +1,5 @@ | |||
| *.js linguist-language=vue | |||
| 
 | |||
| *.css linguist-language=vue | |||
| 
 | |||
| *.html linguist-language=vue | |||
| @ -0,0 +1,34 @@ | |||
| .DS_Store | |||
| node_modules | |||
| 
 | |||
| # local env files | |||
| .env.local | |||
| .env.*.local | |||
| 
 | |||
| # Log files | |||
| npm-debug.log* | |||
| yarn-debug.log* | |||
| yarn-error.log* | |||
| pnpm-debug.log* | |||
| 
 | |||
| # Editor directories and files | |||
| .idea | |||
| .vscode | |||
| *.suo | |||
| *.ntvs* | |||
| *.njsproj | |||
| *.sln | |||
| *.sw? | |||
| 
 | |||
| ### IntelliJ IDEA ### | |||
| .idea | |||
| *.iws | |||
| *.iml | |||
| *.ipr | |||
| 
 | |||
| ### NetBeans ### | |||
| /nbproject/private/ | |||
| /build/ | |||
| /nbbuild/ | |||
| /nbdist/ | |||
| /.nb-gradle/ | |||
| @ -0,0 +1,674 @@ | |||
|                     GNU GENERAL PUBLIC LICENSE | |||
|                        Version 3, 29 June 2007 | |||
| 
 | |||
|  Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/> | |||
|  Everyone is permitted to copy and distribute verbatim copies | |||
|  of this license document, but changing it is not allowed. | |||
| 
 | |||
|                             Preamble | |||
| 
 | |||
|   The GNU General Public License is a free, copyleft license for | |||
| software and other kinds of works. | |||
| 
 | |||
|   The licenses for most software and other practical works are designed | |||
| to take away your freedom to share and change the works.  By contrast, | |||
| the GNU General Public License is 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.  We, the Free Software Foundation, use the | |||
| GNU General Public License for most of our software; it applies also to | |||
| any other work released this way by its authors.  You can apply it to | |||
| your programs, too. | |||
| 
 | |||
|   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. | |||
| 
 | |||
|   To protect your rights, we need to prevent others from denying you | |||
| these rights or asking you to surrender the rights.  Therefore, you have | |||
| certain responsibilities if you distribute copies of the software, or if | |||
| you modify it: responsibilities to respect the freedom of others. | |||
| 
 | |||
|   For example, if you distribute copies of such a program, whether | |||
| gratis or for a fee, you must pass on to the recipients the same | |||
| freedoms that you received.  You must make sure that they, too, receive | |||
| or can get the source code.  And you must show them these terms so they | |||
| know their rights. | |||
| 
 | |||
|   Developers that use the GNU GPL protect your rights with two steps: | |||
| (1) assert copyright on the software, and (2) offer you this License | |||
| giving you legal permission to copy, distribute and/or modify it. | |||
| 
 | |||
|   For the developers' and authors' protection, the GPL clearly explains | |||
| that there is no warranty for this free software.  For both users' and | |||
| authors' sake, the GPL requires that modified versions be marked as | |||
| changed, so that their problems will not be attributed erroneously to | |||
| authors of previous versions. | |||
| 
 | |||
|   Some devices are designed to deny users access to install or run | |||
| modified versions of the software inside them, although the manufacturer | |||
| can do so.  This is fundamentally incompatible with the aim of | |||
| protecting users' freedom to change the software.  The systematic | |||
| pattern of such abuse occurs in the area of products for individuals to | |||
| use, which is precisely where it is most unacceptable.  Therefore, we | |||
| have designed this version of the GPL to prohibit the practice for those | |||
| products.  If such problems arise substantially in other domains, we | |||
| stand ready to extend this provision to those domains in future versions | |||
| of the GPL, as needed to protect the freedom of users. | |||
| 
 | |||
|   Finally, every program is threatened constantly by software patents. | |||
| States should not allow patents to restrict development and use of | |||
| software on general-purpose computers, but in those that do, we wish to | |||
| avoid the special danger that patents applied to a free program could | |||
| make it effectively proprietary.  To prevent this, the GPL assures that | |||
| patents cannot be used to render the program non-free. | |||
| 
 | |||
|   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 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. Use with the GNU Affero General Public License. | |||
| 
 | |||
|   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 Affero 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 special requirements of the GNU Affero General Public License, | |||
| section 13, concerning interaction through a network will apply to the | |||
| combination as such. | |||
| 
 | |||
|   14. Revised Versions of this License. | |||
| 
 | |||
|   The Free Software Foundation may publish revised and/or new versions of | |||
| the GNU 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 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 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 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 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 General Public License for more details. | |||
| 
 | |||
|     You should have received a copy of the GNU General Public License | |||
|     along with this program.  If not, see <https://www.gnu.org/licenses/>. | |||
| 
 | |||
| Also add information on how to contact you by electronic and paper mail. | |||
| 
 | |||
|   If the program does terminal interaction, make it output a short | |||
| notice like this when it starts in an interactive mode: | |||
| 
 | |||
|     <program>  Copyright (C) <year>  <name of author> | |||
|     This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. | |||
|     This is free software, and you are welcome to redistribute it | |||
|     under certain conditions; type `show c' for details. | |||
| 
 | |||
| The hypothetical commands `show w' and `show c' should show the appropriate | |||
| parts of the General Public License.  Of course, your program's commands | |||
| might be different; for a GUI interface, you would use an "about box". | |||
| 
 | |||
|   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 GPL, see | |||
| <https://www.gnu.org/licenses/>. | |||
| 
 | |||
|   The GNU General Public License does not permit incorporating your program | |||
| into proprietary programs.  If your program is a subroutine library, you | |||
| may consider it more useful to permit linking proprietary applications with | |||
| the library.  If this is what you want to do, use the GNU Lesser General | |||
| Public License instead of this License.  But first, please read | |||
| <https://www.gnu.org/licenses/why-not-lgpl.html>. | |||
| @ -0,0 +1,41 @@ | |||
| 
 | |||
| 
 | |||
| # H5 图书馆活动演示项目  # | |||
| 基于Vue 3.0 + Vite 2.0 + Vue-Router 4.0 + vant + axios。 | |||
| 
 | |||
| 
 | |||
| ## 目录结构介绍 ## | |||
| 
 | |||
|   |-- dist                             // 项目打包后生产目录 | |||
|   |-- public                           // 静态文件目录,可直接在index.html 中引入 | |||
| 	|-- src                              // 源码目录 | |||
| 	|   |-- components                   // 公共组件 | |||
| 	|           |-- leftnav.vue          // 左边菜单栏 | |||
| 	|           |-- navcon.vue           // 头部菜单栏 | |||
| 	|           |-- Pagination.vue       // 公共分页组件 | |||
| 	|		|-- views                   	   // 主要路由页面 | |||
| 	|           |-- Login.vue          	 // 登录 | |||
| 	|           |-- index.vue          	 // 主页面 | |||
| 	|   |-- App.vue                      // 页面入口文件 | |||
| 	|   |-- main.js                      // 程序入口文件,加载各种公共组件 | |||
| 	|-- .babelrc                         // ES6语法编译配置 | |||
| 	|-- .editorconfig                    // 代码编写规格 | |||
| 	|-- .gitignore                       // 忽略的文件 | |||
| 	|-- index.html                       // 入口html文件 | |||
|   |-- app.config.js                    // 开发环境和线上环境配置文件 | |||
|   |-- vite.config.js                   // vite 配置文件 | |||
| 	|-- package.json                     // 项目及工具的依赖配置文件 | |||
| 	|-- README.md                        // 说明 | |||
| 
 | |||
| ## 安装依赖包 ## | |||
| npm install | |||
| 
 | |||
| ## 部署开发环境 ## | |||
| npm run dev | |||
| 
 | |||
| ## 打包 ## | |||
| npm run build | |||
| 
 | |||
| ## 打包后部署生产环境服务器 ## | |||
| npm run serve   | |||
| 
 | |||
| @ -0,0 +1,23 @@ | |||
| /** | |||
|  * 项目的一些定制化配置 | |||
|  */ | |||
|  const isProd = process.env.NODE_ENV === 'production' | |||
|  const proxyConfig = { | |||
|    proxy: { | |||
|      //'/api': 'https://testapi.aiyxlib.com/api',
 | |||
|     // 'url': 'http://restapi.amap.com/',
 | |||
|     // url: "https://testapi.aiyxlib.com/api",
 | |||
|     'url': "http://192.168.99.111:5001/api", | |||
|    }, | |||
|    prodProxy: { | |||
|      //'url': "http://192.168.99.111:5001",
 | |||
|       //'url': 'https://testapi.aiyxlib.com',
 | |||
| 	  'url': 'https://rosefinchapi.aiyxlib.com/api' | |||
|    } | |||
|  } | |||
|   | |||
|  export default { | |||
|    // 代理配置,可支持多个代理,key为前缀,命中后,会把前缀去掉,转发到代理服务器
 | |||
|    proxy: isProd ? proxyConfig.prodProxy.url : proxyConfig.proxy.url | |||
|  } | |||
|   | |||
| @ -0,0 +1,26 @@ | |||
| <!DOCTYPE html> | |||
| <html lang="en"> | |||
|   <head> | |||
|     <meta charset="UTF-8" /> | |||
|     <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | |||
|     <link rel="icon" href="/logo-48.png"> | |||
|     <title>你选书 我买单</title> | |||
|   </head> | |||
|   <body> | |||
|     <div id="app"></div> | |||
|     <script src="https://s.yezgea02.com/1609305532675/echarts.js"></script> | |||
|     <script type="module" src="/src/main.js"></script> | |||
|     <script src="/js/core.min.js"></script> | |||
|     <script src="/js/enc-base64.min.js"></script> | |||
|     <script src="/js/md5.min.js"></script> | |||
|     <script src="/js/evpkdf.min.js"></script> | |||
|     <script src="/js/cipher-core.min.js"></script> | |||
|     <script src="/js/aes.min.js"></script> | |||
|     <script src="/js/pad-pkcs7.min.js"></script> | |||
|     <script src="/js/mode-ecb.min.js"></script> | |||
|     <script src="/js/enc-utf8.min.js"></script> | |||
|     <script src="/js/enc-hex.min.js"></script> | |||
|     <script src="https://sdk-release.qnsdk.com/qiniu-web-player-1.2.0.js"></script> | |||
|     <script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script> | |||
|   </body> | |||
| </html> | |||
						
							
						
						
							5834
	
						
						library-activity/package-lock.json
						
							File diff suppressed because it is too large
							
							
								
									View File
								
							
						
					
				| @ -0,0 +1,41 @@ | |||
| { | |||
|   "name": "vue3-mobile", | |||
|   "version": "0.0.0", | |||
|   "scripts": { | |||
|     "dev": "vite --mode development", | |||
|     "build:beta": "vite build --mode beta", | |||
|     "build": "vite build --mode production", | |||
|     "serve": "vite preview" | |||
|   }, | |||
|   "dependencies": { | |||
|     "@sentry/browser": "^6.3.1", | |||
|     "@sentry/tracing": "^6.3.1", | |||
|     "axios": "^0.21.1", | |||
|     "js-md5": "^0.7.3", | |||
|     "pushstate-server": "^3.1.0", | |||
|     "qs": "^6.9.6", | |||
|     "vant": "^3.1.5", | |||
|     "vue": "^3.0.5", | |||
|     "vue-router": "^4.0.4", | |||
|     "vuex": "4.0", | |||
|     "wangeditor": "^4.6.10" | |||
|   }, | |||
|   "devDependencies": { | |||
|     "@babel/core": "^7.13.8", | |||
|     "@babel/runtime": "^7.13.8", | |||
|     "@rollup/plugin-babel": "^5.3.0", | |||
|     "@vitejs/plugin-vue": "^1.1.4", | |||
|     "@vue/compiler-sfc": "^3.0.5", | |||
|     "babel": "^6.23.0", | |||
|     "babel-plugin-component": "^1.1.1", | |||
|     "babel-plugin-import": "^1.13.3", | |||
|     "element-theme-chalk": "^2.15.1", | |||
|     "sass": "^1.69.4", | |||
|     "sass-loader": "^10.0.3", | |||
|     "vite": "^2.0.1", | |||
|     "vite-babel-plugin": "^0.0.2", | |||
|     "vite-plugin-babel-import": "^2.0.2", | |||
|     "vite-plugin-imp": "^2.0.4", | |||
|     "vite-plugin-svg-icons": "^2.0.1" | |||
|   } | |||
| } | |||
| @ -0,0 +1 @@ | |||
| !function(e,r){"object"==typeof exports?module.exports=exports=r(require("./core"),require("./enc-base64"),require("./md5"),require("./evpkdf"),require("./cipher-core")):"function"==typeof define&&define.amd?define(["./core","./enc-base64","./md5","./evpkdf","./cipher-core"],r):r(e.CryptoJS)}(this,function(t){return function(){var e=t,r=e.lib.BlockCipher,i=e.algo,f=[],u=[],h=[],y=[],a=[],p=[],v=[],_=[],k=[],l=[];!function(){for(var e=[],r=0;r<256;r++)e[r]=r<128?r<<1:r<<1^283;var i=0,o=0;for(r=0;r<256;r++){var t=o^o<<1^o<<2^o<<3^o<<4;t=t>>>8^255&t^99,f[i]=t;var n=e[u[t]=i],c=e[n],s=e[c],d=257*e[t]^16843008*t;h[i]=d<<24|d>>>8,y[i]=d<<16|d>>>16,a[i]=d<<8|d>>>24,p[i]=d;d=16843009*s^65537*c^257*n^16843008*i;v[t]=d<<24|d>>>8,_[t]=d<<16|d>>>16,k[t]=d<<8|d>>>24,l[t]=d,i?(i=n^e[e[e[s^n]]],o^=e[e[o]]):i=o=1}}();var S=[0,1,2,4,8,16,32,64,128,27,54],o=i.AES=r.extend({_doReset:function(){if(!this._nRounds||this._keyPriorReset!==this._key){for(var e=this._keyPriorReset=this._key,r=e.words,i=e.sigBytes/4,o=4*(1+(this._nRounds=6+i)),t=this._keySchedule=[],n=0;n<o;n++)n<i?t[n]=r[n]:(d=t[n-1],n%i?6<i&&n%i==4&&(d=f[d>>>24]<<24|f[d>>>16&255]<<16|f[d>>>8&255]<<8|f[255&d]):(d=f[(d=d<<8|d>>>24)>>>24]<<24|f[d>>>16&255]<<16|f[d>>>8&255]<<8|f[255&d],d^=S[n/i|0]<<24),t[n]=t[n-i]^d);for(var c=this._invKeySchedule=[],s=0;s<o;s++){n=o-s;if(s%4)var d=t[n];else d=t[n-4];c[s]=s<4||n<=4?d:v[f[d>>>24]]^_[f[d>>>16&255]]^k[f[d>>>8&255]]^l[f[255&d]]}}},encryptBlock:function(e,r){this._doCryptBlock(e,r,this._keySchedule,h,y,a,p,f)},decryptBlock:function(e,r){var i=e[r+1];e[r+1]=e[r+3],e[r+3]=i,this._doCryptBlock(e,r,this._invKeySchedule,v,_,k,l,u);i=e[r+1];e[r+1]=e[r+3],e[r+3]=i},_doCryptBlock:function(e,r,i,o,t,n,c,s){for(var d=this._nRounds,f=e[r]^i[0],u=e[r+1]^i[1],h=e[r+2]^i[2],y=e[r+3]^i[3],a=4,p=1;p<d;p++){var v=o[f>>>24]^t[u>>>16&255]^n[h>>>8&255]^c[255&y]^i[a++],_=o[u>>>24]^t[h>>>16&255]^n[y>>>8&255]^c[255&f]^i[a++],k=o[h>>>24]^t[y>>>16&255]^n[f>>>8&255]^c[255&u]^i[a++],l=o[y>>>24]^t[f>>>16&255]^n[u>>>8&255]^c[255&h]^i[a++];f=v,u=_,h=k,y=l}v=(s[f>>>24]<<24|s[u>>>16&255]<<16|s[h>>>8&255]<<8|s[255&y])^i[a++],_=(s[u>>>24]<<24|s[h>>>16&255]<<16|s[y>>>8&255]<<8|s[255&f])^i[a++],k=(s[h>>>24]<<24|s[y>>>16&255]<<16|s[f>>>8&255]<<8|s[255&u])^i[a++],l=(s[y>>>24]<<24|s[f>>>16&255]<<16|s[u>>>8&255]<<8|s[255&h])^i[a++];e[r]=v,e[r+1]=_,e[r+2]=k,e[r+3]=l},keySize:8});e.AES=r._createHelper(o)}(),t.AES}); | |||
						
							
						
						
							2
	
						
						library-activity/public/js/axios.js
						
							File diff suppressed because it is too large
							
							
								
									View File
								
							
						
					
				| @ -0,0 +1 @@ | |||
| !function(e,t){"object"==typeof exports?module.exports=exports=t(require("./core"),require("./evpkdf")):"function"==typeof define&&define.amd?define(["./core","./evpkdf"],t):t(e.CryptoJS)}(this,function(m){m.lib.Cipher||function(){var e=m,t=e.lib,r=t.Base,a=t.WordArray,i=t.BufferedBlockAlgorithm,n=e.enc,c=(n.Utf8,n.Base64),o=e.algo.EvpKDF,s=t.Cipher=i.extend({cfg:r.extend(),createEncryptor:function(e,t){return this.create(this._ENC_XFORM_MODE,e,t)},createDecryptor:function(e,t){return this.create(this._DEC_XFORM_MODE,e,t)},init:function(e,t,r){this.cfg=this.cfg.extend(r),this._xformMode=e,this._key=t,this.reset()},reset:function(){i.reset.call(this),this._doReset()},process:function(e){return this._append(e),this._process()},finalize:function(e){return e&&this._append(e),this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(i){return{encrypt:function(e,t,r){return f(t).encrypt(i,e,t,r)},decrypt:function(e,t,r){return f(t).decrypt(i,e,t,r)}}}});function f(e){return"string"==typeof e?g:k}t.StreamCipher=s.extend({_doFinalize:function(){return this._process(!0)},blockSize:1});var p,d=e.mode={},h=t.BlockCipherMode=r.extend({createEncryptor:function(e,t){return this.Encryptor.create(e,t)},createDecryptor:function(e,t){return this.Decryptor.create(e,t)},init:function(e,t){this._cipher=e,this._iv=t}}),u=d.CBC=((p=h.extend()).Encryptor=p.extend({processBlock:function(e,t){var r=this._cipher,i=r.blockSize;_.call(this,e,t,i),r.encryptBlock(e,t),this._prevBlock=e.slice(t,t+i)}}),p.Decryptor=p.extend({processBlock:function(e,t){var r=this._cipher,i=r.blockSize,n=e.slice(t,t+i);r.decryptBlock(e,t),_.call(this,e,t,i),this._prevBlock=n}}),p);function _(e,t,r){var i,n=this._iv;n?(i=n,this._iv=void 0):i=this._prevBlock;for(var c=0;c<r;c++)e[t+c]^=i[c]}var l=(e.pad={}).Pkcs7={pad:function(e,t){for(var r=4*t,i=r-e.sigBytes%r,n=i<<24|i<<16|i<<8|i,c=[],o=0;o<i;o+=4)c.push(n);var s=a.create(c,i);e.concat(s)},unpad:function(e){var t=255&e.words[e.sigBytes-1>>>2];e.sigBytes-=t}},y=(t.BlockCipher=s.extend({cfg:s.cfg.extend({mode:u,padding:l}),reset:function(){var e;s.reset.call(this);var t=this.cfg,r=t.iv,i=t.mode;this._xformMode==this._ENC_XFORM_MODE?e=i.createEncryptor:(e=i.createDecryptor,this._minBufferSize=1),this._mode&&this._mode.__creator==e?this._mode.init(this,r&&r.words):(this._mode=e.call(i,this,r&&r.words),this._mode.__creator=e)},_doProcessBlock:function(e,t){this._mode.processBlock(e,t)},_doFinalize:function(){var e,t=this.cfg.padding;return this._xformMode==this._ENC_XFORM_MODE?(t.pad(this._data,this.blockSize),e=this._process(!0)):(e=this._process(!0),t.unpad(e)),e},blockSize:4}),t.CipherParams=r.extend({init:function(e){this.mixIn(e)},toString:function(e){return(e||this.formatter).stringify(this)}})),v=(e.format={}).OpenSSL={stringify:function(e){var t=e.ciphertext,r=e.salt;return(r?a.create([1398893684,1701076831]).concat(r).concat(t):t).toString(c)},parse:function(e){var t,r=c.parse(e),i=r.words;return 1398893684==i[0]&&1701076831==i[1]&&(t=a.create(i.slice(2,4)),i.splice(0,4),r.sigBytes-=16),y.create({ciphertext:r,salt:t})}},k=t.SerializableCipher=r.extend({cfg:r.extend({format:v}),encrypt:function(e,t,r,i){i=this.cfg.extend(i);var n=e.createEncryptor(r,i),c=n.finalize(t),o=n.cfg;return y.create({ciphertext:c,key:r,iv:o.iv,algorithm:e,mode:o.mode,padding:o.padding,blockSize:e.blockSize,formatter:i.format})},decrypt:function(e,t,r,i){return i=this.cfg.extend(i),t=this._parse(t,i.format),e.createDecryptor(r,i).finalize(t.ciphertext)},_parse:function(e,t){return"string"==typeof e?t.parse(e,this):e}}),x=(e.kdf={}).OpenSSL={execute:function(e,t,r,i){i=i||a.random(8);var n=o.create({keySize:t+r}).compute(e,i),c=a.create(n.words.slice(t),4*r);return n.sigBytes=4*t,y.create({key:n,iv:c,salt:i})}},g=t.PasswordBasedCipher=k.extend({cfg:k.cfg.extend({kdf:x}),encrypt:function(e,t,r,i){var n=(i=this.cfg.extend(i)).kdf.execute(r,e.keySize,e.ivSize);i.iv=n.iv;var c=k.encrypt.call(this,e,t,n.key,i);return c.mixIn(n),c},decrypt:function(e,t,r,i){i=this.cfg.extend(i),t=this._parse(t,i.format);var n=i.kdf.execute(r,e.keySize,e.ivSize,t.salt);return i.iv=n.iv,k.decrypt.call(this,e,t,n.key,i)}})}()}); | |||
| @ -0,0 +1 @@ | |||
| !function(t,n){"object"==typeof exports?module.exports=exports=n():"function"==typeof define&&define.amd?define([],n):t.CryptoJS=n()}(this,function(){var t=t||function(f){var t;if("undefined"!=typeof window&&window.crypto&&(t=window.crypto),!t&&"undefined"!=typeof window&&window.msCrypto&&(t=window.msCrypto),!t&&"undefined"!=typeof global&&global.crypto&&(t=global.crypto),!t&&"function"==typeof require)try{t=require("crypto")}catch(t){}function i(){if(t){if("function"==typeof t.getRandomValues)try{return t.getRandomValues(new Uint32Array(1))[0]}catch(t){}if("function"==typeof t.randomBytes)try{return t.randomBytes(4).readInt32LE()}catch(t){}}throw new Error("Native crypto module could not be used to get secure random number.")}var e=Object.create||function(t){var n;return r.prototype=t,n=new r,r.prototype=null,n};function r(){}var n={},o=n.lib={},s=o.Base={extend:function(t){var n=e(this);return t&&n.mixIn(t),n.hasOwnProperty("init")&&this.init!==n.init||(n.init=function(){n.$super.init.apply(this,arguments)}),(n.init.prototype=n).$super=this,n},create:function(){var t=this.extend();return t.init.apply(t,arguments),t},init:function(){},mixIn:function(t){for(var n in t)t.hasOwnProperty(n)&&(this[n]=t[n]);t.hasOwnProperty("toString")&&(this.toString=t.toString)},clone:function(){return this.init.prototype.extend(this)}},p=o.WordArray=s.extend({init:function(t,n){t=this.words=t||[],this.sigBytes=null!=n?n:4*t.length},toString:function(t){return(t||c).stringify(this)},concat:function(t){var n=this.words,e=t.words,i=this.sigBytes,r=t.sigBytes;if(this.clamp(),i%4)for(var o=0;o<r;o++){var s=e[o>>>2]>>>24-o%4*8&255;n[i+o>>>2]|=s<<24-(i+o)%4*8}else for(o=0;o<r;o+=4)n[i+o>>>2]=e[o>>>2];return this.sigBytes+=r,this},clamp:function(){var t=this.words,n=this.sigBytes;t[n>>>2]&=4294967295<<32-n%4*8,t.length=f.ceil(n/4)},clone:function(){var t=s.clone.call(this);return t.words=this.words.slice(0),t},random:function(t){for(var n=[],e=0;e<t;e+=4)n.push(i());return new p.init(n,t)}}),a=n.enc={},c=a.Hex={stringify:function(t){for(var n=t.words,e=t.sigBytes,i=[],r=0;r<e;r++){var o=n[r>>>2]>>>24-r%4*8&255;i.push((o>>>4).toString(16)),i.push((15&o).toString(16))}return i.join("")},parse:function(t){for(var n=t.length,e=[],i=0;i<n;i+=2)e[i>>>3]|=parseInt(t.substr(i,2),16)<<24-i%8*4;return new p.init(e,n/2)}},u=a.Latin1={stringify:function(t){for(var n=t.words,e=t.sigBytes,i=[],r=0;r<e;r++){var o=n[r>>>2]>>>24-r%4*8&255;i.push(String.fromCharCode(o))}return i.join("")},parse:function(t){for(var n=t.length,e=[],i=0;i<n;i++)e[i>>>2]|=(255&t.charCodeAt(i))<<24-i%4*8;return new p.init(e,n)}},d=a.Utf8={stringify:function(t){try{return decodeURIComponent(escape(u.stringify(t)))}catch(t){throw new Error("Malformed UTF-8 data")}},parse:function(t){return u.parse(unescape(encodeURIComponent(t)))}},h=o.BufferedBlockAlgorithm=s.extend({reset:function(){this._data=new p.init,this._nDataBytes=0},_append:function(t){"string"==typeof t&&(t=d.parse(t)),this._data.concat(t),this._nDataBytes+=t.sigBytes},_process:function(t){var n,e=this._data,i=e.words,r=e.sigBytes,o=this.blockSize,s=r/(4*o),a=(s=t?f.ceil(s):f.max((0|s)-this._minBufferSize,0))*o,c=f.min(4*a,r);if(a){for(var u=0;u<a;u+=o)this._doProcessBlock(i,u);n=i.splice(0,a),e.sigBytes-=c}return new p.init(n,c)},clone:function(){var t=s.clone.call(this);return t._data=this._data.clone(),t},_minBufferSize:0}),l=(o.Hasher=h.extend({cfg:s.extend(),init:function(t){this.cfg=this.cfg.extend(t),this.reset()},reset:function(){h.reset.call(this),this._doReset()},update:function(t){return this._append(t),this._process(),this},finalize:function(t){return t&&this._append(t),this._doFinalize()},blockSize:16,_createHelper:function(e){return function(t,n){return new e.init(n).finalize(t)}},_createHmacHelper:function(e){return function(t,n){return new l.HMAC.init(e,n).finalize(t)}}}),n.algo={});return n}(Math);return t}); | |||
| @ -0,0 +1 @@ | |||
| !function(r,e){"object"==typeof exports?module.exports=exports=e(require("./core")):"function"==typeof define&&define.amd?define(["./core"],e):e(r.CryptoJS)}(this,function(r){var s;return s=r.lib.WordArray,r.enc.Base64={stringify:function(r){var e=r.words,t=r.sigBytes,a=this._map;r.clamp();for(var n=[],o=0;o<t;o+=3)for(var i=(e[o>>>2]>>>24-o%4*8&255)<<16|(e[o+1>>>2]>>>24-(o+1)%4*8&255)<<8|e[o+2>>>2]>>>24-(o+2)%4*8&255,f=0;f<4&&o+.75*f<t;f++)n.push(a.charAt(i>>>6*(3-f)&63));var c=a.charAt(64);if(c)for(;n.length%4;)n.push(c);return n.join("")},parse:function(r){var e=r.length,t=this._map,a=this._reverseMap;if(!a){a=this._reverseMap=[];for(var n=0;n<t.length;n++)a[t.charCodeAt(n)]=n}var o=t.charAt(64);if(o){var i=r.indexOf(o);-1!==i&&(e=i)}return function(r,e,t){for(var a=[],n=0,o=0;o<e;o++)if(o%4){var i=t[r.charCodeAt(o-1)]<<o%4*2,f=t[r.charCodeAt(o)]>>>6-o%4*2,c=i|f;a[n>>>2]|=c<<24-n%4*8,n++}return s.create(a,n)}(r,e,a)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="},r.enc.Base64}); | |||
| @ -0,0 +1 @@ | |||
| !function(e,o){"object"==typeof exports?module.exports=exports=o(require("./core")):"function"==typeof define&&define.amd?define(["./core"],o):o(e.CryptoJS)}(this,function(e){return e.enc.Hex}); | |||
| @ -0,0 +1 @@ | |||
| !function(e,o){"object"==typeof exports?module.exports=exports=o(require("./core")):"function"==typeof define&&define.amd?define(["./core"],o):o(e.CryptoJS)}(this,function(e){return e.enc.Utf8}); | |||
| @ -0,0 +1 @@ | |||
| !function(e,t){"object"==typeof exports?module.exports=exports=t(require("./core"),require("./sha1"),require("./hmac")):"function"==typeof define&&define.amd?define(["./core","./sha1","./hmac"],t):t(e.CryptoJS)}(this,function(e){var t,r,i,u,n,o,a;return r=(t=e).lib,i=r.Base,u=r.WordArray,n=t.algo,o=n.MD5,a=n.EvpKDF=i.extend({cfg:i.extend({keySize:4,hasher:o,iterations:1}),init:function(e){this.cfg=this.cfg.extend(e)},compute:function(e,t){for(var r,i=this.cfg,n=i.hasher.create(),o=u.create(),a=o.words,c=i.keySize,f=i.iterations;a.length<c;){r&&n.update(r),r=n.update(e).finalize(t),n.reset();for(var s=1;s<f;s++)r=n.finalize(r),n.reset();o.concat(r)}return o.sigBytes=4*c,o}}),t.EvpKDF=function(e,t,r){return a.create(r).compute(e,t)},e.EvpKDF}); | |||
| @ -0,0 +1 @@ | |||
| !function(r,e){"object"==typeof exports?module.exports=exports=e(require("./core")):"function"==typeof define&&define.amd?define(["./core"],e):e(r.CryptoJS)}(this,function(i){return function(h){var r=i,e=r.lib,t=e.WordArray,n=e.Hasher,o=r.algo,b=[];!function(){for(var r=0;r<64;r++)b[r]=4294967296*h.abs(h.sin(r+1))|0}();var a=o.MD5=n.extend({_doReset:function(){this._hash=new t.init([1732584193,4023233417,2562383102,271733878])},_doProcessBlock:function(r,e){for(var t=0;t<16;t++){var n=e+t,o=r[n];r[n]=16711935&(o<<8|o>>>24)|4278255360&(o<<24|o>>>8)}var a=this._hash.words,i=r[e+0],s=r[e+1],c=r[e+2],f=r[e+3],h=r[e+4],u=r[e+5],v=r[e+6],d=r[e+7],l=r[e+8],_=r[e+9],p=r[e+10],y=r[e+11],D=r[e+12],H=r[e+13],M=r[e+14],g=r[e+15],m=a[0],w=a[1],x=a[2],B=a[3];m=j(m,w,x,B,i,7,b[0]),B=j(B,m,w,x,s,12,b[1]),x=j(x,B,m,w,c,17,b[2]),w=j(w,x,B,m,f,22,b[3]),m=j(m,w,x,B,h,7,b[4]),B=j(B,m,w,x,u,12,b[5]),x=j(x,B,m,w,v,17,b[6]),w=j(w,x,B,m,d,22,b[7]),m=j(m,w,x,B,l,7,b[8]),B=j(B,m,w,x,_,12,b[9]),x=j(x,B,m,w,p,17,b[10]),w=j(w,x,B,m,y,22,b[11]),m=j(m,w,x,B,D,7,b[12]),B=j(B,m,w,x,H,12,b[13]),x=j(x,B,m,w,M,17,b[14]),m=k(m,w=j(w,x,B,m,g,22,b[15]),x,B,s,5,b[16]),B=k(B,m,w,x,v,9,b[17]),x=k(x,B,m,w,y,14,b[18]),w=k(w,x,B,m,i,20,b[19]),m=k(m,w,x,B,u,5,b[20]),B=k(B,m,w,x,p,9,b[21]),x=k(x,B,m,w,g,14,b[22]),w=k(w,x,B,m,h,20,b[23]),m=k(m,w,x,B,_,5,b[24]),B=k(B,m,w,x,M,9,b[25]),x=k(x,B,m,w,f,14,b[26]),w=k(w,x,B,m,l,20,b[27]),m=k(m,w,x,B,H,5,b[28]),B=k(B,m,w,x,c,9,b[29]),x=k(x,B,m,w,d,14,b[30]),m=q(m,w=k(w,x,B,m,D,20,b[31]),x,B,u,4,b[32]),B=q(B,m,w,x,l,11,b[33]),x=q(x,B,m,w,y,16,b[34]),w=q(w,x,B,m,M,23,b[35]),m=q(m,w,x,B,s,4,b[36]),B=q(B,m,w,x,h,11,b[37]),x=q(x,B,m,w,d,16,b[38]),w=q(w,x,B,m,p,23,b[39]),m=q(m,w,x,B,H,4,b[40]),B=q(B,m,w,x,i,11,b[41]),x=q(x,B,m,w,f,16,b[42]),w=q(w,x,B,m,v,23,b[43]),m=q(m,w,x,B,_,4,b[44]),B=q(B,m,w,x,D,11,b[45]),x=q(x,B,m,w,g,16,b[46]),m=z(m,w=q(w,x,B,m,c,23,b[47]),x,B,i,6,b[48]),B=z(B,m,w,x,d,10,b[49]),x=z(x,B,m,w,M,15,b[50]),w=z(w,x,B,m,u,21,b[51]),m=z(m,w,x,B,D,6,b[52]),B=z(B,m,w,x,f,10,b[53]),x=z(x,B,m,w,p,15,b[54]),w=z(w,x,B,m,s,21,b[55]),m=z(m,w,x,B,l,6,b[56]),B=z(B,m,w,x,g,10,b[57]),x=z(x,B,m,w,v,15,b[58]),w=z(w,x,B,m,H,21,b[59]),m=z(m,w,x,B,h,6,b[60]),B=z(B,m,w,x,y,10,b[61]),x=z(x,B,m,w,c,15,b[62]),w=z(w,x,B,m,_,21,b[63]),a[0]=a[0]+m|0,a[1]=a[1]+w|0,a[2]=a[2]+x|0,a[3]=a[3]+B|0},_doFinalize:function(){var r=this._data,e=r.words,t=8*this._nDataBytes,n=8*r.sigBytes;e[n>>>5]|=128<<24-n%32;var o=h.floor(t/4294967296),a=t;e[15+(64+n>>>9<<4)]=16711935&(o<<8|o>>>24)|4278255360&(o<<24|o>>>8),e[14+(64+n>>>9<<4)]=16711935&(a<<8|a>>>24)|4278255360&(a<<24|a>>>8),r.sigBytes=4*(e.length+1),this._process();for(var i=this._hash,s=i.words,c=0;c<4;c++){var f=s[c];s[c]=16711935&(f<<8|f>>>24)|4278255360&(f<<24|f>>>8)}return i},clone:function(){var r=n.clone.call(this);return r._hash=this._hash.clone(),r}});function j(r,e,t,n,o,a,i){var s=r+(e&t|~e&n)+o+i;return(s<<a|s>>>32-a)+e}function k(r,e,t,n,o,a,i){var s=r+(e&n|t&~n)+o+i;return(s<<a|s>>>32-a)+e}function q(r,e,t,n,o,a,i){var s=r+(e^t^n)+o+i;return(s<<a|s>>>32-a)+e}function z(r,e,t,n,o,a,i){var s=r+(t^(e|~n))+o+i;return(s<<a|s>>>32-a)+e}r.MD5=n._createHelper(a),r.HmacMD5=n._createHmacHelper(a)}(Math),i.MD5}); | |||
| @ -0,0 +1 @@ | |||
| !function(e,o){"object"==typeof exports?module.exports=exports=o(require("./core"),require("./cipher-core")):"function"==typeof define&&define.amd?define(["./core","./cipher-core"],o):o(e.CryptoJS)}(this,function(e){var o;return e.mode.ECB=((o=e.lib.BlockCipherMode.extend()).Encryptor=o.extend({processBlock:function(e,o){this._cipher.encryptBlock(e,o)}}),o.Decryptor=o.extend({processBlock:function(e,o){this._cipher.decryptBlock(e,o)}}),o),e.mode.ECB}); | |||
| @ -0,0 +1 @@ | |||
| !function(e,r){"object"==typeof exports?module.exports=exports=r(require("./core"),require("./cipher-core")):"function"==typeof define&&define.amd?define(["./core","./cipher-core"],r):r(e.CryptoJS)}(this,function(e){return e.pad.Pkcs7}); | |||
| @ -0,0 +1,40 @@ | |||
| (function (doc, win) { | |||
|     var docEl = doc.documentElement, | |||
|         isIOS = navigator.userAgent.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), | |||
|         dpr = isIOS ? Math.min(win.devicePixelRatio, 3) : 1, | |||
|         dpr = window.top === window.self ? dpr : 1, //被iframe引用时,禁止缩放
 | |||
|         dpr = 1, | |||
|         scale = 1 / dpr, | |||
|         resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize'; | |||
|     docEl.dataset.dpr = dpr; | |||
|     var metaEl = doc.createElement('meta'); | |||
|     metaEl.name = 'viewport'; | |||
|     metaEl.content = 'initial-scale=' + scale + ',maximum-scale=' + scale + ', minimum-scale=' + scale; | |||
|     docEl.firstElementChild.appendChild(metaEl); | |||
|     var recalc = function () { | |||
|         var width = docEl.clientWidth; | |||
|         if (width / dpr > 750) { | |||
|             width = 750 * dpr; | |||
|         } | |||
|         // 乘以100,px : rem = 100 : 1
 | |||
|         docEl.style.fontSize = 100 * (width / 750) + 'px'; | |||
|     }; | |||
|     recalc() | |||
|     if (!doc.addEventListener) return; | |||
|     win.addEventListener(resizeEvt, recalc, false); | |||
| })(document, window); | |||
| 
 | |||
| 
 | |||
| 
 | |||
| const  isIPhoneX = () =>  { | |||
|    let u = navigator.userAgent; | |||
|    let isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); | |||
|    if (isIOS) { | |||
| 	   if (screen.height == 812 && screen.width == 375) { | |||
| 		   return true; | |||
| 	   } | |||
| 	   else { | |||
| 		   return false; | |||
| 	   } | |||
|    } | |||
| } | |||
						
							
						
						
							14
	
						
						library-activity/public/js/swiper6.min.js
						
							File diff suppressed because it is too large
							
							
								
									View File
								
							
						
					
				| @ -0,0 +1,39 @@ | |||
| <template> | |||
|   <router-view> </router-view> | |||
| </template> | |||
| 
 | |||
| <style> | |||
| html, | |||
| body { | |||
|   width: 100%; | |||
|   height: 100%; | |||
|   box-sizing: border-box; | |||
|   padding: 0px; | |||
|   margin: 0px; | |||
| } | |||
| #app { | |||
|   font-family: 'Avenir', Helvetica, Arial, sans-serif; | |||
|   -webkit-font-smoothing: antialiased; | |||
|   -moz-osx-font-smoothing: grayscale; | |||
|   widows: 100%; | |||
|   height: 100%; | |||
| } | |||
| /*���������?��������?���ֱ��Ӧ�����������ij�?*/ | |||
| div::-webkit-scrollbar { | |||
|   width: 10px; | |||
|   height: 10px; | |||
|   background-color: #f5f5f5; | |||
| } | |||
| /*����������������Ӱ+Բ?*/ | |||
| div::-webkit-scrollbar-track { | |||
|   -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3); | |||
|   border-radius: 10px; | |||
|   background-color: #f5f5f5; | |||
| } | |||
| /*���廬������Ӱ+Բ?*/ | |||
| div::-webkit-scrollbar-thumb { | |||
|   border-radius: 10px; | |||
|   -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3); | |||
|   background-color: #aaa; | |||
| } | |||
| </style> | |||
| @ -0,0 +1,191 @@ | |||
| body, | |||
| h1, | |||
| h2, | |||
| h3, | |||
| h4, | |||
| h5, | |||
| h6, | |||
| hr, | |||
| p, | |||
| blockquote, | |||
| dl, | |||
| dt, | |||
| dd, | |||
| ul, | |||
| ol, | |||
| li, | |||
| pre, | |||
| form, | |||
| fieldset, | |||
| legend, | |||
| button, | |||
| input, | |||
| textarea, | |||
| th, | |||
| td { | |||
| 	outline: none; | |||
| 	border: none; | |||
| 	padding: 0; | |||
| 	margin: 0; | |||
| 	text-decoration: inherit | |||
| } | |||
| 
 | |||
| body, | |||
| button, | |||
| input, | |||
| select, | |||
| textarea { | |||
| 	font: 12PX/1.5 tahoma, arial, 'microsoft yahei', sans-serif | |||
| } | |||
| 
 | |||
| h1, | |||
| h2, | |||
| h3, | |||
| h4, | |||
| h5, | |||
| h6 { | |||
| 	font-size: 100%; | |||
| } | |||
| 
 | |||
| address, | |||
| cite, | |||
| dfn, | |||
| em, | |||
| var { | |||
| 	font-style: normal; | |||
| } | |||
| 
 | |||
| code, | |||
| kbd, | |||
| pre, | |||
| samp { | |||
| 	font-family: couriernew, courier, monospace; | |||
| } | |||
| 
 | |||
| small { | |||
| 	font-size: 12PX; | |||
| } | |||
| 
 | |||
| ul, | |||
| ol { | |||
| 	list-style: none; | |||
| } | |||
| 
 | |||
| a { | |||
| 	text-decoration: none; | |||
| } | |||
| 
 | |||
| a:hover { | |||
| 	text-decoration: underline; | |||
| } | |||
| 
 | |||
| sup { | |||
| 	vertical-align: text-top; | |||
| } | |||
| 
 | |||
| sub { | |||
| 	vertical-align: text-bottom; | |||
| } | |||
| 
 | |||
| legend { | |||
| 	color: #000; | |||
| } | |||
| 
 | |||
| fieldset, | |||
| img { | |||
| 	border: 0; | |||
| } | |||
| 
 | |||
| button, | |||
| input, | |||
| select, | |||
| textarea { | |||
| 	font-size: 100%; | |||
| } | |||
| 
 | |||
| table { | |||
| 	border-collapse: collapse; | |||
| 	border-spacing: 0; | |||
| } | |||
| 
 | |||
| @font-face { | |||
|   font-family: 'iconfont';  /* Project id 1835591 */ | |||
|   src: url('//at.alicdn.com/t/font_1835591_9gvgo3dg47s.woff2?t=1639703777755') format('woff2'), | |||
|        url('//at.alicdn.com/t/font_1835591_9gvgo3dg47s.woff?t=1639703777755') format('woff'), | |||
|        url('//at.alicdn.com/t/font_1835591_9gvgo3dg47s.ttf?t=1639703777755') format('truetype'); | |||
| } | |||
|   .fixedtop{ | |||
|     width: 100%; | |||
|     position: fixed; | |||
|     top: 0; | |||
|     left: 0; | |||
|     display: flex; | |||
|     flex-direction: column; | |||
|     justify-content: center; | |||
|     align-items: center; | |||
|     z-index: 999; | |||
|   } | |||
|   .iconfont { | |||
|     font-family: "iconfont" !important; | |||
|     font-size: 16px; | |||
|     font-style: normal; | |||
|     -webkit-font-smoothing: antialiased; | |||
|     -moz-osx-font-smoothing: grayscale; | |||
|   } | |||
|   .flexRow{ | |||
|     display: -webkit-box; | |||
|     display: -webkit-flex; | |||
|     display: flex; | |||
|     -webkit-box-align: center; | |||
|     -webkit-align-items: center; | |||
|     align-items: center; | |||
|     -webkit-box-pack: center; | |||
|     -webkit-justify-content: center; | |||
|     justify-content: center; | |||
|   } | |||
|   .swiper-pagination-bullet-active{ | |||
|     background: rgb(255, 255, 255) !important; | |||
|     opacity:1; | |||
|   } | |||
|   .swiper-container-horizontal>.swiper-pagination-bullets .swiper-pagination-bullet{ | |||
|       background:rgb(186, 192, 223); | |||
|     opacity: 1 !important; | |||
|   } | |||
| .swiper-slide{ | |||
|   transform: translate3d(0, 0, 0); | |||
| } | |||
| 
 | |||
| img{ | |||
|   object-fit: cover; | |||
| } | |||
| 
 | |||
| body{ | |||
|   overflow-x: hidden; | |||
|   background-color: #F4F4FC; | |||
| } | |||
| 
 | |||
| .main { | |||
| 	width: 100%; | |||
| 	overflow-x: hidden; | |||
| 	/* padding-bottom: 1rem; */ | |||
|   background-color: #F4F4FC; | |||
| 	display: flex; | |||
| 	flex-direction: column; | |||
| } | |||
| 
 | |||
| .overflow-txt-only{ | |||
|   word-break: break-all; | |||
|   display: -webkit-box; | |||
|   -webkit-box-orient: vertical; | |||
|   -webkit-line-clamp: 1; | |||
|   overflow: hidden; | |||
|   text-overflow: ellipsis; | |||
| } | |||
| .overflow-txt{ | |||
|   word-break: break-all; | |||
|   display: -webkit-box; | |||
|   -webkit-box-orient: vertical; | |||
|   -webkit-line-clamp: 2; | |||
|   overflow: hidden; | |||
|   text-overflow: ellipsis; | |||
| } | |||
						
							
						
						
							13
	
						
						library-activity/src/assets/css/swiper6.min.css
						
							File diff suppressed because it is too large
							
							
								
									View File
								
							
						
					
				| After Width: 48 | Height: 48 | Size: 740 B | 
| After Width: 48 | Height: 48 | Size: 945 B | 
| After Width: 16 | Height: 16 | Size: 290 B | 
| After Width: 40 | Height: 40 | Size: 386 B | 
| After Width: 686 | Height: 284 | Size: 86 KiB | 
| After Width: 183 | Height: 60 | Size: 7.4 KiB | 
| After Width: 183 | Height: 60 | Size: 4.8 KiB | 
| After Width: 151 | Height: 60 | Size: 2.7 KiB | 
| After Width: 48 | Height: 48 | Size: 1.3 KiB | 
| After Width: 48 | Height: 48 | Size: 1.3 KiB | 
| After Width: 48 | Height: 48 | Size: 975 B | 
| After Width: 48 | Height: 48 | Size: 1.8 KiB | 
| After Width: 60 | Height: 60 | Size: 2.4 KiB | 
| After Width: 24 | Height: 24 | Size: 806 B | 
| After Width: 32 | Height: 32 | Size: 969 B | 
| After Width: 36 | Height: 36 | Size: 1.1 KiB | 
| After Width: 56 | Height: 56 | Size: 1.0 KiB | 
| After Width: 48 | Height: 48 | Size: 1.2 KiB | 
| After Width: 48 | Height: 48 | Size: 1.2 KiB | 
| After Width: 750 | Height: 320 | Size: 28 KiB | 
| After Width: 399 | Height: 255 | Size: 33 KiB | 
| After Width: 56 | Height: 56 | Size: 1.0 KiB | 
| After Width: 37 | Height: 37 | Size: 1.3 KiB | 
| After Width: 26 | Height: 26 | Size: 703 B | 
| After Width: 251 | Height: 251 | Size: 15 KiB | 
| After Width: 52 | Height: 52 | Size: 1.4 KiB | 
| After Width: 52 | Height: 52 | Size: 1.6 KiB | 
| After Width: 15 | Height: 15 | Size: 525 B | 
| After Width: 15 | Height: 15 | Size: 529 B | 
						
							
						
						
							2
	
						
						library-activity/src/assets/js/axios.js
						
							File diff suppressed because it is too large
							
							
								
									View File
								
							
						
					
				| @ -0,0 +1,40 @@ | |||
| (function (doc, win) { | |||
|     var docEl = doc.documentElement, | |||
|         isIOS = navigator.userAgent.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), | |||
|         dpr = isIOS ? Math.min(win.devicePixelRatio, 3) : 1, | |||
|         dpr = window.top === window.self ? dpr : 1, //被iframe引用时,禁止缩放
 | |||
|         dpr = 1, | |||
|         scale = 1 / dpr, | |||
|         resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize'; | |||
|     docEl.dataset.dpr = dpr; | |||
|     var metaEl = doc.createElement('meta'); | |||
|     metaEl.name = 'viewport'; | |||
|     metaEl.content = 'initial-scale=' + scale + ',maximum-scale=' + scale + ', minimum-scale=' + scale; | |||
|     docEl.firstElementChild.appendChild(metaEl); | |||
|     var recalc = function () { | |||
|         var width = docEl.clientWidth; | |||
|         if (width / dpr > 750) { | |||
|             width = 750 * dpr; | |||
|         } | |||
|         // 乘以100,px : rem = 100 : 1
 | |||
|         docEl.style.fontSize = 100 * (width / 750) + 'px'; | |||
|     }; | |||
|     recalc() | |||
|     if (!doc.addEventListener) return; | |||
|     win.addEventListener(resizeEvt, recalc, false); | |||
| })(document, window); | |||
| 
 | |||
| 
 | |||
| 
 | |||
| const  isIPhoneX = () =>  { | |||
|    let u = navigator.userAgent; | |||
|    let isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); | |||
|    if (isIOS) { | |||
| 	   if (screen.height == 812 && screen.width == 375) { | |||
| 		   return true; | |||
| 	   } | |||
| 	   else { | |||
| 		   return false; | |||
| 	   } | |||
|    } | |||
| } | |||
						
							
						
						
							14
	
						
						library-activity/src/assets/js/swiper6.min.js
						
							File diff suppressed because it is too large
							
							
								
									View File
								
							
						
					
				| After Width: 40 | Height: 40 | Size: 1.1 KiB | 
| @ -0,0 +1,155 @@ | |||
| // created by gpake
 | |||
| export function qiniuUploader() { | |||
| 
 | |||
| var config = { | |||
|     qiniuRegion: '', | |||
|     qiniuImageURLPrefix: '', | |||
|     qiniuUploadToken: '', | |||
|     qiniuUploadTokenURL: '', | |||
|     qiniuUploadTokenFunction: null, | |||
|     qiniuShouldUseQiniuFileName: false | |||
| } | |||
| 
 | |||
| // module.exports = {
 | |||
| //     init: init,
 | |||
| //     upload: upload,
 | |||
| // }
 | |||
| 
 | |||
| // 在整个程序生命周期中,只需要 init 一次即可
 | |||
| // 如果需要变更参数,再调用 init 即可
 | |||
| function init(options) { | |||
|     config = { | |||
|         qiniuRegion: '', | |||
|         qiniuImageURLPrefix: '', | |||
|         qiniuUploadToken: '', | |||
|         qiniuUploadTokenURL: '', | |||
|         qiniuUploadTokenFunction: null, | |||
|         qiniuShouldUseQiniuFileName: false | |||
|     }; | |||
|     updateConfigWithOptions(options); | |||
| } | |||
| 
 | |||
| function updateConfigWithOptions(options) { | |||
|     if (options.region) { | |||
|         config.qiniuRegion = options.region; | |||
|     } else { | |||
|         console.error('qiniu uploader need your bucket region'); | |||
|     } | |||
|     if (options.uptoken) { | |||
|         config.qiniuUploadToken = options.uptoken; | |||
|     } else if (options.uptokenURL) { | |||
|         config.qiniuUploadTokenURL = options.uptokenURL; | |||
|     } else if(options.uptokenFunc) { | |||
|         config.qiniuUploadTokenFunction = options.uptokenFunc; | |||
|     } | |||
|     if (options.domain) { | |||
|         config.qiniuImageURLPrefix = options.domain; | |||
|     } | |||
|     config.qiniuShouldUseQiniuFileName = options.shouldUseQiniuFileName | |||
| } | |||
| 
 | |||
| function upload(file, success, fail, options) { | |||
|     if (null == file) { | |||
|         console.error('qiniu uploader need file to upload'); | |||
|         return; | |||
|     } | |||
|     if (options) { | |||
|       updateConfigWithOptions(options); | |||
|     } | |||
|     if (config.qiniuUploadToken) { | |||
|         doUpload(file, success, fail, options); | |||
|     } else if (config.qiniuUploadTokenURL) { | |||
|         getQiniuToken(function() { | |||
|             doUpload(file, success, fail, options); | |||
|         }); | |||
|     } else if (config.qiniuUploadTokenFunction) { | |||
|         config.qiniuUploadToken = config.qiniuUploadTokenFunction(); | |||
|         if (null == config.qiniuUploadToken && config.qiniuUploadToken.length > 0) { | |||
|             console.error('qiniu UploadTokenFunction result is null, please check the return value'); | |||
|             return | |||
|         } | |||
|         doUpload(file, success, fail, options); | |||
|     } else { | |||
|         console.error('qiniu uploader need one of [uptoken, uptokenURL, uptokenFunc]'); | |||
|         return; | |||
|     } | |||
| } | |||
| 
 | |||
| function doUpload(file, success, fail, options) { | |||
|     if (null == config.qiniuUploadToken && config.qiniuUploadToken.length > 0) { | |||
|         console.error('qiniu UploadToken is null, please check the init config or networking'); | |||
|         return | |||
|     } | |||
|     var url = uploadURLFromRegionCode(config.qiniuRegion); | |||
|     var formData = { | |||
|         'token': config.qiniuUploadToken | |||
|     }; | |||
|     if (!config.qiniuShouldUseQiniuFileName) { | |||
|        formData['key'] = options.key || file.name | |||
|     } | |||
| 	let dataObject = { | |||
| 		fileUrl: '' | |||
| 	} | |||
| 	let param = new FormData()                    // 创建form对象
 | |||
| 	param.append('key', formData.key)             // 通过append向form对象添加数据
 | |||
| 	param.append('token', formData.token)         // 通过append向form对象添加数据
 | |||
| 	param.append('file', file, file.name)         // 通过append向form对象添加数据
 | |||
| 	// 上传请求
 | |||
| 	axios.post(url, param, config) | |||
| 	   .then(res => { | |||
| 		if (res.data) { | |||
| 			dataObject = res.data; | |||
| 			if (res.data.key) { | |||
| 			   dataObject.fileUrl = location.protocol +'//' + config.qiniuImageURLPrefix + '/' + res.data.key | |||
| 			} | |||
| 			success(dataObject); | |||
| 		}  else { | |||
| 			fail(res.statusText) | |||
| 		}  | |||
| 	}) | |||
| 	.catch(res => { | |||
| 		fail(res) | |||
| 	}) | |||
| } | |||
| 
 | |||
| function getQiniuToken(callback) { | |||
|     axios.get(config.qiniuUploadTokenURL,{ | |||
|   		params: {} | |||
|      }) | |||
|      .then(res => { | |||
|   	    var token = res.data.uptoken; | |||
|   	    if (token && token.length > 0) { | |||
| 			config.qiniuUploadToken = token; | |||
| 			if (callback) { | |||
| 			    callback(); | |||
| 			} | |||
|   	    } else { | |||
|   	        console.error('qiniuUploader cannot get your token, please check the uptokenURL or server') | |||
|   	    } | |||
|      }) | |||
|   	.catch(res => { | |||
|   		console.log(res) | |||
|   	}) | |||
| } | |||
| 
 | |||
| function uploadURLFromRegionCode(code) { | |||
|     var uploadURL = null; | |||
|     switch(code) { | |||
|         case 'ECN': uploadURL =  location.protocol + '//upload.qiniup.com'; break; | |||
|         case 'NCN': uploadURL =  location.protocol + '//up-z1.qiniup.com'; break; | |||
|         case 'SCN': uploadURL =  location.protocol + '//up-z2.qiniup.com'; break; | |||
|         case 'NA': uploadURL =   location.protocol + '//up-na0.qiniup.com'; break; | |||
|         case 'ASG': uploadURL =  location.protocol + '//up-as0.qiniup.com'; break; | |||
|         default: console.error('please make the region is with one of [ECN, SCN, NCN, NA, ASG]'); | |||
|     } | |||
|     return uploadURL; | |||
| } | |||
| 
 | |||
|   return { | |||
|     config, | |||
|     init, | |||
|     upload, | |||
|   } | |||
| 
 | |||
| } | |||
| 
 | |||
| @ -0,0 +1,47 @@ | |||
| import { reactive,ref,computed,onMounted,getCurrentInstance,watch } from 'vue'; | |||
| 
 | |||
| export function selectLbrary() { | |||
| 	const { proxy } = getCurrentInstance(); | |||
| 	//let lbraryArray = ref(["武汉图书馆", "国家图书馆", "汤湖图书馆", "科技精英图书馆"]);
 | |||
| 	let lbraryArrayData = reactive({ | |||
| 		lbraryArray:["武汉图书馆", "国家图书馆", "汤湖图书馆", "科技精英图书馆"], | |||
| 		iftshow: false, | |||
| 		toastmassage:'' | |||
| 	}) | |||
| 	//获取图书馆列表
 | |||
| 	let GetArrayList = () => { | |||
| 		const that = proxy; | |||
| 		that.$http.get(that.$API.GETLIBRARYINFO,{ | |||
| 				params: {} | |||
| 		   }) | |||
| 		   .then(res => { | |||
| 				lbraryArrayData.lbraryArray = [ | |||
| 				   { | |||
| 					   text:'请选择图书馆', | |||
| 					   id:0 | |||
| 				   }	 | |||
| 				] | |||
| 				if (res.type == 200) { | |||
| 				   for(let i = 0; i < res.data.length; i++){ | |||
| 					   let obj = { | |||
| 							text:'', | |||
| 							id:'' | |||
| 					   } | |||
| 					   obj.text = res.data[i].name; | |||
| 					   obj.id = res.data[i].id; | |||
| 					   lbraryArrayData.lbraryArray.push(obj) | |||
| 				   } | |||
| 				} else { | |||
| 				   lbraryArrayData.iftshow++, | |||
| 				   lbraryArrayData.toastmassage= res.content; | |||
| 				} | |||
| 		  }) | |||
| 		.catch(res => { | |||
| 			console.log(res) | |||
| 		})  | |||
| 	} | |||
| 	GetArrayList(); | |||
| 	return { | |||
| 		lbraryArrayData | |||
| 	} | |||
| }		 | |||
| @ -0,0 +1,13 @@ | |||
| import { computed } from 'vue' | |||
| import { useStore } from 'vuex' | |||
| import { useRoute } from 'vue-router' | |||
| 
 | |||
| export const toHost = (url) => { | |||
|   return computed(() => { | |||
|     const host = url.replace(/^https?:\/\//, '').replace(/\/.*$/, '') | |||
|     const parts = host.split('.').slice(-3) | |||
|     if (parts[0] === 'www') parts.shift() | |||
| 
 | |||
|     return parts.join('.') | |||
|   }) | |||
| } | |||
| @ -0,0 +1,62 @@ | |||
| <template> | |||
| 	<div class="tishi-di" v-if="data.ifs"> | |||
| 		<div class="tishi"> | |||
| 			{{toastmassage}} | |||
| 		</div> | |||
| 	</div> | |||
| </template> | |||
| 
 | |||
| <script> | |||
| 	import { reactive,computed,onMounted,watch  } from 'vue'; | |||
| 	export default { | |||
| 		props: { | |||
| 		  toastmassage: { | |||
| 		    type: String, | |||
| 		    default: '' | |||
| 		  }, | |||
| 		  iftshow: { | |||
| 		    type: Number, | |||
| 		    default: 0 | |||
| 		  } | |||
| 		}, | |||
| 		setup(props){ | |||
| 			const data = reactive({ | |||
| 				timer:null, | |||
| 				ifs:false | |||
| 			}) | |||
| 			watch(() => props.iftshow, (oldVlaue, newValue) => { | |||
| 				data.ifs = true; | |||
| 			}) | |||
| 			watch(() => data.ifs, (oldVlaue, newValue) => { | |||
| 				let that = data; | |||
| 				clearTimeout(that.timer);  | |||
| 				that.timer = null; | |||
| 				that.timer=setTimeout(function(){ | |||
| 				  	that.ifs = false; | |||
| 				},1500) | |||
| 			}) | |||
| 			return { | |||
| 				data | |||
| 			} | |||
| 		} | |||
| 	} | |||
| </script> | |||
| 
 | |||
| <style> | |||
| .tishi-di{ | |||
| 	width: 100%; | |||
| 	position: fixed; | |||
| 	bottom: 16%; | |||
| 	left: 0; | |||
| 	display: flex; | |||
| 	justify-content: center; | |||
| 	align-items: center; | |||
| } | |||
| .tishi{ | |||
| 	padding: 0.18rem 0.40rem; | |||
| 	background-color: rgb(226,226,226,0.9); | |||
| 	font-size: 0.28rem; | |||
| 	color: #222222; | |||
| 	border-radius: 0.04rem; | |||
| } | |||
| </style> | |||
| @ -0,0 +1,116 @@ | |||
| <template> | |||
| 	<div class="tab-bar-main"> | |||
| 		<div :class="['bar-item',tabCur === 0 ? 'active':'' ]" @click="toActive"> | |||
| 			<i></i> | |||
| 			<span>活动</span> | |||
| 		</div> | |||
| 		<div :class="['bar-item',tabCur === 1 ? 'active':'' ]" @click="toCart"> | |||
| 			<i></i> | |||
| 			<span>书车</span> | |||
| 		</div> | |||
| 		<div :class="['bar-item',tabCur === 2 ? 'active':'' ]" @click="toMine"> | |||
| 			<i></i> | |||
| 			<span>我的</span> | |||
| 		</div> | |||
| 	</div> | |||
| </template> | |||
| <script> | |||
| import { reactive, computed, onMounted, getCurrentInstance } from 'vue' | |||
| export default { | |||
| 	name: 'tabBar', | |||
|   props: { | |||
|     tabCur: { | |||
|       type: Number, | |||
|       default() { | |||
|         return 0; | |||
|       }, | |||
|     } | |||
|   }, | |||
| 	setup() { | |||
| 		const { proxy } = getCurrentInstance() | |||
|     let data = reactive({ | |||
| 
 | |||
|     }) | |||
| 		let toActive = () => { | |||
| 			proxy.$router.push({ path: '/' }) | |||
| 		} | |||
| 		let toCart = () => { | |||
| 			proxy.$router.push({ path: '/Cart' }) | |||
| 		} | |||
| 		let toMine = () => { | |||
| 			proxy.$router.push({ path: '/Mine' }) | |||
| 		} | |||
| 		return { | |||
|       data, | |||
| 			toActive, | |||
| 			toCart, | |||
| 			toMine, | |||
| 		} | |||
| 	}, | |||
| } | |||
| </script> | |||
| <style scoped lang="scss"> | |||
| .tab-bar-main { | |||
| 	position: fixed; | |||
| 	bottom: 0; | |||
| 	left: 0; | |||
| 	display: flex; | |||
| 	justify-content: space-between; | |||
| 	align-items: center; | |||
| 	text-align: center; | |||
| 	width: 100%; | |||
| 	height: 1.225rem; | |||
| 	background-color: #fff; | |||
| 
 | |||
| 	.bar-item { | |||
| 		flex: 1; | |||
| 		font-size: 0.275rem; | |||
| 		color: #BEC7DC; | |||
| 		i { | |||
| 			display: block; | |||
| 			width: 0.6rem; | |||
| 			height: 0.6rem; | |||
| 			margin: 0 auto; | |||
| 		} | |||
| 		&:first-child { | |||
| 			i { | |||
| 				background: url('@assets/images/active.png') no-repeat; | |||
| 				background-size: cover; | |||
| 			} | |||
| 		} | |||
| 		&:nth-child(2) { | |||
| 			i { | |||
| 				background: url('@assets/images/cart.png') no-repeat; | |||
| 				background-size: cover; | |||
| 			} | |||
| 		} | |||
| 		&:last-child { | |||
| 			i { | |||
| 				background: url('@assets/images/mine.png') no-repeat; | |||
| 				background-size: cover; | |||
| 			} | |||
| 		} | |||
| 		&.active { | |||
|       color: #5F75A9; | |||
|       &:first-child { | |||
|         i { | |||
|           background: url('@assets/images/activeA.png') no-repeat; | |||
|           background-size: cover; | |||
|         } | |||
|       } | |||
|       &:nth-child(2) { | |||
|         i { | |||
|           background: url('@assets/images/cartA.png') no-repeat; | |||
|           background-size: cover; | |||
|         } | |||
|       } | |||
|       &:last-child { | |||
|         i { | |||
|           background: url('@assets/images/mineA.png') no-repeat; | |||
|           background-size: cover; | |||
|         } | |||
|       } | |||
| 		} | |||
| 	} | |||
| } | |||
| </style> | |||
| @ -0,0 +1,477 @@ | |||
| <template> | |||
|     <div class="slide-verify" :style="{width: w + 'px'}" id="slideVerify" onselectstart="return false;"> | |||
|         <!-- 图片加载遮蔽罩 --> | |||
|         <div :class="{'slider-verify-loading': loadBlock}"></div> | |||
|         <canvas :width="w" :height="h" ref="canvas" ></canvas> | |||
|         <div v-if="show" @click="refresh" class="slide-verify-refresh-icon"></div> | |||
|         <canvas :width="w" :height="h" ref="block"  class="slide-verify-block"></canvas> | |||
|         <!-- container --> | |||
|         <div class="slide-verify-slider" :class="{'container-active': containerActive, 'container-success': containerSuccess, 'container-fail': containerFail}"> | |||
|             <div class="slide-verify-slider-mask" :style="{width: sliderMaskWidth}"> | |||
|                 <!-- slider --> | |||
|                 <div @mousedown="sliderDown" | |||
|                     @touchstart="touchStartEvent" | |||
|                     @touchmove="touchMoveEvent" | |||
|                     @touchend="touchEndEvent" | |||
|                     class="slide-verify-slider-mask-item" | |||
|                     :style="{left: sliderLeft}"> | |||
|                     <div class="slide-verify-slider-mask-item-icon"></div> | |||
|                 </div> | |||
|             </div> | |||
|             <span class="slide-verify-slider-text">{{sliderText}}</span> | |||
|         </div> | |||
|     </div> | |||
| </template> | |||
| <script> | |||
|     const PI = Math.PI; | |||
| 
 | |||
|     function sum(x, y) { | |||
|         return x + y | |||
|     } | |||
| 
 | |||
|     function square(x) { | |||
|         return x * x | |||
|     } | |||
|     export default { | |||
|         name: 'SlideVerify', | |||
|         props: { | |||
|             // block length | |||
|             l: { | |||
|                 type: Number, | |||
|                 default: 42, | |||
|             }, | |||
|             // block radius | |||
|             r: { | |||
|                 type: Number, | |||
|                 default: 10, | |||
|             }, | |||
|             // canvas width | |||
|             w: { | |||
|                 type: Number, | |||
|                 default: 310, | |||
|             }, | |||
|             // canvas height | |||
|             h: { | |||
|                 type: Number, | |||
|                 default: 155, | |||
|             }, | |||
|             sliderText: { | |||
|                 type: String, | |||
|                 default: '向右滑动滑块填充拼图', | |||
|             }, | |||
|             accuracy: { | |||
|               type: Number, | |||
|               default: 5, // 若为 -1 则不进行机器判断 | |||
|             }, | |||
|             show: { | |||
|               type: Boolean, | |||
|               default: true, | |||
|             }, | |||
|             imgs: { | |||
|               type: Array, | |||
|               default: () => [], | |||
|             }, | |||
|         }, | |||
|         data() { | |||
|             return { | |||
|                 containerActive: false, // container active class | |||
|                 containerSuccess: false, // container success class | |||
|                 containerFail: false, // container fail class | |||
|                 canvasCtx: null, | |||
|                 blockCtx: null, | |||
|                 block: null, | |||
|                 block_x: undefined, // container random position | |||
|                 block_y: undefined, | |||
|                 L: this.l + this.r * 2 + 3, // block real lenght | |||
|                 img: undefined, | |||
|                 originX: undefined, | |||
|                 originY: undefined, | |||
|                 isMouseDown: false, | |||
|                 trail: [], | |||
|                 sliderLeft: 0, // block right offset | |||
|                 sliderMaskWidth: 0, // mask width, | |||
|                 success: false, // Bug Fixes 修复了验证成功后还能滑动 | |||
|                 loadBlock: true, // Features 图片加载提示,防止图片没加载完就开始验证 | |||
|                 timestamp: null, | |||
|             } | |||
|         }, | |||
|         mounted() { | |||
|             this.init() | |||
|         }, | |||
|         methods: { | |||
|             init() { | |||
|                 this.initDom() | |||
|                 this.initImg() | |||
|                 this.bindEvents() | |||
|             }, | |||
|             initDom() { | |||
|                 this.block = this.$refs.block; | |||
|                 this.canvasCtx = this.$refs.canvas.getContext('2d') | |||
|                 this.blockCtx = this.block.getContext('2d') | |||
|             }, | |||
|             initImg() { | |||
|                 const img = this.createImg(() => { | |||
|                     // 图片加载完关闭遮蔽罩 | |||
|                     this.loadBlock = false; | |||
|                     this.drawBlock() | |||
|                     this.canvasCtx.drawImage(img, 0, 0, this.w, this.h) | |||
|                     this.blockCtx.drawImage(img, 0, 0, this.w, this.h) | |||
|                     let { | |||
|                         block_x: x, | |||
|                         block_y: y, | |||
|                         r, | |||
|                         L | |||
|                     } = this | |||
|                     let _y = y - r * 2 - 1 | |||
|                     let ImageData = this.blockCtx.getImageData(x, _y, L, L); | |||
|                     this.block.width = L; | |||
|                     this.blockCtx.putImageData(ImageData, 0, _y) | |||
|                 }); | |||
|                 this.img = img; | |||
|             }, | |||
|             drawBlock() { | |||
|                 this.block_x = this.getRandomNumberByRange(this.L + 10, this.w - (this.L + 10)) | |||
|                 this.block_y = this.getRandomNumberByRange(10 + this.r * 2, this.h - (this.L + 10)) | |||
|                 this.draw(this.canvasCtx, this.block_x, this.block_y, 'fill') | |||
|                 this.draw(this.blockCtx, this.block_x, this.block_y, 'clip') | |||
|             }, | |||
|             draw(ctx, x, y, operation) { | |||
|                 let { | |||
|                     l, | |||
|                     r | |||
|                 } = this; | |||
|                 ctx.beginPath() | |||
|                 ctx.moveTo(x, y) | |||
|                 ctx.arc(x + l / 2, y - r + 2, r, 0.72 * PI, 2.26 * PI) | |||
|                 ctx.lineTo(x + l, y) | |||
|                 ctx.arc(x + l + r - 2, y + l / 2, r, 1.21 * PI, 2.78 * PI) | |||
|                 ctx.lineTo(x + l, y + l) | |||
|                 ctx.lineTo(x, y + l) | |||
|                 ctx.arc(x + r - 2, y + l / 2, r + 0.4, 2.76 * PI, 1.24 * PI, true) | |||
|                 ctx.lineTo(x, y) | |||
|                 ctx.lineWidth = 2 | |||
|                 ctx.fillStyle = 'rgba(255, 255, 255, 0.7)' | |||
|                 ctx.strokeStyle = 'rgba(255, 255, 255, 0.7)' | |||
|                 ctx.stroke() | |||
|                 ctx[operation]() | |||
|                 // Bug Fixes 修复了火狐和ie显示问题 | |||
|                 ctx.globalCompositeOperation = "destination-over" | |||
|             }, | |||
|             createImg(onload) { | |||
|                 const img = document.createElement('img'); | |||
|                 img.crossOrigin = "Anonymous"; | |||
|                 img.onload = onload; | |||
|                 img.onerror = () => { | |||
|                     img.src = this.getRandomImg() | |||
|                 } | |||
|                 img.src = this.getRandomImg() | |||
|                 return img; | |||
|             }, | |||
|             // 随机生成img src | |||
|             getRandomImg() { | |||
|                 // return require('../assets/img.jpg') | |||
|                 const len = this.imgs.length; | |||
|                 return len > 0 ? | |||
|                   this.imgs[this.getRandomNumberByRange(0, len)] : | |||
|                   'https://picsum.photos/300/150/?image=' + this.getRandomNumberByRange(0, 1084); | |||
|             }, | |||
|             getRandomNumberByRange(start, end) { | |||
|                 return Math.round(Math.random() * (end - start) + start) | |||
|             }, | |||
|             refresh() { | |||
|                 this.reset() | |||
|                 this.$emit('refresh') | |||
|             }, | |||
|             sliderDown(event) { | |||
|                 if (this.success) return; | |||
|                 this.originX = event.clientX; | |||
|                 this.originY = event.clientY; | |||
|                 this.isMouseDown = true; | |||
|                 this.timestamp = + new Date(); | |||
|             }, | |||
|             touchStartEvent(e) { | |||
|                 if (this.success) return; | |||
|                 this.originX = e.changedTouches[0].pageX; | |||
|                 this.originY = e.changedTouches[0].pageY; | |||
|                 this.isMouseDown = true; | |||
|                 this.timestamp = + new Date(); | |||
|             }, | |||
|             bindEvents() { | |||
|                 document.addEventListener('mousemove', (e) => { | |||
|                     if (!this.isMouseDown) return false; | |||
|                     const moveX = e.clientX - this.originX; | |||
|                     const moveY = e.clientY - this.originY; | |||
|                     if (moveX < 0 || moveX + 38 >= this.w) return false; | |||
|                     this.sliderLeft = moveX + 'px'; | |||
|                     let blockLeft = (this.w - 40 - 20) / (this.w - 40) * moveX; | |||
|                     this.block.style.left = blockLeft + 'px'; | |||
| 
 | |||
|                     this.containerActive = true; // add active | |||
|                     this.sliderMaskWidth = moveX + 'px'; | |||
|                     this.trail.push(moveY); | |||
|                 }); | |||
|                 document.addEventListener('mouseup', (e) => { | |||
|                     if (!this.isMouseDown) return false | |||
|                     this.isMouseDown = false | |||
|                     if (e.clientX === this.originX) return false; | |||
|                     this.containerActive = false; // remove active | |||
|                     this.timestamp = + new Date() - this.timestamp; | |||
| 
 | |||
|                     const { | |||
|                         spliced, | |||
|                         TuringTest | |||
|                     } = this.verify(); | |||
|                     if (spliced) { | |||
|                         if(this.accuracy === -1) { | |||
|                             this.containerSuccess = true; | |||
|                             this.success = true; | |||
|                             this.$emit('success', this.timestamp); | |||
|                             return; | |||
|                         } | |||
|                         if (TuringTest) { | |||
|                             // succ | |||
|                             this.containerSuccess = true; | |||
|                             this.success = true; | |||
|                             this.$emit('success', this.timestamp) | |||
|                         } else { | |||
|                             this.containerFail = true; | |||
|                             this.$emit('again') | |||
|                         } | |||
|                     } else { | |||
|                         this.containerFail = true; | |||
|                         this.$emit('fail') | |||
|                         setTimeout(() => { | |||
|                             this.reset() | |||
|                         }, 1000) | |||
|                     } | |||
|                 }) | |||
|             }, | |||
|             touchMoveEvent(e) { | |||
|                 if (!this.isMouseDown) return false; | |||
|                 const moveX = e.changedTouches[0].pageX - this.originX; | |||
|                 const moveY = e.changedTouches[0].pageY - this.originY; | |||
|                 if (moveX < 0 || moveX + 38 >= this.w) return false; | |||
|                 this.sliderLeft = moveX + 'px'; | |||
|                 let blockLeft = (this.w - 40 - 20) / (this.w - 40) * moveX; | |||
|                 this.block.style.left = blockLeft + 'px'; | |||
| 
 | |||
|                 this.containerActive = true; | |||
|                 this.sliderMaskWidth = moveX + 'px'; | |||
|                 this.trail.push(moveY); | |||
|             }, | |||
|             touchEndEvent(e) { | |||
|                 if (!this.isMouseDown) return false | |||
|                 this.isMouseDown = false | |||
|                 if (e.changedTouches[0].pageX === this.originX) return false; | |||
|                 this.containerActive = false; | |||
|                 this.timestamp = + new Date() - this.timestamp; | |||
| 
 | |||
|                 const { | |||
|                     spliced, | |||
|                     TuringTest | |||
|                 } = this.verify(); | |||
|                 if (spliced) { | |||
|                     if(this.accuracy === -1) { | |||
|                         this.containerSuccess = true; | |||
|                         this.success = true; | |||
|                         this.$emit('success', this.timestamp); | |||
|                         return; | |||
|                     } | |||
|                     if (TuringTest) { | |||
|                         // succ | |||
|                         this.containerSuccess = true; | |||
|                         this.success = true; | |||
|                         this.$emit('success', this.timestamp) | |||
|                     } else { | |||
|                         this.containerFail = true; | |||
|                         this.$emit('again') | |||
|                     } | |||
|                 } else { | |||
|                     this.containerFail = true; | |||
|                     this.$emit('fail') | |||
|                     setTimeout(() => { | |||
|                         this.reset() | |||
|                     }, 1000) | |||
|                 } | |||
|             }, | |||
|             verify() { | |||
|                 const arr = this.trail // drag y move distance | |||
|                 const average = arr.reduce(sum) / arr.length // average | |||
|                 const deviations = arr.map(x => x - average) // deviation array | |||
|                 const stddev = Math.sqrt(deviations.map(square).reduce(sum) / arr.length) // standard deviation | |||
|                 const left = parseInt(this.block.style.left) | |||
|                 const accuracy = this.accuracy <= 1 ? 1 : this.accuracy > 10 ? 10 : this.accuracy; | |||
|                 return { | |||
|                     spliced: Math.abs(left - this.block_x) <= accuracy, | |||
|                     TuringTest: average !== stddev, // equal => not person operate | |||
|                 } | |||
|             }, | |||
|             reset() { | |||
|                 this.success = false; | |||
|                 this.containerActive = false; | |||
|                 this.containerSuccess = false; | |||
|                 this.containerFail = false; | |||
|                 this.sliderLeft = 0; | |||
|                 this.block.style.left = 0; | |||
|                 this.sliderMaskWidth = 0; | |||
|                 // canvas | |||
|                 let { | |||
|                     w, | |||
|                     h | |||
|                 } = this; | |||
|                 this.canvasCtx.clearRect(0, 0, w, h) | |||
|                 this.blockCtx.clearRect(0, 0, w, h) | |||
|                 this.block.width = w | |||
| 
 | |||
|                 // generate img | |||
|                 this.img.src = this.getRandomImg(); | |||
|                 this.$emit('fulfilled') | |||
|             }, | |||
|         } | |||
|     } | |||
| </script> | |||
| <style scoped> | |||
|     .slide-verify { | |||
|         position: relative; | |||
|     } | |||
| 
 | |||
|     /* 图片加载样式 */ | |||
|     .slider-verify-loading{ | |||
|         position: absolute; | |||
|         top: 0; | |||
|         right: 0; | |||
|         left: 0; | |||
|         bottom: 0; | |||
|         background: rgba(255, 255, 255, 0.9); | |||
|         z-index: 999; | |||
|         animation: loading 1.5s infinite; | |||
|     } | |||
| 
 | |||
|     @keyframes loading { | |||
|         0%{ | |||
|             opacity: .7; | |||
|         } | |||
|         100% { | |||
|             opacity: 9; | |||
|         } | |||
|     } | |||
| 
 | |||
|     .slide-verify-block { | |||
|         position: absolute; | |||
|         left: 0; | |||
|         top: 0 | |||
|     } | |||
| 
 | |||
|     .slide-verify-refresh-icon { | |||
|         position: absolute; | |||
|         right: 0; | |||
|         top: 0; | |||
|         width: 34px; | |||
|         height: 34px; | |||
|         cursor: pointer; | |||
|         background: url("../../assets/images/login/icon_light.png") 0 -437px; | |||
|         background-size: 34px 471px | |||
|     } | |||
| 
 | |||
|     .slide-verify-slider { | |||
|         position: relative; | |||
|         text-align: center; | |||
|         width: 100%; | |||
|         height: 40px; | |||
|         line-height: 40px; | |||
|         margin-top: 15px; | |||
|         background: #f7f9fa; | |||
|         color: #45494c; | |||
|         border: 1px solid #e4e7eb | |||
|     } | |||
| 
 | |||
|     .slide-verify-slider-mask { | |||
|         position: absolute; | |||
|         left: 0; | |||
|         top: 0; | |||
|         height: 40px; | |||
|         border: 0 solid #1991FA; | |||
|         background: #D1E9FE | |||
|     } | |||
| 
 | |||
|     .slide-verify-slider-mask-item { | |||
|         position: absolute; | |||
|         top: 0; | |||
|         left: 0; | |||
|         width: 40px; | |||
|         height: 40px; | |||
|         background: #fff; | |||
|         box-shadow: 0 0 3px rgba(0, 0, 0, 0.3); | |||
|         cursor: pointer; | |||
|         transition: background .2s linear | |||
|     } | |||
| 
 | |||
|     .slide-verify-slider-mask-item:hover { | |||
|         background: #1991FA | |||
|     } | |||
| 
 | |||
|     .slide-verify-slider-mask-item:hover .slide-verify-slider-mask-item-icon { | |||
|         background-position: 0 -13px | |||
|     } | |||
| 
 | |||
|     .slide-verify-slider-mask-item-icon { | |||
|         position: absolute; | |||
|         top: 15px; | |||
|         left: 13px; | |||
|         width: 14px; | |||
|         height: 12px; | |||
|         background: url("../../assets/images/login/icon_light.png") 0 -26px; | |||
|         background-size: 34px 471px | |||
|     } | |||
|     .container-active .slide-verify-slider-mask-item { | |||
|         height: 38px; | |||
|         top: -1px; | |||
|         border: 1px solid #1991FA; | |||
|     } | |||
| 
 | |||
|     .container-active .slide-verify-slider-mask { | |||
|         height: 38px; | |||
|         border-width: 1px; | |||
|     } | |||
| 
 | |||
|     .container-success .slide-verify-slider-mask-item { | |||
|         height: 38px; | |||
|         top: -1px; | |||
|         border: 1px solid #52CCBA; | |||
|         background-color: #52CCBA !important; | |||
|     } | |||
| 
 | |||
|     .container-success .slide-verify-slider-mask { | |||
|         height: 38px; | |||
|         border: 1px solid #52CCBA; | |||
|         background-color: #D2F4EF; | |||
|     } | |||
| 
 | |||
|     .container-success .slide-verify-slider-mask-item-icon { | |||
|         background-position: 0 0 !important; | |||
|     } | |||
| 
 | |||
|     .container-fail .slide-verify-slider-mask-item { | |||
|         height: 38px; | |||
|         top: -1px; | |||
|         border: 1px solid #f57a7a; | |||
|         background-color: #f57a7a !important; | |||
|     } | |||
| 
 | |||
|     .container-fail .slide-verify-slider-mask { | |||
|         height: 38px; | |||
|         border: 1px solid #f57a7a; | |||
|         background-color: #fce1e1; | |||
|     } | |||
| 
 | |||
|     .container-fail .slide-verify-slider-mask-item-icon { | |||
|         top: 14px; | |||
|         background-position: 0 -82px !important; | |||
|     } | |||
| 
 | |||
|     .container-active .slide-verify-slider-text, | |||
|     .container-success .slide-verify-slider-text, | |||
|     .container-fail .slide-verify-slider-text { | |||
|         display: none; | |||
|     } | |||
| </style> | |||
| @ -0,0 +1,249 @@ | |||
| <template> | |||
| 	<div> | |||
| 		<div  class="text" v-if="!textFlex"> | |||
| 			  <div class="wuc-tab-item"  :class="[index === tabCur ? selectClass + ' cur':'']" v-for="(item,index) in tabList" | |||
| 				:key="item.id" | |||
| 				:id="item.id" | |||
| 				@click="tabSelect(index,item.id,index,item.code,item.id,item)"  > | |||
| 				<div :class="item.icon"></div> | |||
| 				<span>{{item.name}}</span> | |||
| 			  </div> | |||
| 		</div> | |||
| 		<div class="flex text-center" v-if="textFlex"> | |||
| 			  <div class="wuc-tab-item flex-sub" :class="index === tabCur ? selectClass + ' cur':''" 	v-for="(item,index) in tabList" | |||
| 				:key="index" | |||
| 				:id="index" | |||
| 				@click="tabSelect(index,item.code,item.id,item)" > | |||
| 				<div :class="item.icon"></div> | |||
| 				<span>{{item.name}}</span> | |||
| 			  </div> | |||
| 		</div> | |||
|     </div> | |||
| </template> | |||
| <script> | |||
| import { reactive,computed,onMounted,getCurrentInstance } from 'vue';	 | |||
| export default { | |||
|   name: "wuc-tab", | |||
|   data() { | |||
|     return {}; | |||
|   }, | |||
|   props: { | |||
|     tabList: { | |||
|       type: Array, | |||
|       default() { | |||
|         return []; | |||
|       }, | |||
|     }, | |||
|     tabCur: { | |||
|       type: Number, | |||
|       default() { | |||
|         return 0; | |||
|       }, | |||
|     }, | |||
|     tabClass: { | |||
|       type: String, | |||
|       default() { | |||
|         return ""; | |||
|       }, | |||
|     }, | |||
|     tabStyle: { | |||
|       type: String, | |||
|       default() { | |||
|         return ""; | |||
|       }, | |||
|     }, | |||
|     textFlex: { | |||
|       type: Boolean, | |||
|       default() { | |||
|         return true; | |||
|       }, | |||
|     }, | |||
|     selectClass: { | |||
|       type: String, | |||
|       default() { | |||
|         return "text-blue"; | |||
|       }, | |||
|     }, | |||
|   }, | |||
|   setup(props, context){ | |||
| 	  	const { proxy } = getCurrentInstance()  | |||
| 		let  moveHandle = () => { | |||
| 		} | |||
| 		let  tabSelect = (index, e, s, item) => { | |||
| 			context.emit("update:tabCur", index); | |||
| 			context.emit("change", index); | |||
| 			context.emit("chengeid", e); | |||
| 			context.emit("chengeclass", s); | |||
| 			context.emit("changeitem", item); | |||
| 			if(index > 0) { | |||
| 				let tab = document.getElementsByClassName('wuc-tab-item'); | |||
| 				for (let i = 0; i < tab.length; i++) { | |||
| 					tab[i].style.color = '#666666'; | |||
| 				} | |||
| 			} else { | |||
| 				let tab = document.getElementsByClassName('wuc-tab-item'); | |||
| 				for (let i = 0; i < tab.length; i++) { | |||
| 					tab[i].style.color = '#fff'; | |||
| 				} | |||
| 			} | |||
| 		} | |||
| 		return { | |||
| 			scrollLeft: computed(function(){ | |||
| 				return (props.tabCur - 1) * 60; | |||
| 			 } | |||
| 			), | |||
| 			moveHandle, | |||
| 			tabSelect | |||
| 		} | |||
|     } | |||
| }; | |||
| </script> | |||
| <style scoped> | |||
| div, | |||
| scroll-view, | |||
| swiper { | |||
|   box-sizing: border-box; | |||
| } | |||
| .wuc-tab { | |||
|   white-space: nowrap; | |||
| } | |||
| .wuc-tab :deep(.uni-scroll-view::-webkit-scrollbar) { | |||
|   display: none; | |||
| } | |||
| .wuc-tab-item { | |||
|   color: white; | |||
|   display: inline-block; | |||
|   margin: 0 0.10rem; | |||
|   padding: 0 0.20rem; | |||
|   font-size: 0.32rem; | |||
| } | |||
| .wuc-tab.fixed { | |||
|   position: fixed; | |||
|   width: 100%; | |||
|   top: 0; | |||
|   z-index: 1024; | |||
|   box-shadow: 0 0.01rem 0.06rem rgba(0, 0, 0, 0.1); | |||
| } | |||
| .flex-sub { | |||
|   flex: 1 !important; | |||
| } | |||
| .text-red { | |||
|   color: #333333; | |||
|   font-size: 0.36rem; | |||
|   font-weight: bold; | |||
|   position: relative; | |||
|   height: 0.80rem; | |||
| } | |||
| .text-red:after { | |||
|   content: ""; | |||
|   position: absolute; | |||
|   bottom: 0px; | |||
|   top: auto; | |||
|   left: 60%; | |||
|   height:0.08rem; | |||
|   margin-left: -20%; | |||
|   width: 0.43rem; | |||
|   border-radius: 0.15rem; | |||
|   background-color: #0499f8; | |||
| } | |||
| .text-blue { | |||
|   color: #333333 !important; | |||
|   font-size: 0.36rem; | |||
|   font-weight: bold; | |||
|   height: 0.82rem; | |||
|   line-height: 0.82rem; | |||
|   position: relative; | |||
| } | |||
| .text-blue:after { | |||
|   content: ""; | |||
|   position: absolute; | |||
|   bottom: 0px; | |||
|   top: auto; | |||
|   left: 50%; | |||
|   height: 0.08rem; | |||
|   margin-left: -0.20rem; | |||
|   width: 0.36rem; | |||
|   border-radius: 0.04rem; | |||
|   background-color: #0499f8; | |||
| } | |||
| .text-list1 span { | |||
|   font-weight: bold; | |||
| } | |||
| .text-list2 span { | |||
|   background: rgba(7, 27, 77, 0.4); | |||
|   border-radius: 0.36rem; | |||
|   padding: 0.06rem 0.24rem; | |||
| } | |||
| .text-Subclass span { | |||
|   background: #16c7c5; | |||
|   border-radius: 0.36rem; | |||
|   color: #ffffff; | |||
|   padding: 0.06rem 0.24rem; | |||
| } | |||
| .text-white { | |||
|   color: #ffffff; | |||
|   font-size: 0.36rem; | |||
|   font-weight: bold; | |||
|   height: 0.82rem; | |||
|   line-height: 0.82rem; | |||
|   position: relative; | |||
| } | |||
| .text-white:after { | |||
|   content: ""; | |||
|   position: absolute; | |||
|   bottom: 0px; | |||
|   top: auto; | |||
|   left: 50%; | |||
|   height: 0.08rem; | |||
|   margin-left: -0.20rem; | |||
|   width: 0.36rem; | |||
|   border-radius: 0.04rem; | |||
|   background-color: #ffffff; | |||
| } | |||
| .bg-white { | |||
|   background-color: #ffffff; | |||
| } | |||
| .bg-blue { | |||
|   background-color: rgb(4, 167, 242); | |||
|   color: white; | |||
|   border-radius: 0.40rem; | |||
|   padding: 0 0.20rem; | |||
| } | |||
| .text-orange { | |||
|   color: #f37b1d; | |||
| } | |||
| .text-xl { | |||
|   font-size: 0.36rem; | |||
| } | |||
| .knowLEdgeTab { | |||
|   color: #e5e5e5; | |||
|   font-size: 0.36rem; | |||
|   height: 0.90rem; | |||
|   line-height: 0.90rem; | |||
| } | |||
| .sortItem .wuc-tab-item { | |||
|   color: #333333; | |||
|   font-size: 0.28rem; | |||
|   padding: 0 0.50rem; | |||
|   height: 0.60rem; | |||
|   line-height: 0.60rem; | |||
|   background-color: #f3f5f4; | |||
|   border-radius: 0.30rem; | |||
| } | |||
| .sortOnItem { | |||
|   color: #1685fb !important; | |||
|   background-color: #e7f5fe !important; | |||
| } | |||
| .FindTabClass { | |||
|   color: #222222; | |||
|   font-size: 0.28rem; | |||
|   height: 0.84rem; | |||
|   line-height: 0.76rem; | |||
| } | |||
| .topTabList2  .wuc-tab-item{ | |||
| 	color: #333333; | |||
| } | |||
| .topTabList2 .text-white:after{ | |||
| 	background-color: #333333; | |||
| } | |||
| </style> | |||
| @ -0,0 +1,133 @@ | |||
| import { createApp } from 'vue' | |||
| import App from './App.vue' | |||
| import router from './router/index' | |||
| import { _createStore } from './vuex'; | |||
| 
 | |||
| 
 | |||
| // 引入http请求插件
 | |||
| import $API from './utils/api' | |||
| import $http from './utils/http' | |||
| import { addRequestInterceptor, addResponseInterceptor } from  './utils/http' | |||
| import Qs from 'qs'; | |||
| 
 | |||
| // reset 样式
 | |||
| import '@/assets/css/reset.css' | |||
| import '@/assets/css/swiper6.min.css' | |||
| import '@/assets/js/rem.js' | |||
| import '@/assets/js/swiper6.min.js' | |||
| 
 | |||
| 
 | |||
| import { Toast, Swipe, SwipeItem, Popup, Picker, Tab, Tabs, Dialog, Uploader, DatetimePicker, Slider, Checkbox, CheckboxGroup  } from 'vant'; | |||
| 
 | |||
| import 'vant/lib/index.css'; | |||
| 
 | |||
| Toast.setDefaultOptions({ duration: 500 }); | |||
| //vue.use(Toast);
 | |||
| 
 | |||
| 
 | |||
| // 路由拦截器
 | |||
| // router.beforeEach((to, from, next) => {
 | |||
| //   if (to.matched.length != 0) {
 | |||
| //       if (to.meta.requireAuth) { // 判断该路由是否需要登录权限
 | |||
| //           if (Boolean(localStorage.getItem("userInfo"))) { // 通过vuex state获取当前的user是否存在
 | |||
| //               next();
 | |||
| //           } else {
 | |||
| //               next({
 | |||
| //                   path: '/login',
 | |||
| //                   query: { redirect: to.fullPath } // 将跳转的路由path作为参数,登录成功后跳转到该路由
 | |||
| //               })
 | |||
| //           }
 | |||
| //       } else {
 | |||
| //           if (Boolean(localStorage.getItem("userInfo"))) { // 判断是否登录
 | |||
| //               if (to.path != "/" && to.path != "/login") { //判断是否要跳到登录界面
 | |||
| //                   next();
 | |||
| //               } else {
 | |||
| //                   /**
 | |||
| //                    * 防刷新,如果登录,修改路由跳转到登录页面,修改路由为登录后的首页
 | |||
| //                    */
 | |||
| //                   next({
 | |||
| //                       path: '/standardizedData/groupAirline'
 | |||
| //                   })
 | |||
| //               }
 | |||
| //           } else {
 | |||
| //               next();
 | |||
| //           }
 | |||
| //       }
 | |||
| //   } else {
 | |||
| //       next({
 | |||
| //           path: '/login',
 | |||
| //           query: { redirect: to.fullPath } // 将跳转的路由path作为参数,登录成功后跳转到该路由
 | |||
| //       })
 | |||
| //   }
 | |||
| // })
 | |||
| 
 | |||
| 
 | |||
| // request前自动添加api配置
 | |||
| addRequestInterceptor( | |||
|   (config) => { | |||
|     let Authorization = ""; | |||
|     if (typeof localStorage !== "undefined") { | |||
|       const userData =  JSON.parse(localStorage.getItem('userData')) || ""; | |||
|       if (userData) { | |||
|         let token = ''; | |||
|         if (userData.token) { | |||
|           token = userData.token | |||
|         } else if(userData.data.token){ | |||
|           token = userData.data.token | |||
|         } | |||
|         Authorization = "Bearer " + token; | |||
|       } | |||
|       config.headers['Authorization'] =  Authorization; | |||
|     } | |||
|     config.transformRequest = [ | |||
|       function(data){ | |||
|         return Qs.stringify(data)  //使用Qs将请求参数序列化
 | |||
|     }] | |||
|       /*统一加/api前缀*/ | |||
|       //config.url = `/api${config.url}`
 | |||
|       return config | |||
|     }, | |||
|     (error) => { | |||
|       return Promise.reject(error) | |||
|     } | |||
| ) | |||
| 
 | |||
| // http 返回response前处理
 | |||
| addResponseInterceptor( | |||
|   (response) => { | |||
|     /*todo 在这里统一前置处理请求响应 */ | |||
|     return Promise.resolve(response.data) | |||
|   }, | |||
|   (error) => { | |||
|     /* | |||
|     * todo 统一处理500、400等错误状态 | |||
|     * 这里reject下,交给entry-server.js的处理 | |||
|     */ | |||
|     const { response, request } = error | |||
|     return Promise.reject({ code: response.status, data: response.data, method: request.method, path: request.path }) | |||
|   } | |||
| ) | |||
| 
 | |||
| const app = createApp(App) | |||
| const store = _createStore(); | |||
| 
 | |||
| app.use(router) | |||
| app.use(store) | |||
| 
 | |||
| app.use(Toast) | |||
| .use(Swipe) | |||
| .use(Popup) | |||
| .use(Picker) | |||
| .use(Tab) | |||
| .use(Tabs) | |||
| .use(Dialog) | |||
| .use(Uploader) | |||
| .use(DatetimePicker) | |||
| .use(SwipeItem) | |||
| .use(Slider) | |||
| .use(Checkbox) | |||
| .use(CheckboxGroup); | |||
| 
 | |||
| app.config.globalProperties.$API =  $API | |||
| app.config.globalProperties.$http =  $http | |||
| app.mount('#app') | |||
| @ -0,0 +1,143 @@ | |||
| import { createRouter, createWebHashHistory, createWebHistory } from 'vue-router' | |||
| 
 | |||
| const router = createRouter({ | |||
|   history: createWebHistory(), // hash模式:createWebHashHistory,history模式:createWebHistory
 | |||
|   routes: [ | |||
|     { | |||
|       path: '/', | |||
|       name: 'index', | |||
|       component: () => | |||
|         import('@/views/index.vue'), | |||
|     }, | |||
|     { | |||
|       path: '/Mine', | |||
|       name: 'Mine', | |||
|       component: () => | |||
|         import('@/views/mine/mine.vue'), | |||
|     }, | |||
|     { | |||
|       path: '/Cart', | |||
|       name: 'Cart', | |||
|       component: () => | |||
|         import('@/views/cart/cart.vue'), | |||
|     }, | |||
|     { | |||
|       path: '/CartResult', | |||
|       name: 'CartResult', | |||
|       component: () => | |||
|         import('@/views/cart/result.vue'), | |||
|     } | |||
|     // {
 | |||
|     //   path: '/Login',
 | |||
|     //   name: 'Login',
 | |||
|     //   component: () =>
 | |||
|     //     import('@/views/login/login.vue'),
 | |||
|     // },
 | |||
|     // {
 | |||
|     //   path: '/Registered',
 | |||
|     //   name: 'Registered',
 | |||
|     //   component: () =>
 | |||
|     //     import('@/views/registered/registered.vue'),
 | |||
|     // },
 | |||
|     // {
 | |||
|     //   path: '/Registered1',
 | |||
|     //   name: 'Registered1',
 | |||
|     //   component: () =>
 | |||
|     //     import('@/views/registered1/registered1.vue'),
 | |||
|     // },
 | |||
|     // {
 | |||
|     //   path: '/ResetPassword1',
 | |||
|     //   name: 'ResetPassword1',
 | |||
|     //   component: () =>
 | |||
|     //     import('@/views/ResetPassword1/ResetPassword1.vue'),
 | |||
|     // },
 | |||
|     // {
 | |||
|     //   path: '/ResetPassword2',
 | |||
|     //   name: 'ResetPassword2',
 | |||
|     //   component: () =>
 | |||
|     //     import('@/views/ResetPassword2/ResetPassword2.vue'),
 | |||
|     // },
 | |||
|     // {
 | |||
|     //   path: '/ResetPassword3',
 | |||
|     //   name: 'ResetPassword3',
 | |||
|     //   component: () =>
 | |||
|     //     import('@/views/ResetPassword3/ResetPassword3.vue'),
 | |||
|     // },
 | |||
|     // {
 | |||
|     //   path: '/Mine',
 | |||
|     //   name: 'Mine',
 | |||
|     //   component: () =>
 | |||
|     //     import('@/views/mine/mine.vue'),                             // 我的页面
 | |||
|     // },
 | |||
|     // {
 | |||
|     //   path: '/MineInfo',
 | |||
|     //   name: 'MineInfo',
 | |||
|     //   component: () =>
 | |||
|     //     import('@/views/mineInfo/mineInfo.vue'),                      // 个人资料页面
 | |||
|     // },
 | |||
|     // {
 | |||
|     //   path: '/MineRule',
 | |||
|     //   name: 'MineRule',
 | |||
|     //   component: () =>
 | |||
|     //     import('@/views/mineRule/mineRule.vue'),                      // 规则页面
 | |||
|     // },
 | |||
|     // {
 | |||
|     //   path: '/MineCard',
 | |||
|     //   name: 'MineCard',
 | |||
|     //   component: () =>
 | |||
|     //     import('@/views/mineCard/mineCard.vue'),                      // 我的图书证
 | |||
|     // },
 | |||
|     // {
 | |||
|     //   path: '/ChangePhone',
 | |||
|     //   name: 'ChangePhone',
 | |||
|     //   component: () =>
 | |||
|     //     import('@/views/ChangePhone/ChangePhone.vue'),              // 修改手机号
 | |||
|     // },
 | |||
|     // {
 | |||
|     //   path: '/ChangeMineCard',
 | |||
|     //   name: 'ChangeMineCard',
 | |||
|     //   component: () =>
 | |||
|     //     import('@/views/changeMineCard/changeMineCard.vue'),           // 切换读者证
 | |||
|     // },
 | |||
|     // {
 | |||
|     //   path: '/MineVerifyLogin',
 | |||
|     //   name: 'MineVerifyLogin',
 | |||
|     //   component: () =>
 | |||
|     //     import('@/views/mineVerifyLogin/mineVerifyLogin.vue'),         // 切换读者证验证账号密码
 | |||
|     // },
 | |||
|     // {
 | |||
|     //   path: '/ActivityList',
 | |||
|     //   name: 'ActivityList',
 | |||
|     //   component: () =>
 | |||
|     //     import('@/views/activityList/activityList.vue'),                       // 线上活动/线下活动列表
 | |||
|     // },
 | |||
|     // {
 | |||
|     //   path: '/LoreActiveDetails',
 | |||
|     //   name: 'LoreActiveDetails',
 | |||
|     //   component: () =>
 | |||
|     //     import('@/views/loreActiveDetails/loreActiveDetails.vue'),            // 活动列表 - 内容详情
 | |||
|     // },
 | |||
|     // {
 | |||
|     //   path: '/AboutUs',
 | |||
|     //   name: 'AboutUs',
 | |||
|     //   component: () =>
 | |||
|     //     import('@/views/aboutUs/aboutUs.vue'),                                 // 关于我们
 | |||
|     // },
 | |||
|     // {
 | |||
|     //   path: '/Protocol',
 | |||
|     //   name: 'Protocol',
 | |||
|     //   component: () =>
 | |||
|     //     import('@/views/protocol/protocol.vue'),                               // 关于我们详情
 | |||
|     // },
 | |||
|     // {
 | |||
|     //   path: '/bindMobilePhone',
 | |||
|     //   name: 'bindMobilePhone',
 | |||
|     //   component: () =>
 | |||
|     //     import('@/views/bindMobilePhone/bindMobilePhone.vue'),                 // 绑定手机号页面
 | |||
|     // }
 | |||
|   ] | |||
| }) | |||
| 
 | |||
| export default router | |||
| 
 | |||
| 
 | |||
| @ -0,0 +1,419 @@ | |||
| 
 | |||
| const API = {} | |||
| 
 | |||
| 
 | |||
| //获取阅文
 | |||
| API.GETDOC = '/IndexApp/GetDoc'; | |||
| 
 | |||
| //获取视频
 | |||
| API.GETVIDEO = '/IndexApp/GetVideo'; | |||
| 
 | |||
| //获取电子图书
 | |||
| API.GETEBOOKS = '/IndexApp/GetEBooks'; | |||
| 
 | |||
| // 获取新闻公告
 | |||
| API.GETNEWS = '/IndexApp/GetNews'; | |||
| 
 | |||
| // 获取banners
 | |||
| API.GETBANNERS = '/IndexApp/GetBanners'; | |||
| 
 | |||
| // 登录
 | |||
| API.LOGIN = '/Account/AppLogin'; | |||
| 
 | |||
| //注册页面获取图书馆列表
 | |||
| API.GETLIBRARYINFO= '/Account/libraryInfo'; | |||
| 
 | |||
| //发送修改密码验证码
 | |||
| API.FORGOTACCOUNTMESSAGE= '/Account/ForgotAccountMessage'; | |||
| 
 | |||
| ///校验验证码
 | |||
| API.FORGOTVERIFICATIONCODE= '/Account/ForgotVerificationCode'; | |||
| 
 | |||
| //搜索资料 GET application/x-www-form-urlencoded
 | |||
| API.SEARCHDOC= '/Docment/SearchDoc'; | |||
| 
 | |||
| // 获取资料专题
 | |||
| API.GETTOPICS= '/Docment/Topics'; | |||
| 
 | |||
| // 根据标识获取所属的二级类别
 | |||
| API.GETSECCLASS= '/Class/GetSecClass'; | |||
| 
 | |||
| // 获取资料Banner
 | |||
| API.GETDOCBANNER= '/WebMobile/GetDocBanner'; | |||
| 
 | |||
| // 首页获取视频列表
 | |||
| API.GETVIDEOBYMARkREC= '/Video/GetVideoByMarkRec'; | |||
| 
 | |||
| // 获取视频专题列表
 | |||
| API.GETVIDEOTHEMETOP= '/Video/GetVideoThemeTop'; | |||
| 
 | |||
| // 获取视频Banner
 | |||
| API.GETVIDEOBANNERS= '/WebMobile/GetVideoBanner'; | |||
| 
 | |||
| //获取首页读书列表
 | |||
| API.GETBOOKBYMARkREC= '/EBook/GetBookByMarkRec'; | |||
| 
 | |||
| // 获取电子书专题(Top)
 | |||
| API.GETBOOKTHEMETOP= '/EBook/GetBookThemeTop'; | |||
| 
 | |||
| //获取电子书专题banner
 | |||
| API.GETBOOKBANNERS= '/WebMobile/GetEBookBanner'; | |||
| 
 | |||
| //搜索电子图书  GET application/x-www-form-urlencoded
 | |||
| API.GETBOOKBASEPAGES= '/EBook/GetBookBasePages'; | |||
| 
 | |||
| //根据ID获取主表信息
 | |||
| API.GETBOOKBASE= '/EBook/GetBookBase'; | |||
| 
 | |||
| // 根据主表Id获取详情列表并获取进度 GET application/json
 | |||
| API.GETBASEANDDETAILSID= '/EBook/GetBaseAndDetailsAndResourceByBaseId', | |||
| 
 | |||
| //根据图书主表Id和图书资源主表Id获取图书资源信息并获取进度
 | |||
| API.GETRESOURCEANDUSEDBYRESOURCEID= '/EBook/GetResourceAndUsedByResourceId', | |||
| 
 | |||
| // 获取评论列表
 | |||
| API.GETCOMMENTPAGES= '/Comment/GetCommentPages', | |||
| 
 | |||
| // 加入收藏  post  application/x-www-form-urlencoded
 | |||
| API.SETCOLLECTS= '/MyCollect/SetCollects'; | |||
| 
 | |||
| // 猜你喜欢读书列表
 | |||
| API.GETEBOOKSMORE= '/EBook/GetMore'; | |||
| 
 | |||
| // 评论答案
 | |||
| API.ADDCOMMENT= '/Comment/AddComment'; | |||
| 
 | |||
| // 添加评论回复
 | |||
| API.ADDCOMMENTBACK= '/Comment/AddCommentBack'; | |||
| 
 | |||
| // 评论举报
 | |||
| API.ADDREPORT= '/Report/AddReport'; | |||
| 
 | |||
| // 用户点赞(目前对象包括:评论/回复、动态、问题、回答)
 | |||
| API.CUSTLIKE= '/Use/CustLike'; | |||
| 
 | |||
| // 获取我的收藏
 | |||
| API.GETMYCOLLECTSPAGES= '/MyCollect/GetMyCollectsPages'; | |||
| 
 | |||
| // 检查我的收藏资源状态
 | |||
| API.CHECKMYCOLLECTSSTATE= '/MyCollect/CheckMyCollectsState'; | |||
| 
 | |||
| //获取验证注册规则  
 | |||
| API.GETVERIFY = '/Account/GetVerify'; | |||
| 
 | |||
| //发送注册验证码
 | |||
| API.SENDMSGCODE = '/Account/SendMsgCode'; | |||
| 
 | |||
| //注册
 | |||
| API.REGISTER = '/Account/RegisterNew'; | |||
| 
 | |||
| //获取阅文首页其他所有数据列表
 | |||
| API.GETDOCHOMEPAGEALL = '/WebMobile/GetDocHomePageAll'; | |||
| 
 | |||
| //获取视频首页其他所有数据列表
 | |||
| API.GETVIDEOHOMEPAGEALL = '/WebMobile/GetVideoHomePageAll'; | |||
| 
 | |||
| //获取读书首页其他所有数据列表
 | |||
| API.GETBOOKHOMEPAGEALL = '/WebMobile/GetEBookHomePageAll'; | |||
| 
 | |||
| // 资料主表ID获取资料主表信息
 | |||
| API.GETCONTENT= '/Docment/GetContent'; | |||
| 
 | |||
| // 获取资料(章节)内容
 | |||
| API.DOCDETAILS= '/Docment/DocDetails'; | |||
| 
 | |||
| // 获取资料目录
 | |||
| API.CATALOG= '/Docment/Catalog'; | |||
| 
 | |||
| //注册验证
 | |||
| API.CHECKREGISTERVERITY = '/Account/CheckRegisterVerityJson'; | |||
| 
 | |||
| //修改密码
 | |||
| API.FORGOTACCOUNT = '/Account/ForgotAccount'; | |||
| 
 | |||
| //获取GetQiniuDomain
 | |||
| API.GETQINIUDOMAIN = '/Dictionary/GetQiniuDomain'; | |||
| 
 | |||
| //猜你还想看
 | |||
| API.GETVIDEOMORE = '/Video/GetMore'; | |||
| 
 | |||
| //根据ID获取视频主表信息
 | |||
| API.GETVIDEOBASE = '/Video/GetVideoBase'; | |||
| 
 | |||
| //加入收藏 POST application/x-www-form-urlencoded
 | |||
| API.SETCOLLECTS = '/MyCollect/SetCollects'; | |||
| 
 | |||
| //根据主表Id获取详情列表并获取进度  GET application/json
 | |||
| API.GETDETAILSANDUSEDBYBASEID = '/Video/GetDetailsAndUsedByBaseIdNew'; | |||
| 
 | |||
| //评论举报  POST  application/x-www-form-urlencoded
 | |||
| API.ADDREPORT = '/Report/AddReport'; | |||
| 
 | |||
| // 根据详情Id获取详情并更新进度   GET application/json
 | |||
| API.GETDETAIlLANDEDITUSEDBYID = '/Video/GetDetailAndEditUsedById'; | |||
| 
 | |||
| //根据目录索引图书详情并更新进度  PUT application/json
 | |||
| API.GETLISTANDUPDATEUSED = '/EBook/GetListAndUpdateUsed'; | |||
| 
 | |||
| //添加书签,笔记,划线  POST application/json
 | |||
| API.ADDBOOKMARK = '/EBook/AddBookMark'; | |||
| 
 | |||
| //移除书签  PUT application/json
 | |||
| API.DELBOOkMARK = '/EBook/DelBookMark'; | |||
| 
 | |||
| // 根据主表Id获取详情列表并获取进度  GET application/json
 | |||
| API.GETBOOKMARKPAGES = '/EBook/GetBookMarkPages'; | |||
| 
 | |||
| //  加入收藏  POST application/x-www-form-urlencoded
 | |||
| API.SetCollects = '/MyCollect/SetCollects'; | |||
| 
 | |||
| //获取问题标签  GET application/json
 | |||
| API.GEQUESTIONSTAGS = '/Question/GetTags'; | |||
|   | |||
| //获取问题列表 GET application/json
 | |||
| API.GETQUESTIONPAGES = '/Question/GetQuestionPages'; | |||
| 
 | |||
| //获取答主榜 GET application/json
 | |||
| API.GETTOPCUSTANSWER = '/Answer/GetTopCustAnswer'; | |||
| 
 | |||
| //搜索视频  GET  application/x-www-form-urlencoded
 | |||
| API.GETVIDEOBASEPAGES = '/Video/GetVideoBasePages'; | |||
| 
 | |||
| //搜索词记录  POST  application/x-www-form-urlencoded
 | |||
| API.ADDHOTSEARCHLOG = '/HotSearch/AddHotSearchLog'; | |||
| 
 | |||
| //获取搜索热词  GET  application/x-www-form-urlencoded
 | |||
| API.GETHOTSEARCH = '/HotSearch/GetHotSearch'; | |||
| 
 | |||
| //获取AI新闻列表  GET  application/x-www-form-urlencoded
 | |||
| API.LISTNEW = '/News/ListNew'; | |||
| 
 | |||
| //获取新闻详情 GET  application/x-www-form-urlencoded
 | |||
| API.NEWSDETAIL = '/News/Detail'; | |||
| 
 | |||
| //猜你喜欢 GET  application/x-www-form-urlencoded
 | |||
| API.GETNEWSMORE = '/News/GetMore'; | |||
| 
 | |||
| //修改用户信息  POST  application/x-www-form-urlencoded
 | |||
| API.EDITUSERINFO = '/Me/EditUserinfo'; | |||
| 
 | |||
| //获取用户信息  GET  application/x-www-form-urlencoded
 | |||
| API.GETUSERINFO = '/Me/GetUserInfo'; | |||
| 
 | |||
| //上传  GET  application/json
 | |||
| API.UPLOADTOKENEASY = '/Me/UploadTokenEasy'; | |||
| 
 | |||
| //七牛云辅助  GET  application/json
 | |||
| API.UPLOADHELPER = '/Me/UploadHelper'; | |||
| 
 | |||
| //查询读者号  GET  application/x-www-form-urlencoded
 | |||
| API.GETCRAD = '/Me/GetCrad'; | |||
| 
 | |||
| //绑定微信  POST  application/x-www-form-urlencoded
 | |||
| API.WECHATBIND = '/Me/WeChatBinding'; | |||
| 
 | |||
| //微信解绑  PUT  application/x-www-form-urlencoded
 | |||
| API.WECHATUNBOUND = '/Me/WeChatUnbound'; | |||
| 
 | |||
| //切换读者证 无toke版  PUT  application/x-www-form-urlencoded
 | |||
| API.CHANGEREADERCODE = '/Account/ChangeReaderCode'; | |||
| 
 | |||
| //切换读者证 toke版  PUT  application/x-www-form-urlencoded
 | |||
| API.CHANGEREADERCODETOKEN = '/Account/ChangeReaderCodeToken'; | |||
| 
 | |||
| //阅刊列表(需登录) GET  application/json
 | |||
| API.GETTHEMEPAGES = '/ThemeList/GetThemePages'; | |||
| 
 | |||
| //阅刊更新点击量 PUT  application/x-www-form-urlencoded
 | |||
| API.UPCLICKNUM = '/ThemeList/UpClickNum'; | |||
| 
 | |||
| //获取微信token  GET  application/json
 | |||
| API.GETWECHATTOkEN = '/WeChat/GetToken'; | |||
| 
 | |||
| //获取微信用户信息  GET  application/json
 | |||
| API.GETWECHATUSERINFO = '/WeChat/GetUserInfo'; | |||
| 
 | |||
| //获取Vr列表 GET  application/json
 | |||
| API.GETVRPAGES = '/VR/GetVRPages'; | |||
| 
 | |||
| //修改手机号获取验证码  POST  application/json
 | |||
| API.CHANGEPHONEMESSAGE = '/Account/ChangePhoneMessage'; | |||
| 
 | |||
| //修改手机号  PUT  application/json
 | |||
| API.EDITPHONE = '/Account/EditPhone'; | |||
| 
 | |||
| //获取活动banner GET 
 | |||
| API.GETACTBANNERS = '/Activity/GetActBanners'; | |||
| 
 | |||
| //获取活动  GET  application/x-www-form-urlencoded
 | |||
| // API.GETRECENT = '/Activity/GetRecent';
 | |||
| 
 | |||
| //线上线下活动混排列表 GET application/x-www-form-urlencoded
 | |||
| API.GETACTALLLIST = '/IndexPc/GetActAllList'; | |||
| 
 | |||
| //线上活动列表 GET application/x-www-form-urlencoded
 | |||
| API.GETACTONLINEPAGES = '/ActOnline/GetActOnlinePages'; | |||
| 
 | |||
| //线下活动列表 GET application/x-www-form-urlencoded
 | |||
| API.GETACTIVITYPAGES = '/Activity/GetActivityPages'; | |||
| 
 | |||
| //获取活动详情  GET  application/x-www-form-urlencoded
 | |||
| API.GETACTIVITYDETAILS = '/Activity/GetActivityDetails'; | |||
| 
 | |||
| //获取走进AI列表  GET  application/json
 | |||
| API.GETAPPROACHLISTPAGES = '/Approach/GetApproachListPages'; | |||
| 
 | |||
| //发送意见反馈 POST application/x-www-form-urlencoded
 | |||
| API.ADDFEEDBACKLITE = '/Feedback/AddFeedbackLite'; | |||
| 
 | |||
| //关于我们 GET application/json
 | |||
| API.GETABOUTOUR = '/OtherInformation/GetInfoPagesLite'; | |||
| 
 | |||
| //关于我们详情 GET application/json
 | |||
| API.GETABOUTOURDETAIL= '/OtherInformation/GetInfoById'; | |||
| 
 | |||
| //获取排行榜  GET  application/json
 | |||
| API.GETTOPBASE = '/Approach/GetTopBase'; | |||
| 
 | |||
| //根据排行榜ID获取榜单  GET application/json
 | |||
| API.GETTOPLISTBYID = '/Approach/GetTopListById'; | |||
| 
 | |||
| //获取走进AI信息  GET  application/json
 | |||
| API.GETAPPROACHBYID = '/Approach/GetApproachById'; | |||
| 
 | |||
| //获取关于TA列表  GET  application/json
 | |||
| API.GETAPPROACHDETAILSLIST = '/Approach/GetApproachDetailsList'; | |||
| 
 | |||
| //获取更多大师  GET  application/json
 | |||
| API.GETAPPROACHLISTMORE = '/Approach/GetApproachListMore'; | |||
| 
 | |||
| //获取关于TA列表-详情-基本信息  GET  application/json
 | |||
| API.GETAPPROACHDETAILSBYID = '/Approach/GetApproachDetailsById'; | |||
| 
 | |||
| //获取关于TA列表 GET  application/json
 | |||
| API.GETAPPROACHDETAILSLISTMORE = '/Approach/GetApproachDetailsListMore'; | |||
| 
 | |||
| //获取所有走进Ai二级分类 GET  application/json
 | |||
| API.GETAPPROACHCLASS = '/Approach/GetClass'; | |||
| 
 | |||
| //系统消息已读  PUT  application/x-www-form-urlencoded
 | |||
| API.EDITMYMESSAGESCHECKED = '/MyMessages/EditMyMessagesChecked'; | |||
| 
 | |||
| //获取消息数量  GET  application/x-www-form-urlencoded
 | |||
| API.GETNUMNOCHECKED = '/MyMessages/GetNumNoChecked'; | |||
| 
 | |||
| //获取我的回复消息  PUT  application/x-www-form-urlencoded
 | |||
| API.EDITMYQUESTIONACHECKED = '/MyMessages/EditMyQuestionAChecked'; | |||
| 
 | |||
| // 获取我的答案的评论回复  GET  application/x-www-form-urlencoded
 | |||
| API.GETMYANSWERCOMMENTPAGES = '/MyMessages/GetMyAnswerCommentPages'; | |||
| 
 | |||
| //获取系统消息  GET  application/x-www-form-urlencoded
 | |||
| API.GETMYMESSAGESPAGES = '/MyMessages/GetMyMessagesPages'; | |||
| 
 | |||
| //回复评论已读  PUT  application/x-www-form-urlencoded
 | |||
| API.EDITMYCOMMENTCHECkED = '/MyMessages/EditMyCommentChecked'; | |||
| 
 | |||
| //根据类型和详情ID获取主表ID跳转  GET  application/x-www-form-urlencoded
 | |||
| API.GETBASEIDBYTYPEANDDETAILSID = '/MyMessages/GetBaseIdByTypeAndDetailsId'; | |||
| 
 | |||
| //获取我的回复消息  GET  application/x-www-form-urlencoded
 | |||
| API.GETMYCOMMENTPAGESNEW = '/MyMessages/GetMyCommentPagesNew'; | |||
| 
 | |||
| //动态列表 GET  application/x-www-form-urlencoded
 | |||
| API.GETDYNAMICPAGES = '/Dynamic/GetDynamicPages'; | |||
| 
 | |||
| //动态列表 POST  application/x-www-form-urlencoded
 | |||
| API.DYNAMICEDITATTN = '/Dynamic/EditAttn'; | |||
| 
 | |||
| //根据动态ID获取详情 GET  application/x-www-form-urlencoded
 | |||
| API.GETDYNAMICBYIDFORAPP = '/Dynamic/GetDynamicByIDForAPP'; | |||
| 
 | |||
| //发布动态 POST  application/x-www-form-urlencoded
 | |||
| API.ADDDYNAMIC = '/Dynamic/AddDynamic'; | |||
| 
 | |||
| //获取第三方个人信息 GET  application/json
 | |||
| API.GETOTHERUSERINFO = '/Me/GetOtherUserInfo'; | |||
| 
 | |||
| //获取第三方问题 GET  application/json
 | |||
| API.GETOTHERQUESTIONPAGES = '/Question/GetOtherQuestionPages'; | |||
| 
 | |||
| //我的关注 GET  application/json
 | |||
| API.MINEATTN = '/Dynamic/MineAttn'; | |||
| 
 | |||
| //获取第三方关注 GET  application/json
 | |||
| API.OTHERATTN = '/Dynamic/OtherAttn'; | |||
| 
 | |||
| //我的粉丝  GET  application/json
 | |||
| API.DYNAMICATTNME = '/Dynamic/AttnMe'; | |||
| 
 | |||
| //获取第三方粉丝 GET  application/json
 | |||
| API.DYNAMICATTNOTHER = '/Dynamic/AttnOther'; | |||
| 
 | |||
| //点赞 PUT  application/x-www-form-urlencoded
 | |||
| API.USELIKE = '/Use/UseLike'; | |||
| 
 | |||
| //获取答案列表 GET  application/x-www-form-urlencoded
 | |||
| API.GETANSEWRPAGES = '/Answer/GetAnswerPages'; | |||
| 
 | |||
| //获取问题详情 GET  application/json
 | |||
| API.GETQUESTIONBYID = '/Question/GetQuestionByID'; | |||
| 
 | |||
| //发布回答 POST  application/x-www-form-urlencoded
 | |||
| API.ADDANSWER = '/Answer/AddAnswer'; | |||
| 
 | |||
| //发布问题 POST  application/x-www-form-urlencoded
 | |||
| API.ADDQUESTION = '/Question/AddQuestion'; | |||
| 
 | |||
| //用户积分明细列表 GET application/json
 | |||
| API.GETCUSTPOINTSLOGPAGES = '/Points/GetCustPointsLogPages'; | |||
| 
 | |||
| //获取我的积分信息(当前) GET application/json
 | |||
| API.GETMYPOINTSINFONOW = '/Points/GetMyPointsInfoNow'; | |||
| 
 | |||
| //添加积分记录 POST application/x-www-form-urlencoded
 | |||
| API.ADDPOINTLOG = '/Points/AddPointLog'; | |||
| 
 | |||
| //根据任务标识获取积分任务并判断任务是否完成  GET application/json
 | |||
| API.GETPOINTSBYCODEANDCHECKISOVER = '/Points/GetPointsByCodeAndCheckIsOver'; | |||
| 
 | |||
| //获取3D列表  GET application/json
 | |||
| API.GETVRLIST = '/IndexPc/GetVRList'; | |||
| 
 | |||
| //我的邀请(邀请回答)  GET application/json
 | |||
| API.GETMYINVITATION = '/Question/GetMyInvitation'; | |||
| 
 | |||
| //邀请我的(邀请回答)  GET application/json
 | |||
| API.GETINVITEME = '/Question/GetInviteMe'; | |||
| 
 | |||
| //邀请回答人员列表(一页显示6人,最多显示5页,共计30人)  GET application/json
 | |||
| API.GETCUSTFORANSWER = '/Question/GetCustForAnswer'; | |||
| 
 | |||
| //添加邀请答题人信息  POST application/x-www-form-urlencoded
 | |||
| API.ADDCUSTFORANSWER = '/Question/AddCustForAnswer'; | |||
| 
 | |||
| //邀请我的标记已读  PUT  application/x-www-form-urlencoded 
 | |||
| API.EDITINVITEMECHECKED = '/MyMessages/EditInviteMeChecked'; | |||
| 
 | |||
| //根据sid获得机构信息   GET application/json
 | |||
| API.GETCLNTBYSID = '/Account/GetClntBySid'; | |||
| 
 | |||
| //微信登录(新用户注册则返回userinfo) POST application/x-www-form-urlencoded
 | |||
| API.WECHATLOGIN = '/Account/WeChatLogin'; | |||
| 
 | |||
| //微信注册  POST application/x-www-form-urlencoded
 | |||
| API.WECHATREGISTER = '/Account/WeChatRegister'; | |||
| 
 | |||
| // 获取问答Banner
 | |||
| API.GETANSWERBANNERS= '/Answer/GetBanners'; | |||
| 
 | |||
| // 获取JS_SDK Config 相关配置参数  GET application/json
 | |||
| API.GETWXJSCONFIG = '/WeChat/GetWXJSConfig'; | |||
| 
 | |||
| // 根据答案Id获取答案详情(APP专用) GET application/json
 | |||
| API.GETANSWERBYIDFORAPP = '/Answer/GetAnswerByIdForApp'; | |||
| 
 | |||
| export default API | |||
| 
 | |||
| 
 | |||
| 
 | |||
| @ -0,0 +1,43 @@ | |||
| /** | |||
|  *  | |||
|  * @file axios封装 | |||
|  * export default http 接口请求 | |||
|  * export addRequestInterceptor 请求前拦截器 | |||
|  * export addResponseInterceptor 请求后拦截器 | |||
|  * export setCookies 同步cookie | |||
|  */ | |||
| import axios from 'axios' | |||
| 
 | |||
| import appConfig from '~/app.config' | |||
| 
 | |||
| const defaultHeaders = { | |||
|   Accept: 'application/json, text/plain, */*; charset=utf-8', | |||
|   'Content-Type': 'application/json; charset=utf-8', | |||
|   Pragma: 'no-cache', | |||
|   'Cache-Control': 'no-cache' | |||
| } | |||
| Object.assign(axios.defaults.headers.common, defaultHeaders) | |||
| 
 | |||
|  axios.defaults.baseURL = appConfig.proxy | |||
| /* if (!process.browser) { | |||
|   axios.defaults.baseURL = `http://${currentIP}:${appConfig.appPort}` | |||
| } */ | |||
| //console.log(axios.defaults.baseURL)
 | |||
| 
 | |||
| const methods = ['get', 'post', 'put', 'delete', 'patch', 'options', 'request', 'head'] | |||
| 
 | |||
| const http = {} | |||
| methods.forEach(method => { | |||
|   http[method] = axios[method].bind(axios) | |||
| }) | |||
| 
 | |||
| export const addRequestInterceptor = (resolve, reject) => { | |||
|   if (axios.interceptors.request.handlers.length === 0) axios.interceptors.request.use(resolve, reject) | |||
| } | |||
| export const addResponseInterceptor = (resolve, reject) => { | |||
|   if (axios.interceptors.response.handlers.length === 0) axios.interceptors.response.use(resolve, reject) | |||
| } | |||
| export const setCookies = Cookies => axios.defaults.headers.cookie = Cookies | |||
| 
 | |||
| 
 | |||
| export default http | |||
| @ -0,0 +1,113 @@ | |||
| 
 | |||
| 
 | |||
| 
 | |||
| export const  Urlencode = str =>  { | |||
|       str = (str + '').toString(); | |||
|       return encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28'). | |||
|       replace(/\)/g, '%29').replace(/\*/g, '%2A').replace(/%20/g, '+'); | |||
| } | |||
| 
 | |||
| export const  isIPhoneX = () =>  { | |||
|    let u = navigator.userAgent; | |||
|    let isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); | |||
|    if (isIOS) { | |||
| 	   if (screen.height == 812 && screen.width == 375) { | |||
| 		   return true; | |||
| 	   } | |||
| 	   else { | |||
| 		   return false; | |||
| 	   } | |||
|    } | |||
| } | |||
| 
 | |||
| //获取url 参数值,并解码
 | |||
| export const  getUnescapeUrlParam = (name) =>  { | |||
| 	let reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i'); | |||
| 	let localUrl = window.location.href.split("?")[1] | |||
| 	let r = localUrl.match(reg); | |||
| 	if (r != null) { | |||
| 		return unescape(r[2]); | |||
| 	} | |||
| 	return null; | |||
| } | |||
| 
 | |||
| // 截取时间
 | |||
| export const cutTime = (val) => { | |||
|   if (val == null) { | |||
|     return val | |||
|   } else { | |||
| 	return val.slice(0, val.indexOf("T"))  | |||
|   } | |||
| } | |||
| 
 | |||
| // 判断是否登录才可操作
 | |||
| export const  isLogin = (proxy,$dialog) =>  { | |||
|     let userData = localStorage.getItem('userData') || ""; | |||
|    	// clientType主要是鉴别当前用户的类型
 | |||
|    	// ClientType = 1 普通用户
 | |||
|    	// ClientType = 0 白名单用户
 | |||
|    	if (JSON.parse(userData).clientType === 0) { | |||
|    		proxy.$dialog.confirm({ | |||
|    			title: '', | |||
|    			message: '该功能需要登录账号!', | |||
|    		}) | |||
|    		.then(() => { | |||
|    			proxy.$router.push('/Login'); | |||
|    		}) | |||
|    		.catch(() => { | |||
|    			console.log('用户点击取消'); | |||
|    		}); | |||
|    		return false; | |||
|    	} | |||
| } | |||
| 
 | |||
| // 时间格式化1 val时间戳数字
 | |||
| export const formatDateDay = (val) => { | |||
| 	let date = new Date(val); | |||
| 	let YY = date.getFullYear() + '-'; | |||
| 	let MM = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'; | |||
| 	let DD = (date.getDate() < 10 ? '0' + (date.getDate()) : date.getDate()); | |||
| 	return YY + MM +  + DD | |||
| } | |||
| 
 | |||
| // 时间格式化2 val时间戳数字
 | |||
| export const formatDateMin = (val) => { | |||
| 	let date = new Date(val); | |||
| 	let YY = date.getFullYear() + '-'; | |||
| 	let MM = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'; | |||
| 	let DD = (date.getDate() < 10 ? '0' + (date.getDate()) : date.getDate()); | |||
| 	let hh = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':'; | |||
| 	let mm = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) + ':'; | |||
| 	let ss = (date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds()); | |||
| 	return YY + MM  + DD +" "+ hh  + mm  + ss; | |||
| } | |||
| 
 | |||
| // 判断是否微信浏览器
 | |||
| export const isWeiXin = () => { | |||
| 	let ua = window.navigator.userAgent.toLowerCase(); | |||
| 	if(ua.match(/MicroMessenger/i) == 'micromessenger'){ | |||
| 	    return true; | |||
| 	}else{ | |||
| 	    return false; | |||
| 	} | |||
| } | |||
| 
 | |||
| //获取url 参数值 (原封不动获取url 参数, 不解码)
 | |||
|  const  getUrlParam = (name) =>  { | |||
| 	let reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i'); | |||
| 	let localUrl = window.location.href.split("?")[1] | |||
| 	let r = localUrl.match(reg); | |||
| 	if (r != null) { | |||
| 		return r[2]; | |||
| 	} | |||
| 	return null; | |||
| } | |||
| 
 | |||
| //检测是否是移动端
 | |||
| const  isMobile = () =>  { | |||
| 	if ((navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i))) { | |||
| 		return true; | |||
| 	} else { | |||
| 		return false; | |||
| 	} | |||
| } | |||
| @ -0,0 +1,152 @@ | |||
| /** | |||
|  * 时间戳 | |||
|  * @param {*} timestamp  时间戳 | |||
|  */ | |||
| const timestampToTime = (timestamp) => { | |||
|     let date = new Date(timestamp) //时间戳为10位需*1000,时间戳为13位的话不需乘1000
 | |||
|     let Y = date.getFullYear() + '-' | |||
|     let M = | |||
|         (date.getMonth() + 1 < 10 ? | |||
|             '0' + (date.getMonth() + 1) : | |||
|             date.getMonth() + 1) + '-' | |||
|     let D = | |||
|         (date.getDate() < 10 ? '0' + date.getDate() : date.getDate()) + ' ' | |||
|     let h = | |||
|         (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':' | |||
|     let m = | |||
|         (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) + | |||
|         ':' | |||
|     let s = | |||
|         date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds() | |||
|     return Y + M + D + h + m + s | |||
| }; | |||
| /** | |||
|  * 存储localStorage | |||
|  */ | |||
| const setStore = (name, content) => { | |||
|     if (!name) return; | |||
|     if (typeof content !== 'string') { | |||
|         content = JSON.stringify(content); | |||
|     } | |||
|     window.localStorage.setItem(name, content); | |||
| } | |||
| 
 | |||
| /** | |||
|  * 获取localStorage | |||
|  */ | |||
| const getStore = name => { | |||
|     if (!name) return; | |||
|     return window.localStorage.getItem(name); | |||
| } | |||
| 
 | |||
| /** | |||
|  * 删除localStorage | |||
|  */ | |||
| const removeStore = name => { | |||
|     if (!name) return; | |||
|     window.localStorage.removeItem(name); | |||
| } | |||
| 
 | |||
| /** | |||
|  * 设置cookie | |||
|  **/ | |||
|  const setCookie = (name, value, day) => { | |||
|     let date = new Date(); | |||
|     date.setDate(date.getDate() + day); | |||
|     document.cookie = name + '=' + value + ';expires=' + date; | |||
| }; | |||
| 
 | |||
| /** | |||
|  * 获取cookie | |||
|  **/ | |||
| const getCookie = name => { | |||
|     let reg = RegExp(name + '=([^;]+)'); | |||
|     let arr = document.cookie.match(reg); | |||
|     if (arr) { | |||
|         return arr[1]; | |||
|     } else { | |||
|         return ''; | |||
|     } | |||
| }; | |||
| 
 | |||
| /** | |||
|  * 删除cookie | |||
|  **/ | |||
|  const  delCookie = name => { | |||
|     setCookie(name, null, -1); | |||
| }; | |||
| 
 | |||
| /* 定义时间戳转时间方法 */ | |||
| const $timetrans = dd => { | |||
|   let date = new Date(dd * 1000);//如果date为10位不需要乘1000
 | |||
|   let Y = date.getFullYear() + '-'; | |||
|   let M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'; | |||
|   let D = (date.getDate() < 10 ? '0' + (date.getDate()) : date.getDate()) + ' '; | |||
|   let h = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':'; | |||
|   let m = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) + ':'; | |||
|   let s = (date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds()); | |||
|   return Y + M + D + h + m + s; | |||
| }; | |||
| const $timeDate = dd => { | |||
|   let date = new Date(dd * 1000); | |||
|   let Y = date.getFullYear() + '-'; | |||
|   let M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'; | |||
|   let D = (date.getDate() < 10 ? '0' + (date.getDate()) : date.getDate()) + ' '; | |||
|   return Y + M + D; | |||
| }; | |||
| const $timeMonth = dd => { | |||
|   let date = new Date(dd * 1000); | |||
|   let M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'; | |||
|   let D = (date.getDate() < 10 ? '0' + (date.getDate()) : date.getDate()) + ' '; | |||
|   return M + D; | |||
| }; | |||
| const $timeHour = dd => { | |||
|   let date = new Date(dd * 1000); | |||
|   let h = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':'; | |||
|   let m = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()); | |||
|   return h + m; | |||
| }; | |||
| 
 | |||
| const $Day = (begintime, endtime) => { | |||
|   let nTime = endtime - begintime; | |||
|   let day = Math.floor(nTime / 86400000); | |||
|   return day; | |||
| }; | |||
| 
 | |||
| /* 生成加密随机数 */ | |||
| const $randomChar = () => { | |||
|   let x = "0123456789qwertyuioplkjhgfdsazxcvbnm"; | |||
|   let tmp = ""; | |||
|   let timestamp = new Date().getTime(); | |||
|   for (let i = 0; i < 13; i++) { | |||
|       tmp += x.charAt(Math.ceil(Math.random() * 100000000) % x.length); | |||
|   } | |||
|   return timestamp + tmp; | |||
| }; | |||
| const $sortObj = (obj) => { | |||
|   let returnObj = []; | |||
|   for (let i = obj.length - 1; i >= 0; i--) { | |||
|       returnObj.push(obj[i]); | |||
|   } | |||
|   return returnObj; | |||
| }; | |||
| 
 | |||
| 
 | |||
| /** | |||
|  * 导出  | |||
|  **/ | |||
| export { | |||
|     $timetrans, | |||
|     $timeDate, | |||
|     $timeMonth, | |||
|     $Day, | |||
|     $sortObj, | |||
|     $randomChar, | |||
|     timestampToTime, | |||
|     setStore, | |||
|     getStore, | |||
|     removeStore, | |||
|     setCookie, | |||
|     getCookie, | |||
|     delCookie | |||
| } | |||
| @ -0,0 +1,388 @@ | |||
| <template> | |||
| 	<div class="main"> | |||
|     <div class="cart-main"> | |||
|       <div class="cart-top"> | |||
|         <div class="cart-num">图书数量<span>(5)</span></div> | |||
|         <span @click="cartDelt">管理</span> | |||
|       </div> | |||
|       <div class="cart-list"> | |||
|         <div class="cart-item"> | |||
|           <div class="list-top"> | |||
|             <van-checkbox v-model="checked"></van-checkbox> | |||
|             <div class="top-info"> | |||
|               <p class="active-name">你选书,我买单<i></i></p> | |||
|               <p class="dealer">京东商城</p> | |||
|             </div> | |||
|           </div> | |||
|           <div class="product-list"> | |||
|             <div class="product-item"> | |||
|               <van-checkbox v-model="checked"></van-checkbox> | |||
|               <div class="product-cont"> | |||
|                 <div class="product-img"><img src="" alt="" /></div> | |||
|                 <div class="product-txt"> | |||
|                   <div class="product-info"> | |||
|                     <h4 class="overflow-txt-only">秒懂AI提问:让人工智能开发大脑 </h4> | |||
|                     <div class="author-date"> | |||
|                       <p class="author overflow-txt-only">秋叶 刘进新 姜梅 定秋枫</p> | |||
|                       <p class="date overflow-txt-only      ">2023年07月</p> | |||
|                     </div> | |||
|                     <div class="intro overflow-txt">精心提炼20种GPT提问方法及指令,从入门到进阶再到精通,100个案例带你玩</div> | |||
|                   </div> | |||
|                   <div class="product-bottom"> | |||
|                     <p class="product-price">实付款 <span><i class="rmb">¥</i>29.0</span><i>129.0</i></p> | |||
|                     <span class="product-num">x1</span> | |||
|                   </div> | |||
|                 </div> | |||
|               </div> | |||
|             </div> | |||
|             <div class="product-item"> | |||
|               <van-checkbox v-model="checked"></van-checkbox> | |||
|               <div class="product-cont"> | |||
|                 <div class="product-img"><img src="" alt="" /></div> | |||
|                 <div class="product-txt"> | |||
|                   <div class="product-info"> | |||
|                     <h4 class="overflow-txt-only">秒懂AI提问:让人工智能开发大脑 </h4> | |||
|                     <div class="author-date"> | |||
|                       <p class="author overflow-txt-only">秋叶 刘进新 姜梅 定秋枫</p> | |||
|                       <p class="date overflow-txt-only      ">2023年07月</p> | |||
|                     </div> | |||
|                     <div class="intro overflow-txt">精心提炼20种GPT提问方法及指令,从入门到进阶再到精通,100个案例带你玩</div> | |||
|                   </div> | |||
|                   <div class="product-bottom"> | |||
|                     <p class="product-price">实付款 <span><i class="rmb">¥</i>29.0</span><i>129.0</i></p> | |||
|                     <span class="product-num">x1</span> | |||
|                   </div> | |||
|                 </div> | |||
|               </div> | |||
|             </div> | |||
|           </div> | |||
|         </div> | |||
| 
 | |||
|         <div class="cart-item"> | |||
|           <div class="list-top"> | |||
|             <van-checkbox v-model="checked"></van-checkbox> | |||
|             <div class="top-info"> | |||
|               <p class="active-name">你选书,我买单<i></i></p> | |||
|               <p class="dealer">京东商城</p> | |||
|             </div> | |||
|           </div> | |||
|           <div class="product-list"> | |||
|             <div class="product-item"> | |||
|               <van-checkbox v-model="checked"></van-checkbox> | |||
|               <div class="product-cont"> | |||
|                 <div class="product-img"><img src="" alt="" /></div> | |||
|                 <div class="product-txt"> | |||
|                   <div class="product-info"> | |||
|                     <h4 class="overflow-txt-only">秒懂AI提问:让人工智能开发大脑 </h4> | |||
|                     <div class="author-date"> | |||
|                       <p class="author overflow-txt-only">秋叶 刘进新 姜梅 定秋枫</p> | |||
|                       <p class="date overflow-txt-only      ">2023年07月</p> | |||
|                     </div> | |||
|                     <div class="intro overflow-txt">精心提炼20种GPT提问方法及指令,从入门到进阶再到精通,100个案例带你玩</div> | |||
|                   </div> | |||
|                   <div class="product-bottom"> | |||
|                     <p class="product-price">实付款 <span><i class="rmb">¥</i>29.0</span><i>129.0</i></p> | |||
|                     <span class="product-num">x1</span> | |||
|                   </div> | |||
|                 </div> | |||
|               </div> | |||
|             </div> | |||
|             <div class="product-item"> | |||
|               <van-checkbox v-model="checked"></van-checkbox> | |||
|               <div class="product-cont"> | |||
|                 <div class="product-img"><img src="" alt="" /></div> | |||
|                 <div class="product-txt"> | |||
|                   <div class="product-info"> | |||
|                     <h4 class="overflow-txt-only">秒懂AI提问:让人工智能开发大脑 </h4> | |||
|                     <div class="author-date"> | |||
|                       <p class="author overflow-txt-only">秋叶 刘进新 姜梅 定秋枫</p> | |||
|                       <p class="date overflow-txt-only      ">2023年07月</p> | |||
|                     </div> | |||
|                     <div class="intro overflow-txt">精心提炼20种GPT提问方法及指令,从入门到进阶再到精通,100个案例带你玩</div> | |||
|                   </div> | |||
|                   <div class="product-bottom"> | |||
|                     <p class="product-price">实付款 <span><i class="rmb">¥</i>29.0</span><i>129.0</i></p> | |||
|                     <span class="product-num">x1</span> | |||
|                   </div> | |||
|                 </div> | |||
|               </div> | |||
|             </div> | |||
|           </div> | |||
|         </div> | |||
|       </div> | |||
|     </div> | |||
|     <div class="cart-pay"> | |||
|       <van-checkbox v-model="checked">全选</van-checkbox> | |||
|       <div v-if="!isDeltHandle" class="payment-right"> | |||
|         <div class="total-num">合计:<span><i class="rmb">¥</i>0</span></div> | |||
|         <p class="pay-btn" @click="goPay">下单</p> | |||
|       </div> | |||
|       <div v-else class="payment-right"> | |||
|         <p class="delt-btn" @click="confirmDelt">删除</p> | |||
|       </div> | |||
|     </div> | |||
| 		<TabBar :tabCur.sync="tabCur" /> | |||
| 	</div> | |||
| </template> | |||
| 
 | |||
| <script> | |||
| import { Toast } from 'vant' | |||
| import { reactive, computed, onMounted, getCurrentInstance, toRefs } from 'vue' | |||
| import TabBar from '@/components/tabBar/index.vue' | |||
| export default { | |||
| 	name: 'Cart', | |||
| 	components: { TabBar }, | |||
| 	setup() { | |||
| 		const { proxy } = getCurrentInstance() | |||
| 		let data = reactive({ | |||
|       tabCur: 1, | |||
| 			checked: false, | |||
|       isDeltHandle: false | |||
| 		}) | |||
| 		onMounted(() => {}) | |||
| 		let goPay = () => { | |||
| 			proxy.$router.push({ path: '/CartResult' }) | |||
| 		} | |||
|     let cartDelt = () =>{ | |||
|       data.isDeltHandle = !data.isDeltHandle | |||
|     } | |||
| 		return { | |||
| 			...toRefs(data), | |||
| 			goPay, | |||
|       cartDelt | |||
| 		} | |||
| 	}, | |||
| } | |||
| </script> | |||
| 
 | |||
| <style scoped lang="scss"> | |||
|   .cart-header{ | |||
|     display: flex; | |||
|     justify-content: flex-end; | |||
|     padding: .175rem .4rem; | |||
|     background-color: #fff; | |||
|     height: 0.7rem; | |||
|     line-height: 0.7rem; | |||
|     font-size: .3rem; | |||
|     color: #191A1A; | |||
|   } | |||
|   .cart-main{ | |||
|     padding: 0.25rem .125rem 2.375rem .125rem; | |||
|     color: #191A1A; | |||
|     .cart-top{ | |||
|       position: fixed; | |||
|       top: 0; | |||
|       right: 0; | |||
|       left: 0; | |||
|       background-color: #F4F4FC; | |||
|       display: flex; | |||
|       justify-content: space-between; | |||
|       align-items: center; | |||
|       font-size: .3rem; | |||
|       padding: .25rem; | |||
|       z-index: 999; | |||
|       .cart-num{ | |||
|         font-size: .3rem; | |||
|         opacity: 0.6; | |||
|         span{ | |||
|           font-size: 0.25rem; | |||
|         } | |||
|       } | |||
|     } | |||
| 
 | |||
|   } | |||
|   .cart-list{ | |||
|     padding-top: .875rem; | |||
|   } | |||
|   .cart-item{ | |||
|     padding: .25rem; | |||
|     margin-bottom: .1875rem; | |||
|     box-shadow: 0px .0375rem 0.75rem 1px rgba(0,0,0,0.08); | |||
|     border-radius: 0.1rem; | |||
|     background-color: #fff; | |||
|     .list-top{ | |||
|       display: flex; | |||
|       justify-content: flex-start; | |||
|       align-items: center; | |||
|       .top-info{ | |||
|         display: flex; | |||
|         flex: 1; | |||
|         justify-content: space-between; | |||
|         align-items: center; | |||
|       } | |||
|       .active-name{ | |||
|         position: relative; | |||
|         padding: 0 0.375rem; | |||
|         font-size: .3rem; | |||
|         background: url('@assets/images/gift.png') no-repeat left center; | |||
| 		    background-size: 0.275rem 0.275rem; | |||
|         &::after{ | |||
|           position: absolute; | |||
|           right: 0; | |||
|           top: 50%; | |||
|           content: ""; | |||
|           width: .2rem; | |||
|           height: .2rem; | |||
|           background: url('@assets/images/arrow.png') no-repeat center center; | |||
| 		      background-size:.2rem .2rem; | |||
|           transform: translateY(-50%) | |||
|         } | |||
|       } | |||
|       .dealer{ | |||
|         padding-left: .4rem; | |||
|         font-size: .3rem; | |||
|         background: url('@assets/images/dealer.png') no-repeat left center; | |||
| 		    background-size: .3rem .3rem; | |||
|       } | |||
|     } | |||
|   } | |||
| 
 | |||
|   .product-list{ | |||
|     .product-item{ | |||
|       display: flex; | |||
|       justify-content: flex-start; | |||
|       margin-top: .25rem; | |||
|       .product-cont{ | |||
|         flex: 1; | |||
|         display: flex; | |||
|         justify-content: flex-start; | |||
|         .product-img{ | |||
|           width: 1.25rem; | |||
|           height: 1.75rem; | |||
|           margin: .125rem 0.2rem 0 0; | |||
|           background-color: #f1f1f1; | |||
|           border-radius: 0.05rem; | |||
|           overflow: hidden; | |||
|         } | |||
|         .product-txt{ | |||
|           flex: 1; | |||
|           .product-info{ | |||
|             h4{ | |||
|               font-size: .3rem; | |||
|             } | |||
|             .author-date{ | |||
|               display: flex; | |||
|               justify-content: flex-start; | |||
|               margin: .075rem 0; | |||
|               p{ | |||
|                 font-size: .25rem; | |||
|                 padding: 0 .05rem; | |||
|                 margin-right: 0.1rem; | |||
|                 background-color: #F4F6FC; | |||
|                 color: #717275; | |||
|               } | |||
|             } | |||
|             .intro{ | |||
|               font-size: .25rem; | |||
|               opacity: 0.6; | |||
|             } | |||
|           } | |||
|           .product-bottom{ | |||
|             display: flex; | |||
|             justify-content: space-between; | |||
|             align-items: center; | |||
|             color: #757676; | |||
|             .product-price{ | |||
|               span{ | |||
|                 display: inline-block; | |||
|                 font-size: .35rem; | |||
|                 font-weight: bold; | |||
|                 color: #000; | |||
|                 margin-right: 0.175rem; | |||
|                 .rmb{ | |||
|                   font-style: normal; | |||
|                   font-size: .25rem; | |||
|                   text-decoration: none; | |||
|                   color: #000; | |||
|                 } | |||
|               } | |||
|               i{ | |||
|                 font-style: normal; | |||
|                 text-decoration: line-through; | |||
|                 color: #FF3871; | |||
|               } | |||
|             } | |||
|           } | |||
|         } | |||
|       } | |||
|     } | |||
|   } | |||
| 
 | |||
|   .cart-pay{ | |||
|     position: fixed; | |||
|     left: 0; | |||
|     right: 0; | |||
|     bottom: 1.225rem; | |||
|     padding: 0 .4rem; | |||
|     height: 1rem; | |||
|     background-color: #fcfcfc; | |||
|     display: flex; | |||
|     justify-content: space-between; | |||
|     align-items: center; | |||
|     .payment-right{ | |||
|       display: flex; | |||
|       justify-content: space-between; | |||
|       align-items: center; | |||
|       font-size: .3rem; | |||
|       .total-num{ | |||
|         font-size: 0.3rem; | |||
|         span{ | |||
|           font-size: .35rem; | |||
|           font-weight: bold;  | |||
|           color: #FF3871; | |||
|           .rmb{ | |||
|             font-style: normal; | |||
|             font-size: .25rem; | |||
|             text-decoration: none; | |||
|           } | |||
|         } | |||
|       } | |||
|       .pay-btn{ | |||
|         width: 1.875rem; | |||
|         height: 0.75rem; | |||
|         margin-left: 0.5rem; | |||
|         line-height: 0.75rem; | |||
|         text-align: center; | |||
|         color: #fff; | |||
|         background: url('@assets/images/btn3.png') no-repeat center center; | |||
|         background-size: 100% 100%; | |||
|       } | |||
|       .delt-btn{ | |||
|         width: 1.875rem; | |||
|         height: 0.75rem; | |||
|         line-height: 0.75rem; | |||
|         font-size: .3rem; | |||
|         color: #000; | |||
|         text-align: center; | |||
|         border: 2px solid #000; | |||
|         opacity: 0.6; | |||
|         border-radius: .625rem; | |||
|       } | |||
|     } | |||
|   } | |||
| 
 | |||
|   .van-checkbox{ | |||
|     margin-right: .15rem; | |||
|   } | |||
| 
 | |||
|   :deep(.van-checkbox__icon){ | |||
|     height:  .325rem; | |||
|   } | |||
|   :deep(.van-checkbox__icon .van-icon){ | |||
|     width: .325rem; | |||
|     height: .325rem; | |||
|     border-color: rgba(0,0,0,.3); | |||
|   } | |||
|   :deep(.van-checkbox__icon--checked .van-icon){ | |||
|     border: none; | |||
|     background: url('@assets/images/selected.png') no-repeat transparent; | |||
| 		background-size: .325rem .325rem; | |||
|   } | |||
|   :deep(.van-icon-success:before){ | |||
|     display: none; | |||
|   } | |||
|   :deep(.van-checkbox__label){ | |||
|     font-size: .3rem; | |||
|   } | |||
| 
 | |||
| </style> | |||
| @ -0,0 +1,107 @@ | |||
| <template> | |||
| 	<div class="main"> | |||
|     <div class="result-header"> | |||
|       <span class="back" @click="toBack"></span> | |||
|       <p>下单成功</p> | |||
|     </div> | |||
|     <div class="result-main"> | |||
|       <img src="@assets/images/xd-status.png" alt="" /> | |||
|       <p>恭喜,您已成功下单</p> | |||
|       <span class="tip">我们会尽快完成审核工作,请耐心等待!</span> | |||
|       <div class="result-btn"> | |||
|         <span>查看订单</span> | |||
|         <span class="result-btn-more" @click="toMoreOrder">再下一单</span> | |||
|       </div> | |||
|     </div> | |||
| 		<TabBar :tabCur.sync="tabCur" /> | |||
| 	</div> | |||
| </template> | |||
| 
 | |||
| <script> | |||
| import { Toast } from 'vant' | |||
| import { reactive, computed, onMounted, getCurrentInstance, toRefs } from 'vue' | |||
| import TabBar from '@/components/tabBar/index.vue' | |||
| export default { | |||
| 	name: 'Cart', | |||
| 	components: { TabBar }, | |||
| 	setup() { | |||
| 		const { proxy } = getCurrentInstance() | |||
| 		let data = reactive({ | |||
|       tabCur: 1 | |||
| 		}) | |||
| 		onMounted(() => {}) | |||
| 		let toBack = () => { | |||
| 			proxy.$router.go(-1); | |||
| 		} | |||
|     let toMoreOrder = () =>{ | |||
|       location.href = './'; | |||
|     } | |||
| 		return { | |||
| 			...toRefs(data), | |||
| 			toBack, | |||
|       toMoreOrder | |||
| 		} | |||
| 	}, | |||
| } | |||
| </script> | |||
| 
 | |||
| <style scoped lang="scss"> | |||
| .result-header{ | |||
|   display: flex; | |||
|   justify-content: space-between; | |||
|   align-items: center; | |||
|   padding: 0 .4rem; | |||
|   height: 1rem; | |||
|   background-color: #fff; | |||
|   box-shadow: 0px .075rem .125rem 1px #EFECEC; | |||
|   .back{ | |||
|     display: block; | |||
|     width: .5rem; | |||
|     height: .5rem; | |||
|     background: url('@assets/images/back.png') no-repeat transparent; | |||
| 		background-size: .5rem .5rem; | |||
|   } | |||
|   P{ | |||
|     flex: 1; | |||
|     text-align: center; | |||
|     font-size: .375rem; | |||
|   } | |||
| } | |||
| .result-main{ | |||
|   display: flex; | |||
|   flex-direction: column; | |||
|   align-items: center; | |||
|   padding-top: 1.875rem; | |||
|   img{ | |||
|     display: block; | |||
|     width: 3.125rem; | |||
|   } | |||
|   p{ | |||
|     margin: .5rem 0 .125rem 0; | |||
|     font-size: .4rem; | |||
|     font-weight: bold; | |||
|   } | |||
|   .tip{ | |||
|     font-size: .325rem; | |||
|   } | |||
|   .result-btn{ | |||
|     margin-top: 1rem; | |||
|     span{ | |||
|       display: inline-block; | |||
|       width: 2.5rem; | |||
|       height: .875rem; | |||
|       line-height: .875rem; | |||
|       margin: 0 .25rem; | |||
|       font-size: .35rem; | |||
|       text-align: center; | |||
|       color: #5A86F4; | |||
|       border: 1px solid #5A86F4; | |||
|       border-radius: .625rem; | |||
|       &.result-btn-more{ | |||
|         background-color: #5A86F4; | |||
|         color: #fff; | |||
|       } | |||
|     } | |||
|   } | |||
| } | |||
| </style> | |||
| @ -0,0 +1,436 @@ | |||
| <template> | |||
| 	<div class="main"> | |||
| 		<!-- <div class="index-header">当前活动</div> --> | |||
| 		<div class="active-main"> | |||
| 			<div class="active-list"> | |||
| 				<div class="active-item"> | |||
| 					<div class="active-img"> | |||
| 						<img src="@assets/images/bookimg.png" alt="" /> | |||
| 						<span>限选3册</span> | |||
| 					</div> | |||
| 					<div class="active-info"> | |||
| 						<div class="active-info-top"> | |||
| 							<h4>你选书,我买单</h4> | |||
| 							<span></span> | |||
| 						</div> | |||
| 					</div> | |||
| 					<div class="active-time"> | |||
| 						活动时间:2023/10/1 - 2023/12/31 | |||
| 					</div> | |||
| 					<div class="active-bottom"> | |||
| 						<p class="active-slogn">新书 · 选书· 下单· 借阅</p> | |||
| 						<span class="active-btn"></span> | |||
| 					</div> | |||
| 				</div> | |||
| 				<div class="active-item"> | |||
| 					<div class="active-img"> | |||
| 						<img src="@assets/images/bookimg.png" alt="" /> | |||
| 						<span>限选3册</span> | |||
| 					</div> | |||
| 					<div class="active-info"> | |||
| 						<div class="active-info-top"> | |||
| 							<h4>你选书,我买单</h4> | |||
| 							<span>活动仅剩最后3天</span> | |||
| 						</div> | |||
| 					</div> | |||
| 					<div class="active-time"> | |||
| 						活动时间:2023/10/1 - 2023/12/31 | |||
| 					</div> | |||
| 					<div class="active-bottom"> | |||
| 						<p class="active-slogn">新书 · 选书· 下单· 借阅</p> | |||
| 						<span class="active-btn"></span> | |||
| 					</div> | |||
| 				</div> | |||
| 				<div class="active-item"> | |||
| 					<div class="active-img"> | |||
| 						<img src="@assets/images/bookimg.png" alt="" /> | |||
| 						<span>限选3册</span> | |||
| 					</div> | |||
| 					<div class="active-info"> | |||
| 						<div class="active-info-top"> | |||
| 							<h4>你选书,我买单</h4> | |||
| 							<span>12.13 09:00开始</span> | |||
| 						</div> | |||
| 					</div> | |||
| 					<div class="active-time"> | |||
| 						活动时间:2023/10/1 - 2023/12/31 | |||
| 					</div> | |||
| 					<div class="active-bottom"> | |||
| 						<p class="active-slogn">新书 · 选书· 下单· 借阅</p> | |||
| 						<span class="active-btn wait-btn"></span> | |||
| 					</div> | |||
| 				</div> | |||
| 			</div> | |||
| 			<div class="active-nodata"> | |||
| 				<img src="@assets/images/nodata.png" alt="" /> | |||
| 			</div> | |||
| 		</div> | |||
| 		<TabBar :tabCur.sync="data.tabCur" /> | |||
| 	</div> | |||
| </template> | |||
| 
 | |||
| <script> | |||
| import { reactive, computed, onMounted, getCurrentInstance } from 'vue' | |||
| import WucTab from '@/components/wuc-tab/wuc-tab.vue' | |||
| import TabBar from '@/components/tabBar/index.vue' | |||
| import { useStore, mapGetters } from 'vuex' | |||
| import { useRoute } from 'vue-router' | |||
| import { isWeiXin } from '@/utils/tool.js' | |||
| import { Toast } from 'vant' | |||
| 
 | |||
| export default { | |||
| 	components: { WucTab, TabBar }, | |||
| 	setup() { | |||
| 		const store = useStore() | |||
| 		const { proxy } = getCurrentInstance() | |||
| 		const data = reactive({ | |||
| 			tabCur: 0, | |||
| 			isWeiXin: true, | |||
| 			weChatUserInfo: {}, | |||
| 			showLoginDialog: false, | |||
| 			isTryOutLogin: true, | |||
| 			key: '', | |||
| 			iv: '', | |||
| 		}) | |||
| 		onMounted(async () => { | |||
| 			data.isWeiXin = isWeiXin() | |||
| 			data.key = CryptoJS.enc.Utf8.parse('0yxk2020aiyx2021') | |||
| 			data.iv = CryptoJS.enc.Utf8.parse('0yxk2020aiyx2021') | |||
| 			let option = proxy.$route.query | |||
| 			if (option.sid) { | |||
| 				localStorage.setItem('aiyxSid', option.sid) | |||
| 				// 外部试用 | |||
| 				if (option.sid == 'aiyxlibmultimediaadmin') { | |||
| 					ToTryLogin() | |||
| 					data.isTryOutLogin = false | |||
| 					localStorage.setItem('isTryout', 1) | |||
| 				} | |||
| 			} | |||
| 
 | |||
| 			/* 登录判断 */ | |||
| 			proxy.isLogin(option) | |||
| 
 | |||
| 			const userData = localStorage.getItem('userData') || '' | |||
| 			if (userData) { | |||
| 			} | |||
| 		}) | |||
| 		let Encrypt = (o) => { | |||
| 			if (typeof o === 'string') { | |||
| 				if (o) { | |||
| 					var srcs = CryptoJS.enc.Utf8.parse(o) | |||
| 					return CryptoJS.AES.encrypt(srcs, data.key, { | |||
| 						keySize: 128 / 8, | |||
| 						iv: data.iv, | |||
| 						mode: CryptoJS.mode.CBC, | |||
| 						padding: CryptoJS.pad.Pkcs7, | |||
| 					}).toString() | |||
| 				} | |||
| 			} else if (typeof o === 'object') { | |||
| 				for (var _o in o) { | |||
| 					if (o[_o]) { | |||
| 						var srcs = CryptoJS.enc.Utf8.parse(o[_o]) | |||
| 						o[_o] = CryptoJS.AES.encrypt(srcs, data.key, { | |||
| 							keySize: 128 / 8, | |||
| 							iv: data.iv, | |||
| 							mode: CryptoJS.mode.CBC, | |||
| 							padding: CryptoJS.pad.Pkcs7, | |||
| 						}).toString() | |||
| 					} | |||
| 				} | |||
| 			} | |||
| 			return o | |||
| 		} | |||
| 		// 试用直接登录 | |||
| 		let ToTryLogin = () => { | |||
| 			let param = { | |||
| 				Phone: 'a0c82379-37c1-d2e3-a2bf-82e0d081787c', | |||
| 				Pwd: Encrypt('123456'), | |||
| 			} | |||
| 			proxy.$http | |||
| 				.post(proxy.$API.LOGIN, param, { | |||
| 					headers: { | |||
| 						'Content-Type': 'application/x-www-form-urlencoded', | |||
| 					}, | |||
| 				}) | |||
| 				.then((res) => { | |||
| 					if (res.type == 200) { | |||
| 						localStorage.setItem( | |||
| 							'userData', | |||
| 							JSON.stringify(res.data) | |||
| 						) | |||
| 						localStorage.setItem( | |||
| 							'userphone', | |||
| 							'a0c82379-37c1-d2e3-a2bf-82e0d081787c' | |||
| 						) | |||
| 						if (localStorage.getItem('actOnlinePage')) { | |||
| 							const actionUrl = | |||
| 								localStorage.getItem('actonlineLink') | |||
| 							location.href = actionUrl | |||
| 						} else { | |||
| 							location.href = '/' | |||
| 						} | |||
| 					} else if (res.type == 403) { | |||
| 						Toast(res.content) | |||
| 						setTimeout(() => { | |||
| 							// let url = '/ChangeMineCard?custId=' + res.data.custId | |||
| 							// proxy.$router.push(url) | |||
| 						}, 1000) | |||
| 					} else { | |||
| 						Toast(res.content) | |||
| 					} | |||
| 				}) | |||
| 				.catch((res) => { | |||
| 					console.log(res) | |||
| 				}) | |||
| 		} | |||
| 		/* 登录判断 */ | |||
| 		let isLogin = (option) => { | |||
| 			/* 如果微信code 存在, 则获取微信用户信息进行微信登录或者注册 */ | |||
| 			if (option.code) { | |||
| 				localStorage.setItem('aiyxWeChatLoginStatus', 'noLogin') | |||
| 				proxy.getWeChatUserInfo() | |||
| 				localStorage.setItem('aiyxWeChatCode', option.code) | |||
| 			} else { | |||
| 				const userData = localStorage.getItem('userData') || '' | |||
| 				if (!userData) { | |||
| 					data.showLoginDialog = true | |||
| 				} | |||
| 			} | |||
| 		} | |||
| 		// 微信登录 | |||
| 		let weChatLogin = () => { | |||
| 			if (!data.isWeiXin) { | |||
| 				Toast('请使用微信登录') | |||
| 				return | |||
| 			} | |||
| 			let homeUrl = location.protocol + '//' + location.host | |||
| 			let url = | |||
| 				'https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxd2a2989d0fb9cf1c&redirect_uri=' + | |||
| 				homeUrl + | |||
| 				'&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect' | |||
| 			location.href = url | |||
| 		} | |||
| 		/* 获取微信用户信息 */ | |||
| 		let getWeChatUserInfo = () => { | |||
| 			const that = data | |||
| 			let option = proxy.$route.query | |||
| 			let param = { | |||
| 				Code: option.code || '', | |||
| 			} | |||
| 			proxy.$http | |||
| 				.post(proxy.$API.WECHATLOGIN, param, { | |||
| 					headers: { | |||
| 						'Content-Type': 'application/x-www-form-urlencoded', | |||
| 					}, | |||
| 				}) | |||
| 				.then((res) => { | |||
| 					if (res.type == 200) { | |||
| 						data.showLoginDialog = false | |||
| 						if (res.data) { | |||
| 							localStorage.setItem( | |||
| 								'userData', | |||
| 								JSON.stringify(res.data) | |||
| 							) | |||
| 							localStorage.setItem('userphone', res.data.phone) | |||
| 							localStorage.setItem( | |||
| 								'aiyxWeChatLoginStatus', | |||
| 								'isLogin' | |||
| 							) | |||
| 						} | |||
| 						console.log('微信登录成功') | |||
| 					} else if (res.type == 203 && res.data) { | |||
| 						that.weChatUserInfo = res.data | |||
| 						localStorage.setItem( | |||
| 							'weChatUserInfo', | |||
| 							JSON.stringify(that.weChatUserInfo) | |||
| 						) | |||
| 						// proxy.$router.push('/bindMobilePhone') | |||
| 					} else { | |||
| 						console.log(res.content) | |||
| 					} | |||
| 				}) | |||
| 				.catch((res) => { | |||
| 					console.log(res) | |||
| 				}) | |||
| 		} | |||
| 
 | |||
| 		/* 获取token 和用户信息 */ | |||
| 		let getTokenAndUserInfo = () => { | |||
| 			if (!location.search) { | |||
| 				return | |||
| 			} | |||
| 			let code = proxy.$route.query.code | |||
| 			if (code) { | |||
| 				proxy.$http | |||
| 					.get(proxy.$API.GETWECHATTOkEN, { | |||
| 						params: { Code: code }, | |||
| 					}) | |||
| 					.then((res) => { | |||
| 						if (res.type == 200) { | |||
| 							let data = res.data | |||
| 							let access_token = data.access_token | |||
| 							let openid = data.openid | |||
| 							proxy.$http | |||
| 								.get(proxy.$API.GETWECHATUSERINFO, { | |||
| 									params: { | |||
| 										AccessToken: access_token, | |||
| 										OpenId: openid, | |||
| 									}, | |||
| 								}) | |||
| 								.then((res) => { | |||
| 									if (res.type == 200) { | |||
| 										let datas = res.data | |||
| 										alert( | |||
| 											'我的昵称是:' + | |||
| 												datas.nickname + | |||
| 												',我的openid是:' + | |||
| 												datas.openid + | |||
| 												',我的城市是:' + | |||
| 												datas.city | |||
| 										) | |||
| 									} | |||
| 								}) | |||
| 								.catch((res) => { | |||
| 									console.log(res) | |||
| 								}) | |||
| 						} | |||
| 					}) | |||
| 					.catch((res) => { | |||
| 						console.log(res) | |||
| 					}) | |||
| 			} | |||
| 		} | |||
| 		return { | |||
| 			data, | |||
| 			Encrypt, | |||
| 			ToTryLogin, | |||
| 			isLogin, | |||
| 			getTokenAndUserInfo, | |||
| 			weChatLogin, | |||
| 			getWeChatUserInfo, | |||
| 		} | |||
| 	}, | |||
| } | |||
| </script> | |||
| 
 | |||
| <style lang="scss" scoped> | |||
| .index-header { | |||
| 	padding: 0 0.4rem; | |||
| 	height: 1.125rem; | |||
| 	line-height: 1.125rem; | |||
| 	font-size: 0.5rem; | |||
| 	color: #fff; | |||
| 	background-color: #5a86f4; | |||
| } | |||
| .active-main{ | |||
|   padding-bottom: 1.475rem; | |||
| } | |||
| .active-list { | |||
| 	padding: 0 0.4rem; | |||
| 	font-size: 0.3rem; | |||
| 	color: #191a1a; | |||
| 	.active-item { | |||
| 		background-color: #fff; | |||
| 		margin-top: 0.25rem; | |||
| 		box-shadow: 0px 0.0375rem 0.75rem 1px rgba(0, 0, 0, 0.08); | |||
| 		border-radius: 0.1rem; | |||
| 		.active-img { | |||
| 			position: relative; | |||
| 			// height: 3.55rem; | |||
| 			img { | |||
| 				display: block; | |||
| 				width: 100%; | |||
| 			} | |||
| 			span { | |||
| 				position: absolute; | |||
| 				top: 0; | |||
| 				left: 0; | |||
| 				display: block; | |||
| 				padding: 0 0.125rem; | |||
| 				height: 0.6rem; | |||
| 				line-height: 0.6rem; | |||
| 				font-size: 0.3rem; | |||
| 				text-align: center; | |||
| 				color: #fff; | |||
| 				background-color: rgba(0, 0, 0, 0.4); | |||
| 				border-radius: 0.1rem 0 0.1rem 0; | |||
| 			} | |||
| 		} | |||
| 		.active-info { | |||
| 			margin-top: 0.25rem; | |||
| 			padding: 0 0.25rem; | |||
| 			.active-info-top { | |||
| 				display: flex; | |||
| 				justify-content: flex-start; | |||
| 				h4 { | |||
| 					margin-right: 0.125rem; | |||
| 					font-size: 0.45rem; | |||
| 					font-weight: 800; | |||
| 				} | |||
| 				span { | |||
| 					margin-top: 0.225rem; | |||
| 					color: #f3a916; | |||
| 				} | |||
| 			} | |||
| 		} | |||
| 		.active-time { | |||
| 			padding: 0 0.25rem 0 0.625rem; | |||
| 			background: url('@assets/images/time.png') no-repeat 0.25rem center; | |||
| 			background-size: 0.325rem 0.325rem; | |||
| 		} | |||
| 		.active-bottom { | |||
| 			display: flex; | |||
| 			justify-content: space-between; | |||
| 			align-items: center; | |||
| 			padding: 0.125rem 0.25rem 0.15rem 0.25rem; | |||
| 			.active-slogn { | |||
| 				position: relative; | |||
| 				height: 0.55rem; | |||
| 				line-height: 0.55rem; | |||
| 				font-size: 0.25rem; | |||
| 				padding: 0 0.15rem; | |||
| 				background-color: #f4f6fc; | |||
| 				border-radius: 0.05rem; | |||
| 				&::before { | |||
| 					content: ''; | |||
| 					position: absolute; | |||
| 					top: -0.1rem; | |||
| 					left: 0.15rem; | |||
| 					width: 0.175rem; | |||
| 					height: 0.175rem; | |||
| 					background: url('@assets/images/yh1.png') no-repeat; | |||
| 					background-size: 100% 100%; | |||
| 				} | |||
| 				&::after { | |||
| 					content: ''; | |||
| 					position: absolute; | |||
| 					bottom: -0.1rem; | |||
| 					right: 0.15rem; | |||
| 					width: 0.175rem; | |||
| 					height: 0.175rem; | |||
| 					background: url('@assets/images/yh2.png') no-repeat; | |||
| 					background-size: 100% 100%; | |||
| 				} | |||
| 			} | |||
| 			.active-btn { | |||
| 				width: 2.28rem; | |||
| 				height: 0.75rem; | |||
| 				background: url('@assets/images/btn1.png') no-repeat; | |||
| 				background-size: 100% 100%; | |||
| 				&.wait-btn { | |||
| 					background: url('@assets/images/btn2.png') no-repeat; | |||
| 					background-size: 100% 100%; | |||
| 				} | |||
| 			} | |||
| 		} | |||
| 	} | |||
| } | |||
| 
 | |||
| .active-nodata { | |||
| 	img { | |||
| 		display: block; | |||
| 		width: 5rem; | |||
| 		margin: 0 auto; | |||
| 	} | |||
| } | |||
| </style> | |||
| @ -0,0 +1,316 @@ | |||
| <template> | |||
| 	<div class="main"> | |||
| 		<div class="mine-top"> | |||
| 			<div class="user-main"> | |||
| 				<div class="user-info"> | |||
| 					<div class="user-img"> | |||
| 						<img src="" alt="" /> | |||
| 					</div> | |||
| 					<p class="user-name">张秀才</p> | |||
| 					<div class="user-tip">欢迎来到爱图图书</div> | |||
| 				</div> | |||
| 				<div class="user-card"> | |||
| 					<p>NO.10078398329</p> | |||
| 					<span>切换证号</span> | |||
| 				</div> | |||
| 			</div> | |||
| 		</div> | |||
|     <div class="mine-content"> | |||
|       <div class="mine-item mine-order"> | |||
|         <div class="mini-title"> | |||
|           <h4>我的订单</h4> | |||
|           <span>查看全部</span> | |||
|         </div> | |||
|         <div class="order-handle"> | |||
|           <div class="order-item"> | |||
|             <div class="order-icon"> | |||
|               <img src="@assets/images/d-she.png" alt="" /> | |||
|               <i>1</i> | |||
|             </div> | |||
|             <p>待审核</p> | |||
|           </div> | |||
|           <div class="order-item"> | |||
|             <div class="order-icon"> | |||
|               <img src="@assets/images/d-fh.png" alt="" /> | |||
|               <!-- <i></i> --> | |||
|             </div> | |||
|             <p>待发货</p> | |||
|           </div> | |||
|           <div class="order-item"> | |||
|             <div class="order-icon"> | |||
|               <img src="@assets/images/d-shuo.png" alt="" /> | |||
|               <!-- <i></i> --> | |||
|             </div> | |||
|             <p>待收货</p> | |||
|           </div> | |||
|           <div class="order-item"> | |||
|             <div class="order-icon"> | |||
|               <img src="@assets/images/y-wc.png" alt="" /> | |||
|               <!-- <i></i> --> | |||
|             </div> | |||
|             <p>已完成</p> | |||
|           </div> | |||
|           <div class="order-item"> | |||
|             <div class="order-icon"> | |||
|               <img src="@assets/images/y-qx.png" alt="" /> | |||
|               <!-- <i></i> --> | |||
|             </div> | |||
|             <p>已取消</p> | |||
|           </div> | |||
|         </div> | |||
|         <div class="log-info"> | |||
|           <div class="log-img"> | |||
|             <img src="" alt="" /> | |||
|           </div> | |||
|           <div class="log-txt"> | |||
|             <div class="log-num">顺丰速运 SF1629871960733</div> | |||
|             <div class="logo-cont overflow-txt-only">[鄂州市]快件离开  【湖北武昌转运中心】</div> | |||
|           </div> | |||
|         </div> | |||
|       </div> | |||
|       <div class="mine-item mine-lend"> | |||
|         <div class="mini-title"> | |||
|           <h4>我的借阅</h4> | |||
|           <span>查看全部</span> | |||
|         </div> | |||
|         <div class="order-handle"> | |||
|           <div class="order-item"> | |||
|             <div class="order-icon"> | |||
|               <img src="@assets/images/lending.png" alt="" /> | |||
|             </div> | |||
|             <p>借阅中</p> | |||
|           </div> | |||
|           <div class="order-item"> | |||
|             <div class="order-icon"> | |||
|               <img src="@assets/images/return.png" alt="" /> | |||
|             </div> | |||
|             <p>已归还</p> | |||
|           </div> | |||
|         </div> | |||
|       </div> | |||
|       <div class="mine-item mine-lend"> | |||
|         <div class="mini-title"> | |||
|           <h4>更多设置</h4> | |||
|         </div> | |||
|         <div class="setting"> | |||
|           <div class="setting-item">我的收货地址</div> | |||
|           <div class="setting-item">帮助与反馈</div> | |||
|           <div class="setting-item">关于我们</div> | |||
|         </div> | |||
|       </div> | |||
|     </div> | |||
| 		<TabBar :tabCur.sync="data.tabCur" /> | |||
| 	</div> | |||
| </template> | |||
| 
 | |||
| <script> | |||
| import { Toast } from 'vant' | |||
| import { reactive, computed, onMounted, getCurrentInstance, watch } from 'vue' | |||
| import TabBar from '@/components/tabBar/index.vue' | |||
| export default { | |||
| 	name: 'Mine', | |||
| 	components: { TabBar }, | |||
| 	setup() { | |||
| 		const { proxy } = getCurrentInstance() | |||
| 		let data = reactive({ | |||
| 			tabCur: 2, | |||
| 		}) | |||
| 		onMounted(() => {}) | |||
| 		return { | |||
| 			data | |||
| 		} | |||
| 	}, | |||
| } | |||
| </script> | |||
| 
 | |||
| <style scoped lang="scss"> | |||
| .mine-top { | |||
|   position: relative; | |||
| 	width: 100%; | |||
| 	height: 140px; | |||
| 	background: url('@assets/images/minebg.png') no-repeat left top; | |||
| 	background-size: 100% 100%; | |||
| 	.user-main { | |||
| 		margin: 1.625rem.2rem 0 .2rem; | |||
|     padding-bottom: .4rem; | |||
| 		background-color: #fff; | |||
|     border-radius: 0.1rem; | |||
| 	} | |||
|   .user-info{ | |||
|     display: flex; | |||
|     justify-content: flex-start; | |||
|     align-items: center; | |||
|     padding-top: .225rem; | |||
|     .user-img{ | |||
|       width: 1.5rem; | |||
|       height: 1.5rem; | |||
|       margin: -0.625rem 0 0 .75rem; | |||
|       border-radius: 50%; | |||
|       overflow: hidden; | |||
|       background-color: #fff; | |||
|       img{ | |||
|         display: block; | |||
|         width: 1.45rem; | |||
|       } | |||
|     } | |||
|     .user-name{ | |||
|       font-size: 0.4rem; | |||
|       flex: 1; | |||
|       margin-left: 0.1875rem; | |||
|     } | |||
|     .user-tip{ | |||
|       position: relative; | |||
|       padding: 0.2rem .2rem .2rem .375rem; | |||
|       margin-right: .2rem; | |||
|       font-size: .25rem; | |||
|       background-color: #EEF6FE; | |||
|       border-radius: .1rem; | |||
|       &::before{  | |||
|         position: absolute; | |||
|         left: -0.225rem; | |||
|         top: 50%; | |||
|         width: .45rem; | |||
|         height: .45rem; | |||
|         content: ""; | |||
|         background: url('@assets/images/hi.png') no-repeat; | |||
|         background-size: 100% 100%; | |||
|         transform: translateY(-50%); | |||
|       } | |||
|     } | |||
|   } | |||
|   .user-card{ | |||
|     display: flex; | |||
|     justify-content: space-between; | |||
|     padding: .125rem .225rem; | |||
|     margin: .325rem .2rem 0 .2rem; | |||
|     height: .7rem; | |||
|     line-height: .7rem; | |||
|     font-size: .325rem; | |||
|     background-color: #DEEEFC; | |||
|     border-radius: .1rem; | |||
|     p{ | |||
|       font-weight: bold; | |||
|     } | |||
|     span{ | |||
|       display: block; | |||
|       padding: 0 .15rem; | |||
|       background-color: #2B3C74; | |||
|       color: #fff; | |||
|       border-radius: 0.1rem; | |||
|     } | |||
|   } | |||
| } | |||
| .mine-content{ | |||
|   margin: 2rem 0 1.25rem 0; | |||
|   padding: 0 .2rem; | |||
| } | |||
| .mine-item{ | |||
|   margin-bottom: .25rem; | |||
|   padding: .3125rem .2rem .375rem .2rem; | |||
|   background-color: #fff; | |||
|   border-radius: 0.1rem; | |||
|   .mini-title{ | |||
|     display: flex; | |||
|     justify-content: space-between; | |||
|     align-items: center; | |||
|     font-size: .4rem; | |||
|     margin-bottom: .375rem; | |||
|     span{ | |||
|       font-size: .3rem; | |||
|       padding-right: .25rem; | |||
|       background: url('@assets/images/arrow.png') no-repeat right center; | |||
| 	    background-size: .2rem .2rem; | |||
|     } | |||
|   } | |||
| } | |||
| 
 | |||
| .order-handle{ | |||
|   display: flex; | |||
|   justify-content: flex-start; | |||
|   align-items: center; | |||
|   text-align: center; | |||
|   .order-item{ | |||
|     flex: 1; | |||
|     .order-icon{ | |||
|       position: relative; | |||
|       width: .6rem; | |||
|       margin: 0 auto .2rem auto; | |||
|       img{ | |||
|         display: block; | |||
|         width: .6rem; | |||
|         height: .6rem; | |||
|       } | |||
|       i{ | |||
|         position: absolute; | |||
|         right: -0.1rem; | |||
|         top: -0.15rem; | |||
|         height: .3rem; | |||
|         line-height: .3rem; | |||
|         padding:  0 .1rem; | |||
|         font-size: .25rem; | |||
|         font-style: normal; | |||
|         color: #fff; | |||
|         background-color: #FF3871; | |||
|         border-radius: .15rem; | |||
|       } | |||
|     } | |||
|     p{ | |||
|       font-size: .325rem; | |||
|     } | |||
|   } | |||
| } | |||
| 
 | |||
| .log-info{ | |||
|   display: flex; | |||
|   justify-content: space-between; | |||
|   padding: .2rem; | |||
|   margin-top: 0.325rem; | |||
|   background-color: #F5F8FF; | |||
|   border-radius: .1rem; | |||
|   .log-img{ | |||
|     width: 0.925rem; | |||
|     height: 1.125rem; | |||
|     background-color: #f3f3f3; | |||
|     border-radius: .1rem; | |||
|     overflow: hidden; | |||
|     img{ | |||
|       display: block; | |||
|       width: 100%; | |||
|     } | |||
|   } | |||
|   .log-txt{ | |||
|     flex: 1; | |||
|     margin-left: .2rem; | |||
|     .log-num{ | |||
|       font-size: .35rem; | |||
|       line-height: .625rem; | |||
|     } | |||
|     .logo-cont{ | |||
|       font-size: .3rem; | |||
|     } | |||
|   } | |||
| } | |||
| 
 | |||
| .mine-lend{ | |||
|   .order-handle{ | |||
|     .order-item{ | |||
|       width: 20%; | |||
|       flex: none; | |||
|     } | |||
|   } | |||
| } | |||
| 
 | |||
| .setting{ | |||
|   .setting-item{ | |||
|     margin-bottom: 0.5rem; | |||
|     font-size: .325rem; | |||
|     height: 0.525rem; | |||
|     line-height: 0.525rem; | |||
|     background: url('@assets/images/arrow.png') no-repeat right center; | |||
| 	  background-size: .2rem .2rem; | |||
|     &:last-child{ | |||
|       margin-bottom: .125rem; | |||
|     } | |||
|   } | |||
| } | |||
| </style> | |||
| @ -0,0 +1,13 @@ | |||
| import { createStore } from 'vuex' | |||
| import home from './modules/home' | |||
| 
 | |||
| 
 | |||
| 
 | |||
| export function _createStore() { | |||
|   return createStore({ | |||
| 	  modules: { | |||
|       home | |||
| 	  } | |||
|   }) | |||
| } | |||
| 
 | |||
| @ -0,0 +1,187 @@ | |||
| import { createStore } from 'vuex' | |||
| // 引入http请求
 | |||
| import $http from '@/utils/http' | |||
| 
 | |||
| import API from '@/utils/api' | |||
| 
 | |||
| 
 | |||
| const state = () => ({ | |||
| 	 count: 1, | |||
| 	 testResult: null, | |||
| 	 materialList:[], | |||
| 	 bannerList:[], | |||
| 	 newsList:[], | |||
| 	 videoList:[], | |||
| 	 bookList:[], | |||
| 	 VRList:[] | |||
| }) | |||
| 
 | |||
| 
 | |||
| const getters =  { | |||
| 	getCount:state => state.count, | |||
| 	getTestResult: state => state.testResult, | |||
| 	getDoc: state => state.materialList, | |||
| 	getVideoList: state => state.videoList, | |||
| 	getBookList: state => state.bookList, | |||
| 	getNewsList: state => state.newsList, | |||
| 	getBanners: state => state.bannerList, | |||
| 	getVRList: state => state.VRList, | |||
| 	getDocBanners: state => state.docBannerList | |||
| } | |||
| 
 | |||
| const mutations = { | |||
|   INCREMENT: (state) => { | |||
|     state.count++ | |||
|   }, | |||
|   DECREMENT: (state) => { | |||
|     state.count-- | |||
|   }, | |||
|   INITCOUNT: (state, COUNT) => { | |||
|     state.count = COUNT | |||
|   }, | |||
|   TESTRESULT: (state, data) => { | |||
|     state.testResult = data | |||
|   }, | |||
|   GETDOC: (state, data) => { | |||
|     state.materialList = data | |||
|   }, | |||
|   GETVIDEO: (state, data) => { | |||
|     state.videoList = data | |||
|   }, | |||
|   GETEBOOKS: (state, data) => { | |||
|     state.bookList = data | |||
|   }, | |||
|   GETNEWS: (state, data) => { | |||
|     state.newsList = data | |||
|   }, | |||
|   GETBANNERS: (state, data) => { | |||
|     state.bannerList = data | |||
|   }, | |||
|   GETDOCBANNERS: (state, data) => { | |||
|     state.docBannerList = data | |||
|   }, | |||
|   GETVRLIST: (state, data) => { | |||
|     state.VRList = data | |||
|   } | |||
| } | |||
| 
 | |||
| const actions = { | |||
|   increment({ state, commit }) { | |||
|     commit('INCREMENT') | |||
|   }, | |||
|   decrement({ state, commit }) { | |||
|     commit('DECREMENT') | |||
|   }, | |||
|   loading({ commit, state }) { | |||
|     return $http.get(API.GETBANNERS) | |||
|       .then(res => { | |||
|         commit('TESTRESULT', res) | |||
|       }) | |||
|   }, | |||
|   getDoc({  commit, state }) { | |||
| 	     | |||
|     	return $http.get(API.GETDOC,{ | |||
| 			params: { | |||
| 				nShow: 3 | |||
| 			} | |||
| 	   }) | |||
| 	   .then(res => { | |||
| 			if (res.type == 200) { | |||
| 			   commit('GETDOC',  res.data) | |||
| 			} | |||
| 	   }) | |||
|   }, | |||
|   getVideoList({  commit, state }) { | |||
|     	return $http.get(API.GETVIDEO,{ | |||
|   			params: { | |||
|   				nShow: 4 | |||
|   			} | |||
|   	   }) | |||
|   	   .then(res => { | |||
|   			if (res.type == 200) { | |||
|   			   commit('GETVIDEO',  res.data) | |||
|   			} | |||
|   	   }) | |||
|   }, | |||
|   getVRList({  commit, state }) { | |||
|     	return $http.get(API.GETVRLIST,{ | |||
|   			params: { | |||
|   				nShow: 4 | |||
|   			} | |||
|   	   }) | |||
|   	   .then(res => { | |||
|   			if (res.type == 200) { | |||
|   			   commit('GETVRLIST',  res.data) | |||
|   			} | |||
|   	   }) | |||
|   }, | |||
|   getBookList({  commit, state }) { | |||
|     	return $http.get(API.GETEBOOKS,{ | |||
|   			params: { | |||
|   				nShow: 6 | |||
|   			} | |||
|   	   }) | |||
|   	   .then(res => { | |||
|   			if (res.type == 200) { | |||
|   			   commit('GETEBOOKS',  res.data) | |||
|   			} | |||
|   	   }) | |||
|   }, | |||
|   getNewsList({ commit, state }) { | |||
|     	return $http.get(API.GETNEWS,{ | |||
|   			params: { | |||
|   				nShow: 5 | |||
|   			} | |||
|   	   }) | |||
|   	   .then(res => { | |||
|   			if (res.type == 200) { | |||
|   			   commit('GETNEWS',  res.data) | |||
|   			} | |||
|   	   }) | |||
|   }, | |||
|     getBanners({ commit, state }) { | |||
|     	return $http.get(API.GETBANNERS,{ | |||
|   			params: { | |||
|   				nShow: 5 | |||
|   			} | |||
|   	   }) | |||
|   	   .then(res => { | |||
|   			if (res.type == 200) { | |||
|   			   commit('GETBANNERS',  res.data) | |||
|   			} | |||
|   	   }) | |||
|   }, | |||
|   getDocBanners({ commit, state }) { | |||
| 	    let Authorization = ""; | |||
| 	    if (localStorage) { | |||
| 	  	   const userData =  JSON.parse(localStorage.getItem('userData')) || ""; | |||
| 	  	   if (userData) { | |||
| 	  		  Authorization = "Bearer " + userData.token; | |||
| 	  	   }  | |||
| 	    } | |||
|     	return $http.get(API.GETDOCBANNER,{ | |||
| 			params:  { | |||
| 				 nShow: 5 | |||
| 			}, | |||
| 			headers: { | |||
| 				Authorization: Authorization | |||
| 			} | |||
|   	   }) | |||
|   	   .then(res => { | |||
|   			if (res.type == 200) { | |||
|   			   commit('GETDOCBANNER', res.data) | |||
|   			} | |||
|   	   }) | |||
|   }, | |||
|   resetCount({ commit }) { | |||
|     commit('INITCOUNT', 67) | |||
|   } | |||
| } | |||
| 
 | |||
| 
 | |||
| export default { | |||
| 	 state, | |||
| 	 mutations, | |||
| 	 actions, | |||
| 	 getters | |||
| } | |||
| @ -0,0 +1,41 @@ | |||
| import { createStore } from 'vuex' | |||
| 
 | |||
| 
 | |||
| const state = () => ({ | |||
|   userInfo: '' | |||
| }) | |||
| 
 | |||
| 
 | |||
| const getters =  { | |||
| 	getUserInfo:state => state.userInfo | |||
| } | |||
| 
 | |||
| const mutations = { | |||
|   LOGIN: (state,data) => { | |||
|     state.userInfo = data; | |||
|     localStorage.setItem("userInfo", data); | |||
|   }, | |||
|   LOGOUT: (state) => { | |||
|     state.userInfo = ''; | |||
|     localStorage.setItem("userInfo", ''); | |||
|   }, | |||
|   | |||
| } | |||
| 
 | |||
| const actions = { | |||
|   login({ state, commit }) { | |||
|     commit('LOGIN') | |||
|   }, | |||
|   logout({ state, commit }) { | |||
|     commit('LOGOUT') | |||
|   } | |||
| } | |||
| 
 | |||
| 
 | |||
| 
 | |||
| export default { | |||
|   state, | |||
|   mutations, | |||
|   actions, | |||
|   getters | |||
| } | |||
| @ -0,0 +1,157 @@ | |||
| import { createStore } from 'vuex' | |||
| // 引入http请求
 | |||
| import $http from '@/utils/http' | |||
| 
 | |||
| import API from '@/utils/api' | |||
| 
 | |||
| 
 | |||
| const state = () => ({ | |||
| 	 bookBaseList: [], | |||
| }) | |||
| 
 | |||
| 
 | |||
| const getters =  { | |||
| 	getBookBase:state => state.bookBaseList, | |||
| } | |||
| 
 | |||
| const mutations = { | |||
|   GETBOOKBASEDATA: (state, data) => { | |||
|     state.bookBaseList = data | |||
|   } | |||
| } | |||
| 
 | |||
| let that = { | |||
| 	ebookId:global.ebookId, | |||
| 	ResourceId:global.ResourceId, | |||
| 	userData: global.userData | |||
| } | |||
| console.log('global') | |||
| 
 | |||
| 	// 根据目录索引图书详情并更新进度【New】
 | |||
| let GetListAndUpdateUsed = (Booklink, BooklinkTitle, PathId = "") => { | |||
| 	//console.log(that.detailData);
 | |||
| 	let param = { | |||
| 		BaseId: that.ebookId, | |||
| 		ResourceId: that.ResourceId, | |||
| 		Booklink: Booklink, | |||
| 		BooklinkTitle: BooklinkTitle, | |||
| 		tPath: PathId | |||
| 	} | |||
| 	proxy.$http | |||
| 		.put(proxy.$API.GETLISTANDUPDATEUSED, | |||
| 		param | |||
| 	   ) | |||
| 	.then(res => { | |||
| 		if (res.type == 200) { | |||
| 			let resData = res.data; | |||
| 			console.log(resData)  | |||
| 			that.directoryList = JSON.parse( | |||
| 				resData.tResource.navigation | |||
| 			).MenuData; | |||
| 		} else { | |||
| 			// that.$message.error(response.data.content);
 | |||
| 		} | |||
| 	}) | |||
| 	.catch((res) => { | |||
| 		console.log(res) | |||
| 	}) | |||
| } | |||
| 
 | |||
| 
 | |||
|  // 根据图书主表Id和图书资源主表Id获取图书资源信息并获取进度【New】
 | |||
| let GetResourceAndUsedByResourceId = () => { | |||
| 	let that = data; | |||
| 	let  param = { | |||
| 		BaseId: that.ebookId, | |||
| 		ResourceId: that.ResourceId | |||
| 	} | |||
| 	proxy.$http | |||
| 		.get(proxy.$API.GETRESOURCEANDUSEDBYRESOURCEID, | |||
| 			{ | |||
| 				params: param | |||
| 			} | |||
| 	   ) | |||
| 	.then(res => { | |||
| 		if (res.type == 200) { | |||
| 		  let resData = res.data; | |||
| 		  if (that.keyId == "reading") { | |||
| 			if (resData.tUsed.length == 0) { | |||
| 				that.ItemIndex = 0; | |||
| 				GetListAndUpdateUsed( | |||
| 					that.directoryList[0].Key, | |||
| 					that.directoryList[0].Title | |||
| 				); | |||
| 			} else { | |||
| 				that.directoryList.forEach((e, index) => { | |||
| 					if (e.Key == resData.tUsed[0].scheduleOne) { | |||
| 					  that.ItemIndex = index; | |||
| 					} | |||
| 				}); | |||
| 				GetListAndUpdateUsed( | |||
| 					resData.tUsed[0].scheduleOne, | |||
| 					resData.tUsed[0].scheduleOneTitle | |||
| 				); | |||
| 			} | |||
| 		  } else { | |||
| 			that.directoryList.forEach((e, index) => { | |||
| 				if (e.Key == that.keyId) { | |||
| 					that.ItemIndex = index; | |||
| 					GetListAndUpdateUsed(e.Key, e.Title); | |||
| 				} | |||
| 			}); | |||
| 		  } | |||
| 		  console.log(resData); | |||
| 		} else { | |||
| 			//that.message = res.data.content
 | |||
| 			//that.messageShow = true; 
 | |||
| 		} | |||
| 	}) | |||
| 	.catch((res) => { | |||
| 		console.log(res) | |||
| 	}) | |||
| } | |||
| 
 | |||
| 
 | |||
| const actions = { | |||
|     getBookBase({ commit, state }) { | |||
| 		console.log(77) | |||
| 		 let Authorization = ""; | |||
| 		if (that.userData) { | |||
| 		    const userData =  JSON.parse(that.userData) || ""; | |||
| 		    console.log(userData) | |||
| 		    if (userData) { | |||
| 			  Authorization = "Bearer " + userData.token; | |||
| 		    }  | |||
| 		} | |||
| 		console.log(Authorization) | |||
|     	return $http.get(API.GETBASEANDDETAILSID,{ | |||
| 			params:  { | |||
| 				 BaseId: that.ebookId | |||
| 			}, | |||
| 			headers: { | |||
| 				Authorization: Authorization | |||
| 			} | |||
|   	   }) | |||
|   	   .then(res => { | |||
| 		   console.log(res) | |||
|   			if (res.type == 200) { | |||
|   			   //commit('GETBOOKBASEDATA', res.data)
 | |||
| 			   let resData =  res.data; | |||
| 			   that.directoryList = JSON.parse( | |||
| 			   	resData.tResource.navigation | |||
| 			   ).MenuData; | |||
| 			   // console.log(that.directoryList);
 | |||
| 			   GetResourceAndUsedByResourceId(); | |||
|   			} | |||
|   	   }) | |||
|     } | |||
| 	 | |||
| } | |||
| 
 | |||
| 
 | |||
| export default { | |||
| 	 state, | |||
| 	 mutations, | |||
| 	 actions, | |||
| 	 getters | |||
| } | |||
| @ -0,0 +1,58 @@ | |||
| import { defineConfig } from 'vite' | |||
| import vue from '@vitejs/plugin-vue' | |||
| import path from 'path' | |||
| import { createSvgIconsPlugin } from 'vite-plugin-svg-icons' | |||
| 
 | |||
| const baseUrl = { | |||
|   development: './', | |||
|   beta: './', | |||
|   release: './' | |||
| } | |||
| 
 | |||
| // https://vitejs.dev/config/
 | |||
| export default ({ mode }) =>  defineConfig({ | |||
|   plugins: [ | |||
|     vue(), | |||
|     createSvgIconsPlugin({ | |||
|         // 指定需要缓存的图标文件夹
 | |||
|         iconDirs: [path.resolve(process.cwd(), 'src/assets/img/icons')], | |||
|         // 指定symbolId格式
 | |||
|         symbolId: 'icon-[name]', | |||
|       }), | |||
|   ], | |||
|   base: baseUrl[mode], | |||
|   build: { | |||
|     minify: 'terser', | |||
|     terserOptions: { | |||
|       compress: { | |||
|         // 生产环境打包移除console
 | |||
|         drop_console: true, | |||
|         drop_debugger: true, | |||
|       } | |||
|     } | |||
|   }, | |||
|   resolve: { | |||
|     alias: { | |||
|       '~': path.resolve(__dirname, './'), | |||
|       '@': path.resolve(__dirname, 'src'), | |||
|       '@assets': path.resolve(__dirname, 'src/assets'), | |||
|     } | |||
|   }, | |||
|   css: { | |||
|     preprocessorOptions: { | |||
|       less: { | |||
|         additionalData:  '@import "./src/assets/style/global.less";' | |||
|       } | |||
|     } | |||
|   }, | |||
|   server: { | |||
|     port: 8089, | |||
|     proxy: { | |||
|       '/api': { | |||
|         target: 'http://192.168.99.111:5001', | |||
|         changeOrigin: true, | |||
|         rewrite: path => path.replace(/^\/api/, '') | |||
|       } | |||
|     } | |||
|   } | |||
| }) | |||