Nick930826
4 years ago
124 changed files with 7273 additions and 680 deletions
-
674LICENSE
-
108README.md
-
11config/index.js
-
14index.html
-
925package-lock.json
-
35package.json
-
BINpublic/favicon.ico
-
187src/App.vue
-
BINsrc/assets/logo.png
-
135src/components/DialogAddCategory.vue
-
143src/components/DialogAddGood.vue
-
162src/components/DialogAddSwiper.vue
-
25src/components/Footer.vue
-
136src/components/Header.vue
-
69src/main.js
-
95src/router/index.js
-
35src/utils/axios.js
-
27src/utils/index.js
-
113src/views/Account.vue
-
257src/views/AddGood.vue
-
213src/views/Category.vue
-
163src/views/Good.vue
-
168src/views/Guest.vue
-
169src/views/Index.vue
-
211src/views/IndexConfig.vue
-
108src/views/Introduce.vue
-
129src/views/Login.vue
-
276src/views/Order.vue
-
124src/views/OrderDetail.vue
-
190src/views/Swiper.vue
-
1theme/alert.css
-
1theme/aside.css
-
1theme/autocomplete.css
-
1theme/avatar.css
-
1theme/backtop.css
-
1theme/badge.css
-
1theme/base.css
-
0theme/breadcrumb-item.css
-
1theme/breadcrumb.css
-
0theme/button-group.css
-
1theme/button.css
-
1theme/calendar.css
-
1theme/card.css
-
1theme/carousel-item.css
-
1theme/carousel.css
-
1theme/cascader-panel.css
-
1theme/cascader.css
-
0theme/checkbox-button.css
-
0theme/checkbox-group.css
-
1theme/checkbox.css
-
1theme/col.css
-
0theme/collapse-item.css
-
1theme/collapse.css
-
1theme/color-picker.css
-
1theme/container.css
-
1theme/date-picker.css
-
1theme/dialog.css
-
1theme/display.css
-
1theme/divider.css
-
1theme/drawer.css
-
0theme/dropdown-item.css
-
0theme/dropdown-menu.css
-
1theme/dropdown.css
-
BINtheme/fonts/element-icons.ttf
-
BINtheme/fonts/element-icons.woff
-
1theme/footer.css
-
0theme/form-item.css
-
1theme/form.css
-
1theme/header.css
-
1theme/icon.css
-
1theme/image.css
-
1theme/index.css
-
0theme/infinite-scroll.css
-
0theme/infiniteScroll.css
-
1theme/input-number.css
-
1theme/input.css
-
1theme/link.css
-
1theme/loading.css
-
1theme/main.css
-
0theme/menu-item-group.css
-
0theme/menu-item.css
-
1theme/menu.css
-
1theme/message-box.css
-
1theme/message.css
-
1theme/notification.css
-
1theme/option-group.css
-
1theme/option.css
-
1theme/page-header.css
-
1theme/pagination.css
-
1theme/popconfirm.css
-
1theme/popover.css
-
1theme/popper.css
-
1theme/progress.css
-
1theme/radio-button.css
-
1theme/radio-group.css
-
1theme/radio.css
-
1theme/rate.css
-
1theme/reset.css
-
1theme/row.css
-
1theme/scrollbar.css
@ -1,674 +0,0 @@ |
|||
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>. |
@ -1,13 +1,109 @@ |
|||
Vue 3.0 + Vite 2.0 + Vue-Router 4.0 + Element-Plus + Echart 5.0 + Axios 后台管理系统。 |
|||
# vue3-admin |
|||
|
|||
![vue3-elementplus](https://user-images.githubusercontent.com/10935614/111867361-619e2100-89ae-11eb-847c-77b668835f91.png) |
|||
Vue 3.0 + Vite 2.0 + Vue-Router 4.0 + Element-Plus + Echarts 5.0 + Axios 后台管理系统。 |
|||
|
|||
目前,开发的部分已经完成,主要是测试整体功能,然后修改和完善一些细节。2021 年 3 月初已经自测了几遍,近几天会找些朋友帮忙测试一下,想要参与测试的可以进群交流。 |
|||
<img src="https://user-images.githubusercontent.com/10935614/111867361-619e2100-89ae-11eb-847c-77b668835f91.png" alt="vue3-elementplus" style="zoom: 33%;" /> |
|||
|
|||
![Build Status](https://img.shields.io/badge/build-passing-green.svg) |
|||
![Version 3.0.0](https://img.shields.io/badge/version-3.0.0-yellow.svg) |
|||
[![License](https://img.shields.io/badge/license-GPL3.0-blue.svg)](https://github.com/newbee-ltd/newbee-mall-vue3-app/blob/master/LICENSE) |
|||
|
|||
newbee-mall 项目是一套电商系统,基于 Spring Boot 2.X 和 Vue 以及相关技术栈开发。 前台商城系统包含首页门户、商品分类、新品上线、首页轮播、商品推荐、商品搜索、商品展示、购物车、订单结算、订单流程、个人订单管理、会员中心、帮助中心等模块。 后台管理系统包含数据面板、轮播图管理、商品管理、订单管理、会员管理、分类管理、设置等模块。 |
|||
|
|||
**vue3-admin** **版本线上预览地址:**[http://vue3-admin.newbee.ltd](http://vue3-admin.newbee.ltd)。 |
|||
|
|||
本仓库中的源码为新蜂商城前后端分离版本的后台管理系统(Vue 版本为 3.x),主要面向前端开发人员,后端 API 源码在另外一个仓库 [newbee-mall-api](https://github.com/newbee-ltd/newbee-mall-api)。 |
|||
|
|||
前后端分离版本包括四个仓库: |
|||
|
|||
- [新蜂商城后端接口 newbee-mall-api](https://github.com/newbee-ltd/newbee-mall-api) |
|||
- [新蜂商城 Vue2 版本 newbee-mall-vue-app](https://github.com/newbee-ltd/newbee-mall-vue-app) |
|||
- [新蜂商城 Vue3 版本 newbee-mall-vue3-app](https://github.com/newbee-ltd/newbee-mall-vue3-app) |
|||
- [新蜂商城后台管理系统 Vue3 版本 vue3-admin](https://github.com/newbee-ltd/vue3-admin) |
|||
|
|||
**坚持不易,如果觉得项目还不错的话可以给项目一个 Star 吧,也是对我一直更新代码的一种鼓励啦,谢谢各位的支持。** |
|||
|
|||
![newbee-mall-info](https://newbee-mall.oss-cn-beijing.aliyuncs.com/poster/store/newbee-mall-star.png) |
|||
|
|||
关注公众号:**程序员的小故事**,回复"勾搭"进群交流。 |
|||
|
|||
![wx-gzh](https://newbee-mall.oss-cn-beijing.aliyuncs.com/wx-gzh/%E6%89%AB%E7%A0%81%E5%85%B3%E6%B3%A8.png) |
|||
|
|||
## 开发及部署文档 |
|||
|
|||
- [开篇词:通关Vue3.0 企业级项目开发,升职加薪快人一步](https://juejin.cn/book/6933939264455442444) |
|||
- [项目须知和课程约定](https://juejin.cn/book/6933939264455442444) |
|||
- [大势所趋:“前后端分离”开发模式](https://juejin.cn/book/6933939264455442444) |
|||
- [Vue 3.0 简介及开发环境搭建](https://juejin.cn/book/6933939264455442444) |
|||
- [Vue 3.0 组合 API 入口 Setup 浅析](https://juejin.cn/book/6933939264455442444) |
|||
- [Vue 3.0 之响应式系统 API](https://juejin.cn/book/6933939264455442444) |
|||
- [Vue 3.0 之生命周期钩子函数、提供注入](https://juejin.cn/book/6933939264455442444) |
|||
- [Vue 3.0 性能和业务层面上的提升](https://juejin.cn/book/6933939264455442444) |
|||
- [Vite 2.0 原理分析及简单插件编写](https://juejin.cn/book/6933939264455442444) |
|||
- [Vue-Router 4.x 使用方法及路由原理](https://juejin.cn/book/6933939264455442444) |
|||
- [Vue 3.0 实战项目启动篇](https://juejin.cn/book/6933939264455442444) |
|||
- [后端 API 开发技术选型之 Spring Boot](https://juejin.cn/book/6933939264455442444) |
|||
- [后端基础运行环境和开发工具准备](https://juejin.cn/book/6933939264455442444) |
|||
- [Spring Boot 项目搭建及快速上手](https://juejin.cn/book/6933939264455442444) |
|||
- [Spring Boot 实践之 Web 功能开发](https://juejin.cn/book/6933939264455442444) |
|||
- [Spring Boot 实践之文件上传处理](https://juejin.cn/book/6933939264455442444) |
|||
- [Spring Boot 实践之整合 MyBatis 操作数据库](https://juejin.cn/book/6933939264455442444) |
|||
- [Spring Boot 实践之整合 Lombok](https://juejin.cn/book/6933939264455442444) |
|||
- [Spring Boot 实践之整合 Swagger 生成接口文档](https://juejin.cn/book/6933939264455442444) |
|||
- [后端 API 项目启动和运行注意事项](https://juejin.cn/book/6933939264455442444) |
|||
- [接口参数处理和统一响应结果](https://juejin.cn/book/6933939264455442444) |
|||
- [API 接口开发实战之用户登录接口开发](https://juejin.cn/book/6933939264455442444) |
|||
- [API 接口开发实战之用户身份认证详解](https://juejin.cn/book/6933939264455442444) |
|||
- [API 接口开发实战之轮播图管理模块接口开发](https://juejin.cn/book/6933939264455442444) |
|||
- [API 接口开发实战之商品分类管理模块接口开发](https://juejin.cn/book/6933939264455442444) |
|||
- [API 接口开发实战之商品管理模块接口开发](https://juejin.cn/book/6933939264455442444) |
|||
- [API 接口开发实战之商品配置管理模块接口开发](https://juejin.cn/book/6933939264455442444) |
|||
- [API 接口开发实战之订单管理模块接口开发](https://juejin.cn/book/6933939264455442444) |
|||
- [前后端鉴权的四种方式](https://juejin.cn/book/6933939264455442444) |
|||
- [Vite 2.0 + Vue 3.0 + Element-plus 搭建管理后台项目](https://juejin.cn/book/6933939264455442444) |
|||
- [Vue 3.0 实战之管理后台左右栏目布局](https://juejin.cn/book/6933939264455442444) |
|||
- [Vue 3.0 实战之登录鉴权](https://juejin.cn/book/6933939264455442444) |
|||
- [Vue 3.0 实战之首页大盘数据](https://juejin.cn/book/6933939264455442444) |
|||
- [Vue 3.0 实战之首页配置](https://juejin.cn/book/6933939264455442444) |
|||
- [Vue 3.0 实战之分类管理](https://juejin.cn/book/6933939264455442444) |
|||
- [Vue 3.0 实战之商品管理](https://juejin.cn/book/6933939264455442444) |
|||
- [Vue 3.0 实战之订单管理](https://juejin.cn/book/6933939264455442444) |
|||
- [Vue 3.0 实战之会员管理、账户修改](https://juejin.cn/book/6933939264455442444) |
|||
- [pm2 实现一键部署云端服务器](https://juejin.cn/book/6933939264455442444) |
|||
- [常见问题汇总讲解](https://juejin.cn/book/6933939264455442444) |
|||
|
|||
## 联系作者 |
|||
|
|||
> 大家有任何问题或者建议都可以在 [issues](https://github.com/newbee-ltd/vue3-admin/issues) 中反馈给我,我会慢慢完善这个项目。 |
|||
|
|||
- 我的邮箱:2449207463@qq.com |
|||
- QQ技术交流群:707779034 932227898 |
|||
|
|||
预计一周内将第一版本的代码全部开源让大家体验和练手,大家耐心等待几天即可,Star 和关注可以先点起来了呦!很需要各位小伙伴的支持! |
|||
## 软件著作权 |
|||
|
|||
>本系统已申请软件著作权,受国家版权局知识产权以及国家计算机软件著作权保护! |
|||
|
|||
![](https://newbee-mall.oss-cn-beijing.aliyuncs.com/poster/store/newbee-mall-copyright.png) |
|||
|
|||
## 页面展示 |
|||
|
|||
以下为 vue3-admin 系统的部分页面预览图: |
|||
|
|||
![preview](https://user-images.githubusercontent.com/10935614/111867147-251df580-89ad-11eb-924f-6140b70a2cc0.png) |
|||
|
|||
## 感谢 |
|||
|
|||
- [Vue 3.0](https://vue3js.cn/docs/zh/) |
|||
- [Element-Plus](https://element-plus.gitee.io/#/zh-CN) |
|||
- [Vite 2.0](https://cn.vitejs.dev/) |
|||
- [Vue-Router](https://next.router.vuejs.org/zh/index.html) |
|||
- [Echar 5.0](https://echarts.apache.org/zh/index.html) |
|||
- [Axios](http://www.axios-js.com/) |
|||
|
|||
## 捐助 |
|||
|
|||
[开发记录:一个 Vue 3 + element-plus 的后台管理系统](https://blog.csdn.net/ZHENFENGSHISAN/article/details/115047097) |
|||
全部捐赠,将用于后续的开源项目和服务器的开销 |
|||
|
|||
![preview](https://user-images.githubusercontent.com/10935614/111867147-251df580-89ad-11eb-924f-6140b70a2cc0.png) |
|||
| 支付宝 | 微信支付 | QQ钱包 | |
|||
| :------: | :------: | :------: | |
|||
| <img width="200" height="200" src="https://s.yezgea02.com/1617009373128/4771617009362_.pic.jpg"> | <img width="200" height="200" src="https://s.yezgea02.com/1617009369561/4761617009362_.pic.jpg"> | <img width="200" height="200" src="https://s.yezgea02.com/1617009376339/4781617009362_.pic.jpg"> | |
@ -0,0 +1,11 @@ |
|||
export default { |
|||
development: { |
|||
baseUrl: '/api' // 测试接口域名
|
|||
}, |
|||
beta: { |
|||
baseUrl: '//backend-api-02.newbee.ltd/manage-api/v1' // 测试接口域名
|
|||
}, |
|||
release: { |
|||
baseUrl: '//backend-api-02.newbee.ltd/manage-api/v1' // 正式接口域名
|
|||
} |
|||
} |
@ -0,0 +1,14 @@ |
|||
<!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="http://mall.newbee.ltd/favicon.ico"> |
|||
<title>vue3-admin</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> |
|||
</body> |
|||
</html> |
@ -0,0 +1,925 @@ |
|||
{ |
|||
"name": "newbee-admin", |
|||
"version": "0.0.0", |
|||
"lockfileVersion": 1, |
|||
"requires": true, |
|||
"dependencies": { |
|||
"@babel/code-frame": { |
|||
"version": "7.12.13", |
|||
"resolved": "https://registry.npm.taobao.org/@babel/code-frame/download/@babel/code-frame-7.12.13.tgz", |
|||
"integrity": "sha1-3PyCa+72XnXFDiHTg319lXmN1lg=", |
|||
"dev": true, |
|||
"requires": { |
|||
"@babel/highlight": "^7.12.13" |
|||
} |
|||
}, |
|||
"@babel/generator": { |
|||
"version": "7.13.9", |
|||
"resolved": "https://registry.npm.taobao.org/@babel/generator/download/@babel/generator-7.13.9.tgz", |
|||
"integrity": "sha1-Onqpb577jivkLTjYDizrTGTY3jk=", |
|||
"dev": true, |
|||
"requires": { |
|||
"@babel/types": "^7.13.0", |
|||
"jsesc": "^2.5.1", |
|||
"source-map": "^0.5.0" |
|||
}, |
|||
"dependencies": { |
|||
"source-map": { |
|||
"version": "0.5.7", |
|||
"resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", |
|||
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", |
|||
"dev": true |
|||
} |
|||
} |
|||
}, |
|||
"@babel/helper-function-name": { |
|||
"version": "7.12.13", |
|||
"resolved": "https://registry.npm.taobao.org/@babel/helper-function-name/download/@babel/helper-function-name-7.12.13.tgz", |
|||
"integrity": "sha1-k61lbbPDwiMlWf17LD29y+DrN3o=", |
|||
"dev": true, |
|||
"requires": { |
|||
"@babel/helper-get-function-arity": "^7.12.13", |
|||
"@babel/template": "^7.12.13", |
|||
"@babel/types": "^7.12.13" |
|||
} |
|||
}, |
|||
"@babel/helper-get-function-arity": { |
|||
"version": "7.12.13", |
|||
"resolved": "https://registry.npm.taobao.org/@babel/helper-get-function-arity/download/@babel/helper-get-function-arity-7.12.13.tgz?cache=0&sync_timestamp=1612314686467&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-get-function-arity%2Fdownload%2F%40babel%2Fhelper-get-function-arity-7.12.13.tgz", |
|||
"integrity": "sha1-vGNFHUA6OzCCuX4diz/lvUCR5YM=", |
|||
"dev": true, |
|||
"requires": { |
|||
"@babel/types": "^7.12.13" |
|||
} |
|||
}, |
|||
"@babel/helper-module-imports": { |
|||
"version": "7.12.13", |
|||
"resolved": "https://registry.npm.taobao.org/@babel/helper-module-imports/download/@babel/helper-module-imports-7.12.13.tgz", |
|||
"integrity": "sha1-7GfkQE9BdQRj5FXMMgP2oy6T/LA=", |
|||
"dev": true, |
|||
"requires": { |
|||
"@babel/types": "^7.12.13" |
|||
} |
|||
}, |
|||
"@babel/helper-split-export-declaration": { |
|||
"version": "7.12.13", |
|||
"resolved": "https://registry.npm.taobao.org/@babel/helper-split-export-declaration/download/@babel/helper-split-export-declaration-7.12.13.tgz?cache=0&sync_timestamp=1612314686094&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-split-export-declaration%2Fdownload%2F%40babel%2Fhelper-split-export-declaration-7.12.13.tgz", |
|||
"integrity": "sha1-6UML4AuvPoiw4T5vnU6vITY3KwU=", |
|||
"dev": true, |
|||
"requires": { |
|||
"@babel/types": "^7.12.13" |
|||
} |
|||
}, |
|||
"@babel/helper-validator-identifier": { |
|||
"version": "7.12.11", |
|||
"resolved": "https://registry.npm.taobao.org/@babel/helper-validator-identifier/download/@babel/helper-validator-identifier-7.12.11.tgz", |
|||
"integrity": "sha1-yaHwIZF9y1zPDU5FPjmQIpgfye0=" |
|||
}, |
|||
"@babel/highlight": { |
|||
"version": "7.13.10", |
|||
"resolved": "https://registry.npm.taobao.org/@babel/highlight/download/@babel/highlight-7.13.10.tgz", |
|||
"integrity": "sha1-qLKmYUj1sn1maxXYF3Q0enMdUtE=", |
|||
"dev": true, |
|||
"requires": { |
|||
"@babel/helper-validator-identifier": "^7.12.11", |
|||
"chalk": "^2.0.0", |
|||
"js-tokens": "^4.0.0" |
|||
} |
|||
}, |
|||
"@babel/parser": { |
|||
"version": "7.13.4", |
|||
"resolved": "https://registry.npm.taobao.org/@babel/parser/download/@babel/parser-7.13.4.tgz?cache=0&sync_timestamp=1614080660818&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fparser%2Fdownload%2F%40babel%2Fparser-7.13.4.tgz", |
|||
"integrity": "sha1-NAIRsNqUo1Gm8Q5jZx+nJzM9E6s=" |
|||
}, |
|||
"@babel/template": { |
|||
"version": "7.12.13", |
|||
"resolved": "https://registry.npm.taobao.org/@babel/template/download/@babel/template-7.12.13.tgz", |
|||
"integrity": "sha1-UwJlvooliduzdSOETFvLVZR/syc=", |
|||
"dev": true, |
|||
"requires": { |
|||
"@babel/code-frame": "^7.12.13", |
|||
"@babel/parser": "^7.12.13", |
|||
"@babel/types": "^7.12.13" |
|||
} |
|||
}, |
|||
"@babel/traverse": { |
|||
"version": "7.13.0", |
|||
"resolved": "https://registry.npm.taobao.org/@babel/traverse/download/@babel/traverse-7.13.0.tgz?cache=0&sync_timestamp=1614034824831&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Ftraverse%2Fdownload%2F%40babel%2Ftraverse-7.13.0.tgz", |
|||
"integrity": "sha1-bZV1JHX4bufe0GU23jCaZfyJZsw=", |
|||
"dev": true, |
|||
"requires": { |
|||
"@babel/code-frame": "^7.12.13", |
|||
"@babel/generator": "^7.13.0", |
|||
"@babel/helper-function-name": "^7.12.13", |
|||
"@babel/helper-split-export-declaration": "^7.12.13", |
|||
"@babel/parser": "^7.13.0", |
|||
"@babel/types": "^7.13.0", |
|||
"debug": "^4.1.0", |
|||
"globals": "^11.1.0", |
|||
"lodash": "^4.17.19" |
|||
} |
|||
}, |
|||
"@babel/types": { |
|||
"version": "7.13.0", |
|||
"resolved": "https://registry.npm.taobao.org/@babel/types/download/@babel/types-7.13.0.tgz?cache=0&sync_timestamp=1614034819122&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Ftypes%2Fdownload%2F%40babel%2Ftypes-7.13.0.tgz", |
|||
"integrity": "sha1-dEJNKBbwFxtBAPCrNOmjdO/ff4A=", |
|||
"requires": { |
|||
"@babel/helper-validator-identifier": "^7.12.11", |
|||
"lodash": "^4.17.19", |
|||
"to-fast-properties": "^2.0.0" |
|||
} |
|||
}, |
|||
"@popperjs/core": { |
|||
"version": "2.9.1", |
|||
"resolved": "https://registry.npm.taobao.org/@popperjs/core/download/@popperjs/core-2.9.1.tgz?cache=0&sync_timestamp=1615219280778&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40popperjs%2Fcore%2Fdownload%2F%40popperjs%2Fcore-2.9.1.tgz", |
|||
"integrity": "sha1-f1VOc2jJq2eaEfSgQsoXFJ1wzxI=" |
|||
}, |
|||
"@vitejs/plugin-vue": { |
|||
"version": "1.1.5", |
|||
"resolved": "https://registry.npm.taobao.org/@vitejs/plugin-vue/download/@vitejs/plugin-vue-1.1.5.tgz", |
|||
"integrity": "sha1-+h6OXgScNeITZy4z9z/oFwatXb4=", |
|||
"dev": true |
|||
}, |
|||
"@vue/compiler-core": { |
|||
"version": "3.0.6", |
|||
"resolved": "https://registry.npm.taobao.org/@vue/compiler-core/download/@vue/compiler-core-3.0.6.tgz", |
|||
"integrity": "sha1-Jlu+BxGoGrTBNE+ClOIuLQjKFn0=", |
|||
"requires": { |
|||
"@babel/parser": "^7.12.0", |
|||
"@babel/types": "^7.12.0", |
|||
"@vue/shared": "3.0.6", |
|||
"estree-walker": "^2.0.1", |
|||
"source-map": "^0.6.1" |
|||
} |
|||
}, |
|||
"@vue/compiler-dom": { |
|||
"version": "3.0.6", |
|||
"resolved": "https://registry.npm.taobao.org/@vue/compiler-dom/download/@vue/compiler-dom-3.0.6.tgz", |
|||
"integrity": "sha1-+Uw5WTIKElKRW9ArlD+Wp+4/yVE=", |
|||
"requires": { |
|||
"@vue/compiler-core": "3.0.6", |
|||
"@vue/shared": "3.0.6" |
|||
} |
|||
}, |
|||
"@vue/compiler-sfc": { |
|||
"version": "3.0.6", |
|||
"resolved": "https://registry.npm.taobao.org/@vue/compiler-sfc/download/@vue/compiler-sfc-3.0.6.tgz?cache=0&sync_timestamp=1614200554857&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fcompiler-sfc%2Fdownload%2F%40vue%2Fcompiler-sfc-3.0.6.tgz", |
|||
"integrity": "sha1-OUX3OpPVKGh5nx4zKnW7iEmXask=", |
|||
"dev": true, |
|||
"requires": { |
|||
"@babel/parser": "^7.12.0", |
|||
"@babel/types": "^7.12.0", |
|||
"@vue/compiler-core": "3.0.6", |
|||
"@vue/compiler-dom": "3.0.6", |
|||
"@vue/compiler-ssr": "3.0.6", |
|||
"@vue/shared": "3.0.6", |
|||
"consolidate": "^0.16.0", |
|||
"estree-walker": "^2.0.1", |
|||
"hash-sum": "^2.0.0", |
|||
"lru-cache": "^5.1.1", |
|||
"magic-string": "^0.25.7", |
|||
"merge-source-map": "^1.1.0", |
|||
"postcss": "^8.1.10", |
|||
"postcss-modules": "^4.0.0", |
|||
"postcss-selector-parser": "^6.0.4", |
|||
"source-map": "^0.6.1" |
|||
} |
|||
}, |
|||
"@vue/compiler-ssr": { |
|||
"version": "3.0.6", |
|||
"resolved": "https://registry.npm.taobao.org/@vue/compiler-ssr/download/@vue/compiler-ssr-3.0.6.tgz", |
|||
"integrity": "sha1-cVY2HkxGXL7icjJ17cYelAZ45Hw=", |
|||
"dev": true, |
|||
"requires": { |
|||
"@vue/compiler-dom": "3.0.6", |
|||
"@vue/shared": "3.0.6" |
|||
} |
|||
}, |
|||
"@vue/reactivity": { |
|||
"version": "3.0.6", |
|||
"resolved": "https://registry.npm.taobao.org/@vue/reactivity/download/@vue/reactivity-3.0.6.tgz", |
|||
"integrity": "sha1-exbz1dBMxVAoCF//C7hHXMDjKZE=", |
|||
"requires": { |
|||
"@vue/shared": "3.0.6" |
|||
} |
|||
}, |
|||
"@vue/runtime-core": { |
|||
"version": "3.0.6", |
|||
"resolved": "https://registry.npm.taobao.org/@vue/runtime-core/download/@vue/runtime-core-3.0.6.tgz", |
|||
"integrity": "sha1-0Wd5tWZFk/HSW+Z3+xsZaAJKpTI=", |
|||
"requires": { |
|||
"@vue/reactivity": "3.0.6", |
|||
"@vue/shared": "3.0.6" |
|||
} |
|||
}, |
|||
"@vue/runtime-dom": { |
|||
"version": "3.0.6", |
|||
"resolved": "https://registry.npm.taobao.org/@vue/runtime-dom/download/@vue/runtime-dom-3.0.6.tgz", |
|||
"integrity": "sha1-59bGGRPYcfHwIKmoG1WMj8vrqMY=", |
|||
"requires": { |
|||
"@vue/runtime-core": "3.0.6", |
|||
"@vue/shared": "3.0.6", |
|||
"csstype": "^2.6.8" |
|||
} |
|||
}, |
|||
"@vue/shared": { |
|||
"version": "3.0.6", |
|||
"resolved": "https://registry.npm.taobao.org/@vue/shared/download/@vue/shared-3.0.6.tgz?cache=0&sync_timestamp=1614200563623&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fshared%2Fdownload%2F%40vue%2Fshared-3.0.6.tgz", |
|||
"integrity": "sha1-1lV2Qw/ErTg9x8gpEYeY5RaReNQ=" |
|||
}, |
|||
"ansi-styles": { |
|||
"version": "3.2.1", |
|||
"resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz?cache=0&sync_timestamp=1611325747047&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-3.2.1.tgz", |
|||
"integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", |
|||
"dev": true, |
|||
"requires": { |
|||
"color-convert": "^1.9.0" |
|||
} |
|||
}, |
|||
"async-validator": { |
|||
"version": "3.5.1", |
|||
"resolved": "https://registry.npm.taobao.org/async-validator/download/async-validator-3.5.1.tgz?cache=0&sync_timestamp=1605751734916&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fasync-validator%2Fdownload%2Fasync-validator-3.5.1.tgz", |
|||
"integrity": "sha1-zWK5aIskZfSEIOJ620d2CrG1VZ8=" |
|||
}, |
|||
"axios": { |
|||
"version": "0.21.1", |
|||
"resolved": "https://registry.npm.taobao.org/axios/download/axios-0.21.1.tgz?cache=0&sync_timestamp=1608609324963&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Faxios%2Fdownload%2Faxios-0.21.1.tgz", |
|||
"integrity": "sha1-IlY0gZYvTWvemnbVFu8OXTwJsrg=", |
|||
"requires": { |
|||
"follow-redirects": "^1.10.0" |
|||
} |
|||
}, |
|||
"big.js": { |
|||
"version": "5.2.2", |
|||
"resolved": "https://registry.npm.taobao.org/big.js/download/big.js-5.2.2.tgz", |
|||
"integrity": "sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg=", |
|||
"dev": true |
|||
}, |
|||
"bluebird": { |
|||
"version": "3.7.2", |
|||
"resolved": "https://registry.npm.taobao.org/bluebird/download/bluebird-3.7.2.tgz", |
|||
"integrity": "sha1-nyKcFb4nJFT/qXOs4NvueaGww28=", |
|||
"dev": true |
|||
}, |
|||
"camel-case": { |
|||
"version": "4.1.2", |
|||
"resolved": "https://registry.npm.taobao.org/camel-case/download/camel-case-4.1.2.tgz?cache=0&sync_timestamp=1606867509081&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcamel-case%2Fdownload%2Fcamel-case-4.1.2.tgz", |
|||
"integrity": "sha1-lygHKpVPgFIoIlpt7qazhGHhvVo=", |
|||
"dev": true, |
|||
"requires": { |
|||
"pascal-case": "^3.1.2", |
|||
"tslib": "^2.0.3" |
|||
} |
|||
}, |
|||
"capital-case": { |
|||
"version": "1.0.4", |
|||
"resolved": "https://registry.npm.taobao.org/capital-case/download/capital-case-1.0.4.tgz", |
|||
"integrity": "sha1-nRMCkjU8kkn2sA+lhSvuOKcX5mk=", |
|||
"dev": true, |
|||
"requires": { |
|||
"no-case": "^3.0.4", |
|||
"tslib": "^2.0.3", |
|||
"upper-case-first": "^2.0.2" |
|||
} |
|||
}, |
|||
"chalk": { |
|||
"version": "2.4.2", |
|||
"resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz?cache=0&sync_timestamp=1592843133653&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchalk%2Fdownload%2Fchalk-2.4.2.tgz", |
|||
"integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", |
|||
"dev": true, |
|||
"requires": { |
|||
"ansi-styles": "^3.2.1", |
|||
"escape-string-regexp": "^1.0.5", |
|||
"supports-color": "^5.3.0" |
|||
} |
|||
}, |
|||
"change-case": { |
|||
"version": "4.1.2", |
|||
"resolved": "https://registry.npm.taobao.org/change-case/download/change-case-4.1.2.tgz?cache=0&sync_timestamp=1606867670065&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchange-case%2Fdownload%2Fchange-case-4.1.2.tgz", |
|||
"integrity": "sha1-/t/F8TYEXiOYwEEO5EH5VwRkHhI=", |
|||
"dev": true, |
|||
"requires": { |
|||
"camel-case": "^4.1.2", |
|||
"capital-case": "^1.0.4", |
|||
"constant-case": "^3.0.4", |
|||
"dot-case": "^3.0.4", |
|||
"header-case": "^2.0.4", |
|||
"no-case": "^3.0.4", |
|||
"param-case": "^3.0.4", |
|||
"pascal-case": "^3.1.2", |
|||
"path-case": "^3.0.4", |
|||
"sentence-case": "^3.0.4", |
|||
"snake-case": "^3.0.4", |
|||
"tslib": "^2.0.3" |
|||
} |
|||
}, |
|||
"color-convert": { |
|||
"version": "1.9.3", |
|||
"resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-1.9.3.tgz", |
|||
"integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", |
|||
"dev": true, |
|||
"requires": { |
|||
"color-name": "1.1.3" |
|||
} |
|||
}, |
|||
"color-name": { |
|||
"version": "1.1.3", |
|||
"resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz", |
|||
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", |
|||
"dev": true |
|||
}, |
|||
"colorette": { |
|||
"version": "1.2.2", |
|||
"resolved": "https://registry.npm.taobao.org/colorette/download/colorette-1.2.2.tgz?cache=0&sync_timestamp=1614259593633&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcolorette%2Fdownload%2Fcolorette-1.2.2.tgz", |
|||
"integrity": "sha1-y8x51emcrqLb8Q6zom/Ys+as+pQ=", |
|||
"dev": true |
|||
}, |
|||
"consolidate": { |
|||
"version": "0.16.0", |
|||
"resolved": "https://registry.npm.taobao.org/consolidate/download/consolidate-0.16.0.tgz?cache=0&sync_timestamp=1599597070540&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fconsolidate%2Fdownload%2Fconsolidate-0.16.0.tgz", |
|||
"integrity": "sha1-oRhkdokw8vGUMWYKZZBmaPX73BY=", |
|||
"dev": true, |
|||
"requires": { |
|||
"bluebird": "^3.7.2" |
|||
} |
|||
}, |
|||
"constant-case": { |
|||
"version": "3.0.4", |
|||
"resolved": "https://registry.npm.taobao.org/constant-case/download/constant-case-3.0.4.tgz?cache=0&sync_timestamp=1606869717810&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fconstant-case%2Fdownload%2Fconstant-case-3.0.4.tgz", |
|||
"integrity": "sha1-O4Sprq9M8x7EXmv13pG9+wWJ+vE=", |
|||
"dev": true, |
|||
"requires": { |
|||
"no-case": "^3.0.4", |
|||
"tslib": "^2.0.3", |
|||
"upper-case": "^2.0.2" |
|||
} |
|||
}, |
|||
"cssesc": { |
|||
"version": "3.0.0", |
|||
"resolved": "https://registry.npm.taobao.org/cssesc/download/cssesc-3.0.0.tgz", |
|||
"integrity": "sha1-N3QZGZA7hoVl4cCep0dEXNGJg+4=", |
|||
"dev": true |
|||
}, |
|||
"csstype": { |
|||
"version": "2.6.16", |
|||
"resolved": "https://registry.npm.taobao.org/csstype/download/csstype-2.6.16.tgz", |
|||
"integrity": "sha1-VE1p9UcBO4WkDRW/912zjzT+nDk=" |
|||
}, |
|||
"dayjs": { |
|||
"version": "1.10.4", |
|||
"resolved": "https://registry.npm.taobao.org/dayjs/download/dayjs-1.10.4.tgz?cache=0&sync_timestamp=1611309982734&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdayjs%2Fdownload%2Fdayjs-1.10.4.tgz", |
|||
"integrity": "sha1-jlRKm4aD9heD9XCYCoqA6vVKseI=" |
|||
}, |
|||
"debug": { |
|||
"version": "4.3.1", |
|||
"resolved": "https://registry.npm.taobao.org/debug/download/debug-4.3.1.tgz?cache=0&sync_timestamp=1607566537361&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.3.1.tgz", |
|||
"integrity": "sha1-8NIpxQXgxtjEmsVT0bE9wYP2su4=", |
|||
"dev": true, |
|||
"requires": { |
|||
"ms": "2.1.2" |
|||
} |
|||
}, |
|||
"dot-case": { |
|||
"version": "3.0.4", |
|||
"resolved": "https://registry.npm.taobao.org/dot-case/download/dot-case-3.0.4.tgz", |
|||
"integrity": "sha1-mytnDQCkMWZ6inW6Kc0bmICc51E=", |
|||
"dev": true, |
|||
"requires": { |
|||
"no-case": "^3.0.4", |
|||
"tslib": "^2.0.3" |
|||
} |
|||
}, |
|||
"element-plus": { |
|||
"version": "1.0.2-beta.33", |
|||
"resolved": "https://registry.npm.taobao.org/element-plus/download/element-plus-1.0.2-beta.33.tgz", |
|||
"integrity": "sha1-DpJMiHLbwU6RbtXWRS2XmbBNTGA=", |
|||
"requires": { |
|||
"@popperjs/core": "^2.4.4", |
|||
"async-validator": "^3.4.0", |
|||
"dayjs": "1.x", |
|||
"lodash": "^4.17.20", |
|||
"mitt": "^2.1.0", |
|||
"normalize-wheel": "^1.0.1", |
|||
"resize-observer-polyfill": "^1.5.1" |
|||
} |
|||
}, |
|||
"element-theme-chalk": { |
|||
"version": "2.15.1", |
|||
"resolved": "https://registry.npm.taobao.org/element-theme-chalk/download/element-theme-chalk-2.15.1.tgz?cache=0&sync_timestamp=1614082447566&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Felement-theme-chalk%2Fdownload%2Felement-theme-chalk-2.15.1.tgz", |
|||
"integrity": "sha1-irpyfYjcwWkT+frMYzNFT+BgAtQ=", |
|||
"dev": true |
|||
}, |
|||
"emojis-list": { |
|||
"version": "3.0.0", |
|||
"resolved": "https://registry.npm.taobao.org/emojis-list/download/emojis-list-3.0.0.tgz", |
|||
"integrity": "sha1-VXBmIEatKeLpFucariYKvf9Pang=", |
|||
"dev": true |
|||
}, |
|||
"esbuild": { |
|||
"version": "0.8.53", |
|||
"resolved": "https://registry.npm.taobao.org/esbuild/download/esbuild-0.8.53.tgz?cache=0&sync_timestamp=1614388220841&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fesbuild%2Fdownload%2Fesbuild-0.8.53.tgz", |
|||
"integrity": "sha1-tAi7DKGynasT2Lv31Z9Zr+Z3boY=", |
|||
"dev": true |
|||
}, |
|||
"escape-string-regexp": { |
|||
"version": "1.0.5", |
|||
"resolved": "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz", |
|||
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", |
|||
"dev": true |
|||
}, |
|||
"estree-walker": { |
|||
"version": "2.0.2", |
|||
"resolved": "https://registry.npm.taobao.org/estree-walker/download/estree-walker-2.0.2.tgz", |
|||
"integrity": "sha1-UvAQF4wqTBF6d1fP6UKtt9LaTKw=" |
|||
}, |
|||
"follow-redirects": { |
|||
"version": "1.13.3", |
|||
"resolved": "https://registry.npm.taobao.org/follow-redirects/download/follow-redirects-1.13.3.tgz", |
|||
"integrity": "sha1-5VmK1QF0wbxOhyMB6CrCzZf5Amc=" |
|||
}, |
|||
"fsevents": { |
|||
"version": "2.3.2", |
|||
"resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-2.3.2.tgz", |
|||
"integrity": "sha1-ilJveLj99GI7cJ4Ll1xSwkwC/Ro=", |
|||
"dev": true, |
|||
"optional": true |
|||
}, |
|||
"function-bind": { |
|||
"version": "1.1.1", |
|||
"resolved": "https://registry.npm.taobao.org/function-bind/download/function-bind-1.1.1.tgz", |
|||
"integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", |
|||
"dev": true |
|||
}, |
|||
"generic-names": { |
|||
"version": "2.0.1", |
|||
"resolved": "https://registry.npm.taobao.org/generic-names/download/generic-names-2.0.1.tgz?cache=0&sync_timestamp=1603542291410&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fgeneric-names%2Fdownload%2Fgeneric-names-2.0.1.tgz", |
|||
"integrity": "sha1-+KN46tLMqno08DF7BVVIMq5BuHI=", |
|||
"dev": true, |
|||
"requires": { |
|||
"loader-utils": "^1.1.0" |
|||
} |
|||
}, |
|||
"globals": { |
|||
"version": "11.12.0", |
|||
"resolved": "https://registry.npm.taobao.org/globals/download/globals-11.12.0.tgz?cache=0&sync_timestamp=1613453268354&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglobals%2Fdownload%2Fglobals-11.12.0.tgz", |
|||
"integrity": "sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4=", |
|||
"dev": true |
|||
}, |
|||
"has": { |
|||
"version": "1.0.3", |
|||
"resolved": "https://registry.npm.taobao.org/has/download/has-1.0.3.tgz", |
|||
"integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", |
|||
"dev": true, |
|||
"requires": { |
|||
"function-bind": "^1.1.1" |
|||
} |
|||
}, |
|||
"has-flag": { |
|||
"version": "3.0.0", |
|||
"resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz?cache=0&sync_timestamp=1577797756584&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhas-flag%2Fdownload%2Fhas-flag-3.0.0.tgz", |
|||
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", |
|||
"dev": true |
|||
}, |
|||
"hash-sum": { |
|||
"version": "2.0.0", |
|||
"resolved": "https://registry.npm.taobao.org/hash-sum/download/hash-sum-2.0.0.tgz", |
|||
"integrity": "sha1-gdAbtd6OpKIUrV1urRtSNGCwtFo=", |
|||
"dev": true |
|||
}, |
|||
"header-case": { |
|||
"version": "2.0.4", |
|||
"resolved": "https://registry.npm.taobao.org/header-case/download/header-case-2.0.4.tgz?cache=0&sync_timestamp=1606867671891&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fheader-case%2Fdownload%2Fheader-case-2.0.4.tgz", |
|||
"integrity": "sha1-WkLmO1UXc0nPQFvrjXdayruSwGM=", |
|||
"dev": true, |
|||
"requires": { |
|||
"capital-case": "^1.0.4", |
|||
"tslib": "^2.0.3" |
|||
} |
|||
}, |
|||
"icss-replace-symbols": { |
|||
"version": "1.1.0", |
|||
"resolved": "https://registry.npm.taobao.org/icss-replace-symbols/download/icss-replace-symbols-1.1.0.tgz", |
|||
"integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", |
|||
"dev": true |
|||
}, |
|||
"icss-utils": { |
|||
"version": "5.1.0", |
|||
"resolved": "https://registry.npm.taobao.org/icss-utils/download/icss-utils-5.1.0.tgz?cache=0&sync_timestamp=1605801458520&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ficss-utils%2Fdownload%2Ficss-utils-5.1.0.tgz", |
|||
"integrity": "sha1-xr5oWKvQE9do6YNmrkfiXViHsa4=", |
|||
"dev": true |
|||
}, |
|||
"indexes-of": { |
|||
"version": "1.0.1", |
|||
"resolved": "https://registry.npm.taobao.org/indexes-of/download/indexes-of-1.0.1.tgz", |
|||
"integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", |
|||
"dev": true |
|||
}, |
|||
"is-core-module": { |
|||
"version": "2.2.0", |
|||
"resolved": "https://registry.npm.taobao.org/is-core-module/download/is-core-module-2.2.0.tgz?cache=0&sync_timestamp=1606413651726&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-core-module%2Fdownload%2Fis-core-module-2.2.0.tgz", |
|||
"integrity": "sha1-lwN+89UiJNhRY/VZeytj2a/tmBo=", |
|||
"dev": true, |
|||
"requires": { |
|||
"has": "^1.0.3" |
|||
} |
|||
}, |
|||
"js-tokens": { |
|||
"version": "4.0.0", |
|||
"resolved": "https://registry.npm.taobao.org/js-tokens/download/js-tokens-4.0.0.tgz", |
|||
"integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk=", |
|||
"dev": true |
|||
}, |
|||
"jsesc": { |
|||
"version": "2.5.2", |
|||
"resolved": "https://registry.npm.taobao.org/jsesc/download/jsesc-2.5.2.tgz?cache=0&sync_timestamp=1603891224688&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjsesc%2Fdownload%2Fjsesc-2.5.2.tgz", |
|||
"integrity": "sha1-gFZNLkg9rPbo7yCWUKZ98/DCg6Q=", |
|||
"dev": true |
|||
}, |
|||
"json5": { |
|||
"version": "1.0.1", |
|||
"resolved": "https://registry.npm.taobao.org/json5/download/json5-1.0.1.tgz?cache=0&sync_timestamp=1612146079519&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjson5%2Fdownload%2Fjson5-1.0.1.tgz", |
|||
"integrity": "sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4=", |
|||
"dev": true, |
|||
"requires": { |
|||
"minimist": "^1.2.0" |
|||
} |
|||
}, |
|||
"loader-utils": { |
|||
"version": "1.4.0", |
|||
"resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-1.4.0.tgz", |
|||
"integrity": "sha1-xXm140yzSxp07cbB+za/o3HVphM=", |
|||
"dev": true, |
|||
"requires": { |
|||
"big.js": "^5.2.2", |
|||
"emojis-list": "^3.0.0", |
|||
"json5": "^1.0.1" |
|||
} |
|||
}, |
|||
"lodash": { |
|||
"version": "4.17.21", |
|||
"resolved": "https://registry.npm.taobao.org/lodash/download/lodash-4.17.21.tgz", |
|||
"integrity": "sha1-Z5WRxWTDv/quhFTPCz3zcMPWkRw=" |
|||
}, |
|||
"lodash.camelcase": { |
|||
"version": "4.3.0", |
|||
"resolved": "https://registry.npm.taobao.org/lodash.camelcase/download/lodash.camelcase-4.3.0.tgz?cache=0&sync_timestamp=1577806297529&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flodash.camelcase%2Fdownload%2Flodash.camelcase-4.3.0.tgz", |
|||
"integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", |
|||
"dev": true |
|||
}, |
|||
"lower-case": { |
|||
"version": "2.0.2", |
|||
"resolved": "https://registry.npm.taobao.org/lower-case/download/lower-case-2.0.2.tgz?cache=0&sync_timestamp=1606867514181&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flower-case%2Fdownload%2Flower-case-2.0.2.tgz", |
|||
"integrity": "sha1-b6I3xj29xKgsoP2ILkci3F5jTig=", |
|||
"dev": true, |
|||
"requires": { |
|||
"tslib": "^2.0.3" |
|||
} |
|||
}, |
|||
"lru-cache": { |
|||
"version": "5.1.1", |
|||
"resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-5.1.1.tgz", |
|||
"integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=", |
|||
"dev": true, |
|||
"requires": { |
|||
"yallist": "^3.0.2" |
|||
} |
|||
}, |
|||
"magic-string": { |
|||
"version": "0.25.7", |
|||
"resolved": "https://registry.npm.taobao.org/magic-string/download/magic-string-0.25.7.tgz", |
|||
"integrity": "sha1-P0l9b9NMZpxnmNy4IfLvMfVEUFE=", |
|||
"dev": true, |
|||
"requires": { |
|||
"sourcemap-codec": "^1.4.4" |
|||
} |
|||
}, |
|||
"merge-source-map": { |
|||
"version": "1.1.0", |
|||
"resolved": "https://registry.npm.taobao.org/merge-source-map/download/merge-source-map-1.1.0.tgz", |
|||
"integrity": "sha1-L93n5gIJOfcJBqaPLXrmheTIxkY=", |
|||
"dev": true, |
|||
"requires": { |
|||
"source-map": "^0.6.1" |
|||
} |
|||
}, |
|||
"minimist": { |
|||
"version": "1.2.5", |
|||
"resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz", |
|||
"integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=", |
|||
"dev": true |
|||
}, |
|||
"mitt": { |
|||
"version": "2.1.0", |
|||
"resolved": "https://registry.npm.taobao.org/mitt/download/mitt-2.1.0.tgz", |
|||
"integrity": "sha1-90BXfCMXbGIFsSGylzUU6t4bIjA=" |
|||
}, |
|||
"ms": { |
|||
"version": "2.1.2", |
|||
"resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz?cache=0&sync_timestamp=1607433899126&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.1.2.tgz", |
|||
"integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", |
|||
"dev": true |
|||
}, |
|||
"nanoid": { |
|||
"version": "3.1.20", |
|||
"resolved": "https://registry.npm.taobao.org/nanoid/download/nanoid-3.1.20.tgz?cache=0&sync_timestamp=1606833990942&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnanoid%2Fdownload%2Fnanoid-3.1.20.tgz", |
|||
"integrity": "sha1-utwmPGsdzxS3HvqoX2q0wdbPx4g=", |
|||
"dev": true |
|||
}, |
|||
"no-case": { |
|||
"version": "3.0.4", |
|||
"resolved": "https://registry.npm.taobao.org/no-case/download/no-case-3.0.4.tgz?cache=0&sync_timestamp=1606867512442&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fno-case%2Fdownload%2Fno-case-3.0.4.tgz", |
|||
"integrity": "sha1-02H9XJgA9VhVGoNp/A3NRmK2Ek0=", |
|||
"dev": true, |
|||
"requires": { |
|||
"lower-case": "^2.0.2", |
|||
"tslib": "^2.0.3" |
|||
} |
|||
}, |
|||
"normalize-wheel": { |
|||
"version": "1.0.1", |
|||
"resolved": "https://registry.npm.taobao.org/normalize-wheel/download/normalize-wheel-1.0.1.tgz", |
|||
"integrity": "sha1-rsiGr/2wRQcNhWRH32Ls+GFG7EU=" |
|||
}, |
|||
"param-case": { |
|||
"version": "3.0.4", |
|||
"resolved": "https://registry.npm.taobao.org/param-case/download/param-case-3.0.4.tgz?cache=0&sync_timestamp=1606867508847&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparam-case%2Fdownload%2Fparam-case-3.0.4.tgz", |
|||
"integrity": "sha1-fRf+SqEr3jTUp32RrPtiGcqtAcU=", |
|||
"dev": true, |
|||
"requires": { |
|||
"dot-case": "^3.0.4", |
|||
"tslib": "^2.0.3" |
|||
} |
|||
}, |
|||
"pascal-case": { |
|||
"version": "3.1.2", |
|||
"resolved": "https://registry.npm.taobao.org/pascal-case/download/pascal-case-3.1.2.tgz", |
|||
"integrity": "sha1-tI4O8rmOIF58Ha50fQsVCCN2YOs=", |
|||
"dev": true, |
|||
"requires": { |
|||
"no-case": "^3.0.4", |
|||
"tslib": "^2.0.3" |
|||
} |
|||
}, |
|||
"path-case": { |
|||
"version": "3.0.4", |
|||
"resolved": "https://registry.npm.taobao.org/path-case/download/path-case-3.0.4.tgz?cache=0&sync_timestamp=1606867671723&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpath-case%2Fdownload%2Fpath-case-3.0.4.tgz", |
|||
"integrity": "sha1-kWhkUzTrlCZYN1xW+AtMDLX4LG8=", |
|||
"dev": true, |
|||
"requires": { |
|||
"dot-case": "^3.0.4", |
|||
"tslib": "^2.0.3" |
|||
} |
|||
}, |
|||
"path-parse": { |
|||
"version": "1.0.6", |
|||
"resolved": "https://registry.npm.taobao.org/path-parse/download/path-parse-1.0.6.tgz", |
|||
"integrity": "sha1-1i27VnlAXXLEc37FhgDp3c8G0kw=", |
|||
"dev": true |
|||
}, |
|||
"postcss": { |
|||
"version": "8.2.6", |
|||
"resolved": "https://registry.npm.taobao.org/postcss/download/postcss-8.2.6.tgz", |
|||
"integrity": "sha1-XWmpdFQ7Rfh+RkvEw+OSqX1r6f4=", |
|||
"dev": true, |
|||
"requires": { |
|||
"colorette": "^1.2.1", |
|||
"nanoid": "^3.1.20", |
|||
"source-map": "^0.6.1" |
|||
} |
|||
}, |
|||
"postcss-modules": { |
|||
"version": "4.0.0", |
|||
"resolved": "https://registry.npm.taobao.org/postcss-modules/download/postcss-modules-4.0.0.tgz?cache=0&sync_timestamp=1606641122441&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules%2Fdownload%2Fpostcss-modules-4.0.0.tgz", |
|||
"integrity": "sha1-K8fydquI8/Gw+t9svXdy1DtfO5s=", |
|||
"dev": true, |
|||
"requires": { |
|||
"generic-names": "^2.0.1", |
|||
"icss-replace-symbols": "^1.1.0", |
|||
"lodash.camelcase": "^4.3.0", |
|||
"postcss-modules-extract-imports": "^3.0.0", |
|||
"postcss-modules-local-by-default": "^4.0.0", |
|||
"postcss-modules-scope": "^3.0.0", |
|||
"postcss-modules-values": "^4.0.0", |
|||
"string-hash": "^1.1.1" |
|||
} |
|||
}, |
|||
"postcss-modules-extract-imports": { |
|||
"version": "3.0.0", |
|||
"resolved": "https://registry.npm.taobao.org/postcss-modules-extract-imports/download/postcss-modules-extract-imports-3.0.0.tgz?cache=0&sync_timestamp=1602588202058&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules-extract-imports%2Fdownload%2Fpostcss-modules-extract-imports-3.0.0.tgz", |
|||
"integrity": "sha1-zaHwR8CugMl9vijD52pDuIAldB0=", |
|||
"dev": true |
|||
}, |
|||
"postcss-modules-local-by-default": { |
|||
"version": "4.0.0", |
|||
"resolved": "https://registry.npm.taobao.org/postcss-modules-local-by-default/download/postcss-modules-local-by-default-4.0.0.tgz?cache=0&sync_timestamp=1602587625149&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules-local-by-default%2Fdownload%2Fpostcss-modules-local-by-default-4.0.0.tgz", |
|||
"integrity": "sha1-67tU+uFZjuz99pGgKz/zs5ClpRw=", |
|||
"dev": true, |
|||
"requires": { |
|||
"icss-utils": "^5.0.0", |
|||
"postcss-selector-parser": "^6.0.2", |
|||
"postcss-value-parser": "^4.1.0" |
|||
} |
|||
}, |
|||
"postcss-modules-scope": { |
|||
"version": "3.0.0", |
|||
"resolved": "https://registry.npm.taobao.org/postcss-modules-scope/download/postcss-modules-scope-3.0.0.tgz?cache=0&sync_timestamp=1602593133331&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules-scope%2Fdownload%2Fpostcss-modules-scope-3.0.0.tgz", |
|||
"integrity": "sha1-nvMVFFbTu/oSDKRImN/Kby+gHwY=", |
|||
"dev": true, |
|||
"requires": { |
|||
"postcss-selector-parser": "^6.0.4" |
|||
} |
|||
}, |
|||
"postcss-modules-values": { |
|||
"version": "4.0.0", |
|||
"resolved": "https://registry.npm.taobao.org/postcss-modules-values/download/postcss-modules-values-4.0.0.tgz?cache=0&sync_timestamp=1602586179271&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules-values%2Fdownload%2Fpostcss-modules-values-4.0.0.tgz", |
|||
"integrity": "sha1-18Xn5ow7s8myfL9Iyguz/7RgLJw=", |
|||
"dev": true, |
|||
"requires": { |
|||
"icss-utils": "^5.0.0" |
|||
} |
|||
}, |
|||
"postcss-selector-parser": { |
|||
"version": "6.0.4", |
|||
"resolved": "https://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-6.0.4.tgz", |
|||
"integrity": "sha1-VgdaE4CgRgTDiwY+p3Z6Epr1wrM=", |
|||
"dev": true, |
|||
"requires": { |
|||
"cssesc": "^3.0.0", |
|||
"indexes-of": "^1.0.1", |
|||
"uniq": "^1.0.1", |
|||
"util-deprecate": "^1.0.2" |
|||
} |
|||
}, |
|||
"postcss-value-parser": { |
|||
"version": "4.1.0", |
|||
"resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-4.1.0.tgz", |
|||
"integrity": "sha1-RD9qIM7WSBor2k+oUypuVdeJoss=", |
|||
"dev": true |
|||
}, |
|||
"qs": { |
|||
"version": "6.9.6", |
|||
"resolved": "https://registry.npm.taobao.org/qs/download/qs-6.9.6.tgz?cache=0&sync_timestamp=1610598229410&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fqs%2Fdownload%2Fqs-6.9.6.tgz", |
|||
"integrity": "sha1-Ju08gkOkMbKSSsqEzJBHHzXVoO4=" |
|||
}, |
|||
"resize-observer-polyfill": { |
|||
"version": "1.5.1", |
|||
"resolved": "https://registry.npm.taobao.org/resize-observer-polyfill/download/resize-observer-polyfill-1.5.1.tgz", |
|||
"integrity": "sha1-DpAg3T0hAkRY1OvSfiPkAmmBBGQ=" |
|||
}, |
|||
"resolve": { |
|||
"version": "1.20.0", |
|||
"resolved": "https://registry.npm.taobao.org/resolve/download/resolve-1.20.0.tgz", |
|||
"integrity": "sha1-YpoBP7P3B1XW8LeTXMHCxTeLGXU=", |
|||
"dev": true, |
|||
"requires": { |
|||
"is-core-module": "^2.2.0", |
|||
"path-parse": "^1.0.6" |
|||
} |
|||
}, |
|||
"rollup": { |
|||
"version": "2.40.0", |
|||
"resolved": "https://registry.npm.taobao.org/rollup/download/rollup-2.40.0.tgz", |
|||
"integrity": "sha1-78IY6u3nq1kJVN9Q+WGVGImZwwQ=", |
|||
"dev": true, |
|||
"requires": { |
|||
"fsevents": "~2.3.1" |
|||
} |
|||
}, |
|||
"sentence-case": { |
|||
"version": "3.0.4", |
|||
"resolved": "https://registry.npm.taobao.org/sentence-case/download/sentence-case-3.0.4.tgz?cache=0&sync_timestamp=1606867671352&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsentence-case%2Fdownload%2Fsentence-case-3.0.4.tgz", |
|||
"integrity": "sha1-NkWnuMEXx4f96HAgViJbtipFEx8=", |
|||
"dev": true, |
|||
"requires": { |
|||
"no-case": "^3.0.4", |
|||
"tslib": "^2.0.3", |
|||
"upper-case-first": "^2.0.2" |
|||
} |
|||
}, |
|||
"snake-case": { |
|||
"version": "3.0.4", |
|||
"resolved": "https://registry.npm.taobao.org/snake-case/download/snake-case-3.0.4.tgz?cache=0&sync_timestamp=1606867671804&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsnake-case%2Fdownload%2Fsnake-case-3.0.4.tgz", |
|||
"integrity": "sha1-Tyu9Vo6ZNavf1ZPzTGkdrbScRSw=", |
|||
"dev": true, |
|||
"requires": { |
|||
"dot-case": "^3.0.4", |
|||
"tslib": "^2.0.3" |
|||
} |
|||
}, |
|||
"source-map": { |
|||
"version": "0.6.1", |
|||
"resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", |
|||
"integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" |
|||
}, |
|||
"sourcemap-codec": { |
|||
"version": "1.4.8", |
|||
"resolved": "https://registry.npm.taobao.org/sourcemap-codec/download/sourcemap-codec-1.4.8.tgz", |
|||
"integrity": "sha1-6oBL2UhXQC5pktBaOO8a41qatMQ=", |
|||
"dev": true |
|||
}, |
|||
"string-hash": { |
|||
"version": "1.1.3", |
|||
"resolved": "https://registry.npm.taobao.org/string-hash/download/string-hash-1.1.3.tgz", |
|||
"integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=", |
|||
"dev": true |
|||
}, |
|||
"supports-color": { |
|||
"version": "5.5.0", |
|||
"resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz?cache=0&sync_timestamp=1611393963969&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-5.5.0.tgz", |
|||
"integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", |
|||
"dev": true, |
|||
"requires": { |
|||
"has-flag": "^3.0.0" |
|||
} |
|||
}, |
|||
"to-fast-properties": { |
|||
"version": "2.0.0", |
|||
"resolved": "https://registry.npm.taobao.org/to-fast-properties/download/to-fast-properties-2.0.0.tgz", |
|||
"integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" |
|||
}, |
|||
"tslib": { |
|||
"version": "2.1.0", |
|||
"resolved": "https://registry.npm.taobao.org/tslib/download/tslib-2.1.0.tgz?cache=0&sync_timestamp=1609887785854&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftslib%2Fdownload%2Ftslib-2.1.0.tgz", |
|||
"integrity": "sha1-2mCGDxwuyqVwOrfTm8Bba/mIuXo=", |
|||
"dev": true |
|||
}, |
|||
"uniq": { |
|||
"version": "1.0.1", |
|||
"resolved": "https://registry.npm.taobao.org/uniq/download/uniq-1.0.1.tgz", |
|||
"integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", |
|||
"dev": true |
|||
}, |
|||
"upper-case": { |
|||
"version": "2.0.2", |
|||
"resolved": "https://registry.npm.taobao.org/upper-case/download/upper-case-2.0.2.tgz", |
|||
"integrity": "sha1-2JgQgj+qsd8VSbfZenb4Ziuub3o=", |
|||
"dev": true, |
|||
"requires": { |
|||
"tslib": "^2.0.3" |
|||
} |
|||
}, |
|||
"upper-case-first": { |
|||
"version": "2.0.2", |
|||
"resolved": "https://registry.npm.taobao.org/upper-case-first/download/upper-case-first-2.0.2.tgz", |
|||
"integrity": "sha1-mSwyc/iCq9GdHgKJTMFHEX+EQyQ=", |
|||
"dev": true, |
|||
"requires": { |
|||
"tslib": "^2.0.3" |
|||
} |
|||
}, |
|||
"util-deprecate": { |
|||
"version": "1.0.2", |
|||
"resolved": "https://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz", |
|||
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", |
|||
"dev": true |
|||
}, |
|||
"vite": { |
|||
"version": "2.0.4", |
|||
"resolved": "https://registry.npm.taobao.org/vite/download/vite-2.0.4.tgz", |
|||
"integrity": "sha1-BjUypBObWaBnKX2Ou1lg1FCQegk=", |
|||
"dev": true, |
|||
"requires": { |
|||
"esbuild": "^0.8.52", |
|||
"fsevents": "~2.3.1", |
|||
"postcss": "^8.2.1", |
|||
"resolve": "^1.19.0", |
|||
"rollup": "^2.38.5" |
|||
} |
|||
}, |
|||
"vite-plugin-babel-import": { |
|||
"version": "2.0.2", |
|||
"resolved": "https://registry.npm.taobao.org/vite-plugin-babel-import/download/vite-plugin-babel-import-2.0.2.tgz", |
|||
"integrity": "sha1-G4mZXVPGWHVk5V7kvjeeI9oKHhg=", |
|||
"dev": true, |
|||
"requires": { |
|||
"@babel/generator": "^7.12.11", |
|||
"@babel/helper-module-imports": "^7.12.5", |
|||
"@babel/parser": "^7.12.11", |
|||
"@babel/traverse": "^7.12.12", |
|||
"@babel/types": "^7.12.12", |
|||
"change-case": "^4.1.2" |
|||
} |
|||
}, |
|||
"vue": { |
|||
"version": "3.0.6", |
|||
"resolved": "https://registry.npm.taobao.org/vue/download/vue-3.0.6.tgz", |
|||
"integrity": "sha1-LBbtS7ZvFtbG9uqjt9WDWnZZgEk=", |
|||
"requires": { |
|||
"@vue/compiler-dom": "3.0.6", |
|||
"@vue/runtime-dom": "3.0.6", |
|||
"@vue/shared": "3.0.6" |
|||
} |
|||
}, |
|||
"vue-router": { |
|||
"version": "4.0.4", |
|||
"resolved": "https://registry.npm.taobao.org/vue-router/download/vue-router-4.0.4.tgz?cache=0&sync_timestamp=1613740713323&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-router%2Fdownload%2Fvue-router-4.0.4.tgz", |
|||
"integrity": "sha1-rZtLe72tYiQHtP8YmxZG9IwekFM=" |
|||
}, |
|||
"yallist": { |
|||
"version": "3.1.1", |
|||
"resolved": "https://registry.npm.taobao.org/yallist/download/yallist-3.1.1.tgz", |
|||
"integrity": "sha1-27fa+b/YusmrRev2ArjLrQ1dCP0=", |
|||
"dev": true |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,35 @@ |
|||
{ |
|||
"name": "vue3-admin", |
|||
"version": "0.0.0", |
|||
"scripts": { |
|||
"dev": "vite --mode development", |
|||
"build:beta": "vite build --mode beta", |
|||
"build:release": "vite build --mode release", |
|||
"serve": "vite preview" |
|||
}, |
|||
"dependencies": { |
|||
"axios": "^0.21.1", |
|||
"element-plus": "^1.0.2-beta.33", |
|||
"js-md5": "^0.7.3", |
|||
"pushstate-server": "^3.1.0", |
|||
"qs": "^6.9.6", |
|||
"vue": "^3.0.5", |
|||
"vue-router": "^4.0.4", |
|||
"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", |
|||
"vite": "^2.0.1", |
|||
"vite-babel-plugin": "^0.0.2", |
|||
"vite-plugin-babel-import": "^2.0.2", |
|||
"vite-plugin-imp": "^2.0.4" |
|||
} |
|||
} |
@ -0,0 +1,187 @@ |
|||
<template> |
|||
<div class="layout"> |
|||
<el-container v-if="state.showMenu" class="container"> |
|||
<el-aside class="aside"> |
|||
<div class="head"> |
|||
<div> |
|||
<img src="https://s.weituibao.com/1582958061265/mlogo.png" alt="logo"> |
|||
<span>vue3 admin</span> |
|||
</div> |
|||
</div> |
|||
<div class="line" /> |
|||
<el-menu |
|||
:default-openeds="state.defaultOpen" |
|||
background-color="#222832" |
|||
text-color="#fff" |
|||
:router="true" |
|||
:default-active='state.currentPath' |
|||
> |
|||
<el-submenu index="1"> |
|||
<template #title> |
|||
<span>Dashboard</span> |
|||
</template> |
|||
<el-menu-item-group> |
|||
<el-menu-item index="/introduce"><i class="el-icon-data-line" />系统介绍</el-menu-item> |
|||
<el-menu-item index="/dashboard"><i class="el-icon-odometer" />Dashboard</el-menu-item> |
|||
<el-menu-item index="/add"><i class="el-icon-plus" />添加商品</el-menu-item> |
|||
</el-menu-item-group> |
|||
</el-submenu> |
|||
<el-submenu index="2"> |
|||
<template #title> |
|||
<span>首页配置</span> |
|||
</template> |
|||
<el-menu-item-group> |
|||
<el-menu-item index="/swiper"><i class="el-icon-picture" />轮播图配置</el-menu-item> |
|||
<el-menu-item index="/hot"><i class="el-icon-star-on" />热销商品配置</el-menu-item> |
|||
<el-menu-item index="/new"><i class="el-icon-sell" />新品上线配置</el-menu-item> |
|||
<el-menu-item index="/recommend"><i class="el-icon-thumb" />为你推荐配置</el-menu-item> |
|||
</el-menu-item-group> |
|||
</el-submenu> |
|||
<el-submenu index="3"> |
|||
<template #title> |
|||
<span>模块管理</span> |
|||
</template> |
|||
<el-menu-item-group> |
|||
<el-menu-item index="/category"><i class="el-icon-menu" />分类管理</el-menu-item> |
|||
<el-menu-item index="/good"><i class="el-icon-s-goods" />商品管理</el-menu-item> |
|||
<el-menu-item index="/guest"><i class="el-icon-user-solid" />会员管理</el-menu-item> |
|||
<el-menu-item index="/order"><i class="el-icon-s-order" />订单管理</el-menu-item> |
|||
</el-menu-item-group> |
|||
</el-submenu> |
|||
<el-submenu index="4"> |
|||
<template #title> |
|||
<span>系统管理</span> |
|||
</template> |
|||
<el-menu-item-group> |
|||
<el-menu-item index="/account"><i class="el-icon-lock" />修改密码</el-menu-item> |
|||
<!-- <el-menu-item><i class="el-icon-upload2" />安全退出</el-menu-item> --> |
|||
</el-menu-item-group> |
|||
</el-submenu> |
|||
</el-menu> |
|||
</el-aside> |
|||
<el-container class="content"> |
|||
<Header /> |
|||
<div class="main"> |
|||
<router-view /> |
|||
</div> |
|||
<Footer /> |
|||
</el-container> |
|||
</el-container> |
|||
<el-container v-else class="container"> |
|||
<router-view /> |
|||
</el-container> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
import { reactive } from 'vue' |
|||
import Header from '@/components/Header.vue' |
|||
import Footer from '@/components/Footer.vue' |
|||
import { useRouter } from 'vue-router' |
|||
export default { |
|||
name: 'App', |
|||
components: { |
|||
Header, |
|||
Footer |
|||
}, |
|||
setup() { |
|||
const noMenu = ['/login'] |
|||
const router = useRouter() |
|||
const state = reactive({ |
|||
defaultOpen: ['1', '2', '3', '4'], |
|||
showMenu: true, |
|||
currentPath: '/dashboard', |
|||
count: { |
|||
number: 1 |
|||
} |
|||
}) |
|||
router.beforeEach((to) => { |
|||
state.showMenu = !noMenu.includes(to.path) |
|||
state.currentPath = to.path |
|||
}) |
|||
return { |
|||
state |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style scoped> |
|||
.layout { |
|||
min-height: 100vh; |
|||
background-color: #ffffff; |
|||
} |
|||
.container { |
|||
height: 100vh; |
|||
} |
|||
.aside { |
|||
width: 200px!important; |
|||
background-color: #222832; |
|||
} |
|||
.head { |
|||
display: flex; |
|||
align-items: center; |
|||
justify-content: center; |
|||
height: 50px; |
|||
} |
|||
.head > div { |
|||
display: flex; |
|||
align-items: center; |
|||
} |
|||
|
|||
.head img { |
|||
width: 50px; |
|||
height: 50px; |
|||
margin-right: 10px; |
|||
} |
|||
.head span { |
|||
font-size: 20px; |
|||
color: #ffffff; |
|||
} |
|||
.line { |
|||
border-top: 1px solid hsla(0,0%,100%,.05); |
|||
border-bottom: 1px solid rgba(0,0,0,.2); |
|||
} |
|||
.content { |
|||
display: flex; |
|||
flex-direction: column; |
|||
max-height: 100vh; |
|||
overflow: hidden; |
|||
} |
|||
.main { |
|||
height: calc(100vh - 100px); |
|||
overflow: auto; |
|||
padding: 10px; |
|||
} |
|||
</style> |
|||
<style> |
|||
body { |
|||
padding: 0; |
|||
margin: 0; |
|||
box-sizing: border-box; |
|||
} |
|||
.el-menu { |
|||
border-right: none!important; |
|||
} |
|||
.el-submenu { |
|||
border-top: 1px solid hsla(0, 0%, 100%, .05); |
|||
border-bottom: 1px solid rgba(0, 0, 0, .2); |
|||
} |
|||
.el-submenu:first-child { |
|||
border-top: none; |
|||
} |
|||
.el-submenu [class^="el-icon-"] { |
|||
vertical-align: -1px!important; |
|||
} |
|||
a { |
|||
color: #409eff; |
|||
text-decoration: none; |
|||
} |
|||
.el-pagination { |
|||
text-align: center; |
|||
margin-top: 20px; |
|||
} |
|||
.el-popper__arrow { |
|||
display: none; |
|||
} |
|||
</style> |
After Width: 200 | Height: 200 | Size: 6.7 KiB |
@ -0,0 +1,135 @@ |
|||
<template> |
|||
<el-dialog |
|||
:title="type == 'add' ? '添加分类' : '修改分类'" |
|||
v-model="visible" |
|||
width="400px" |
|||
> |
|||
<el-form :model="ruleForm" :rules="rules" ref="formRef" label-width="100px" class="good-form"> |
|||
<el-form-item required label="商品名称" prop="name"> |
|||
<el-input type="text" v-model="ruleForm.name"></el-input> |
|||
</el-form-item> |
|||
<el-form-item label="排序值" prop="rank"> |
|||
<el-input type="number" v-model="ruleForm.rank"></el-input> |
|||
</el-form-item> |
|||
</el-form> |
|||
<template #footer> |
|||
<span class="dialog-footer"> |
|||
<el-button @click="visible = false">取 消</el-button> |
|||
<el-button type="primary" @click="submitForm">确 定</el-button> |
|||
</span> |
|||
</template> |
|||
</el-dialog> |
|||
</template> |
|||
|
|||
<script> |
|||
import { reactive, ref, toRefs } from 'vue' |
|||
import { useRoute } from 'vue-router' |
|||
import axios from '@/utils/axios' |
|||
import { hasEmoji } from '@/utils/index' |
|||
import { ElMessage } from 'element-plus' |
|||
export default { |
|||
name: 'DialogAddCategory', |
|||
props: { |
|||
type: String, |
|||
reload: Function |
|||
}, |
|||
setup(props) { |
|||
const formRef = ref(null) |
|||
const route = useRoute() |
|||
const state = reactive({ |
|||
visible: false, |
|||
categoryLevel: 1, |
|||
parentId: 0, |
|||
ruleForm: { |
|||
name: '', |
|||
rank: '' |
|||
}, |
|||
rules: { |
|||
name: [ |
|||
{ required: 'true', message: '名称不能为空', trigger: ['change'] } |
|||
], |
|||
rank: [ |
|||
{ required: 'true', message: '编号不能为空', trigger: ['change'] } |
|||
] |
|||
}, |
|||
id: '' |
|||
}) |
|||
// 获取详情 |
|||
const getDetail = (id) => { |
|||
axios.get(`/categories/${id}`).then(res => { |
|||
state.ruleForm = { |
|||
name: res.categoryName, |
|||
rank: res.categoryRank |
|||
} |
|||
state.parentId = res.parentId |
|||
state.categoryLevel = res.categoryLevel |
|||
}) |
|||
} |
|||
// 开启弹窗 |
|||
const open = (id) => { |
|||
state.visible = true |
|||
if (id) { |
|||
state.id = id |
|||
getDetail(id) |
|||
} else { |
|||
// 新增类目,从路由获取父分类id 和 分类级别 |
|||
const { level, parent_id } = route.query |
|||
state.ruleForm = { |
|||
name: '', |
|||
rank: '' |
|||
} |
|||
state.parentId = parent_id |
|||
state.categoryLevel = level |
|||
} |
|||
} |
|||
// 关闭弹窗 |
|||
const close = () => { |
|||
state.visible = false |
|||
} |
|||
const submitForm = () => { |
|||
formRef.value.validate((valid) => { |
|||
if (valid) { |
|||
if (hasEmoji(state.ruleForm.name)) { |
|||
ElMessage.error('不要输入表情包,再输入就打死你个龟孙儿~') |
|||
return |
|||
} |
|||
if (props.type == 'add') { |
|||
axios.post('/categories', { |
|||
categoryLevel: state.categoryLevel, |
|||
parentId: state.parentId, |
|||
categoryName: state.ruleForm.name, |
|||
categoryRank: state.ruleForm.rank |
|||
}).then(() => { |
|||
ElMessage.success('添加成功') |
|||
state.visible = false |
|||
if (props.reload) props.reload() |
|||
}) |
|||
} else { |
|||
axios.put('/categories', { |
|||
categoryId: state.id, |
|||
categoryLevel: state.categoryLevel, |
|||
parentId: state.categoryLevel, |
|||
categoryName: state.ruleForm.name, |
|||
categoryRank: state.ruleForm.rank |
|||
}).then(() => { |
|||
ElMessage.success('修改成功') |
|||
state.visible = false |
|||
if (props.reload) props.reload() |
|||
}) |
|||
} |
|||
} |
|||
}) |
|||
} |
|||
return { |
|||
...toRefs(state), |
|||
open, |
|||
close, |
|||
formRef, |
|||
submitForm |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style scoped> |
|||
</style> |
@ -0,0 +1,143 @@ |
|||
<template> |
|||
<el-dialog |
|||
:title="type == 'add' ? '添加商品' : '修改商品'" |
|||
v-model="visible" |
|||
width="400px" |
|||
> |
|||
<el-form :model="ruleForm" :rules="rules" ref="formRef" label-width="100px" class="good-form"> |
|||
<el-form-item required label="商品名称" prop="name"> |
|||
<el-input type="text" v-model="ruleForm.name"></el-input> |
|||
</el-form-item> |
|||
<el-form-item label="跳转链接" prop="link"> |
|||
<el-input type="text" v-model="ruleForm.link"></el-input> |
|||
</el-form-item> |
|||
<el-form-item required label="商品编号" prop="id"> |
|||
<el-input type="number" v-model="ruleForm.id"></el-input> |
|||
</el-form-item> |
|||
<el-form-item required label="排序值" prop="sort"> |
|||
<el-input type="number" v-model="ruleForm.sort"></el-input> |
|||
</el-form-item> |
|||
</el-form> |
|||
<template #footer> |
|||
<span class="dialog-footer"> |
|||
<el-button @click="visible = false">取 消</el-button> |
|||
<el-button type="primary" @click="submitForm">确 定</el-button> |
|||
</span> |
|||
</template> |
|||
</el-dialog> |
|||
</template> |
|||
|
|||
<script> |
|||
import { reactive, ref, toRefs } from 'vue' |
|||
import axios from '@/utils/axios' |
|||
import { hasEmoji } from '@/utils/index' |
|||
import { ElMessage } from 'element-plus' |
|||
export default { |
|||
name: 'DialogAddHotGood', |
|||
props: { |
|||
type: String, |
|||
configType: Number, |
|||
reload: Function |
|||
}, |
|||
setup(props) { |
|||
const formRef = ref(null) |
|||
const state = reactive({ |
|||
visible: false, |
|||
ruleForm: { |
|||
name: '', |
|||
link: '', |
|||
id: '', |
|||
sort: '' |
|||
}, |
|||
rules: { |
|||
name: [ |
|||
{ required: 'true', message: '名称不能为空', trigger: ['change'] } |
|||
], |
|||
id: [ |
|||
{ required: 'true', message: '编号不能为空', trigger: ['change'] } |
|||
], |
|||
sort: [ |
|||
{ required: 'true', message: '排序不能为空', trigger: ['change'] } |
|||
] |
|||
}, |
|||
id: '' |
|||
}) |
|||
// 获取详情 |
|||
const getDetail = (id) => { |
|||
axios.get(`/indexConfigs/${id}`).then(res => { |
|||
state.ruleForm = { |
|||
name: res.configName, |
|||
id: res.goodsId, |
|||
link: res.redirectUrl, |
|||
sort: res.configRank |
|||
} |
|||
}) |
|||
} |
|||
// 开启弹窗 |
|||
const open = (id) => { |
|||
state.visible = true |
|||
if (id) { |
|||
state.id = id |
|||
getDetail(id) |
|||
} else { |
|||
state.ruleForm = { |
|||
name: '', |
|||
id: '', |
|||
link: '', |
|||
sort: '' |
|||
} |
|||
} |
|||
} |
|||
// 关闭弹窗 |
|||
const close = () => { |
|||
state.visible = false |
|||
} |
|||
const submitForm = () => { |
|||
formRef.value.validate((valid) => { |
|||
if (valid) { |
|||
if (hasEmoji(state.ruleForm.name) || hasEmoji(state.ruleForm.link)) { |
|||
ElMessage.error('不要输入表情包,再输入就打死你个龟孙儿~') |
|||
return |
|||
} |
|||
if (props.type == 'add') { |
|||
axios.post('/indexConfigs', { |
|||
configType: props.configType || 3, |
|||
configName: state.ruleForm.name, |
|||
redirectUrl: state.ruleForm.link, |
|||
goodsId: state.ruleForm.id, |
|||
configRank: state.ruleForm.sort |
|||
}).then(() => { |
|||
ElMessage.success('添加成功') |
|||
state.visible = false |
|||
if (props.reload) props.reload() |
|||
}) |
|||
} else { |
|||
axios.put('/indexConfigs', { |
|||
configId: state.id, |
|||
configType: props.configType || 3, |
|||
configName: state.ruleForm.name, |
|||
redirectUrl: state.ruleForm.link, |
|||
goodsId: state.ruleForm.id, |
|||
configRank: state.ruleForm.sort |
|||
}).then(() => { |
|||
ElMessage.success('修改成功') |
|||
state.visible = false |
|||
if (props.reload) props.reload() |
|||
}) |
|||
} |
|||
} |
|||
}) |
|||
} |
|||
return { |
|||
...toRefs(state), |
|||
open, |
|||
close, |
|||
formRef, |
|||
submitForm |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style scoped> |
|||
</style> |
@ -0,0 +1,162 @@ |
|||
<template> |
|||
<el-dialog |
|||
:title="type == 'add' ? '添加轮播图' : '修改轮播图'" |
|||
v-model="visible" |
|||
width="400px" |
|||
> |
|||
<el-form :model="ruleForm" :rules="rules" ref="formRef" label-width="100px" class="good-form"> |
|||
<el-form-item label="图片" prop="url"> |
|||
<el-upload |
|||
class="avatar-uploader" |
|||
:action="uploadImgServer" |
|||
:headers="{ |
|||
token: token |
|||
}" |
|||
:show-file-list="false" |
|||
:on-success="handleUrlSuccess" |
|||
> |
|||
<img style="width: 200px; height: 100px; border: 1px solid #e9e9e9;" v-if="ruleForm.url" :src="ruleForm.url" class="avatar"> |
|||
<i v-else class="el-icon-plus avatar-uploader-icon"></i> |
|||
</el-upload> |
|||
</el-form-item> |
|||
<el-form-item label="跳转链接" prop="link"> |
|||
<el-input type="text" v-model="ruleForm.link"></el-input> |
|||
</el-form-item> |
|||
<el-form-item required label="排序值" prop="sort"> |
|||
<el-input type="number" v-model="ruleForm.sort"></el-input> |
|||
</el-form-item> |
|||
</el-form> |
|||
<template #footer> |
|||
<span class="dialog-footer"> |
|||
<el-button @click="visible = false">取 消</el-button> |
|||
<el-button type="primary" @click="submitForm">确 定</el-button> |
|||
</span> |
|||
</template> |
|||
</el-dialog> |
|||
</template> |
|||
|
|||
<script> |
|||
import { reactive, ref, toRefs } from 'vue' |
|||
import axios from '@/utils/axios' |
|||
import { localGet, uploadImgServer, hasEmoji } from '@/utils' |
|||
import { ElMessage } from 'element-plus' |
|||
|
|||
export default { |
|||
name: 'DialogAddSwiper', |
|||
props: { |
|||
type: String, |
|||
reload: Function |
|||
}, |
|||
setup(props) { |
|||
const formRef = ref(null) |
|||
const state = reactive({ |
|||
uploadImgServer, |
|||
token: localGet('token') || '', |
|||
visible: false, |
|||
ruleForm: { |
|||
url: '', |
|||
link: '', |
|||
sort: '' |
|||
}, |
|||
rules: { |
|||
url: [ |
|||
{ required: 'true', message: '图片不能为空', trigger: ['change'] } |
|||
], |
|||
sort: [ |
|||
{ required: 'true', message: '排序不能为空', trigger: ['change'] } |
|||
] |
|||
}, |
|||
id: '' |
|||
}) |
|||
// 获取详情 |
|||
const getDetail = (id) => { |
|||
axios.get(`/carousels/${id}`).then(res => { |
|||
state.ruleForm = { |
|||
url: res.carouselUrl, |
|||
link: res.redirectUrl, |
|||
sort: res.carouselRank |
|||
} |
|||
}) |
|||
} |
|||
// 上传图片 |
|||
const handleUrlSuccess = (val) => { |
|||
state.ruleForm.url = val.data || '' |
|||
} |
|||
// 开启弹窗 |
|||
const open = (id) => { |
|||
state.visible = true |
|||
if (id) { |
|||
state.id = id |
|||
getDetail(id) |
|||
} else { |
|||
state.ruleForm = { |
|||
url: '', |
|||
link: '', |
|||
sort: '' |
|||
} |
|||
} |
|||
} |
|||
// 关闭弹窗 |
|||
const close = () => { |
|||
state.visible = false |
|||
} |
|||
const submitForm = () => { |
|||
console.log(formRef.value.validate) |
|||
formRef.value.validate((valid) => { |
|||
if (valid) { |
|||
if (hasEmoji(state.ruleForm.link)) { |
|||
ElMessage.error('不要输入表情包,再输入就打死你个龟孙儿~') |
|||
return |
|||
} |
|||
if (props.type == 'add') { |
|||
axios.post('/carousels', { |
|||
carouselUrl: state.ruleForm.url, |
|||
redirectUrl: state.ruleForm.link, |
|||
carouselRank: state.ruleForm.sort |
|||
}).then(() => { |
|||
ElMessage.success('添加成功') |
|||
state.visible = false |
|||
if (props.reload) props.reload() |
|||
}) |
|||
} else { |
|||
axios.put('/carousels', { |
|||
carouselId: state.id, |
|||
carouselUrl: state.ruleForm.url, |
|||
redirectUrl: state.ruleForm.link, |
|||
carouselRank: state.ruleForm.sort |
|||
}).then(() => { |
|||
ElMessage.success('修改成功') |
|||
state.visible = false |
|||
if (props.reload) props.reload() |
|||
}) |
|||
} |
|||
} |
|||
}) |
|||
} |
|||
return { |
|||
...toRefs(state), |
|||
open, |
|||
close, |
|||
formRef, |
|||
handleUrlSuccess, |
|||
submitForm |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style scoped> |
|||
.avatar-uploader { |
|||
width: 100px; |
|||
height: 100px; |
|||
color: #ddd; |
|||
font-size: 30px; |
|||
} |
|||
.avatar-uploader-icon { |
|||
display: block; |
|||
width: 100%; |
|||
height: 100%; |
|||
border: 1px solid #e9e9e9; |
|||
padding: 32px 17px; |
|||
} |
|||
</style> |
@ -0,0 +1,25 @@ |
|||
<template> |
|||
<div class="footer"> |
|||
<div class="left">Copyright © 2019-2021 十三. All rights reserved.</div> |
|||
<div class="right"> |
|||
<a target="_blank" href="https://github.com/newbee-ltd/vue3-admin">vue3-admin Version 3.0.0</a> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
name: 'Footer' |
|||
} |
|||
</script> |
|||
|
|||
<style scoped> |
|||
.footer { |
|||
height: 50px; |
|||
border-top: 1px solid #e9e9e9; |
|||
display: flex; |
|||
justify-content: space-between; |
|||
align-items: center; |
|||
padding: 0 20px; |
|||
} |
|||
</style> |
@ -0,0 +1,136 @@ |
|||
<template> |
|||
<div class="header"> |
|||
<div class="left"> |
|||
<i v-if="hasBack" class="el-icon-back" @click="back"></i> |
|||
<span style="font-size: 20px">{{ name }}</span> |
|||
</div> |
|||
<div class="right"> |
|||
<el-popover |
|||
placement="bottom" |
|||
:width="320" |
|||
trigger="click" |
|||
popper-class="popper-user-box" |
|||
> |
|||
<template #reference> |
|||
<div class="author"> |
|||
<i class="icon el-icon-s-custom" /> |
|||
{{ userInfo && userInfo.nickName || '' }} |
|||
<i class="el-icon-caret-bottom" /> |
|||
</div> |
|||
</template> |
|||
<div class="nickname"> |
|||
<p>登录名:{{ userInfo && userInfo.loginUserName || '' }}</p> |
|||
<p>昵称:{{ userInfo && userInfo.nickName || '' }}</p> |
|||
<el-tag size="small" effect="dark" class="logout" @click="logout">退出</el-tag> |
|||
</div> |
|||
</el-popover> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
import { onMounted, reactive, toRefs } from 'vue' |
|||
import { useRouter } from 'vue-router' |
|||
import axios from '@/utils/axios' |
|||
export default { |
|||
name: 'Header', |
|||
setup() { |
|||
const router = useRouter() |
|||
const pathMap = { |
|||
dashboard: '大盘数据', |
|||
add: '添加商品', |
|||
swiper: '轮播图配置', |
|||
hot: '热销商品配置', |
|||
new: '新品上线配置', |
|||
recommend: '为你推荐配置', |
|||
category: '分类管理', |
|||
level2: '分类二级管理', |
|||
level3: '分类三级管理', |
|||
good: '商品管理', |
|||
guest: '会员管理', |
|||
order: '订单管理', |
|||
order_detail: '订单详情', |
|||
account: '修改账户' |
|||
} |
|||
const state = reactive({ |
|||
name: 'dashboard', |
|||
userInfo: null, |
|||
hasBack: false |
|||
}) |
|||
onMounted(() => { |
|||
const pathname = window.location.hash.split('/')[1] || '' |
|||
if (!['login'].includes(pathname)) { |
|||
getUserInfo() |
|||
} |
|||
}) |
|||
const getUserInfo = async () => { |
|||
const userInfo = await axios.get('/adminUser/profile') |
|||
state.userInfo = userInfo |
|||
} |
|||
const logout = () => { |
|||
axios.delete('/logout').then(() => { |
|||
router.push({ path: '/login' }) |
|||
}) |
|||
} |
|||
const back = () => { |
|||
router.back() |
|||
} |
|||
router.afterEach((to) => { |
|||
console.log('to', to) |
|||
const { id } = to.query |
|||
state.name = pathMap[to.name] |
|||
if (id && to.name == 'add') { |
|||
state.name = '编辑商品' |
|||
} |
|||
state.hasBack = ['level2', 'level3', 'order_detail'].includes(to.name) |
|||
}) |
|||
return { |
|||
...toRefs(state), |
|||
logout, |
|||
back |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style scoped> |
|||
.header { |
|||
height: 50px; |
|||
border-bottom: 1px solid #e9e9e9; |
|||
display: flex; |
|||
justify-content: space-between; |
|||
align-items: center; |
|||
padding: 0 20px; |
|||
} |
|||
.el-icon-back { |
|||
border: 1px solid #e9e9e9; |
|||
padding: 4px; |
|||
border-radius: 50px; |
|||
margin-right: 10px; |
|||
} |
|||
.right > div > .icon{ |
|||
font-size: 18px; |
|||
margin-right: 6px; |
|||
} |
|||
.author { |
|||
margin-left: 10px; |
|||
cursor: pointer; |
|||
} |
|||
</style> |
|||
<style> |
|||
.popper-user-box { |
|||
background: url('https://s.yezgea02.com/lingling-h5/static/account-banner-bg.png') 50% 50% no-repeat!important; |
|||
background-size: cover!important; |
|||
border-radius: 0!important; |
|||
} |
|||
.popper-user-box .nickname { |
|||
position: relative; |
|||
color: #ffffff; |
|||
} |
|||
.popper-user-box .nickname .logout { |
|||
position: absolute; |
|||
right: 0; |
|||
top: 0; |
|||
cursor: pointer; |
|||
} |
|||
</style> |
@ -0,0 +1,69 @@ |
|||
import { createApp } from 'vue' |
|||
import { ElButton, ElContainer, ElAside, ElHeader, ElMain, ElFooter, ElMenu, ElSubmenu, ElMenuItemGroup, ElMenuItem, ElForm, ElFormItem, ElInput, ElPopover, ElTag, ElCard, ElTable, ElTableColumn, ElPagination, ElDialog, ElPopconfirm, ElUpload, ElLoading, ElSelect, ElOption, ElRadioGroup, ElRadio, ElCascader, ElCheckbox, ElInputNumber } from 'element-plus' |
|||
import App from './App.vue' |
|||
import router from './router/index' |
|||
|
|||
// 修改后的主题样式必须放在最后面
|
|||
import '../theme/index.css' |
|||
|
|||
const orderStatus = { |
|||
0: '待支付', |
|||
1: '已支付', |
|||
2: '配货完成', |
|||
3: '出库成功', |
|||
4: '交易成功', |
|||
'-1': '手动关闭', |
|||
'-2': '超时关闭', |
|||
'-3': '商家关闭' |
|||
} |
|||
|
|||
const app = createApp(App) |
|||
// 全局过滤器
|
|||
app.config.globalProperties.$filters = { |
|||
orderMap(status) { |
|||
return orderStatus[status] || '未知状态' |
|||
}, |
|||
prefix(url) { |
|||
if (url && url.startsWith('http')) { |
|||
return url |
|||
} else { |
|||
url = `http://backend-api-02.newbee.ltd${url}` |
|||
return url |
|||
} |
|||
} |
|||
} |
|||
|
|||
app.use(router) |
|||
|
|||
app.use(ElButton) |
|||
.use(ElContainer) |
|||
.use(ElAside) |
|||
.use(ElHeader) |
|||
.use(ElMain) |
|||
.use(ElFooter) |
|||
.use(ElMenu) |
|||
.use(ElSubmenu) |
|||
.use(ElMenuItemGroup) |
|||
.use(ElMenuItem) |
|||
.use(ElForm) |
|||
.use(ElFormItem) |
|||
.use(ElInput) |
|||
.use(ElPopover) |
|||
.use(ElTag) |
|||
.use(ElCard) |
|||
.use(ElTable) |
|||
.use(ElTableColumn) |
|||
.use(ElPagination) |
|||
.use(ElDialog) |
|||
.use(ElPopconfirm) |
|||
.use(ElUpload) |
|||
.use(ElLoading) |
|||
.use(ElSelect) |
|||
.use(ElOption) |
|||
.use(ElRadioGroup) |
|||
.use(ElRadio) |
|||
.use(ElCascader) |
|||
.use(ElCheckbox) |
|||
.use(ElInputNumber) |
|||
|
|||
app.mount('#app') |
@ -0,0 +1,95 @@ |
|||
import { createRouter, createWebHashHistory } from 'vue-router' |
|||
|
|||
const router = createRouter({ |
|||
history: createWebHashHistory(), // hash模式:createWebHashHistory,history模式:createWebHistory
|
|||
routes: [ |
|||
{ |
|||
path: '/', |
|||
redirect: '/introduce' |
|||
}, |
|||
{ |
|||
path: '/introduce', |
|||
name: 'introduce', |
|||
component: () => import(/* webpackChunkName: "introduce" */ '../views/Introduce.vue') |
|||
}, |
|||
{ |
|||
path: '/dashboard', |
|||
name: 'dashboard', |
|||
component: () => import(/* webpackChunkName: "dashboard" */ '../views/Index.vue') |
|||
}, |
|||
{ |
|||
path: '/login', |
|||
name: 'login', |
|||
component: () => import(/* webpackChunkName: "login" */ '../views/Login.vue') |
|||
}, |
|||
{ |
|||
path: '/add', |
|||
name: 'add', |
|||
component: () => import(/* webpackChunkName: "add" */ '../views/AddGood.vue') |
|||
}, |
|||
{ |
|||
path: '/swiper', |
|||
name: 'swiper', |
|||
component: () => import(/* webpackChunkName: "swiper" */ '../views/Swiper.vue') |
|||
}, |
|||
{ |
|||
path: '/hot', |
|||
name: 'hot', |
|||
component: () => import(/* webpackChunkName: "hot" */ '../views/IndexConfig.vue') |
|||
}, |
|||
{ |
|||
path: '/new', |
|||
name: 'new', |
|||
component: () => import(/* webpackChunkName: "new" */ '../views/IndexConfig.vue') |
|||
}, |
|||
{ |
|||
path: '/recommend', |
|||
name: 'recommend', |
|||
component: () => import(/* webpackChunkName: "recommend" */ '../views/IndexConfig.vue') |
|||
}, |
|||
{ |
|||
path: '/category', |
|||
name: 'category', |
|||
component: () => import(/* webpackChunkName: "category" */ '../views/Category.vue'), |
|||
children: [ |
|||
{ |
|||
path: '/category/level2', |
|||
name: 'level2', |
|||
component: () => import(/* webpackChunkName: "level2" */ '../views/Category.vue'), |
|||
}, |
|||
{ |
|||
path: '/category/level3', |
|||
name: 'level3', |
|||
component: () => import(/* webpackChunkName: "level3" */ '../views/Category.vue'), |
|||
} |
|||
] |
|||
}, |
|||
{ |
|||
path: '/good', |
|||
name: 'good', |
|||
component: () => import(/* webpackChunkName: "new" */ '../views/Good.vue') |
|||
}, |
|||
{ |
|||
path: '/guest', |
|||
name: 'guest', |
|||
component: () => import(/* webpackChunkName: "guest" */ '../views/Guest.vue') |
|||
}, |
|||
{ |
|||
path: '/order', |
|||
name: 'order', |
|||
component: () => import(/* webpackChunkName: "order" */ '../views/Order.vue') |
|||
}, |
|||
{ |
|||
path: '/order_detail', |
|||
name: 'order_detail', |
|||
component: () => import(/* webpackChunkName: "order_detail" */ '../views/OrderDetail.vue') |
|||
}, |
|||
{ |
|||
path: '/account', |
|||
name: 'account', |
|||
component: () => import(/* webpackChunkName: "account" */ '../views/Account.vue') |
|||
} |
|||
] |
|||
}) |
|||
|
|||
export default router |
@ -0,0 +1,35 @@ |
|||
import axios from 'axios' |
|||
import { ElMessage } from 'element-plus' |
|||
import router from '@/router/index' |
|||
import { localGet } from './index' |
|||
import config from '~/config' |
|||
|
|||
|
|||
// 这边由于后端没有区分测试和正式,姑且都写成一个接口。
|
|||
axios.defaults.baseURL = config[import.meta.env.MODE].baseUrl |
|||
// 携带 cookie,对目前的项目没有什么作用,因为我们是 token 鉴权
|
|||
axios.defaults.withCredentials = true |
|||
// 请求头,headers 信息
|
|||
axios.defaults.headers['X-Requested-With'] = 'XMLHttpRequest' |
|||
axios.defaults.headers['token'] = localGet('token') || '' |
|||
// 默认 post 请求,使用 application/json 形式
|
|||
axios.defaults.headers.post['Content-Type'] = 'application/json' |
|||
|
|||
// 请求拦截器,内部根据返回值,重新组装,统一管理。
|
|||
axios.interceptors.response.use(res => { |
|||
if (typeof res.data !== 'object') { |
|||
ElMessage.error('服务端异常!') |
|||
return Promise.reject(res) |
|||
} |
|||
if (res.data.resultCode != 200) { |
|||
if (res.data.message) ElMessage.error(res.data.message) |
|||
if (res.data.resultCode == 419) { |
|||
router.push({ path: '/login' }) |
|||
} |
|||
return Promise.reject(res.data) |
|||
} |
|||
|
|||
return res.data.data |
|||
}) |
|||
|
|||
export default axios |
@ -0,0 +1,27 @@ |
|||
export function localGet (key) { |
|||
const value = window.localStorage.getItem(key) |
|||
try { |
|||
return JSON.parse(window.localStorage.getItem(key)) |
|||
} catch (error) { |
|||
return value |
|||
} |
|||
} |
|||
|
|||
export function localSet (key, value) { |
|||
window.localStorage.setItem(key, JSON.stringify(value)) |
|||
} |
|||
|
|||
export function localRemove (key) { |
|||
window.localStorage.removeItem(key) |
|||
} |
|||
|
|||
// 判断内容是否含有表情字符,现有数据库不支持。
|
|||
export function hasEmoji (str = '') { |
|||
const reg = /[^\u0020-\u007E\u00A0-\u00BE\u2E80-\uA4CF\uF900-\uFAFF\uFE30-\uFE4F\uFF00-\uFFEF\u0080-\u009F\u2000-\u201f\u2026\u2022\u20ac\r\n]/g; |
|||
return str.match(reg) && str.match(reg).length |
|||
} |
|||
|
|||
// 单张图片上传
|
|||
export const uploadImgServer = 'http://backend-api-02.newbee.ltd/manage-api/v1/upload/file' |
|||
// 多张图片上传
|
|||
export const uploadImgsServer = 'http://backend-api-02.newbee.ltd/manage-api/v1/upload/files' |
@ -0,0 +1,113 @@ |
|||
<template> |
|||
<el-card class="account-container"> |
|||
<el-form :model="nameForm" :rules="rules" ref="nameRef" label-width="80px" label-position="right" class="demo-ruleForm"> |
|||
<el-form-item required label="登录名:" prop="loginName"> |
|||
<el-input style="width: 200px" v-model="nameForm.loginName"></el-input> |
|||
</el-form-item> |
|||
<el-form-item required label="昵称:" prop="nickName"> |
|||
<el-input style="width: 200px" v-model="nameForm.nickName"></el-input> |
|||
</el-form-item> |
|||
<el-form-item> |
|||
<el-button type="danger" @click="submitName">确认修改</el-button> |
|||
</el-form-item> |
|||
</el-form> |
|||
</el-card> |
|||
<el-card class="account-container"> |
|||
<el-form :model="passForm" :rules="rules" ref="passRef" label-width="80px" label-position="right" class="demo-ruleForm"> |
|||
<el-form-item required label="原密码:" prop="oldpass"> |
|||
<el-input style="width: 200px" v-model="passForm.oldpass"></el-input> |
|||
</el-form-item> |
|||
<el-form-item required label="新密码:" prop="newpass"> |
|||
<el-input style="width: 200px" v-model="passForm.newpass"></el-input> |
|||
</el-form-item> |
|||
<el-form-item> |
|||
<el-button type="danger" @click="submitPass">确认修改</el-button> |
|||
</el-form-item> |
|||
</el-form> |
|||
</el-card> |
|||
</template> |
|||
|
|||
<script> |
|||
import { onMounted, reactive, ref, toRefs } from 'vue' |
|||
import axios from '@/utils/axios' |
|||
import { ElMessage } from 'element-plus' |
|||
import md5 from 'js-md5' |
|||
export default { |
|||
name: 'Account', |
|||
setup() { |
|||
const nameRef = ref(null) |
|||
const passRef = ref(null) |
|||
const state = reactive({ |
|||
user: null, |
|||
nameForm: { |
|||
loginName: '', |
|||
nickName: '' |
|||
}, |
|||
passForm: { |
|||
oldpass: '', |
|||
newpass: '' |
|||
}, |
|||
rules: { |
|||
loginName: [ |
|||
{ required: 'true', message: '登录名不能为空', trigger: ['change'] } |
|||
], |
|||
nickName: [ |
|||
{ required: 'true', message: '昵称不能为空', trigger: ['change'] } |
|||
], |
|||
oldpass: [ |
|||
{ required: 'true', message: '原密码不能为空', trigger: ['change'] } |
|||
], |
|||
newpass: [ |
|||
{ required: 'true', message: '新密码不能为空', trigger: ['change'] } |
|||
] |
|||
}, |
|||
}) |
|||
onMounted(() => { |
|||
axios.get('/adminUser/profile').then(res => { |
|||
state.user = res |
|||
state.nameForm.loginName = res.loginUserName |
|||
state.nameForm.nickName = res.nickName |
|||
}) |
|||
}) |
|||
const submitName = () => { |
|||
nameRef.value.validate((vaild) => { |
|||
if (vaild) { |
|||
axios.put('/adminUser/name', { |
|||
loginUserName: state.nameForm.loginName, |
|||
nickName: state.nameForm.nickName |
|||
}).then(() => { |
|||
ElMessage.success('修改成功') |
|||
window.location.reload() |
|||
}) |
|||
} |
|||
}) |
|||
} |
|||
const submitPass = () => { |
|||
passRef.value.validate((vaild) => { |
|||
if (vaild) { |
|||
axios.put('/adminUser/password', { |
|||
originalPassword: md5(state.passForm.oldpass), |
|||
newPassword: md5(state.passForm.newpass) |
|||
}).then(() => { |
|||
ElMessage.success('修改成功') |
|||
window.location.reload() |
|||
}) |
|||
} |
|||
}) |
|||
} |
|||
return { |
|||
...toRefs(state), |
|||
nameRef, |
|||
passRef, |
|||
submitName, |
|||
submitPass |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style> |
|||
.account-container { |
|||
margin-bottom: 20px; |
|||
} |
|||
</style> |
@ -0,0 +1,257 @@ |
|||
<template> |
|||
<div class="add"> |
|||
<el-card class="add-container"> |
|||
<el-form :model="goodForm" :rules="rules" ref="goodRef" label-width="100px" class="goodForm"> |
|||
<el-form-item required label="商品分类"> |
|||
<el-cascader :placeholder="defaultCate" style="width: 300px" :props="category" @change="handleChangeCate"></el-cascader> |
|||
</el-form-item> |
|||
<el-form-item required label="商品名称" prop="goodsName"> |
|||
<el-input style="width: 300px" v-model="goodForm.goodsName" placeholder="请输入商品名称"></el-input> |
|||
</el-form-item> |
|||
<el-form-item label="商品简介" prop="goodsIntro"> |
|||
<el-input style="width: 300px" type="textarea" v-model="goodForm.goodsIntro" placeholder="请输入商品简介(100字)"></el-input> |
|||
</el-form-item> |
|||
<el-form-item required label="商品价格" prop="originalPrice"> |
|||
<el-input type="number" min="0" style="width: 300px" v-model="goodForm.originalPrice" placeholder="请输入商品价格"></el-input> |
|||
</el-form-item> |
|||
<el-form-item required label="商品售卖价" prop="sellingPrice"> |
|||
<el-input type="number" min="0" style="width: 300px" v-model="goodForm.sellingPrice" placeholder="请输入商品售价"></el-input> |
|||
</el-form-item> |
|||
<el-form-item required label="商品库存" prop="stockNum"> |
|||
<el-input type="number" min="0" style="width: 300px" v-model="goodForm.stockNum" placeholder="请输入商品库存"></el-input> |
|||
</el-form-item> |
|||
<el-form-item required label="商品标签" prop="tag"> |
|||
<el-input style="width: 300px" v-model="goodForm.tag" placeholder="请输入商品小标签"></el-input> |
|||
</el-form-item> |
|||
<el-form-item label="上架状态" prop="goodsSellStatus"> |
|||
<el-radio-group v-model="goodForm.goodsSellStatus"> |
|||
<el-radio label="0">上架</el-radio> |
|||
<el-radio label="1">下架</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
<el-form-item required label="商品主图" prop="goodsCoverImg"> |
|||
<el-upload |
|||
class="avatar-uploader" |
|||
:action="uploadImgServer" |
|||
:headers="{ |
|||
token: token |
|||
}" |
|||
:show-file-list="false" |
|||
:on-success="handleUrlSuccess" |
|||
> |
|||
<img style="width: 100px; border: 1px solid #e9e9e9;" v-if="goodForm.goodsCoverImg" :src="goodForm.goodsCoverImg" class="avatar"> |
|||
<i v-else class="el-icon-plus avatar-uploader-icon"></i> |
|||
</el-upload> |
|||
</el-form-item> |
|||
<el-form-item label="详情内容"> |
|||
<div ref='editor'></div> |
|||
</el-form-item> |
|||
<el-form-item> |
|||
<el-button type="primary" @click="submitAdd()">{{ id ? '立即修改' : '立即创建' }}</el-button> |
|||
</el-form-item> |
|||
</el-form> |
|||
</el-card> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
import { reactive, ref, toRefs, onMounted, onBeforeUnmount, getCurrentInstance } from 'vue' |
|||
import WangEditor from 'wangeditor' |
|||
import axios from '@/utils/axios' |
|||
import { ElMessage } from 'element-plus' |
|||
import { useRoute, useRouter } from 'vue-router' |
|||
import { localGet, uploadImgServer, uploadImgsServer, hasEmoji } from '@/utils' |
|||
export default { |
|||
name: 'AddGood', |
|||
setup() { |
|||
const { proxy } = getCurrentInstance() |
|||
console.log('proxy', proxy) |
|||
const editor = ref(null) |
|||
const goodRef = ref(null) |
|||
const route = useRoute() |
|||
const router = useRouter() |
|||
const { id } = route.query |
|||
const state = reactive({ |
|||
uploadImgServer, |
|||
token: localGet('token') || '', |
|||
id: id, |
|||
defaultCate: '', |
|||
goodForm: { |
|||
goodsName: '', |
|||
goodsIntro: '', |
|||
originalPrice: '', |
|||
sellingPrice: '', |
|||
stockNum: '', |
|||
goodsSellStatus: '0', |
|||
goodsCoverImg: '', |
|||
tag: '' |
|||
}, |
|||
rules: { |
|||
goodsName: [ |
|||
{ required: 'true', message: '请填写商品名称', trigger: ['change'] } |
|||
], |
|||
originalPrice: [ |
|||
{ required: 'true', message: '请填写商品价格', trigger: ['change'] } |
|||
], |
|||
sellingPrice: [ |
|||
{ required: 'true', message: '请填写商品售价', trigger: ['change'] } |
|||
], |
|||
stockNum: [ |
|||
{ required: 'true', message: '请填写商品库存', trigger: ['change'] } |
|||
], |
|||
}, |
|||
categoryId: '', |
|||
category: { |
|||
lazy: true, |
|||
lazyLoad(node, resolve) { |
|||
const { level = 0, value } = node |
|||
axios.get('/categories', { |
|||
params: { |
|||
pageNumber: 1, |
|||
pageSize: 1000, |
|||
categoryLevel: level + 1, |
|||
parentId: value || 0 |
|||
} |
|||
}).then(res => { |
|||
const list = res.list |
|||
const nodes = list.map(item => ({ |
|||
value: item.categoryId, |
|||
label: item.categoryName, |
|||
leaf: level > 1 |
|||
})) |
|||
resolve(nodes) |
|||
}) |
|||
} |
|||
} |
|||
}) |
|||
let instance |
|||
onMounted(() => { |
|||
instance = new WangEditor(editor.value) |
|||
instance.config.showLinkImg = false |
|||
instance.config.showLinkImgAlt = false |
|||
instance.config.showLinkImgHref = false |
|||
instance.config.uploadImgMaxSize = 2 * 1024 * 1024 // 2M |
|||
instance.config.uploadFileName = 'file' |
|||
instance.config.uploadImgHeaders = { |
|||
token: state.token |
|||
} |
|||
// 图片返回格式不同,需要自定义返回格式 |
|||
instance.config.uploadImgHooks = { |
|||
// 图片上传并返回了结果,想要自己把图片插入到编辑器中 |
|||
// 例如服务器端返回的不是 { errno: 0, data: [...] } 这种格式,可使用 customInsert |
|||
customInsert: function(insertImgFn, result) { |
|||
console.log('result', result) |
|||
// result 即服务端返回的接口 |
|||
// insertImgFn 可把图片插入到编辑器,传入图片 src ,执行函数即可 |
|||
if (result.data && result.data.length) { |
|||
result.data.forEach(item => insertImgFn(item)) |
|||
} |
|||
} |
|||
} |
|||
instance.config.uploadImgServer = uploadImgsServer |
|||
Object.assign(instance.config, { |
|||
onchange() { |
|||
console.log('change') |
|||
}, |
|||
}) |
|||
instance.create() |
|||
if (id) { |
|||
axios.get(`/goods/${id}`).then(res => { |
|||
const { goods, firstCategory, secondCategory, thirdCategory } = res |
|||
state.goodForm = { |
|||
goodsName: goods.goodsName, |
|||
goodsIntro: goods.goodsIntro, |
|||
originalPrice: goods.originalPrice, |
|||
sellingPrice: goods.sellingPrice, |
|||
stockNum: goods.stockNum, |
|||
goodsSellStatus: String(goods.goodsSellStatus), |
|||
goodsCoverImg: proxy.$filters.prefix(goods.goodsCoverImg), |
|||
tag: goods.tag |
|||
} |
|||
state.categoryId = goods.goodsCategoryId |
|||
state.defaultCate = `${firstCategory.categoryName}/${secondCategory.categoryName}/${thirdCategory.categoryName}` |
|||
if (instance) { |
|||
// 初始化商品详情 html |
|||
instance.txt.html(goods.goodsDetailContent) |
|||
} |
|||
}) |
|||
} |
|||
}) |
|||
onBeforeUnmount(() => { |
|||
instance.destroy() |
|||
instance = null |
|||
}) |
|||
const submitAdd = () => { |
|||
goodRef.value.validate((vaild) => { |
|||
if (vaild) { |
|||
// 默认新增用 post 方法 |
|||
let httpOption = axios.post |
|||
let params = { |
|||
goodsCategoryId: state.categoryId, |
|||
goodsCoverImg: state.goodForm.goodsCoverImg, |
|||
goodsDetailContent: instance.txt.html(), |
|||
goodsIntro: state.goodForm.goodsIntro, |
|||
goodsName: state.goodForm.goodsName, |
|||
goodsSellStatus: state.goodForm.goodsSellStatus, |
|||
originalPrice: state.goodForm.originalPrice, |
|||
sellingPrice: state.goodForm.sellingPrice, |
|||
stockNum: state.goodForm.stockNum, |
|||
tag: state.goodForm.tag |
|||
} |
|||
if (hasEmoji(params.goodsIntro) || hasEmoji(params.goodsName) || hasEmoji(params.tag) || hasEmoji(params.goodsDetailContent)) { |
|||
ElMessage.error('不要输入表情包,再输入就打死你个龟孙儿~') |
|||
return |
|||
} |
|||
console.log('params', params) |
|||
if (id) { |
|||
params.goodsId = id |
|||
// 修改商品使用 put 方法 |
|||
httpOption = axios.put |
|||
} |
|||
httpOption('/goods', params).then(() => { |
|||
ElMessage.success(id ? '修改成功' : '添加成功') |
|||
router.push({ path: '/good' }) |
|||
}) |
|||
} |
|||
}) |
|||
} |
|||
const handleUrlSuccess = (val) => { |
|||
state.goodForm.goodsCoverImg = val.data || '' |
|||
} |
|||
const handleChangeCate = (val) => { |
|||
state.categoryId = val[2] || 0 |
|||
} |
|||
return { |
|||
...toRefs(state), |
|||
goodRef, |
|||
submitAdd, |
|||
handleUrlSuccess, |
|||
editor, |
|||
handleChangeCate |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style scoped> |
|||
.add { |
|||
display: flex; |
|||
} |
|||
.add-container { |
|||
flex: 1; |
|||
height: 100%; |
|||
} |
|||
.avatar-uploader { |
|||
width: 100px; |
|||
height: 100px; |
|||
color: #ddd; |
|||
font-size: 30px; |
|||
} |
|||
.avatar-uploader-icon { |
|||
display: block; |
|||
width: 100%; |
|||
height: 100%; |
|||
border: 1px solid #e9e9e9; |
|||
padding: 32px 17px; |
|||
} |
|||
</style> |
@ -0,0 +1,213 @@ |
|||
<template> |
|||
<el-card class="category-container"> |
|||
<template #header> |
|||
<div class="header"> |
|||
<el-button type="primary" size="small" icon="el-icon-plus" @click="handleAdd">增加</el-button> |
|||
<el-popconfirm |
|||
title="确定删除吗?" |
|||
@confirm="handleDelete" |
|||
> |
|||
<template #reference> |
|||
<el-button type="danger" size="small" icon="el-icon-delete">批量删除</el-button> |
|||
</template> |
|||
</el-popconfirm> |
|||
</div> |
|||
</template> |
|||
<el-table |
|||
v-loading="loading" |
|||
ref="multipleTable" |
|||
:data="tableData" |
|||
tooltip-effect="dark" |
|||
style="width: 100%" |
|||
@selection-change="handleSelectionChange"> |
|||
<el-table-column |
|||
type="selection" |
|||
width="55" |
|||
> |
|||
</el-table-column> |
|||
<el-table-column |
|||
prop="categoryName" |
|||
label="分类名称" |
|||
> |
|||
</el-table-column> |
|||
<el-table-column |
|||
prop="categoryRank" |
|||
label="排序值" |
|||
width="120" |
|||
> |
|||
</el-table-column> |
|||
<el-table-column |
|||
prop="createTime" |
|||
label="添加时间" |
|||
width="200" |
|||
> |
|||
</el-table-column> |
|||
<el-table-column |
|||
label="操作" |
|||
width="220" |
|||
> |
|||
<template #default="scope"> |
|||
<a style="cursor: pointer; margin-right: 10px" @click="handleEdit(scope.row.categoryId)">修改</a> |
|||
<a style="cursor: pointer; margin-right: 10px" @click="handleNext(scope.row)">下级分类</a> |
|||
<el-popconfirm |
|||
title="确定删除吗?" |
|||
@confirm="handleDeleteOne(scope.row.categoryId)" |
|||
> |
|||
<template #reference> |
|||
<a style="cursor: pointer">删除</a> |
|||
</template> |
|||
</el-popconfirm> |
|||
</template> |
|||
</el-table-column> |
|||
</el-table> |
|||
<!--总数超过一页,再展示分页器--> |
|||
<el-pagination |
|||
background |
|||
layout="prev, pager, next" |
|||
:total="total" |
|||
:page-size="pageSize" |
|||
:current-page="currentPage" |
|||
@current-change="changePage" |
|||
/> |
|||
</el-card> |
|||
<DialogAddCategory ref='addGood' :reload="getCategory" :type="type" :level="level" :parent_id="parent_id" /> |
|||
</template> |
|||
|
|||
<script> |
|||
import { onMounted, reactive, ref, toRefs } from 'vue' |
|||
import { useRoute, useRouter } from 'vue-router' |
|||
import { ElMessage } from 'element-plus' |
|||
import DialogAddCategory from '@/components/DialogAddCategory.vue' |
|||
import axios from '@/utils/axios' |
|||
export default { |
|||
name: 'Category', |
|||
components: { |
|||
DialogAddCategory |
|||
}, |
|||
setup() { |
|||
const multipleTable = ref(null) |
|||
const addGood = ref(null) |
|||
const router = useRouter() |
|||
const route = useRoute() |
|||
const state = reactive({ |
|||
loading: false, |
|||
tableData: [], // 数据列表 |
|||
multipleSelection: [], // 选中项 |
|||
total: 0, // 总条数 |
|||
currentPage: 1, // 当前页 |
|||
pageSize: 10, // 分页大小 |
|||
type: 'add', // 操作类型 |
|||
level: 1, |
|||
parent_id: 0 |
|||
}) |
|||
onMounted(() => { |
|||
getCategory() |
|||
}) |
|||
router.afterEach((to) => { |
|||
if (['category', 'level2', 'level3'].includes(to.name)) { |
|||
getCategory() |
|||
} |
|||
}) |
|||
// 获取分类列表 |
|||
const getCategory = () => { |
|||
const { level = 1, parent_id = 0 } = route.query |
|||
state.loading = true |
|||
axios.get('/categories', { |
|||
params: { |
|||
pageNumber: state.currentPage, |
|||
pageSize: state.pageSize, |
|||
categoryLevel: level, |
|||
parentId: parent_id |
|||
} |
|||
}).then(res => { |
|||
state.tableData = res.list |
|||
state.total = res.totalCount |
|||
state.currentPage = res.currPage |
|||
state.loading = false |
|||
state.level = level |
|||
state.parentId = parent_id |
|||
}) |
|||
} |
|||
// 添加分类 |
|||
const handleAdd = () => { |
|||
state.type = 'add' |
|||
addGood.value.open() |
|||
} |
|||
// 修改分类 |
|||
const handleEdit = (id) => { |
|||
state.type = 'edit' |
|||
addGood.value.open(id) |
|||
} |
|||
// 选择项 |
|||
const handleSelectionChange = (val) => { |
|||
state.multipleSelection = val |
|||
} |
|||
// 批量删除 |
|||
const handleDelete = () => { |
|||
if (!state.multipleSelection.length) { |
|||
ElMessage.error('请选择项') |
|||
return |
|||
} |
|||
axios.delete('/categories', { |
|||
data: { |
|||
ids: state.multipleSelection.map(i => i.categoryId) |
|||
} |
|||
}).then(() => { |
|||
ElMessage.success('删除成功') |
|||
getCategory() |
|||
}) |
|||
} |
|||
// 单个删除 |
|||
const handleDeleteOne = (id) => { |
|||
axios.delete('/categories', { |
|||
data: { |
|||
ids: [id] |
|||
} |
|||
}).then(() => { |
|||
ElMessage.success('删除成功') |
|||
getCategory() |
|||
}) |
|||
} |
|||
const changePage = (val) => { |
|||
state.currentPage = val |
|||
getCategory() |
|||
} |
|||
const handleNext = (item) => { |
|||
const levelNumber = item.categoryLevel + 1 |
|||
if (levelNumber == 4) { |
|||
ElMessage.error('没有下一级') |
|||
return |
|||
} |
|||
router.push({ |
|||
name: `level${levelNumber}`, |
|||
query: { |
|||
level: levelNumber, |
|||
parent_id: item.categoryId |
|||
} |
|||
}) |
|||
} |
|||
return { |
|||
...toRefs(state), |
|||
multipleTable, |
|||
handleSelectionChange, |
|||
addGood, |
|||
handleAdd, |
|||
handleEdit, |
|||
handleDelete, |
|||
handleDeleteOne, |
|||
getCategory, |
|||
changePage, |
|||
handleNext |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style scoped> |
|||
.category-container { |
|||
min-height: 100%; |
|||
} |
|||
.el-card.is-always-shadow { |
|||
min-height: 100%!important; |
|||
} |
|||
</style> |
@ -0,0 +1,163 @@ |
|||
<template> |
|||
<el-card class="swiper-container"> |
|||
<template #header> |
|||
<div class="header"> |
|||
<el-button type="primary" size="small" icon="el-icon-plus" @click="handleAdd">新增商品</el-button> |
|||
</div> |
|||
</template> |
|||
<el-table |
|||
v-loading="loading" |
|||
ref="multipleTable" |
|||
:data="tableData" |
|||
tooltip-effect="dark" |
|||
style="width: 100%" |
|||
@selection-change="handleSelectionChange"> |
|||
<el-table-column |
|||
type="selection" |
|||
width="55"> |
|||
</el-table-column> |
|||
<el-table-column |
|||
prop="goodsId" |
|||
label="商品编号" |
|||
> |
|||
</el-table-column> |
|||
<el-table-column |
|||
prop="goodsName" |
|||
label="商品名" |
|||
> |
|||
</el-table-column> |
|||
<el-table-column |
|||
prop="goodsIntro" |
|||
label="商品简介" |
|||
> |
|||
</el-table-column> |
|||
<el-table-column |
|||
label="商品图片" |
|||
width="150px" |
|||
> |
|||
<template #default="scope"> |
|||
<img style="width: 100px" :key="scope.row.goodsId" :src="$filters.prefix(scope.row.goodsCoverImg)" alt="商品主图"> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column |
|||
prop="stockNum" |
|||
label="商品库存" |
|||
> |
|||
</el-table-column> |
|||
<el-table-column |
|||
prop="sellingPrice" |
|||
label="商品售价" |
|||
> |
|||
</el-table-column> |
|||
<el-table-column |
|||
label="上架状态" |
|||
> |
|||
<template #default="scope"> |
|||
<span style="color: green;" v-if="scope.row.goodsSellStatus == 0">销售中</span> |
|||
<span style="color: red;" v-else>已下架</span> |
|||
</template> |
|||
</el-table-column> |
|||
|
|||
<el-table-column |
|||
label="操作" |
|||
width="100" |
|||
> |
|||
<template #default="scope"> |
|||
<a style="cursor: pointer; margin-right: 10px" @click="handleEdit(scope.row.goodsId)">修改</a> |
|||
<a style="cursor: pointer; margin-right: 10px" v-if="scope.row.goodsSellStatus == 0" @click="handleStatus(scope.row.goodsId, 1)">下架</a> |
|||
<a style="cursor: pointer; margin-right: 10px" v-else @click="handleStatus(scope.row.goodsId, 0)">上架</a> |
|||
</template> |
|||
</el-table-column> |
|||
</el-table> |
|||
<!--总数超过一页,再展示分页器--> |
|||
<el-pagination |
|||
background |
|||
layout="prev, pager, next" |
|||
:total="total" |
|||
:page-size="pageSize" |
|||
:current-page="currentPage" |
|||
@current-change="changePage" |
|||
/> |
|||
</el-card> |
|||
</template> |
|||
|
|||
<script> |
|||
import { onMounted, reactive, ref, toRefs } from 'vue' |
|||
import axios from '@/utils/axios' |
|||
import { ElMessage } from 'element-plus' |
|||
import { useRouter } from 'vue-router' |
|||
export default { |
|||
name: 'Good', |
|||
setup() { |
|||
const multipleTable = ref(null) |
|||
const router = useRouter() |
|||
const state = reactive({ |
|||
loading: false, |
|||
tableData: [], // 数据列表 |
|||
multipleSelection: [], // 选中项 |
|||
total: 0, // 总条数 |
|||
currentPage: 1, // 当前页 |
|||
pageSize: 10 // 分页大小 |
|||
}) |
|||
onMounted(() => { |
|||
getGoodList() |
|||
}) |
|||
// 获取轮播图列表 |
|||
const getGoodList = () => { |
|||
state.loading = true |
|||
axios.get('/goods/list', { |
|||
params: { |
|||
pageNumber: state.currentPage, |
|||
pageSize: state.pageSize |
|||
} |
|||
}).then(res => { |
|||
state.tableData = res.list |
|||
state.total = res.totalCount |
|||
state.currentPage = res.currPage |
|||
state.loading = false |
|||
}) |
|||
} |
|||
const handleAdd = () => { |
|||
router.push({ path: '/add' }) |
|||
} |
|||
const handleEdit = (id) => { |
|||
router.push({ path: '/add', query: { id } }) |
|||
} |
|||
// 选择项 |
|||
const handleSelectionChange = (val) => { |
|||
state.multipleSelection = val |
|||
} |
|||
const changePage = (val) => { |
|||
state.currentPage = val |
|||
getGoodList() |
|||
} |
|||
const handleStatus = (id, status) => { |
|||
axios.put(`/goods/status/${status}`, { |
|||
ids: id ? [id] : [] |
|||
}).then(() => { |
|||
ElMessage.success('修改成功') |
|||
getGoodList() |
|||
}) |
|||
} |
|||
return { |
|||
...toRefs(state), |
|||
multipleTable, |
|||
handleSelectionChange, |
|||
handleAdd, |
|||
handleEdit, |
|||
getGoodList, |
|||
changePage, |
|||
handleStatus |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style scoped> |
|||
.swiper-container { |
|||
min-height: 100%; |
|||
} |
|||
.el-card.is-always-shadow { |
|||
min-height: 100%!important; |
|||
} |
|||
</style> |
@ -0,0 +1,168 @@ |
|||
<template> |
|||
<el-card class="guest-container"> |
|||
<template #header> |
|||
<div class="header"> |
|||
<el-button type="primary" size="small" icon="el-icon-plus" @click="handleSolve">解除禁用</el-button> |
|||
<el-button type="danger" size="small" icon="el-icon-delete" @click="handleForbid">禁用账户</el-button> |
|||
</div> |
|||
</template> |
|||
<el-table |
|||
v-loading="loading" |
|||
ref="multipleTable" |
|||
:data="tableData" |
|||
tooltip-effect="dark" |
|||
style="width: 100%" |
|||
@selection-change="handleSelectionChange"> |
|||
<el-table-column |
|||
type="selection" |
|||
width="55"> |
|||
</el-table-column> |
|||
<el-table-column |
|||
prop="nickName" |
|||
label="昵称" |
|||
> |
|||
</el-table-column> |
|||
<el-table-column |
|||
prop="loginName" |
|||
label="登录名" |
|||
> |
|||
</el-table-column> |
|||
<el-table-column |
|||
label="身份状态" |
|||
> |
|||
<template #default="scope"> |
|||
<span :style="scope.row.lockedFlag == 0 ? 'color: green;' : 'color: red;'"> |
|||
{{ scope.row.lockedFlag == 0 ? '正常' : '禁用' }} |
|||
</span> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column |
|||
label="是否注销" |
|||
> |
|||
<template #default="scope"> |
|||
<span :style="scope.row.lockedFlag == 0 ? 'color: green;' : 'color: red;'"> |
|||
{{ scope.row.isDeleted == 0 ? '正常' : '注销' }} |
|||
</span> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column |
|||
prop="createTime" |
|||
label="注册时间" |
|||
> |
|||
</el-table-column> |
|||
<!-- <el-table-column |
|||
label="操作" |
|||
width="100" |
|||
> |
|||
<template #default="scope"> |
|||
<a style="cursor: pointer; margin-right: 10px" @confirm="handleSolve(scope.row)">解除禁用</a> |
|||
<el-popconfirm |
|||
title="确定禁用吗?" |
|||
@confirm="handleForbid(scope.row)" |
|||
> |
|||
<template #reference> |
|||
<a style="cursor: pointer">禁用账户</a> |
|||
</template> |
|||
</el-popconfirm> |
|||
</template> |
|||
</el-table-column> --> |
|||
</el-table> |
|||
<!--总数超过一页,再展示分页器--> |
|||
<el-pagination |
|||
background |
|||
layout="prev, pager, next" |
|||
:total="total" |
|||
:page-size="pageSize" |
|||
:current-page="currentPage" |
|||
@current-change="changePage" |
|||
/> |
|||
</el-card> |
|||
</template> |
|||
|
|||
<script> |
|||
import { onMounted, reactive, ref, toRefs } from 'vue' |
|||
import axios from '@/utils/axios' |
|||
import { ElMessage } from 'element-plus' |
|||
export default { |
|||
name: 'Guest', |
|||
setup() { |
|||
const multipleTable = ref(null) |
|||
const state = reactive({ |
|||
loading: false, |
|||
tableData: [], // 数据列表 |
|||
multipleSelection: [], // 选中项 |
|||
total: 0, // 总条数 |
|||
currentPage: 1, // 当前页 |
|||
pageSize: 10 // 分页大小 |
|||
}) |
|||
onMounted(() => { |
|||
getGuestList() |
|||
}) |
|||
// 获取轮播图列表 |
|||
const getGuestList = () => { |
|||
state.loading = true |
|||
axios.get('/users', { |
|||
params: { |
|||
pageNumber: state.currentPage, |
|||
pageSize: state.pageSize |
|||
} |
|||
}).then(res => { |
|||
state.tableData = res.list |
|||
state.total = res.totalCount |
|||
state.currentPage = res.currPage |
|||
state.loading = false |
|||
}) |
|||
} |
|||
// 选择项 |
|||
const handleSelectionChange = (val) => { |
|||
state.multipleSelection = val |
|||
} |
|||
const changePage = (val) => { |
|||
state.currentPage = val |
|||
getGuestList() |
|||
} |
|||
const handleSolve = () => { |
|||
if (!state.multipleSelection.length) { |
|||
ElMessage.error('请选择项') |
|||
return |
|||
} |
|||
axios.put(`/users/0`, { |
|||
ids: state.multipleSelection.map(item => item.userId) |
|||
}).then(() => { |
|||
ElMessage.success('解除成功') |
|||
getGuestList() |
|||
}) |
|||
} |
|||
const handleForbid = () => { |
|||
if (!state.multipleSelection.length) { |
|||
ElMessage.error('请选择项') |
|||
return |
|||
} |
|||
axios.put(`/users/1`, { |
|||
ids: state.multipleSelection.map(item => item.userId) |
|||
}).then(() => { |
|||
ElMessage.success('禁用成功') |
|||
getGuestList() |
|||
}) |
|||
} |
|||
return { |
|||
...toRefs(state), |
|||
multipleTable, |
|||
handleSelectionChange, |
|||
getGuestList, |
|||
changePage, |
|||
handleSolve, |
|||
handleForbid |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style scoped> |
|||
.guest-container { |
|||
min-height: 100%; |
|||
} |
|||
.el-card.is-always-shadow { |
|||
min-height: 100%!important; |
|||
} |
|||
</style> |
@ -0,0 +1,169 @@ |
|||
<template> |
|||
<el-card class="introduce"> |
|||
<div class="order"> |
|||
<el-card class="order-item"> |
|||
<template #header> |
|||
<div class="card-header"> |
|||
<span>今日订单数</span> |
|||
</div> |
|||
</template> |
|||
<div class="item">1888</div> |
|||
</el-card> |
|||
<el-card class="order-item"> |
|||
<template #header> |
|||
<div class="card-header"> |
|||
<span>今日日活</span> |
|||
</div> |
|||
</template> |
|||
<div class="item">36271</div> |
|||
</el-card> |
|||
<el-card class="order-item"> |
|||
<template #header> |
|||
<div class="card-header"> |
|||
<span>转化率</span> |
|||
</div> |
|||
</template> |
|||
<div class="item">20%</div> |
|||
</el-card> |
|||
</div> |
|||
<div id="zoom"></div> |
|||
</el-card> |
|||
</template> |
|||
|
|||
<script> |
|||
import { onMounted, onUnmounted } from 'vue' |
|||
|
|||
let myChart = null |
|||
export default { |
|||
name: 'Index', |
|||
setup() { |
|||
onMounted(() => { |
|||
if (window.echarts) { |
|||
// 基于准备好的dom,初始化echarts实例 |
|||
myChart = window.echarts.init(document.getElementById('zoom')) |
|||
|
|||
// 指定图表的配置项和数据 |
|||
const option = { |
|||
title: { |
|||
text: '系统折线图' |
|||
}, |
|||
tooltip: { |
|||
trigger: 'axis', |
|||
axisPointer: { |
|||
type: 'cross', |
|||
label: { |
|||
backgroundColor: '#6a7985' |
|||
} |
|||
} |
|||
}, |
|||
legend: { |
|||
data: ['新增注册', '付费用户', '活跃用户', '订单数', '当日总收入'] |
|||
}, |
|||
toolbox: { |
|||
feature: { |
|||
saveAsImage: {} |
|||
} |
|||
}, |
|||
grid: { |
|||
left: '3%', |
|||
right: '4%', |
|||
bottom: '3%', |
|||
containLabel: true |
|||
}, |
|||
xAxis: [ |
|||
{ |
|||
type: 'category', |
|||
boundaryGap: false, |
|||
data: ['2021-03-11', '2021-03-12', '2021-03-13', '2021-03-14', '2021-03-15', '2021-03-16', '2021-03-17'] |
|||
} |
|||
], |
|||
yAxis: [ |
|||
{ |
|||
type: 'value' |
|||
} |
|||
], |
|||
series: [ |
|||
{ |
|||
name: '新增注册', |
|||
type: 'line', |
|||
stack: '总量', |
|||
areaStyle: {}, |
|||
emphasis: { |
|||
focus: 'series' |
|||
}, |
|||
data: [120, 132, 101, 134, 90, 230, 210] |
|||
}, |
|||
{ |
|||
name: '付费用户', |
|||
type: 'line', |
|||
stack: '总量', |
|||
areaStyle: {}, |
|||
emphasis: { |
|||
focus: 'series' |
|||
}, |
|||
data: [220, 182, 191, 234, 290, 330, 310] |
|||
}, |
|||
{ |
|||
name: '活跃用户', |
|||
type: 'line', |
|||
stack: '总量', |
|||
areaStyle: {}, |
|||
emphasis: { |
|||
focus: 'series' |
|||
}, |
|||
data: [150, 232, 201, 154, 190, 330, 410] |
|||
}, |
|||
{ |
|||
name: '订单数', |
|||
type: 'line', |
|||
stack: '总量', |
|||
areaStyle: {}, |
|||
emphasis: { |
|||
focus: 'series' |
|||
}, |
|||
data: [320, 332, 301, 334, 390, 330, 320] |
|||
}, |
|||
{ |
|||
name: '当日总收入', |
|||
type: 'line', |
|||
stack: '总量', |
|||
label: { |
|||
show: true, |
|||
position: 'top' |
|||
}, |
|||
areaStyle: {}, |
|||
emphasis: { |
|||
focus: 'series' |
|||
}, |
|||
data: [820, 932, 901, 934, 1290, 1330, 1320] |
|||
} |
|||
] |
|||
} |
|||
|
|||
// 使用刚指定的配置项和数据显示图表。 |
|||
myChart.setOption(option) |
|||
} |
|||
}) |
|||
onUnmounted(() => { |
|||
myChart.dispose() |
|||
}) |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style scoped> |
|||
.introduce .order { |
|||
display: flex; |
|||
margin-bottom: 50px; |
|||
} |
|||
.introduce .order .order-item { |
|||
flex: 1; |
|||
margin-right: 20px; |
|||
} |
|||
.introduce .order .order-item:last-child{ |
|||
margin-right: 0; |
|||
} |
|||
#zoom { |
|||
min-height: 300px; |
|||
} |
|||
</style> |
@ -0,0 +1,211 @@ |
|||
<template> |
|||
<el-card class="index-container"> |
|||
<template #header> |
|||
<div class="header"> |
|||
<el-button type="primary" size="small" icon="el-icon-plus" @click="handleAdd">增加</el-button> |
|||
<el-popconfirm |
|||
title="确定删除吗?" |
|||
@confirm="handleDelete" |
|||
> |
|||
<template #reference> |
|||
<el-button type="danger" size="small" icon="el-icon-delete">批量删除</el-button> |
|||
</template> |
|||
</el-popconfirm> |
|||
</div> |
|||
</template> |
|||
<el-table |
|||
v-loading="loading" |
|||
ref="multipleTable" |
|||
:data="tableData" |
|||
tooltip-effect="dark" |
|||
style="width: 100%" |
|||
@selection-change="handleSelectionChange"> |
|||
<el-table-column |
|||
type="selection" |
|||
width="55"> |
|||
</el-table-column> |
|||
<el-table-column |
|||
prop="configName" |
|||
label="商品名称" |
|||
> |
|||
</el-table-column> |
|||
<el-table-column |
|||
label="跳转链接" |
|||
> |
|||
<template #default="scope"> |
|||
<a target="_blank" :href="scope.row.redirectUrl">{{ scope.row.redirectUrl }}</a> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column |
|||
prop="configRank" |
|||
label="排序值" |
|||
width="120" |
|||
> |
|||
</el-table-column> |
|||
<el-table-column |
|||
prop="goodsId" |
|||
label="商品编号" |
|||
width="200" |
|||
> |
|||
</el-table-column> |
|||
<el-table-column |
|||
prop="createTime" |
|||
label="添加时间" |
|||
width="200" |
|||
> |
|||
</el-table-column> |
|||
<el-table-column |
|||
label="操作" |
|||
width="100" |
|||
> |
|||
<template #default="scope"> |
|||
<a style="cursor: pointer; margin-right: 10px" @click="handleEdit(scope.row.configId)">修改</a> |
|||
<el-popconfirm |
|||
title="确定删除吗?" |
|||
@confirm="handleDeleteOne(scope.row.configId)" |
|||
> |
|||
<template #reference> |
|||
<a style="cursor: pointer">删除</a> |
|||
</template> |
|||
</el-popconfirm> |
|||
</template> |
|||
</el-table-column> |
|||
</el-table> |
|||
<!--总数超过一页,再展示分页器--> |
|||
<el-pagination |
|||
background |
|||
layout="prev, pager, next" |
|||
:total="total" |
|||
:page-size="pageSize" |
|||
:current-page="currentPage" |
|||
@current-change="changePage" |
|||
/> |
|||
</el-card> |
|||
<DialogAddGood ref='addGood' :reload="getIndexConfig" :type="type" :configType="configType" /> |
|||
</template> |
|||
|
|||
<script> |
|||
import { onMounted, reactive, ref, toRefs } from 'vue' |
|||
import { ElMessage } from 'element-plus' |
|||
import DialogAddGood from '@/components/DialogAddGood.vue' |
|||
import { useRoute, useRouter } from 'vue-router' |
|||
import axios from '@/utils/axios' |
|||
// 首页配置类型参数 |
|||
const configTypeMap = { |
|||
hot: 3, |
|||
new: 4, |
|||
recommend: 5 |
|||
} |
|||
export default { |
|||
name: 'Hot', |
|||
components: { |
|||
DialogAddGood |
|||
}, |
|||
setup() { |
|||
const router = useRouter() |
|||
const route = useRoute() |
|||
const multipleTable = ref(null) |
|||
const addGood = ref(null) |
|||
const state = reactive({ |
|||
loading: false, |
|||
tableData: [], // 数据列表 |
|||
multipleSelection: [], // 选中项 |
|||
total: 0, // 总条数 |
|||
currentPage: 1, // 当前页 |
|||
pageSize: 10, // 分页大小 |
|||
type: 'add', // 操作类型 |
|||
configType: 3 // 3-(首页)热销商品 4-(首页)新品上线 5-(首页)为你推荐 |
|||
}) |
|||
// 监听路由变化 |
|||
router.beforeEach((to) => { |
|||
if (['hot', 'new', 'recommend'].includes(to.name)) { |
|||
state.configType = configTypeMap[to.name] |
|||
state.currentPage = 1 |
|||
getIndexConfig() |
|||
} |
|||
}) |
|||
// 初始化 |
|||
onMounted(() => { |
|||
state.configType = configTypeMap[route.name] |
|||
getIndexConfig() |
|||
}) |
|||
// 首页热销商品列表 |
|||
const getIndexConfig = () => { |
|||
state.loading = true |
|||
axios.get('/indexConfigs', { |
|||
params: { |
|||
pageNumber: state.currentPage, |
|||
pageSize: state.pageSize, |
|||
configType: state.configType |
|||
} |
|||
}).then(res => { |
|||
state.tableData = res.list |
|||
state.total = res.totalCount |
|||
state.currentPage = res.currPage |
|||
state.loading = false |
|||
}) |
|||
} |
|||
// 添加商品 |
|||
const handleAdd = () => { |
|||
state.type = 'add' |
|||
addGood.value.open() |
|||
} |
|||
// 修改商品 |
|||
const handleEdit = (id) => { |
|||
state.type = 'edit' |
|||
addGood.value.open(id) |
|||
} |
|||
// 选择项 |
|||
const handleSelectionChange = (val) => { |
|||
state.multipleSelection = val |
|||
} |
|||
// 删除 |
|||
const handleDelete = () => { |
|||
if (!state.multipleSelection.length) { |
|||
ElMessage.error('请选择项') |
|||
return |
|||
} |
|||
axios.post('/indexConfigs/delete', { |
|||
ids: state.multipleSelection.map(i => i.configId) |
|||
}).then(() => { |
|||
ElMessage.success('删除成功') |
|||
getIndexConfig() |
|||
}) |
|||
} |
|||
// 单个删除 |
|||
const handleDeleteOne = (id) => { |
|||
axios.post('/indexConfigs/delete', { |
|||
ids: [id] |
|||
}).then(() => { |
|||
ElMessage.success('删除成功') |
|||
getIndexConfig() |
|||
}) |
|||
} |
|||
const changePage = (val) => { |
|||
state.currentPage = val |
|||
getIndexConfig() |
|||
} |
|||
return { |
|||
...toRefs(state), |
|||
multipleTable, |
|||
handleSelectionChange, |
|||
addGood, |
|||
handleAdd, |
|||
handleEdit, |
|||
handleDelete, |
|||
handleDeleteOne, |
|||
getIndexConfig, |
|||
changePage |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style scoped> |
|||
.index-container { |
|||
min-height: 100%; |
|||
} |
|||
.el-card.is-always-shadow { |
|||
min-height: 100%!important; |
|||
} |
|||
</style> |
@ -0,0 +1,108 @@ |
|||
<template> |
|||
<el-card class="account-container"> |
|||
<img class="logo" src="https://s.yezgea02.com/1616331765416/WechatIMG40113.png" alt="" /> |
|||
<h1>系统简介</h1> |
|||
<div style="line-height: 30px"> |
|||
vue3-admin 是一套企业级后台管理系统,基于 Spring Boot 、Vue 3.0 相关技术栈开发,包含基础版本和前后端分离版本,供各位开发者们体验和学习,一定给你最好的学习体验。 |
|||
</div> |
|||
<img style="width: 70%; |
|||
display: block; |
|||
margin: 0 auto;" src="https://s.yezgea02.com/1616331765416/WechatIMG40038.png" alt=""> |
|||
<h1>开发及部署文档</h1> |
|||
<img style="width: 70%; |
|||
display: block; |
|||
margin: 0 auto;" src="https://s.yezgea02.com/1616938239101/419241616938196_.pic.jpg" /> |
|||
<ul class="course" @click="goJuejin"> |
|||
<li>开篇词:通关Vue3.0 企业级项目开发,升职加薪快人一步</li> |
|||
<li>项目须知与课程约定</li> |
|||
<li>大势所趋:“前后端分离”开发模式</li> |
|||
<li>Vue 3.0 简介及开发环境搭建</li> |
|||
<li>Vue 3.0 组合 API 入口 Setup 浅析</li> |
|||
<li>Vue 3.0 之响应式系统 API</li> |
|||
<li>Vue 3.0 之生命周期钩子函数、提供注入</li> |
|||
<li>Vue 3.0 性能和业务层面上的提升</li> |
|||
<li>Vite 2.0 原理分析及简单插件编写</li> |
|||
<li>Vue-Router 4.x 使用方法及路由原理</li> |
|||
<li>Vue 3.0 实战项目启动篇</li> |
|||
<li>技术选型之 Spring Boot</li> |
|||
<li>后端开发环境搭建</li> |
|||
<li>快速搭建一个 Spring Boot 项目</li> |
|||
<li>Spring Boot 实践之 Web 功能开发</li> |
|||
<li>Spring Boot 实践之文件上传处理</li> |
|||
<li>Spring Boot 实践之整合 MyBatis 操作数据库</li> |
|||
<li>Spring Boot 实践之整合 Lombok</li> |
|||
<li>Spring Boot 实践之整合 Swagger 生成接口文档</li> |
|||
<li>后端 API 项目启动和运行注意事项</li> |
|||
</ul> |
|||
<ul class="course" @click="goJuejin"> |
|||
<li>接口参数处理和统一响应结果处理</li> |
|||
<li>API 接口开发实战之用户登录接口开发</li> |
|||
<li>API 接口开发实战之用户身份认证详解</li> |
|||
<li>API 接口开发实战之轮播图管理模块接口开发</li> |
|||
<li>API 接口开发实战之商品分类管理模块接口开发</li> |
|||
<li>API 接口开发实战之商品管理模块接口开发</li> |
|||
<li>API 接口开发实战之商品配置管理模块接口开发</li> |
|||
<li>API 接口开发实战之订单管理模块接口开发</li> |
|||
<li>成为一名有独立开发能力的前端工程师</li> |
|||
<li>Vite 2.0 + Vue 3.0 + Element-plus 搭建管理后台项目</li> |
|||
<li>Vue 3.0 实战之管理后台左右栏目布局(Menu 菜单组件)</li> |
|||
<li>Vue 3.0 实战之登录鉴权(Form 表单组件)</li> |
|||
<li>Vue 3.0 实战之首页大盘数据(Echart 5.x)</li> |
|||
<li>Vue 3.0 实战之首页配置 Table</li> |
|||
<li>Vue 3.0 实战之分类管理(多级共用 Table)</li> |
|||
<li>Vue 3.0 实战之商品管理</li> |
|||
<li>Vue 3.0 实战之订单管理(操作多级判断)</li> |
|||
<li>Vue 3.0 实战之会员管理、账户修改</li> |
|||
<li>pm2 实现一键部署云端服务器</li> |
|||
<li>常见问题汇总讲解</li> |
|||
</ul> |
|||
<h1>技术选型</h1> |
|||
<ul style="font-weight: bold;"> |
|||
<li>Vue 3.x</li> |
|||
<li>Vite 2.x</li> |
|||
<li>Vue-Router 4.x</li> |
|||
<li>Element-Plus(适配全新 Vue 3.x 的 PC 端组件库)</li> |
|||
<li>Echarts 5.0</li> |
|||
<li>axios</li> |
|||
<li>wangEditor</li> |
|||
</ul> |
|||
<h1>联系作者</h1> |
|||
<ul> |
|||
<li>我的邮箱:2449207463@qq.com</li> |
|||
<li>QQ技术交流群:932227898、707779034</li> |
|||
</ul> |
|||
</el-card> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
name: 'Introduce', |
|||
setup() { |
|||
const goJuejin = () => { |
|||
console.log('goJuejin') |
|||
window.open('https://juejin.cn/book/6933939264455442444', 'target') |
|||
} |
|||
|
|||
return { |
|||
goJuejin |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style scoped> |
|||
.logo { |
|||
width: 200px; |
|||
display: block; |
|||
margin: 0 auto; |
|||
} |
|||
.course { |
|||
font-weight: bold; |
|||
display: inline-block; |
|||
} |
|||
.course li { |
|||
line-height: 36px; |
|||
color: #409eff; |
|||
cursor: pointer; |
|||
} |
|||
</style> |
@ -0,0 +1,129 @@ |
|||
<template> |
|||
<div class="login-body"> |
|||
<div class="login-container"> |
|||
<div class="head"> |
|||
<img class="logo" src="https://s.weituibao.com/1582958061265/mlogo.png" /> |
|||
<div class="name"> |
|||
<div class="title">新蜂商城</div> |
|||
<div class="tips">Vue3.0 后台管理系统</div> |
|||
</div> |
|||
</div> |
|||
<el-form label-position="top" :model="ruleForm" ref="loginForm" class="login-form"> |
|||
<el-form-item label="账号" prop="username"> |
|||
<el-input type="text" v-model="ruleForm.username" autocomplete="off"></el-input> |
|||
</el-form-item> |
|||
<el-form-item label="密码" prop="password"> |
|||
<el-input type="password" v-model="ruleForm.password" autocomplete="off"></el-input> |
|||
</el-form-item> |
|||
<el-form-item> |
|||
<div style="color: #333">登录表示您已同意<a>《服务条款》</a></div> |
|||
<el-button style="width: 100%" type="primary" @click="submitForm">立即登录</el-button> |
|||
<el-checkbox v-model="checked" @change="!checked">下次自动登录</el-checkbox> |
|||
</el-form-item> |
|||
</el-form> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
import axios from '@/utils/axios' |
|||
import md5 from 'js-md5' |
|||
import { reactive, ref, toRefs } from 'vue' |
|||
import { localSet } from '@/utils' |
|||
export default { |
|||
name: 'Login', |
|||
setup() { |
|||
const loginForm = ref(null) |
|||
const state = reactive({ |
|||
ruleForm: { |
|||
username: '', |
|||
password: '' |
|||
}, |
|||
checked: true, |
|||
rules: { |
|||
username: [ |
|||
{ required: 'true', message: '账户不能为空', trigger: ['change'] } |
|||
], |
|||
password: [ |
|||
{ required: 'true', message: '密码不能为空', trigger: ['change'] } |
|||
] |
|||
} |
|||
}) |
|||
const submitForm = async () => { |
|||
loginForm.value.validate((valid) => { |
|||
if (valid) { |
|||
axios.post('/adminUser/login', { |
|||
userName: state.ruleForm.username || '', |
|||
passwordMd5: md5(state.ruleForm.password) |
|||
}).then(res => { |
|||
localSet('token', res) |
|||
window.location.href = '/' |
|||
}) |
|||
} else { |
|||
console.log('error submit!!') |
|||
return false; |
|||
} |
|||
}) |
|||
} |
|||
const resetForm = () => { |
|||
loginForm.value.resetFields(); |
|||
} |
|||
return { |
|||
...toRefs(state), |
|||
loginForm, |
|||
submitForm, |
|||
resetForm |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style scoped> |
|||
.login-body { |
|||
display: flex; |
|||
justify-content: center; |
|||
align-items: center; |
|||
width: 100%; |
|||
background-color: #fff; |
|||
/* background-image: linear-gradient(25deg, #077f7c, #3aa693, #5ecfaa, #7ffac2); */ |
|||
} |
|||
.login-container { |
|||
width: 420px; |
|||
height: 500px; |
|||
background-color: #fff; |
|||
border-radius: 4px; |
|||
box-shadow: 0px 21px 41px 0px rgba(0, 0, 0, 0.2); |
|||
} |
|||
.head { |
|||
display: flex; |
|||
justify-content: center; |
|||
align-items: center; |
|||
padding: 40px 0 20px 0; |
|||
} |
|||
.head img { |
|||
width: 100px; |
|||
height: 100px; |
|||
margin-right: 20px; |
|||
} |
|||
.head .title { |
|||
font-size: 28px; |
|||
color: #1BAEAE; |
|||
font-weight: bold; |
|||
} |
|||
.head .tips { |
|||
font-size: 12px; |
|||
color: #999; |
|||
} |
|||
.login-form { |
|||
width: 70%; |
|||
margin: 0 auto; |
|||
} |
|||
</style> |
|||
<style> |
|||
.el-form--label-top .el-form-item__label { |
|||
padding: 0; |
|||
} |
|||
.login-form .el-form-item { |
|||
margin-bottom: 12px; |
|||
} |
|||
</style> |
@ -0,0 +1,276 @@ |
|||
<template> |
|||
<el-card class="order-container"> |
|||
<template #header> |
|||
<div class="header"> |
|||
<el-input |
|||
style="width: 200px; margin-right: 10px" |
|||
placeholder="请输入订单号" |
|||
v-model="orderNo" |
|||
@change="handleOption" |
|||
size="small" |
|||
clearable |
|||
/> |
|||
<el-select @change="handleOption" v-model="orderStatus" size="small" style="width: 200px; margin-right: 10px"> |
|||
<el-option |
|||
v-for="item in options" |
|||
:key="item.value" |
|||
:label="item.label" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
<!-- <el-button type="primary" size="small" icon="el-icon-edit">修改订单</el-button> --> |
|||
<el-button type="primary" size="small" icon="el-icon-s-home" @click="handleConfig()">配货完成</el-button> |
|||
<el-button type="primary" size="small" icon="el-icon-s-home" @click="handleSend()">出库</el-button> |
|||
<el-button type="danger" size="small" icon="el-icon-delete" @click="handleClose()">关闭订单</el-button> |
|||
</div> |
|||
</template> |
|||
<el-table |
|||
v-loading="loading" |
|||
ref="multipleTable" |
|||
:data="tableData" |
|||
tooltip-effect="dark" |
|||
style="width: 100%" |
|||
@selection-change="handleSelectionChange"> |
|||
<el-table-column |
|||
type="selection" |
|||
width="55"> |
|||
</el-table-column> |
|||
<el-table-column |
|||
prop="orderNo" |
|||
label="订单号" |
|||
> |
|||
</el-table-column> |
|||
<el-table-column |
|||
prop="totalPrice" |
|||
label="订单总价" |
|||
> |
|||
</el-table-column> |
|||
<el-table-column |
|||
prop="orderStatus" |
|||
label="订单状态" |
|||
> |
|||
<template #default="scope"> |
|||
<span>{{ $filters.orderMap(scope.row.orderStatus) }}</span> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column |
|||
prop="payType" |
|||
label="支付方式" |
|||
> |
|||
<template #default='scope'> |
|||
<span v-if="scope.row.payType == 1">微信支付</span> |
|||
<span v-else-if="scope.row.payType == 2">支付宝支付</span> |
|||
<span v-else>未知</span> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column |
|||
prop="createTime" |
|||
label="创建时间" |
|||
> |
|||
</el-table-column> |
|||
<el-table-column |
|||
label="操作" |
|||
> |
|||
<template #default="scope"> |
|||
<el-popconfirm |
|||
v-if="scope.row.orderStatus == 1" |
|||
title="确定配货完成吗?" |
|||
@confirm="handleConfig(scope.row.orderId)" |
|||
> |
|||
<template #reference> |
|||
<a style="cursor: pointer; margin-right: 10px">配货完成</a> |
|||
</template> |
|||
</el-popconfirm> |
|||
<el-popconfirm |
|||
v-if="scope.row.orderStatus == 2" |
|||
title="确定出库吗?" |
|||
@confirm="handleSend(scope.row.orderId)" |
|||
> |
|||
<template #reference> |
|||
<a style="cursor: pointer; margin-right: 10px">出库</a> |
|||
</template> |
|||
</el-popconfirm> |
|||
<el-popconfirm |
|||
v-if="!(scope.row.orderStatus == 4 || scope.row.orderStatus < 0)" |
|||
title="确定关闭订单吗?" |
|||
@confirm="handleClose(scope.row.orderId)" |
|||
> |
|||
<template #reference> |
|||
<a style="cursor: pointer; margin-right: 10px">关闭订单</a> |
|||
</template> |
|||
</el-popconfirm> |
|||
<router-link :to="{ path: '/order_detail', query: { id: scope.row.orderId }}">订单详情</router-link> |
|||
</template> |
|||
</el-table-column> |
|||
</el-table> |
|||
<!--总数超过一页,再展示分页器--> |
|||
<el-pagination |
|||
background |
|||
layout="prev, pager, next" |
|||
:total="total" |
|||
:page-size="pageSize" |
|||
:current-page="currentPage" |
|||
@current-change="changePage" |
|||
/> |
|||
</el-card> |
|||
</template> |
|||
|
|||
<script> |
|||
import { onMounted, reactive, ref, toRefs } from 'vue' |
|||
import { ElMessage } from 'element-plus' |
|||
import axios from '@/utils/axios' |
|||
export default { |
|||
name: 'Order', |
|||
setup() { |
|||
const multipleTable = ref(null) |
|||
const addGood = ref(null) |
|||
const state = reactive({ |
|||
loading: false, |
|||
tableData: [], // 数据列表 |
|||
multipleSelection: [], // 选中项 |
|||
total: 0, // 总条数 |
|||
currentPage: 1, // 当前页 |
|||
pageSize: 10, // 分页大小 |
|||
orderNo: '', // 订单号 |
|||
orderStatus: '', // 订单状态 |
|||
options: [{ |
|||
value: '', |
|||
label: '全部' |
|||
}, { |
|||
value: 0, |
|||
label: '待支付' |
|||
}, { |
|||
value: 1, |
|||
label: '已支付' |
|||
}, { |
|||
value: 2, |
|||
label: '配货完成' |
|||
}, { |
|||
value: 3, |
|||
label: '出库成功' |
|||
}, { |
|||
value: 4, |
|||
label: '交易成功' |
|||
}, { |
|||
value: -1, |
|||
label: '手动关闭' |
|||
}, { |
|||
value: -2, |
|||
label: '超时关闭' |
|||
}, { |
|||
value: -3, |
|||
label: '商家关闭' |
|||
}] |
|||
}) |
|||
onMounted(() => { |
|||
getOrderList() |
|||
}) |
|||
// 获取轮播图列表 |
|||
const getOrderList = () => { |
|||
state.loading = true |
|||
axios.get('/orders', { |
|||
params: { |
|||
pageNumber: state.currentPage, |
|||
pageSize: state.pageSize, |
|||
orderNo: state.orderNo, |
|||
orderStatus: state.orderStatus |
|||
} |
|||
}).then(res => { |
|||
state.tableData = res.list |
|||
state.total = res.totalCount |
|||
state.currentPage = res.currPage |
|||
state.loading = false |
|||
}) |
|||
} |
|||
const handleOption = () => { |
|||
state.currentPage = 1 |
|||
getOrderList() |
|||
} |
|||
// 选择项 |
|||
const handleSelectionChange = (val) => { |
|||
state.multipleSelection = val |
|||
} |
|||
const changePage = (val) => { |
|||
state.currentPage = val |
|||
getOrderList() |
|||
} |
|||
const handleConfig = (id) => { |
|||
console.log('id', id) |
|||
let params |
|||
if (id) { |
|||
params = [id] |
|||
} else { |
|||
if (!state.multipleSelection.length) { |
|||
console.log('state.multipleSelection', state.multipleSelection.length) |
|||
ElMessage.error('请选择项') |
|||
return |
|||
} |
|||
params = state.multipleSelection.map(i => i.orderId) |
|||
} |
|||
axios.put('/orders/checkDone', { |
|||
ids: params |
|||
}).then(() => { |
|||
ElMessage.success('配货成功') |
|||
getOrderList() |
|||
}) |
|||
} |
|||
const handleSend = (id) => { |
|||
let params |
|||
if (id) { |
|||
params = [id] |
|||
} else { |
|||
if (!state.multipleSelection.length) { |
|||
ElMessage.error('请选择项') |
|||
return |
|||
} |
|||
params = state.multipleSelection.map(i => i.orderId) |
|||
} |
|||
axios.put('/orders/checkOut', { |
|||
ids: params |
|||
}).then(() => { |
|||
ElMessage.success('出库成功') |
|||
getOrderList() |
|||
}) |
|||
} |
|||
const handleClose = (id) => { |
|||
let params |
|||
if (id) { |
|||
params = [id] |
|||
} else { |
|||
if (!state.multipleSelection.length) { |
|||
ElMessage.error('请选择项') |
|||
return |
|||
} |
|||
params = state.multipleSelection.map(i => i.orderId) |
|||
} |
|||
axios.put('/orders/close', { |
|||
ids: params |
|||
}).then(() => { |
|||
ElMessage.success('关闭成功') |
|||
getOrderList() |
|||
}) |
|||
} |
|||
return { |
|||
...toRefs(state), |
|||
multipleTable, |
|||
handleSelectionChange, |
|||
addGood, |
|||
getOrderList, |
|||
changePage, |
|||
handleOption, |
|||
handleConfig, |
|||
handleSend, |
|||
handleClose |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style scoped> |
|||
.order-container { |
|||
min-height: 100%; |
|||
} |
|||
.el-card.is-always-shadow { |
|||
min-height: 100%!important; |
|||
} |
|||
</style> |
@ -0,0 +1,124 @@ |
|||
<template> |
|||
<el-card class="order-container"> |
|||
<div class="data"> |
|||
<el-card class="data-item" shadow="hover"> |
|||
<template #header> |
|||
<div class="card-header"> |
|||
<span>订单状态</span> |
|||
</div> |
|||
</template> |
|||
<div> |
|||
{{ data.orderStatusString }} |
|||
</div> |
|||
</el-card> |
|||
<el-card class="data-item" shadow="hover"> |
|||
<template #header> |
|||
<div class="card-header"> |
|||
<span>创建时间</span> |
|||
</div> |
|||
</template> |
|||
<div> |
|||
{{ data.createTime }} |
|||
</div> |
|||
</el-card> |
|||
<el-card class="data-item" shadow="hover"> |
|||
<template #header> |
|||
<div class="card-header"> |
|||
<span>订单号</span> |
|||
</div> |
|||
</template> |
|||
<div> |
|||
{{ data.orderNo }} |
|||
</div> |
|||
</el-card> |
|||
</div> |
|||
<el-table |
|||
:data="tableData" |
|||
tooltip-effect="dark" |
|||
style="width: 100%" |
|||
> |
|||
<el-table-column |
|||
label="商品图片" |
|||
> |
|||
<template #default="scope"> |
|||
<img style="width: 100px" :key="scope.row.goodsId" :src="$filters.prefix(scope.row.goodsCoverImg)" alt="商品主图"> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column |
|||
prop="goodsId" |
|||
label="商品编号" |
|||
> |
|||
</el-table-column> |
|||
<el-table-column |
|||
prop="goodsName" |
|||
label="商品名" |
|||
></el-table-column> |
|||
<el-table-column |
|||
prop="goodsCount" |
|||
label="商品数量" |
|||
> |
|||
</el-table-column> |
|||
<el-table-column |
|||
prop="sellingPrice" |
|||
label="价格" |
|||
> |
|||
</el-table-column> |
|||
</el-table> |
|||
</el-card> |
|||
</template> |
|||
|
|||
<script> |
|||
import { onMounted, reactive, toRefs } from 'vue' |
|||
import { useRoute } from 'vue-router' |
|||
import axios from '@/utils/axios' |
|||
export default { |
|||
name: 'OrderDetail', |
|||
setup() { |
|||
const route = useRoute() |
|||
const { id } = route.query |
|||
const state = reactive({ |
|||
data: {}, |
|||
tableData: [] |
|||
}) |
|||
onMounted(() => { |
|||
axios.get(`/orders/${id}`).then(res => { |
|||
console.log(res) |
|||
state.data = res |
|||
state.tableData = res.newBeeMallOrderItemVOS |
|||
}) |
|||
}) |
|||
|
|||
return { |
|||
...toRefs(state) |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style scoped> |
|||
.data { |
|||
display: flex; |
|||
margin-bottom: 50px; |
|||
} |
|||
.data .data-item { |
|||
flex: 1; |
|||
margin: 0 10px; |
|||
} |
|||
.el-table { |
|||
border: 1px solid #EBEEF5; |
|||
border-bottom: none; |
|||
} |
|||
.has-gutter th { |
|||
border-right: 1px solid #EBEEF5; |
|||
} |
|||
|
|||
.has-gutter th:last-child { |
|||
border-right: none; |
|||
} |
|||
.el-table__row td { |
|||
border-right: 1px solid #EBEEF5; |
|||
} |
|||
.el-table__row td:last-child { |
|||
border-right: none; |
|||
} |
|||
</style> |
@ -0,0 +1,190 @@ |
|||
<template> |
|||
<el-card class="swiper-container"> |
|||
<template #header> |
|||
<div class="header"> |
|||
<el-button type="primary" size="small" icon="el-icon-plus" @click="handleAdd">增加</el-button> |
|||
<el-popconfirm |
|||
title="确定删除吗?" |
|||
@confirm="handleDelete" |
|||
> |
|||
<template #reference> |
|||
<el-button type="danger" size="small" icon="el-icon-delete">批量删除</el-button> |
|||
</template> |
|||
</el-popconfirm> |
|||
</div> |
|||
</template> |
|||
<el-table |
|||
v-loading="loading" |
|||
ref="multipleTable" |
|||
:data="tableData" |
|||
tooltip-effect="dark" |
|||
style="width: 100%" |
|||
@selection-change="handleSelectionChange"> |
|||
<el-table-column |
|||
type="selection" |
|||
width="55"> |
|||
</el-table-column> |
|||
<el-table-column |
|||
label="轮播图" |
|||
width="200"> |
|||
<template #default="scope"> |
|||
<img style="width: 200px" :src="scope.row.carouselUrl" alt="轮播图"> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column |
|||
label="跳转链接" |
|||
> |
|||
<template #default="scope"> |
|||
<a target="_blank" :href="scope.row.redirectUrl">{{ scope.row.redirectUrl }}</a> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column |
|||
prop="carouselRank" |
|||
label="排序值" |
|||
width="120" |
|||
> |
|||
</el-table-column> |
|||
<el-table-column |
|||
prop="createTime" |
|||
label="添加时间" |
|||
width="200" |
|||
> |
|||
</el-table-column> |
|||
<el-table-column |
|||
label="操作" |
|||
width="100" |
|||
> |
|||
<template #default="scope"> |
|||
<a style="cursor: pointer; margin-right: 10px" @click="handleEdit(scope.row.carouselId)">修改</a> |
|||
<el-popconfirm |
|||
title="确定删除吗?" |
|||
@confirm="handleDeleteOne(scope.row.carouselId)" |
|||
> |
|||
<template #reference> |
|||
<a style="cursor: pointer">删除</a> |
|||
</template> |
|||
</el-popconfirm> |
|||
</template> |
|||
</el-table-column> |
|||
</el-table> |
|||
<!--总数超过一页,再展示分页器--> |
|||
<el-pagination |
|||
background |
|||
layout="prev, pager, next" |
|||
:total="total" |
|||
:page-size="pageSize" |
|||
:current-page="currentPage" |
|||
@current-change="changePage" |
|||
/> |
|||
</el-card> |
|||
<DialogAddSwiper ref='addGood' :reload="getCarousels" :type="type" /> |
|||
</template> |
|||
|
|||
<script> |
|||
import { onMounted, reactive, ref, toRefs } from 'vue' |
|||
import { ElMessage } from 'element-plus' |
|||
import DialogAddSwiper from '@/components/DialogAddSwiper.vue' |
|||
import axios from '@/utils/axios' |
|||
export default { |
|||
name: 'Swiper', |
|||
components: { |
|||
DialogAddSwiper |
|||
}, |
|||
setup() { |
|||
const multipleTable = ref(null) |
|||
const addGood = ref(null) |
|||
const state = reactive({ |
|||
loading: false, |
|||
tableData: [], // 数据列表 |
|||
multipleSelection: [], // 选中项 |
|||
total: 0, // 总条数 |
|||
currentPage: 1, // 当前页 |
|||
pageSize: 10, // 分页大小 |
|||
type: 'add', // 操作类型 |
|||
}) |
|||
onMounted(() => { |
|||
getCarousels() |
|||
}) |
|||
// 获取轮播图列表 |
|||
const getCarousels = () => { |
|||
state.loading = true |
|||
axios.get('/carousels', { |
|||
params: { |
|||
pageNumber: state.currentPage, |
|||
pageSize: state.pageSize |
|||
} |
|||
}).then(res => { |
|||
state.tableData = res.list |
|||
state.total = res.totalCount |
|||
state.currentPage = res.currPage |
|||
state.loading = false |
|||
}) |
|||
} |
|||
// 添加轮播项 |
|||
const handleAdd = () => { |
|||
state.type = 'add' |
|||
addGood.value.open() |
|||
} |
|||
// 修改轮播图 |
|||
const handleEdit = (id) => { |
|||
state.type = 'edit' |
|||
addGood.value.open(id) |
|||
} |
|||
// 选择项 |
|||
const handleSelectionChange = (val) => { |
|||
state.multipleSelection = val |
|||
} |
|||
// 批量删除 |
|||
const handleDelete = () => { |
|||
if (!state.multipleSelection.length) { |
|||
ElMessage.error('请选择项') |
|||
return |
|||
} |
|||
axios.delete('/carousels', { |
|||
data: { |
|||
ids: state.multipleSelection.map(i => i.carouselId) |
|||
} |
|||
}).then(() => { |
|||
ElMessage.success('删除成功') |
|||
getCarousels() |
|||
}) |
|||
} |
|||
// 单个删除 |
|||
const handleDeleteOne = (id) => { |
|||
axios.delete('/carousels', { |
|||
data: { |
|||
ids: [id] |
|||
} |
|||
}).then(() => { |
|||
ElMessage.success('删除成功') |
|||
getCarousels() |
|||
}) |
|||
} |
|||
const changePage = (val) => { |
|||
state.currentPage = val |
|||
getCarousels() |
|||
} |
|||
return { |
|||
...toRefs(state), |
|||
multipleTable, |
|||
handleSelectionChange, |
|||
addGood, |
|||
handleAdd, |
|||
handleEdit, |
|||
handleDelete, |
|||
handleDeleteOne, |
|||
getCarousels, |
|||
changePage |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style scoped> |
|||
.swiper-container { |
|||
min-height: 100%; |
|||
} |
|||
.el-card.is-always-shadow { |
|||
min-height: 100%!important; |
|||
} |
|||
</style> |
@ -0,0 +1 @@ |
|||
.el-alert{width:100%;padding:8px 16px;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:4px;position:relative;background-color:#FFF;overflow:hidden;opacity:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-transition:opacity .2s;transition:opacity .2s}.el-alert.is-light .el-alert__closebtn{color:#C0C4CC}.el-alert.is-dark .el-alert__closebtn,.el-alert.is-dark .el-alert__description{color:#FFF}.el-alert.is-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-alert--success.is-light{background-color:#f0f9eb;color:#67C23A}.el-alert--success.is-light .el-alert__description{color:#67C23A}.el-alert--success.is-dark{background-color:#67C23A;color:#FFF}.el-alert--info.is-light{background-color:#f4f4f5;color:#909399}.el-alert--info.is-dark{background-color:#909399;color:#FFF}.el-alert--info .el-alert__description{color:#909399}.el-alert--warning.is-light{background-color:#fdf6ec;color:#E6A23C}.el-alert--warning.is-light .el-alert__description{color:#E6A23C}.el-alert--warning.is-dark{background-color:#E6A23C;color:#FFF}.el-alert--error.is-light{background-color:#fef0f0;color:#F56C6C}.el-alert--error.is-light .el-alert__description{color:#F56C6C}.el-alert--error.is-dark{background-color:#F56C6C;color:#FFF}.el-alert__content{display:table-cell;padding:0 8px}.el-alert__icon{font-size:16px;width:16px}.el-alert__icon.is-big{font-size:28px;width:28px}.el-alert__title{font-size:13px;line-height:18px}.el-alert__title.is-bold{font-weight:700}.el-alert .el-alert__description{font-size:12px;margin:5px 0 0}.el-alert__closebtn{font-size:12px;opacity:1;position:absolute;top:12px;right:15px;cursor:pointer}.el-alert__closebtn.is-customed{font-style:normal;font-size:13px;top:9px}.el-alert-fade-enter,.el-alert-fade-leave-active{opacity:0} |
@ -0,0 +1 @@ |
|||
.el-aside{overflow:auto;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-flex-negative:0;flex-shrink:0} |
1
theme/autocomplete.css
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1 @@ |
|||
.el-avatar{display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;overflow:hidden;color:#fff;background:#C0C4CC;width:40px;height:40px;line-height:40px;font-size:14px}.el-avatar>img{display:block;height:100%;vertical-align:middle}.el-avatar--circle{border-radius:50%}.el-avatar--square{border-radius:4px}.el-avatar--icon{font-size:18px}.el-avatar--large{width:40px;height:40px;line-height:40px}.el-avatar--medium{width:36px;height:36px;line-height:36px}.el-avatar--small{width:28px;height:28px;line-height:28px} |
@ -0,0 +1 @@ |
|||
.el-backtop{position:fixed;background-color:#FFF;width:40px;height:40px;border-radius:50%;color:#1BAEAE;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;font-size:20px;-webkit-box-shadow:0 0 6px rgba(0,0,0,.12);box-shadow:0 0 6px rgba(0,0,0,.12);cursor:pointer;z-index:5}.el-backtop:hover{background-color:#F2F6FC} |
@ -0,0 +1 @@ |
|||
.el-badge{position:relative;vertical-align:middle;display:inline-block}.el-badge__content{background-color:#F56C6C;border-radius:10px;color:#FFF;display:inline-block;font-size:12px;height:18px;line-height:18px;padding:0 6px;text-align:center;white-space:nowrap;border:1px solid #FFF}.el-badge__content.is-fixed{position:absolute;top:0;right:10px;-webkit-transform:translateY(-50%) translateX(100%);transform:translateY(-50%) translateX(100%)}.el-badge__content.is-fixed.is-dot{right:5px}.el-badge__content.is-dot{height:8px;width:8px;padding:0;right:0;border-radius:50%}.el-badge__content--primary{background-color:#1BAEAE}.el-badge__content--success{background-color:#67C23A}.el-badge__content--warning{background-color:#E6A23C}.el-badge__content--info{background-color:#909399}.el-badge__content--danger{background-color:#F56C6C} |
1
theme/base.css
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1 @@ |
|||
.el-breadcrumb{font-size:14px;line-height:1}.el-breadcrumb::after,.el-breadcrumb::before{display:table;content:""}.el-breadcrumb::after{clear:both}.el-breadcrumb__separator{margin:0 9px;font-weight:700;color:#C0C4CC}.el-breadcrumb__separator[class*=icon]{margin:0 6px;font-weight:400}.el-breadcrumb__item{float:left}.el-breadcrumb__inner{color:#606266}.el-breadcrumb__inner a,.el-breadcrumb__inner.is-link{font-weight:700;text-decoration:none;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1);color:#303133}.el-breadcrumb__inner a:hover,.el-breadcrumb__inner.is-link:hover{color:#1BAEAE;cursor:pointer}.el-breadcrumb__item:last-child .el-breadcrumb__inner,.el-breadcrumb__item:last-child .el-breadcrumb__inner a,.el-breadcrumb__item:last-child .el-breadcrumb__inner a:hover,.el-breadcrumb__item:last-child .el-breadcrumb__inner:hover{font-weight:400;color:#606266;cursor:text}.el-breadcrumb__item:last-child .el-breadcrumb__separator{display:none} |
1
theme/button.css
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
1
theme/calendar.css
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1 @@ |
|||
.el-card{border-radius:4px;border:1px solid #EBEEF5;background-color:#FFF;overflow:hidden;color:#303133;-webkit-transition:.3s;transition:.3s}.el-card.is-always-shadow,.el-card.is-hover-shadow:focus,.el-card.is-hover-shadow:hover{-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-card__header{padding:18px 20px;border-bottom:1px solid #EBEEF5;-webkit-box-sizing:border-box;box-sizing:border-box}.el-card__body{padding:20px} |
@ -0,0 +1 @@ |
|||
.el-carousel__item,.el-carousel__mask{position:absolute;height:100%;top:0;left:0}.el-carousel__item{width:100%;display:inline-block;overflow:hidden;z-index:0}.el-carousel__item.is-active{z-index:2}.el-carousel__item.is-animating{-webkit-transition:-webkit-transform .4s ease-in-out;transition:-webkit-transform .4s ease-in-out;transition:transform .4s ease-in-out;transition:transform .4s ease-in-out,-webkit-transform .4s ease-in-out}.el-carousel__item--card{width:50%;-webkit-transition:-webkit-transform .4s ease-in-out;transition:-webkit-transform .4s ease-in-out;transition:transform .4s ease-in-out;transition:transform .4s ease-in-out,-webkit-transform .4s ease-in-out}.el-carousel__item--card.is-in-stage{cursor:pointer;z-index:1}.el-carousel__item--card.is-in-stage.is-hover .el-carousel__mask,.el-carousel__item--card.is-in-stage:hover .el-carousel__mask{opacity:.12}.el-carousel__item--card.is-active{z-index:2}.el-carousel__mask{width:100%;background-color:#FFF;opacity:.24;-webkit-transition:.2s;transition:.2s} |
@ -0,0 +1 @@ |
|||
.el-carousel{position:relative}.el-carousel--horizontal{overflow-x:hidden}.el-carousel--vertical{overflow-y:hidden}.el-carousel__container{position:relative;height:300px}.el-carousel__arrow{border:none;outline:0;padding:0;margin:0;height:36px;width:36px;cursor:pointer;-webkit-transition:.3s;transition:.3s;border-radius:50%;background-color:rgba(31,45,61,.11);color:#FFF;position:absolute;top:50%;z-index:10;-webkit-transform:translateY(-50%);transform:translateY(-50%);text-align:center;font-size:12px}.el-carousel__arrow--left{left:16px}.el-carousel__arrow--right{right:16px}.el-carousel__arrow:hover{background-color:rgba(31,45,61,.23)}.el-carousel__arrow i{cursor:pointer}.el-carousel__indicators{position:absolute;list-style:none;margin:0;padding:0;z-index:2}.el-carousel__indicators--horizontal{bottom:0;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.el-carousel__indicators--vertical{right:0;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.el-carousel__indicators--outside{bottom:26px;text-align:center;position:static;-webkit-transform:none;transform:none}.el-carousel__indicators--outside .el-carousel__indicator:hover button{opacity:.64}.el-carousel__indicators--outside button{background-color:#C0C4CC;opacity:.24}.el-carousel__indicators--labels{left:0;right:0;-webkit-transform:none;transform:none;text-align:center}.el-carousel__indicators--labels .el-carousel__button{height:auto;width:auto;padding:2px 18px;font-size:12px}.el-carousel__indicators--labels .el-carousel__indicator{padding:6px 4px}.el-carousel__indicator{background-color:transparent;cursor:pointer}.el-carousel__indicator:hover button{opacity:.72}.el-carousel__indicator--horizontal{display:inline-block;padding:12px 4px}.el-carousel__indicator--vertical{padding:4px 12px}.el-carousel__indicator--vertical .el-carousel__button{width:2px;height:15px}.el-carousel__indicator.is-active button{opacity:1}.el-carousel__button{display:block;opacity:.48;width:30px;height:2px;background-color:#FFF;border:none;outline:0;padding:0;margin:0;cursor:pointer;-webkit-transition:.3s;transition:.3s}.carousel-arrow-left-enter,.carousel-arrow-left-leave-active{-webkit-transform:translateY(-50%) translateX(-10px);transform:translateY(-50%) translateX(-10px);opacity:0}.carousel-arrow-right-enter,.carousel-arrow-right-leave-active{-webkit-transform:translateY(-50%) translateX(10px);transform:translateY(-50%) translateX(10px);opacity:0} |
1
theme/cascader-panel.css
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
1
theme/cascader.css
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
1
theme/checkbox.css
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
1
theme/col.css
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
1
theme/collapse.css
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
1
theme/color-picker.css
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1 @@ |
|||
.el-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-preferred-size:auto;flex-basis:auto;-webkit-box-sizing:border-box;box-sizing:border-box;min-width:0}.el-container.is-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column} |
1
theme/date-picker.css
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1 @@ |
|||
.v-modal-enter{-webkit-animation:v-modal-in .2s ease;animation:v-modal-in .2s ease}.v-modal-leave{-webkit-animation:v-modal-out .2s ease forwards;animation:v-modal-out .2s ease forwards}@-webkit-keyframes v-modal-in{0%{opacity:0}}@keyframes v-modal-in{0%{opacity:0}}@-webkit-keyframes v-modal-out{100%{opacity:0}}@keyframes v-modal-out{100%{opacity:0}}.v-modal{position:fixed;left:0;top:0;width:100%;height:100%;opacity:.5;background:#000}.el-popup-parent--hidden{overflow:hidden}.el-dialog{position:relative;margin:0 auto 50px;background:#FFF;border-radius:2px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.3);box-shadow:0 1px 3px rgba(0,0,0,.3);-webkit-box-sizing:border-box;box-sizing:border-box;width:50%}.el-dialog.is-fullscreen{width:100%;margin-top:0;margin-bottom:0;height:100%;overflow:auto}.el-dialog__wrapper{position:fixed;top:0;right:0;bottom:0;left:0;overflow:auto;margin:0}.el-dialog__header{padding:20px 20px 10px}.el-dialog__headerbtn{position:absolute;top:20px;right:20px;padding:0;background:0 0;border:none;outline:0;cursor:pointer;font-size:16px}.el-dialog__headerbtn .el-dialog__close{color:#909399}.el-dialog__headerbtn:focus .el-dialog__close,.el-dialog__headerbtn:hover .el-dialog__close{color:#1BAEAE}.el-dialog__title{line-height:24px;font-size:18px;color:#303133}.el-dialog__body{padding:30px 20px;color:#606266;font-size:14px;word-break:break-all}.el-dialog__footer{padding:10px 20px 20px;text-align:right;-webkit-box-sizing:border-box;box-sizing:border-box}.el-dialog--center{text-align:center}.el-dialog--center .el-dialog__body{text-align:initial;padding:25px 25px 30px}.el-dialog--center .el-dialog__footer{text-align:inherit}.dialog-fade-enter-active{-webkit-animation:dialog-fade-in .3s;animation:dialog-fade-in .3s}.dialog-fade-leave-active{-webkit-animation:dialog-fade-out .3s;animation:dialog-fade-out .3s}@-webkit-keyframes dialog-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@keyframes dialog-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes dialog-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}@keyframes dialog-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}} |
@ -0,0 +1 @@ |
|||
@media only screen and (max-width:767px){.hidden-xs-only{display:none!important}}@media only screen and (min-width:768px){.hidden-sm-and-up{display:none!important}}@media only screen and (min-width:768px) and (max-width:991px){.hidden-sm-only{display:none!important}}@media only screen and (max-width:991px){.hidden-sm-and-down{display:none!important}}@media only screen and (min-width:992px){.hidden-md-and-up{display:none!important}}@media only screen and (min-width:992px) and (max-width:1199px){.hidden-md-only{display:none!important}}@media only screen and (max-width:1199px){.hidden-md-and-down{display:none!important}}@media only screen and (min-width:1200px){.hidden-lg-and-up{display:none!important}}@media only screen and (min-width:1200px) and (max-width:1919px){.hidden-lg-only{display:none!important}}@media only screen and (max-width:1919px){.hidden-lg-and-down{display:none!important}}@media only screen and (min-width:1920px){.hidden-xl-only{display:none!important}} |
@ -0,0 +1 @@ |
|||
.el-divider{background-color:#DCDFE6;position:relative}.el-divider--horizontal{display:block;height:1px;width:100%;margin:24px 0}.el-divider--vertical{display:inline-block;width:1px;height:1em;margin:0 8px;vertical-align:middle;position:relative}.el-divider__text{position:absolute;background-color:#FFF;padding:0 20px;font-weight:500;color:#303133;font-size:14px}.el-divider__text.is-left{left:20px;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.el-divider__text.is-center{left:50%;-webkit-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%)}.el-divider__text.is-right{right:20px;-webkit-transform:translateY(-50%);transform:translateY(-50%)} |
1
theme/drawer.css
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
1
theme/dropdown.css
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1 @@ |
|||
.el-footer{padding:0 20px;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-flex-negative:0;flex-shrink:0} |
@ -0,0 +1 @@ |
|||
.el-form--inline .el-form-item,.el-form--inline .el-form-item__content{display:inline-block;vertical-align:top}.el-form-item::after,.el-form-item__content::after{clear:both}.el-form--label-left .el-form-item__label{text-align:left}.el-form--label-top .el-form-item__label{float:none;display:inline-block;text-align:left;padding:0 0 10px}.el-form--inline .el-form-item{margin-right:10px}.el-form--inline .el-form-item__label{float:none;display:inline-block}.el-form--inline.el-form--label-top .el-form-item__content{display:block}.el-form-item{margin-bottom:22px}.el-form-item::after,.el-form-item::before{display:table;content:""}.el-form-item .el-form-item{margin-bottom:0}.el-form-item--mini.el-form-item,.el-form-item--small.el-form-item{margin-bottom:18px}.el-form-item .el-input__validateIcon{display:none}.el-form-item--medium .el-form-item__content,.el-form-item--medium .el-form-item__label{line-height:36px}.el-form-item--small .el-form-item__content,.el-form-item--small .el-form-item__label{line-height:32px}.el-form-item--small .el-form-item__error{padding-top:2px}.el-form-item--mini .el-form-item__content,.el-form-item--mini .el-form-item__label{line-height:28px}.el-form-item--mini .el-form-item__error{padding-top:1px}.el-form-item__label-wrap{float:left}.el-form-item__label-wrap .el-form-item__label{display:inline-block;float:none}.el-form-item__label{text-align:right;vertical-align:middle;float:left;font-size:14px;color:#606266;line-height:40px;padding:0 12px 0 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-form-item__content{line-height:40px;position:relative;font-size:14px}.el-form-item__content::after,.el-form-item__content::before{display:table;content:""}.el-form-item__content .el-input-group{vertical-align:top}.el-form-item__error{color:#F56C6C;font-size:12px;line-height:1;padding-top:4px;position:absolute;top:100%;left:0}.el-form-item__error--inline{position:relative;top:auto;left:auto;display:inline-block;margin-left:10px}.el-form-item.is-required:not(.is-no-asterisk) .el-form-item__label-wrap>.el-form-item__label:before,.el-form-item.is-required:not(.is-no-asterisk)>.el-form-item__label:before{content:'*';color:#F56C6C;margin-right:4px}.el-form-item.is-error .el-input__inner,.el-form-item.is-error .el-input__inner:focus,.el-form-item.is-error .el-textarea__inner,.el-form-item.is-error .el-textarea__inner:focus{border-color:#F56C6C}.el-form-item.is-error .el-input-group__append .el-input__inner,.el-form-item.is-error .el-input-group__prepend .el-input__inner{border-color:transparent}.el-form-item.is-error .el-input__validateIcon{color:#F56C6C}.el-form-item--feedback .el-input__validateIcon{display:inline-block} |
@ -0,0 +1 @@ |
|||
.el-header{padding:0 20px;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-flex-negative:0;flex-shrink:0} |
1
theme/icon.css
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1 @@ |
|||
.el-image__error,.el-image__placeholder{background:#F5F7FA}.el-image__error,.el-image__inner,.el-image__placeholder{width:100%;height:100%}.el-image{position:relative;display:inline-block;overflow:hidden}.el-image__inner{vertical-align:top}.el-image__inner--center{position:relative;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);display:block}.el-image__error{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;font-size:14px;color:#C0C4CC;vertical-align:middle}.el-image__preview{cursor:pointer}.el-image-viewer__wrapper{position:fixed;top:0;right:0;bottom:0;left:0}.el-image-viewer__btn{position:absolute;z-index:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border-radius:50%;opacity:.8;cursor:pointer;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.el-image-viewer__close{top:40px;right:40px;width:40px;height:40px;font-size:24px;color:#fff;background-color:#606266}.el-image-viewer__canvas{width:100%;height:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-image-viewer__actions{left:50%;bottom:30px;-webkit-transform:translateX(-50%);transform:translateX(-50%);width:282px;height:44px;padding:0 23px;background-color:#606266;border-color:#fff;border-radius:22px}.el-image-viewer__actions__inner{width:100%;height:100%;text-align:justify;cursor:default;font-size:23px;color:#fff;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-pack:distribute;justify-content:space-around}.el-image-viewer__next,.el-image-viewer__prev{top:50%;width:44px;height:44px;font-size:24px;color:#fff;background-color:#606266;border-color:#fff}.el-image-viewer__prev{-webkit-transform:translateY(-50%);transform:translateY(-50%);left:40px}.el-image-viewer__next{-webkit-transform:translateY(-50%);transform:translateY(-50%);right:40px;text-indent:2px}.el-image-viewer__mask{position:absolute;width:100%;height:100%;top:0;left:0;opacity:.5;background:#000}.viewer-fade-enter-active{-webkit-animation:viewer-fade-in .3s;animation:viewer-fade-in .3s}.viewer-fade-leave-active{-webkit-animation:viewer-fade-out .3s;animation:viewer-fade-out .3s}@-webkit-keyframes viewer-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@keyframes viewer-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes viewer-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}@keyframes viewer-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}} |
1
theme/index.css
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
1
theme/input-number.css
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
1
theme/input.css
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1 @@ |
|||
.el-link{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;vertical-align:middle;position:relative;text-decoration:none;outline:0;cursor:pointer;padding:0;font-size:14px;font-weight:500}.el-link.is-underline:hover:after{content:"";position:absolute;left:0;right:0;height:0;bottom:0;border-bottom:1px solid #1BAEAE}.el-link.el-link--default:after,.el-link.el-link--primary.is-underline:hover:after,.el-link.el-link--primary:after{border-color:#1BAEAE}.el-link.is-disabled{cursor:not-allowed}.el-link [class*=el-icon-]+span{margin-left:5px}.el-link.el-link--default{color:#606266}.el-link.el-link--default:hover{color:#1BAEAE}.el-link.el-link--default.is-disabled{color:#C0C4CC}.el-link.el-link--primary{color:#1BAEAE}.el-link.el-link--primary:hover{color:rgb(73, 190, 190)}.el-link.el-link--primary.is-disabled{color:rgb(141, 215, 215)}.el-link.el-link--danger.is-underline:hover:after,.el-link.el-link--danger:after{border-color:#F56C6C}.el-link.el-link--danger{color:#F56C6C}.el-link.el-link--danger:hover{color:#f78989}.el-link.el-link--danger.is-disabled{color:#fab6b6}.el-link.el-link--success.is-underline:hover:after,.el-link.el-link--success:after{border-color:#67C23A}.el-link.el-link--success{color:#67C23A}.el-link.el-link--success:hover{color:#85ce61}.el-link.el-link--success.is-disabled{color:#b3e19d}.el-link.el-link--warning.is-underline:hover:after,.el-link.el-link--warning:after{border-color:#E6A23C}.el-link.el-link--warning{color:#E6A23C}.el-link.el-link--warning:hover{color:#ebb563}.el-link.el-link--warning.is-disabled{color:#f3d19e}.el-link.el-link--info.is-underline:hover:after,.el-link.el-link--info:after{border-color:#909399}.el-link.el-link--info{color:#909399}.el-link.el-link--info:hover{color:#a6a9ad}.el-link.el-link--info.is-disabled{color:#c8c9cc} |
@ -0,0 +1 @@ |
|||
.el-loading-parent--relative{position:relative!important}.el-loading-parent--hidden{overflow:hidden!important}.el-loading-mask{position:absolute;z-index:2000;background-color:rgba(255,255,255,.9);margin:0;top:0;right:0;bottom:0;left:0;-webkit-transition:opacity .3s;transition:opacity .3s}.el-loading-mask.is-fullscreen{position:fixed}.el-loading-mask.is-fullscreen .el-loading-spinner{margin-top:-25px}.el-loading-mask.is-fullscreen .el-loading-spinner .circular{height:50px;width:50px}.el-loading-spinner{top:50%;margin-top:-21px;width:100%;text-align:center;position:absolute}.el-loading-spinner .el-loading-text{color:#1BAEAE;margin:3px 0;font-size:14px}.el-loading-spinner .circular{height:42px;width:42px;-webkit-animation:loading-rotate 2s linear infinite;animation:loading-rotate 2s linear infinite}.el-loading-spinner .path{-webkit-animation:loading-dash 1.5s ease-in-out infinite;animation:loading-dash 1.5s ease-in-out infinite;stroke-dasharray:90,150;stroke-dashoffset:0;stroke-width:2;stroke:#1BAEAE;stroke-linecap:round}.el-loading-spinner i{color:#1BAEAE}.el-loading-fade-enter,.el-loading-fade-leave-active{opacity:0}@-webkit-keyframes loading-rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes loading-rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}100%{stroke-dasharray:90,150;stroke-dashoffset:-120px}}@keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}100%{stroke-dasharray:90,150;stroke-dashoffset:-120px}} |
@ -0,0 +1 @@ |
|||
.el-main{display:block;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-preferred-size:auto;flex-basis:auto;overflow:auto;-webkit-box-sizing:border-box;box-sizing:border-box;padding:20px} |
1
theme/menu.css
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
1
theme/message-box.css
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1 @@ |
|||
.el-message__closeBtn:focus,.el-message__content:focus{outline-width:0}.el-message{min-width:380px;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:4px;border-width:1px;border-style:solid;border-color:#EBEEF5;position:fixed;left:50%;top:20px;-webkit-transform:translateX(-50%);transform:translateX(-50%);background-color:#edf2fc;-webkit-transition:opacity .3s,top .4s,-webkit-transform .4s;transition:opacity .3s,top .4s,-webkit-transform .4s;transition:opacity .3s,transform .4s,top .4s;transition:opacity .3s,transform .4s,top .4s,-webkit-transform .4s;overflow:hidden;padding:15px 15px 15px 20px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-message.is-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-message.is-closable .el-message__content{padding-right:16px}.el-message p{margin:0}.el-message--info .el-message__content{color:#909399}.el-message--success{background-color:#f0f9eb;border-color:#e1f3d8}.el-message--success .el-message__content{color:#67C23A}.el-message--warning{background-color:#fdf6ec;border-color:#faecd8}.el-message--warning .el-message__content{color:#E6A23C}.el-message--error{background-color:#fef0f0;border-color:#fde2e2}.el-message--error .el-message__content{color:#F56C6C}.el-message__icon{margin-right:10px}.el-message__content{padding:0;font-size:14px;line-height:1}.el-message__closeBtn{position:absolute;top:50%;right:15px;-webkit-transform:translateY(-50%);transform:translateY(-50%);cursor:pointer;color:#C0C4CC;font-size:16px}.el-message__closeBtn:hover{color:#909399}.el-message .el-icon-success{color:#67C23A}.el-message .el-icon-error{color:#F56C6C}.el-message .el-icon-info{color:#909399}.el-message .el-icon-warning{color:#E6A23C}.el-message-fade-enter,.el-message-fade-leave-active{opacity:0;-webkit-transform:translate(-50%,-100%);transform:translate(-50%,-100%)} |
@ -0,0 +1 @@ |
|||
.el-notification{display:-webkit-box;display:-ms-flexbox;display:flex;width:330px;padding:14px 26px 14px 13px;border-radius:8px;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #EBEEF5;position:fixed;background-color:#FFF;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);-webkit-transition:opacity .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;transition:opacity .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;transition:opacity .3s,transform .3s,left .3s,right .3s,top .4s,bottom .3s;transition:opacity .3s,transform .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;overflow:hidden}.el-notification.right{right:16px}.el-notification.left{left:16px}.el-notification__group{margin-left:13px;margin-right:8px}.el-notification__title{font-weight:700;font-size:16px;color:#303133;margin:0}.el-notification__content{font-size:14px;line-height:21px;margin:6px 0 0;color:#606266;text-align:justify}.el-notification__content p{margin:0}.el-notification__icon{height:24px;width:24px;font-size:24px}.el-notification__closeBtn{position:absolute;top:18px;right:15px;cursor:pointer;color:#909399;font-size:16px}.el-notification__closeBtn:hover{color:#606266}.el-notification .el-icon-success{color:#67C23A}.el-notification .el-icon-error{color:#F56C6C}.el-notification .el-icon-info{color:#909399}.el-notification .el-icon-warning{color:#E6A23C}.el-notification-fade-enter.right{right:0;-webkit-transform:translateX(100%);transform:translateX(100%)}.el-notification-fade-enter.left{left:0;-webkit-transform:translateX(-100%);transform:translateX(-100%)}.el-notification-fade-leave-active{opacity:0} |
@ -0,0 +1 @@ |
|||
.el-select-group{margin:0;padding:0}.el-select-group__wrap{position:relative;list-style:none;margin:0;padding:0}.el-select-group__wrap:not(:last-of-type){padding-bottom:24px}.el-select-group__wrap:not(:last-of-type)::after{content:'';position:absolute;display:block;left:20px;right:20px;bottom:12px;height:1px;background:#E4E7ED}.el-select-group__title{padding-left:20px;font-size:12px;color:#909399;line-height:30px}.el-select-group .el-select-dropdown__item{padding-left:20px} |
@ -0,0 +1 @@ |
|||
.el-select-dropdown__item{font-size:14px;padding:0 20px;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#606266;height:34px;line-height:34px;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer}.el-select-dropdown__item.is-disabled{color:#C0C4CC;cursor:not-allowed}.el-select-dropdown__item.is-disabled:hover{background-color:#FFF}.el-select-dropdown__item.hover,.el-select-dropdown__item:hover{background-color:#F5F7FA}.el-select-dropdown__item.selected{color:#1BAEAE;font-weight:700} |
@ -0,0 +1 @@ |
|||
.el-page-header{display:-webkit-box;display:-ms-flexbox;display:flex;line-height:24px}.el-page-header__left{display:-webkit-box;display:-ms-flexbox;display:flex;cursor:pointer;margin-right:40px;position:relative}.el-page-header__left::after{content:"";position:absolute;width:1px;height:16px;right:-20px;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);background-color:#DCDFE6}.el-page-header__left .el-icon-back{font-size:18px;margin-right:6px;-ms-flex-item-align:center;align-self:center}.el-page-header__title{font-size:14px;font-weight:500}.el-page-header__content{font-size:18px;color:#303133} |
1
theme/pagination.css
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1 @@ |
|||
.el-popconfirm__main{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-popconfirm__icon{margin-right:5px}.el-popconfirm__action{text-align:right;margin:0} |
@ -0,0 +1 @@ |
|||
.el-popper .popper__arrow,.el-popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.el-popper .popper__arrow{border-width:6px;-webkit-filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03));filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03))}.el-popper .popper__arrow::after{content:" ";border-width:6px}.el-popper[x-placement^=top]{margin-bottom:12px}.el-popper[x-placement^=top] .popper__arrow{bottom:-6px;left:50%;margin-right:3px;border-top-color:#EBEEF5;border-bottom-width:0}.el-popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-6px;border-top-color:#FFF;border-bottom-width:0}.el-popper[x-placement^=bottom]{margin-top:12px}.el-popper[x-placement^=bottom] .popper__arrow{top:-6px;left:50%;margin-right:3px;border-top-width:0;border-bottom-color:#EBEEF5}.el-popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-6px;border-top-width:0;border-bottom-color:#FFF}.el-popper[x-placement^=right]{margin-left:12px}.el-popper[x-placement^=right] .popper__arrow{top:50%;left:-6px;margin-bottom:3px;border-right-color:#EBEEF5;border-left-width:0}.el-popper[x-placement^=right] .popper__arrow::after{bottom:-6px;left:1px;border-right-color:#FFF;border-left-width:0}.el-popper[x-placement^=left]{margin-right:12px}.el-popper[x-placement^=left] .popper__arrow{top:50%;right:-6px;margin-bottom:3px;border-right-width:0;border-left-color:#EBEEF5}.el-popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-6px;margin-left:-6px;border-right-width:0;border-left-color:#FFF}.el-popover{position:absolute;background:#FFF;min-width:150px;border-radius:4px;border:1px solid #EBEEF5;padding:12px;z-index:2000;color:#606266;line-height:1.4;text-align:justify;font-size:14px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);word-break:break-all}.el-popover--plain{padding:18px 20px}.el-popover__title{color:#303133;font-size:16px;line-height:1;margin-bottom:12px}.el-popover:focus,.el-popover:focus:active,.el-popover__reference:focus:hover,.el-popover__reference:focus:not(.focusing){outline-width:0} |
@ -0,0 +1 @@ |
|||
.el-popper .popper__arrow,.el-popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.el-popper .popper__arrow{border-width:6px;-webkit-filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03));filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03))}.el-popper .popper__arrow::after{content:" ";border-width:6px}.el-popper[x-placement^=top]{margin-bottom:12px}.el-popper[x-placement^=top] .popper__arrow{bottom:-6px;left:50%;margin-right:3px;border-top-color:#EBEEF5;border-bottom-width:0}.el-popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-6px;border-top-color:#FFF;border-bottom-width:0}.el-popper[x-placement^=bottom]{margin-top:12px}.el-popper[x-placement^=bottom] .popper__arrow{top:-6px;left:50%;margin-right:3px;border-top-width:0;border-bottom-color:#EBEEF5}.el-popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-6px;border-top-width:0;border-bottom-color:#FFF}.el-popper[x-placement^=right]{margin-left:12px}.el-popper[x-placement^=right] .popper__arrow{top:50%;left:-6px;margin-bottom:3px;border-right-color:#EBEEF5;border-left-width:0}.el-popper[x-placement^=right] .popper__arrow::after{bottom:-6px;left:1px;border-right-color:#FFF;border-left-width:0}.el-popper[x-placement^=left]{margin-right:12px}.el-popper[x-placement^=left] .popper__arrow{top:50%;right:-6px;margin-bottom:3px;border-right-width:0;border-left-color:#EBEEF5}.el-popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-6px;margin-left:-6px;border-right-width:0;border-left-color:#FFF} |
@ -0,0 +1 @@ |
|||
.el-progress{position:relative;line-height:1}.el-progress__text{font-size:14px;color:#606266;display:inline-block;vertical-align:middle;margin-left:10px;line-height:1}.el-progress__text i{vertical-align:middle;display:block}.el-progress--circle,.el-progress--dashboard{display:inline-block}.el-progress--circle .el-progress__text,.el-progress--dashboard .el-progress__text{position:absolute;top:50%;left:0;width:100%;text-align:center;margin:0;-webkit-transform:translate(0,-50%);transform:translate(0,-50%)}.el-progress--circle .el-progress__text i,.el-progress--dashboard .el-progress__text i{vertical-align:middle;display:inline-block}.el-progress--without-text .el-progress__text{display:none}.el-progress--without-text .el-progress-bar{padding-right:0;margin-right:0;display:block}.el-progress-bar,.el-progress-bar__inner::after,.el-progress-bar__innerText{display:inline-block;vertical-align:middle}.el-progress--text-inside .el-progress-bar{padding-right:0;margin-right:0}.el-progress.is-success .el-progress-bar__inner{background-color:#67C23A}.el-progress.is-success .el-progress__text{color:#67C23A}.el-progress.is-warning .el-progress-bar__inner{background-color:#E6A23C}.el-progress.is-warning .el-progress__text{color:#E6A23C}.el-progress.is-exception .el-progress-bar__inner{background-color:#F56C6C}.el-progress.is-exception .el-progress__text{color:#F56C6C}.el-progress-bar{padding-right:50px;width:100%;margin-right:-55px;-webkit-box-sizing:border-box;box-sizing:border-box}.el-progress-bar__outer{height:6px;border-radius:100px;background-color:#EBEEF5;overflow:hidden;position:relative;vertical-align:middle}.el-progress-bar__inner{position:absolute;left:0;top:0;height:100%;background-color:#1BAEAE;text-align:right;border-radius:100px;line-height:1;white-space:nowrap;-webkit-transition:width .6s ease;transition:width .6s ease}.el-progress-bar__inner::after{content:"";height:100%}.el-progress-bar__innerText{color:#FFF;font-size:12px;margin:0 5px}@-webkit-keyframes progress{0%{background-position:0 0}100%{background-position:32px 0}}@keyframes progress{0%{background-position:0 0}100%{background-position:32px 0}} |
@ -0,0 +1 @@ |
|||
@charset "UTF-8";.el-radio-button,.el-radio-button__inner{display:inline-block;position:relative;outline:0}.el-radio-button__inner{line-height:1;white-space:nowrap;vertical-align:middle;background:#FFF;border:1px solid #DCDFE6;font-weight:500;border-left:0;color:#606266;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;cursor:pointer;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);padding:12px 20px;font-size:14px;border-radius:0}.el-radio-button__inner.is-round{padding:12px 20px}.el-radio-button__inner:hover{color:#1BAEAE}.el-radio-button__inner [class*=el-icon-]{line-height:.9}.el-radio-button__inner [class*=el-icon-]+span{margin-left:5px}.el-radio-button:first-child .el-radio-button__inner{border-left:1px solid #DCDFE6;border-radius:4px 0 0 4px;-webkit-box-shadow:none!important;box-shadow:none!important}.el-radio-button__orig-radio{opacity:0;outline:0;position:absolute;z-index:-1}.el-radio-button__orig-radio:checked+.el-radio-button__inner{color:#FFF;background-color:#1BAEAE;border-color:#1BAEAE;-webkit-box-shadow:-1px 0 0 0 #1BAEAE;box-shadow:-1px 0 0 0 #1BAEAE}.el-radio-button__orig-radio:disabled+.el-radio-button__inner{color:#C0C4CC;cursor:not-allowed;background-image:none;background-color:#FFF;border-color:#EBEEF5;-webkit-box-shadow:none;box-shadow:none}.el-radio-button__orig-radio:disabled:checked+.el-radio-button__inner{background-color:#F2F6FC}.el-radio-button:last-child .el-radio-button__inner{border-radius:0 4px 4px 0}.el-radio-button:first-child:last-child .el-radio-button__inner{border-radius:4px}.el-radio-button--medium .el-radio-button__inner{padding:10px 20px;font-size:14px;border-radius:0}.el-radio-button--medium .el-radio-button__inner.is-round{padding:10px 20px}.el-radio-button--small .el-radio-button__inner{padding:9px 15px;font-size:12px;border-radius:0}.el-radio-button--small .el-radio-button__inner.is-round{padding:9px 15px}.el-radio-button--mini .el-radio-button__inner{padding:7px 15px;font-size:12px;border-radius:0}.el-radio-button--mini .el-radio-button__inner.is-round{padding:7px 15px}.el-radio-button:focus:not(.is-focus):not(:active):not(.is-disabled){-webkit-box-shadow:0 0 2px 2px #1BAEAE;box-shadow:0 0 2px 2px #1BAEAE} |
@ -0,0 +1 @@ |
|||
.el-radio-group{display:inline-block;line-height:1;vertical-align:middle;font-size:0} |
@ -0,0 +1 @@ |
|||
@charset "UTF-8";.el-radio,.el-radio--medium.is-bordered .el-radio__label{font-size:14px}.el-radio,.el-radio__input{white-space:nowrap;line-height:1;outline:0}.el-radio,.el-radio__inner,.el-radio__input{position:relative;display:inline-block}.el-radio{color:#606266;font-weight:500;cursor:pointer;margin-right:30px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.el-radio.is-bordered{padding:12px 20px 0 10px;border-radius:4px;border:1px solid #DCDFE6;-webkit-box-sizing:border-box;box-sizing:border-box;height:40px}.el-radio.is-bordered.is-checked{border-color:#1BAEAE}.el-radio.is-bordered.is-disabled{cursor:not-allowed;border-color:#EBEEF5}.el-radio__input.is-disabled .el-radio__inner,.el-radio__input.is-disabled.is-checked .el-radio__inner{background-color:#F5F7FA;border-color:#E4E7ED}.el-radio.is-bordered+.el-radio.is-bordered{margin-left:10px}.el-radio--medium.is-bordered{padding:10px 20px 0 10px;border-radius:4px;height:36px}.el-radio--mini.is-bordered .el-radio__label,.el-radio--small.is-bordered .el-radio__label{font-size:12px}.el-radio--medium.is-bordered .el-radio__inner{height:14px;width:14px}.el-radio--small.is-bordered{padding:8px 15px 0 10px;border-radius:3px;height:32px}.el-radio--small.is-bordered .el-radio__inner{height:12px;width:12px}.el-radio--mini.is-bordered{padding:6px 15px 0 10px;border-radius:3px;height:28px}.el-radio--mini.is-bordered .el-radio__inner{height:12px;width:12px}.el-radio:last-child{margin-right:0}.el-radio__input{cursor:pointer;vertical-align:middle}.el-radio__input.is-disabled .el-radio__inner{cursor:not-allowed}.el-radio__input.is-disabled .el-radio__inner::after{cursor:not-allowed;background-color:#F5F7FA}.el-radio__input.is-disabled .el-radio__inner+.el-radio__label{cursor:not-allowed}.el-radio__input.is-disabled.is-checked .el-radio__inner::after{background-color:#C0C4CC}.el-radio__input.is-disabled+span.el-radio__label{color:#C0C4CC;cursor:not-allowed}.el-radio__input.is-checked .el-radio__inner{border-color:#1BAEAE;background:#1BAEAE}.el-radio__input.is-checked .el-radio__inner::after{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}.el-radio__input.is-checked+.el-radio__label{color:#1BAEAE}.el-radio__input.is-focus .el-radio__inner{border-color:#1BAEAE}.el-radio__inner{border:1px solid #DCDFE6;border-radius:100%;width:14px;height:14px;background-color:#FFF;cursor:pointer;-webkit-box-sizing:border-box;box-sizing:border-box}.el-radio__inner:hover{border-color:#1BAEAE}.el-radio__inner::after{width:4px;height:4px;border-radius:100%;background-color:#FFF;content:"";position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);-webkit-transition:-webkit-transform .15s ease-in;transition:-webkit-transform .15s ease-in;transition:transform .15s ease-in;transition:transform .15s ease-in,-webkit-transform .15s ease-in}.el-radio__original{opacity:0;outline:0;position:absolute;z-index:-1;top:0;left:0;right:0;bottom:0;margin:0}.el-radio:focus:not(.is-focus):not(:active):not(.is-disabled) .el-radio__inner{-webkit-box-shadow:0 0 2px 2px #1BAEAE;box-shadow:0 0 2px 2px #1BAEAE}.el-radio__label{font-size:14px;padding-left:10px} |
@ -0,0 +1 @@ |
|||
.el-rate__icon,.el-rate__item{position:relative;display:inline-block}.el-rate{height:20px;line-height:1}.el-rate:active,.el-rate:focus{outline-width:0}.el-rate__item{font-size:0;vertical-align:middle}.el-rate__icon{font-size:18px;margin-right:6px;color:#C0C4CC;-webkit-transition:.3s;transition:.3s}.el-rate__decimal,.el-rate__icon .path2{position:absolute;top:0;left:0}.el-rate__icon.hover{-webkit-transform:scale(1.15);transform:scale(1.15)}.el-rate__decimal{display:inline-block;overflow:hidden}.el-rate__text{font-size:14px;vertical-align:middle} |
@ -0,0 +1 @@ |
|||
@charset "UTF-8";body{font-family:"Helvetica Neue",Helvetica,"PingFang SC","Hiragino Sans GB","Microsoft YaHei","微软雅黑",Arial,sans-serif;font-weight:400;font-size:14px;color:#000;-webkit-font-smoothing:antialiased}a{color:#1BAEAE;text-decoration:none}a:focus,a:hover{color:rgb(73, 190, 190)}a:active{color:rgb(24, 157, 157)}h1,h2,h3,h4,h5,h6{color:#606266;font-weight:inherit}h1:first-child,h2:first-child,h3:first-child,h4:first-child,h5:first-child,h6:first-child,p:first-child{margin-top:0}h1:last-child,h2:last-child,h3:last-child,h4:last-child,h5:last-child,h6:last-child,p:last-child{margin-bottom:0}h1{font-size:20px}h2{font-size:18px}h3{font-size:16px}h4,h5,h6,p{font-size:inherit}p{line-height:1.8}sub,sup{font-size:13px}small{font-size:12px}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee} |
@ -0,0 +1 @@ |
|||
.el-row{position:relative;-webkit-box-sizing:border-box;box-sizing:border-box}.el-row::after,.el-row::before{display:table;content:""}.el-row::after{clear:both}.el-row--flex{display:-webkit-box;display:-ms-flexbox;display:flex}.el-row--flex:after,.el-row--flex:before{display:none}.el-row--flex.is-justify-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-row--flex.is-justify-end{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.el-row--flex.is-justify-space-between{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.el-row--flex.is-justify-space-around{-ms-flex-pack:distribute;justify-content:space-around}.el-row--flex.is-align-middle{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-row--flex.is-align-bottom{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end} |
@ -0,0 +1 @@ |
|||
.el-scrollbar{overflow:hidden;position:relative}.el-scrollbar:active>.el-scrollbar__bar,.el-scrollbar:focus>.el-scrollbar__bar,.el-scrollbar:hover>.el-scrollbar__bar{opacity:1;-webkit-transition:opacity 340ms ease-out;transition:opacity 340ms ease-out}.el-scrollbar__wrap{overflow:scroll;height:100%}.el-scrollbar__wrap--hidden-default{scrollbar-width:none}.el-scrollbar__wrap--hidden-default::-webkit-scrollbar{width:0;height:0}.el-scrollbar__thumb{position:relative;display:block;width:0;height:0;cursor:pointer;border-radius:inherit;background-color:rgba(144,147,153,.3);-webkit-transition:.3s background-color;transition:.3s background-color}.el-scrollbar__thumb:hover{background-color:rgba(144,147,153,.5)}.el-scrollbar__bar{position:absolute;right:2px;bottom:2px;z-index:1;border-radius:4px;opacity:0;-webkit-transition:opacity 120ms ease-out;transition:opacity 120ms ease-out}.el-scrollbar__bar.is-vertical{width:6px;top:2px}.el-scrollbar__bar.is-vertical>div{width:100%}.el-scrollbar__bar.is-horizontal{height:6px;left:2px}.el-scrollbar__bar.is-horizontal>div{height:100%} |
Some files were not shown because too many files changed in this diff
Write
Preview
Loading…
Cancel
Save
Reference in new issue